diff --git a/README.md b/README.md index a1da6cf..734c897 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ urlFragment: confidential-computing-samples ![MIT license badge](https://img.shields.io/badge/license-MIT-green.svg) -**Last Updated:** September 2026 +**Last Updated:** November 2026 > **Heads up — this is the new home for Azure Confidential Computing samples.** > [`https://aka.ms/accsamples`](https://aka.ms/accsamples) now redirects here. @@ -47,7 +47,13 @@ Confidential computing is the protection of data-in-use through isolating comput - Any data processed using these samples - **AI-Assisted Content:** Several samples in this repository were created with significant assistance from AI coding tools, primarily [GitHub Copilot](https://github.com/features/copilot) inside [Visual Studio Code](https://code.visualstudio.com/), to showcase modern AI-assisted development. While functional, AI-assisted code should always be reviewed by qualified security professionals before use in sensitive scenarios. -## 🆕 What's New (September 2026) +## What's New (November 2026) + +| Addition | Description | +|---|---| +| **[Confidential Azure Container Apps samples](azure-container-apps-sample/README.md)** | UAE North DC4 hello world and a tested [native Azure Functions walkthrough](azure-container-apps-sample/functions-on-azure-container-apps/README.md#start-here) with Node.js 24, fresh ACR builds, managed identity, private Blob host storage, placement/health verification, and portal/API access instructions. Resources are retained until explicitly cleaned up. | + +### Previously (September 2026) | Addition | Description | |---|---| @@ -78,6 +84,13 @@ Confidential computing is the protection of data-in-use through isolating comput ## Prerequisites +Requirements vary by sample; follow the selected guide rather than installing +every tool below. The [Container Apps quickstart](azure-container-apps-sample/container-apps-acc/README.md#prerequisites) +uses PowerShell and Az modules without Docker, Python or `confcom`. The +[Functions walkthrough](azure-container-apps-sample/functions-on-azure-container-apps/README.md#2-prepare-azure-prerequisites) +adds Azure CLI and role-assignment permissions; local development uses Node.js +24 and Azurite, and remote ACR builds avoid a local Docker requirement. + - [Azure subscription](https://azure.microsoft.com/free/) - [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) (v2.60+) with `confcom` extension - [Azure PowerShell](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell?view=azps-latest) (Az module 12.0+) @@ -98,6 +111,25 @@ az confcom --version This repository is organized by Azure service type and deployment method: +### [Azure Container Apps Samples](azure-container-apps-sample/README.md) + +- **[Confidential hello world](azure-container-apps-sample/container-apps-acc/README.md)** - Deploy a public quickstart container on a dedicated DC4 confidential workload profile in UAE North. +- **[Functions on confidential Container Apps](azure-container-apps-sample/functions-on-azure-container-apps/README.md#start-here)** - End-to-end native Functions HTTP sample, including local testing, identity/scoped roles, private host-storage networking, fresh Node.js 24 image builds, ARM deployment, verification, portal/API links, and cleanup. + +Start with the HTML quickstart, then optionally add Functions to the same +confidential environment and dedicated group. Both were tested in UAE North on +9 November 2026; check current regional availability, quota and organizational +policy before deployment. Both expose anonymous public endpoints and retain +billable resources until explicitly cleaned up. Functions additionally verifies +private host-storage connectivity; HTTP 200 alone is not proof of host health. +These are configuration/functional checks, not independent hardware attestation. +No Azure App Service deployment is included. + +For explicit evidence, use the [confidential-compute validation steps](azure-container-apps-sample/README.md#validate-confidential-compute-placement) +for each app. They show the app-to-environment-to-DC4 binding, check revision +running/health states, provide portal cross-checks, and distinguish Azure-reported +configuration from independent cryptographic attestation. + ### [ACI Samples](/aci-samples/README.md) Azure Container Instances with AMD SEV-SNP confidential computing: - **BuildRandomACI.ps1** - Create confidential ACI with hello-world container @@ -184,6 +216,13 @@ three sample JSON messages, and verify them on read-back using passwordless Entr authentication. Tries Korea Central first, then UAE North on regional availability failures. +### [Azure Container Apps Samples](azure-container-apps-sample/README.md) +Deploy Microsoft's hello-world container with HTTPS ingress on an explicitly +selected **DC4 confidential workload profile** in **UAE North**. Includes ARM +infrastructure, PowerShell deployment and placement checks, and customer setup +instructions. Also includes a Node.js Functions-on-Container-Apps hello-world +example and a placeholder for a future App Services example. + ### Utility Snippets Reusable PowerShell snippets for common confidential computing tasks: - `snippet-createDES.ps1` - Create Disk Encryption Set for Confidential VMs diff --git a/azure-container-apps-sample/README.md b/azure-container-apps-sample/README.md new file mode 100644 index 0000000..6418da4 --- /dev/null +++ b/azure-container-apps-sample/README.md @@ -0,0 +1,153 @@ +# Azure Container Apps samples + +[Repository overview](../README.md) + +Two implemented examples demonstrate explicit binding to a **confidential DC4 +workload profile in UAE North**. Choose a guide based on the endpoint and +prerequisites you need: + +| Sample | Status | +| --- | --- | +| [Confidential hello world](container-apps-acc/README.md) | ARM template and PowerShell deployment using a DC4 confidential workload profile in UAE North | +| [Functions on Azure Container Apps](functions-on-azure-container-apps/README.md) | Tested native Functions hello world on confidential DC4 in UAE North: Node.js 24, fresh ACR builds, managed identity, private Blob host storage, deployment and verification | + +Start with **Confidential hello world**. It uses Microsoft's public quickstart +container image and does not require Docker, a private registry, or application +code changes. + +Then follow the **[Functions deployment walkthrough](functions-on-azure-container-apps/README.md#start-here)** +to run application code on that confidential environment. It covers local +Azurite testing, scoped permissions, private storage networking, immutable image +deployment, host-health checks, and generating your own portal and API links. +The hello-world route is `GET /api/hello`, which returns JSON rather than an HTML +page. + +## Deployment order and verification + +1. Deploy and verify the [confidential environment and HTML quickstart](container-apps-acc/README.md#start-here). +2. Optionally add the [native Functions JSON endpoint](functions-on-azure-container-apps/README.md#start-here) + to that environment and resource group. It can share the existing DC4 node. +3. Use each guide's placement and endpoint checks. For Functions, also confirm + host-storage health and Blob lease acquisition; HTTP 200 alone is insufficient. +4. Use the portal and application links generated by your own deployment. + +The base quickstart needs no image build or role assignments. Functions adds +ACR, managed identity/scoped roles, storage, and a Blob private endpoint with +VNet-linked DNS; it requires additional tools and role-assignment permissions. +Neither guide deploys the Azure App Service platform. + +## Validate confidential-compute placement + +Follow these checks for **each app**, including when both share one environment. +They implement the [Microsoft Learn verification procedure](https://learn.microsoft.com/azure/container-apps/confidential-compute#verify-your-confidential-compute-configuration): +read the app's assigned profile, then look up that exact profile's type in the +environment the app actually references. A profile merely named `confidential` +is not sufficient; its type must be a DC-series type. These examples require +**DC4** specifically, with no ordinary-compute fallback. + +### Read-only PowerShell verification + +Run from the repository root with PowerShell 7 and `Az.Accounts` installed. +Replace the subscription and group with your deployment values. Use +`ca-acc-hello` for the HTML example or `ca-functions-hello` for Functions +(or your customized app name), and the environment name you deployed. +This only reads Azure resources; it does not deploy or change them. + +```powershell +$ErrorActionPreference = 'Stop' +$subscriptionId = '' +$resourceGroup = '' +$environmentName = 'cae-acc-hello' +$appName = 'ca-acc-hello' + +Connect-AzAccount -Subscription $subscriptionId +. .\azure-container-apps-sample\container-apps-acc\DeploymentHelpers.ps1 +$resourceBase = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.App" +$app = Get-ArmJson -Path "$resourceBase/containerApps/${appName}?api-version=2025-07-01" +$environment = Get-ArmJson -Path "$resourceBase/managedEnvironments/${environmentName}?api-version=2025-07-01" +$appUrl = Assert-ConfidentialContainerApp -App $app -Environment $environment +$assignedProfile = @($environment.properties.workloadProfiles | + Where-Object name -eq $app.properties.workloadProfileName) +$revisionName = $app.properties.latestReadyRevisionName +$revision = Get-ArmJson -Path "$($app.id)/revisions/${revisionName}?api-version=2025-07-01" +if ($revision.properties.active -ne $true -or + $revision.properties.runningState -notin @('Running', 'RunningAtMaxScale') -or + $revision.properties.healthState -ne 'Healthy' -or + $revision.properties.replicas -lt 1) { + throw 'Expected an active, running, healthy revision with at least one replica; inspect revisions and replicas.' +} +[pscustomobject]@{ + AppId = $app.id + EnvironmentId = $environment.id + Location = $app.location + AssignedProfile = $app.properties.workloadProfileName + ProfileType = $assignedProfile[0].workloadProfileType + MinimumNodes = $assignedProfile[0].minimumCount + MaximumNodes = $assignedProfile[0].maximumCount + LatestReadyRevision = $revisionName + RevisionActive = $revision.properties.active + Replicas = $revision.properties.replicas + RevisionRunningState = $revision.properties.runningState + RevisionHealthState = $revision.properties.healthState + AppUrl = $appUrl + CheckedAtUtc = [datetime]::UtcNow.ToString('o') + Evidence = 'Azure-reported confidential placement, not hardware attestation' +} | Format-List +``` + +The shared guard **throws** unless the app references the expected environment, +both resources report `Succeeded` in UAE North, the assigned profile is +`confidential` with type `DC4` and minimum/maximum one node, and the latest +revision is ready. It also checks the examples' HTTPS ingress settings. The +additional revision read requires an active revision, at least one replica, +`Running` or `RunningAtMaxScale`, and `Healthy`. `RunningAtMaxScale` is normal +when the configured maximum replica count has been reached; it does not by +itself indicate a failure. If a check fails, +do not report successful confidential placement; inspect the named resource +and rerun after resolving the cause. + +Expected output includes `AssignedProfile: confidential`, `ProfileType: DC4`, +`RevisionRunningState: Running` (or `RunningAtMaxScale`), +`RevisionActive: True`, at least one replica, and `RevisionHealthState: Healthy`, plus the +actual app/environment IDs and timestamp. Save that output if you need an +auditable configuration snapshot. Repeat with the second app name if deployed. +Run each guide's endpoint checks separately; Functions also needs its +[host-storage health checks](functions-on-azure-container-apps/README.md#5-verify-placement-http-response-and-host-storage). + +### Cross-check in Azure portal + +1. Open the **container app**, not just the resource group. In **JSON View**, + note `properties.environmentId` and `properties.workloadProfileName`. +2. Open that exact environment and select **Workload profiles**. Match the + assigned profile name and confirm its type is **DC4**. You can also inspect + `properties.workloadProfiles` in the environment's JSON View. +3. Return to the app's **Revisions and replicas** view. Confirm the latest + revision is ready and its replica is running. Repeat for the Functions app. +4. An additional `Consumption` profile in the environment is not a failure: + what matters is that **this app** selects the DC4 profile, not Consumption. + +### What this proves, and what it does not + +These are live **Azure control-plane configuration and runtime-state checks**. +Microsoft documents an app assigned to a DC-series profile as running on +confidential compute infrastructure. An HTTP response, container image, app +name, private endpoint, or presence of an unused DC4 profile does not establish +that assignment. + +The checks are **not independent cryptographic hardware attestation**. These +examples do not retrieve a hardware report, validate an attestation token or +release secrets based on attested claims. If your threat model requires that +evidence, this walkthrough alone does not meet it. Do not equate private Blob +storage connectivity or HTTPS with proof of a trusted execution environment. + +## Cost and security boundaries + +Both samples create billable resources and retain them until you explicitly +clean them up. Regional availability and quota must be checked in your own +subscription. Configuration verification is not independent hardware +attestation. The endpoints are public and anonymous; send no sensitive data. +Private Blob networking in Functions does not make its HTTP ingress private. + +Deleting one app leaves the DC4 environment and other support resources +billable. Deleting the dedicated group removes all examples and supporting +resources in it. Review the inventory and the guide's cleanup instructions first. diff --git a/azure-container-apps-sample/container-apps-acc/Deploy-ContainerApp.ps1 b/azure-container-apps-sample/container-apps-acc/Deploy-ContainerApp.ps1 new file mode 100644 index 0000000..b0a239b --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/Deploy-ContainerApp.ps1 @@ -0,0 +1,92 @@ +#Requires -Version 7.0 +#Requires -Modules Az.Accounts, Az.Resources +[CmdletBinding()] +param( + [Parameter(Mandatory)][guid]$SubscriptionId, + [ValidatePattern('^[a-zA-Z0-9._()-]{1,90}$')] + [string]$ResourceGroupName = "rg-container-apps-acc-$([guid]::NewGuid().ToString('N').Substring(0, 8))", + [ValidatePattern('^[a-z][a-z0-9-]{0,30}[a-z0-9]$')][string]$EnvironmentName = 'cae-acc-hello', + [ValidatePattern('^[a-z][a-z0-9-]{0,30}[a-z0-9]$')][string]$AppName = 'ca-acc-hello', + [switch]$ValidateOnly +) + +$ErrorActionPreference = 'Stop' +. (Join-Path $PSScriptRoot 'DeploymentHelpers.ps1') + +if (-not (Get-AzContext)) { + throw 'Sign in with Connect-AzAccount before running this script.' +} +$currentContext = Get-AzContext +$context = Set-AzContext -SubscriptionId $SubscriptionId -TenantId $currentContext.Tenant.Id -ErrorAction Stop +if ($context.Environment.Name -ne 'AzureCloud') { + throw 'This sample supports Azure public cloud only.' +} +Write-Host "Subscription: $SubscriptionId; tenant: $($context.Tenant.Id); region: uaenorth" +Write-Host "Resource group: $ResourceGroupName; environment: $EnvironmentName; app: $AppName" +Write-Warning 'One dedicated DC4 node will incur ongoing charges. Nothing is automatically deleted, including on failure.' + +foreach ($namespace in @('Microsoft.App', 'Microsoft.Network')) { + $provider = Get-ArmJson -Path "/subscriptions/$SubscriptionId/providers/${namespace}?api-version=2021-04-01" + if ($provider.registrationState -ne 'Registered') { + throw "Register $namespace with Register-AzResourceProvider -ProviderNamespace $namespace and wait for Registered, then retry." + } +} +$regionalBase = "/subscriptions/$SubscriptionId/providers/Microsoft.App/locations/uaenorth" +$types = Get-ArmJson -Path "${regionalBase}/availableManagedEnvironmentsWorkloadProfileTypes?api-version=2025-07-01" +if (-not ($types.value | Where-Object name -eq 'DC4')) { + throw 'UAE North does not advertise DC4 for this subscription. No other compute or region will be used.' +} +$usage = Get-ArmJson -Path "${regionalBase}/usages?api-version=2025-07-01" +$quota = @($usage.value | Where-Object { $_.name.value -eq 'ManagedEnvironmentCount' }) +if ($quota.Count -ne 1 -or $null -eq $quota[0].currentValue -or $null -eq $quota[0].limit) { + throw 'Could not determine the regional managed-environment quota. Check Azure quota before retrying.' +} +if ($quota[0].currentValue -ge $quota[0].limit) { + throw "UAE North managed-environment quota exhausted ($($quota[0].currentValue)/$($quota[0].limit)). Request quota; no fallback is permitted." +} + +$group = Get-AzResourceGroup -ErrorAction Stop | Where-Object ResourceGroupName -eq $ResourceGroupName +if ($group) { + if ($group.Tags['sample'] -ne 'container-apps-acc' -or + @(Get-AzResource -ResourceGroupName $ResourceGroupName -ErrorAction Stop).Count -ne 0) { + throw 'Refusing to deploy into an existing populated or unrelated resource group. Use a new dedicated group; use Test-ContainerApp.ps1 to verify an existing deployment.' + } +} +else { + $null = New-AzResourceGroup -Name $ResourceGroupName -Location uaenorth ` + -Tag @{ sample = 'container-apps-acc' } -ErrorAction Stop +} + +$parameters = @{ + ResourceGroupName = $ResourceGroupName + TemplateFile = Join-Path $PSScriptRoot 'main.json' + TemplateParameterObject = @{ + location = 'uaenorth' + environmentName = $EnvironmentName + appName = $AppName + } + ErrorAction = 'Stop' +} +$deploymentName = "acc-hello-$([guid]::NewGuid().ToString('N').Substring(0, 8))" +try { + # Az.Resources can return an empty string rather than no output on success. + $errors = @(Test-AzResourceGroupDeployment @parameters | Where-Object { $null -ne $_ -and $_ -cne '' }) + if ($errors.Count -gt 0) { + throw "ARM validation failed: $($errors | ConvertTo-Json -Depth 20 -Compress)" + } + if ($ValidateOnly) { + Write-Host "ARM validation passed. Only the empty resource group '$ResourceGroupName' has been created; no app or environment deployed." + return + } + $deployment = New-AzResourceGroupDeployment -Name $deploymentName @parameters + if ($deployment.ProvisioningState -ne 'Succeeded') { + throw "Deployment '$deploymentName' did not succeed: $($deployment.ProvisioningState)" + } + & (Join-Path $PSScriptRoot 'Test-ContainerApp.ps1') -SubscriptionId $SubscriptionId ` + -ResourceGroupName $ResourceGroupName -EnvironmentName $EnvironmentName -AppName $AppName +} +catch { + Write-Warning "Validation, deployment or verification failed. Resources are retained in '$ResourceGroupName'. Inspect deployment '$deploymentName' and any partial resources; this is NOT a successful confidential deployment." + Write-Warning "Resource group: https://portal.azure.com/#resource/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/overview" + throw +} diff --git a/azure-container-apps-sample/container-apps-acc/DeploymentHelpers.ps1 b/azure-container-apps-sample/container-apps-acc/DeploymentHelpers.ps1 new file mode 100644 index 0000000..4d90b2b --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/DeploymentHelpers.ps1 @@ -0,0 +1,80 @@ +function Get-ArmJson { + [CmdletBinding()] + param([Parameter(Mandatory)][string]$Path) + + $response = Invoke-AzRestMethod -Method GET -Path $Path -ErrorAction Stop + if ($response.StatusCode -ne 200) { + throw "ARM GET failed for ${Path}: HTTP $($response.StatusCode): $($response.Content)" + } + $response.Content | ConvertFrom-Json -ErrorAction Stop +} + +function Assert-ConfidentialContainerApp { + [CmdletBinding()] + param( + [Parameter(Mandatory)][object]$App, + [Parameter(Mandatory)][object]$Environment + ) + + if ($App.properties.provisioningState -ne 'Succeeded' -or + $Environment.properties.provisioningState -ne 'Succeeded') { + throw 'App and environment must both report provisioningState Succeeded.' + } + if ($App.properties.environmentId -ne $Environment.id) { + throw 'The app is not bound to the expected environment.' + } + $profileName = $App.properties.workloadProfileName + $profiles = @($Environment.properties.workloadProfiles | Where-Object name -eq $profileName) + if ($profileName -ne 'confidential' -or $profiles.Count -ne 1 -or + $profiles[0].workloadProfileType -ne 'DC4' -or + $profiles[0].minimumCount -ne 1 -or $profiles[0].maximumCount -ne 1) { + throw 'Expected explicit binding to the confidential DC4 profile with exactly one node; refusing ordinary-compute fallback.' + } + if ($App.location -notin @('uaenorth', 'UAE North') -or + $Environment.location -notin @('uaenorth', 'UAE North')) { + throw 'Expected the app and environment in UAE North.' + } + $ingress = $App.properties.configuration.ingress + if ($ingress.external -ne $true -or $ingress.allowInsecure -ne $false -or + $ingress.targetPort -ne 80 -or [string]::IsNullOrWhiteSpace($ingress.fqdn)) { + throw 'Expected public HTTPS-only ingress, target port 80, and a nonempty FQDN.' + } + if ([string]::IsNullOrWhiteSpace($App.properties.latestRevisionName) -or + $App.properties.latestReadyRevisionName -ne $App.properties.latestRevisionName) { + throw 'The latest app revision is not ready.' + } + $uri = [uri]"https://$($ingress.fqdn)" + if ($uri.Host -ne $ingress.fqdn -or $uri.AbsolutePath -ne '/' -or $uri.Query -or + $uri.Fragment -or $uri.UserInfo -or -not $uri.IsDefaultPort) { + throw 'ARM returned an invalid application FQDN.' + } + $uri.AbsoluteUri.TrimEnd('/') +} + +function Test-HelloWorldEndpoint { + [CmdletBinding()] + param( + [Parameter(Mandatory)][uri]$Uri, + [ValidateRange(1, 30)][int]$Attempts = 12, + [ValidateRange(0, 60)][int]$DelaySeconds = 10 + ) + + if ($Uri.Scheme -ne 'https') { + throw 'Endpoint verification requires HTTPS.' + } + for ($attempt = 1; $attempt -le $Attempts; $attempt++) { + $response = Invoke-WebRequest -Uri $Uri -TimeoutSec 30 -MaximumRedirection 0 ` + -SkipHttpErrorCheck -ErrorAction Stop + if ($response.StatusCode -eq 200) { + if ($response.Content -notmatch 'Azure Container Apps') { + throw 'HTTP 200 received, but the Microsoft hello-world page signature is missing.' + } + return + } + if ($response.StatusCode -notin @(404, 408, 429, 500, 502, 503, 504) -or $attempt -eq $Attempts) { + throw "Hello-world verification failed: HTTP $($response.StatusCode) after $attempt attempt(s)." + } + Write-Warning "Endpoint returned HTTP $($response.StatusCode); retrying ($attempt/$Attempts)." + Start-Sleep -Seconds $DelaySeconds + } +} diff --git a/azure-container-apps-sample/container-apps-acc/README.md b/azure-container-apps-sample/container-apps-acc/README.md new file mode 100644 index 0000000..3056fcb --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/README.md @@ -0,0 +1,276 @@ +# Hello world on confidential Azure Container Apps + +[All Container Apps samples](../README.md) | [Repository overview](../../README.md) + +Deploy Microsoft's hello-world container to **Azure Container Apps** in **UAE +North**, using a dedicated **DC4 confidential workload profile**. Then verify the +app's Azure-reported placement and open its public HTTPS page. + +This example follows [Confidential compute in Azure Container Apps](https://learn.microsoft.com/azure/container-apps/confidential-compute) +and uses the public image and port from the +[Container Apps quickstart](https://learn.microsoft.com/azure/container-apps/get-started). + +**Tested:** 9 November 2026 in UAE North. ARM deployment succeeded, Azure-reported +DC4 binding and ready revision were verified, and the public endpoint returned +HTTP 200 with the hello-world page. Availability, quota and organizational +policies still need checking in your own subscription. + +For an application-code example, continue with +[Functions on Azure Container Apps](../functions-on-azure-container-apps/README.md). +It uses the native Functions integration with Node.js 24, a fresh runtime-image +pull on each build, managed identity, and private Blob host storage; see its +runtime-update policy. +The original test deployment is not a shared live demo; this README describes how +to create your own resources, not a retained public demo. + +## Start here + +1. Review [resources and cost](#resources-and-cost) and [prerequisites](#prerequisites). +2. [Sign in and select the subscription](#1-sign-in-and-select-the-subscription). +3. [Validate, then deploy](#2-validate-then-deploy) into a new dedicated group. +4. [Verify again](#3-verify-again-without-deploying) without creating resources. +5. Optionally [add the Functions sample](#next-step-add-a-function), or use + [optional cleanup](#optional-cleanup-only-when-you-choose) when finished. + +This sample serves an HTML hello-world page from a public quickstart image. +The [Functions sample](../functions-on-azure-container-apps/README.md#start-here) +instead runs your JavaScript code and serves JSON at `GET /api/hello`. +Neither sample silently substitutes ordinary compute when DC4 is unavailable. + +## What makes this confidential? + +Confidential compute is an **environment workload-profile setting**, not an image +setting or a container flag: + +1. The environment defines a profile named `confidential`, type **DC4**. +2. The app explicitly sets `properties.workloadProfileName` to `confidential`. +3. The verification script reads both resources back from Azure and requires that + exact binding. It never falls back to Consumption or a nonconfidential profile. + +The DC-series profile provides the service's confidential-computing protection +for data in use. No application SDK, custom runtime or image changes are required +for this quickstart. Configuration verification is **not independent +cryptographic hardware attestation**. This example does not implement attestation, +Secure Key Release, application authentication, or protection of external storage. + +## Resources and cost + +```text +New dedicated resource group (UAE North) + Virtual network (10.42.0.0/16) + Delegated infrastructure subnet (10.42.0.0/23), with NSG + Container Apps environment + confidential: DC4, minimum 1 / maximum 1 node + hello-world app: minimum 1 / maximum 1 replica + public HTTPS ingress -> container port 80 +``` + +- **DC4 dedicates 4 vCPUs and 16 GiB to the profile**, even though the example + container requests only 0.5 vCPU and 1 GiB. +- Dedicated compute and applicable environment/network charges continue while + resources are retained, including when there is no traffic. This is not a + free Consumption deployment. Review [Container Apps pricing](https://azure.microsoft.com/pricing/details/container-apps/) + for current regional rates. +- There is no custom registry, database, managed identity or role assignment. + The environment is integrated into the new subnet to support subscriptions + requiring VNet injection. The NSG uses Azure's default rules; it is not a + production egress firewall. There is no peering to existing networks; review + address-space overlap before extending this example. + Azure creates a service-managed infrastructure resource group containing + resources such as its load balancer and public IP. Do not modify those directly. +- Log Analytics is deliberately omitted (empty ARM log destination). Centralized + application log retention is not configured. +- **Nothing is automatically deleted**, on success or failure. +- The endpoint is publicly accessible without sign-in. Send no sensitive data. + TLS terminates at the managed ingress; the container listens on port 80. +- The Microsoft quickstart image uses a mutable `latest` tag. For production, + review and pin an approved image digest and add appropriate identity, + networking, monitoring, attestation and lifecycle controls. + +## Prerequisites + +- An Azure public-cloud subscription authorized for confidential Container Apps. + The linked documentation currently lists **UAE North**. Availability and capacity + can change; this sample intentionally permits only `uaenorth`. +- Permission to create a resource group, VNet, NSG, managed environment and container app + (for example Contributor at subscription scope). **Owner is not required**; + this example does not activate PIM roles or create role assignments. Activate + any required eligible role through your organization's normal process first. +- The `Microsoft.App` and `Microsoft.Network` providers must be registered. Registration requires + subscription-level provider registration permission. +- Available regional environment quota and DC4 capacity. An advertised profile + does not guarantee capacity. The script checks profile availability and + environment-count quota; ARM preflight/provisioning may reveal additional + service restrictions. +- PowerShell **7+** and the `Az.Accounts` and `Az.Resources` modules. + Azure CLI, `Az.App`, Bicep, Node.js and Docker are not required. + +If needed, install the two modules in PowerShell 7: + +```powershell +Install-Module Az.Accounts, Az.Resources -Scope CurrentUser -Repository PSGallery +``` + +## 1. Sign in and select the subscription + +From the repository root in PowerShell 7: + +```powershell +Connect-AzAccount +Get-AzSubscription | Select-Object Name, Id +$subscriptionId = '' +Set-AzContext -SubscriptionId $subscriptionId + +Register-AzResourceProvider -ProviderNamespace Microsoft.App +Register-AzResourceProvider -ProviderNamespace Microsoft.Network +(Invoke-AzRestMethod -Method GET -Path "/subscriptions/$subscriptionId/providers/Microsoft.App?api-version=2021-04-01").Content | + ConvertFrom-Json | Select-Object registrationState +``` + +Registration is a subscription-wide prerequisite, not a demo resource. Repeat +the status command for both providers until each reports `Registered` (replace +`Microsoft.App` with `Microsoft.Network` for the network provider); registration can take several +minutes. The script fails with an actionable error if it is not registered. + +## 2. Validate, then deploy + +Choose a **new, dedicated** group and keep its name for verification and optional +cleanup: + +```powershell +Set-Location .\azure-container-apps-sample\container-apps-acc +$resourceGroup = "rg-container-apps-acc-$([guid]::NewGuid().ToString('N').Substring(0, 8))" + +# Optional preflight: creates only the empty resource group, then validates ARM. +.\Deploy-ContainerApp.ps1 -SubscriptionId $subscriptionId ` + -ResourceGroupName $resourceGroup -ValidateOnly + +# Validates again, deploys, and verifies placement plus the HTTPS response. +$result = .\Deploy-ContainerApp.ps1 -SubscriptionId $subscriptionId ` + -ResourceGroupName $resourceGroup +$result | Format-List +Start-Process $result.AppUrl +``` + +The script uses [main.json](main.json) with Container Apps API `2025-07-01` +and Network API `2024-05-01`. Default names are +`cae-acc-hello` and `ca-acc-hello`. Optional `-EnvironmentName` and `-AppName` +parameters customize those names; use the same names for verification. + +Expect environment creation and DC4 provisioning to take several minutes. +Success produces `AppUrl` and `PortalUrl`, both fully qualified HTTPS links, plus +resource IDs and the verified profile. The page is Microsoft's Container Apps +hello-world/quickstart page. + +Use `$result.PortalUrl` to open the deployed app's Azure portal resource. +Use `$result.AppUrl` for its public HTML page; use the links returned by your +own deployment rather than an earlier test deployment's address. + +For safety, deployment refuses existing populated or unrelated groups. It can +reuse only an **empty** group tagged `sample=container-apps-acc`, such as the one +created by `-ValidateOnly`. After deploying, use verification rather than running +deployment again. If a failure leaves partial resources, inspect them before +choosing a new group or explicitly cleaning up; repeated new groups can multiply +charges. + +## 3. Verify again without deploying + +```powershell +.\Test-ContainerApp.ps1 -SubscriptionId $subscriptionId ` + -ResourceGroupName $resourceGroup | Format-List +``` + +Verification requires: + +- Provisioning and latest-revision readiness settle within a bounded wait of + 60 checks, 10 seconds apart. A temporarily `Updating` environment after ARM + deployment is retried; failed or unexpected states terminate immediately. +- Both resources report `Succeeded` in UAE North. +- The app references the expected environment and its `confidential` DC4 profile, + with exactly one dedicated node. +- The latest revision is ready and ingress is public, HTTPS-only, on target port 80. +- The HTTPS endpoint returns **200** and the Microsoft quickstart page contains + `Azure Container Apps`. Transient HTTP statuses are retried for up to 12 requests; + redirects, incorrect content and transport errors terminate verification. + +In the portal, inspect **Environment > Workload profiles** for `DC4`, then the +app's **JSON View** for `properties.workloadProfileName: confidential`. Neither +the web page alone nor a successful ARM deployment alone proves DC4 placement. +Azure may also add its default `Consumption` profile to the environment. Its +presence does not change this app's explicit binding to `confidential`; the +verification checks the app's selected profile, not merely available profiles. + +### Show explicit confidential-compute evidence + +Follow the [read-only placement verification](../README.md#validate-confidential-compute-placement) +from the repository root. Set `$appName = 'ca-acc-hello'` and use the subscription, +group and environment from your deployment (including any customized names). +The procedure prints the live app/environment IDs, assigned profile name, +**DC4 profile type**, latest ready revision, running/health states and timestamp. +It fails rather than reporting success for ordinary compute or an unhealthy +revision. The same section provides a portal cross-check and explains the +limits of control-plane evidence. + +For this example, retain both that output and the result of +[Test-ContainerApp.ps1](Test-ContainerApp.ps1): the former makes the placement +evidence visible, while the latter additionally validates the HTML endpoint. +An HTTP 200 page by itself is not confidential-computing verification. + +## Next step: add a function + +Keep the environment and follow the +[Functions deployment walkthrough](../functions-on-azure-container-apps/README.md#start-here). +Use this deployment's subscription, resource group and environment name there. +The Functions app explicitly selects the same `confidential` DC4 profile and +can share its existing node with the quickstart app. + +The Functions guide adds a registry, user-assigned identity, scoped role +assignments, host storage and private Blob networking. Unlike this quickstart, +it requires permission to create role assignments. Its additional subnet +defaults to `10.42.2.0/24`; preserve that subnet if you later modify the VNet. +Do not rerun this sample's deployment script against the now-populated group. +Verify both app placement and Functions host-storage health using the +respective guides; a successful hello-world response alone is insufficient. + +## Troubleshooting + +| Symptom | Action | +| --- | --- | +| Provider is not registered | Register the named provider in the selected subscription and wait for `Registered`. | +| Authorization/PIM error | Confirm tenant/subscription and activate an appropriate role; retry after propagation. | +| No DC4 profile, zero/exhausted quota, or insufficient capacity | Check UAE North support and request service access/quota/capacity through Azure support. Do not substitute ordinary compute. | +| ARM validation or deployment fails | Read the terminating error and the resource group's **Deployments** details. Inspect partial resources; they are retained. | +| Organizational networking policy rejects deployment | The template includes VNet injection and a subnet NSG. Review any additional private-ingress, outbound connectivity, address-space or tagging requirements with your administrator; do not bypass policy. | +| Deployment succeeded but verification failed | Inspect the revision and profile, then rerun the verification script. Do not treat this as a verified confidential deployment. | +| Need centralized logs | Add your approved logging configuration separately; this minimal example does not provision a workspace. | + +## Optional cleanup (only when you choose) + +**This deletes the selected group and everything inside it.** First confirm the +subscription and inventory. Do not use a shared group. +If you added the Functions sample to this group, group deletion also removes +its app, registry, identity, storage, private endpoint and DNS resources. +Deleting only an app does not stop charges for the retained DC4 environment. + +```powershell +Set-AzContext -SubscriptionId $subscriptionId +Get-AzResource -ResourceGroupName $resourceGroup | + Select-Object Name, ResourceType, ResourceId +# Run only after reviewing the inventory and deciding to remove the demo: +Remove-AzResourceGroup -Name $resourceGroup +``` + +Confirm completion in the portal, including any associated service-managed +infrastructure group. Provider registration is not undone. + +## Offline regression tests + +These use PowerShell mocks; no Pester dependency, Azure sign-in, or cloud +resources are required (the two Az modules must be installed): + +```powershell +.\tests\Test-Sample.ps1 +``` + +The tests cover the template's confidential binding/TLS/scaling, negative +placement and HTTP checks, and deployment preflight/failure behavior. diff --git a/azure-container-apps-sample/container-apps-acc/Test-ContainerApp.ps1 b/azure-container-apps-sample/container-apps-acc/Test-ContainerApp.ps1 new file mode 100644 index 0000000..0105d13 --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/Test-ContainerApp.ps1 @@ -0,0 +1,55 @@ +#Requires -Version 7.0 +#Requires -Modules Az.Accounts +[CmdletBinding()] +param( + [Parameter(Mandatory)][guid]$SubscriptionId, + [Parameter(Mandatory)][ValidatePattern('^[a-zA-Z0-9._()-]{1,90}$')][string]$ResourceGroupName, + [ValidatePattern('^[a-z][a-z0-9-]{0,30}[a-z0-9]$')][string]$EnvironmentName = 'cae-acc-hello', + [ValidatePattern('^[a-z][a-z0-9-]{0,30}[a-z0-9]$')][string]$AppName = 'ca-acc-hello' +) + +$ErrorActionPreference = 'Stop' +. (Join-Path $PSScriptRoot 'DeploymentHelpers.ps1') + +if (-not (Get-AzContext)) { + throw 'Sign in with Connect-AzAccount first.' +} +$currentContext = Get-AzContext +$context = Set-AzContext -SubscriptionId $SubscriptionId -TenantId $currentContext.Tenant.Id -ErrorAction Stop +if ($context.Environment.Name -ne 'AzureCloud') { + throw 'This sample supports Azure public cloud only.' +} +$base = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.App" +for ($attempt = 1; $attempt -le 60; $attempt++) { + $environment = Get-ArmJson -Path "$base/managedEnvironments/${EnvironmentName}?api-version=2025-07-01" + $app = Get-ArmJson -Path "$base/containerApps/${AppName}?api-version=2025-07-01" + $states = @($environment.properties.provisioningState, $app.properties.provisioningState) + if (@($states | Where-Object { $_ -notin @('Succeeded', 'Creating', 'Updating', 'InProgress') }).Count -gt 0) { + throw "Unexpected or failed provisioning state: environment=$($states[0]); app=$($states[1])." + } + if ($states[0] -eq 'Succeeded' -and $states[1] -eq 'Succeeded' -and + -not [string]::IsNullOrWhiteSpace($app.properties.latestRevisionName) -and + $app.properties.latestReadyRevisionName -eq $app.properties.latestRevisionName) { + break + } + if ($attempt -eq 60) { + throw 'Timed out waiting for successful provisioning and the latest ready revision; resources are retained.' + } + Write-Host "Waiting for provisioning and revision readiness ($attempt/60)." + Start-Sleep -Seconds 10 +} +$url = Assert-ConfidentialContainerApp -App $app -Environment $environment +Test-HelloWorldEndpoint -Uri $url + +[pscustomobject]@{ + SubscriptionId = $SubscriptionId + ResourceGroupName = $ResourceGroupName + EnvironmentId = $environment.id + AppId = $app.id + Location = $app.location + WorkloadProfileName = $app.properties.workloadProfileName + WorkloadProfileType = 'DC4' + AppUrl = $url + PortalUrl = "https://portal.azure.com/#resource$($app.id)/overview" + Verification = 'Azure-reported DC4 placement and HTTPS hello-world response (not cryptographic attestation)' +} diff --git a/azure-container-apps-sample/container-apps-acc/main.json b/azure-container-apps-sample/container-apps-acc/main.json new file mode 100644 index 0000000..0bb98e7 --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/main.json @@ -0,0 +1,135 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "location": { + "type": "string", + "defaultValue": "uaenorth", + "allowedValues": ["uaenorth"], + "metadata": { "description": "Region documented for confidential Container Apps. No regional fallback." } + }, + "environmentName": { + "type": "string", + "defaultValue": "cae-acc-hello", + "minLength": 2, + "maxLength": 32 + }, + "appName": { + "type": "string", + "defaultValue": "ca-acc-hello", + "minLength": 2, + "maxLength": 32 + } + }, + "variables": { + "profileName": "confidential", + "vnetName": "[concat(parameters('environmentName'), '-vnet')]", + "nsgName": "[concat(parameters('environmentName'), '-nsg')]", + "tags": { "sample": "container-apps-acc" } + }, + "resources": [ + { + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2024-05-01", + "name": "[variables('nsgName')]", + "location": "[parameters('location')]", + "tags": "[variables('tags')]", + "properties": { "securityRules": [] } + }, + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2024-05-01", + "name": "[variables('vnetName')]", + "location": "[parameters('location')]", + "tags": "[variables('tags')]", + "dependsOn": ["[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]"], + "properties": { + "addressSpace": { "addressPrefixes": ["10.42.0.0/16"] }, + "subnets": [ + { + "name": "infrastructure", + "properties": { + "addressPrefix": "10.42.0.0/23", + "networkSecurityGroup": { + "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('nsgName'))]" + }, + "delegations": [ + { "name": "container-apps", "properties": { "serviceName": "Microsoft.App/environments" } } + ] + } + } + ] + } + }, + { + "type": "Microsoft.App/managedEnvironments", + "apiVersion": "2025-07-01", + "name": "[parameters('environmentName')]", + "location": "[parameters('location')]", + "tags": "[variables('tags')]", + "dependsOn": ["[resourceId('Microsoft.Network/virtualNetworks', variables('vnetName'))]"], + "properties": { + "publicNetworkAccess": "Enabled", + "vnetConfiguration": { + "infrastructureSubnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vnetName'), 'infrastructure')]", + "internal": false + }, + "appLogsConfiguration": { "destination": "" }, + "workloadProfiles": [ + { + "name": "[variables('profileName')]", + "workloadProfileType": "DC4", + "minimumCount": 1, + "maximumCount": 1 + } + ] + } + }, + { + "type": "Microsoft.App/containerApps", + "apiVersion": "2025-07-01", + "name": "[parameters('appName')]", + "location": "[parameters('location')]", + "tags": "[variables('tags')]", + "dependsOn": ["[resourceId('Microsoft.App/managedEnvironments', parameters('environmentName'))]"], + "properties": { + "environmentId": "[resourceId('Microsoft.App/managedEnvironments', parameters('environmentName'))]", + "workloadProfileName": "[variables('profileName')]", + "configuration": { + "activeRevisionsMode": "Single", + "ingress": { + "external": true, + "targetPort": 80, + "transport": "auto", + "allowInsecure": false, + "traffic": [{ "latestRevision": true, "weight": 100 }] + } + }, + "template": { + "containers": [ + { + "name": "hello-world", + "image": "mcr.microsoft.com/k8se/quickstart:latest", + "resources": { "cpu": 0.5, "memory": "1Gi" } + } + ], + "scale": { "minReplicas": 1, "maxReplicas": 1 } + } + } + } + ], + "outputs": { + "environmentId": { + "type": "string", + "value": "[resourceId('Microsoft.App/managedEnvironments', parameters('environmentName'))]" + }, + "appId": { + "type": "string", + "value": "[resourceId('Microsoft.App/containerApps', parameters('appName'))]" + }, + "appUrl": { + "type": "string", + "value": "[concat('https://', reference(resourceId('Microsoft.App/containerApps', parameters('appName')), '2025-07-01').configuration.ingress.fqdn)]" + } + } +} diff --git a/azure-container-apps-sample/container-apps-acc/tests/Test-Sample.ps1 b/azure-container-apps-sample/container-apps-acc/tests/Test-Sample.ps1 new file mode 100644 index 0000000..d531ea3 --- /dev/null +++ b/azure-container-apps-sample/container-apps-acc/tests/Test-Sample.ps1 @@ -0,0 +1,251 @@ +#Requires -Version 7.0 +#Requires -Modules Az.Accounts, Az.Resources +$ErrorActionPreference = 'Stop' +$sampleRoot = Split-Path $PSScriptRoot -Parent +. (Join-Path $sampleRoot 'DeploymentHelpers.ps1') +$script:passed = 0 +$state = @{} + +function Assert($Condition, [string]$Message) { + if (-not $Condition) { throw $Message } +} +function Expect-Failure([scriptblock]$Action, [string]$Pattern) { + try { & $Action } + catch { + Assert ($_.Exception.Message -match $Pattern) "Unexpected error: $_" + return + } + throw "Expected a failure matching '$Pattern'." +} +function Case([string]$Name, [scriptblock]$Action) { + & $Action + $script:passed++ + Write-Host "PASS $Name" +} +function New-Fixture { + @{ + Environment = @{ + id = '/subscriptions/test/resourceGroups/test/providers/Microsoft.App/managedEnvironments/test' + location = 'uaenorth' + properties = @{ + provisioningState = 'Succeeded' + workloadProfiles = @(@{ name = 'confidential'; workloadProfileType = 'DC4'; minimumCount = 1; maximumCount = 1 }) + } + } + App = @{ + id = '/subscriptions/test/resourceGroups/test/providers/Microsoft.App/containerApps/test' + location = 'uaenorth' + properties = @{ + provisioningState = 'Succeeded' + environmentId = '/subscriptions/test/resourceGroups/test/providers/Microsoft.App/managedEnvironments/test' + workloadProfileName = 'confidential' + latestRevisionName = 'test--ready' + latestReadyRevisionName = 'test--ready' + configuration = @{ ingress = @{ external = $true; allowInsecure = $false; targetPort = 80; fqdn = 'test.example.com' } } + } + } + } +} + +# All external calls are mocked at script scope, including the child deployment script. +function Get-AzContext { @{ Environment = @{ Name = 'AzureCloud' }; Tenant = @{ Id = 'offline-test' } } } +function Set-AzContext { @{ Environment = @{ Name = 'AzureCloud' }; Tenant = @{ Id = 'offline-test' } } } +function Get-AzResourceGroup { + if ($state.existing) { @{ ResourceGroupName = 'rg-offline'; Tags = @{ sample = 'container-apps-acc' } } } +} +function Get-AzResource { if ($state.populated) { @{ Name = 'unrelated' } } } +function New-AzResourceGroup { $state.groupCreates++ } +function Test-AzResourceGroupDeployment { + if ($state.invalid) { @{ Code = 'InvalidTemplate'; Message = 'test rejection' } } + elseif ($state.validationEmptyString) { '' } +} +function New-AzResourceGroupDeployment { + $state.deployments++ + if ($state.deployFails) { throw 'Mock capacity rejection' } + @{ ProvisioningState = 'Succeeded' } +} +function Invoke-AzRestMethod { + param($Path) + if ($state.restFails) { return @{ StatusCode = 403; Content = 'Forbidden' } } + $data = switch -Wildcard ($Path) { + '*availableManagedEnvironmentsWorkloadProfileTypes*' { + if ($state.noProfile) { @{ value = @() } } + else { @{ value = @(@{ name = 'DC4' }) } } + } + '*/usages?*' { @{ value = @(@{ name = @{ value = 'ManagedEnvironmentCount' }; currentValue = 0; limit = $state.limit }) } } + '*/managedEnvironments/*' { + $state.environmentReads++ + $environment = (New-Fixture).Environment + if ($state.environmentReads -le $state.updatingReads) { + $environment.properties.provisioningState = 'Updating' + } + if ($state.failedEnvironment) { $environment.properties.provisioningState = 'Failed' } + $environment + } + '*/containerApps/*' { (New-Fixture).App } + default { @{ registrationState = $state.registration } } + } + @{ StatusCode = 200; Content = ($data | ConvertTo-Json -Depth 20) } +} +function Invoke-WebRequest { + $state.httpCalls++ + $status = if ($state.httpCalls -le $state.transientCount) { 503 } else { $state.httpStatus } + @{ StatusCode = $status; Content = $state.content } +} +function Start-Sleep {} +function Reset-Mocks { + $state.existing = $false + $state.populated = $false + $state.groupCreates = 0 + $state.deployments = 0 + $state.invalid = $false + $state.validationEmptyString = $true + $state.deployFails = $false + $state.restFails = $false + $state.noProfile = $false + $state.limit = 50 + $state.registration = 'Registered' + $state.httpCalls = 0 + $state.httpStatus = 200 + $state.transientCount = 0 + $state.content = 'Azure Container Apps hello world' + $state.environmentReads = 0 + $state.updatingReads = 0 + $state.failedEnvironment = $false +} +$deployArgs = @{ SubscriptionId = '00000000-0000-0000-0000-000000000001'; ResourceGroupName = 'rg-offline' } +$deployScript = Join-Path $sampleRoot 'Deploy-ContainerApp.ps1' + +Case 'PowerShell parses cleanly' { + foreach ($file in Get-ChildItem $sampleRoot -Filter '*.ps1' -Recurse) { + $tokens = $null; $parseErrors = $null + $null = [System.Management.Automation.Language.Parser]::ParseFile($file.FullName, [ref]$tokens, [ref]$parseErrors) + Assert ($parseErrors.Count -eq 0) ($parseErrors -join "`n") + } +} +Case 'ARM template binds DC4, HTTPS and bounded scaling' { + $template = Get-Content (Join-Path $sampleRoot 'main.json') -Raw | ConvertFrom-Json + $envResource = $template.resources | Where-Object type -eq 'Microsoft.App/managedEnvironments' + $appResource = $template.resources | Where-Object type -eq 'Microsoft.App/containerApps' + Assert ($template.resources.Count -eq 4) 'Unexpected supporting resources.' + Assert ($template.parameters.location.allowedValues.Count -eq 1 -and $template.parameters.location.allowedValues[0] -eq 'uaenorth') 'Region fallback allowed.' + Assert ($envResource.properties.workloadProfiles.Count -eq 1) 'Unexpected additional profiles.' + Assert ($envResource.properties.appLogsConfiguration.destination -ceq '') 'Expected disabled centralized logging via empty ARM destination.' + $profile = $envResource.properties.workloadProfiles[0] + Assert ($profile.workloadProfileType -eq 'DC4' -and $profile.minimumCount -eq 1 -and $profile.maximumCount -eq 1) 'Not one DC4 node.' + Assert ($appResource.properties.workloadProfileName -eq $profile.name) 'Profile binding mismatch.' + Assert ($appResource.properties.environmentId -eq $appResource.dependsOn[0]) 'Environment dependency mismatch.' + Assert ($appResource.properties.configuration.ingress.allowInsecure -eq $false -and $appResource.properties.configuration.ingress.external -eq $true) 'Incorrect ingress.' + Assert ($appResource.properties.configuration.ingress.targetPort -eq 80) 'Wrong target port.' + Assert ($appResource.properties.template.scale.minReplicas -eq 1 -and $appResource.properties.template.scale.maxReplicas -eq 1) 'Unexpected scaling.' + Assert ($appResource.properties.template.containers[0].image -eq 'mcr.microsoft.com/k8se/quickstart:latest') 'Wrong quickstart image.' + $vnet = $template.resources | Where-Object type -eq 'Microsoft.Network/virtualNetworks' + Assert ($vnet.properties.subnets[0].properties.delegations[0].properties.serviceName -eq 'Microsoft.App/environments') 'Missing subnet delegation.' + Assert ($null -ne $vnet.properties.subnets[0].properties.networkSecurityGroup.id) 'Missing subnet NSG.' + Assert ($null -ne $envResource.properties.vnetConfiguration.infrastructureSubnetId -and $envResource.properties.vnetConfiguration.internal -eq $false) 'Missing external VNet-integrated environment.' +} +Case 'Accept valid Azure-reported confidential placement' { + $f = New-Fixture + Assert ((Assert-ConfidentialContainerApp -App $f.App -Environment $f.Environment) -eq 'https://test.example.com') 'Wrong URL.' +} +Case 'Accept UAE North display name returned by the live API' { + $f = New-Fixture + $f.App.location = 'UAE North' + $f.Environment.location = 'UAE North' + Assert ((Assert-ConfidentialContainerApp -App $f.App -Environment $f.Environment) -eq 'https://test.example.com') 'Region display name rejected.' +} +Case 'Wait for transient environment update before verifying' { + Reset-Mocks + $state.updatingReads = 2 + $result = & (Join-Path $sampleRoot 'Test-ContainerApp.ps1') @deployArgs + Assert ($result.WorkloadProfileType -eq 'DC4' -and $state.environmentReads -eq 3) 'Readiness wait failed.' +} +Case 'Bound readiness polling and never verify a failed environment' { + Reset-Mocks + $state.updatingReads = 60 + Expect-Failure { & (Join-Path $sampleRoot 'Test-ContainerApp.ps1') @deployArgs } 'Timed out' + Assert ($state.environmentReads -eq 60 -and $state.httpCalls -eq 0) 'Unbounded polling or premature endpoint verification.' + Reset-Mocks + $state.failedEnvironment = $true + Expect-Failure { & (Join-Path $sampleRoot 'Test-ContainerApp.ps1') @deployArgs } 'failed provisioning' + Assert ($state.environmentReads -eq 1 -and $state.httpCalls -eq 0) 'Failed environment was retried or accepted.' +} +foreach ($change in @( + @{ Name = 'Consumption binding'; Edit = { param($f) $f.App.properties.workloadProfileName = 'Consumption' }; Pattern = 'DC4' }, + @{ Name = 'ordinary D4 profile'; Edit = { param($f) $f.Environment.properties.workloadProfiles[0].workloadProfileType = 'D4' }; Pattern = 'DC4' }, + @{ Name = 'wrong environment'; Edit = { param($f) $f.App.properties.environmentId = '/other' }; Pattern = 'environment' }, + @{ Name = 'unready revision'; Edit = { param($f) $f.App.properties.latestReadyRevisionName = 'old' }; Pattern = 'not ready' }, + @{ Name = 'insecure ingress'; Edit = { param($f) $f.App.properties.configuration.ingress.allowInsecure = $true }; Pattern = 'HTTPS-only' }, + @{ Name = 'failed provisioning'; Edit = { param($f) $f.Environment.properties.provisioningState = 'Failed' }; Pattern = 'Succeeded' }, + @{ Name = 'wrong region'; Edit = { param($f) $f.App.location = 'eastus' }; Pattern = 'UAE North' }, + @{ Name = 'malformed FQDN'; Edit = { param($f) $f.App.properties.configuration.ingress.fqdn = 'example.com/other' }; Pattern = 'FQDN' } +)) { + Case "Reject $($change.Name)" { + $f = New-Fixture + & $change.Edit $f + Expect-Failure { Assert-ConfidentialContainerApp -App $f.App -Environment $f.Environment } $change.Pattern + } +} +Case 'Retry transient HTTP failure then require content' { + Reset-Mocks; $state.transientCount = 1 + Test-HelloWorldEndpoint -Uri 'https://test.example.com' -DelaySeconds 0 + Assert ($state.httpCalls -eq 2) 'Did not retry.' +} +Case 'Reject HTTP 200 without hello-world signature' { + Reset-Mocks; $state.content = 'unrelated page' + Expect-Failure { Test-HelloWorldEndpoint -Uri 'https://test.example.com' } 'signature' +} +Case 'Reject persistent HTTP failure' { + Reset-Mocks; $state.httpStatus = 503 + Expect-Failure { Test-HelloWorldEndpoint -Uri 'https://test.example.com' -Attempts 2 -DelaySeconds 0 } 'after 2' +} +Case 'Reject plaintext endpoint and redirects' { + Reset-Mocks + Expect-Failure { Test-HelloWorldEndpoint -Uri 'http://test.example.com' } 'HTTPS' + $state.httpStatus = 302 + Expect-Failure { Test-HelloWorldEndpoint -Uri 'https://test.example.com' } 'HTTP 302' +} +Case 'ValidateOnly never provisions compute' { + Reset-Mocks + & $deployScript @deployArgs -ValidateOnly + Assert ($state.groupCreates -eq 1 -and $state.deployments -eq 0) 'ValidateOnly deployed resources.' +} +Case 'ARM preflight failure prevents deployment' { + Reset-Mocks; $state.invalid = $true + Expect-Failure { & $deployScript @deployArgs } 'ARM validation failed' + Assert ($state.deployments -eq 0) 'Deployed after failed validation.' +} +Case 'Provider, profile, quota and access failures prevent group creation' { + foreach ($flag in @('registration', 'noProfile', 'limit', 'restFails')) { + Reset-Mocks + switch ($flag) { + registration { $state.registration = 'NotRegistered'; $pattern = 'Register Microsoft.App' } + noProfile { $state.noProfile = $true; $pattern = 'does not advertise DC4' } + limit { $state.limit = 0; $pattern = 'quota exhausted' } + restFails { $state.restFails = $true; $pattern = 'HTTP 403' } + } + Expect-Failure { & $deployScript @deployArgs } $pattern + Assert ($state.groupCreates -eq 0 -and $state.deployments -eq 0) 'Created resources after prerequisite failure.' + } +} +Case 'Refuse populated existing group' { + Reset-Mocks; $state.existing = $true; $state.populated = $true + Expect-Failure { & $deployScript @deployArgs } 'Refusing' + Assert ($state.deployments -eq 0) 'Modified populated group.' +} +Case 'Preserve deployment failure instead of claiming success' { + Reset-Mocks; $state.deployFails = $true + Expect-Failure { & $deployScript @deployArgs } 'Mock capacity rejection' + Assert ($state.deployments -eq 1) 'Unexpected fallback attempt.' +} +Case 'Successful deployment returns verified result and retains resources' { + Reset-Mocks; $state.existing = $true + $result = & $deployScript @deployArgs + Assert ($state.groupCreates -eq 0 -and $state.deployments -eq 1) 'Unexpected resource changes.' + Assert ($result.WorkloadProfileType -eq 'DC4' -and $result.AppUrl -eq 'https://test.example.com') 'Missing verification result.' +} +Case 'HTTP verification failure propagates from deployment' { + Reset-Mocks; $state.content = 'wrong app' + Expect-Failure { & $deployScript @deployArgs } 'signature' +} +Write-Host "$script:passed offline tests passed." diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/.dockerignore b/azure-container-apps-sample/functions-on-azure-container-apps/.dockerignore new file mode 100644 index 0000000..75a7266 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/.dockerignore @@ -0,0 +1,10 @@ +node_modules +local.settings*.json +.git +.azure +.azurite +test +README.md +main.json +*.log +.azurite diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/.funcignore b/azure-container-apps-sample/functions-on-azure-container-apps/.funcignore new file mode 100644 index 0000000..63b632b --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/.funcignore @@ -0,0 +1,8 @@ +.git* +.azure +node_modules +local.settings*.json +test +Dockerfile +README.md +main.json diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/.gitignore b/azure-container-apps-sample/functions-on-azure-container-apps/.gitignore new file mode 100644 index 0000000..9288c3e --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +local.settings.json +.azure/ +.azurite/ +/.azurite/ diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/Dockerfile b/azure-container-apps-sample/functions-on-azure-container-apps/Dockerfile new file mode 100644 index 0000000..89fbb4c --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/azure-functions/node:4-node24 + +ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ + AzureFunctionsJobHost__Logging__Console__IsEnabled=true \ + FUNCTIONS_WORKER_RUNTIME=node + +WORKDIR /home/site/wwwroot +COPY package.json package-lock.json ./ +RUN node --version && npm ci --omit=dev +COPY host.json ./ +COPY src ./src + +EXPOSE 80 diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/README.md b/azure-container-apps-sample/functions-on-azure-container-apps/README.md new file mode 100644 index 0000000..960aa7f --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/README.md @@ -0,0 +1,504 @@ +# Hello world: Azure Functions on Azure Container Apps + +[All Container Apps samples](../README.md) | [Repository overview](../../README.md) + +Run a small JavaScript HTTP function in the **native Azure Functions integration +with Azure Container Apps**. `GET /api/hello` returns HTTP 200: + +```json +{"message":"Hello, world!"} +``` + +This example follows the [Functions on Container Apps overview](https://learn.microsoft.com/azure/container-apps/functions-overview) +and [native deployment guide](https://learn.microsoft.com/azure/container-apps/functions-usage). +It uses `Microsoft.App/containerApps` with `kind: functionapp`, **not** the legacy +`Microsoft.Web/sites` hosting model. + +The ARM template deploys only the function app. It requires an existing +Container Apps environment, registry, managed identity and host storage. The +instructions below use the sibling sample's UAE North **confidential DC4** +environment. `kind: functionapp` alone does not enable confidential computing: +the app must explicitly select the environment's confidential workload profile. + +## Start here + +This walkthrough creates a public hello-world function backed by keyless, +privately reachable host storage. It is not an App Service deployment and does +not host the App Service platform inside Container Apps. + +1. [Run locally](#1-run-locally) with Node.js 24 and Azurite. +2. [Prepare Azure prerequisites](#2-prepare-azure-prerequisites): deploy the + sibling confidential environment, create ACR/storage/identity, assign scoped + roles, and connect private Blob storage. +3. [Build a fresh image](#3-build-a-fresh-image) remotely with ACR Tasks. +4. [Validate and deploy](#4-validate-and-deploy-the-app) the immutable image. +5. [Verify placement, HTTP and storage](#5-verify-placement-http-response-and-host-storage), + then [open the app and Azure portal](#open-the-app-and-azure-portal). +6. [Clean up](#6-cleanup) only when you are finished; nothing automatically + removes the resources. + +Run the numbered Azure steps in order, from this folder, in the same PowerShell +session. The sample assumes the sibling environment's VNet address space and a +dedicated resource group. Review names, networking and the deployment preview +before creating resources. Use your own deployment's URLs; the validation run +below is evidence, not a supported shared public demo. + +### Choose the right walkthrough + +| Goal | Guide | +| --- | --- | +| Deploy an HTML quickstart page with no application build or registry | [Confidential Container Apps hello world](../container-apps-acc/README.md#start-here) | +| Deploy JavaScript Functions with managed identity and private host storage | Continue with this guide | + +Both use the environment's explicit `confidential` DC4 profile in UAE North. +This guide adds resources to the existing dedicated group, not a second DC4 +environment. Keep the environment if you want to run either example; deleting +the whole group removes both apps and their supporting resources. + +**Validation scope (2026-11-09):** source/deployment-contract tests passed +on Node.js 24. A fresh ACR task built the official Functions image with +Node.js 24.22.2 and deployed its immutable digest as a native `functionapp` +in a UAE North confidential DC4 profile. Azure readback confirmed the explicit +profile binding and a ready, running revision with zero restarts. The cloud +endpoint returned the exact JSON above with HTTP 200 and rejected POST with +HTTP 404; host logs reported `Running`. Initial cloud verification then detected +host-storage HTTP 403 because public storage networking was disabled without +a private endpoint. After deploying the private network configuration below, +Azure confirmed an approved Blob private endpoint and linked private DNS. The +replacement host created/used `azure-webjobs-hosts`, acquired its Blob lease and +remained ready/running without storage-health errors for over one minute. +Public storage access and shared keys remained disabled. Verify the host storage +checks as well as HTTP responses in your own deployment. +The local host also passed these checks +with Azurite. These are configuration and functional checks, not cryptographic +attestation or a guarantee of availability in every subscription. Run ARM +preflight and endpoint/placement checks in your own subscription. Do not +silently substitute Consumption if the service rejects that combination. + +## Runtime update policy: deploy the latest supported Node.js + +- Use the **newest generally available Node.js major supported by Azure + Functions**, currently **Node.js 24**, not an older default. Check the + [official supported-language list](https://learn.microsoft.com/azure/azure-functions/supported-languages) + before **every deployment**. Newer upstream Node.js releases are not + necessarily supported by the Functions host. +- The Dockerfile uses `mcr.microsoft.com/azure-functions/node:4-node24`, which + selects the latest published Functions image for that major. Build with + `docker build --pull --no-cache`, or use a fresh ACR build as shown below, + so a cached base image cannot retain an old patch. +- Rebuild for every deployment, use a unique application image tag, and deploy + the **digest returned by that new build**. Do not redeploy an old digest and + assume the Node.js runtime has updated. Confirm `node --version` in the built + image before pushing it. The Dockerfile also prints `node --version` into + the build log, including when you build remotely with ACR Tasks. +- When a newer Node.js major becomes GA in Functions, update the Dockerfile, + `package.json` engine range and runtime test together, then rerun the tests + and container smoke test before deployment. +- Running containers **do not update themselves**. Rebuild and redeploy regularly + for runtime/security patches. Dependency versions remain locked for repeatable + installs; update and test those separately rather than resolving arbitrary + application dependencies during deployment. + +## Files and architecture + +| File | Purpose | +| --- | --- | +| [src/hello.js](src/hello.js) | Stateless JSON response handler | +| [src/functions/hello.js](src/functions/hello.js) | Functions v4 HTTP registration: anonymous GET | +| [host.json](host.json) | Functions host configuration, `/api` route prefix | +| [Dockerfile](Dockerfile) | Official Functions host with Node.js, listening on port 80 | +| [acr-task.yaml](acr-task.yaml) | Fresh-pull, no-cache remote build and push with a unique run-ID tag | +| [main.json](main.json) | App-only ARM deployment with explicit workload profile | +| [host-storage-network.json](host-storage-network.json) | Blob private endpoint, separate subnet, private DNS zone and VNet link | +| [test/hello.test.js](test/hello.test.js) | Response, registration, runtime and deployment-contract tests | + +```text +Public HTTPS -> Container Apps ingress -> port 80 -> Functions host -> /api/hello + | + +-- existing confidential DC4 workload profile in UAE North + +-- user-assigned identity -> private ACR image pull + -> Blob private endpoint -> host storage + (VNet-linked private DNS) +``` + +The app requests 0.5 vCPU / 1 GiB and holds one replica. The environment's +dedicated DC4 node remains billable even while idle. Registry/build, storage, +networking and environment charges also apply. + +This is a public, anonymous hello-world endpoint, not a production security +architecture. Send no sensitive data. It does not implement application +authentication, remote attestation, Secure Key Release, private ingress or +centralized telemetry. The Blob private endpoint protects the host-storage +network path; ACR uses an authenticated registry endpoint, not a private endpoint. +Azure configuration checks are not cryptographic +attestation. The local storage emulator is not confidential compute. + +## 1. Run locally + +Prerequisites: **Node.js 24**, npm, and PowerShell. From this folder: + +```powershell +npm ci +npm run check +npm test +Copy-Item .\local.settings.example.json .\local.settings.json +npm run storage +``` + +Leave Azurite running, then open a second terminal in this folder: + +```powershell +npm start +``` + +In another terminal: + +```powershell +$response = Invoke-WebRequest http://localhost:7071/api/hello +if ($response.StatusCode -ne 200 -or + ($response.Content | ConvertFrom-Json).message -cne 'Hello, world!') { + throw 'Unexpected hello-world response.' +} +$response.Content +``` + +Stop the host and Azurite with Ctrl+C in their terminals. Azurite uses local +ports 10000-10002 and writes ignored files under `.azurite`. The example settings +use `UseDevelopmentStorage=true`, not Azure credentials. Local file-based host +keys are for development only; those settings are not copied into the container. +Never commit a real storage connection string or `local.settings.json`. + +Core Tools and Azurite are **development-only** dependencies. Their upstream +dependency trees can have audit findings; review `npm audit` and tool updates +before installation. Do not force-downgrade to obsolete tool majors to silence +an audit. The deployed image installs only production dependencies with +`npm ci --omit=dev`; check those with `npm audit --omit=dev`. + +## 2. Prepare Azure prerequisites + +For the Azure steps, install current **Azure CLI** (including its `containerapp` +extension), **PowerShell 7.4+**, **Az.Accounts** and **Az.Resources**. You need +permission to create the app and support resources, attach the identity, run ACR +builds, and assign the two resource-scoped data roles below. Contributor alone +cannot create role assignments. Use approved PIM access if necessary. + +First deploy the [confidential environment sample](../container-apps-acc/README.md) +in a dedicated demo group and retain its resources. That guide checks regional +DC4 availability, quota, provider registration and VNet policy. There is no shared +live demo to reuse; create your own dedicated environment. + +The following commands **create billable support resources**. Run them only when +you intend to deploy. Replace the subscription ID and resource group; the group +must contain the environment you just created. +Run the commands from this sample folder. + +```powershell +$ErrorActionPreference = 'Stop' +$PSNativeCommandUseErrorActionPreference = $true +$subscriptionId = '' +$resourceGroup = '' +$environmentName = 'cae-acc-hello' +$appName = 'ca-functions-hello' +$suffix = [guid]::NewGuid().ToString('N').Substring(0, 12) +$registryName = "acrfn$suffix" +$storageName = "stfn$suffix" + +az login +az account set --subscription $subscriptionId +Connect-AzAccount -Subscription $subscriptionId +$environmentId = az containerapp env show --name $environmentName ` + --resource-group $resourceGroup --query id --output tsv +$environment = az containerapp env show --name $environmentName ` + --resource-group $resourceGroup --output json | ConvertFrom-Json +$profile = @($environment.properties.workloadProfiles | + Where-Object name -eq 'confidential') +if ($environment.location -notin @('uaenorth', 'UAE North') -or + $profile.Count -ne 1 -or $profile[0].workloadProfileType -ne 'DC4') { + throw 'Expected an existing UAE North confidential DC4 environment.' +} + +$identity = az identity create --name "id-functions-$suffix" ` + --resource-group $resourceGroup --location uaenorth --output json | + ConvertFrom-Json +$registry = az acr create --name $registryName --resource-group $resourceGroup ` + --location uaenorth --sku Basic --role-assignment-mode rbac ` + --admin-enabled false --output json | ConvertFrom-Json +az acr config authentication-as-arm update --registry $registryName --status enabled +$storage = az storage account create --name $storageName ` + --resource-group $resourceGroup --location uaenorth --sku Standard_LRS ` + --kind StorageV2 --https-only true --min-tls-version TLS1_2 ` + --allow-blob-public-access false --allow-shared-key-access false ` + --public-network-access Disabled ` + --output json | ConvertFrom-Json + +az role assignment create --assignee-object-id $identity.principalId ` + --assignee-principal-type ServicePrincipal --role AcrPull --scope $registry.id +az role assignment create --assignee-object-id $identity.principalId ` + --assignee-principal-type ServicePrincipal --role 'Storage Blob Data Owner' ` + --scope $storage.id +``` + +Allow time for RBAC propagation before starting the app. `identity.id` and +`identity.clientId` must refer to the **same** identity. A registry using +RBAC+ABAC repository permissions needs its appropriate repository-reader role +instead of `AcrPull`; the new registry above deliberately uses RBAC mode. + +For this HTTP-only app, identity-based host storage needs **Storage Blob Data +Owner**. New storage-dependent triggers, bindings or Durable Functions can +require additional roles; follow the +[host-storage identity guidance](https://learn.microsoft.com/azure/azure-functions/manage-connections?pivots=functions-auth-identity&tabs=host#define-connections). +The template uses `AzureWebJobsStorage__accountName`, `__credential=managedidentity` +and `__clientId`. It does not use storage account keys. Host keys use the default +Blob backend, not ephemeral files. + +### Connect private host storage + +RBAC does not bypass a storage firewall. This sample disables public storage +network access and connects Blob storage through a private endpoint. Without +this path, the HTTP function can return 200 while the host reports unhealthy +storage and fails to acquire its host lock lease with HTTP 403. + +The supplied network template adds a **separate, undelegated subnet**, leaving +the environment's delegated infrastructure subnet unchanged. The default +`10.42.2.0/24` fits the sibling sample's `10.42.0.0/16` VNet and does not overlap +its `10.42.0.0/23` infrastructure subnet. Review and adjust it for a customized +VNet. Storage, VNet and these network resources must be in the same dedicated +resource group for these instructions. For an existing private DNS deployment, +integrate with your organization's zone rather than creating a duplicate. + +```powershell +$infrastructureSubnetId = $environment.properties.vnetConfiguration.infrastructureSubnetId +if (-not $infrastructureSubnetId) { throw 'Expected a VNet-injected environment.' } +$vnetName = ($infrastructureSubnetId -split '/')[-3] +$networkParameters = @{ + vnetName = $vnetName + storageAccountId = $storage.id + subnetPrefix = '10.42.2.0/24' +} +$networkErrors = @(Test-AzResourceGroupDeployment -ResourceGroupName $resourceGroup ` + -TemplateFile .\host-storage-network.json -TemplateParameterObject $networkParameters | + Where-Object { -not [string]::IsNullOrWhiteSpace("$_") }) +if ($networkErrors.Count) { throw ($networkErrors | Out-String) } +Get-AzResourceGroupDeploymentWhatIfResult -ResourceGroupName $resourceGroup ` + -TemplateFile .\host-storage-network.json -TemplateParameterObject $networkParameters +# Review the preview before creating the billable private endpoint and DNS zone. +$networkDeployment = New-AzResourceGroupDeployment -Name functions-host-storage-network ` + -ResourceGroupName $resourceGroup -Mode Incremental ` + -TemplateFile .\host-storage-network.json -TemplateParameterObject $networkParameters +if ($networkDeployment.ProvisioningState -ne 'Succeeded') { + throw 'Host storage private networking deployment failed.' +} +``` + +The zone group registers Blob's private IP in +`privatelink.blob.core.windows.net`; the VNet link enables resolution from the +app's environment. Keep the normal account hostname in Functions settings, not +the private IP. Custom DNS servers must resolve/forward this private zone. +This HTTP-only example needs Blob connectivity; additional triggers or Durable +Functions may need Queue/Table endpoints, DNS zones and roles as well. +Do not redeploy the sibling VNet template without preserving the added subnet. + +## 3. Build a fresh image + +Run these commands **from this folder**, not the repository root. ACR Tasks +uploads this folder's build context to your Azure registry and does not require +a local Docker daemon: + +```powershell +$run = az acr run --registry $registryName --file acr-task.yaml ` + --no-wait --output json . | ConvertFrom-Json +if ($LASTEXITCODE -ne 0 -or -not $run.runId) { throw 'ACR task could not be queued.' } +az acr task logs --registry $registryName --run-id $run.runId +if ($LASTEXITCODE -ne 0) { throw 'ACR build logs could not be retrieved.' } +$runStatus = az acr task show-run --registry $registryName --run-id $run.runId ` + --query status --output tsv +if ($LASTEXITCODE -ne 0 -or $runStatus -ne 'Succeeded') { + throw "Image build did not succeed: $runStatus" +} +$imageTag = "functions-hello:$($run.runId)" +$digest = az acr repository show --name $registryName --image $imageTag ` + --query digest --output tsv +if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($digest)) { + throw 'Build did not return an image digest.' +} +$image = "$($registry.loginServer)/functions-hello@$digest" +``` + +The [ACR task](./acr-task.yaml) runs Docker build with `--pull --no-cache`; +`az acr build` itself does not support a `--no-cache` option. Each task run uses +its unique run ID as the image tag. Review the build logs to confirm the new +Functions base image was pulled and check the printed Node.js version. +If ACR Tasks is unavailable in your subscription, use Docker locally: + +```powershell +$imageTag = "functions-hello:$([guid]::NewGuid().ToString('N'))" +docker build --pull --no-cache -t "$($registry.loginServer)/$imageTag" . +docker run --rm --entrypoint node "$($registry.loginServer)/$imageTag" --version +az acr login --name $registryName +docker push "$($registry.loginServer)/$imageTag" +``` + +Then retrieve the digest and set `$image` as above. Before deployment, smoke-test +the built image with reachable host storage; `localhost` inside a container is +the container itself, not the Azurite process on your computer. Reusing an old +application tag/digest will not satisfy the runtime-update policy. + +## 4. Validate and deploy the app + +Keep the variables from the preceding steps in the same PowerShell session. +Use Azure PowerShell for the ARM deployment: + +```powershell +$parameters = @{ + appName = $appName + environmentId = $environmentId + workloadProfileName = 'confidential' + image = $image + registryServer = $registry.loginServer + identityId = $identity.id + identityClientId = $identity.clientId + storageAccountName = $storageName +} +$errors = @(Test-AzResourceGroupDeployment -ResourceGroupName $resourceGroup ` + -TemplateFile .\main.json -TemplateParameterObject $parameters | + Where-Object { $null -ne $_ -and $_ -isnot [string] -or + ($_ -is [string] -and -not [string]::IsNullOrWhiteSpace($_)) }) +if ($errors.Count) { throw ($errors | Out-String) } +Get-AzResourceGroupDeploymentWhatIfResult -ResourceGroupName $resourceGroup ` + -TemplateFile .\main.json -TemplateParameterObject $parameters +``` + +Review the what-if result: expect one app Create (or Modify for your existing +sample app), no environment replacement or deletes. Then deploy: + +```powershell +$deployment = New-AzResourceGroupDeployment -Name "functions-$suffix" ` + -ResourceGroupName $resourceGroup -TemplateFile .\main.json ` + -TemplateParameterObject $parameters -ErrorAction Stop +if ($deployment.ProvisioningState -ne 'Succeeded') { throw 'Deployment failed.' } +$helloUrl = $deployment.Outputs.helloUrl.Value +``` + +The template defaults to UAE North and the `confidential` profile. It does not +create a profile or prove its hardware type. Do not override that parameter to +an ordinary profile if you need confidential execution. Deployment success can +precede revision readiness. + +## 5. Verify placement, HTTP response and host storage + +After the latest revision becomes ready, read both resources back from Azure. +The shared helper from the sibling sample requires a Succeeded app/environment, +the exact environment binding, a `confidential` DC4 profile with one node, +UAE North, public HTTPS-only ingress, port 80 and a ready latest revision: + +```powershell +. ..\container-apps-acc\DeploymentHelpers.ps1 +$app = Get-ArmJson -Path "$($deployment.Outputs.appId.Value)?api-version=2025-07-01" +$environment = Get-ArmJson -Path "${environmentId}?api-version=2025-07-01" +if ($app.kind -ne 'functionapp') { throw 'Expected native Functions integration.' } +$baseUrl = Assert-ConfidentialContainerApp -App $app -Environment $environment +$helloUrl = "$baseUrl/api/hello" +$response = Invoke-WebRequest -Uri $helloUrl -TimeoutSec 30 -MaximumRedirection 0 +if ($response.StatusCode -ne 200 -or + ($response.Content | ConvertFrom-Json).message -cne 'Hello, world!') { + throw 'Function did not return the expected JSON response.' +} +$helloUrl +$response.Content +``` + +### Show explicit confidential-compute evidence + +Run the shared [read-only placement verification](../README.md#validate-confidential-compute-placement) +from the repository root with `$appName = 'ca-functions-hello'` and your actual +subscription, group and environment name. It reads the **Functions app itself**; +checking only the sibling HTML app does not establish Functions placement. + +Confirm the output shows the Functions app's ID, its expected environment ID, +`AssignedProfile: confidential`, `ProfileType: DC4`, and a latest ready revision +that is active, has at least one replica, is `Running` (or `RunningAtMaxScale`) +and `Healthy`. The procedure throws on a binding/profile/state +mismatch and includes a timestamp for recording the evidence. Follow its portal +cross-check to independently inspect the same resource configuration. + +Neither `kind: functionapp`, a healthy storage lease nor HTTP 200 proves +confidential placement without the app-to-DC4 binding. Conversely, successful +DC4 verification does not establish Functions host-storage health: complete the +checks below too. These steps verify Azure-reported placement, not a +cryptographically signed hardware attestation report. + +Also inspect host logs and confirm that Blob host storage is actually in use: + +```powershell +az containerapp logs show --name $appName --resource-group $resourceGroup ` + --container hello --type console --tail 100 +if ($LASTEXITCODE -ne 0) { throw 'Could not retrieve Functions host logs.' } +$containers = Get-ArmJson -Path "$($storage.id)/blobServices/default/containers?api-version=2023-05-01" +if ('azure-webjobs-hosts' -notin $containers.value.name) { + throw 'Functions has not created its host storage container.' +} +``` + +Look for `Host lock lease acquired`, a running host, and no ongoing +`AuthorizationFailure` or `Process reporting unhealthy` entries. Check at least +two health-check intervals (one minute) after startup/network changes; an HTTP +200 or a ready replica alone does **not** validate storage health. If networking +was fixed after startup, allow DNS propagation and restart the revision if it +retains cached DNS or unhealthy state, then check the new process's logs. +Do not retrieve or print host keys to perform these checks. + +For startup failures, check revision state and Container Apps console/system logs. +Image-pull failures commonly indicate missing `AcrPull`, disabled ARM audience +tokens, an incorrect digest or RBAC propagation. Host storage failures commonly +indicate missing data-plane roles, a mismatched client ID or blocked networking. +If the base image is unavailable for a newly supported major, stop rather than +silently deploying an older Node.js version. + +### Open the app and Azure portal + +The function is an API endpoint, not a separate HTML web page. Open `$helloUrl` +in a browser to see the JSON response. A request to `/` is not the hello-world +route; use `/api/hello`. + +Generate portal links from the resources in your deployment: + +```powershell +$appId = $deployment.Outputs.appId.Value +$appPortalUrl = "https://portal.azure.com/#resource$appId/overview" +$groupPortalUrl = "https://portal.azure.com/#resource/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/overview" +$helloUrl +$appPortalUrl +$groupPortalUrl +``` + +In the app's Container Apps resource, inspect revisions/replicas and console or +system logs. In the environment, verify the `confidential` DC4 workload profile. +In the storage account, check the approved Blob private endpoint connection; +the private DNS zone must be linked to the environment's VNet. + +### Troubleshooting checklist + +| Symptom | Check and next action | +| --- | --- | +| Role-assignment creation is denied | Contributor is insufficient. Obtain approved Owner or role-assignment administration access at the appropriate scope, then allow RBAC propagation. | +| Image pull fails | Confirm the exact digest exists, the app uses the intended identity, `AcrPull` is assigned at the registry, and ARM audience authentication is enabled. | +| HTTP 200 but storage health is unhealthy/403 | Check the Blob private endpoint is approved, DNS resolves the account through the linked private zone, and the same identity has Storage Blob Data Owner. RBAC alone cannot bypass disabled public networking. Recheck new-process logs after any restart. | +| `/` returns 404 | Use `GET /api/hello`. POST to that route is intentionally not registered. | +| DC4 deployment or capacity check fails | Check current UAE North availability, quota, permissions and policy. Do not silently deploy to Consumption or an ordinary workload profile. | + +## 6. Cleanup + +No command above automatically deletes resources. Delete only the app if you +want to retain the environment and shared prerequisites: + +```powershell +az containerapp delete --name $appName --resource-group $resourceGroup --yes +``` + +This leaves billable DC4, registry, storage, private endpoint and DNS resources +in place. If you created +the **entire dedicated demo group** for these samples, confirm its contents and +name in the portal, then explicitly delete that group when finished. Do not +delete a shared group or manually edit the service-managed infrastructure group. +Verify that Azure removes both the demo group and its managed infrastructure +group before considering full cleanup complete. diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/acr-task.yaml b/azure-container-apps-sample/functions-on-azure-container-apps/acr-task.yaml new file mode 100644 index 0000000..e5d390a --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/acr-task.yaml @@ -0,0 +1,6 @@ +version: v1.1.0 +steps: + - build: >- + --pull --no-cache -t {{.Run.Registry}}/functions-hello:{{.Run.ID}} . + - push: + - "{{.Run.Registry}}/functions-hello:{{.Run.ID}}" diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/host-storage-network.json b/azure-container-apps-sample/functions-on-azure-container-apps/host-storage-network.json new file mode 100644 index 0000000..ddc63c7 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/host-storage-network.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "location": { "type": "string", "defaultValue": "uaenorth", "allowedValues": ["uaenorth"] }, + "vnetName": { "type": "string", "metadata": { "description": "Existing sibling sample VNet in this resource group." } }, + "storageAccountId": { "type": "string" }, + "endpointName": { "type": "string", "defaultValue": "pe-functions-host-blob" }, + "subnetName": { "type": "string", "defaultValue": "functions-host-storage" }, + "subnetPrefix": { "type": "string", "defaultValue": "10.42.2.0/24", "metadata": { "description": "Unused prefix within the sibling VNet, outside its delegated infrastructure subnet." } } + }, + "variables": { + "zoneName": "privatelink.blob.core.windows.net" + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks/subnets", + "apiVersion": "2024-05-01", + "name": "[concat(parameters('vnetName'), '/', parameters('subnetName'))]", + "properties": { + "addressPrefix": "[parameters('subnetPrefix')]", + "privateEndpointNetworkPolicies": "Disabled" + } + }, + { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2024-06-01", + "name": "[variables('zoneName')]", + "location": "global" + }, + { + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2024-06-01", + "name": "[concat(variables('zoneName'), '/', parameters('vnetName'))]", + "location": "global", + "dependsOn": ["[resourceId('Microsoft.Network/privateDnsZones', variables('zoneName'))]"], + "properties": { + "registrationEnabled": false, + "virtualNetwork": { "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" } + } + }, + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2024-05-01", + "name": "[parameters('endpointName')]", + "location": "[parameters('location')]", + "dependsOn": ["[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"], + "properties": { + "subnet": { "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]" }, + "privateLinkServiceConnections": [ + { + "name": "host-blob", + "properties": { + "privateLinkServiceId": "[parameters('storageAccountId')]", + "groupIds": ["blob"] + } + } + ] + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2024-05-01", + "name": "[concat(parameters('endpointName'), '/default')]", + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('endpointName'))]", + "[resourceId('Microsoft.Network/privateDnsZones', variables('zoneName'))]" + ], + "properties": { + "privateDnsZoneConfigs": [ + { + "name": "host-blob", + "properties": { "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('zoneName'))]" } + } + ] + } + } + ] +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/host.json b/azure-container-apps-sample/functions-on-azure-container-apps/host.json new file mode 100644 index 0000000..ecedb93 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/host.json @@ -0,0 +1,12 @@ +{ + "version": "2.0", + "extensions": { + "http": { + "routePrefix": "api" + } + }, + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[4.*, 5.0.0)" + } +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/local.settings.example.json b/azure-container-apps-sample/functions-on-azure-container-apps/local.settings.example.json new file mode 100644 index 0000000..1f320e8 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/local.settings.example.json @@ -0,0 +1,8 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "node", + "AzureWebJobsStorage": "UseDevelopmentStorage=true", + "AzureWebJobsSecretStorageType": "files" + } +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/main.json b/azure-container-apps-sample/functions-on-azure-container-apps/main.json new file mode 100644 index 0000000..b92eeef --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/main.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "location": { "type": "string", "defaultValue": "uaenorth", "allowedValues": ["uaenorth"] }, + "appName": { "type": "string", "defaultValue": "ca-functions-hello", "minLength": 2, "maxLength": 32 }, + "environmentId": { "type": "string", "metadata": { "description": "Existing UAE North Container Apps environment resource ID." } }, + "workloadProfileName": { "type": "string", "defaultValue": "confidential", "minLength": 1 }, + "image": { "type": "string", "metadata": { "description": "Fully qualified image in the private ACR, preferably pinned by digest." } }, + "registryServer": { "type": "string" }, + "identityId": { "type": "string", "metadata": { "description": "User-assigned identity resource ID with AcrPull and host storage permissions." } }, + "identityClientId": { "type": "string" }, + "storageAccountName": { "type": "string", "minLength": 3, "maxLength": 24 } + }, + "resources": [ + { + "type": "Microsoft.App/containerApps", + "apiVersion": "2025-07-01", + "name": "[parameters('appName')]", + "location": "[parameters('location')]", + "kind": "functionapp", + "tags": { "sample": "functions-on-azure-container-apps" }, + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { "[parameters('identityId')]": {} } + }, + "properties": { + "environmentId": "[parameters('environmentId')]", + "workloadProfileName": "[parameters('workloadProfileName')]", + "configuration": { + "activeRevisionsMode": "Single", + "registries": [ + { "server": "[parameters('registryServer')]", "identity": "[parameters('identityId')]" } + ], + "ingress": { + "external": true, + "targetPort": 80, + "transport": "auto", + "allowInsecure": false, + "traffic": [{ "latestRevision": true, "weight": 100 }] + } + }, + "template": { + "containers": [ + { + "name": "hello", + "image": "[parameters('image')]", + "resources": { "cpu": 0.5, "memory": "1Gi" }, + "env": [ + { "name": "FUNCTIONS_WORKER_RUNTIME", "value": "node" }, + { "name": "AzureWebJobsStorage__accountName", "value": "[parameters('storageAccountName')]" }, + { "name": "AzureWebJobsStorage__credential", "value": "managedidentity" }, + { "name": "AzureWebJobsStorage__clientId", "value": "[parameters('identityClientId')]" } + ] + } + ], + "scale": { "minReplicas": 1, "maxReplicas": 1 } + } + } + } + ], + "outputs": { + "appId": { "type": "string", "value": "[resourceId('Microsoft.App/containerApps', parameters('appName'))]" }, + "helloUrl": { + "type": "string", + "value": "[concat('https://', reference(resourceId('Microsoft.App/containerApps', parameters('appName')), '2025-07-01').configuration.ingress.fqdn, '/api/hello')]" + } + } +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/package-lock.json b/azure-container-apps-sample/functions-on-azure-container-apps/package-lock.json new file mode 100644 index 0000000..02bb70d --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/package-lock.json @@ -0,0 +1,5401 @@ +{ + "name": "functions-on-azure-container-apps-hello", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "functions-on-azure-container-apps-hello", + "version": "1.0.0", + "dependencies": { + "@azure/functions": "^4.0.0" + }, + "devDependencies": { + "azure-functions-core-tools": "^4.0.0", + "azurite": "^3.35.0" + }, + "engines": { + "node": ">=24 <25" + } + }, + "node_modules/@azure-rest/core-client": { + "version": "2.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure-rest/core-client/-/core-client-2.9.0.tgz", + "integrity": "sha1-4MLGSgtLNk1R/w7+0S74izbNYFo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.24.0", + "@azure/core-tracing": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha1-k+DoKwGGLn6jtbaZWHGdPz/SyKw=", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-auth/-/core-auth-1.11.0.tgz", + "integrity": "sha1-Ha7/32LRqHHSK4ZfnzFkpj6h9XU=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.11.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-client/-/core-client-1.11.2.tgz", + "integrity": "sha512-ajuIU1aMoTs/ERYrKnIqQrV5Vz3RL8mwDC5RdedIXUvR7pi6cWzeYmt0LfNz6+W91CuCO4WJG0zA6+PhU1X+hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.7.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-lro/-/core-lro-2.7.2.tgz", + "integrity": "sha1-eHEFAnog5Fx3ZRqYsBpNOwG3Wgg=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.7.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-paging/-/core-paging-1.7.0.tgz", + "integrity": "sha1-WVl6L1Q4ujxsh4n8hw9p4OeFMag=", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-process": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-process/-/core-process-1.0.0.tgz", + "integrity": "sha1-w68cFyI9ZTjhs2ln3clM2uUyy4M=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.25.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-rest-pipeline/-/core-rest-pipeline-1.25.1.tgz", + "integrity": "sha512-fTIA3CAm/cdODqiXkO6jYOIkU2Ylld7vq65KGc70gTwl12sLQsC8v7I5t6tp2N2CfUONzZBXyeFw7KEu6Ks2zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-tracing/-/core-tracing-1.4.0.tgz", + "integrity": "sha1-1lenAOJNJW0ZXmKKeV22qMxHXqs=", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.14.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/core-util/-/core-util-1.14.0.tgz", + "integrity": "sha1-fOn+V5WPEy3UIlc4VuWkXHIyuwQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/functions": { + "version": "4.17.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/functions/-/functions-4.17.0.tgz", + "integrity": "sha512-BC+eWRqwL3LYvkfKO0UqVSig4IrEbgbaUvxGC6MhpUJRsZqVlEYHyE0EZcn7MtOc2py1ArJdXkqwuOzdvlbBSA==", + "license": "MIT", + "dependencies": { + "@azure/functions-extensions-base": "0.3.0", + "cookie": "^0.7.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@azure/functions-extensions-base": { + "version": "0.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/functions-extensions-base/-/functions-extensions-base-0.3.0.tgz", + "integrity": "sha1-cGLy8GmLtkdwN4+eev+fd8Ukn04=", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/identity/-/identity-4.14.1.tgz", + "integrity": "sha512-HHuuFrmN1uuF9D5A6aAo5eHzNFNX4Q+P4SksZqDKse5YaJFFy/zDLG3wXHEV2FVGgetZ3QM8jGURNBtnQYf1NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-process": "^1.0.0", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^7.1.0", + "open": "^11.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/keyvault-common": { + "version": "2.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/keyvault-common/-/keyvault-common-2.1.1.tgz", + "integrity": "sha512-SxpomJRTBfDTQnuii3w10WnZNQJGPNi15tRPdPUQz7BqyB3yk976knEueS7R0H9kSLtXbP0wJZXRh0EbRTQ0lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.3.3", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-rest-pipeline": "^1.8.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.10.0", + "@azure/logger": "^1.1.4", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/keyvault-keys": { + "version": "4.10.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/keyvault-keys/-/keyvault-keys-4.10.2.tgz", + "integrity": "sha1-RonuPX645uaBvtDtHwVJ1uwyq2E=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.3.3", + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.9.0", + "@azure/core-lro": "^2.7.2", + "@azure/core-paging": "^1.6.2", + "@azure/core-rest-pipeline": "^1.19.0", + "@azure/core-tracing": "^1.2.0", + "@azure/core-util": "^1.11.0", + "@azure/keyvault-common": "^2.1.0", + "@azure/logger": "^1.1.4", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/logger/-/logger-1.4.0.tgz", + "integrity": "sha1-PVpif+WaJ27OdIenndkq1cUIwzk=", + "dev": true, + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry": { + "version": "1.21.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/monitor-opentelemetry/-/monitor-opentelemetry-1.21.0.tgz", + "integrity": "sha512-hoHOlKLN+R5GAq+e1QPXD/3jjQ9AvaJrHOEX4gPMBjFpguDfcL/uM7Bz/RPe4SosR/K00chXqO60JfTHmwIapw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.5.2", + "@azure/core-auth": "^1.10.1", + "@azure/core-rest-pipeline": "^1.22.2", + "@azure/core-tracing": "^1.2.0", + "@azure/identity": "^4.13.1", + "@azure/logger": "^1.3.0", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.47", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.1.0-beta.1", + "@microsoft/applicationinsights-web-snippet": "^1.2.3", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/core": "^2.10.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/instrumentation-bunyan": "^0.66.0", + "@opentelemetry/instrumentation-console": "^0.3.0", + "@opentelemetry/instrumentation-http": "^0.221.0", + "@opentelemetry/instrumentation-mongodb": "^0.74.0", + "@opentelemetry/instrumentation-mysql": "^0.67.0", + "@opentelemetry/instrumentation-pg": "^0.73.0", + "@opentelemetry/instrumentation-redis": "^0.69.0", + "@opentelemetry/instrumentation-winston": "^0.65.0", + "@opentelemetry/resource-detector-azure": "^0.29.0", + "@opentelemetry/resources": "^2.10.0", + "@opentelemetry/sdk-logs": "^0.221.0", + "@opentelemetry/sdk-metrics": "^2.10.0", + "@opentelemetry/sdk-node": "^0.221.0", + "@opentelemetry/sdk-trace-base": "^2.10.0", + "@opentelemetry/sdk-trace-node": "^2.10.0", + "@opentelemetry/semantic-conventions": "^1.43.0", + "@opentelemetry/winston-transport": "^0.31.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter": { + "version": "1.0.0-beta.47", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/monitor-opentelemetry-exporter/-/monitor-opentelemetry-exporter-1.0.0-beta.47.tgz", + "integrity": "sha512-GglsCyWZaU1RGfTJBGWEzv8ETtAGOMPOd+4xivvetjFpY3fJtd6GDGKW9W8LFQNTo8nGs2AtbEwjk9W6Ywk4+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.5.2", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-process": "^1.0.0", + "@azure/core-rest-pipeline": "^1.19.0", + "@azure/core-util": "^1.11.0", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/core": "^2.10.0", + "@opentelemetry/resources": "^2.10.0", + "@opentelemetry/sdk-logs": "^0.221.0", + "@opentelemetry/sdk-metrics": "^2.10.0", + "@opentelemetry/sdk-trace-base": "^2.10.0", + "@opentelemetry/semantic-conventions": "^1.43.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.1.0-beta.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.1.0-beta.1.tgz", + "integrity": "sha1-yYnrme/U2tHVDI4Sin8ppUEs7Rs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-tracing": "^1.2.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/sdk-trace-web": "^2.0.0", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api-logs": { + "version": "0.211.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/api-logs/-/api-logs-0.211.0.tgz", + "integrity": "sha1-MtntmJOZVqhNTi/14BWYy50o10Q=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.211.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation/-/instrumentation-0.211.0.tgz", + "integrity": "sha1-1F4g6vp1tdPoqXRaYgUzKJPFXzc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.211.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/import-in-the-middle": { + "version": "2.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha1-GXIze/4CDQX2teAgwTM0VnQ2Mk8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@azure/ms-rest-js": { + "version": "2.7.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", + "integrity": "sha1-hjkGVXf/30lGlR4dJGM06/1y1Tc=", + "deprecated": "This package has been deprecated in favor of the new Azure SDK packages from [Azure SDK for JavaScript](https://github.com/azure/azure-sdk-for-js).", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.1.4", + "abort-controller": "^3.0.0", + "form-data": "^2.5.0", + "node-fetch": "^2.6.7", + "tslib": "^1.10.0", + "tunnel": "0.0.6", + "uuid": "^8.3.2", + "xml2js": "^0.5.0" + } + }, + "node_modules/@azure/ms-rest-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true, + "license": "0BSD" + }, + "node_modules/@azure/ms-rest-js/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.29.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/msal-browser/-/msal-browser-5.29.0.tgz", + "integrity": "sha512-Ko/Ovw6h+Gu33mp8f0FUyddr/KDWzbGzcgR8HKZaT4wgTYljLPKJP1rcDu0RHj7pkd4CR2hCHK51XFzgvq/Q5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.16.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "16.16.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/msal-common/-/msal-common-16.16.1.tgz", + "integrity": "sha512-dSKdL9h/iercb4GumsKFh+wVvLe1ohuDPiviklgnQVHnY2FYNUlbQJ3E1Qd37vkof9CfraK9BQpCW1hoOg0znQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "7.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/msal-node/-/msal-node-7.2.1.tgz", + "integrity": "sha512-6mntsfCNq7H1eAPSZik74jT3C5at4nRqiVk7OC+D5Hy3Pe3s76uwE4+J0xvDvlVPmoX2kasf3mSwUmzeq9rW/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.16.1", + "jsonwebtoken": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0.tgz", + "integrity": "sha1-jq6h9ZGcvym6g/L6yZ2JRDbhfco=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-tracing": "^1.2.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/sdk-trace-web": "^2.0.0", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api-logs": { + "version": "0.211.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/api-logs/-/api-logs-0.211.0.tgz", + "integrity": "sha1-MtntmJOZVqhNTi/14BWYy50o10Q=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.211.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation/-/instrumentation-0.211.0.tgz", + "integrity": "sha1-1F4g6vp1tdPoqXRaYgUzKJPFXzc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.211.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/import-in-the-middle": { + "version": "2.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha1-GXIze/4CDQX2teAgwTM0VnQ2Mk8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@colors/colors/-/colors-1.6.1.tgz", + "integrity": "sha1-jignJZradpZbOgUcGKWSf72sOMI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@dabh/diagnostics/-/diagnostics-2.0.9.tgz", + "integrity": "sha1-DenocY4jq2DR+xzgwAQHnxT1rTY=", + "dev": true, + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@grpc/grpc-js/-/grpc-js-1.14.7.tgz", + "integrity": "sha512-W4W/fcBMGRVtG6dW2c7cw2mnpS3hvbBd+oQXjh2iYFTZDk1JJmcNqkM5KSaPubQpamlUUurrlb7G1s9NJeERmQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha1-WmspDMv7GuL2d1r7dOmJi9jF1Og=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@js-joda/core": { + "version": "6.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@js-joda/core/-/core-6.3.2.tgz", + "integrity": "sha512-BVsYu84Gut8YTNR1v5/PnifmqXv4SVcfA/hVIM/mXADZfIocip/DfNppBtv+4am5hGH1XuH6FSoU8OHkBvZMeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha1-kpn4KHS6ueTH+cSNhlvsv+jWkHw=", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@microsoft/applicationinsights-web-snippet": { + "version": "1.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.2.3.tgz", + "integrity": "sha1-ecTbbHe5aVuEeziI2sE4w7+Q1v0=", + "dev": true, + "license": "MIT" + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha1-wbA0beM2ulWvLVp5cIggN7rt7AU=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/api-logs/-/api-logs-0.221.0.tgz", + "integrity": "sha1-ZrhAWxIv8cdu50O5vSynOACi4t8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/configuration": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/configuration/-/configuration-0.221.0.tgz", + "integrity": "sha1-OdAGvk4nTGOKxIQyv9EQOAXPtYc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "yaml": "^2.8.3" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/context-async-hooks/-/context-async-hooks-2.10.0.tgz", + "integrity": "sha1-clms/Vk2rnE74/bTYkmt166Kylo=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.12.0.tgz", + "integrity": "sha512-1HsSAuvT4/my0QrXWsyXFdWjKaPeCHsismKZgEEIb8NK13LP6DrMRlsUbvD/0F9mDWK3xDom9AMv3IscxgOnOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.221.0.tgz", + "integrity": "sha1-PDXCEyMoCRi4ygYLGnuvZLrCEko=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.221.0.tgz", + "integrity": "sha1-v8S9hJLinvxo/qbHwMtsPRivgwE=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.221.0.tgz", + "integrity": "sha1-ilIrLKWPTEa+AOam9V0RCKm5Phk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-logs": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.221.0.tgz", + "integrity": "sha1-XhlO0P+3any+CyxZJWnLEZ7enqA=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.221.0.tgz", + "integrity": "sha1-cDUx6y4946UwfWuAv5HwuLy6Y1U=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-metrics": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz", + "integrity": "sha1-Go841FFkuj77s1Bb62jK9KPs8tk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.221.0.tgz", + "integrity": "sha1-yvFaQjaKu+SW25Jcq8Bw6rJ5BIc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.221.0.tgz", + "integrity": "sha1-xGCkPC1KO4/t45CIVbQcWB3k5yA=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz", + "integrity": "sha1-Go841FFkuj77s1Bb62jK9KPs8tk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.221.0.tgz", + "integrity": "sha1-2S8EQxdCC4QYA9pmvbM/KNVrVOA=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.221.0.tgz", + "integrity": "sha1-tSimB24D3L4BiiscfleFM79N9/8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.221.0.tgz", + "integrity": "sha1-euqNeLlXxEyqJQIYfz+Tdxii6g8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.10.0.tgz", + "integrity": "sha1-Xt8SwSoaGSVQg/lQg7HguPjZubc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation/-/instrumentation-0.221.0.tgz", + "integrity": "sha1-PUQSIfIY0g0D4YLCe+9cmcuea7U=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.66.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.66.0.tgz", + "integrity": "sha1-jCXWIjs1Yi6XvvkNWZUJnMszCHk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-console": { + "version": "0.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-console/-/instrumentation-console-0.3.0.tgz", + "integrity": "sha1-7PCCKinwhZKBB34vtgl6GMe+WcM=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.1" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-http/-/instrumentation-http-0.221.0.tgz", + "integrity": "sha1-xZVIlBQ6QzU8vGWNxqtee2pASto=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/instrumentation": "0.221.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.74.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.74.0.tgz", + "integrity": "sha1-8GnT+D4edDPAx2YorWSvLwVEexQ=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.67.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.67.0.tgz", + "integrity": "sha1-BwiY0BShmjdKA70SQ71DxF+JOpk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.73.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.73.0.tgz", + "integrity": "sha1-PnsYD3I9/cISPJzWuV58qvXakSc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.9.0", + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.42.0", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.69.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.69.0.tgz", + "integrity": "sha1-q2IlAYUq/dNjQCGhI6DGesBZa2w=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.221.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.65.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.65.0.tgz", + "integrity": "sha1-ar5mCg9BmxcWBRCaquoKBddW1NU=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/instrumentation": "^0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.221.0.tgz", + "integrity": "sha1-BqsA2SdikoM4SOmsxc0iXyOGhGc=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.221.0.tgz", + "integrity": "sha1-bOk7MecBfku+tEU2ltYHNVvVNSg=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-transformer": "0.221.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/otlp-transformer/-/otlp-transformer-0.221.0.tgz", + "integrity": "sha1-6/xaZZWh43zk8gTJcRXI7YaNv7s=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz", + "integrity": "sha1-Go841FFkuj77s1Bb62jK9KPs8tk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/propagator-b3/-/propagator-b3-2.10.0.tgz", + "integrity": "sha1-ZR5nCbZIfNOJ+ZBT1nV03LOkpV4=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.10.0.tgz", + "integrity": "sha1-1ZF1vbopI2BgIS8j+PvKAhzR/gw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz", + "integrity": "sha1-MaBGSkipkcKUCGFONyXZTbfBGu4=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.29.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.29.0.tgz", + "integrity": "sha1-F7vNa3pV0ifZZZ96H1Gjk761DQo=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.12.0.tgz", + "integrity": "sha512-+rSRoOdln6NhXTVcBdHSlZxJDNzwxadeweK2ltZO3tVtfp6aklABc06xclDk6ovRR+EiGgIcSbh/6NgjFhnb3A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.12.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-logs/-/sdk-logs-0.221.0.tgz", + "integrity": "sha1-nsDiy/tXKRe5SBAZg+CIaKaQkV4=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-metrics/-/sdk-metrics-2.12.0.tgz", + "integrity": "sha512-mVMaEHwCUJuY3S4Esn+nT0yQA3qCEGh+SOPJsXygU0Gl453WcsDNjtEa8EfdewMwoLyr1tlofB4fXytVpiXuow==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.12.0", + "@opentelemetry/resources": "2.12.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.221.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-node/-/sdk-node-0.221.0.tgz", + "integrity": "sha1-E+Pw4Kxq8YhOeXjesvAHssiO8e0=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.221.0", + "@opentelemetry/configuration": "0.221.0", + "@opentelemetry/context-async-hooks": "2.10.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-logs-otlp-http": "0.221.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.221.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.221.0", + "@opentelemetry/exporter-prometheus": "0.221.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.221.0", + "@opentelemetry/exporter-trace-otlp-http": "0.221.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.221.0", + "@opentelemetry/exporter-zipkin": "2.10.0", + "@opentelemetry/instrumentation": "0.221.0", + "@opentelemetry/otlp-exporter-base": "0.221.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.221.0", + "@opentelemetry/propagator-b3": "2.10.0", + "@opentelemetry/propagator-jaeger": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-logs": "0.221.0", + "@opentelemetry/sdk-metrics": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0", + "@opentelemetry/sdk-trace-node": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz", + "integrity": "sha1-Go841FFkuj77s1Bb62jK9KPs8tk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz", + "integrity": "sha1-P5v4oUwduoeQYZ4oMm98V/i5528=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.10.0.tgz", + "integrity": "sha1-ay7F8Vy5nJqsdHZDCAHR3JM+zxk=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.10.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz", + "integrity": "sha1-drAzEJJFKwGosvcESA4ldmQccBE=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.12.0.tgz", + "integrity": "sha512-JOERgZCxRM06FEJ5kEWxlSRChah6MmXDx3KwCruqEv/iEyLkTokCSemf2y1w8oIHtfrr8EVTpzebq/31vn2Cpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.12.0", + "@opentelemetry/resources": "2.12.0", + "@opentelemetry/sdk-trace": "2.12.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/sdk-trace": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace/-/sdk-trace-2.12.0.tgz", + "integrity": "sha512-ImVuRQ6faOsTi1Wna88s2avgrrf/iDgXPigIeynkUhjstMuoQUDOJXgkez2j1mlU4btjXcXBGa+q7qKFYR3GsA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.12.0", + "@opentelemetry/resources": "2.12.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.12.0.tgz", + "integrity": "sha512-9DufH1IlmQMoKAfot5y/FhTP1RnmhLb5K6eKmJO/bvzPjYwPAazoiAUbTZFdPbqxOXN0FEbhZx/e6SB1Og4jmg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.12.0", + "@opentelemetry/core": "2.12.0", + "@opentelemetry/sdk-trace-base": "2.12.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/context-async-hooks": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/context-async-hooks/-/context-async-hooks-2.12.0.tgz", + "integrity": "sha512-iK/1nD7mmZVkuYjVjkdFBiCvzntJdFny1S3CYbUYyOq7V5enL6XX+gJ7eh965L1LnS11VA8mQ7Ej/ck04SB0MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-web": { + "version": "2.12.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sdk-trace-web/-/sdk-trace-web-2.12.0.tgz", + "integrity": "sha512-y0hCzbnBHScmioF0drJOyaPk1sQf2wwbIuy3rWlM0Fcx8mLfPDvFsQ7tJ+zMm8yAqI06rSlFKkL7ZpcrFOqAdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.12.0", + "@opentelemetry/sdk-trace-base": "2.12.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha1-qnf3E450ulOZ1fO7DereDBaPALI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace/node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha1-znbBwbqvzkx3vCmJCWW6H1ZnGsw=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.44.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/semantic-conventions/-/semantic-conventions-1.44.0.tgz", + "integrity": "sha512-E3JkOlMBi3N8OGGkbl7tFyqk2MAS6/lySRZBK3Mu7AzjF1fT8oIChH9ChE48SUWzDn9Kdwta+G/p5LJ4xW4CLQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.42.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/sql-common/-/sql-common-0.42.0.tgz", + "integrity": "sha1-wLOij9YyY3QciyfkroT8Y5Wi8h0=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@opentelemetry/winston-transport": { + "version": "0.31.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@opentelemetry/winston-transport/-/winston-transport-0.31.0.tgz", + "integrity": "sha1-gHv9/QNkC+8mOvnY4RWNs9teeTI=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/semantic-conventions": "^1.41.1", + "winston-transport": "4.*" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha1-2TFa188/MKrHC9o8BoRD3G8UNlk=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha1-1RLLJsCuAmCR7iwRZ/G+b69chCo=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha1-TW/ADI+2QBalyBtGnVSQRjUPEGU=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha1-eNR2Mz2F1bHHkuJXvKdLoIDaSaQ=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha1-YlFdi58ndGt2lQqDveGvgS2Rkjs=", + "dev": true, + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha1-C551eKWqI5D68SpGCCcVSQIpljg=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha1-ItHMnVQtNZPK6nZPl0MGqzYobuc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha1-BSqmekjszEMJ1/AZG35BQ0uQu3g=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha1-+xOw6GFNOdQvQPOBIX7DIVkV8ek=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "26.6.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/node/-/node-26.6.6.tgz", + "integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha1-TfdZC5rFV8vlR54AdOwVQMvdrZs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha1-wXlFp0Ry2aO+r45m1apvyTgyhzQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.25", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/readable-stream/-/readable-stream-4.0.25.tgz", + "integrity": "sha512-7GsxL8Wd5X3jh73/qgW7WCnbBvGSdD8U3E4Jiuus3/8I+PN20DtlkJtwFhr/sImXfDDQ2Z03i/9wNiIF3TVSsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha1-dP75/7qhmOuLWIvgKfOLACmcqiw=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha1-dCt37DTVhVS5SnahTO8w1Z48Frk=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha1-6bKAi08QlQSgPNqVglmHb2EBeZk=", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.10.tgz", + "integrity": "sha512-vddvvtZ7sejSlCv+OIkn2ztjB1O31Fc2JsxI/YK725r3elXXlF/J3o3lbXJFRhoeWRWK1tjdZ+GTi6Fdtrp+EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^9.1.0", + "https-proxy-agent": "^9.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha1-u89LpQdUZ/PyEx6rPP/HPC9deJU=", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha1-frFVexugXvGLXtDsZ1kb+rBGiO8=", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "9.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha1-7J77CDFOHnWwhS10qr+aOH+Zg04=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true, + "license": "MIT" + }, + "node_modules/applicationinsights": { + "version": "3.17.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/applicationinsights/-/applicationinsights-3.17.0.tgz", + "integrity": "sha512-+53E/0oXjl1x/o4fCLCxdEoUqqqRSg1EPH1+U07/6MHkALsmKtUTyKPrqhIgCGE/fIowQGNIFBkoSDYibfYW9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.9.0", + "@azure/functions": "^4.11.2", + "@azure/identity": "^4.13.1", + "@azure/monitor-opentelemetry": "^1.20.1", + "@azure/monitor-opentelemetry-exporter": ">=1.0.0-beta.46 <1.0.0-c || ^1.0.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0", + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/api-logs": "^0.221.0", + "@opentelemetry/core": "^2.10.0", + "@opentelemetry/exporter-logs-otlp-http": "^0.221.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.221.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.221.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.221.0", + "@opentelemetry/otlp-exporter-base": "^0.221.0", + "@opentelemetry/resources": "^2.10.0", + "@opentelemetry/sdk-logs": "^0.221.0", + "@opentelemetry/sdk-metrics": "^2.10.0", + "@opentelemetry/sdk-trace-base": "^2.10.0", + "@opentelemetry/sdk-trace-node": "^2.10.0", + "@opentelemetry/semantic-conventions": "^1.43.0" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/args": { + "version": "5.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/args/-/args-5.0.3.tgz", + "integrity": "sha1-lDJW24UCGoVoS+LwiC8l15YnhwI=", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/args/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/args/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/args/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/args/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/async/-/async-3.2.6.tgz", + "integrity": "sha1-Gwco4Ukp1RuFtEm38G4nwRReOM4=", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha1-FX3Xfp8ZsdEjZ46T8SDm8ZMCJkE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.21.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/axios/-/axios-1.21.0.tgz", + "integrity": "sha512-YCzXMB53Q9PZBsh7yN7wtapit4WepwcHS2fP8QhGsBxSz5YtgYobV7GGlWlAJi+RxfU77GQTQi2DSLUma42EYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha1-KOhk4beG2+u2jbH0UvljUnhmWCc=", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY=", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axios/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/axios/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/azure-functions-core-tools": { + "version": "4.16.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/azure-functions-core-tools/-/azure-functions-core-tools-4.16.0.tgz", + "integrity": "sha512-JxSpCJ7TgjiTdyP3PrrhnI1WkoZKHYgToltyUJKqYWe4yLTuIyqi8Hl9xvg8AAyem6Vg4RSx6+RJr1QKk9SS6g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "chalk": "^6.0.0", + "extract-zip": "^2.0.1", + "https-proxy-agent": "9.1.0", + "progress": "2.0.3", + "rimraf": "^6.1.3" + }, + "bin": { + "azfun": "lib/main.js", + "azurefunctions": "lib/main.js", + "func": "lib/main.js" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/azurite": { + "version": "3.37.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/azurite/-/azurite-3.37.0.tgz", + "integrity": "sha1-kM2QzoY2YURBy5pagulLE9hnLDc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/ms-rest-js": "^2.7.0", + "applicationinsights": "^3.16.0", + "args": "^5.0.1", + "axios": "^1.18.1", + "etag": "^1.8.1", + "express": "^5.2.1", + "fs-extra": "^11.1.1", + "glob-to-regexp": "^0.4.1", + "jsonwebtoken": "^9.0.0", + "lokijs": "^1.5.6", + "morgan": "^1.11.0", + "multistream": "^4.1.0", + "mysql2": "^3.10.1", + "sequelize": "^6.31.0", + "stoppable": "^1.1.0", + "tedious": "^20.0.0", + "tslib": "^2.3.0", + "uri-templates": "^0.2.0", + "winston": "^3.1.0", + "xml2js": "^0.6.0" + }, + "bin": { + "azurite": "dist/src/azurite.js", + "azurite-blob": "dist/src/blob/main.js", + "azurite-queue": "dist/src/queue/main.js", + "azurite-table": "dist/src/table/main.js" + }, + "engines": { + "node": ">=22.0.0", + "vscode": "^1.39.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha1-v7EGYv7tgZaixi58aOF3IMJ0F5o=", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true, + "license": "MIT" + }, + "node_modules/bl": { + "version": "6.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/bl/-/bl-6.1.6.tgz", + "integrity": "sha1-tA866mljxnQmFqlX77dCxPuH7Ls=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.8.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/readable-stream/-/readable-stream-4.8.0.tgz", + "integrity": "sha512-2jhTTU3Eilp/2DMT71gbcoqC35eQHasMJH0RHkYxwlxIv3+FR6Y5xAFZIwEGLxKkjZYEFlsiMNIdwUqjK2lLHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/body-parser": { + "version": "2.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/body-parser/-/body-parser-2.4.0.tgz", + "integrity": "sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.1.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.3", + "on-finished": "^2.4.1", + "qs": "^6.16.1", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/bundle-name": { + "version": "4.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha1-iwvuuYYFrfGxKPpDhkA8AJ4CIaU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha1-S1QowiK+mF15w9gmV0edvgtZstY=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha1-I43pNdKippKSjFOMfM+pEGf9Bio=", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha1-AylVJ9WL081Kp1Nj81sujZe+L0I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "6.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-6.0.1.tgz", + "integrity": "sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cjs-module-lexer/-/cjs-module-lexer-2.3.0.tgz", + "integrity": "sha512-lmNyBzi6iYiqyrExTctfmjd8tInx+dHu9PBomTfH5RXS53c27JMFJgzNv5TyAnm3PgGf+MLy0+Ws41/HlVxdKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color/-/color-5.0.3.tgz", + "integrity": "sha1-95OQsbd44iL/u1QwTT2+rvYz+X8=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha1-22YnuXGBy4+s3851WuJvl6sHEfE=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-2.1.1.tgz", + "integrity": "sha1-hsAOyY2zZwW+W9RCgJfxOvEXWm0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha1-nc9Wb/l24jNoyL1nP1w1EDq0EFg=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha1-iKdcelLvnEB8lgNf6Dpmk5wqTck=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha1-2TicQ8Coz2o1XbRk0h4HCSpASTo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha1-VWNpxHKiupEPKXmJG1JrNDYjftc=", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha1-V8f8PMKTrKuf7FTXPhVpDr5KF5M=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/debug/-/debug-4.4.3.tgz", + "integrity": "sha1-xq5DLZvZZiWC/OCHCbA4xY6ePWo=", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha1-F5Cv/FJoD7sR4XyrJ1LWmqKjfSw=", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha1-96fMuPUQS/jg9xujscz6Xq/bIeg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha1-27Ga37dG1/xtc0oGty9KANAhJV8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/depd/-/depd-2.0.0.tgz", + "integrity": "sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dottie": { + "version": "2.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dottie/-/dottie-2.0.7.tgz", + "integrity": "sha1-/RtGWhIRs11WYOlbabttW1gJs8Q=", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha1-165mfh3INIL4tw/Q9u78UNow9Yo=", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true, + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha1-+d2S7C1vS7wNXR5k4h1hzUZl58I=", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/encodeurl/-/encodeurl-2.0.1.tgz", + "integrity": "sha512-Ev/hIyePLZtpL98x562lvPtenrUfGr0lfaf44HFZ+hDEwso7ccV9QAZrEVLg0hxNAzygaAFxy2dYaAKKM0G06A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha1-c0TXEd6kDgt0q8LtSXeHQ8ztsIw=", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha1-mD6y+aZyTpMD9hrd8BHHLgngsPo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-module-lexer/-/es-module-lexer-3.0.4.tgz", + "integrity": "sha512-BldNY5mwkVu+cQ5Ymn3e6hB9Sx8XHx4ZevWbiUyZbfKxJxYO27Hf0wfzkxIaD5CAJMaGl3YspKELj0ff/7nCMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha1-otCzcyBXJN+lJdI7DD4bHKWCyZs=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha1-8x274MGDsAptJutjJcgQwP0YvU0=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/events/-/events-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/express": { + "version": "5.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.1.0", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha1-Zj3KVv5G34kNXxMe9KBtIruLoTo=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha1-TZzNvGHoYpsln9ymfmWJFEjVaf0=", + "dev": true, + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha1-osUXplWYUrzbBtH4vX9Rto+tgJk=", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha1-JsrYAXlnrqhzG8QpYdBKPVmIrMw=", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/follow-redirects/-/follow-redirects-1.16.2.tgz", + "integrity": "sha512-/kVP2U8z596Ia0gwFrwyIeo74ta5aVmSeU1FfAUMAmcEP5EP7zydmag3SLiN64NaRKef3lxsq7i/g7ltJQDGow==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "2.5.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/form-data/-/form-data-2.5.6.tgz", + "integrity": "sha1-7zmz2Z4vyfJUIMDbeWL+Nsr80kQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha1-CFEe3aqi3f1WuhETju598RegkyU=", + "dev": true, + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha1-jdffahs6Gzpc8YbAWl3SZ2ImNaQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fs-extra/-/fs-extra-11.4.1.tgz", + "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha1-dD8OO2lkqTpUke0b/6rgVNf5jQE=", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha1-FQs/J0OGnvPoUewMSdFbHRTQDuE=", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha1-SWaheV7lrOZecGxLe+txJX1uItM=", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-13.0.6.tgz", + "integrity": "sha1-B4ZmVmpCUUfMrPvS4zLetmor5x0=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha1-x1KXCHyFG5pXi9IX3VmpL1n+VG4=", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha1-ifVrghe9vIgCvSmd9tfxCB1+UaE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM=", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha1-/JxqeDoISVHQuXH+EBjegTcHozg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha1-LNxC1AvvLltO6rfAGnPFTOerWrw=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha1-jGLYy5C+sqrV0KW2dYGtmFTD8AM=", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha1-NtL2W8kJyHkAGN02+02T2myq4Gs=", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "9.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", + "integrity": "sha1-/Ys53LWKyARhOeX06oDeeOi+r3s=", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/https-proxy-agent": { + "version": "9.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", + "integrity": "sha1-qfYPebwVeMN7Fm3X9Ytry1xX5Es=", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha1-hO4S+WPn3lC8AaE+FgoHizsPQV8=", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-in-the-middle": { + "version": "3.5.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-in-the-middle/-/import-in-the-middle-3.5.3.tgz", + "integrity": "sha512-usm/IiY63VtOyx/dm7uEoZV+EsanCDmwRUroQZIkFLGu1NVXZ8mZqIOhaN4QIJ7EsbMTuQbJXwCySCx+ozMA8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "cjs-module-lexer": "^2.2.0", + "es-module-lexer": "^3.0.3", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha1-ZappbE4tpiJbFI16FUxEk2ZjOjI=", + "dev": true, + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha1-kAk6oxBid9inelkQ265xdH4VogA=", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha1-jrc8HKu6d3SNOJWI7uoTKmMFdiI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha1-6B+6aZZi6zHb2vJnZqYdSBRxfqQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha1-Qv+fhCBsGZHSbev1IN1cAQQt0vM=", + "dev": true, + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha1-+sHj1TuXrVqdCunO8jifWBClwHc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha1-MniXsmgyo+sRfabCdJLQTKEyWU8=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-md4": { + "version": "0.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-md4/-/js-md4-0.3.2.tgz", + "integrity": "sha1-zTs9wEWwxARVbIHdtXVsI+WdfPU=", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha1-tuMXF/Isw3MwsIHOAFHtXeU68vY=", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha1-bNV6sB6bCsB8uEfVPTybbuMfeuI=", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha1-v4F20a0M1y4PP1gzhZWhPhELyAQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jws/-/jws-4.0.1.tgz", + "integrity": "sha1-B+3Bvo+sIOZ3soPs4mFJi9OPBpA=", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha1-4sVwo4ADiPtEQH6FFTHB1nCwYbM=", + "dev": true, + "license": "MIT" + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true, + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/logform/-/logform-2.7.0.tgz", + "integrity": "sha1-z8qXUo7ykPLhJaCDloBQArLQYNE=", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha1-7GzSN0QHALwjyiMIf1E8dVCJWLA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/lokijs": { + "version": "1.5.12", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lokijs/-/lokijs-1.5.12.tgz", + "integrity": "sha1-y1WzcAm98J7nlSpq3d1VW4k2U6A=", + "dev": true, + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/long/-/long-5.3.2.tgz", + "integrity": "sha1-HYRGMJWZkmLX17f4v9SozFUWf4M=", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lru.min": { + "version": "1.1.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru.min/-/lru.min-1.1.5.tgz", + "integrity": "sha1-vTJIP040ImHQ6wEbBtIhnmte+Bg=", + "dev": true, + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha1-oN10voHiqlwvJ+Zc4oNgXuTit/k=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha1-bwNUAN/jq51WB7x3VGzjDML5xrg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha1-6pIvZgY1oiSe5WXgRJ+VHmtgOAg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha1-zds+5PnGRTDf9kAjZmHULLajFPU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha1-OQAtQYJXXVrwNv+hGBAPJSSy4qs=", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha1-/ZVrvgt3JB6fFaxdzLHGOAYJaO8=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha1-eTibTrG7LQA6m7qH1JLyvTe9xls=", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha1-tmL9zZP2yD0/JSidoM6ByNloW5Q=", + "dev": true, + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.31.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/moment/-/moment-2.31.0.tgz", + "integrity": "sha512-0acOTfMiWOheYS4eoWb80yYMb/JLvVv9SHbs2PehaDzfUG0Bw855SKyk0IKTnPGa5+U2bmi3W68l1+sGLX/pvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha1-ERcnuydHNKUYrhVLXKWJKD8FiWc=", + "dev": true, + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.12.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/morgan/-/morgan-1.12.1.tgz", + "integrity": "sha512-tljKC0ex20AjO58Ob/eZ53JloycbVswbVNCHx6V6VLGzqt/w8dIynVGL0G8qVjNKwiA7sYSogCrN6QtJ82IV+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.4.1", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "license": "MIT" + }, + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mri/-/mri-1.1.4.tgz", + "integrity": "sha1-fLHdG5tAkF8frAU6viW2cg9EdEo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "dev": true, + "license": "MIT" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha1-e/AN/RGVVvvBU8/z3kxtR3kJ9ag=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/mysql2": { + "version": "3.24.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mysql2/-/mysql2-3.24.6.tgz", + "integrity": "sha512-enu73KhbAua2L3dIxjc6qg6ZJ7H3pt1BImZASWNWY5xSsmJ1ZuUPULTDGXgmJbI61vb+nJAG19IZclIq19UidQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.3", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.5.1" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha1-xQxpILQ/JY9ZwWrdHlZlT1zAK7U=", + "dev": true, + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/native-duplexpair": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/native-duplexpair/-/native-duplexpair-1.0.0.tgz", + "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha1-FuAD0NtKwk/Z3xaO34cWJd7q498=", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha1-g3UmXiG8IND6WCwi4bE0hdbgAhM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/on-finished/-/on-finished-2.4.2.tgz", + "integrity": "sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha1-WdpPkcRfX5icbkvO3Fo7Cu1w/2U=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha1-4GvBdK7SFO1Y7e3lc7Qzu/gny0U=", + "dev": true, + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/open": { + "version": "11.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.5.1", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU=", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha1-a+DQ7gKhDZ4N56mLrmXhgskGH4U=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha1-eVxCDE98pFxbiHNm9iLuDJhSzM0=", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha1-lDvUY79bcbQXARX4D478mgwOt4w=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha1-LQJQ1jZFT3z6O2rgOC/fqAYyVKM=", + "dev": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha1-SPj84FT7xpZxmZMpuINLdyZS2C4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha1-xAs9oCIsUA/x5RxdcBS2C3lpfHo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha1-UbwIYAYAXlBhxZHO5yfyUxv2Qag=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha1-tGDILLFYdQd4iBmgaqD//bNURpU=", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha1-CFMBb1s8EtUrlXHI/oBZZ32d2+I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/progress/-/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.6.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/protobufjs/-/protobufjs-7.6.6.tgz", + "integrity": "sha1-ejkj6OMrDuL/aJ+O7W5FXAkKxn4=", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha1-3n03rt6dcedDRhJdb0hPrICSthU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "kerberos": "^2.0.0" + }, + "peerDependenciesMeta": { + "kerberos": { + "optional": true + } + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha1-p0h1aK2tV3z6qn6IxJyrOrMIGro=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pump/-/pump-3.0.4.tgz", + "integrity": "sha1-HzE0MFJ/qLkFYi69Iv4UROdXqzw=", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.17.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/qs/-/qs-6.17.1.tgz", + "integrity": "sha512-jd3COkaKVgGUW+ZHyEHCG9bH7RoaaiWuMgzsIBjUMVjLAaWGWpoUAVwljVvBHxRu/2qEHnadLGZrkutYUBPQJA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha1-1/Gb6BK7YnIUcrRdO+IZ7wlXK0c=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha1-PjraWuVWj5CV2EN2/TpJuPsAClE=", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha1-294lh/ZpOYYm1WsgyGirh78BzOQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, + "node_modules/retry-as-promised": { + "version": "7.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/retry-as-promised/-/retry-as-promised-7.1.1.tgz", + "integrity": "sha1-NiYkbwTBlB/xDOvPo98Fd/2Kstc=", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha1-r77iNrO9K+Mx1OfORJO6wXGJga8=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/router/-/router-2.2.0.tgz", + "integrity": "sha1-AZvmILcRyHZBFnzHm5kJDwCxRu8=", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha1-Lp5UxGZOwxBsW1Yw4knT1llcSRE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha1-TKL444XygxxDKnGbEIo7969Cod0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/sax/-/sax-1.6.1.tgz", + "integrity": "sha1-TCPPYIwLaTq1S0tYiOks/pd7mEM=", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/send/-/send-1.2.1.tgz", + "integrity": "sha1-nqt0O4dPNVD0CiaGe/KGrWDT8+0=", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/sequelize": { + "version": "6.37.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/sequelize/-/sequelize-6.37.8.tgz", + "integrity": "sha1-cOYsnmgqIAkAUJMQRZHlnsLQ7Sw=", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha1-IQs5GvQAJ2L4IxiP1uz8dBMCB2g=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha1-fxhqSk5fW2Y616QpT/G/N88OmKk=", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha1-ZsmiSnP5/CjL5msJ/tPTPcrxtCQ=", + "dev": true, + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha1-6gLGLgXcS+pn1EQvD7ce4ZL44Ks=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha1-wuC1oUpUCuvuO7xsP4ZmzJtQkSc=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha1-1rtrN5Asb+9RdOX1M/q0xzKib0I=", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha1-Ed2hnVNo5Azp7CvcH7DsvAeQ7Oo=", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sql-escaper": { + "version": "1.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/sql-escaper/-/sql-escaper-1.5.2.tgz", + "integrity": "sha512-6CKD38c31SENivxOADeMNLdukOnUxUcflKtzVWzace7Riv1v7cAEym5Cx9Q7gYZ3ezIJI7ZpqecQq8cqNeSSFg==", + "dev": true, + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha1-j3XuzvdlteHPzcCA2llAntQk44I=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha1-MtpWjoPqSIsI5NfqLDvMnXUBXVs=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tedious": { + "version": "20.3.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tedious/-/tedious-20.3.8.tgz", + "integrity": "sha512-ZrJiwyGn340Sa0V0g37Xqj5bvmJ1riYwvEtg7zdm/lpw70f2ZNIQ2fvHmntU5fEOorWDa48Jo1oKYAuUP+rh7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.10.1", + "@azure/identity": "^4.13.1", + "@azure/keyvault-keys": "^4.10.2", + "@js-joda/core": "^6.0.1", + "@types/node": ">=22", + "bl": "^6.1.4", + "iconv-lite": "^0.7.0", + "js-md4": "^0.3.2", + "native-duplexpair": "^1.0.0" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha1-adycGxdEbueakr9biEu0uRJ1BvU=", + "dev": true, + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha1-O+NDIaiKgg7RvYDfqjPkefu43TU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=", + "dev": true, + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha1-b95wJx3G5dc8oMOyTi2Sr7dEGYQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.9.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tslib/-/tslib-2.9.1.tgz", + "integrity": "sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha1-cvExSzSlsZLbASMk3yzFh8pH+Sw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha1-cdGnBTKTWC4WrJ8+uvGrmqSeVXA=", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha1-4kDZfItdheU0fOc9JYZceQbB7J8=", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha1-Fo78IYCWTmOG0GHglN9hr+I5sY0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-templates": { + "version": "0.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uri-templates/-/uri-templates-0.2.0.tgz", + "integrity": "sha1-K1eEURzJCYaHMekjPCaAl9ELSZ8=", + "dev": true, + "license": "http://geraintluff.github.io/tv4/LICENSE.txt" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.15.35", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validator/-/validator-13.15.35.tgz", + "integrity": "sha1-gc9FXFHxW2nY00C+WRTz+rANv38=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/winston/-/winston-3.19.0.tgz", + "integrity": "sha1-zB0SYvX0WUaQQIXP/+c++0t6WB0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha1-O7o0XeECl2VOpvM1GUJFYAA7O/k=", + "dev": true, + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha1-xsNwGaz0DlF8xrlGV6JaPUqjPow=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha1-3QtjAIOqCcFh4lpNCQHisqkptJk=", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha1-d53/5ryv7FlqcXLpgyiaWIZH+qo=", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/package.json b/azure-container-apps-sample/functions-on-azure-container-apps/package.json new file mode 100644 index 0000000..4793e81 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/package.json @@ -0,0 +1,23 @@ +{ + "name": "functions-on-azure-container-apps-hello", + "version": "1.0.0", + "private": true, + "description": "HTTP hello world using native Azure Functions on Azure Container Apps", + "main": "src/functions/hello.js", + "engines": { + "node": ">=24 <25" + }, + "scripts": { + "start": "func start", + "test": "node --test", + "storage": "azurite --location .azurite --silent", + "check": "node --check src/functions/hello.js && node --check src/hello.js" + }, + "dependencies": { + "@azure/functions": "^4.0.0" + }, + "devDependencies": { + "azure-functions-core-tools": "^4.0.0", + "azurite": "^3.35.0" + } +} diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/src/functions/hello.js b/azure-container-apps-sample/functions-on-azure-container-apps/src/functions/hello.js new file mode 100644 index 0000000..9fbc9b4 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/src/functions/hello.js @@ -0,0 +1,9 @@ +const { app } = require('@azure/functions'); +const { hello } = require('../hello'); + +app.http('hello', { + methods: ['GET'], + authLevel: 'anonymous', + route: 'hello', + handler: hello +}); diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/src/hello.js b/azure-container-apps-sample/functions-on-azure-container-apps/src/hello.js new file mode 100644 index 0000000..dade2b5 --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/src/hello.js @@ -0,0 +1,9 @@ +async function hello() { + return { + status: 200, + headers: { 'Content-Type': 'application/json; charset=utf-8' }, + jsonBody: { message: 'Hello, world!' } + }; +} + +module.exports = { hello }; diff --git a/azure-container-apps-sample/functions-on-azure-container-apps/test/hello.test.js b/azure-container-apps-sample/functions-on-azure-container-apps/test/hello.test.js new file mode 100644 index 0000000..de3472b --- /dev/null +++ b/azure-container-apps-sample/functions-on-azure-container-apps/test/hello.test.js @@ -0,0 +1,129 @@ +const assert = require('node:assert/strict'); +const { readFileSync } = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const { test } = require('node:test'); +const { hello } = require('../src/hello'); + +const root = path.join(__dirname, '..'); +const read = (file) => readFileSync(path.join(root, file), 'utf8'); +const template = JSON.parse(read('main.json')); +const app = template.resources[0]; + +test('hello returns the documented JSON response with HTTP 200', async () => { + assert.deepEqual(await hello(), { + status: 200, + headers: { 'Content-Type': 'application/json; charset=utf-8' }, + jsonBody: { message: 'Hello, world!' } + }); +}); + +test('response does not echo caller input or leak mutable state across requests', async () => { + const first = await hello({ body: 'private input' }); + first.jsonBody.message = 'changed'; + assert.deepEqual((await hello()).jsonBody, { message: 'Hello, world!' }); +}); + +test('Functions v4 registers an anonymous GET at /api/hello', () => { + let registration; + vm.runInNewContext(read('src/functions/hello.js'), { + require(name) { + if (name === '@azure/functions') { + return { app: { http: (name, options) => { registration = { name, options }; } } }; + } + assert.equal(name, '../hello'); + return { hello }; + } + }); + assert.equal(registration.name, 'hello'); + assert.equal(registration.options.route, 'hello'); + assert.equal(registration.options.authLevel, 'anonymous'); + assert.equal(Array.from(registration.options.methods).join(','), 'GET'); + assert.equal(registration.options.handler, hello); + assert.equal(JSON.parse(read('host.json')).extensions.http.routePrefix, 'api'); + assert.equal(JSON.parse(read('package.json')).main, 'src/functions/hello.js'); +}); + +test('ARM uses native Functions integration and explicit workload binding', () => { + assert.equal(template.resources.length, 1); + assert.equal(app.type, 'Microsoft.App/containerApps'); + assert.equal(app.kind, 'functionapp'); + assert.equal(app.properties.environmentId, "[parameters('environmentId')]"); + assert.equal(app.properties.workloadProfileName, "[parameters('workloadProfileName')]"); + assert.deepEqual(template.parameters.location.allowedValues, ['uaenorth']); + assert.equal(template.parameters.workloadProfileName.defaultValue, 'confidential'); +}); + +test('ARM requires HTTPS, port 80, ready traffic and bounded replica count', () => { + assert.equal(app.properties.configuration.ingress.allowInsecure, false); + assert.equal(app.properties.configuration.ingress.targetPort, 80); + assert.deepEqual(app.properties.configuration.ingress.traffic, [{ latestRevision: true, weight: 100 }]); + assert.deepEqual(app.properties.template.scale, { minReplicas: 1, maxReplicas: 1 }); + assert.match(template.outputs.helloUrl.value, /https:\/\/.*\/api\/hello/); +}); + +test('ACR pulls and host storage use a user-assigned managed identity, not keys', () => { + assert.equal(app.identity.type, 'UserAssigned'); + assert.equal(app.properties.configuration.registries[0].identity, "[parameters('identityId')]"); + const settings = Object.fromEntries(app.properties.template.containers[0].env.map(({ name, value }) => [name, value])); + assert.equal(settings.AzureWebJobsStorage__credential, 'managedidentity'); + assert.equal(settings.AzureWebJobsStorage__clientId, "[parameters('identityClientId')]"); + assert.equal(settings.AzureWebJobsStorage__accountName, "[parameters('storageAccountName')]"); + assert.equal(settings.AzureWebJobsStorage, undefined); + assert.equal(app.properties.configuration.secrets, undefined); +}); + +test('container uses the Functions runtime, locked production dependencies, and excludes local settings', () => { + const dockerfile = read('Dockerfile'); + assert.match(dockerfile, /FROM mcr\.microsoft\.com\/azure-functions\/node:4-node24/); + assert.equal(JSON.parse(read('package.json')).engines.node, '>=24 <25'); + assert.match(dockerfile, /npm ci --omit=dev/); + assert.match(dockerfile, /RUN node --version && npm ci/); + assert.match(dockerfile, /COPY src \.\/src/); + assert.match(dockerfile, /EXPOSE 80/); + assert.doesNotMatch(dockerfile, /COPY \. /); + assert.match(read('.dockerignore'), /local\.settings\*\.json/); + assert.match(read('.gitignore'), /local\.settings\.json/); +}); + +test('deployment instructions require a fresh base image and describe runtime upgrade boundaries', () => { + const readme = read('README.md'); + assert.match(readme, /docker build --pull --no-cache/); + assert.match(readme, /az acr run .*--file acr-task\.yaml/); + const task = read('acr-task.yaml'); + assert.match(task, /--pull --no-cache/); + assert.match(task, /functions-hello:\{\{\.Run\.ID\}\}/); + assert.match(task, /- push:/); + assert.match(readme, /before \*\*every deployment\*\*/); + assert.match(readme, /Running containers \*\*do not update themselves\*\*/); +}); + +test('local development uses the storage emulator, never a cloud connection string', () => { + const settings = JSON.parse(read('local.settings.example.json')).Values; + assert.equal(settings.AzureWebJobsStorage, 'UseDevelopmentStorage=true'); + assert.match(JSON.parse(read('package.json')).scripts.storage, /^azurite /); + assert.match(read('.gitignore'), /\.azurite/); + assert.match(read('.dockerignore'), /\.azurite/); +}); + +test('private host storage uses a separate subnet and VNet-linked blob DNS', () => { + const network = JSON.parse(read('host-storage-network.json')); + assert.equal(network.resources.length, 5); + const subnet = network.resources.find(({ type }) => type === 'Microsoft.Network/virtualNetworks/subnets'); + assert.equal(network.parameters.subnetPrefix.defaultValue, '10.42.2.0/24'); + assert.equal(subnet.properties.privateEndpointNetworkPolicies, 'Disabled'); + assert.equal(subnet.properties.delegations, undefined); + assert.equal(network.resources.some(({ type }) => type === 'Microsoft.Network/virtualNetworks'), false); + const endpoint = network.resources.find(({ type }) => type === 'Microsoft.Network/privateEndpoints'); + const connection = endpoint.properties.privateLinkServiceConnections[0].properties; + assert.deepEqual(connection.groupIds, ['blob']); + assert.equal(connection.privateLinkServiceId, "[parameters('storageAccountId')]"); + assert.equal(network.variables.zoneName, 'privatelink.blob.core.windows.net'); + const link = network.resources.find(({ type }) => type === 'Microsoft.Network/privateDnsZones/virtualNetworkLinks'); + assert.equal(link.properties.registrationEnabled, false); + assert.equal(link.properties.virtualNetwork.id, "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"); + const group = network.resources.find(({ type }) => type === 'Microsoft.Network/privateEndpoints/privateDnsZoneGroups'); + assert.equal(group.properties.privateDnsZoneConfigs[0].properties.privateDnsZoneId, + "[resourceId('Microsoft.Network/privateDnsZones', variables('zoneName'))]"); + assert.match(read('README.md'), /--public-network-access Disabled/); +});