diff --git a/.ci/Makefile b/.ci/Makefile index 9e460a5164..c15c462433 100644 --- a/.ci/Makefile +++ b/.ci/Makefile @@ -57,6 +57,7 @@ publish: validate-layer-name validate-aws-default-region @aws lambda \ --output json \ publish-layer-version \ + --region="$(AWS_DEFAULT_REGION)" \ --layer-name "$(ELASTIC_LAYER_NAME)" \ --description "AWS Lambda Extension Layer for the Elastic APM Node.js Agent" \ --license "Apache-2.0" \ @@ -69,6 +70,7 @@ grant-public-layer-access: validate-layer-name validate-aws-default-region @aws lambda \ --output json \ add-layer-version-permission \ + --region="$(AWS_DEFAULT_REGION)" \ --layer-name "$(ELASTIC_LAYER_NAME)" \ --action lambda:GetLayerVersion \ --principal '*' \ diff --git a/.ci/docker/docker-compose.yml b/.ci/docker/docker-compose.yml index cf1e6555b0..872729faae 100644 --- a/.ci/docker/docker-compose.yml +++ b/.ci/docker/docker-compose.yml @@ -31,19 +31,21 @@ services: retries: 30 mssql: - image: mcr.microsoft.com/mssql/server + # Tags listed at https://hub.docker.com/r/microsoft/mssql-server + # Docs: https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker + image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 platform: linux/amd64 environment: - ACCEPT_EULA=Y - - SA_PASSWORD=Very(!)Secure + - MSSQL_SA_PASSWORD=Very(!)Secure - MSSQL_PID=Developer ports: - "1433:1433" volumes: - nodemssqldata:/var/opt/mssql healthcheck: - test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-S", "mssql", "-U", "sa", "-P", "Very(!)Secure", "-Q", "select 1"] - interval: 30s + test: ["CMD", "/opt/mssql-tools18/bin/sqlcmd", "-C", "-S", "mssql", "-U", "sa", "-P", "Very(!)Secure", "-Q", "select 1"] + interval: 10s timeout: 10s retries: 5 @@ -72,7 +74,7 @@ services: retries: 30 elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.0.0 environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - "network.host=_site_" diff --git a/.ci/scripts/docker-test.sh b/.ci/scripts/docker-test.sh index f78e57c2be..d81bac49b9 100755 --- a/.ci/scripts/docker-test.sh +++ b/.ci/scripts/docker-test.sh @@ -42,14 +42,8 @@ node --version npm --version npm_ci -# Attempt to provide junit-formatted test results, for Jenkins' "Test Results" -# and other features like flaky-test reporting. if [[ -n ${TAV} ]]; then npm run test:tav - # Currently the TAV tests do not support TAP or junit-formatted output. else - rm -rf ./test_output - mkdir ./test_output - nyc node test/test.js -o ./test_output - ls test_output/*.tap | while read f; do cat $f | ./node_modules/.bin/tap-junit > $f.junit.xml; done + node test/test.js fi diff --git a/.ci/snapshoty.yml b/.ci/snapshoty.yml deleted file mode 100644 index 0039a3931e..0000000000 --- a/.ci/snapshoty.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- - -# Version of configuration to use -version: '1.0' - -# You can define a Google Cloud Account to use -account: - # Project id of the service account - project: '${GCS_PROJECT}' - # Private key id of the service account - private_key_id: '${GCS_PRIVATE_KEY_ID}' - # Private key of the service account - private_key: '${GCS_PRIVATE_KEY}' - # Email of the service account - client_email: '${GCS_CLIENT_EMAIL}' - # URI token - token_uri: 'https://oauth2.googleapis.com/token' - -# List of artifacts -artifacts: - # Path to use for artifacts discovery - - path: './build/snapshot' - # Files pattern to match - files_pattern: 'elastic-apm-node-(?P\d+\.\d+\.\d+)\.tgz' - # File layout on GCS bucket - output_pattern: '{project}/{github_branch_name}/elastic-apm-node-{app_version}-{github_sha_short}.tgz' - # List of metadata processors to use. - metadata: - # Define static custom metadata - - name: 'custom' - data: - project: 'apm-agent-nodejs' - # Add git metadata - - name: 'git' - # Add github_actions metadata - - name: 'github_actions' diff --git a/.ci/updatecli/updatecli.d/update-json-specs.yml b/.ci/updatecli/updatecli.d/update-json-specs.yml deleted file mode 100644 index e05aaecdb1..0000000000 --- a/.ci/updatecli/updatecli.d/update-json-specs.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: update-json-specs -pipelineid: update-json-specs - -scms: - default: - kind: github - spec: - user: '{{ requiredEnv "GIT_USER" }}' - email: '{{ requiredEnv "GIT_EMAIL" }}' - owner: "{{ .github.owner }}" - repository: "{{ .github.repository }}" - token: '{{ requiredEnv "GITHUB_TOKEN" }}' - username: '{{ requiredEnv "GIT_USER" }}' - branch: "{{ .github.branch }}" - apm: - kind: github - spec: - user: '{{ requiredEnv "GIT_USER" }}' - email: '{{ requiredEnv "GIT_EMAIL" }}' - owner: "{{ .github.owner }}" - repository: "{{ .github.apm_repository }}" - token: '{{ requiredEnv "GITHUB_TOKEN" }}' - username: '{{ requiredEnv "GIT_USER" }}' - branch: "{{ .github.branch }}" - -sources: - sha: - kind: file - spec: - file: 'https://github.com/{{ .github.owner }}/{{ .github.apm_repository }}/commit/{{ .github.branch }}.patch' - matchpattern: "^From\\s([0-9a-f]{40})\\s" - transformers: - - findsubmatch: - pattern: "[0-9a-f]{40}" - pull_request: - kind: shell - dependson: - - sha - spec: - command: gh api /repos/{{ .github.owner }}/{{ .github.apm_repository }}/commits/{{ source "sha" }}/pulls --jq '.[].html_url' - environments: - - name: GITHUB_TOKEN - - name: PATH - agents-json-specs-tarball: - kind: shell - scmid: apm - dependson: - - sha - spec: - command: tar cvzf {{ requiredEnv "GITHUB_WORKSPACE" }}/json-specs.tgz . - environments: - - name: PATH - workdir: "{{ .specs.apm_json_path }}" - -actions: - pr: - kind: "github/pullrequest" - scmid: default - spec: - automerge: false - draft: false - labels: - - "automation" - description: |- - ### What - APM agent specs automatic sync - - ### Why - *Changeset* - * {{ source "pull_request" }} - * https://github.com/{{ .github.owner }}/{{ .github.apm_repository }}/commit/{{ source "sha" }} - title: '[Automation] Update JSON specs' - -targets: - agent-json-specs: - name: APM agent json specs {{ source "sha" }} - scmid: default - disablesourceinput: true - kind: shell - spec: - # git diff helps to print what it changed, If it is empty, then updatecli report a success with no changes applied. - # See https://www.updatecli.io/docs/plugins/resource/shell/#_shell_target - command: 'tar -xzf {{ requiredEnv "GITHUB_WORKSPACE" }}/json-specs.tgz && git --no-pager diff' - workdir: "{{ .apm_agent.json_specs_path }}" diff --git a/.ci/updatecli/updatecli.d/update-specs.yml b/.ci/updatecli/updatecli.d/update-specs.yml deleted file mode 100644 index 554140da2b..0000000000 --- a/.ci/updatecli/updatecli.d/update-specs.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: update-specs -pipelineid: update-schema-specs - -scms: - default: - kind: github - spec: - user: '{{ requiredEnv "GIT_USER" }}' - email: '{{ requiredEnv "GIT_EMAIL" }}' - owner: "{{ .github.owner }}" - repository: "{{ .github.repository }}" - token: '{{ requiredEnv "GITHUB_TOKEN" }}' - username: '{{ requiredEnv "GIT_USER" }}' - branch: "{{ .github.branch }}" - - apm-data: - kind: github - spec: - user: '{{ requiredEnv "GIT_USER" }}' - email: '{{ requiredEnv "GIT_EMAIL" }}' - owner: "{{ .github.owner }}" - repository: "{{ .github.apm_data_repository }}" - token: '{{ requiredEnv "GITHUB_TOKEN" }}' - username: '{{ requiredEnv "GIT_USER" }}' - branch: "{{ .github.branch }}" - -sources: - sha: - kind: file - spec: - file: 'https://github.com/{{ .github.owner }}/{{ .github.apm_data_repository }}/commit/{{ .github.branch }}.patch' - matchpattern: "^From\\s([0-9a-f]{40})\\s" - transformers: - - findsubmatch: - pattern: "[0-9a-f]{40}" - pull_request: - kind: shell - dependson: - - sha - spec: - command: gh api /repos/{{ .github.owner }}/{{ .github.apm_data_repository }}/commits/{{ source "sha" }}/pulls --jq '.[].html_url' - environments: - - name: GITHUB_TOKEN - - name: PATH - agent-specs-tarball: - kind: shell - scmid: apm-data - dependson: - - sha - spec: - command: tar cvzf {{ requiredEnv "GITHUB_WORKSPACE" }}/json-schema.tgz . - environments: - - name: PATH - workdir: "{{ .specs.apm_data_path }}" - -actions: - pr: - kind: "github/pullrequest" - scmid: default - sourceid: sha - spec: - automerge: false - draft: false - labels: - - "automation" - description: |- - ### What - APM agent json server schema automatic sync - - ### Why - *Changeset* - * {{ source "pull_request" }} - * https://github.com/{{ .github.owner }}/{{ .github.apm_data_repository }}/commit/{{ source "sha" }} - title: '[Automation] Update JSON server schema specs' - -targets: - agent-json-schema: - name: APM agent json server schema {{ source "sha" }} - scmid: default - disablesourceinput: true - kind: shell - spec: - # git diff helps to print what it changed, If it is empty, then updatecli report a success with no changes applied. - # See https://www.updatecli.io/docs/plugins/resource/shell/#_shell_target - command: 'tar -xzf {{ requiredEnv "GITHUB_WORKSPACE" }}/json-schema.tgz && git --no-pager diff' - workdir: "{{ .apm_agent.server_schema_specs_path }}" diff --git a/.ci/updatecli/values.d/apm-data-spec.yml b/.ci/updatecli/values.d/apm-data-spec.yml new file mode 100644 index 0000000000..7402e8f94c --- /dev/null +++ b/.ci/updatecli/values.d/apm-data-spec.yml @@ -0,0 +1 @@ +apm_schema_specs_path: test/integration/api-schema/apm-server-schema diff --git a/.ci/updatecli/values.d/apm-json-specs.yml b/.ci/updatecli/values.d/apm-json-specs.yml new file mode 100644 index 0000000000..1537adc36f --- /dev/null +++ b/.ci/updatecli/values.d/apm-json-specs.yml @@ -0,0 +1 @@ +apm_json_specs_path: test/fixtures/json-specs diff --git a/.ci/updatecli/values.d/scm.yml b/.ci/updatecli/values.d/scm.yml new file mode 100644 index 0000000000..1f8a711138 --- /dev/null +++ b/.ci/updatecli/values.d/scm.yml @@ -0,0 +1,10 @@ +scm: + enabled: true + owner: elastic + repository: apm-agent-nodejs + branch: main + commitusingapi: true + # begin update-compose policy values + user: obltmachine + email: obltmachine@users.noreply.github.com + # end update-compose policy values diff --git a/.ci/updatecli/values.d/update-compose.yml b/.ci/updatecli/values.d/update-compose.yml new file mode 100644 index 0000000000..02df609f2a --- /dev/null +++ b/.ci/updatecli/values.d/update-compose.yml @@ -0,0 +1,3 @@ +spec: + files: + - "updatecli-compose.yaml" \ No newline at end of file diff --git a/.ci/updatecli/values.yml b/.ci/updatecli/values.yml deleted file mode 100644 index d2489f9fe0..0000000000 --- a/.ci/updatecli/values.yml +++ /dev/null @@ -1,12 +0,0 @@ -github: - owner: "elastic" - repository: "apm-agent-nodejs" - apm_repository: "apm" - apm_data_repository: "apm-data" - branch: "main" -specs: - apm_data_path: "input/elasticapm/docs/spec/v2" - apm_json_path: "tests/agents/json-specs" -apm_agent: - json_specs_path: "test/fixtures/json-specs" - server_schema_specs_path: "test/integration/api-schema/apm-server-schema" \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 25f4214c6c..3461cf5687 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,11 @@ version: 2 +registries: + docker-elastic: + type: docker-registry + url: https://docker.elastic.co + username: ${{secrets.ELASTIC_DOCKER_USERNAME}} + password: ${{secrets.ELASTIC_DOCKER_PASSWORD}} + updates: - package-ecosystem: "npm" directory: "/" @@ -20,6 +27,13 @@ updates: update-types: ["version-update:semver-patch"] - dependency-name: "@types/*" update-types: ["version-update:semver-patch"] + # Packages whose major versions have dropped support for Node.js versions + # that this package needs. + - dependency-name: "glob" # glob@10 min is 14.20, we need >=14.17; glob@11 dropped 14, 16, 18 + update-types: ["version-update:semver-major"] + - dependency-name: "lru-cache" # later lru-cache@10.x toyed with dropping 14.x, we pin to a specific early 10.x; lru-cache@11 dropped 14, 16, 18 + - dependency-name: "rimraf" # rimraf@5 min is 14.20, we need >=14.17; rimraf@6 dropped 14, 16, 18 + update-types: ["version-update:semver-major"] groups: aws-sdk: dependency-type: "development" @@ -41,7 +55,7 @@ updates: - "eslint*" - package-ecosystem: "npm" - directory: "/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp" + directory: "/test/instrumentation/azure-functions/fixtures/azfunc3" schedule: interval: "weekly" open-pull-requests-limit: 5 @@ -49,7 +63,7 @@ updates: - "elastic/apm-agent-node-js" - package-ecosystem: "npm" - directory: "/test/instrumentation/modules/next/a-nextjs-app" + directory: "/test/instrumentation/azure-functions/fixtures/azfunc4" schedule: interval: "weekly" open-pull-requests-limit: 5 @@ -102,3 +116,10 @@ updates: github-actions: patterns: - "*" + + # Docker + - package-ecosystem: "docker" + directory: "/" + registries: "*" + schedule: + interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 259d75e93e..d5b57ea2c5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,5 +16,5 @@ https://help.github.com/articles/closing-issues-using-keywords/ - [ ] Add tests - [ ] Update TypeScript typings - [ ] Update documentation -- [ ] Add CHANGELOG.asciidoc entry +- [ ] Add release notes to `docs/release-notes/index.md` - [ ] Commit message follows [commit guidelines](https://github.com/elastic/apm-agent-nodejs/blob/main/CONTRIBUTING.md#commit-message-guidelines) diff --git a/.github/workflows/addToProject.yml b/.github/workflows/addToProject.yml index 0b5f098976..3bdfd0a895 100644 --- a/.github/workflows/addToProject.yml +++ b/.github/workflows/addToProject.yml @@ -9,11 +9,22 @@ permissions: jobs: add_to_project: if: github.event.issue && github.event.issue.milestone - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: + - name: Get token + id: get_token + uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a # v2.1.0 + with: + app_id: ${{ secrets.OBS_AUTOMATION_APP_ID }} + private_key: ${{ secrets.OBS_AUTOMATION_APP_PEM }} + permissions: >- + { + "organization_projects": "write", + "issues": "read" + } - name: Get project data env: - GITHUB_TOKEN: ${{ secrets.APM_TECH_USER_TOKEN }} + GITHUB_TOKEN: ${{ steps.get_token.outputs.token }} TEAM: Node.js ORGANIZATION: elastic PROJECT_NUMBER: 595 @@ -49,7 +60,7 @@ jobs: - name: Add issue to project env: - GITHUB_TOKEN: ${{ secrets.APM_TECH_USER_TOKEN }} + GITHUB_TOKEN: ${{ steps.get_token.outputs.token }} ISSUE_ID: ${{ github.event.issue.node_id }} run: | item_id="$( gh api graphql -f query=' @@ -65,7 +76,7 @@ jobs: - name: Set fields env: - GITHUB_TOKEN: ${{ secrets.APM_TECH_USER_TOKEN }} + GITHUB_TOKEN: ${{ steps.get_token.outputs.token }} run: | gh api graphql -f query=' mutation ( diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml new file mode 100644 index 0000000000..bb466166d0 --- /dev/null +++ b/.github/workflows/docs-build.yml @@ -0,0 +1,19 @@ +name: docs-build + +on: + push: + branches: + - main + pull_request_target: ~ + merge_group: ~ + +jobs: + docs-preview: + uses: elastic/docs-builder/.github/workflows/preview-build.yml@main + with: + path-pattern: docs/** + permissions: + deployments: write + id-token: write + contents: read + pull-requests: read diff --git a/.github/workflows/docs-cleanup.yml b/.github/workflows/docs-cleanup.yml new file mode 100644 index 0000000000..f83e017b5f --- /dev/null +++ b/.github/workflows/docs-cleanup.yml @@ -0,0 +1,14 @@ +name: docs-cleanup + +on: + pull_request_target: + types: + - closed + +jobs: + docs-preview: + uses: elastic/docs-builder/.github/workflows/preview-cleanup.yml@main + permissions: + contents: none + id-token: write + deployments: write diff --git a/.github/workflows/edge.yml b/.github/workflows/edge.yml index 14c9b4e0bd..207cf01b3f 100644 --- a/.github/workflows/edge.yml +++ b/.github/workflows/edge.yml @@ -27,7 +27,7 @@ jobs: # made, these will stop and there will be no value in testing v17 nightlies. # test-nightly: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 30 strategy: fail-fast: false @@ -44,7 +44,7 @@ jobs: # The node.js project *sometimes* produces "rc" builds leading up to a new # release. They get uploaded to: https://nodejs.org/download/rc/ test-rc: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 30 strategy: fail-fast: false diff --git a/.github/workflows/github-commands-comment.yml b/.github/workflows/github-commands-comment.yml new file mode 100644 index 0000000000..8b5f48d34d --- /dev/null +++ b/.github/workflows/github-commands-comment.yml @@ -0,0 +1,18 @@ +--- +name: github-commands-comment + +on: + pull_request_target: + types: + - opened + +permissions: + contents: read + +jobs: + comment: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: elastic/oblt-actions/elastic/github-commands@v1 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 6bb9af6894..b1e3607c70 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -13,16 +13,30 @@ permissions: jobs: triage: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: + - name: Get token + id: get_token + uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a # v2.1.0 + with: + app_id: ${{ secrets.OBS_AUTOMATION_APP_ID }} + private_key: ${{ secrets.OBS_AUTOMATION_APP_PEM }} + permissions: >- + { + "members": "read" + } - id: is_elastic_member - uses: elastic/apm-pipeline-library/.github/actions/is-member-elastic-org@current + uses: elastic/oblt-actions/github/is-member-of@v1 with: - username: ${{ github.actor }} - token: ${{ secrets.APM_TECH_USER_TOKEN }} + github-org: "elastic" + github-user: ${{ github.actor }} + github-token: ${{ steps.get_token.outputs.token }} - name: Add community and triage labels - if: contains(steps.is_elastic_member.outputs.result, 'false') && github.actor != 'dependabot[bot]' + if: contains(steps.is_elastic_member.outputs.result, 'false') && + github.actor != 'dependabot[bot]' && + github.actor != 'elastic-renovate-prod[bot]' && + github.actor != 'elastic-observability-automation[bot]' uses: actions/github-script@v7 with: script: | diff --git a/.github/workflows/microbenchmark.yml b/.github/workflows/microbenchmark.yml index 66f33a3074..3e63af3025 100644 --- a/.github/workflows/microbenchmark.yml +++ b/.github/workflows/microbenchmark.yml @@ -17,34 +17,17 @@ permissions: jobs: microbenchmark: - runs-on: ubuntu-latest - # wait up to 1 hour - timeout-minutes: 60 + runs-on: ubuntu-24.04 + timeout-minutes: 5 steps: - - id: buildkite - name: Run buildkite pipeline - uses: elastic/apm-pipeline-library/.github/actions/buildkite@current + - name: Run microbenchmark + uses: elastic/oblt-actions/buildkite/run@v1 with: - vaultUrl: ${{ secrets.VAULT_ADDR }} - vaultRoleId: ${{ secrets.VAULT_ROLE_ID }} - vaultSecretId: ${{ secrets.VAULT_SECRET_ID }} - pipeline: apm-agent-microbenchmark - triggerMessage: "${{ github.repository }}@${{ github.ref_name }}" - waitFor: true - printBuildLogs: true - buildEnvVars: | + pipeline: "apm-agent-microbenchmark" + token: ${{ secrets.BUILDKITE_TOKEN }} + wait-for: false + env-vars: | script=.ci/scripts/bench.sh repo=apm-agent-nodejs sha=${{ github.sha }} BRANCH_NAME=${{ github.ref_name }} - - - if: ${{ failure() }} - uses: elastic/apm-pipeline-library/.github/actions/slack-message@current - with: - url: ${{ secrets.VAULT_ADDR }} - roleId: ${{ secrets.VAULT_ROLE_ID }} - secretId: ${{ secrets.VAULT_SECRET_ID }} - channel: "#apm-agent-node" - message: | - :ghost: [${{ github.repository }}] microbenchmark *${{ github.ref_name }}* failed to run in Buildkite. - Build: (<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|here>) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac315583d0..ff2f927300 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ permissions: jobs: release: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 env: DOCKER_IMAGE_NAME: docker.elastic.co/observability/apm-agent-nodejs steps: @@ -27,26 +27,30 @@ jobs: with: node-version: 'v16.20.2' - - uses: elastic/apm-pipeline-library/.github/actions/docker-login@current + # Setup a Docker "buildx" builder container, used by "build-push-action" + # below for multi-platform image builds. Notes on multi-platform images: + # https://github.com/elastic/apm-agent-nodejs/issues/4038#issuecomment-2130406402 + - uses: docker/setup-buildx-action@v3 + + - name: Log in to the Elastic Container registry + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 with: - registry: docker.elastic.co - secret: secret/observability-team/ci/docker-registry/prod - url: ${{ secrets.VAULT_ADDR }} - roleId: ${{ secrets.VAULT_ROLE_ID }} - secretId: ${{ secrets.VAULT_SECRET_ID }} + registry: ${{ secrets.ELASTIC_DOCKER_REGISTRY }} + username: ${{ secrets.ELASTIC_DOCKER_USERNAME }} + password: ${{ secrets.ELASTIC_DOCKER_PASSWORD }} - run: make -C .ci env - run: make -C .ci dist - name: Attest Lambda layer zip - uses: actions/attest-build-provenance@173725a1209d09b31f9d30a3890cf2757ebbff0d # v1.1.2 + uses: actions/attest-build-provenance@db473fddc028af60658334401dc6fa3ffd8669fd # v2.3.0 with: subject-path: "${{ github.workspace }}/build/aws/elastic-apm-node-lambda-layer-*.zip" - name: Extract metadata (tags, labels) id: docker-meta - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 with: images: ${{ env.DOCKER_IMAGE_NAME }} flavor: | @@ -59,9 +63,10 @@ jobs: - name: Build and Push Docker Image id: docker-push - uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: . + platforms: linux/amd64,linux/arm64 file: 'Dockerfile' push: true tags: ${{ steps.docker-meta.outputs.tags }} @@ -70,7 +75,7 @@ jobs: AGENT_DIR=/build/dist/nodejs - name: Attest Docker image - uses: actions/attest-build-provenance@173725a1209d09b31f9d30a3890cf2757ebbff0d # v1.1.2 + uses: actions/attest-build-provenance@db473fddc028af60658334401dc6fa3ffd8669fd # v2.3.0 with: subject-name: "${{ env.DOCKER_IMAGE_NAME }}" subject-digest: ${{ steps.docker-push.outputs.digest }} @@ -78,7 +83,7 @@ jobs: - name: Extract metadata (tags, labels) (wolfi) id: docker-meta-wolfi - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 with: images: ${{ env.DOCKER_IMAGE_NAME }} flavor: | @@ -92,9 +97,10 @@ jobs: - name: Build and Push Docker Image (wolfi) id: docker-push-wolfi - uses: docker/build-push-action@2cdde995de11925a030ce8070c3d77a52ffcf1c0 # v5.3.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: . + platforms: linux/amd64,linux/arm64 file: 'Dockerfile.wolfi' push: true tags: ${{ steps.docker-meta-wolfi.outputs.tags }} @@ -103,22 +109,15 @@ jobs: AGENT_DIR=/build/dist/nodejs - name: Attest Docker image (wolfi) - uses: github-early-access/generate-build-provenance@main + uses: actions/attest-build-provenance@db473fddc028af60658334401dc6fa3ffd8669fd # v2.3.0 with: subject-name: "${{ env.DOCKER_IMAGE_NAME }}" subject-digest: ${{ steps.docker-push-wolfi.outputs.digest }} push-to-registry: true - - name: Read AWS vault secrets - uses: hashicorp/vault-action@v3.0.0 + - uses: elastic/oblt-actions/aws/auth@v1 with: - url: ${{ secrets.VAULT_ADDR }} - method: approle - roleId: ${{ secrets.VAULT_ROLE_ID }} - secretId: ${{ secrets.VAULT_SECRET_ID }} - secrets: | - secret/observability-team/ci/service-account/apm-aws-lambda access_key_id | AWS_ACCESS_KEY_ID ; - secret/observability-team/ci/service-account/apm-aws-lambda secret_access_key | AWS_SECRET_ACCESS_KEY + aws-account-id: "267093732750" - name: Publish AWS lambda (only for tag release) if: startsWith(github.ref, 'refs/tags') @@ -132,28 +131,15 @@ jobs: env: GH_TOKEN: ${{ github.token }} - - name: Read NPM vault secrets - uses: hashicorp/vault-action@v3.0.0 - with: - url: ${{ secrets.VAULT_ADDR }} - method: approle - roleId: ${{ secrets.VAULT_ROLE_ID }} - secretId: ${{ secrets.VAULT_SECRET_ID }} - secrets: | - secret/jenkins-ci/npmjs/elasticmachine token | NPMJS_TOKEN ; - totp/code/npmjs-elasticmachine code | TOTP_CODE - - name: npm publish (only for tag release) if: startsWith(github.ref, 'refs/tags') run: |- - echo "//registry.npmjs.org/:_authToken=${{ env.NPMJS_TOKEN }}" > .npmrc - npm publish --otp=${{ env.TOTP_CODE }} --provenance + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc + npm publish --provenance - if: ${{ always() && startsWith(github.ref, 'refs/tags') }} - uses: elastic/apm-pipeline-library/.github/actions/notify-build-status@current + uses: elastic/oblt-actions/slack/notify-result@v1 with: - vaultUrl: ${{ secrets.VAULT_ADDR }} - vaultRoleId: ${{ secrets.VAULT_ROLE_ID }} - vaultSecretId: ${{ secrets.VAULT_SECRET_ID }} - slackChannel: "#apm-agent-node" + bot-token: ${{ secrets.SLACK_BOT_TOKEN }} + channel-id: "#apm-agent-node" message: '[${{ github.repository }}] Release *${{ github.ref_name }}*' diff --git a/.github/workflows/slack-lite.yml b/.github/workflows/slack-lite.yml new file mode 100644 index 0000000000..53189fde09 --- /dev/null +++ b/.github/workflows/slack-lite.yml @@ -0,0 +1,126 @@ +# Post a slack message something like the following for issue and PR actions: +# <$url|$title> +# | $repo#$num · issue opened by $user +# +# Configuration: +# 1. Set `SLACK_CHANNEL`. +# 2. Add a `SLACK_BOT_TOKEN` secret to your repo. This is the "Bot User OAuth +# Token" from the "OAuth & Permissions" section of your Slack App +# (https://api.slack.com/apps). The token must have the `chat:write` +# permission. +# 3. Optionally tweak the `if:` and `on:` sections below to control which issue +# and PR events are skipped. + +name: slack-lite + +env: + SLACK_CHANNEL: "#apm-agent-node" + +on: + issues: + types: [opened, reopened, closed] + pull_request_target: + types: [opened, ready_for_review, reopened, closed] + +jobs: + slack-lite: + # Skip notification if: + # - dependabot or renovate PRs, too noisy + # - draft PRs + if: ${{ !( + (github.event.action == 'opened' && github.event.pull_request.draft) || + github.event.pull_request.user.login == 'dependabot[bot]' || + github.event.pull_request.user.login == 'elastic-renovate-prod[bot]' + ) }} + runs-on: ubuntu-24.04 + steps: + - name: Prepare Slack message + id: prepare + shell: python + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: | + import os + from pprint import pprint + import json + + CLOSED_RED = '#cb2431' + GITHUB_BLACK = '#24292f' + MERGED_PURPLE = '#6f42c1' + OPEN_GREEN = '#36a64f' + DRAFT_GRAY = '#6a737d' + + ctx = json.loads(os.environ["GITHUB_CONTEXT"]) + # pprint(ctx) # for dev/debugging + event = ctx["event"] + action = event["action"] + if "issue" in event: + title = event["issue"]["title"] + url = event["issue"]["html_url"] + num = event["issue"]["number"] + action_str = f"issue {action}" + color = { + "opened": OPEN_GREEN, + "reopened": OPEN_GREEN, + "closed": CLOSED_RED, + }.get(action, "#ffffff") + elif "pull_request" in event: + title = event["pull_request"]["title"] + url = event["pull_request"]["html_url"] + num = event["pull_request"]["number"] + if action == "closed": + if event["pull_request"]["merged"]: + action_str = "PR merged" + color = MERGED_PURPLE + else: + action_str = "PR closed" + color = CLOSED_RED + elif event["pull_request"]["draft"]: + action_str = "PR in draft" + color = DRAFT_GRAY + elif action == "ready_for_review": + action_str = "PR ready for review" + color = OPEN_GREEN + else: + action_str = "PR opened" + color = OPEN_GREEN + else: + pprint(ctx) + raise ValueError('unexpected event: not an issue or PR event') + + payload = { + "channel": os.environ["SLACK_CHANNEL"], + + # Note: Omitting the "text" field is intentional, so that it is not + # rendered by default. Guidelines on accessibility in: + # https://api.slack.com/methods/chat.postMessage#text-blocks-attachments + # are unclear for "attachments" usage. This competes with: + # https://api.slack.com/reference/messaging/attachments#guidelines__message-attachments-as-objects + # guidelines to group all object data inside the attachment. + # The downside is that the `chatMessage` below results in warnings + # from the Slack API about not including the top-level "text". + #"text": title, + + # Intentionally *not* using Slack's newer blocks, + # https://api.slack.com/messaging/attachments-to-blocks + # because styling with the older syntax is slightly nicer, IMHO. + "attachments": [ + { + "color": color, + "title": title, + "title_link": url, + "footer": f"{ctx['repository']}#{num} · *{action_str}* by {event['sender']['login']}", + "footer_icon": "https://github.githubassets.com/favicon.ico" + } + ] + } + + with open(os.environ.get("GITHUB_OUTPUT"), "a") as f: + f.write("payload={}".format(json.dumps(payload))) + + - name: Post Slack message + uses: slackapi/slack-github-action@v2.0.0 + with: + method: chat.postMessage + token: ${{ secrets.SLACK_BOT_TOKEN }} + payload: ${{ steps.prepare.outputs.payload }} diff --git a/.github/workflows/snapshoty.yml b/.github/workflows/snapshoty.yml deleted file mode 100644 index feddb68d42..0000000000 --- a/.github/workflows/snapshoty.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -# Publish a snapshot. A "snapshot" is a packaging of the latest *unreleased* APM agent, -# published to a known GCS bucket for use in edge demo/test environments. -name: snapshoty - -on: - push: - branches: - - main - paths-ignore: - - '*.md' - - '*.asciidoc' - - 'docs/**' - -jobs: - upload: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: '16' - - - run: npm run package:snapshot - - - name: Publish snaphosts - uses: elastic/apm-pipeline-library/.github/actions/snapshoty-simple@current - with: - config: '.ci/snapshoty.yml' - vaultUrl: ${{ secrets.VAULT_ADDR }} - vaultRoleId: ${{ secrets.VAULT_ROLE_ID }} - vaultSecretId: ${{ secrets.VAULT_SECRET_ID }} diff --git a/.github/workflows/tav-command.yml b/.github/workflows/tav-command.yml index ea6fb43adb..68d44316ba 100644 --- a/.github/workflows/tav-command.yml +++ b/.github/workflows/tav-command.yml @@ -14,7 +14,7 @@ permissions: jobs: command-validation: if: startsWith(github.event.review.body, '/test tav') - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 permissions: pull-requests: write @@ -132,7 +132,7 @@ jobs: test-tav: needs: command-validation - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 40 strategy: max-parallel: 15 diff --git a/.github/workflows/tav.yml b/.github/workflows/tav.yml index 0bcb52399d..a0dcdeb945 100644 --- a/.github/workflows/tav.yml +++ b/.github/workflows/tav.yml @@ -21,7 +21,7 @@ permissions: jobs: prepare-matrix: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 outputs: permutations: ${{ steps.transform.outputs.permutations }} @@ -59,7 +59,7 @@ jobs: test-tav: needs: prepare-matrix - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 40 strategy: max-parallel: 15 diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index ee10f943fe..2b99309092 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -17,6 +17,6 @@ permissions: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - run: echo "No build required" diff --git a/.github/workflows/test-fips.yml b/.github/workflows/test-fips.yml new file mode 100644 index 0000000000..b7ee35e68b --- /dev/null +++ b/.github/workflows/test-fips.yml @@ -0,0 +1,64 @@ +name: test-fips + +# Test FIPS 140 compliance by running tests inside a FIPS-140-configured +# Docker container (the Chainguard base FIPS container). This is run weekly +# (no need to run for every commit or PR). Slack is notified if the weekly run +# fails. + +on: + workflow_dispatch: + schedule: + # Every Tuesday at 6:00 AM + - cron: '0 6 * * 2' + +# Limit the access of the generated GITHUB_TOKEN. +permissions: + contents: read + +jobs: + test-fips: + runs-on: ubuntu-24.04 + # https://docs.github.com/en/actions/writing-workflows/choosing-where-your-workflow-runs/running-jobs-in-a-container + # docker run -it --rm --name fipsy docker.elastic.co/wolfi/chainguard-base-fips:latest + container: + image: docker.elastic.co/wolfi/chainguard-base-fips:latest@sha256:60d2da332337ed2252d3ad06d0b51416adf72448e61215103e9e73657dff63a9 + credentials: + username: ${{ secrets.ELASTIC_DOCKER_USERNAME }} + password: ${{ secrets.ELASTIC_DOCKER_PASSWORD }} + timeout-minutes: 30 + steps: + - run: | + apk update + apk add nodejs npm + - uses: actions/checkout@v4 + - name: Is Node.js running in FIPS mode? + run: | + node -e 'const isFips = require("node:crypto").getFips(); console.log("isFips:", isFips); assert(isFips)' + - run: npm ci + - run: node test/test.js + env: + # TEST_WITHOUT_SERVICES skips instrumentation tests that rely on a + # running service, like a database. This var was added because I + # don't know how to get GH Action `services:` to be available to this + # test suite running in the `container:`. This shouldn't matter for + # FIPS-related testing because no instrumentations use crypto. + TEST_WITHOUT_SERVICES: 'true' + + # Pull Slack notification handling out to a separate job, because I cannot + # get it working inside the container. + notify-on-failure: + if: always() + runs-on: ubuntu-24.04 + needs: test-fips + steps: + - id: check + uses: elastic/oblt-actions/check-dependent-jobs@v1 + with: + jobs: ${{ toJSON(needs) }} + - name: Notify in Slack + if: steps.check.outputs.status == 'failure' + uses: elastic/oblt-actions/slack/notify-result@v1.16.0 + with: + bot-token: ${{ secrets.SLACK_BOT_TOKEN }} + channel-id: "#apm-agent-node" + message: ':warning: test-fips workflow run ${{ github.run_id }} failed' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index adcd56b3e7..160def573a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ permissions: jobs: lint: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -96,7 +96,7 @@ jobs: image: mcr.microsoft.com/mssql/server env: ACCEPT_EULA: 'Y' - SA_PASSWORD: 'Very(!)Secure' + MSSQL_SA_PASSWORD: 'Very(!)Secure' MSSQL_PID: 'Developer' ports: - 1433:1433 @@ -104,7 +104,7 @@ jobs: - nodemssqldata:/var/opt/mssql elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.0.0 env: ES_JAVA_OPTS: '-Xms512m -Xmx512m' network.host: '_site_' @@ -164,7 +164,7 @@ jobs: - '16.0' - '14' - '14.17' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -175,15 +175,6 @@ jobs: - run: npm ls --all || true - name: npm test run: npm test - - uses: inception-health/otel-upload-test-artifact-action@v1 - if: always() - continue-on-error: true - with: - jobName: "test-vers (${{ matrix.node }})" - stepName: "npm test" - path: "test_output/*.junit.xml" - type: "junit" - githubToken: ${{ secrets.GITHUB_TOKEN }} test-windows: runs-on: windows-latest @@ -206,14 +197,14 @@ jobs: # failure if at least one job listed "needs" is not successful. test: if: always() - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: - lint - test-vers - test-windows steps: - id: check - uses: elastic/apm-pipeline-library/.github/actions/check-dependent-jobs@current + uses: elastic/oblt-actions/check-dependent-jobs@v1 with: - needs: ${{ toJSON(needs) }} - - run: ${{ steps.check.outputs.isSuccess }} + jobs: ${{ toJSON(needs) }} + - run: ${{ steps.check.outputs.is-success }} diff --git a/.github/workflows/updatecli.yml b/.github/workflows/updatecli.yml index 090d3f8b1d..7f31aea0fd 100644 --- a/.github/workflows/updatecli.yml +++ b/.github/workflows/updatecli.yml @@ -9,21 +9,49 @@ permissions: contents: read jobs: - bump: - runs-on: ubuntu-latest + compose: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: read steps: - uses: actions/checkout@v4 - - uses: elastic/apm-pipeline-library/.github/actions/updatecli@current + + - name: Get token + id: get_token + uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a # v2.1.0 + with: + app_id: ${{ secrets.OBS_AUTOMATION_APP_ID }} + private_key: ${{ secrets.OBS_AUTOMATION_APP_PEM }} + permissions: >- + { + "contents": "write", + "pull_requests": "write" + } + + - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - uses: elastic/oblt-actions/updatecli/run@v1 + with: + command: --experimental compose diff + version-file: .tool-versions + env: + GITHUB_TOKEN: ${{ steps.get_token.outputs.token }} + + - uses: elastic/oblt-actions/updatecli/run@v1 with: - vaultUrl: ${{ secrets.VAULT_ADDR }} - vaultRoleId: ${{ secrets.VAULT_ROLE_ID }} - vaultSecretId: ${{ secrets.VAULT_SECRET_ID }} - pipeline: .ci/updatecli/updatecli.d - values: .ci/updatecli/values.yml + command: --experimental compose apply + version-file: .tool-versions + env: + GITHUB_TOKEN: ${{ steps.get_token.outputs.token }} + - if: failure() - uses: elastic/apm-pipeline-library/.github/actions/notify-build-status@current + uses: elastic/oblt-actions/slack/send@v1 with: - vaultUrl: ${{ secrets.VAULT_ADDR }} - vaultRoleId: ${{ secrets.VAULT_ROLE_ID }} - vaultSecretId: ${{ secrets.VAULT_SECRET_ID }} - slackChannel: "#apm-agent-node" + bot-token: ${{ secrets.SLACK_BOT_TOKEN }} + channel-id: "#apm-agent-node" + message: ":traffic_cone: updatecli failed for `${{ github.repository }}@${{ github.ref_name }}`, @robots-ci please look what's going on " diff --git a/.gitignore b/.gitignore index cf0a8d7eda..a7c9a7c99d 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,6 @@ /test-suite-output.tap # Folders to ignore -/.nyc_output -/test_output /build node_modules /test/benchmarks/.tmp diff --git a/.tav.yml b/.tav.yml index 7fd1ae6e54..55b6b92c0a 100644 --- a/.tav.yml +++ b/.tav.yml @@ -186,47 +186,51 @@ graphql: commands: node test/instrumentation/modules/graphql.test.js express: - versions: - mode: latest-minors - # include requires an upper bound. v5 is still in beta - # (5.0.0-beta.1": "2022-02-15T01:11:25.229Z) but we use 6 to make sure any - # future release is included if we udpate - include: '>=4 <6' # latest minors subset of '>=4 <6' - commands: - - node test/instrumentation/modules/express/basic.test.js - - node test/instrumentation/modules/express/capture-exceptions-off.test.js - - node test/instrumentation/modules/express/capture-exceptions-on.test.js - - node test/instrumentation/modules/express/set-framework.test.js + - versions: + mode: latest-minors + include: '>=5 <6' + node: '>=18' + commands: + - node test/instrumentation/modules/express/basic.test.js + - node test/instrumentation/modules/express/capture-exceptions-off.test.js + - node test/instrumentation/modules/express/capture-exceptions-on.test.js + - node test/instrumentation/modules/express/set-framework.test.js + - versions: + mode: latest-minors + include: '>=4 <5' + commands: + - node test/instrumentation/modules/express/basic.test.js + - node test/instrumentation/modules/express/capture-exceptions-off.test.js + - node test/instrumentation/modules/express/capture-exceptions-on.test.js + - node test/instrumentation/modules/express/set-framework.test.js apollo-server-express: - # We want this version range: - # versions: '>=2.9.16 <2.2 || >= 2.3.2 <3' - # but only the latest MAJOR.MINOR.x to reduce the test matrix. - # - # Maintenance note: This should be updated for newer MAJOR.MINOR releases. - - versions: '2.9.16 || 2.10.1 || 2.11.0 || 2.12.0 || 2.13.1 || 2.14.5 || 2.15.1 || 2.16.1 || 2.17.0 || 2.18.2 || 2.19.2 || 2.20.0 || 2.21.2 || 2.22.2 || 2.23.0 || 2.24.1 || 2.25.0 || >2.25.x <3' - peerDependencies: graphql@^14.0.0 + - versions: + include: '>=2.9.16 <3' + mode: latest-minors + peerDependencies: + - graphql@^14.0.0 + - express@^4.17.1 node: '>=6' commands: node test/instrumentation/modules/apollo-server-express.test.js # We want this version range (2.12.0 was the first release of - # apollo-server-express after graphql@15 was released): - # versions: '>=2.12.0 <3' - # but only the latest MAJOR.MINOR.x to reduce the test matrix. - # - # Maintenance note: This should be updated for newer MAJOR.MINOR releases. - - versions: '2.15.1 || 2.16.1 || 2.17.0 || 2.18.2 || 2.19.2 || 2.20.0 || 2.21.2 || 2.22.2 || 2.23.0 || 2.24.1 || 2.25.0 || >2.25.x <3' - peerDependencies: graphql@^15.0.0 + # apollo-server-express after graphql@15 was released) + - versions: + include: '>=2.12.0 <3' + mode: latest-minors + peerDependencies: + - graphql@^15.0.0 + - express@^4.17.1 # Per https://github.com/graphql/graphql-js/releases/tag/v15.0.0 # graphql v15 supports node v8 as a minimum. node: '>=8' commands: node test/instrumentation/modules/apollo-server-express.test.js - # We want this version range: - # versions: '^3.0.0' - # but only test the latest MAJOR.MINOR.x to reduce the test matrix. - # - # Maintenance note: This should be updated for newer MAJOR.MINOR releases. - - versions: '3.0.2 || 3.1.2 || 3.2.0 || 3.3.0 || 3.4.1 || 3.5.0 || 3.6.8 || 3.7.0 || 3.8.2 || 3.9.0 || ^3.10.2' - peerDependencies: graphql@^15.0.0 + - versions: + include: '>=3.0.0 <4' + mode: latest-minors + peerDependencies: + - graphql@^15.0.0 + - express@^4.17.1 commands: node test/instrumentation/modules/apollo-server-express.test.js express-queue: @@ -234,14 +238,24 @@ express-queue: commands: node test/instrumentation/modules/express-queue.test.js koa-router: - versions: '>=5.2.0 <13' - peerDependencies: koa@2 - commands: node test/instrumentation/modules/koa-router/old-name.test.js + - versions: '>=5.2.0 <13' + peerDependencies: koa@2 + commands: node test/instrumentation/modules/koa-router/old-name.test.js + # koa-router@13 removed support for NodeJS <18 + - versions: '>=13 <14' + node: '>=18' + peerDependencies: koa@2 + commands: node test/instrumentation/modules/koa-router/old-name.test.js '@koa/router': - versions: '>=8 <13' - peerDependencies: koa@2 - commands: node test/instrumentation/modules/koa-router/new-name.test.js + - versions: '>=8 <13' + peerDependencies: koa@2 + commands: node test/instrumentation/modules/koa-router/new-name.test.js + # @koa/router@13 removed support for NodeJS <18 + - versions: '>=13 <14' + node: '>=18' + peerDependencies: koa@2 + commands: node test/instrumentation/modules/koa-router/new-name.test.js elasticsearch: versions: '>=8.0.0' @@ -259,15 +273,33 @@ elasticsearch: # "8.2.0" because they are stuck with stack version numbers. However, # semver (and TAV) consider "-patch.N" to be a *prereleases*. This # leads to some tortured "versions:" ranges below. +# - Version 8.11.0 dropped node v14 and v16 support. +# - Version 9 dropped v18 support (effectively by using undici@7). '@elastic/elasticsearch': - - versions: '>=7.0.0 <7.7.0 || >7.7.0 <7.12.0' + - versions: + mode: max-3 + include: '>=7.0.0 <7.7.0 || >7.7.0 <7.12.0' commands: node test/instrumentation/modules/@elastic/elasticsearch.test.js - - versions: '>=7.12.0 <8.2' + - versions: + mode: max-3 + include: '>=7.12.0 <8.2' node: '>=12.0.0' commands: node test/instrumentation/modules/@elastic/elasticsearch.test.js - - versions: '>=8.2.0-patch.1 <8.2.0 || >8.2.0' + - versions: + mode: max-3 + include: '>8.2.0 <8.11.0' node: '>=14.0.0' commands: node test/instrumentation/modules/@elastic/elasticsearch.test.js + - versions: + mode: max-5 + include: '>=8.11.0 <9.0.0' + node: '>=18.0.0' + commands: node test/instrumentation/modules/@elastic/elasticsearch.test.js + - versions: + mode: max-5 + include: '>=9.0.0 <10' + node: '>=20.0.0' + commands: node test/instrumentation/modules/@elastic/elasticsearch.test.js handlebars: versions: @@ -342,11 +374,21 @@ tedious: mode: latest-majors node: '18.x || >=20' commands: node test/instrumentation/modules/tedious.test.js + # Tedious v19 advertise a min-supported Node.js version of 18.17.0. + - versions: + include: '>=19 <20' + mode: latest-majors + node: '>=18.17' + commands: node test/instrumentation/modules/tedious.test.js cassandra-driver: # 3.1.0 is broken - versions: '>=3 <3.1.0 || >3.1.0 <5' - commands: node test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js + - versions: '>=3 <3.1.0 || >3.1.0 <4.8.0' + commands: node test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js + # v4.8.0 advertise a min-supported Node.js version of 18. + - versions: '>=4.8.0 <5' + node: '>=18' + commands: node test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js # Restify # - restify =5 <6' + peerDependencies: '@fastify/formbody@^8' + node: '>=20' + commands: + - node test/instrumentation/modules/fastify/fastify.test.js + - node test/instrumentation/modules/fastify/async-await.test.js + - node test/instrumentation/modules/fastify/set-framework.test.js finalhandler: - versions: '*' - commands: node test/instrumentation/modules/finalhandler.test.js + - versions: + mode: max-3 + include: '>=1 <2' + peerDependencies: 'express@^4.17.1' + node: '>=0.8' + commands: node test/instrumentation/modules/finalhandler.test.js + - versions: + mode: max-3 + include: '>=2 <3' + node: '>=16' + commands: node test/instrumentation/modules/finalhandler.test.js memcached: versions: '>=2.2.0' @@ -441,14 +501,20 @@ aws-sdk: - node test/instrumentation/modules/aws-sdk/dynamodb.test.js '@aws-sdk/client-s3': - versions: - # - 3.377.0 was a bad release (https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1828#issuecomment-1834276719) - mode: max-7 - include: '>=3.15.0 <4' - exclude: '3.377.0' - commands: - - node test/instrumentation/modules/@aws-sdk/client-s3.test.js - node: '>=14' + - versions: + # - 3.377.0 was a bad release (https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1828#issuecomment-1834276719) + mode: max-5 + include: '>=3.15.0 <3.723.0' + exclude: '3.377.0' + node: '>=14' + commands: + - node test/instrumentation/modules/@aws-sdk/client-s3.test.js + - versions: + mode: max-5 + include: '>=3.723.0 <4' + node: '>=18' + commands: + - node test/instrumentation/modules/@aws-sdk/client-s3.test.js '@aws-sdk/client-dynamodb': versions: @@ -459,25 +525,42 @@ aws-sdk: node: '>=14' '@aws-sdk/client-sns': - versions: - mode: max-7 - include: '>=3.15.0 <4' - commands: - - node test/instrumentation/modules/@aws-sdk/client-sns.test.js - node: '>=14' + - versions: + mode: max-7 + include: '>=3.15.0 <3.723.0' + node: '>=14' + commands: + - node test/instrumentation/modules/@aws-sdk/client-sns.test.js + - versions: + mode: max-5 + include: '>=3.723.0 <4' + node: '>=18' + commands: + - node test/instrumentation/modules/@aws-sdk/client-sns.test.js '@aws-sdk/client-sqs': - versions: - mode: max-7 - include: '>=3.15.0 <4' - commands: - - node test/instrumentation/modules/@aws-sdk/client-sqs.test.js - node: '>=14' + - versions: + mode: max-7 + include: '>=3.15.0 <3.723.0' + node: '>=14' + commands: + - node test/instrumentation/modules/@aws-sdk/client-sqs.test.js + - versions: + mode: max-5 + include: '>=3.723.0 <4' + node: '>=18' + commands: + - node test/instrumentation/modules/@aws-sdk/client-sqs.test.js # - undici@4.7.0 added its diagnostics_channel support. # - In undici@4.7.1 the `request.origin` property was added, which we need # in the 'undici:request:create' diagnostic message. undici: + - versions: + mode: max-7 + include: '>=7.0.0 <8' + node: '>=20.18.1' + commands: node test/instrumentation/modules/undici/undici.test.js - versions: mode: max-7 include: '>=6.0.0 <7' diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000000..0b4ee7806c --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +updatecli v0.99.0 \ No newline at end of file diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc deleted file mode 100644 index fde29a4ea2..0000000000 --- a/CHANGELOG.asciidoc +++ /dev/null @@ -1,2815 +0,0 @@ -ifdef::env-github[] -NOTE: Release notes are best read in our documentation at -https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes.html[elastic.co] -endif::[] - -//// -Notes: -1. When adding a changelog entry, if the "Unreleased" section doesn't yet exist, - please add the following under the "=== Node.js Agent version 4.x" header: - - ==== Unreleased - - [float] - ===== Breaking changes - - [float] - ===== Features - - [float] - ===== Bug fixes - - [float] - ===== Chores - -2. When making a release, change the "==== Unreleased" section header to: - - [[release-notes-x.x.x]] - ==== x.x.x - YYYY/MM/DD -//// - -[[release-notes-4.x]] -=== Node.js Agent version 4.x - -See the <> guide. - - -==== Unreleased - -[float] -===== Breaking changes - -[float] -===== Features - -[float] -===== Bug fixes - -* Mark the published AWS Lambda layers as supporting the "nodejs20.x" Lambda - Runtime (`--compatible-runtimes`). The "nodejs20.x" runtime was released by - AWS on 2023-11-15. ({issues}4033[#4033]) -+ -Note that this Node.js APM agent supports Node.js 20.x, so the new AWS Lambda -runtime was supported when it was released. However, the metadata stating -compatible runtimes (which is advisory) was not updated until now. - -[float] -===== Chores - - -[[release-notes-4.5.4]] -==== 4.5.4 - 2024/05/13 - -[float] -===== Bug fixes - -* Change how the "cookie" HTTP request header is represented in APM transaction - data to avoid a rare, but possible, intake bug where the transaction could be - rejected due to a mapping conflict. -+ -Before this change a `Cookie: foo=bar; sessionid=42` HTTP request header -would be represented in the transaction document in Elasticsearch with these -document fields (the example assumes <> matches -"sessionid", as it does by default): -+ -[source] ----- -http.request.headers.cookie: "[REDACTED]" -... -http.request.cookies.foo: "bar" -http.request.cookies.sessionid: "[REDACTED]" ----- -+ -After this change it is represented as: -+ -[source] ----- -http.request.headers.cookie: "foo=bar; sessionid=REDACTED" ----- -+ -In other words, `http.request.cookies` are no longer separated out. -({issues}4006[#4006]) - - -[[release-notes-4.5.3]] -==== 4.5.3 - 2024/04/23 - -[float] -===== Bug fixes - -* Fix message handling for tombstone messages in `kafkajs` instrumentation. - ({pull}3985[#3985]) - - -[[release-notes-4.5.2]] -==== 4.5.2 - 2024/04/12 - -[float] -===== Bug fixes - -* Fix path resolution for requests that contain invalid characters in its - host header. ({pull}3923[#3923]) -* Fix span names for `getMore` command of mongodb. ({pull}3919[#3919]) -* Fix undici instrumentation to cope with a bug in undici@6.11.0 where - `request.addHeader()` was accidentally removed. (It was re-added in - undici@6.11.1.) ({pull}3963[#3963]) -* Update undici instrumentation to avoid possibly adding a *second* - 'traceparent' header to outgoing HTTP requests, because this can break - Elasticsearch requests. ({issues}3964[#3964]) - - -[[release-notes-4.5.0]] -==== 4.5.0 - 2024/03/13 - -[float] -===== Features - -* Update <> support to `@opentelemetry/api` version 1.8.0. -* Update `tedious` instrumentation to support versions 17 and 18. ({pull}3901[#3901], {pull}3911[#3911]) -* Add new `kafkajs` instrumentation. ({issues}2905[#2905]) - -[float] -===== Bug fixes - -* Fix instrumentation of mongodb to not break mongodb@6.4.0. Mongodb v6.4.0 - included changes that resulted in the APM agent's instrumentation breaking it. - ({pull}3897[#3897]) -* Fix hostname detection on Windows in some cases (where a powershell profile - could break collection). ({pull}3899[#3899]) -* Fix a path normalization issue that broke (or partially broke) instrumentation - of some modules on Windows: Next.js, redis v4+, mongodb. ({pull}3905[#3905]) - - -[[release-notes-4.4.1]] -==== 4.4.1 - 2024/02/06 - -[float] -===== Bug fixes - -* Add support for <> with - Node.js versions matching `^18.19.0 || >=20.2.0`. Before this version of - the APM agent, ESM instrumentation was only supported for some *earlier* - Node.js versions. Changes in Node.js's ESM loader in v18.19.0 and v20 broke - earlier ESM support. ({issues}3784[#3784], {pull}3844[#3844]) - - -[[release-notes-4.4.0]] -==== 4.4.0 - 2024/01/12 - -*Known issue*: Using the APM agent's <> with Node.js *v18.19.0* is not -supported in this version. Upgrade to APM agent version v4.5.0 or later, or use -Node.js v18.18.1 or earlier. -See https://github.com/elastic/apm-agent-nodejs/issues/3784 for details. - -[float] -===== Features - -* Support `ELASTIC_APM_ACTIVATION_METHOD=K8S_ATTACH` (in addition to the - current `K8S` value) to indicate the agent is being started by - apm-k8s-attacher. Newer releases of apm-k8s-attacher will be using this - value (to have a common value used between APM agents). - -[float] -===== Bug fixes - -* Fix bug where `NODE_ENV` environment value was not used as a default for - the <> config setting. The bug was introduced in v4.2.0. - ({issues}3807[#3807]) - -* Improve Fastify instrumentation to no longer cause the https://fastify.dev/docs/latest/Reference/Warnings/#FSTDEP017[`FSTDEP017`] - and https://fastify.dev/docs/latest/Reference/Warnings/#FSTDEP018[`FSTDEP018`] - deprecation warnings. ({pull}3814[#3814]) - - -[[release-notes-4.3.0]] -==== 4.3.0 - 2023/12/05 - -*Known issue*: Using the APM agent's <> with Node.js *v18.19.0* is not -supported in this version. Upgrade to APM agent version v4.5.0 or later, or use -Node.js v18.18.1 or earlier. -See https://github.com/elastic/apm-agent-nodejs/issues/3784 for details. - -[float] -===== Features - -* Add the <> config option, to allow adding custom headers - to HTTP requests made to APM server by the APM agent. ({issues}3759[#3759]) - -[float] -===== Bug fixes - -* Fix the dependency version range for `@elastic/ecs-pino-format`. - ({issues}3774[#3774]) - -[float] -===== Chores - -* Skip undici tests for `undici` `>=5.28.0` and NodeJS `<14.18.0`. - ({pull}3755[#3755]) - -* Change the log level of `Sending error to Elastic APM: ...` from `info` to - `debug`. There is no need to clutter the log output with this message. - ({issues}3748[#3748]) - -* Explicitly mark this package as being of type="commonjs". The experimental - `node --experimental-default-type=module ...` option - https://nodejs.org/en/blog/release/v20.10.0#--experimental-default-type-flag-to-flip-module-defaults[added in Node.js v20.10.0] - means that a default to "commonjs" isn't guaranteed. - - -[[release-notes-4.2.0]] -==== 4.2.0 - 2023/11/23 - -[float] -===== Breaking changes - -* Drop support for next@11. Next.js instrumentation support is currently in - technical preview, so it is not considered a semver-major change to drop - support for this old version of next. ({pull}3664[#3664]) - -[float] -===== Features - -* Add <>, <>, and - <>. These are intended for use by - {ecs-logging-nodejs-ref}/intro.html[ecs-logging-nodejs formatting packages]. - See . - ({issues}3195[#3195]) - -* Add knex@3 instrumentation. ({pull}3659[#3659]) - -* Update <> support to `@opentelemetry/api` version 1.7.0. - -[float] -===== Bug fixes - -* Fix `mongodb` instrumentation to avoid loosing context when multiple cursors - are running concurrently. ({issues}3161[#3161]) - -* Set `mongodb` span's outcome according to the result of the command being traced. - ({pull}3695[#3695]) - -* Fix `@aws-sdk/client-sqs` instrumentation which was failing for `SendMessageBatch` - command when any of the entities does not contain `MessageAttributes`. - ({issues}3746[#3746]) - - -[[release-notes-4.1.0]] -==== 4.1.0 - 2023/10/09 - -[float] -===== Features - -* Update <> support to `@opentelemetry/api` version 1.6.0. - {pull}3622[#3622] - -* Add support for `@aws-sdk/client-dynamodb`, one of the AWS SDK v3 clients. - ({issues}2958[#2958]) - -* Add support for `@aws-sdk/client-sns`, one of the AWS SDK v3 clients. - ({issues}2956[#2956]) - -* Add support for `@aws-sdk/client-sqs`, one of the AWS SDK v3 clients. - ({issues}2957[#2957]) - -* Fixes for some values of the <> config setting. - "redis" will now properly disable instrumentation for redis@4. - "next" will propertly disable all Next.js instrumentation. - ({pull}3658[#3658]) - -[float] -===== Bug fixes - -* Changes to cloud metadata collection for Google Cloud (GCP). Most notably - the `cloud.project.id` field is now the `project-id` from - https://cloud.google.com/compute/docs/metadata/default-metadata-values#project_metadata - rather than the `numeric-project-id`. This matches the value produced by - Elastic Beats (like filebeat). {issues}3614[#3614] - - -[[release-notes-4.0.0]] -==== 4.0.0 - 2023/09/07 - -See the <> guide. - -[float] -===== Breaking changes - -* Set the new minimum supported Node.js to version 14.17.0. - Users of earlier Node.js versions can use elastic-apm-node v3.x, which - supports back to Node.js v8.6. - -* Ignore a `timer` option passed to `startTransaction()` and `startSpan()` APIs. - This option was never documented. It would be surprising if any user is - impacted by this. - -* Remove long deprecated support for the `ELASTIC_APM_`-prefixed environment - variables for the <>. For - example, one must use `KUBERNETES_POD_NAME` and not - `ELASTIC_APM_KUBERNETES_POD_NAME`. ({issues}2661[#2661]) - -* The config option `filterHttpHeaders` is now _removed_. ({pull}3539[#3539]) - -* Remove the deprecated `span.toString()` and `transaction.toString()` APIs. - See <> for details. ({issues}2348[#2348]) - -* Remove instrumentation support for the old 'hapi' package -- the current - '@hapi/hapi' package is still instrumented. ({issues}2691[#2691]) - -* Change `apm.startTransaction()` api to return a noop transaction instead of - null, if the agent is not yet started. ({issues}2429[#2429]) - -* Drop support for the obsolete "patch" context manager, i.e. the - `contextManager: "patch"` config option. This was a limited async context - management that predated the preferred `AsyncLocalStorage` core Node.js - mechanism for context tracking. It was deprecated in v3.37.0. As well, the - related and deprecated `asyncHooks` config option has been removed. - ({issues}3529[#3529]) - -* Remove the `logUncaughtExceptions` config option. - See <> for details. - ({issues}2412[#2412]) - -* Remove `transaction.subtype` and `transaction.action` properties from API. - This also impacts <> and `transaction.setType(...)`, - both of which now no longer accept `subtype` and `action` parameters. - These two properties were deprecated in v3.25.0. - ({issues}3557[#3557]) - -* Remove support for the erroneous `ELASTIC_SANITIZE_FIELD_NAMES` and - `ELASTIC_IGNORE_MESSAGE_QUEUES` config environment variables. The correct env - vars are `ELASTIC_APM_SANITIZE_FIELD_NAMES` and - `ELASTIC_APM_IGNORE_MESSAGE_QUEUES`, respectively, and were supported starting - in v3.36.0. - -[float] -===== Features - -* The `apm.destroy()` method is now async. Almost no users should need to use - this method. However, if used, to be sure to wait for APM agent shutdown to - be complete, one can now `await apm.destroy()`. ({issues}3222[#3222]) - -* Support instrumenting `mongodb` v6. ({pull}3596[#3596]) - -[float] -===== Bug fixes - -* Fix instrumentation of `mongodb` to avoid multiple command handler - registrations when client is created via `MongoClient.connect` static - method. ({pull}3586[#3586]) - -[float] -===== Chores - -* Add a warning message when a duration or size config option is provided - without units. ({issues}2121[#2121]) - -* Change default value of `useElasticTraceparentHeader` config option to `false`. - This means that for outgoing HTTP requests, the APM agent will no longer add the - `elastic-apm-traceparent` header. This vendor-specific header was used in the past - while the https://w3c.github.io/trace-context/[W3C trace-context] spec was still - in development. Now that it is in wide use, the `elastic-apm-traceparent` header is - only useful for interaction with very old Elastic APM agents. - -* Add default ports into `context.service.target.name` for HTTP spans conforming to the - spec update done in https://github.com/elastic/apm/pull/700 ({pull}3590[#3590]) - - -[[release-notes-3.x]] -=== Node.js Agent version 3.x - -NOTE: "3.x" releases are now maintenance releases. -See https://www.elastic.co/guide/en/apm/agent/nodejs/3.x/release-notes-3.x.html[the 3.x release notes in the "3.x" branch] -for the most recent 3.x releases. The 3.x branch will be maintained until -2024-03-07 (6 months after the 4.0.0 release). - - -[[release-notes-3.49.1]] -==== 3.49.1 - 2023/08/09 - -[float] -===== Bug fixes - -* Upgrade import-in-the-middle dependency to v1.4.2 to fix a vulnerability - (https://github.com/DataDog/import-in-the-middle/security/advisories/GHSA-5r27-rw8r-7967[CVE-2023-38704]). - Note: This dependency is only used by elastic-apm-node when using the - <>. ({pull}3569[#3569]) - -[float] -===== Chores - -* Add debug logging for 4xx responses from APM server when polling for - central config. This is based on https://github.com/elastic/apm-nodejs-http-client/pull/182 - by @linjunpop. - - -[[release-notes-3.49.0]] -==== 3.49.0 - 2023/08/03 - -[float] -===== Bug fixes - -* Fix ESM support: the "loader.mjs" file was accidentally not included in - the published package in v3.48.0. ({pull}3534[#3534]) - -* Fix instrumentation of `@aws-sdk/client-s3` from v3.378.0 and up. The new - version requires `@smithy/smithy-client` v2.0.1 and the agent was - instrumenting it within the semver range '>=1 <2'. ({issues}3523[#3523]) - -* Fix wrapping of `http.request()` for node v18.17.0. Before this change, a - call with a non-Function callback -- `http.request(urlString, {}, 'this-is-not-a-cb-function')` - -- would accidentally *not* fail because of the agent's instrumentation. - ({pull}3511[#3511]) - -* Fix tedious instrumentation to recognize "connection.prepare()" usage in - tedious@16.2.0 and later. ({pull}3470[#3470]) - -[float] -===== Chores - -* Add min node verison in `tav.json` to generate lighter matrix for TAV commands. - ({pull}3531[#3531]) - -* Inline the `elastic-apm-http-client` package code into this repo. - ({issues}3506[#3506]) - - -[[release-notes-3.48.0]] -==== 3.48.0 - 2023/07/07 - -*Known issue*: You must upgrade to 3.49.0 or later for the ESM support -described below to work, because the "loader.mjs" file was accidentally not -published. - -[float] -===== Features - -* Initial and experimental ECMAScript Module (ESM) support. - With the following invocation the APM agent will now be able to instrument - modules loaded via `import`. (See the https://nodejs.org/api/esm.html#introduction[Node.js introduction to ESM].) -+ -[source,bash] ----- -node -r elastic-apm-node/start.js \ - --experimental-loader=elastic-apm-node/loader.mjs \ - server.mjs - -# or - -NODE_OPTIONS='-r elastic-apm-node/start.js --experimental-loader=elastic-apm-node/loader.mjs' -node server.mjs ----- -+ -The new usage requirement is the `--experimental-loader=elastic-apm-node/loader.mjs` option. -This initial release only includes support for instrumenting a subset of the -modules listed at <>. This set will grow in subsequent -versions. Notably, ESM support does not currently work in node v20 -- only in -recent versions of node v12-v18. ESM support will remain experimental while the -https://nodejs.org/api/esm.html#loaders[Node.js Loaders API] is experimental. -See <> for full details. - -* Send `configured_hostname` and `detected_hostname` metadata separately, - rather than the old deprecated single `hostname` metadatum. As well, the - detected hostname now attempts to collect a FQDN to be used in the - `host.name` field in the Elasticsearch document. ({issues}3310[#3310]) - -[float] -===== Bug fixes - -* Ensure `apm.setGlobalLabel(...)` does not throw an error when apm is inactive. - ({issues}3442[#3442]) - -* Set the trace-context for an incoming HTTP/2 request. Contributed by @paulish. - ({issues}1830[#1830]) - -* Fix aws-sdk v3 instrumentation (currently just `@aws-sdk/client-s3`) for - versions 3.363.0 and later. ({pull}3455[#3455]) - -* Fix a possible crash when using `getSignedUrl()` from `@aws-sdk/s3-request-presigner` - due to a bug in `@aws-sdk/client-s3` instrumentation. ({issues}3464[#3464]) - - -[[release-notes-3.47.0]] -==== 3.47.0 - 2023/06/14 - -[float] -===== Features - -* Add support for `knex` version v1 and v2. ({pull}3355[#3355]) - -* Add `tedious@16.x` support. ({pull}3366[#3366]) - -* Add `apm.setGlobalLabel()` to dynamically extend the `globalLabels` set in - the initial config. Refer to <> for details. ({pull}3337[#3337]) - -[float] -===== Bug fixes - -* Change the "start.js" export to *not* start the APM agent inside a - https://nodejs.org/api/worker_threads.html[Node.js Worker thread]. -+ -One way to start the APM agent is via `node -r elastic-apm-node/start.js ...` or -`NODE_OPTIONS='-r elastic-apm-node/start.js`. When a Node.js Worker thread is -started, it inherits the `process.execArgv` and environment, which results in -"start.js" being run in the context of the new thread. Starting an additional -APM agent in each new Worker is arguably surprising. For now, "start.js" will -avoid starting in a thread. The exact behavior may change in future versions. -+ -One undesirable effect of this change is that explicit use of "start.js" in -code (`import 'elastic-apm-node/start.js'` or `require('elastic-apm-node/start.js')`) -in a Worker will *not* start the APM agent. Instead, one must use: -`require('elastic-apm-node').start()` or equivalent. - -* Avoid redaction of response headers while extracting `transaction.context.response` - data from the HTTP response. Contributed by @lytc. ({pull}3427[#3427]) - -[float] -===== Chores - -* Refactor transport handling to new internal `apm-client` module. - ({pull}3372[#3372]) - - -[[release-notes-3.46.0]] -==== 3.46.0 - 2023/05/15 - -[float] -===== Features - -* Add support for `@aws-sdk/client-s3`, one of the AWS SDK v3 clients. - ({pull}3287[#3287]) - -* Add support for `@apollo/server@4` -- the new Apollo Server package which - replaces `apollo-server`, `apollo-server-express`, etc. Contributed by - @jmesimak. ({pull}3203[#3203]) - -* Add <> support for Fastify instrumentation. - Contributed by @xxzefgh. ({pull}2681[#2681]) - -* Add support for mysql2@3. Contributed by @firecow. ({pull}3301[#3301]) - -* Improve error handling with AWS Lambda. When used together with the - https://github.com/elastic/apm-aws-lambda[Elastic AWS Lambda extension] - v1.4.0 or greater, the APM agent will pre-register a partial transaction - before the user's handler function is run. If the handler function fails - with a Lambda timeout, `uncaughtException`, `unhandledRejection`, or crash - then the Lambda extension will report the failed transaction so it can be - seen in the Kibana APM app. ({pull}3285[#3285]) - -* Add OpenTelemetry Metrics API and Metrics SDK support. This is currently - experimental and may change. With this change, you may use the OpenTelemetry - Metrics API to create custom metrics and the APM agent will ship those - metrics to APM server. As well, you may use the OpenTelemetry Metrics SDK - and the APM agent will automatically add a MetricReader to ship metrics to - APM server. See the <> for details. ({pull}3152[#3152]) - - -[float] -===== Chores - -* The config option `filterHttpHeaders` is now *deprecated*. It will be - removed in a future major version. ({pull}3333[#3333]) - -* Add cookie map in transactions' request context and redact cookie header ({pull}3322[#3322]) - -* Stop testing `express-graphql` instrumentation -- the module is deprecated. - ({pull}3304[#3304]) - - -[[release-notes-3.45.0]] -==== 3.45.0 2023/04/28 - -[float] -===== Features - -* Add `aws.s3.bucket` and `aws.s3.key` attributes for OpenTelemetry in S3 instrumentation. - Spec https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/semantic_conventions/trace/instrumentation/aws-sdk.yml#L435 - ({issues}3150[#3150]). - -[float] -===== Bug fixes - -* Fix a possible crash in AWS Lambda Function instrumentation when an ELB- - or API Gateway-triggered invocation received an `event` object with no - `headers` field. ({issues}3286[#3286]) - -* Fix an edge case in instrumentation of `http.request()` and `https.request()` - with node v19.9.0 and recently nightly builds of node v20. - ({issues}3261[#3261]) - -[float] -===== Chores - -* Update "engines" to support node v20. ({pull}3278[#3278]) - -* Restrict Next.js instrumentation to `<13.3.0` for now, because of a known - issue with instrumentating the `next@13.3.0` dev server. ({issues}3263[#3263]) - - -[[release-notes-3.44.1]] -==== 3.44.1 2023/04/06 - -[float] -===== Bug fixes - -* Fix an issue where the APM agent receiving central config (from APM server) - containing a value for `sanitized_field_names` would crash. - ({issues}3247[#3247]) - - -[[release-notes-3.44.0]] -==== 3.44.0 2023/04/03 - -[float] -===== Features - -* Update the <> supported version of `@opentelemetry/api` - to version 1.4.x. ({pull}3239[#3239]) - -[float] -===== Bug fixes - -* Ensure `metadata.service.agent.activation_method` is only sent for APM - server version 8.7.1 or later. APM server 8.7.0 included a bug where - receiving `activation_method` is harmful. ({issues}3230[#3230]) - - -[[release-notes-3.43.0]] -==== 3.43.0 2023/03/02 - -[float] -===== Features - -* Support mongodb v5. ({issues}3138[#3138]) - -* Propagate trace-context in message attributes for SQS (SendMessage and - SendMessageBatch) and SNS (Publish), provided the maximum 10 message - attributes limit is not passed. SQS message reception (ReceiveMessage) and - SQS- and SNS-triggered Lambda functions already produce _span links_ for - incoming messages with trace-context. This allows linking between - producer and consumer in the Kibana APM app. ({pull}3044[#3044]) - -* Extend Lambda instrumentation to capture details for Lambda function URL - and ELB-triggered Lambdas. ({issues}2901[#2901]) - -* Make `Agent.flush()` return a `Promise` if no callback is passed as param. - This means that flush is now `await`able: `await apm.flush()`. - ({issues}2857[#2857]) - -[float] -===== Bug fixes - -* Fix the transaction name for *API* routes in Next.js >=13.2.x. Before this - change internal changes in next@13.2.0 resulted in transactions for Next.js - API routes being `{method} unknown route`. - -* Fix `metadata.service.agent.activation_method=k8s-attach` handling to - (a) use an explicit marker from the k8s apm attacher - (`ELASTIC_APM_ACTIVATION_METHOD`) and (b) use the specified "k8s-attach" - value, rather than the incorrect "k8s-attacher". - ({issue}3119[#3119]) - -* Add missing <> ({pull}3121[#3121]) and - <> Agent configuration options to the TypeScript types. - - -[[release-notes-3.42.0]] -==== 3.42.0 2023/01/18 - -[float] -===== Features - -* Support for tracing/monitoring https://learn.microsoft.com/en-us/azure/azure-functions/[Azure Functions]. - See the <> document. - ({pull}3071[#3071], https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-azure-functions.md[spec]) - -* Support `restify@11`. - -[float] -===== Bug fixes - -* Fix instrumentation of `http.request()` and `http.get()` (and the same - for `https.`) so that Basic auth fields are not lost. Before this change - if the first arg was a URL or string with `username` and/or `password` - values, e.g. `https://user:pass@...`, then the auth fields were not - included in the actual HTTP request. ({issues}2044[#2044]) - -* Fix `span.context.destination.service.resource` for S3 spans to have an - "s3/" prefix. -+ -*Note*: While this is considered a bugfix, but it can potentially be a breaking -change in the Kibana APM app: It can break the history of the S3-Spans / metrics -for users relying on `context.destination.service.resource`. If users happen to -run agents both with and without this fix (for same or different languages), the -same S3-buckets can appear twice in the service map (with and without -s3-prefix). - -* Ensure collected dropped spans stats follow the intake API type requirements. - Before this change `transaction.dropped_spans_stats[*].duration.sum.us` could - have been a floating-point value, but the intake API requires an int. The - result was dropped transactions and errors in the agent log. - ({issues}3104[#3104]) - -[float] -===== Chores - -* Add `service.agent.activation_method` metadatum. - Spec: https://github.com/elastic/apm/blob/main/specs/agents/metadata.md#activation-method - ({issues}3039[#3039]) - - -[[release-notes-3.41.1]] -==== 3.41.1 2022/12/21 - -[float] -===== Bug fixes - -* Fix a bug in span compression with sending spans that were buffered for - possible compression. Before this fix, in some cases a compressible span could - be sent *twice* or not sent at all. ({pull}3076[#3076]) - - -[[release-notes-3.41.0]] -==== 3.41.0 2022/12/12 - -[float] -===== Features - -* Capture HTTP context (status code, headers, etc.) on transactions (and - captured errors) for Lambda functions triggered by API Gateway. - ({issues}2419[#2419]) - -* Support instrumentation for restify@10. - -[float] -===== Bug fixes - -* Change default `serverUrl` from `http://localhost:8200` to `http://127.0.0.1:8200` - to avoid ambiguity between possible IPv4 and IPv6 DNS-resolved values for "localhost". - APM server only listens on IPv4 by default, so this avoids a possible surprising - mismatch. ({issues}3045[#3045]) - -* Add `tracestate` to the `TransactionOptions` TypeScript type for - `apm.startTransaction(..., options)`. ({issues}3061[#3061]) - -[float] -===== Chores - -* Mark the published Lambda layer as supporting the recently released - "nodejs18.x" Lambda Runtime (`--compatible-runtimes`). - - -[[release-notes-3.40.1]] -==== 3.40.1 2022/11/15 - -[float] -===== Bug fixes - -* Prevent a possible tight loop in central config fetching. ({issues}3029[#3029]) - - -[[release-notes-3.40.0]] -==== 3.40.0 2022/10/31 - -**Note**: This was a bad release. Users should upgrade to v3.40.1 or later. -This version of the agent could enter a tight loop re-fetching central config, -which increases network traffic, CPU usage, and load on the APM server. -See {issues}3029[issue #3029] for details. - -[float] -===== Features - -* Enable support for redis v4 ({pull}2945[#2945]) - -* preview:[] Next.js server-side instrumentation. See the <> document. -+ -This adds instrumentation of the Next.js dev server (`next dev`) and prod -server (`next start`). The APM transactions for incoming HTTP requests to the -server will be named appropriately based on Next.js's routing -- both for -user page routes (e.g. `GET /a-dynamic-page/[id]`) and for internal Next.js -routes (e.g. `Next.js _next/data route my-page`, -`Next.js Rewrite route /foo -> /bar`). As well, exceptions in server-side code -(e.g. `getServerSideProps`, server-side run page handlers, API handlers) will -be reported. ({pull}2959[#2959]) -+ -This is a technical preview to get feedback from Next.js users. The details on -how exactly the instrumentation works may change in future versions. - -* Improve container-info gathering to support AWS ECS/Fargate environments. - ({issues}2914[#2914]) - -[float] -===== Bug fixes - -* Source lines of context in stacktraces is *no longer reported* for "*.min.js" - files that do not have source-map information. These files are assumed to - be minimized files, for which source line context won't be useful. This - change is to guard against excessively large stacktrace data. - -[float] -===== Chores - -* Add guards to ensure that a crazy `Cache-Control: max-age=...` response - header cannot accidentally result in inappropriate intervals for fetching - central config. The re-fetch delay is clamped to `[5 seconds, 1 day]`. - ({issues}2941[#2941]) - - -[[release-notes-3.39.0]] -==== 3.39.0 2022/10/17 - -[float] -===== Features - -* Improve the granularity of data captured about downstream services, e.g. - databases, for spans that represent an external call (known as "exit spans"). - This data is used for - https://www.elastic.co/guide/en/kibana/current/service-maps.html[Service Maps] - and - https://www.elastic.co/guide/en/kibana/current/dependencies.html[Dependencies] - in the Kibana APM app. -+ -This is handled via the new span `service.target.*` fields that replace the -deprecated `destination.service.resource` field (https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans-service-target.md[spec]). All instrumentations have -been updated to set appropriate service target values. If necessary, e.g. for manual -instrumentation, a new public <> API has been added to specify these values. -({pull}2882[#2882]) -+ -The never-public-but-available `span.setDestinationContext()` has been marked -for removal (using it will `process.emitWarning()`). Users of this internal -method should switch to the public <>. -+ -As part of this change, improvements have been made to some module instrumentations: -+ - ** `redis` and `ioredis`: `span.type` has changed from "cache" to "db" per https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-db.md#redis[spec] - ** `mongodb`: `span.action` used to be "query", now it will be the mongodb command name, e.g. "find", "insert". - ** `mongodb` and `mongodb-core`: `span.db.instance` is now set to the database name ({issues}1494[#1494]) - ** `mysql` and `mysql2`: `span.db.{instance,user}` are now populated. - ** `@elastic/elasticsearch`: The cluster name is heuristically determined for Elastic Cloud deployments and used for the service target name. - ** `sqs`: `span.destination.{address,port}` are now populated. - ** `pg`: `span.db.{instance,user}` are now populated. - ** `cassandra-driver`: the Cassandra keyspace is captured for service target data, if available. - ** OpenTelemetry Bridge: OTel spans with kind PRODUCER and CLIENT are now handled as exit spans (e.g. span compression could apply). - -* Support instrumentation of `@koa/router` (and `koa-router`) versions 11 and 12. - Contributed by @sibelius. ({issues}2811[#2811]) - -* Support instrumentation of tedious@15. ({pull}2897[#2897]) - -* Improve the captured information for Elasticsearch client instrumentation. - For all outgoing Elasticsearch client requests, the full HTTP url is - now captured (stored in the "url.original" field). For Elasticsearch requests - that do a search, the outgoing request body is captured (to the - "span.db.statement" field) as before, but the format has changed to only - hold the request body. Before this change the "span.db.statement" would - also hold any HTTP query parameters. These are now more naturally captured - in "url.original". ({issues}2019[#2019]) -+ -This change also introduces the <> -configuration option to enable controlling which Elasticsearch REST API -paths are considered for request body capture. ({pull}2873[#2873]) - -* Support instrumenting core modules when require'd with the optional - https://nodejs.org/api/modules.html#core-modules['node:'-prefix]. - For example `require('node:http')` will now be instrumented. - ({issues}2816[#2816]) - -* Agent will delay loading of the `error-callsites` module until agent start time, - and will not load the module if the agent is disabled/inactive. This prevents the - setting of an `Error.prepareStackTrace` handler until necessary for stacktrace - collection. ({issues}2833[#2833] {pull}2906[#2906]) - -* Add `*principal*` pattern to default value for `sanitizeFieldNames` config - var, so that it is more likely to redact authentication-related HTTP headers, - e.g. on Azure. ({issues}2938[#2938]) - -[float] -===== Bug fixes - -* Avoid a possible `RangeError: Maximum call stack size exceeded` in - Span timer handler for exceedingly deep Span trees. ({pull}2939[#2939]) - -* Fix instrumentation of (very old) 'graphql' module versions <=0.9.6. - Instrumentation of these older graphql versions was broken in v3.36.0. - ({pull}2927[#2927]) - -[float] -===== Chores - -* Disable knex instrumentation when not collecting span stack traces - (because there is no point). This is a performance improvement for - Knex usage in the default configuration. ({pull}2879[#2879]) - -* Document and add types for `parent` option to - <>. ({issues}2977[#2977]) - - -[[release-notes-3.38.0]] -==== 3.38.0 2022/08/11 - -[float] -===== Features - -- Add instrumentation for the https://undici.nodejs.org[undici] HTTP client - library. This also adds instrumentation of Node.js v18's - https://nodejs.org/api/all.html#all_globals_fetch[`fetch()`], which uses - undici under the hood. For the instrumentation to work one must be using - node v14.17.0 or later, or have installed the - https://www.npmjs.com/package/diagnostics_channel['diagnostics_channel' polyfill]. - ({issues}2383[#2383]) - -- Added `exitSpanMinDuration` configuration field, allowing end users to - set a time threshold for dropping exit spans. ({pull}2843[#2843]) - -[float] -===== Bug fixes - -- Capturing an error would fail if the Error instance had an attribute that - was an invalid date. ({issues}2030[#2030]) - -- Fix the span for an instrumented S3 ListBuckets API call to not be invalid - for APM server intake. ({pull}2866[#2866]) - -- Fix an issue where the transaction `name` for a trace of a Lambda function - implementing a GraphQL server (e.g. via https://www.apollographql.com/docs/apollo-server/deployment/lambda/[apollo-server-lambda]) - would not get the GraphQL-specific naming. ({issues}2832[#2832]) - - -[[release-notes-3.37.0]] -==== 3.37.0 2022/07/18 - -[float] -===== Features - -- The agent will now use https://nodejs.org/api/async_context.html#class-asynclocalstorage[`AsyncLocalStorage`] - for run-context tracking in new enough versions of Node.js (versions >=14.5 - and >=12.19). This can reduce overhead from using the APM agent, especially in - Promise-heavy applications. ({pull}2786[#2786]) -+ -This also adds a new <> configuration option -to control which mechanism the agent uses for run-context tracking. It replaces -the, now deprecated, `asyncHooks` configuration option. If -you experience problems with the new AsyncLocalStorage-based tracking, you can -restore the older behavior with `contextManager: "asynchooks"`. - -[float] -===== Chores - -- The old "patch" mechanism that the APM agent uses for run-context tracking - (enabled via <>, or previously - enabled via `asyncHooks: false`) is now *deprecated*. It will be removed in a - future major version (after an 18 month deprecation period). - - -[[release-notes-3.36.0]] -==== 3.36.0 2022/06/15 - -[float] -===== Features - -- Adds https://github.com/elastic/apm/blob/main/specs/agents/handling-huge-traces/tracing-spans-dropped-stats.md[dropped span statistics] - to transaction payloads allowing APM Server to calculate more accurate - throughput metrics. ({issues}2302[#2302]) - -- Improve the grouping of captured API errors from `@elastic/elasticsearch` - instrumentation. When an Elasticsearch client API error is captured, if - the response body includes a `error.type`, e.g. `illegal_argument_exception`, - the captured `error.exception.type` will be `ResponseError (illegal_argument_exception)` - rather than `ResponseError`. This means that API errors will be grouped - separately in the Kibana APM app based on their client API error type. - ({issues}2770[#2770]) - -- Graphql v16 support ({issues}2508[#2508]) - - -[float] -===== Bug fixes - -- Fix the automatic wrapping of Lambda handlers to support handler modules - created by `esbuild` bundling -- as is done in some Serverless Framework - functions that use TypeScript. ({issues}2753[#2753]) - -- Fix Express route tracking (used for `transaction.name`) when an argument - is passed to the `next(arg)` callback of a request handler. Before this - change passing `next()` would be - considered an error by Express, but not by the APM agent's route - tracking. ({pull}2750[#2750]) - -- Updated `sanitizeFieldNames` and `ignoreMessageQueues` environment variables - to use `ELASTIC_APM_` prefix. (previous variable names are still recgonized, - but not documented) ({issues}2636[#2636]) - - -[[release-notes-3.35.0]] -==== 3.35.0 2022/06/01 - -[float] -===== Features - -- Add support for 'knex' version v0.21 to v1 ({issues}2699[#2699]). - Note that instrumentation of knex >=0.95.0 is not support when using the - deprecated <> configuration option. - -- Change the instrumentation of SQS- and SNS-triggered AWS Lambda invocations: - The special-casing of triggers with a *single* message/record has been - removed. That means that instead of a possible continued distributed trace - (if a single received message has a 'traceparent'), a *span link* will be - added to the APM transaction for each message with a 'traceparent'. - `transaction.context.message.` fields are no longer collected. - ({pull}2708[#2708]) - -- Enable support for ioredis v5 ({pull}2714[#2714]) - -- A Docker image with the APM agent will be published for each release to - `docker.elastic.co/observability/apm-agent-nodejs:VERSION`, for example: - `docker.elastic.co/observability/apm-agent-nodejs:3.35.0`. ({pull}2742[#2742]) - -[float] -===== Bug fixes - -- Fixes automatic Lambda handler wrapping to work with handlers that point to - subfolders (ex. `_HANDLER=path/to/folder.methodName`) ({issues}2709[#2709]) - - -[[release-notes-3.34.0]] -==== 3.34.0 2022/05/26 - -[float] -===== Features - -- Add support for 'tedious' version v10 to v14 ({issues}2517[#2517]) - -- When automatically determining <> and <> by - looking for a "package.json", the agent will now prefer to start looking - from the directory of the script being executed, rather than the current - working directory. ({issues}2420[#2420]) - -- Add an experimental <>. Briefly, the OpenTelemetry - Bridge allows one to use the vendor-neutral - https://opentelemetry.io/docs/instrumentation/js/api/[OpenTelemetry Tracing - API] (https://www.npmjs.com/package/@opentelemetry/api[`@opentelemetry/api`]) - to manually instrument your code, and have the Elastic Node.js APM agent - handle those API calls. ({pull}2641[#2641]) - -- Add https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/overview.md#links-between-spans)[Span Links] support. ({issues}2673[#2673]) -+ -The <> and -<> public APIs now accept -a `links` option for specify links. The OpenTelemetry Bridge also supports -specifying links during span creation (with the limitation that span link -*attributes* are not supported). - -- Add a <> configuration option to allow some - control over how the APM Agent uses incoming trace-context headers for context - propagation. ({issues}2592[#2592]) - -- Add span links to AWS SQS messaging spans on 'ReceiveMessage', one for each - message (up to 1000) which has a 'traceparent' message attribute. - ({issues}2593[#2593]) - -- Add "nodejs16.x" as one of the compatible runtimes for the Node.js APM agent - Lambda layers now that - https://aws.amazon.com/blogs/compute/node-js-16-x-runtime-now-available-in-aws-lambda/[this runtime is available on AWS]. - -[float] -===== Bug fixes - -- Fixes a bug where the the agent would not serialize the database context of - a span. ({issues}2715[#2715]) - -- Fix a possible crash in span compression handling on a span that was manually - created without a parent span (e.g. if created with a custom `childOf` - option). ({pull}2701[#2701]) - -[float] -===== Chores - -- Add a package-lock.json file to ensure repeatable builds of the AWS Lambda - layer and to assist with security issue auditing. ({issues}2626[#2626]) - -- Deprecate instrumentation for the legacy "hapi" package. While the APM agent - still supports it, that instrumentation is no longer tested and support - will be dropped in the next major version of the agent. Note that the - "@hapi/hapi" package is still fully supported. ({pull}2698[#2698]) - -- Deprecate instrumentation for the obsolete "jade" package. "jade" was renamed - to "pug" in 2015. While the APM agent still supports "jade", that - instrumentation is no longer tested. ({pull}2711[#2711]) - - -[[release-notes-3.33.0]] -==== 3.33.0 2022/05/05 - -[float] -===== Features - -- Add a `parent` option to `agent.captureError(err[, options][, cb])` to allow - passing in a Transaction or Span to use as the parent for the error. Before - this change the *current* span or transaction, if any, was always used. -+ -This option is not documented in the user docs, nor added to the TypeScript -types, because it is only expected to be useful for coming OTel Bridge work. - -[float] -===== Bug fixes - -- Fix a possible crash in the instrumentation of an incoming HTTP/2 request: if - the underlying Http2Session was destroyed before the APM transaction was - ended (on Http2Stream end). This resulted in the instrumentation using the - [`stream.session.socket`](https://nodejs.org/api/http2.html#http2sessionsocket) - proxy, which can throw `ERR_HTTP2_SOCKET_UNBOUND` after the session is - destroyed. ({issues}2670[#2670]) - -[float] -===== Chores - -- The release process is slightly changed. CI (Jenkins) now handles `npm - publish ...` when a tag is pushed. ({pull}2667[#2667]) - -- Pulled the `traceparent` NPM module into a local module and replaced the - `random-poly-fill` module with the built in `require('crypto').randomFillSync` - function call ({pull}2669[#2669]) - - -[[release-notes-3.32.0]] -==== 3.32.0 2022/04/27 - -[float] -===== Features - -* Add support for node v18. ({pull}2652[#2652]) - -* Add support for https://github.com/elastic/apm/blob/main/specs/agents/handling-huge-traces/tracing-spans-compress.md[span compression]. - ({issues}2100[#2100], {issues}2604[#2604]) -+ -By default, consecutive (sibling) exit spans of the same name, type, subtype, -and destination with a duration of less than 50ms will be compressed into -a single composite span. A possible case is the -https://duckduckgo.com/?q=N%252B1+query+problem[N+1 query problem]. -Traces with many consecutive matching spans will be represented -- both in data -and the APM UI -- more efficiently. -+ -Span compression can be disabled or matching behavior configured with the -<>. - -* Marks spans as "exit spans" across all instrumentations, preventing additional - child spans from being added to the exit spans. See issue for a full list of - spans types that will be treated as exit spans. ({issues}2601[#2601]) - -* Allow a new span to be created/started even if its transaction has ended. - This is expected to be a very rare use case. ({pull}2653[#2653]) - -* The Trace Context headers are now propagated for http2 requests. ({pull}2656[#2656]) - - -[[release-notes-3.31.0]] -==== 3.31.0 2022/03/23 - -[float] -===== Features - -* Add `captureBody` support for Hapi. ({issues}1905[#1905]) - -* If a SNS or SQS single event trigger to an instrumented Lambda function - includes message attributes with the name "traceparent" (and "tracestate"), - case-insensitive, then those are used to continue the trace. This was already - being done for API Gateway event headers. - -[float] -===== Bug fixes - -* Fix a bug with Lambda instrumentation where the APM agent would result in - an otherwise working Lambda function to respond with `null` if the Lambda - was missing the https://github.com/elastic/apm-aws-lambda[Elastic APM Lambda Extension]. - ({issues}2598[#2598]) - -* Fix a bug in Lambda instrumentation in the capturing of SNS and SQS event - message attributes. ({issues}2605[#2605]) - - -[[release-notes-3.30.0]] -==== 3.30.0 2022/03/10 - -[float] -===== Breaking changes - -* Added a new config option <> - that replaces both <> - and <>. The latter two are - now deprecated, but still supported. If `spanStackTraceMinDuration` is - specified, then any value for the deprecated two options will be ignored. -+ -There is a significant change in _default_ behavior of the APM agent. If none -of these configuration options is specified, then the default -(`spanStackTraceMinDuration: -1`) is that stack traces are *not* collected -and reported for any spans. This change in default behavior was made because -the CPU performance impact of collecting span stack traces was found to be -too high in practice for busy and/or complex applications. This is mentioned -in the "Breaking changes" section to highlight the change, but it is not -considered breaking in general. The impact is that the "Stack Trace" tab in -the "Span details" view in the Kibana APM app will be empty. This was already -the case for some spans based on span duration. ({pull}2565[#2565]) - -* Implement the explicit signaling of Lambda invocation completion to the - Elastic AWS Lambda Extension. This improves data flushing in a Lambda - environment to ensure tracing data is only sent when the Lambda is active. - This avoids possible tracing data loss while a Lambda VM is frozen. - ({issues}2485[#2485]) -+ -However, because this change triggers a bug in the extension, this version of -the APM Node.js Agent must only be used with versions of the -<> -after v0.0.3. - -[float] -===== Features - -* Add `faas.name` and `faas.version` fields to Lambda transactions. ({issues}2587[#2587]) -* Added automatic wrapping of AWS Lambda handlers ({pull}2577[#2577]) -* Improvements to AWS Lambda instrumentation: Better `transaction.name` for - API Gateway-triggered lambdas. Respect explicitly set `serviceName`, - `serviceVersion`, and `usePathAsTransactionName` config settings. Default - `cloudProvider: none` and `centralConfig: false` to reduce required - environment variables for setting up APM instrumentation of Lambdas. - ({issues}2531[#2531]) - - -[[release-notes-3.29.0]] -==== 3.29.0 2022/02/10 - -* Fix a bug in instrumentation of `@elastic/elasticsearch` that caused a - memory leak. ({issues}2569[#2569]) - - -[[release-notes-3.28.0]] -==== 3.28.0 2022/02/08 - -Known issue: This release includes a memory leak in instrumentation of the -`@elastic/elasticsearch` package. If you use that package, you should not -use v3.28.0 of this APM agent. ({issues}2569[#2569]) - -[float] -===== Breaking changes - -The following changes are not considered *breaking*. However, they result in -a change in behavior and trace output that might impact some users, so they -are highlighted here. - -* Change the `redis` and `mysql` instrumentations to not patch at all if - they are listed in <>. - This means that an application that uses one of these packages *and* lists - that package in `disableInstrumentations` could see changes in the async - run-context of callbacks. See {issues}2498[#2498] and the - <> which has a similar change. - -* Elasticsearch spans (from `elasticsearch`, `@elastic/elasticsearch`, and - `@elastic/elasticsearch-canary` instrumentation) will no longer have an HTTP - child span(s) for the underlying HTTP request. This is listed in this section - to provide awareness in case some users have custom analysis of APM trace - data that expects those HTTP spans. -+ -Per https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#exit-spans[the APM Agent spec for exit spans], -Elasticsearch spans are now marked as exit spans and as a result, HTTP child -spans are suppressed. ({issues}2000[#2000]) -+ -As part of this change, some HTTP context has been added to Elasticsearch -spans, when available: the HTTP response `status_code`, and the size of the -response body (`encoded_body_size`). ({issues}2484[#2484]) - -[float] -===== Features - -* Drop unsampled transactions when sending to APM Server v8.0+. ({issues}2455[#2455]) - -* The default <> string (when it is not configured - and cannot be inferred from a "package.json" file) has been changed from - "nodejs_service" to "unknown-nodejs-service". This is a standardized pattern - used across Elastic APM agents to allow the Kibana APM app to recognize when - to provide help to the user on configuring the service name. - ({issues}2491[#2491]) - -* Add `transaction.name` to captured APM errors. This will allow the Kibana APM - app to correlate error groups and transaction groups. ({issues}2456[#2456]) - -* Mark S3 spans (from 'aws-sdk' instrumentation) as exit spans (per - https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#exit-spans). - The result is that HTTP child spans of S3 spans are no longer captured. - ({issues}2125[#2125]) - -[float] -===== Bug fixes - -* Fixes for run context handling for '@elastic/elasticsearch' instrumentation. - ({issues}2430[#2430]) - -* Fixes for run context handling for 'cassandra-driver' instrumentation. - ({issues}2430[#2430]) - -* Fixes for run context handling for 'mongodb-core' instrumentation. - ({issues}2430[#2430]) - -* Fixes for run context handling for 'elasticsearch' instrumentation. - ({issues}2430[#2430]) - - -[[release-notes-3.27.0]] -==== 3.27.0 2022/01/17 - -[float] -===== Features - -* Add support for express-graphql 0.10.0 - 0.12.0 inclusive. ({pull}2511[#2511]) - -[float] -===== Bug fixes - -* Fix an issue where the agent's async task tracking could cause the user's - application to use too much memory. In cases where an application is under - sustained load and is running in a memory constrained container, this looked - like a memory leak. -+ -This high memory usage could happen when application code starts async tasks -(e.g. Promises, setTimeouts, async I/O) that outlive the APM Transaction -(typically an HTTP request handler). The agent's async task tracking keeps a -reference to the APM Transaction (and any APM Spans) until the async task -ends, thus extending the lifetime of those APM objects and the references -they hold -- in particular, HTTP request and response objects. This could lead -to higher memory usage. -+ -With this change, those references are removed when APM Transactions and Spans -are ended, and agent memory usage is now the same as what it was before -v3.24.0 when this issue was introduced. ({pull}2528[#2528], {issues}2489[#2489]) - -* Fixes for run context handling for 'graphql' instrumentation. - ({issues}2430[#2430]) - -* Fixes for run context handling for DynamoDB instrumentation ('aws-sdk' - package) so that a span created after an AWS client command (in the same - tick, in the command callback, or promise) is not a child of the automatic - AWS span. This change also ensures captured errors from failing client - commands are a child of the AWS span. ({issues}2430[#2430]) - -* Fixes for run context handling for 'pg' instrumentation. ({issues}2430[#2430]) - -* Fixes for run context handling for 'mongodb' instrumentation. ({issues}2512[#2512]) - - -[[release-notes-3.26.0]] -==== 3.26.0 2021/12/07 - -[float] -===== Breaking changes - -* In earlier versions, the agent would propagate run context in some packages - *even if instrumentation for that package was disabled via - <>*. Recent versions - change the semantics of `disableInstrumentations` to mean the agent should - not touch the listed packages at all. This means that an application that - uses one of these packages *and* lists that package in - `disableInstrumentations` could see changes in the async run-context of - callbacks. This affects: `pg` (v3.24.0), `redis` (v3.25.0), `mysql` - (v3.25.0), `ioredis` (v3.26.0), `mysql2` (v3.26.0). See {issues}2498[#2498] - for details. - -[float] -===== Features - -* Add `*auth*` pattern to default value for `sanitizeFieldNames` config var, so - that it is more likely to redact authentication/authorization-related HTTP - headers and form fields. This pattern replaces the `authorization` pattern - in the set of defaults. ({issues}2427[#2427]) - -[float] -===== Bug fixes - -* Fix run-context handling for 'tedious' instrumentation so that automatically - created 'mssql' spans are never the `currentSpan` in user code. - ({issues}2430[#2430]) - -* Fix 'http2' instrumentation for outgoing requests to not have the created - HTTP span context be active in user code. ({issues}2430[#2430]) - -* Fix run-context handling in 'ws' instrumentation so that the span created - for a `ws.send(...)` isn't the "current span" in subsequent code in the - same tick. ({pull}2481[#2481]) - -* Fix run-context handling for 'memcached' instrumentation so that the - automatically created Memcached span is never the `currentSpan` in user - code. ({issues}2430[#2430]) - -* Fix a possible crash when serializing a Transaction if the incoming - `req.socket` is null (possible if the socket has been destroyed). - ({issues}2479[#2479]) - -* Fixes for run context handling for 'aws-sdk' instrumentation (S3, SQS, SNS) - so that a span created after an AWS client command (in the same tick, in - the command callback, or promise) is not a child of the automatic AWS - span. This change also ensures captured errors from failing client commands - are a child of the AWS span. ({issues}2430[#2430]) - -* Fix 'http' and 'https' instrumentation for outgoing requests to not have the - 'http' span context be active in user code. ({pull}2470[#2470]) - -* Fixes for 'ioredis' instrumentation ({pull}2460[#2460]): -+ -** Fix run-context so that a span created in the same tick as an ioredis - client command will no longer be a child of the redis span. -** Capture an APM error and correctly set span.outcome to "failure" when - a redis client command calls back with an error. -** Avoid a rare possible double-instrumentation of redis commands - internally-queued before the RedisClient is "ready". ({issues}2459[#2459]) -** Add destination context so Redis shows up on the Service Map. - -* Fix run-context handling for 'mysql2' instrumentation to avoid accidental - creation of *child* spans of the automatic mysql spans. - ({issues}2430[#2430]}) - - -[[release-notes-3.25.0]] -==== 3.25.0 2021/11/24 - -[float] -===== Bug fixes - -* Fixes for 'redis' instrumentation: -+ -** Fix run-context so that a span created in the same tick as a redis client - command will no longer be a child of the redis span. ({issues}2430[#2430]) -** Capture an APM error and correctly set span.outcome to "failure" when - a redis client command calls back with an error. -** Avoid a rare possible double-instrumentation of redis commands - internally-queued before the RedisClient is "ready". ({pull}2446[#2446]) - -* Avoid setting the `tracestate` header for outgoing HTTP requests to the empty - string. This can happen for non-trace-root transactions. While the HTTP spec - allows empty header values, some servers do not. ({issues}2405[#2405]) - -* Deprecate `transaction.subtype` and `transaction.action`. These fields - were never used by APM server. This also deprecates the - `apm.startTransaction(...)` call signatures that take `subtype` and `action` - arguments. In the next major version these two fields will be removed. - ({issues}2356[#2356]) - -* Fix run-context handling for 'mysql' instrumentation to avoid accidental - creation of *child* spans of the automatic 'mysql' spans. - ({issues}2430[#2430]}) - - -[[release-notes-3.24.0]] -==== 3.24.0 2021/11/09 - -[float] -===== Breaking changes - -* Change <> to no longer skip internal processing - work. It now *only* disables communication with APM Server. Use - <> if your use case is - to limit the APM agent's processing to the minimum to support context - propagation and log correlation. -+ -This is listed under "Breaking changes" as a heads-up. The only possible -negative result of this `disableSend` change is some extra CPU processing time -by the agent. There is no outward functionality change. - -[float] -===== Features - -* Gather https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-aws-lambda.md#overwriting-metadata[AWS Lambda-specific metadata] - on first function invocation and ensure no intake requests to APM Server are - started before that metadata is available. ({issues}2404[#2404]) - -* Add <> configuration - option. This supports the use case of using the APM agent to propagate HTTP - trace-context and to support log-correlation (adding `trace.id` et al fields - to log records) **without** an APM server, and to otherwise reduce the - processing time of the agent. ({issues}2393[#2393]) -+ -This is similar to <>, but differs in that -`contextPropagationOnly: true` tells the agent to skip unnecessary work. - -* The User-Agent header used for communication with APM Server now includes - the `serviceName` and `serviceVersion`. For some users this can be - https://github.com/elastic/apm/issues/509[helpful for APM Server log analysis]. - ({issues}2364[#2364]) - -* In a Lambda enviornment we now collect a number of additional data fields - on the Transaction object. See the spec for more information on fields collected. - https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-aws-lambda.md - ({issues}2156[#2156]) - -* Zero configuration support. The only required agent configuration option - is <>. Normally the agent will attempt to - infer `serviceName` for the "name" field in a package.json file. However, - that could fail. With this version, the agent will cope with: a scoped - package name (`@scope/name` is normalized to `scope-name`), a "name" that - isn't a valid `serviceName`, not being able to find a "package.json" file, - etc. Ultimately it will fallback to "nodejs_service". ({issues}1944[#1944]) -+ -One consequence of this change is that `apm.getServiceName()` will return -`undefined` until the agent is started (check with `apm.isStarted()`). - -[float] -===== Bug fixes - -* Stop collecting transaction breakdown metrics (`transaction.breakdown.count`, - `transaction.duration.sum.us`, `transaction.duration.count`), as they are not - being used in APM UI. ({issues}2370[#2370]) - -* Wrap `fs.realpath.native` when configured with `asyncHooks=false`. This - fixes using that function (which was undefined before this fix) and a - crash when importing fs-extra@10. ({issues}2401[#2401]) - -* A significant change was made to internal run context tracking (a.k.a. async - context tracking). There are no configuration changes or API changes for - custom instrumentation. ({pull}2181[#2181]) -+ -One behavior change is that multiple spans created synchronously (in the same -async task) will form parent/child relationships; before this change they would -all be siblings. This fixes HTTP child spans of Elasticsearch and aws-sdk -automatic spans to properly be children. ({issues}1889[#1889]) -+ -Another behavior change is that a span B started after having ended span A in -the same async task will *no longer* be a child of span A. ({pull}1964[#1964]) -+ -This fixes an issue with context binding of EventEmitters, where -`removeListener` would fail to actually remove if the same handler function was -added to multiple events. - -* Fix pino's deprecation warning when using a custom logger with pino@6 ({issues}2332[#2332]) - - -[[release-notes-3.23.0]] -==== 3.23.0 2021/10/25 - -[float] -===== Breaking changes - -* Remove support for instrumenting versions of fastify earlier than 1.0.0. - This instrumentation might still work, but is no longer supported. - Fastify v1.0.0 was released in 2018. All current users should be using - fastify v2 or v3 at least. See https://www.fastify.io/docs/latest/LTS/ - ({pull}2387[#2387]) - -[float] -===== Features - -* Add initial support for version 8 of `@elastic/elasticsearch`, which is - still in pre-release. ({pull}2385[#2385]) - - -[[release-notes-3.22.0]] -==== 3.22.0 2021/10/21 - -[float] -===== Features - -* Add support for node v17. - -* When an error is captured, the APM agent will only immediately flush it to - APM server if it is an "unhandled" error. Unhandled errors are typically those - captured via the `uncaughtException` process event. Before this change, a - captured error (e.g. for a 4xx or 5xx response from an HTTP server) was - always immediately flushed. This could negatively impact performance for - a service that was generating *frequent* errors. ({issues}686[#686]) - -[float] -===== Bug fixes - -* Improve <> to wait for inflight spans and errors - before flushing data to APM server. Before this change, a recently ended span - or recently <> might not yet have completed - processing (for example, stacktrace collection is asynchronous) and might - not be included in the flush call. ({issues}2294[#2294]) - -* AWS Lambda changes: Disable metrics collection during the experimental phase - of (re)implementing Lambda support ({pull}2363[#2363]). Some fixes for better - flushing of data at the end of a Lambda invocation. - -* `span.toString()` and `transaction.toString()` have been *deprecated*. The - exact string output may change in v4 of the agent. - -* Add `Span.ids` and `Transaction.ids` to TypeScript types. ({pull}2347[#2347]) - -* Improve `span.sync` determination (fixes {issues}1996[#1996]) and stop - reporting `transaction.sync` which was never used ({issues}2292[#2292]). - A minor semantic change is that `span.sync` is not set to a final value - until `span.end()` is called. Before `span.end()` the value will always - by `true`. - -* Guard against a negative value of `metricsInterval`, which can lead to - high CPU usage as metrics are collected as fast as possible. Also ensure - no metrics collection can happen if `metricsInterval="0s"` as intended. - Before this change it was possible for some metric collection to still - happen, even though none would be reported. ({pull}2330[#2330]) -+ -This change also guards against negative and invalid values in the following -configuration options: `abortedErrorThreshold`, `apiRequestTime`, and -`serverTimeout`. If an invalid value is given, then will fallback to their -default value. - - -[[release-notes-3.21.1]] -==== 3.21.1 2021/09/16 - -[float] -===== Bug fixes - -* Update types to avoid imports of `@types/...` modules (other than - `@types/node`), so that TypeScript users of elastic-apm-node need not - manually `npm install @types/connect @types/pino @types/aws-lambda` to - compile. ({issues}2331[#2331]) - - -[[release-notes-3.21.0]] -==== 3.21.0 2021/09/15 - -[float] -===== Features - -* Add the `longFieldMaxLength` integer configuration option (default `10000`). - Specific transaction/span/error fields (see the list below) will be truncated - at this number of unicode characters. ({pull}2193[#2193], {issues}1921[#1921]) -+ -The `errorMessageMaxLength` configuration option is now *deprecated*, but -still supported. Users should switch to using `longFieldMaxLength`. If -`errorMessageMaxLength` is not specified, truncation of error messages will -now use the `longFieldMaxLength` value. -+ -Note that ultimately the maximum length of any tracing field is limited by the -{apm-guide-ref}/configuration-process.html#max_event_size[`max_event_size`] -configured for the receiving APM server. -+ -The fields affected by `longFieldMaxLength` are: -+ -** `transaction.context.request.body`, `error.context.request.body` - Before - this change these fields were not truncated. -** `transaction.context.message.body`, `span.context.message.body`, - `error.context.message.body` - Before this change these fields were not - truncated. -** `span.context.db.statement` - Before this change this field was truncated - at 10000 *bytes*. Truncation is now a number of unicode characters. -** `error.exception.message`, `error.log.message` - Before this change, the - default 2kB `errorMessageMaxLength` would apply. - -* Improve the TypeScript types by exporting more of interfaces: - `AgentConfigOptions`, `Transaction`, `Span`, `TransactionOptions`, - `SpanOptions`. ({issues}2118[#2118]) - -[float] -===== Bug fixes - -* Fix a bug in `apm.removePatch(module, aHandler)` that would remove the - last registered handler if `aHandler` did not match any currently - registered handlers. ({pull}2315[#2315]) - -* Fix a crash in instrumentation of the old Elasticsearch client - (`elasticsearch`) for some rarer cases of client options -- for example - passing multiple hosts. ({pull}2312[#2312]) - -* Ensure the internal HTTP(S) client requests made by the APM agent to APM - server are not themselves traced. ({issues}1168[#1168], {issues}1136[#1136]) - -* Fix crashing error with `agent.registerMetric` and `active:false` configuration. ({issues}1799[#1799], {pull}2290[#2290]) - - -[[release-notes-3.20.0]] -==== 3.20.0 2021/08/12 - -[float] -===== Bug fixes - -* Fix failing tests and a possible runtime crash in - `@elastic/elasticsearch@7.14.0` instrumentation. ({issues}2187[#2187]) - - -[[release-notes-3.19.0]] -==== 3.19.0 2021/08/05 - -[float] -===== Features - -* The agent now supports the 3.x branch of apollo-server-express. ({pull}2155[#2155]) - -* Add instrumentation support for mongodb@4.x. ({pull}2171[#2171]) - -[float] -===== Bug fixes - -* The agent will no longer report counting metrics with a value of zero, and will - remove these metrics from the registry. ({pull}2163[#2163]) - - -[[release-notes-3.18.0]] -==== 3.18.0 2021/07/20 - -[float] -===== Features - -* Trace an incoming HTTP/1.1 request to an HTTP/2 server using the - https://nodejs.org/api/http2.html#http2_http2_createsecureserver_options_onrequesthandler[allowHTTP1] - option. Before this change only incoming requests supporting HTTP/2 would - be traced. ({pull}2143[#2143]) - -* Add instrumentation of the AWS SNS publish method when using the - https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`). ({pull}2157[#2157]) - -[float] -===== Bug fixes - -* Fixed naming for outgoing HTTP spans to comply with the spec. - https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-http.md#http-client-spans - Span names no longer include the path portion of the URL. ({pull}2161[#2161]) - -* Fix a header object re-use bug that prevented propagation of trace-context - headers (`traceparent` et al) in AWS requests using AWS v4 signature auth. - ({issues}2134[#2134]) - -* Fix a possible infinite loop in `captureError` when handling uncaught - exceptions and the process is at or near its file descriptor limit - (receiving EMFILE errors). ({issues}2148[#2148]) - - -[[release-notes-3.17.0]] -==== 3.17.0 2021/07/05 - -[float] -===== Features - -* Add instrumentation of all AWS S3 methods when using the - https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`). - -* Add <> configuration option. This supports some - use cases using the APM agent **without** an APM server. ({issues}2101[#2101]) - -* Add instrumentation of all DynamoDB methods when using the - https://www.npmjs.com/package/aws-sdk[JavaScript AWS SDK v2] (`aws-sdk`). - -[float] -===== Bug fixes - -* Fix inconsistencies in HTTP spans from other APM agents. - <> will now be "http" for HTTP, HTTPS, and - HTTP/2 outgoing spans -- previously it was "http", "https", "http2", - respectively. As well, <> will now be the HTTP - method (e.g. "GET", "PUT", "POST"), rather than "http". ({pull}2075[#2075]) - -* Fixed error where SQS messages sent without an active transactions could - crash the agent. ({issues}2113[#2113]) - -* Fixed support for proxies in destination context ({issues}1770[#1770]) - -[[release-notes-3.16.0]] -==== 3.16.0 - 2021/06/14 - -[float] -===== Features - -* Added <> - configuration field, allowing users to set a time threshold value that spans - must reach before the agent will add a stack trace to the span. As a result, - many short spans that previously included stack traces by default no longer - will. - -* Prefer W3C "traceparent" header over "elastic-apm-traceparent" for incoming - requests. {pull}2079[#2079] - -[float] -===== Bug fixes - -* Fix a crash (`TypeError: lastPrepareStackTrace`) in the agent when used with - React v17 and later ({issues}1980[#1980]). - -* Performance improvements have been made in error and stacktrace capture ({pull}2094[#2094]). - This also included in two bug fixes: -+ -** Before this change, some captured errors (for example a `next(new Error('boom')` from - an Express handler) would mark the error as "unhandled" incorrectly. "Unhandled" - exceptions are those caught by an `uncaughtException` handler. -** Before this change, source context lines for a stacktrace would not properly - use the "sourcesContext" field of a file's source map. - - -[[release-notes-3.15.0]] -==== 3.15.0 - 2021/05/19 - -[float] -===== Features - -* Add support for Node.js v16. (This also drops testing of Node.js v13 - releases.) {pull}2055[#2055] - -[float] -===== Bug fixes - -* Update TypeScript typings for `Agent.setLabel` and `Agent.addLabels` to - include the `stringify` argument that was added in v3.11.0. - - -[[release-notes-3.14.0]] -==== 3.14.0 - 2021/04/19 - -[float] -===== Features - -* Add `apm.addMetadataFilter(fn)` for filtering the - https://www.elastic.co/guide/en/apm/server/current/metadata-api.html[metadata object] - sent to APM server. - -* The handling of sending events (transactions, spans, errors) to APM server - has improved in a few ways. During temporary spikes in load and/or an APM - server that is unresponsive, the agent will buffer a number of events and - *drop* them above a certain limit (configurable via <>). - This helps ensure the agent does not overly consume memory and CPU. As well, - the agent will now https://github.com/elastic/apm/blob/main/specs/agents/transport.md#transport-errors[backoff] - when the APM server errors. Finally, improved error handling means it will - terminate failing requests to the APM server more quickly. -+ -Note: v1 of this agent (EOL'd 2 years ago), included a `maxQueueSize` config -variable with a different meaning. If you have a lingering usage of that -setting (also possibly as the `ELASTIC_APM_MAX_QUEUE_SIZE` environment -variable), then it should be removed. - -* Adds support for Amazon SQS queues via `aws-sdk` instrumentation that - partially implements the https://github.com/elastic/apm/blob/main/specs/agents/tracing-instrumentation-messaging.md[APM messaging spec], - and adds `queue.latency.min.ms`, `queue.latency.max.ms`, and `queue.latency.avg.ms` - metrics for SQS queues. - -[float] -===== Bug fixes - -* Fixed bug where the URL property for outgoing HTTP request spans was set - with the server's IP address rather than its hostname. The Agent now sets - this property with the actual URL requested by Node.js. {issues}2035[#2035] - -* Fixed bug where external services were not listed under Dependencies on the - APM Service Overview page due to the trace-context propagated `sample_rate` - value not being set on either transactions or spans. - -[[release-notes-3.13.0]] -==== 3.13.0 - 2021/04/06 - -[float] -===== Features - -* The APM agent's own internal logging now uses structured JSON logging using - the https://getpino.io/#/docs/api?id=logger[pino API], and formatted in - {ecs-logging-ref}/intro.html[ecs-logging] format. The log records on stdout - are now single-line JSON objects. For example: -+ -[source,bash] ----- -# Before -APM Server transport error (ECONNREFUSED): connect ECONNREFUSED 127.0.0.1:8200 - -# After -{"log.level":"error","@timestamp":"2021-03-19T00:21:17.571Z","log":{"logger":"elastic-apm-node"}, -"ecs":{"version":"1.6.0"},"message":"APM Server transport error (ECONNREFUSED): connect ECONNREFUSED 127.0.0.1:8200"} ----- -+ -Pretty formatting (and filtering) on the console may be done via the -https://github.com/trentm/go-ecslog[`ecslog`] tool. -+ -A custom <> is still supported as before. However, a non-pino custom -logger will only receive the "message" field, and not structured log fields -as they are added over time. - -* Add support for setting the `ELASTIC_APM_LOGGER=false` environment variable - to disable/ignore a given custom <>. This is to support easier - <> for troubleshooting. - -[float] -===== Bug fixes - -* Lock package dependency "elastic-apm-http-client@9.6.0" to avoid using - v9.7.0 for now, because it is breaking tests. A coming release will get back - on the latest of this dependency. {issues}2032[#2032] - -* Remove the "ancestors" field from a log.trace message on startup. Its info - is a duplicate of info in the "startTrace" field in the same log record. - {pull}2005[#2005] - -* Remove the accidental `nodejs.eventloop.delay.ns` metric that was always - reporting a zero value. The existing `nodejs.eventloop.delay.avg.ms` is - the intended metric. {pull}1993[#1993] - - -[[release-notes-3.12.1]] -==== 3.12.1 - 2021/02/25 - -[float] -===== Bug fixes - -* fix: Update https://github.com/elastic/apm-nodejs-http-client/blob/main/CHANGELOG.md#v951[apm-server client] - to fix a {issues}1749[possible crash] when polling for central config. - - -[[release-notes-3.12.0]] -==== 3.12.0 - 2021/02/21 - -[float] -===== Features - -* feat: Set span outcome to success or failure depending on whether an error - was captured during when the span was active. {issues}1814[#1814] - -* feat: Adds public `setOutcome` method to span and transaction APIs, and - adds a top level `setTransactionOutcome` and `setSpanOutcome` to set - outcome values for the current active transaction or active span. -* Limit the `transactionSampleRate` value to 4 decimal places of precision - according to the shared https://github.com/elastic/apm/blob/main/specs/agents/tracing-sampling.md#transaction_sample_rate-configuration[APM spec]. This ensures that propagated sampling rate - in the `tracestate` header is short and consistent. {pull}1979[#1979] - -[float] -===== Bug fixes - -* fix: It was possible for fetching central config to result in the - `cloudProvider` config value being reset to its default. {issues}1976[#1976] - -* fix: fixes bug where tedious could crash the agent on bulk inserts {pull}1935[#1935] + - Reported https://discuss.elastic.co/t/apm-agent-crashes-nodejs-after-reporting-exception-in-tedious-instrumentation-code/259851[via the forum]. - The error symptom was: `Cannot read property 'statement' of undefined` - -[[release-notes-3.11.0]] -==== 3.11.0 - 2021/02/08 - -[float] -===== Features - -* feat: add `apm.getServiceName()` {pull}1949[#1949] + - This will be used by https://github.com/elastic/ecs-logging-nodejs[ecs-logging packages] - to integrate with APM. - -* feat: support numeric and boolean labels {pull}1909[#1909] + - Add an optional `stringify` option to `apm.setLabel(name, version, stringify = true)` - and `apm.addLabels(labels, stringify = true)`, which can be set `false` to - allow numeric and boolean labels. Stringify defaults to true for backwards - compatibility -- stringification will be removed in a future major version. - -* feat: added support for cloud metadata fetching {pull}1937[#1937] + - Agent now collects information about its cloud environment and includes this - data in the APM Server's metadata payload. See - https://github.com/elastic/apm/blob/3acd10afa0a9d3510e819229dfce0764133083d3/specs/agents/metadata.md#cloud-provider-metadata[the spec] - for more information. - -[[release-notes-3.10.0]] -==== 3.10.0 - 2021/01/11 - -[float] -===== Features - -* feat: Improve handling of raw body parsing - The agent will now report raw/`Buffer` encoded post bodies as ''. - -* feat: Add support for api keys {pull}1818[#1818] + - This allows the usage of API keys for authentication to the APM server - -* feat: Add automatic instrumentation of the https://github.com/elastic/elasticsearch-js[@elastic/elasticsearch] package {pull}1877[#1870] -+ -The instrumentation of the legacy "elasticsearch" package has also changed -slightly to commonalize: -+ -** "span.context.destination" is set on all Elasticsearch spans, not just a - subset of query-like API endpoints. -** For query-like API endpoints (e.g. `/_search`), the capturing of query details - on "span.context.db.statement" has changed (a) to include *both* the - query params and the request body if both exist (separated by `\n\n`) and - (b) to *URL encode* the query params, rather than JSON encoding. - -* feat: Add `captureAttributes` boolean option to `apm.captureError()` to - allow *disabling* the automatic capture of Error object properties. This - is useful for cases where those properties should not be sent to the APM - Server, e.g. for performance (large string fields) or security (PII data). - {pull}1912[#1912] - -* feat: Add `log_level` central config support. {pull}1908[#1908] + - Spec: https://github.com/elastic/apm/blob/main/specs/agents/logging.md - -* feat: Add `sanitize_field_names` configuration option. + - Allows users to configure a list of wildcard patterns to _remove_ items - from the agent's HTTP header and `application/x-www-form-urlencoded` payloads. - {pull}1898[#1898] - ** https://github.com/elastic/apm/blob/main/specs/agents/sanitization.md[spec] - ** https://github.com/elastic/apm-agent-nodejs/blob/main/docs/configuration.asciidoc#sanitize-field-names[docs] - -[float] -===== Bug fixes - -* fix: Fix parsing of comma-separated strings for relevant config vars to allow - whitespace around the commas. E.g.: -+ ----- -export ELASTIC_APM_TRANSACTION_IGNORE_URLS='/ping, /metrics*' ----- -+ -Config vars affected are: `disableInstrumentations`, `transactionIgnoreUrls` -`addPatch`, and `globalLabels`. -* fix: Correct the environment variable for setting `transactionIgnoreUrl` - (added in v3.9.0) from `ELASTIC_TRANSACTION_IGNORE_URLS` to - `ELASTIC_APM_TRANSACTION_IGNORE_URLS`. - - -[[release-notes-3.9.0]] -==== 3.9.0 - 2020/11/30 - -[float] -===== Features - -* feat: support fastify 3 {pull}1891[#1891] + - Adds .default and .fastify module.exports to instrumented fastify function - for 3.x line, and prefers req.routerMethod and req.routerPath for - transaction name -* feat: Set "destination" context on spans for "mongodb". {pull}1893[#1893] + - This allows Kibana APM Service Maps to show a "mongodb" node for services using - the https://www.npmjs.com/package/mongodb[mongodb] package (which includes - mongoose and mongojs). -* feat: transactionIgnoreUrl wildcard matching {pull}1870[#1870] + - Allows users to ignore URLs using simple wildcard matching patterns that behave - the same across language agents. See https://github.com/elastic/apm/issues/144 - -[float] -===== Bug fixes - -* fix: treat set-cookie in response headers as sensitive data {pull}1886[#1886] -* fix: Synchronous spans would never have `span.sync == true`. {pull}1879[#1879] - - -[[release-notes-3.8.0]] -==== 3.8.0 - 2020/11/09 - -[float] -===== Features - -* feat: expand k8s pod ID discovery regex {pull}1863[#1863] -* feat: implements tracestate {pull}1828[#1828] + - Expands support for the W3C Trace Context specification by adding a tracestate - header implementation, and uses this new header to track the Elastic - transaction sample rate across a trace's service boundaries. -* feat: add span and transaction outcome {pull}1824[#1824] + - This adds an "outcome" field to HTTP(S) - https://github.com/elastic/apm/blob/main/specs/agents/tracing-transactions.md#transaction-outcome[transactions] - and https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans.md#span-outcome[spans]. - -[float] -===== Bug fixes - -* fix(pg): prevent unhandled promise rejection {pull}1846[#1846] -* fix: redis@2.x instrumentation was broken {pull}1852[#1852] -* A number of fixes to the test suite. - -[[release-notes-3.7.0]] -==== 3.7.0 - 2020/8/10 - -* feat(knex): add support for 0.21.x {pull}1801[#1801] -* feat(redis): add support for v3.x {pull}1641[#1641] -* feat(graphql): add support for 15.x {pull}1795[#1795] -* feat(koa-router): add support for 9.x {pull}1772[#1772] -* fix(elasticsearch): ensure requests can be aborted {pull}1566[#1566] -* fix: end span if outgoing http request ends prematurely {pull}1583[#1583] -* fix: don't throw on invalid URL {pull}1771[#1771] -* fix: patch apollo-server-core > 2.14 correctly {pull}1796[#1796] -* fix: add currentTraceIds to typings {pull}1733[#1733] - -[[release-notes-3.6.1]] -==== 3.6.1 - 2020/5/20 - -* fix(package): bump elastic-apm-http-client to ^9.4.0 {pull}1756[#1756] - -[[release-notes-3.6.0]] -==== 3.6.0 - 2020/5/18 - -* feat: add destination metadata for db spans {pull}1687[#1687] -* feat: add support for Node.js 14 {pull}1742[#1742] -* feat(pg): add support for pg v8.x {pull}1743[#1743] -* feat: add metrics for external memory {pull}1724[#1724] -* feat: enrich spans with destination info {pull}1685[#1685] -* fix(instrumentation): add .js to module path {pull}1711[#1711] - -[[release-notes-3.5.0]] -==== 3.5.0 - 2020/3/9 - -* feat(error): get stack trace from Error-like objects {pull}1613[#1613] -* fix: add logUncaughtExceptions conf option to TypeScript typings {pull}1668[#1668] - -[[release-notes-3.4.0]] -==== 3.4.0 - 2020/2/21 - -* feat: support W3C TraceContext traceparent header {pull}1587[#1587] -* feat: add custom metrics API (experimental) {pull}1571[#1571] -* feat(koa-router): add support for v8.x {pull}1642[#1642] -* fix(cassandra): improve support for cassandra-driver v4.4.0+ {pull}1636[#1636] -* fix: support promisifying setTimeout and friends {pull}1636[#1636] - -[[release-notes-3.3.0]] -==== 3.3.0 - 2019/12/13 - -* feat(config): add serverCaCertFile config {pull}1560[#1560] -* feat(config): add central config support for transactionMaxSpans and captureBody {pull}1555[#1555] - -[[release-notes-3.2.0]] -==== 3.2.0 - 2019/11/19 - -* fix(metrics): only register collectors if enabled {pull}1520[#1520] -* fix(ioredis): prevent unhandled promise rejection {pull}1523[#1523] -* chore: add Node 13 to supported engines {pull}1524[#1524] - -[[release-notes-3.1.0]] -==== 3.1.0 - 2019/10/16 - -[float] -===== Features -* feat(mongodb): instrumentation {pull}1423[#1423] -* fix(package): update elastic-apm-http-client to version 9.0.0 {pull}1419[#1419] -* perf: cache 'ids' value of transactions and spans {pull}1434[#1434] - -[float] -===== Bug fixes -* fix: always end transaction when socket is closed prematurely {pull}1439[#1439] -* fix: change logUncaughtExceptions default to false {pull}1432[#1432] -* fix: write stack trace of uncaught exceptions to STDERR {pull}1429[#1429] - -[[release-notes-3.0.0]] -==== 3.0.0 - 2019/9/30 - -[float] -===== Breaking changes -* feat: allow manual instrumentation with `instrument: false` {pull}1114[#1114] -* feat: allow setting span/transaction `type`, `subtype`, and `action` separately (the behavior of the old `type` has changed) {pull}1292[#1292] -* feat: use `external` as span type instead of `ext` {pull}1291[#1291] -* refactor(graphql): use custom transaction type `graphql` for graphql requests instead of `request` {pull}1245[#1245] -* feat(http): add `instrumentIncomingHTTPRequests` config (`disableInstrumentations` now behaves differently) {pull}1298[#1298] -* chore: remove deprecated APIs {pull}1413[#1413] -* chore: drop support for older Node.js versions {pull}1383[#1383] - -[[release-notes-2.x]] -=== Node.js Agent version 2.x - -[[release-notes-2.17.3]] -==== 2.17.3 - 2020/2/27 - -[float] -===== Bug fixes -* fix: support promisifying setTimeout and friends {pull}1649[#1649] -* fix(cassandra): improve support for cassandra-driver v4.4.0+ {pull}1649[#1649] -* fix(knex): make stack traces work in 0.18+ {pull}1500[#1500] -* fix(tedious): ensure shimmed module exposes same API {pull}1496[#1496] -* fix(metrics): do not send transaction breakdowns when disabled {pull}1489[#1489] -* fix(tedious): support 6.5+ {pull}1488[#1488] -* fix: always end transaction when socket is closed prematurely {pull}1445[#1445] -* perf: cache 'ids' value of transactions and spans {pull}1438[#1438] - -[[release-notes-2.17.2]] -==== 2.17.2 - 2019/10/2 - -[float] -===== Bug fixes -* chore(http): workaround(s) to suppress DEP0066 warnings {pull}1424[#1424] - -[[release-notes-2.17.1]] -==== 2.17.1 - 2019/9/26 - -[float] -===== Bug fixes -* fix: support all falsy return values from error filters {pull}1394[#1394] -* fix: capture all non-string http bodies {pull}1381[#1381] - -[[release-notes-2.17.0]] -==== 2.17.0 - 2019/9/19 - -[float] -===== Features -* feat: add support for @koa/router {pull}1346[#1346] -* feat: add methods for logging trace information {pull}1335[#1335] - -[float] -===== Bug fixes -* fix: improve debug output when detecting incoming http request {pull}1357[#1357] -* fix(http): response context propagation on Node.js 12.0 - 12.2 {pull}1339[#1339] - -[[release-notes-2.16.2]] -==== 2.16.2 - 2019/9/3 - -[float] -===== Bug fixes -* fix(lambda): handle traceparent case-insensitively {pull}1319[#1319] - -[[release-notes-2.16.1]] -==== 2.16.1 - 2019/8/28 - -[float] -===== Bug fixes -* fix: avoid throwing when agent is in active: false mode {pull}1278[#1278] - -[[release-notes-2.16.0]] -==== 2.16.0 - 2019/8/26 - -[float] -===== Features -* feat(memcached): instrument memcached v2.2.0 and above {pull}1144[#1144] -* feat(config): add configFile config option {pull}1303[#1303] - -[float] -===== Bug fixes -* fix: bug where spans sometimes wouldn't have stack traces {pull}1299[#1299] -* fix(async_hooks): properly update sync flag {pull}1306[#1306] -* fix: change agent active status log message to debug level {pull}1300[#1300] - -[[release-notes-2.15.0]] -==== 2.15.0 - 2019/8/15 - -[float] -===== Features -* feat(express-graphql): add support for v0.9 {pull}1255[#1255] -* feat(metrics): add metricsLimit option {pull}1273[#1273] - -[[release-notes-2.14.0]] -==== 2.14.0 - 2019/8/12 - -[float] -===== Features -* feat(hapi): support new @hapi/hapi module {pull}1246[#1246] -* feat: allow agent.clearPatches to be called with array of names {pull}1262[#1262] - -[float] -===== Bug fixes -* fix: be less chatty if span stack traces cannot be parsed {pull}1274[#1274] -* perf: use for-of instead of forEach {pull}1275[#1275] - -[[release-notes-2.13.0]] -==== 2.13.0 - 2019/7/30 - -[float] -===== Bug fixes -* fix: standardize user-agent header {pull}1238[#1238] - -[float] -===== Features -* feat: add support for APM Agent Configuration via Kibana {pull}1197[#1197] -* feat(metrics): breakdown graphs {pull}1219[#1219] -* feat(config): default serviceVersion to package version {pull}1237[#1237] - -[[release-notes-2.12.1]] -==== 2.12.1 - 2019/7/7 - -[float] -===== Bug fixes -* fix(knex): abort early on unsupported version of knex {pull}1189[#1189] - -[[release-notes-2.12.0]] -==== 2.12.0 - 2019/7/2 - -[float] -===== Features -* feat(metrics): add runtime metrics {pull}1021[#1021] -* feat(config): add environment option {pull}1106[#1106] - -[[release-notes-2.11.6]] -==== 2.11.6 - 2019/6/11 - -[float] -===== Bug fixes -* fix(express): don't swallow error handling middleware {pull}1111[#1111] - -[[release-notes-2.11.5]] -==== 2.11.5 - 2019/5/27 - -[float] -===== Bug fixes -* fix(metrics): report correct CPU usage on Linux {pull}1092[#1092] -* fix(express): improve names for routes added via app.use() {pull}1013[#1013] - -[[release-notes-2.11.4]] -==== 2.11.4 - 2019/5/27 - -[float] -===== Bug fixes -* fix: don't add traceparent header to signed AWS requests {pull}1089[#1089] - -[[release-notes-2.11.3]] -==== 2.11.3 - 2019/5/22 - -[float] -===== Bug fixes -* fix(span): use correct logger location {pull}1081[#1081] - -[[release-notes-2.11.2]] -==== 2.11.2 - 2019/5/21 - -[float] -===== Bug fixes -* fix: url.parse expects req.url not req {pull}1074[#1074] -* fix(express-slash): expose express handle properties {pull}1070[#1070] - -[[release-notes-2.11.1]] -==== 2.11.1 - 2019/5/10 - -[float] -===== Bug fixes -* fix(instrumentation): explicitly use `require` {pull}1059[#1059] -* chore: add Node.js 12 to package.json engines field {pull}1057[#1057] - -[[release-notes-2.11.0]] -==== 2.11.0 - 2019/5/3 - -[float] -===== Bug fixes -* chore: rename tags to labels {pull}1019[#1019] - -[float] -===== Features -* feat(config): support global labels {pull}1020[#1020] - -[float] -===== Bug fixes -* fix(config): do not use ELASTIC_APM_ prefix for k8s {pull}1041[#1041] -* fix(instrumentation): prevent handler leak in bindEmitter {pull}1044[#1044] - -[[release-notes-2.10.0]] -==== 2.10.0 - 2019/4/15 - -[float] -===== Features -* feat(express-graphql): add support for version ^0.8.0 {pull}1010[#1010] - -[float] -===== Bug fixes -* fix(package): bump elastic-apm-http-client to ^7.2.2 so Kubernetes metadata gets corrected recorded {pull}1011[#1011] -* fix(ts): add TypeScript typings for new traceparent API {pull}1001[#1001] - -[[release-notes-2.9.0]] -==== 2.9.0 - 2019/4/10 - -[float] -===== Features -* feat: add traceparent getter to agent, span and transaction {pull}969[#969] -* feat(template): add support for jade and pug {pull}914[#914] -* feat(elasticsearch): capture more types of queries {pull}967[#967] -* feat: sync flag on spans and transactions {pull}980[#980] - -[float] -===== Bug fixes -* fix(agent): init config/logger before usage {pull}956[#956] -* fix: don't add response listener to outgoing requests {pull}974[#974] -* fix(agent): fix basedir in debug mode when starting agent with -r {pull}981[#981] -* fix: ensure Kubernetes/Docker container info is captured {pull}995[#995] - -[[release-notes-2.8.0]] -==== 2.8.0 - 2019/4/2 - -[float] -===== Features -* feat: add agent.setFramework() method {pull}966[#966] -* feat(config): add usePathAsTransactionName config option {pull}907[#907] -* feat(debug): output configuration if logLevel is trace {pull}972[#972] - -[float] -===== Bug fixes -* fix(express): transaction default name is incorrect {pull}938[#938] - -[[release-notes-2.7.1]] -==== 2.7.1 - 2019/3/28 - -[float] -===== Bug fixes -* fix: instrument http/https.get requests {pull}954[#954] -* fix: don't add traceparent header to S3 requests {pull}952[#952] - -[[release-notes-2.7.0]] -==== 2.7.0 - 2019/3/26 - -[float] -===== Features -* feat: add patch registry {pull}803[#803] -* feat: allow sub-modules to be patched {pull}920[#920] -* feat: add TypeScript typings {pull}926[#926] - -[float] -===== Bug fixes -* fix: update measured-reporting to fix Windows installation issue {pull}933[#933] -* fix(lambda): do not wrap context {pull}931[#931] -* fix(lambda): fix cloning issues of context {pull}947[#947] -* fix(metrics): use noop logger in metrics reporter {pull}912[#912] -* fix(transaction): don't set transaction result if it's null {pull}936[#936] -* fix(agent): allow flush callback to be undefined {pull}934[#934] -* fix: handle promise rejection in case Elasticsearch client throws {pull}870[#870] -* chore: change 'npm run' command namespaces {pull}944[#944] - -[[release-notes-2.6.0]] -==== 2.6.0 - 2019/3/5 - -[float] -===== Features -* feat: add support for Fastify framework {pull}594[#594] -* feat(lambda): accept parent span in lambda wrapper {pull}881[#881] -* feat(lambda): support promise form {pull}871[#871] - -[float] -===== Bug fixes -* fix: ensure http headers are always recorded as strings {pull}895[#895] -* fix(metrics): prevent 0ms timers from being created {pull}872[#872] -* fix(config): apiRequestSize should be 768kb {pull}848[#848] -* fix(express): ensure correct transaction names {pull}842[#842] - -[[release-notes-2.5.1]] -==== 2.5.1 - 2019/2/4 - -[float] -===== Bug fixes -* fix(metrics): ensure NaN becomes 0, not null {pull}837[#837] - -[[release-notes-2.5.0]] -==== 2.5.0 - 2019/1/29 - -[float] -===== Features -* feat(metrics): added basic metrics gathering {pull}731[#731] - -[[release-notes-2.4.0]] -==== 2.4.0 - 2019/1/24 - -[float] -===== Features -* feat: add ability to set custom log message for errors {pull}824[#824] -* feat: add ability to set custom timestamp for errors {pull}823[#823] -* feat: add support for custom start/end times {pull}818[#818] - -[[release-notes-2.3.0]] -==== 2.3.0 - 2019/1/22 - -[float] -===== Bug fixes -* fix(parsers): move port fix into parser {pull}820[#820] -* fix(mongo): support 3.1.10+ {pull}793[#793] - -[float] -===== Features -* feat(config): add captureHeaders config {pull}788[#788] -* feat(config): add container info options {pull}766[#766] - -[[release-notes-2.2.1]] -==== 2.2.1 - 2019/1/21 - -[float] -===== Bug fixes -* fix: ensure request.url.port is a string on transactions {pull}814[#814] - -[[release-notes-2.2.0]] -==== 2.2.0 - 2019/1/21 - -[float] -===== Features -* feat(koa): record framework name and version {pull}810[#810] -* feat(cassandra): support 4.x {pull}784[#784] -* feat(config): validate serverUrl port {pull}795[#795] -* feat: add transaction.type to errors {pull}805[#805] - -[float] -===== Bug fixes -* fix: filter outgoing http headers with any case {pull}799[#799] -* fix: we don't support mongodb-core v3.1.10+ {pull}792[#792] - -[[release-notes-2.1.0]] -==== 2.1.0 - 2019/1/15 - -[float] -===== Features -* feat(error): include sampled flag on errors {pull}767[#767] -* feat(span): add tags to spans {pull}757[#757] - -[float] -===== Bug fixes -* fix(tedious): don't fail on newest tedious v4.1.3 {pull}775[#775] -* fix(graphql): fix span name for unknown queries {pull}756[#756] - -[[release-notes-2.0.6]] -==== 2.0.6 - 2018/12/18 - -[float] -===== Bug fixes -* fix(graphql): don't throw on invalid query {pull}747[#747] -* fix(koa-router): support more complex routes {pull}749[#749] - -[[release-notes-2.0.5]] -==== 2.0.5 - 2018/12/12 - -[float] -===== Bug fixes -* fix: don't create spans for APM Server requests {pull}735[#735] - -[[release-notes-2.0.4]] -==== 2.0.4 - 2018/12/7 -* chore: update engines field in package.json {pull}727[#727] -* chore(package): bump random-poly-fill to ^1.0.1 {pull}726[#726] - -[[release-notes-2.0.3]] -==== 2.0.3 - 2018/12/7 - -[float] -===== Bug fixes -* fix(restify): support an array of handlers {pull}709[#709] -* fix: don't throw on older versions of Node.js 6 {pull}711[#711] - -[[release-notes-2.0.2]] -==== 2.0.2 - 2018/12/4 - -[float] -===== Bug fixes -* fix: use randomFillSync polyfill on Node.js <6.13.0 {pull}702[#702] -* fix(hapi): ignore internal events channel {pull}700[#700] - -[[release-notes-2.0.1]] -==== 2.0.1 - 2018/11/26 - -[float] -===== Bug fixes -* fix: log APM Server API errors correctly {pull}692[#692] - -[[release-notes-2.0.0]] -==== 2.0.0 - 2018/11/14 - -[float] -===== Breaking changes -* chore: remove support for Node.js 4 and 9 -* chore: remove deprecated buildSpan function {pull}642[#642] -* feat: support APM Server intake API version 2 {pull}465[#465] -* feat: improved filtering function API {pull}579[#579] -* feat: replace double-quotes with underscores in tag names {pull}666[#666] -* feat(config): change config order {pull}604[#604] -* feat(config): support time suffixes {pull}602[#602] -* feat(config): stricter boolean parsing {pull}613[#613] - -[float] -===== Features - * feat: add support for Distributed Tracing {pull}538[#538] - * feat(transaction): add transaction.ensureParentId function {pull}661[#661] - * feat(config): support byte suffixes {pull}601[#601] - * feat(transaction): restructure span_count and include total {pull}553[#553] - * perf: improve Async Hooks implementation {pull}679[#679] - -[[release-notes-1.x]] -=== Node.js Agent version 1.x - -[[release-notes-1.14.3]] -==== 1.14.3 - 2018/11/13 - * fix(async_hooks): more reliable cleanup {pull}674[#674] - -[[release-notes-1.14.2]] -==== 1.14.2 - 2018/11/10 - * fix: prevent memory leak due to potential reference cycle {pull}667[#667] - -[[release-notes-1.14.1]] -==== 1.14.1 - 2018/11/8 - * fix: promise.then() resolve point {pull}663[#663] - -[[release-notes-1.14.0]] -==== 1.14.0 - 2018/11/6 - * feat(agent): return uuid in captureError callback {pull}636[#636] - * feat(apollo-server-express): set custom GraphQL transaction names {pull}648[#648] - * feat(finalhandler): improve capturing of errors in Express {pull}629[#629] - * fix(http): bind writeHead to transaction {pull}637[#637] - * fix(shimmer): safely handle property descriptors {pull}634[#634] - -[[release-notes-1.13.0]] -==== 1.13.0 - 2018/10/19 - * feat(ioredis): add support for ioredis version 4.x {pull}516[#516] - * fix(ws): allow disabling WebSocket instrumentation {pull}599[#599] - * fix: allow flushInterval to be set from env {pull}568[#568] - * fix: default transactionMaxSpans to 500 {pull}567[#567] - -[[release-notes-1.12.0]] -==== 1.12.0 - 2018/8/31 - * feat(restify): add Restify instrumentation {pull}517[#517] - * feat(config): default serviceName to package name {pull}508[#508] - * fix: always call agent.flush() callback {pull}537[#537] - -[[release-notes-1.11.0]] -==== 1.11.0 - 2018/8/15 - * feat(filters): filter set-cookie headers {pull}485[#485] - * fix(express): cannot create property symbol {pull}510[#510] - -[[release-notes-1.10.2]] -==== 1.10.2 - 2018/8/8 - * fix: ensure logger config can update {pull}503[#503] - * perf: improve request body parsing speed {pull}492[#492] - -[[release-notes-1.10.1]] -==== 1.10.1 - 2018/7/31 - * fix(graphql): handle execute args object {pull}484[#484] - -[[release-notes-1.10.0]] -==== 1.10.0 - 2018/7/30 - * feat(cassandra): instrument Cassandra queries {pull}437[#437] - * feat(mssql): instrument SQL Server queries {pull}444[#444] - -[[release-notes-1.9.0]] -==== 1.9.0 - 2018/7/25 - * fix(parsers): use basic-auth rather than req.auth {pull}475[#475] - * feat(agent): add currentTransaction getter {pull}462[#462] - * feat: add support for ws 6.x {pull}464[#464] - -[[release-notes-1.8.3]] -==== 1.8.3 - 2018/7/11 - * perf: don't patch newer versions of mimic-response {pull}442[#442] - -[[release-notes-1.8.2]] -==== 1.8.2 - 2018/7/4 - * fix: ensure correct streaming when using mimic-response {pull}429[#429] - -[[release-notes-1.8.1]] -==== 1.8.1 - 2018/6/27 - * fix: improve ability to run in an environment with muliple APM vendors {pull}417[#417] - -[[release-notes-1.8.0]] -==== 1.8.0 - 2018/6/23 - * feat: truncate very long error messages {pull}413[#413] - * fix: be unicode aware when truncating body {pull}412[#412] - -[[release-notes-1.7.1]] -==== 1.7.1 - 2018/6/20 - * fix(express-queue): retain continuity through express-queue {pull}396[#396] - -[[release-notes-1.7.0]] -==== 1.7.0 - 2018/6/18 - * feat(mysql): support mysql2 module {pull}298[#298] - * feat(graphql): add support for the upcoming GraphQL v14.x {pull}399[#399] - * feat(config): add option to disable certain instrumentations {pull}353[#353] - * feat(http2): instrument client requests {pull}326[#326] - * fix: get remoteAddress before HTTP request close event {pull}384[#384] - * fix: improve capture of spans when EventEmitter is in use {pull}371[#371] - -[[release-notes-1.6.0]] -==== 1.6.0 - 2018/5/28 - * feat(http2): instrument incoming http2 requests {pull}205[#205] - * fix(agent): allow agent.endTransaction() to set result {pull}350[#350] - -[[release-notes-1.5.4]] -==== 1.5.4 - 2018/5/15 - * chore: allow Node.js 10 in package.json engines field {pull}345[#345] - -[[release-notes-1.5.3]] -==== 1.5.3 - 2018/5/14 - * fix: guard against non string err.message - -[[release-notes-1.5.2]] -==== 1.5.2 - 2018/5/11 - * fix(express): string errors should not be reported - -[[release-notes-1.5.1]] -==== 1.5.1 - 2018/5/10 - * fix: don't throw if span callsites can't be collected - -[[release-notes-1.5.0]] -==== 1.5.0 - 2018/5/9 - * feat: add agent.addTags() method {pull}313[#313] - * feat: add agent.isStarted() method {pull}311[#311] - * feat: allow calling transaction.end() with transaction result {pull}328[#328] - * fix: encode spans even if their stack trace can't be captured {pull}321[#321] - * fix(config): restore custom logger feature {pull}299[#299] - * fix(doc): lambda getting started had old argument {pull}296[#296] - -[[release-notes-1.4.0]] -==== 1.4.0 - 2018/4/9 - * feat(lambda): implement manual lambda instrumentation {pull}234[#234] - -[[release-notes-1.3.0]] -==== 1.3.0 - 2018/3/22 - * feat(request): include ppid {pull}286[#286] - -[[release-notes-1.2.1]] -==== 1.2.1 - 2018/3/15 - * fix(span): Do not pass stack frames into promises (memory leak fix) {pull}269[#269] - -[[release-notes-1.2.0]] -==== 1.2.0 - 2018/3/13 - * feat(config): add serverTimeout {pull}238[#238] - * fix(config): set default maxQueueSize to 100 {pull}270[#270] - * feat(ws): add support for ws v5 {pull}267[#267] - -[[release-notes-1.1.1]] -==== 1.1.1 - 2018/3/4 - * fix(mongodb): don't throw if span cannot be built {pull}265[#265] - -[[release-notes-1.1.0]] -==== 1.1.0 - 2018/2/28 - * feat: add agent.startSpan() function {pull}262[#262] - * feat(debug): output more debug info on start {pull}254[#254] - -[[release-notes-1.0.3]] -==== 1.0.3 - 2018/2/14 - * fix: ensure context.url.full property is truncated if too long {pull}242[#242] - -[[release-notes-1.0.2]] -==== 1.0.2 - 2018/2/13 - * fix(express): prevent invalid errors from crashing {pull}240[#240] - -[[release-notes-1.0.1]] -==== 1.0.1 - 2018/2/9 - * fix: don't add req/res to unsampled transactions {pull}236[#236] - -[[release-notes-1.0.0]] -==== 1.0.0 - 2018/2/6 - * feat(instrumentation): support sampling {pull}154[#154] - * feat(transaction): add `transactionMaxSpans` config option {pull}170[#170] - * feat(errors): add captureError call location stack trace {pull}181[#181] - * feat: allow setting of framework name and version {pull}228[#228] - * feat(protcol): add `url.full` to intake API payload {pull}166[#166] - * refactor(config): replace `logBody` with `captureBody` {pull}214[#214] - * refactor(config): unify config options with python {pull}213[#213] - * fix: don't collect source code for in-app span frames by default {pull}229[#229] - * fix(protocol): report dropped span counts in intake API payload {pull}172[#172] - * refactor(protocol): always include handled flag in intake API payload {pull}191[#191] - * refactor(protocol): move process fields to own namespace in intake API payload {pull}155[#155] - * refactor(protocol): rename `uncaught` to `handled` in intake API payload {pull}140[#140] - * refactor(protocol): rename `in_app` to `library_frame` in intake API payload {pull}96[#96] - * refactor: rename app to service {pull}93[#93] - * refactor: rename trace to span {pull}92[#92] - -[[release-notes-0.x]] -=== Node.js Agent version 0.x - -[[release-notes-0.12.0]] -==== 0.12.0 - 2018/1/24 - * feat(*): control amount of source context lines collected using new config options {pull}196[#196] - * feat(agent): add public flush function to force flush of transaction queue: agent.flush([callback]) {pull}187[#187] - * feat(mongodb): add support for mongodb-core 3.x {pull}190[#190] - * refactor(config): update default flushInterval to 10 seconds (lower memory usage) {pull}186[#186] - * chore(*): drop support for Node.js 5 and 7 {pull}169[#169] - * refactor(instrumentation): encode transactions as they are added to the queue (lower memory usage) {pull}184[#184] - -[[release-notes-0.11.0]] -==== 0.11.0 - 2018/1/11 - * feat(*): Set default stack trace limit to 50 frames {pull}171[#171] - * feat(ws): add support for ws@4.x {pull}164[#164] - * feat(errors): associate errors with active transaction - -[[release-notes-0.10.0]] -==== 0.10.0 - 2018/1/3 - * feat(express): auto-track errors (BREAKING CHANGE: removed express middleware) {pull}127[#127] - * feat(hapi): add hapi 17 support {pull}146[#146] - * fix(*): fix Node.js 8 support using async_hooks {pull}77[#77] - * fix(graphql): support sync execute {pull}139[#139] - * refactor(agent): make all config properties private (BREAKING CHANGE) {pull}107[#107] - -[[release-notes-0.9.0]] -==== 0.9.0 - 2017/12/15 - * feat(conf): allow serverUrl to contain a sub-path {pull}116[#116] - * refactor(*): better format of error messages from the APM Server {pull}108[#108] - -[[release-notes-0.8.1]] -==== 0.8.1 - 2017/12/13 - * docs(*): we're now in beta! {pull}103[#103] - -[[release-notes-0.8.0]] -==== 0.8.0 - 2017/12/13 - * feat(handlebars): instrument handlebars {pull}98[#98] - -[[release-notes-0.7.0]] -==== 0.7.0 - 2017/12/6 - * feat(parser): add sourceContext config option to control if code snippets are sent to the APM Server {pull}87[#87] - * fix(*): move https-pem to list of devDependencies - -[[release-notes-0.6.0]] -==== 0.6.0 - 2017/11/17 - * feat(queue): add maxQueueSize config option {pull}56[#56] - -[[release-notes-0.5.0]] -==== 0.5.0 - 2017/11/17 - * refactor(*): drop support for Node.js <4 {pull}65[#65] - * refactor(*): rename module to elastic-apm-node {pull}71[#71] - * feat(queue): add fuzziness to flushInterval {pull}63[#63] - -[[release-notes-0.4.0]] -==== 0.4.0 - 2017/11/15 - * fix(https): instrument https.request in Node.js v9 - * refactor(http): log HTTP results in groups of 100 {pull}68[#68] - * fix(api): add language to APM Server requests {pull}64[#64] - * refactor(trans): set default transaction.result to success {pull}67[#67] - * refactor(config): rename timeout config options {pull}59[#59] - -[[release-notes-0.3.1]] -==== 0.3.1 - 2017/10/3 - * fix(parsers): don't log context.request.url.search as null {pull}48[#48] - * fix(parsers): separate hostname and port when parsing Host header {pull}47[#47] - -[[release-notes-0.3.0]] -==== 0.3.0 - 2017/9/20 - * fix(instrumentation): don't sample transactions {pull}40[#40] - * feat(graphql): include GraphQL operation name in trace and transaction names {pull}27[#27] - * feat(tls): add validateServerCert config option {pull}32[#32] - * feat(parser): support http requests with full URI's {pull}26[#26] - * refactor(*): remove appGitRef config option - * fix(instrumentation): fix setting of custom flushInterval - * feat(elasticsearch): add simple Elasticsearch instrumentation - * fix(*): don't start agent if appName is invalid - -[[release-notes-0.2.0]] -==== 0.2.0 - 2017/8/28 - * refactor(*): support new default port 8200 in APM Server - * refactor(*): support new context.response status code format - -[[release-notes-0.1.1]] -==== 0.1.1 - 2017/8/17 - * fix(instrumentation): don't fail when sending transactions to APM Server - -[[release-notes-0.1.0]] -==== 0.1.0 - 2017/8/17 - * Initial release diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..2eb866ac60 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + + +* [APM Node.js Agent version 4.x](https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes-4.x.html) ([local changelog source file](./docs/release-notes/index.md), includes unreleased changes) +* [APM Node.js Agent version 3.x](https://www.elastic.co/guide/en/apm/agent/nodejs/3.x/release-notes-3.x.html) +* [APM Node.js Agent version 2.x](https://www.elastic.co/guide/en/apm/agent/nodejs/2.x/release-notes-2.x.html) +* [APM Node.js Agent version 1.x](https://github.com/elastic/apm-agent-nodejs/blob/1.x/CHANGELOG.md) +* [APM Node.js Agent version 0.x](https://github.com/elastic/apm-agent-nodejs/blob/0.x/CHANGELOG.md) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 717d0bd3fa..a46d272107 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,7 +43,7 @@ Once your changes are ready to submit for review: * See the [Commit message guidelines](#commit-message-guidelines) below. * If your changes will be visible to users of this package, then add an item - to the "Unreleased" section of [the changelog](./CHANGELOG.asciidoc). + to the "Next" section of [release notes](docs/release-notes/index.md). * If you are changing usage of this package, are there updates under "docs/" that should be made? @@ -194,11 +194,11 @@ A release involves the following published artifacts: - the version in `package.json`, - the version in `package-lock.json` (by running `npm install`), - all cases of "REPLACEME" in docs and comments, - - "CHANGELOG.asciidoc": Add missing changelog entries, if any. Then change - the "Unreleased" section title to: + - "docs/release-notes/index.md": Add missing release notes, if any. Then change + the "Next" section title, release date, and sub-section anchors: ``` - [[release-notes-x.y.z]] - ==== x.y.z - YYYY/MM/DD + ## x.y.z [x-y-z] + ... ``` If there are particular highlights for the release, then it can be helpful to point those out in the PR description. @@ -212,17 +212,9 @@ A release involves the following published artifacts: steps -- including the `npm publish`. See the appropriate run at: https://github.com/elastic/apm-agent-nodejs/actions/workflows/release.yml) -4. If this is for the latest major (currently `4.x`), then the "4.x" branch - needs to be updated to the same state as the release tag on "main". Use - the [update-4x-branch.sh](./dev-utils/update-4x-branch.sh) script for this. - - - Run `./dev-utils/update-4x-branch.sh` to create a working dir with the - needed changes. - - Follow its instructions to create a PR from this working dir. - - Ensure the "buildkite/docs-build-pr" workflow passes for this branch. - - "Squash and merge" the PR. - - The periodic docs CI will update the - [published docs](https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes-4.x.html). +4. The published docs should update automatically with CI that runs + (at time of writing) every 30 minutes + a CDN cache time. + https://www.elastic.co/docs/release-notes/apm/agents/nodejs If this is a new major release, then: diff --git a/Dockerfile b/Dockerfile index 59f93bb7ca..63b6185513 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -# Pin to Alpine 3.9 -# For a complete list of hashes, see: -# https://github.com/docker-library/repo-info/tree/master/repos/alpine/remote -FROM alpine@sha256:115731bab0862031b44766733890091c17924f9b7781b79997f5f163be262178 +# Pin the latest Alpine 3 +# https://github.com/docker-library/repo-info/blob/master/repos/alpine/remote/3.md + +FROM alpine@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c ARG AGENT_DIR COPY ${AGENT_DIR} /opt/nodejs diff --git a/Dockerfile.wolfi b/Dockerfile.wolfi index f03619042b..e3a64e773c 100644 --- a/Dockerfile.wolfi +++ b/Dockerfile.wolfi @@ -1,3 +1,3 @@ -FROM docker.elastic.co/wolfi/chainguard-base@sha256:9f940409f96296ef56140bcc4665c204dd499af4c32c96cc00e792558097c3f1 +FROM docker.elastic.co/wolfi/chainguard-base:latest@sha256:67d82bc56a9c34572abe331c14f5e4b23a284d94a5bc1ea3be64f991ced51892 ARG AGENT_DIR COPY ${AGENT_DIR} /opt/nodejs \ No newline at end of file diff --git a/Makefile b/Makefile index 36b23fc74a..c7f2ac74d1 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ fmt: npm run lint:fix # Prerequisite: Docker server is running. -# See TESTING.md for more details on tests, TAV tests, coverage, benchmarks. +# See TESTING.md for more details on tests, TAV tests, benchmarks. .PHONY: test test: npm run test diff --git a/TESTING.md b/TESTING.md index 81343d6cc1..1ddd667904 100644 --- a/TESTING.md +++ b/TESTING.md @@ -28,7 +28,7 @@ npm run lint # or 'make check' if you are a Makefile kind of pe npm test # run test services and tests in Docker -docker-compose -f test/docker-compose.yml config --services # list test services +docker compose -f test/docker-compose.yml config --services # list test services npm run docker:start # start all test services npm run docker:start redis # start one or more test services npm run docker:stop # stop all test services diff --git a/dev-utils/update-4x-branch.sh b/dev-utils/update-4x-branch.sh deleted file mode 100755 index 6166f6ba35..0000000000 --- a/dev-utils/update-4x-branch.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -# -# Create a PR to update the 4.x branch to match the state of "main" for the -# just-tagged release. The 4.x branch needs to be updated for the current docs -# build. -# - -if [ "$TRACE" != "" ]; then - export PS4='${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' - set -o xtrace -fi -set -o errexit -set -o pipefail - -function fatal { - echo "$(basename $0): error: $*" - exit 1 -} - -TOP=$(cd $(dirname $0)/../ >/dev/null; pwd) -WRKDIR=${TOP}/build/update-4x-branch - -echo "# Creating working git clone in: ${WRKDIR}/apm-agent-nodejs" -rm -rf $WRKDIR -mkdir -p $WRKDIR -cd $WRKDIR -git clone git@github.com:elastic/apm-agent-nodejs.git -cd apm-agent-nodejs - -TARGTAG=$(git tag --points-at HEAD) -if [[ ! ("$TARGTAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]$) ]]; then - fatal "the tag on HEAD, '${TARGTAG}', does not look like a release tag" -fi -# echo "TARGTAG=$TARGTAG" - -readonly NUM_COMMITS_SANITY_GUARD=200 -LASTTAG=$( - git log --pretty=format:%h -$NUM_COMMITS_SANITY_GUARD | tail -n +2 | while read sha; do - possible=$(git tag --points-at $sha) - if [[ "$possible" =~ ^v[0-9]+\.[0-9]+\.[0-9]$ ]]; then - echo $possible - break - fi - done -) -if [[ -z "$LASTTAG" ]]; then - fatal "could not find previous release tag in last $NUM_COMMITS_SANITY_GUARD commits" -fi -# echo "LASTTAG=$LASTTAG" - - -# Merging generally fails, IME. Let's attempt to cherry-pick each commit. -# - That 'awk' command is to reverse the lines of commit shas. -# `tac` works on Linux, `tail -r` works on BSD/macOS. -# https://stackoverflow.com/a/744093/14444044 -echo -echo "# Creating PR to update 4.x branch with commits from $LASTTAG to $TARGTAG." -FEATBRANCH=update-4x-branch-$(date +%Y%m%d) -git checkout 4.x -git checkout -b "$FEATBRANCH" -git log --pretty=format:"%h" $LASTTAG...$TARGTAG \ - | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' \ - | while read sha; do - echo "$ git cherry-pick $sha" - git cherry-pick $sha - done - -echo -echo "# You can create a PR now with:" -echo " cd $WRKDIR/apm-agent-nodejs" -echo " gh pr create --fill -w -B 4.x -t 'docs: update 4.x branch for $TARGTAG release'" - diff --git a/docs/agent-api.asciidoc b/docs/agent-api.asciidoc deleted file mode 100644 index d0a7da0026..0000000000 --- a/docs/agent-api.asciidoc +++ /dev/null @@ -1,959 +0,0 @@ -[[agent-api]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/agent-api.html[elastic.co] -endif::[] - -=== `Agent` API - -The Elastic APM Node.js agent is a singleton. You get the agent instance by requiring either `elastic-apm-node` or `elastic-apm-node/start`. The agent is also returned by the <> method, which allows you to require and start the agent on the same line: - -[source,js] ----- -const apm = require('elastic-apm-node').start(...) ----- - -If you need to access the `Agent` in any part of your codebase, -you can simply require `elastic-apm-node` to access the already started singleton. -You therefore don't need to manage or pass around the started `Agent` yourself. - - -[[apm-start]] -==== `apm.start([options])` - -Starts the Elastic APM agent for Node.js and returns itself. - -[IMPORTANT] -==== -For the APM agent to automatically instrument Node.js modules, it must be started before those modules are loaded. See <> for details and possible surprises with compilers/transpilers/bundlers. -==== - -See the <> for available options. - -[[apm-is-started]] -==== `apm.isStarted()` - -[small]#Added in: v1.5.0# - -Use `isStarted()` to check if the agent has already started. -Returns `true` if the agent has started, -otherwise returns `false`. - - -[[apm-get-service-name]] -==== `apm.getServiceName()` - -[small]#Added in: v3.11.0# - -Get the configured <>. If a service name was not -explicitly configured, this value may have been automatically determined. -The service name is not determined until `agent.start()`, so will be `undefined` -until then. A misconfigured agent can have a `null` service name. - - -[[apm-get-service-version]] -==== `apm.getServiceVersion()` - -[small]#Added in: v4.2.0# - -Get the configured <>. If a service version was not explicitly -configured, this value may have been automatically determined. The service -version is not determined until `agent.start()`, so will be `undefined` until -then. - - -[[apm-get-service-environment]] -==== `apm.getServiceEnvironment()` - -[small]#Added in: v4.2.0# - -Get the configured <>. - - -[[apm-get-service-node-name]] -==== `apm.getServiceNodeName()` - -[small]#Added in: v4.2.0# - -Get the configured <>. If the APM agent is not configured -with an explicit value, this will return `undefined`. - - -[[apm-set-framework]] -==== `apm.setFramework(options)` - -[small]#Added in: v2.8.0# - -* `options` +{type-object}+ The following options are supported: -** `name` +{type-string}+ Framework name. -** `version` +{type-string}+ Framework version. -** `overwrite` +{type-boolean}+ If set to `false`, - the <> and <> provided as <> will not be overwritten. - *Default:* `true`. - -Set or change the <> or <> after the agent has started. -These config options can also be provided as part of the <>. - -[[apm-add-filter]] -==== `apm.addFilter(fn)` - -[small]#Added in: v0.1.0# - -Use `addFilter()` to supply a filter function. - -Each filter function will be called just before data is being sent to the APM Server. -This will allow you to manipulate the data being sent, -for instance to remove sensitive information like passwords etc. -(Note: Filters added via `addFilter` are *not* applied to the "metadata" -object sent to the APM Server -- use `addMetadataFilter` instead.) - -Each filter function will be called in the order they were added, -and will receive a `payload` object as the only argument, -containing the data about to be sent to the APM Server. - -The format of the payload depends on the event type being sent. -For details about the different formats, -see the {apm-guide-ref}/api-events.html[events intake API docs]. - -The filter function is synchronous and should return the manipulated payload object. -If a filter function doesn't return any value or returns a falsy value, -the remaining filter functions will not be called and the payload *will not* be sent to the APM Server. - -Example usage: - -[source,js] ----- -apm.addFilter(function redactSecretHeader(payload) { - if (payload.context && - payload.context.request && - payload.context.request.headers && - payload.context.request.headers['x-secret']) { - // redact sensitive data - payload.context.request.headers['x-secret'] = '[REDACTED]' - } - - // remember to return the modified payload - return payload -}) ----- - -Though you can also use filter functions to add new contextual information to the `user` and `custom` properties, -it's recommended that you use <> and <> for that purpose. - -[[apm-add-error-filter]] -==== `apm.addErrorFilter(fn)` - -[small]#Added in: v2.0.0# - -Similar to <>, -but the `fn` will only be called with error payloads. - -[[apm-add-transaction-filter]] -==== `apm.addTransactionFilter(fn)` - -[small]#Added in: v2.0.0# - -Similar to <>, -but the `fn` will only be called with transaction payloads. - -[[apm-add-span-filter]] -==== `apm.addSpanFilter(fn)` - -[small]#Added in: v2.0.0# - -Similar to <>, -but the `fn` will only be called with span payloads. - -[[apm-add-metadata-filter]] -==== `apm.addMetadataFilter(fn)` - -[small]#Added in: v3.14.0# - -Use `addMetadataFilter(fn)` to supply a filter function for the -{apm-guide-ref}/api-metadata.html#api-metadata-schema[metadata object] -sent to the APM Server. This will allow you to manipulate the data being -sent, for instance to remove possibly sensitive information. - -Each filter function will be called in the order they were added, and will -receive a `metadata` object as the only argument. The filter function is -synchronous and must return the manipulated object. Example usage: - -[source,js] ----- -apm.addMetadataFilter(function dropArgv(metadata) { - if (metadata.process && metadata.process.argv) { - delete metadata.process.argv - } - return metadata -}) ----- - -Warning: It is the responsibility of the author to ensure the returned object -conforms to the -{apm-guide-ref}/api-metadata.html#api-metadata-schema[metadata schema] -otherwise all APM data injest will fail. A metadata filter that breaks the -metadata will result in error logging from the agent, something like: - -[source,text] ----- -ERROR (elastic-apm-node): APM Server transport error (400): Unexpected APM Server response -APM Server accepted 0 events in the last request -Error: validation error: 'metadata' required - Document: {"metadata":null} ----- - - -[[apm-set-user-context]] -==== `apm.setUserContext(context)` - -[small]#Added in: v0.1.0# - -* `context` +{type-object}+ Accepts the following optional properties: -** `id` +{type-string}+ | +{type-number}+ The user's ID. -** `username` +{type-string}+ The user's username. -** `email` +{type-string}+ The user's e-mail. - -Call this to enrich collected performance data and errors with information about the user/client. -This function can be called at any point during the request/response life cycle (i.e. while a transaction is active). - -The given `context` will be added to the active transaction. -If no active transaction can be found, -`false` is returned. -Otherwise `true`. - -It's possible to call this function multiple times within the scope of the same active transaction. -For each call, the properties of the `context` argument are shallow merged with the context previously given. - -If an error is captured, -the context from the active transaction is used as context for the captured error, -and any custom context given as the 2nd argument to <> takes precedence and is shallow merged on top. - -The provided user context is stored under `context.user` in Elasticsearch on both errors and transactions. - -[[apm-set-custom-context]] -==== `apm.setCustomContext(context)` - -[small]#Added in: v0.1.0# - -* `context` +{type-object}+ Can contain any property that can be JSON encoded. - -Call this to enrich collected errors and transactions with any information that you think will help you debug performance issues or errors. -This function can be called at any point while a transaction is active (e.g. during the request/response life cycle of an incoming HTTP request). - -The provided custom context is stored under `context.custom` in APM Server pre-7.0, -or `transaction.custom` and `error.custom` in APM Server 7.0+. - -The given `context` will be added to the active transaction. -If no active transaction can be found, -`false` is returned. -Otherwise `true`. - -It's possible to call this function multiple times within the scope of the same active transaction. -For each call, the properties of the `context` argument are shallow merged with the context previously given. - -If an error is captured, -the context from the active transaction is used as context for the captured error, -and any custom context given as the 2nd argument to <> takes precedence and is shallow merged on top. - -TIP: Before using custom context, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -[[apm-set-label]] -==== `apm.setLabel(name, value[, stringify = true])` - -[small]#Added in: v0.1.0# + -[small]#Renamed from `apm.setTag()` to `apm.setLabel()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -* `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -apm.setLabel('productId', 42, false); ----- - -Set a label on the current transaction. -You can set multiple labels on the same transaction. -If an error happens during the current transaction, -it will also get tagged with the same label. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - -[[apm-add-labels]] -==== `apm.addLabels({ [name]: value }[, stringify = true])` - -[small]#Added in: v1.5.0# + -[small]#Renamed from `apm.addTags()` to `apm.addLabels()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `labels` +{type-object}+ Contains key/value pairs: -** `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -** `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -apm.addLabels({productId: 42, productName: 'butter'}, false); ----- - -Add several labels on the current transaction. -You can add labels multiple times. -If an error happens during the current transaction, -it will also get tagged with the same labels. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - -[[apm-set-global-label]] -==== `apm.setGlobalLabel(name, value)` - -[small]#Added in: v3.47.0# - -* `name` +{type-string}+ -* `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ - -Extends the <> configuration. It allows setting labels that are applied to all transactions. A potential use case is to specify a label with the state of your application: `'initializing' | 'available' | 'unhealthy'`. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - -[[apm-capture-error]] -==== `apm.captureError(error[, options][, callback])` - -[small]#Added in: v0.1.0# - -* `error` - Can be either an +{type-error}+ object, -a <>, -or a <> - -* `options` +{type-object}+ The following options are supported: - -** `timestamp` +{type-number}+ The time when the error happened. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -** `message` - If the `error` argument is an +{type-error}+ object, -it's possible to use this option to supply an additional message string that will be stored along with the error message under `log.message` - -** `user` - See <> for details about this option - -** `custom` - See <> for details about this option - -** `request` +{type-incomingmessage}+ You can associate an error with information about the incoming request to gain additional context such as the request url, headers, and cookies. -However, in most cases, the agent will detect if an error was in response to an http request and automatically add the request details for you. -See <> for more details. - -** `response` +{type-serverresponse}+ You can associate an error with information about the http response to get additional details such as status code and headers. -However, in most cases, the agent will detect if an error occured during an http request and automatically add response details for you. -See <> for more details. - -** `handled` +{type-boolean}+ Adds additional context to the exception to show -whether the error is handled or uncaught. Unhandled errors are immediately -flushed to APM server, in case the application is about the crash. -*Default:* `true`. - -** `labels` +{type-object}+ Add additional context with labels, these labels will be added to the error along with the labels from the current transaction. -See the <> method for details about the format. - -** `captureAttributes` +{type-boolean}+ Whether to include properties on the given +{type-error}+ object in the data sent to the APM Server (as `error.exception.attributes`). *Default:* `true`. - -** `skipOutcome` +{type-boolean}+ Whether to skip setting the outcome value for the current span to `failure`. See <> for more information. *Default:* `false`. - -** `parent` <> | <> | `null` - A Transaction or Span instance to make the parent of this error. If not given (or `undefined`), then the current span or transaction will be used. If `null` is given, then no span or transaction will be used. [small]#(Added in v3.33.0.)# - -* `callback` - Will be called after the error has been sent to the APM Server. -It will receive an `Error` instance if the agent failed to send the error, -and the id of the captured error. - -Send an error to the APM Server: - -[source,js] ----- -apm.captureError(new Error('boom!')) ----- - -[[message-strings]] -===== Message strings - -Instead of an `Error` object, -you can log a plain text message: - -[source,js] ----- -apm.captureError('Something happened!') ----- - -This will also be sent as an error to the APM Server, -but will not be associated with an exception. - -[[parameterized-message-object]] -===== Parameterized message object - -Instead of an `Error` object or a string, -you can supply a special parameterized message object: - -[source,js] ----- -apm.captureError({ - message: 'Could not find user %s with id %d in the database', - params: ['Peter', 42] -}) ----- - -This makes it possible to better group error messages that contain variable data like ID's or names. - -[[metadata]] -===== Metadata - -To ease debugging it's possible to send some extra data with each error you send to the APM Server. -The APM Server intake API supports a lot of different metadata fields, -most of which are automatically managed by the Elastic APM Node.js Agent. -But if you wish you can supply some extra details using `user` or `custom`. -For more details on the properties accepted by the events intake API see the {apm-guide-ref}/api-events.html[events intake API docs]. - -To supply any of these extra fields, -use the optional options argument when calling `apm.captureError()`. - -Here are some examples: - -[source,js] ----- -// Sending some extra details about the user -apm.captureError(error, { - user: { - id: 'unique_id', - username: 'foo', - email: 'foo@example.com' - } -}) - -// Sending some arbitrary details using the `custom` field -apm.captureError(error, { - custom: { - some_important_metric: 'foobar' - } -}) ----- - -To supply per-request metadata to all errors captured in one central location, -use <> and <>. - -[[http-requests]] -===== HTTP requests - -Besides the options described in the <>, -you can use the `options` argument to associate the error with an HTTP request: - -[source,js] ----- -apm.captureError(err, { - request: req // an instance of http.IncomingMessage -}) ----- - -This will log the URL that was requested, -the HTTP headers, -cookies and other useful details to help you debug the error. - -In most cases, this isn't needed, -as the agent is pretty smart at figuring out if your Node.js app is an HTTP server and if an error occurred during an incoming request. -In which case it will automate this processes for you. - -[[http-responses]] -===== HTTP responses - -Besides the options described in the <>, -you can use the `options` argument to associate the error with an HTTP response: - -[source,js] ----- -apm.captureError(err, { - response: res // an instance of http.ServerResponse -}) ----- - -This will log the response status code, -headers and other useful details to help you debug the error. - -In most cases, this isn't needed, -as the agent is pretty smart at figuring out if your Node.js app is an HTTP server and if an error occurred during an incoming request. -In which case it will automate this processes for you. - -[[apm-middleware-connect]] -==== `apm.middleware.connect()` - -[small]#Added in: v0.1.0# - -Returns a middleware function used to collect and send errors to the APM Server. - -[source,js] ----- -const apm = require('elastic-apm-node').start() -const connect = require('connect') - -const app = connect() - -// your regular middleware: -app.use(...) -app.use(...) - -// your main HTTP router -app.use(function (req, res, next) { - throw new Error('Broke!') -}) - -// add Elastic APM in the bottom of the middleware stack -app.use(apm.middleware.connect()) - -app.listen(3000) ----- - -NOTE: `apm.middleware.connect` _must_ be added to the middleware stack _before_ any other error handling middleware functions or there's a chance that the error will never get to the agent. - -[[apm-start-transaction]] -==== `apm.startTransaction([name][, type][, options])` - -[small]#Added in: v0.1.0# + -[small]#Transaction `subtype` and `action` deprecated in: v3.25.0# + -[small]#Transaction `subtype` and `action` removed in: v4.0.0# - -* `name` +{type-string}+ The name of the transaction. -You can always set this later via <> or <>. -*Default:* `unnamed` - -* `type` +{type-string}+ The type of the transaction. -You can always set this later via <>. - -* `options` +{type-object}+ The following options are supported: - -** `startTime` +{type-number}+ The time when the transaction started. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -** `childOf` +{type-string}+ A W3C trace-context "traceparent" string, typically received from a remote service call. - -** `tracestate` +{type-string}+ A W3C trace-context "tracestate" string. - -** `links` +{type-array}+ Span links. -A transaction can refer to zero or more other transactions or spans (separate -from its parent). Span links will be shown in the Kibana APM app trace view. -The `links` argument is an array of objects with a single "context" field -that is a `Transaction`, `Span`, or W3C trace-context 'traceparent' string. -For example: `apm.startTransaction('aName', { links: [{ context: anotherSpan }] })`. - -Start a new custom/manual transaction. -See the <> docs for details on how to use custom transactions. - -Note that the APM agent will automatically start a transaction for incoming -HTTP requests. You only need to use this function to create custom transactions, -for example for a periodic background routine. There's a special `type` called -`request` which is used by the agent for the transactions automatically created -when an incoming HTTP request is detected. - -If the APM agent has not yet been started, then a do-nothing "no-op" transaction -object will be returned. - - -[[apm-end-transaction]] -==== `apm.endTransaction([result][, endTime])` - -[small]#Added in: v0.1.0# - -* `result` +{type-string}+ Describes the result of the transaction. -This is typically the HTTP status code, -or e.g. "success" or "failure" for a background task - -* `endTime` +{type-number}+ The time when the transaction ended. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -Ends the active transaction. -If no transaction is currently active, -nothing happens. - -Note that the agent will do this for you automatically for all regular HTTP transactions. -You only need to use this function to end custom transactions created by <> or if you wish the end a regular transaction prematurely. - -Alternatively you can call <> directly on an active transaction object. - -[[apm-current-transaction]] -==== `apm.currentTransaction` - -[small]#Added in: v1.9.0# - -Get the currently active transaction, -if used within the context of a transaction. - -NOTE: If there's no active transaction available, -`null` will be returned. - -[[apm-current-span]] -==== `apm.currentSpan` - -[small]#Added in: v2.0.0# - -Get the currently active span, -if used within the context of a span. - -NOTE: If there's no active span available, -`null` will be returned. - -[[apm-current-traceparent]] -==== `apm.currentTraceparent` - -[small]#Added in: v2.9.0# - -Get the serialized traceparent string of the current transaction or span. - -NOTE: If there's no active transaction or span available, -`null` will be returned. - -[[apm-set-transaction-name]] -==== `apm.setTransactionName(name)` - -[small]#Added in: v0.1.0# - -* `name` +{type-string}+ Set or overwrite the name of the current transaction. - -If you use a supported router/framework the agent will automatically set the transaction name for you. - -If you do not use Express, hapi, koa-router, Restify, or Fastify or if the agent for some reason cannot detect the name of the HTTP route, -the transaction name will default to `METHOD unknown route` (e.g. `POST unknown route`). - -Read more about naming routes manually in the <> article. - -[[apm-start-span]] -==== `apm.startSpan([name][, type][, subtype][, action][, options])` - -[small]#Added in: v1.1.0# - -* `name` +{type-string}+ The name of the span. -You can alternatively set this via <>. -*Default:* `unnamed` - -* `type` +{type-string}+ The type of the span. -You can alternatively set this via <>. - -* `subtype` +{type-string}+ The subtype of the span. -You can alternatively set this via <>. - -* `action` +{type-string}+ The action of the span. -You can alternatively set this via <>. - -* `options` +{type-object}+ The following options are supported: - -** `startTime` +{type-number}+ The time when the span started. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -** `exitSpan` +{type-boolean}+ Make an "exit span". -Exit spans represent outgoing communication. They are used to create a node -in the {kibana-ref}/service-maps.html[Service Map] and a downstream service -in the {kibana-ref}/dependencies.html[Dependencies Table]. The provided subtype -will be used as the downstream service name. - -** `links` +{type-array}+ Span links. -A span can refer to zero or more other transactions or spans (separate from -its parent). Span links will be shown in the Kibana APM app trace view. The -`links` argument is an array of objects with a single "context" field that is a -`Transaction`, `Span`, or W3C trace-context 'traceparent' string. For example: -`apm.startSpan('aName', { links: [{ context: anotherSpan }] })`. - -Start and return a new custom span associated with the current active transaction. -This is the same as getting the current transaction with `apm.currentTransaction` and, -if a transaction was found, -calling `transaction.startSpan(name, type, options)` on it. - -When a span is started it will measure the time until <> is called. - -See <> docs for details on how to use custom spans. - -NOTE: If there's no active transaction available, -`null` will be returned. - -[[apm-handle-uncaught-exceptions]] -==== `apm.handleUncaughtExceptions([callback])` - -[small]#Added in: v0.1.0# - -By default, the agent will terminate the Node.js process when an uncaught exception is detected. -Use this function if you need to run any custom code before the process is terminated. - -[source,js] ----- -apm.handleUncaughtExceptions(function (err) { - // Do your own stuff... and then exit: - process.exit(1) -}) ----- - -The callback is called *after* the event has been sent to the APM Server with the following arguments: - -* `err` +{type-error}+ the captured exception - -This function will also enable the uncaught exception handler if it was disabled using the <> configuration option. - -If you don't specify a callback, -the node process is terminated automatically when an uncaught exception has been captured and sent to the APM Server. - -https://nodejs.org/api/process.html#process_event_uncaughtexception[It is recommended] that you don't leave the process running after receiving an uncaught exception, -so if you are using the optional callback, -remember to terminate the node process. - -[[apm-flush]] -==== `apm.flush([callback])` - -[small]#Added in: v0.12.0# - -[source,js] ----- -// with node-style callback -apm.flush(function (err) { - // Flush complete -}) - -// with promises -apm.flush().then(function () { - // Flush complete -}).catch(function (err) { - // Flush returned an error -}) - -// inside of an async function -try { - await apm.flush() - // Flush complete -} catch (err) { - // Flush returned an error -} ----- - -Manually end the active outgoing HTTP request to the APM Server. -The HTTP request is otherwise ended automatically at regular intervals, -controlled by the <> and <> config options. - -If an optional `callback` is provided as the first argument to this method, it will call `callback(flushErr)` when complete. -If no `callback` is provided, then a `Promise` will be returned, which will either resolve with `void` or reject with `flushErr`. - -The callback is called (or the `Promise` resolves if no `callback` argument is provided) *after* the active HTTP request has ended. -The callback is called even if no HTTP request is currently active. - -[[apm-lambda]] -==== `apm.lambda([type, ]handler)` - -[small]#Added in: v1.4.0# - -[source,js] ----- -exports.hello = apm.lambda(function (event, context, callback) { - callback(null, `Hello, ${payload.name}!`) -}) ----- - -Manually instrument an AWS Lambda function to form a transaction around each execution. -Optionally, a type may also be provided to group lambdas together. By default, -"lambda" will be used as the type name. - -Read more lambda support in the <> article. - -[[apm-add-patch]] -==== `apm.addPatch(modules, handler)` - -[small]#Added in: v2.7.0# - -* `modules` +{type-string}+ | +{type-string-array}+ -Name of module(s) to apply the patch to, when required. -* `handler` +{type-function}+ | +{type-string}+ -Must be a patch function or a path to a module exporting a patch function -** `exports` +{type-object}+ The original export object of the module -** `agent` - The agent instance to use in the patch function -** `options` +{type-object}+ The following options are supported: -*** `version` +{type-string}+ | +{type-undefined}+ The module version, if applicable. -*** `enabled` +{type-boolean}+ A flag indicating if the instrumentation is enabled. -Any module patch can be disabled, by module name, with <>. - -Register a module patch to apply on intercepted `require` calls. - -A module can have any number of patches and will be applied in the order they are added. - -[source,js] ----- -apm.addPatch('timers', (exports, agent, { version, enabled }) => { - const setTimeout = exports.setTimeout - exports.setTimeout = (fn, ms) => { - const span = agent.startSpan('set-timeout') - return setTimeout(() => { - span.end() - fn() - }, ms) - } - - return exports -}) - -// or ... - -apm.addPatch('timers', './timer-patch') ----- - -This and the other "Patch"-related API methods should be called *before* -starting the APM agent. Changes after the agent has started and relevant -modules have been `require`d can have surprising caching behavior. - -[[apm-remove-patch]] -==== `apm.removePatch(modules, handler)` - -[small]#Added in: v2.7.0# - -Removes a module patch. -This will generally only be needed when replacing an existing patch. -To _disable_ instrumentation while keeping context propagation support, see <>. - -[source,js] ----- -apm.removePatch('timers', './timers-patch') - -// or ... - -apm.removePatch(['timers'], './timers-patch') - -// or ... - -apm.removePatch('timers', timerPatchFunction) ----- - -[[apm-clear-patches]] -==== `apm.clearPatches(modules)` - -[small]#Added in: v2.7.0# - -Clear all patches for the given module. -This will generally only be needed when replacing an existing patch. -To _disable_ instrumentation while keeping context propagation support, see <>. - -[source,js] ----- -apm.clearPatches('timers') - -// or ... - -apm.clearPatches(['timers']) ----- - -[[apm-current-trace-ids]] -==== `apm.currentTraceIds` - -[small]#Added in: v2.17.0# - -`apm.currentTraceIds` produces an object containing `trace.id` and either `transaction.id` or `span.id` when a current transaction or span is available. -When no transaction or span is available it will return an empty object. -This enables <> to APM traces with structured loggers. - -[source,js] ----- -{ - "trace.id": "abc123", - "transaction.id": "abc123" -} -// or ... -{ - "trace.id": "abc123", - "span.id": "abc123" -} ----- - -[[apm-register-custom-metrics]] -==== `apm.registerMetric(name[, labels], callback)` - -experimental::[] - -* `name` +{type-string}+ -Name of the metrics. -* `labels` +{type-object}+ Contains key/value pairs. -Optional labels. Omittable. -* `callback` +{type-function}+ -Must be a function that returns the current metric value. - -Register a metric callback. - -Take care not to use the names of <>. - -[source,js] ----- -apm.registerMetric( 'ws.connections' , () => { - return wss.clients.size; -}) - -// or, to additionally label the metric with "module: 'ws'": - -apm.registerMetric( 'ws.connections' , {module : 'ws'}, () => { - return wss.clients.size; -}) - ----- - -[[apm-transaction-outcome]] -==== `apm.setTransactionOutcome(outcome)` - -[small]#Added in: v3.12.0# - -* `outcome` +{type-string}+ - -Will set the outcome property on the _current_ transaction. - -See the <> for more information. - -[[apm-span-outcome]] -==== `apm.setSpanOutcome(outcome)` - -[small]#Added in: v3.12.0# - -* `outcome` +{type-string}+ - -Will set the outcome property on the _current_ span. - -See the <> for more information. diff --git a/docs/api-opentelemetry.asciidoc b/docs/api-opentelemetry.asciidoc deleted file mode 100644 index 1ac32f4863..0000000000 --- a/docs/api-opentelemetry.asciidoc +++ /dev/null @@ -1,259 +0,0 @@ -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/opentelemetry-bridge.html[elastic.co] -endif::[] - -[[opentelemetry-bridge]] -== OpenTelemetry bridge - -NOTE: Integration with the OpenTelemetry Tracing API was added as experimental in v3.34.0. -Integration with the OpenTelemetry Metrics API was added as experimental in v3.45.0. - -The Elastic APM OpenTelemetry bridge allows one to use the vendor-neutral -https://opentelemetry.io/docs/instrumentation/js/[OpenTelemetry API] -(https://www.npmjs.com/package/@opentelemetry/api[`@opentelemetry/api`]) in -your code, and have the Elastic Node.js APM agent handle those API calls. -This allows one to use the Elastic APM agent for tracing and metrics without any -vendor lock-in to the APM agent's own <> when adding manual -tracing or custom metrics. - - -[float] -[[otel-tracing-api]] -=== Using the OpenTelemetry Tracing API - -① First, you will need to add the Elastic APM agent and OpenTelemetry API -dependencies to your project. The minimum required OpenTelemetry API version is -1.0.0; see <> -for the current maximum supported API version. For example: - -[source,bash] ----- -npm install --save elastic-apm-node @opentelemetry/api ----- - -② Second, you will need to configure and start the APM agent. This can be done -completely with environment variables (so that there is no need to touch -your application code): - -[source,bash] ----- -export ELASTIC_APM_SERVER_URL='' -export ELASTIC_APM_SECRET_TOKEN='' # or ELASTIC_APM_API_KEY=... -export ELASTIC_APM_OPENTELEMETRY_BRIDGE_ENABLED=true <1> -export NODE_OPTIONS='-r elastic-apm-node/start.js' # Tell node to preload and start the APM agent -node my-app.js ----- -<1> Future versions may drop this config var and enable usage of the tracing API by default. - -Or, alternatively, you can configure and start the APM agent at the top of your -application code: - -[source,js] ----- -require('elastic-apm-node').start({ - serverUrl: '', - secretToken: '', // or, apiKey: '' - opentelemetryBridgeEnabled: true -}); - -// Application code ... ----- - -See <> for other configuration options. - -③ Finally, you can use the https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_api.html[OpenTelemetry API] -for any manual tracing in your code. For example, the following script uses -https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Tracer.html#startActiveSpan[Tracer#startActiveSpan()] -to trace an outgoing HTTPS request: - -[source,js] ----- -const https = require('https') -const otel = require('@opentelemetry/api') -const tracer = otel.trace.getTracer('trace-https-request') - -tracer.startActiveSpan('makeRequest', span => { - https.get('https://httpstat.us/200', (response) => { - console.log('STATUS:', response.statusCode) - const body = [] - response.on('data', (chunk) => body.push(chunk)) - response.on('end', () => { - console.log('BODY:', body.toString()) - span.end() - }) - }) -}) ----- - -The APM agent source code repository includes -https://github.com/elastic/apm-agent-nodejs/tree/main/examples/opentelemetry-bridge[some examples using the OpenTelemetry tracing bridge]. - - -[float] -[[otel-metrics-api]] -=== Using the OpenTelemetry Metrics API - -① As above, install the needed dependencies. The minimum required OpenTelemetry -API version is 1.3.0 (the version when metrics were added); see <> -for the current maximum supported API version. For example: - -[source,bash] ----- -npm install --save elastic-apm-node @opentelemetry/api ----- - -② Configure and start the APM agent. This can be done completely with -environment variables -- as shown below -- or in code. (See <> -and <> for other -configuration options.) - -[source,bash] ----- -export ELASTIC_APM_SERVER_URL='' -export ELASTIC_APM_SECRET_TOKEN='' # or ELASTIC_APM_API_KEY=... -export NODE_OPTIONS='-r elastic-apm-node/start.js' # Tell node to preload and start the APM agent -node my-app.js ----- - -③ Finally, you can use the OpenTelemetry Metrics API, to -https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Meter.html[create metrics] -and the APM agent will periodically ship those metrics to your Elastic APM -deployment where you can visualize them in Kibana. - -[source,js] ----- -// otel-metrics-hello-world.js <1> -const { createServer } = require('http') -const otel = require('@opentelemetry/api') - -const meter = otel.metrics.getMeter('my-meter') -const numReqs = meter.createCounter('num_requests', { description: 'number of HTTP requests' }) - -const server = createServer((req, res) => { - numReqs.add(1) - req.resume() - req.on('end', () => { - res.end('pong\n') - }) -}) -server.listen(3000, () => { - console.log('listening at http://127.0.0.1:3000/') -}) ----- -<1> The full example is https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/otel-metrics-hello-world.js[here]. - - -[float] -[[otel-metrics-sdk]] -==== Using the OpenTelemetry Metrics SDK - -The Elastic APM agent also supports exporting metrics to APM server when the -OpenTelemetry Metrics *SDK* is being used directly. You might want to use -the OpenTelemetry Metrics SDK to use a https://opentelemetry.io/docs/reference/specification/metrics/sdk/#view[`View`] -to configure histogram bucket sizes, to setup a Prometheus exporter, or for -other reasons. For example: - -[source,js] ----- -// use-otel-metrics-sdk.js <1> -const otel = require('@opentelemetry/api') -const { MeterProvider } = require('@opentelemetry/sdk-metrics') -const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus') - -const exporter = new PrometheusExporter({ host: '127.0.0.1', port: 3001 }) -const meterProvider = new MeterProvider() -meterProvider.addMetricReader(exporter) -otel.metrics.setGlobalMeterProvider(meterProvider) - -const meter = otel.metrics.getMeter('my-meter') -const latency = meter.createHistogram('latency', { description: 'Response latency (s)' }) -// ... ----- -<1> The full example is https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/use-otel-metrics-sdk.js[here]. - - -[float] -[[otel-metrics-conf]] -==== OpenTelemetry Metrics configuration - -A few configuration options can be used to control OpenTelemetry Metrics support. - -- Specific metrics names can be filtered out via the <> configuration option. -- Integration with the OpenTelemetry Metrics API can be disabled via the <> configuration option. -- Integration with the OpenTelemetry Metrics SDK can be disabled via the <> configuration option. -- All metrics support in the APM agent can be disabled via the <> configuration option. -- The default histogram bucket boundaries are different from the OpenTelemetry default, to provide better resolution. The boundaries used by the APM agent can be configured with the <> configuration option. - - -[float] -[[otel-architecture]] -=== Bridge architecture - -The OpenTelemetry Tracing bridge works similarly to the -https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node/[OpenTelemetry Node.js Trace SDK]. -It registers Tracer and ContextManager providers with the OpenTelemetry API. -Subsequent `@opentelemetry/api` calls in user code will use those providers. -The APM agent translates from OpenTelemetry to Elastic APM semantics and sends -tracing data to your APM server for full support in -https://www.elastic.co/apm[Elastic Observability's APM app]. - -Some examples of semantic translations: The first entry span of a -service (e.g. an incoming HTTP request) will be converted to an -{apm-guide-ref}/data-model-transactions.html[Elasic APM `Transaction`], -subsequent spans are mapped to -{apm-guide-ref}/data-model-spans.html[Elastic APM `Span`s]. OpenTelemetry Span -attributes are translated into the appropriate fields in Elastic APM's data -model. - -The only difference, from the user's point of view, is in the setup of tracing. -Instead of setting up the OpenTelemetry JS SDK, one sets up the APM agent -as <>. - ---- - -The OpenTelemetry Metrics support, is slightly different. If your code uses -just the Metrics *API*, then the APM agent provides a full MeterProvider so -that metrics are accumulated and sent to APM server. If your code uses the -Metrics *SDK*, then the APM agents adds a MetricReader to your MeterProvider -to send metrics on to APM server. This allows you to use the APM agent as -either an easy setup for using metrics or in conjunction with your existing -OpenTelemetry Metrics configuration. - -[float] -[[otel-caveats]] -=== Caveats - -Not all features of the OpenTelemetry API are supported. This section describes -any limitations and differences. - -[float] -[[otel-caveats-tracing]] -===== Tracing - -- Span Link Attributes. Adding links when https://open-telemetry.github.io/opentelemetry-js/interfaces/\_opentelemetry_api.Tracer.html[starting a span] is supported, but any added span link *attributes* are silently dropped. -- Span events (https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Span.html#addEvent[`Span#addEvent()`]) are not currently supported. Events will be silently dropped. -- https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_api.PropagationAPI.html[Propagating baggage] within or outside the process is not supported. Baggage items are silently dropped. - -[float] -[[otel-caveats-metrics]] -===== Metrics - -- Metrics https://opentelemetry.io/docs/reference/specification/metrics/data-model/#exemplars[exemplars] are not supported. -- https://opentelemetry.io/docs/reference/specification/metrics/data-model/#summary-legacy[Summary metrics] are not supported. -- https://opentelemetry.io/docs/reference/specification/metrics/data-model/#exponentialhistogram[Exponential Histograms] are not yet supported. -- The `sum`, `count`, `min` and `max` within the OpenTelemetry histogram data are discarded. -- The default histogram bucket boundaries are different from the OpenTelemetry default. They provide better resolution. They can be configured with the <> configuration option. -- Metrics label names are dedotted (`s/\./_/g`) in APM server to avoid possible mapping collisions in Elasticsearch. -- The default https://github.com/elastic/apm/blob/main/specs/agents/metrics-otel.md#aggregation-temporality[Aggregation Temporality] used differs from the OpenTelemetry default -- preferring *delta*-temporality (nicer for visualizing in Kibana) to cumulative-temporality. - -Metrics support requires an APM server >=7.11 -- for earlier APM server -versions, metrics with label names including `.`, `*`, or `"` will get dropped. - - -[float] -[[otel-caveats-logs]] -===== Logs - -The OpenTelemetry Logs API is currently not support -- only the Tracing and -Metrics APIs. diff --git a/docs/api.asciidoc b/docs/api.asciidoc deleted file mode 100644 index d3de4faa32..0000000000 --- a/docs/api.asciidoc +++ /dev/null @@ -1,26 +0,0 @@ -[[api]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/api.html[elastic.co] -endif::[] - -== API Reference - -The API reference documentation is divided into three parts: - -* <> - All functions and properties on the `Agent` object. -An instance of the `Agent` object is acquired by requiring/importing the Node.js APM Agent module. -The `Agent` is a singleton and the instance is usually referred to by the variable `apm` in this documentation - -* <> - All functions and properties on the `Transaction` object. -An instance of the `Transaction` object is acquired by calling `apm.startTransaction()` - -* <> - All functions and properties on the `Span` object. -An instance of the `Span` object is acquired by calling `apm.startSpan()` - -include::./agent-api.asciidoc[Agent API documentation] - -include::./transaction-api.asciidoc[Transaction API documentation] - -include::./span-api.asciidoc[Span API documentation] diff --git a/docs/azure-functions.asciidoc b/docs/azure-functions.asciidoc deleted file mode 100644 index 08aa0884e2..0000000000 --- a/docs/azure-functions.asciidoc +++ /dev/null @@ -1,155 +0,0 @@ -:framework: Azure Functions - -[[azure-functions]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/azure-functions.html[elastic.co] -endif::[] - -=== Monitoring Node.js Azure Functions - -The Node.js APM Agent can trace function invocations in an https://learn.microsoft.com/en-us/azure/azure-functions/[Azure Functions] app. - - -[float] -[[azure-functions-prerequisites]] -==== Prerequisites - -You need an APM Server to send APM data to. Follow the -{apm-guide-ref}/apm-quick-start.html[APM Quick start] if you have not set one up -yet. You will need your *APM server URL* and an APM server *secret token* (or -*API key*) for configuring the APM agent below. - -You will also need an Azure Function app to monitor. If you do not have an -existing one, you can follow https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-node#create-supporting-azure-resources-for-your-function[this Azure guide] -to create one. - -[IMPORTANT] -==== -If you use `func init --javascript ...` as suggested in this Azure guide, -then it is recommended that you *uninstall* the `azure-functions-core-tools` -dependency by running `npm uninstall azure-functions-core-tools` and -https://github.com/Azure/azure-functions-core-tools#installing[install it separately]. -Having `azure-functions-core-tools` as a "devDependency" in your package.json -will result in unreasonably large deployments that will be very slow to publish -and will run your Azure Function app VM out of disk space. -==== - -You can also take a look at and use this https://github.com/elastic/apm-agent-nodejs/tree/main/examples/an-azure-function-app/[Azure Functions example app with Elastic APM already integrated]. - -[float] -[[azure-functions-setup]] -==== Step 1: Add the APM agent dependency - -Add the `elastic-apm-node` module as a dependency of your application: - -[source,bash] ----- -npm install elastic-apm-node --save # or 'yarn add elastic-apm-node' ----- - - -[float] -==== Step 2: Start the APM agent - -For the APM agent to instrument Azure Functions, it needs to be started when the -Azure host starts its Node.js worker processes. The best way to do so is by -using an app-level entry point (support for this was added for Node.js Azure -Functions https://github.com/Azure/azure-functions-nodejs-worker/issues/537[here]). - -1. Create a module to start the APM agent. For example, a file at the root of your repository named "initapm.js": -+ -[source,javascript] ----- -// initapm.js -require('elastic-apm-node').start({ - <1> -}) ----- -<1> Optional <> can be added here. - -2. Add a "main" entry to your package.json pointing to the app init file. -+ -[source,json] ----- -... - "main": "initapm.js", -... ----- -+ -If your application already has a "main" init file, you can instead add the -`require('elastic-apm-node').start()` to top of that file. - - -[float] -==== Step 3: Configure the APM agent - -The APM agent can be <> with options to the -`.start()` method or with environment variables. Using environment variables -allows one to use https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#settings[application settings in the Azure Portal] which allows hiding values and updating settings -without needing to re-deploy code. - -Open _Configuration > Application settings_ for your Function App in the Azure Portal -and set: - -[source,yaml] ----- -ELASTIC_APM_SERVER_URL: -ELASTIC_APM_SECRET_TOKEN: ----- - -For example: - -image::./images/azure-functions-configuration.png[Configuring the APM Agent in the Azure Portal] - -For local testing via `func start` you can set these environment variables in -your terminal, or in the "local.settings.json" file. See the -<> for full details on supported -configuration variables. - - -[float] -==== Step 4: (Re-)deploy your Azure Function app - -[source,bash] ----- -func azure functionapp publish ----- - -Now, when you invoke your Azure Functions, you should see your application -show up as a Service in the APM app in Kibana and see APM transactions for -function invocations. Tracing data is forwarded to APM server after a period -of time, so allow a minute or so for data to appear. - - -[float] -[[azure-functions-limitations]] -==== Limitations - -This instrumentation does not send an APM transaction or error to APM server when -a handler has an `uncaughtException` or `unhandledRejection`. -The Azure Functions Node.js reference https://learn.microsoft.com/en-ca/azure/azure-functions/functions-reference-node#use-async-and-await[has a section] with best practices for avoiding these cases. - -Azure Functions instrumentation currently does _not_ collect system metrics in -the background because of a concern with unintentionally increasing Azure -Functions costs (for Consumption plans). - - -[float] -[[azure-functions-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[azure-functions-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[azure-functions-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/configuration.asciidoc b/docs/configuration.asciidoc deleted file mode 100644 index af34355491..0000000000 --- a/docs/configuration.asciidoc +++ /dev/null @@ -1,1448 +0,0 @@ -[[configuration]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/configuration.html[elastic.co] -endif::[] - -=== Configuration options - -The available configuration options and equivalent environment variable names are listed below. - -For more information on setting configuration options, including configuration precedence, -see <>. - -TIP: The only required parameter is <>. -However, -the agent will use the `name` from `package.json` by default if available. - -[[service-name]] -==== `serviceName` - -* *Type:* String -* *Default:* `name` field of `package.json`, or "unknown-nodejs-service" -* *Env:* `ELASTIC_APM_SERVICE_NAME` - -The name to identify this service in Elastic APM. Multiple instances of the -same service should use the same name. -Allowed characters: `a-z`, `A-Z`, `0-9`, `-`, `_`, and space. - -If `serviceName` is not provided, the agent will attempt to use the "name" field -from "package.json" -- looking up from the current working directory. The name -will be normalized to the allowed characters. If the name cannot be inferred -from package.json, then a fallback value of "unknown-nodejs-service" is used. - - -[[service-node-name]] -==== `serviceNodeName` - -* *Type:* String -* *Env:* `ELASTIC_APM_SERVICE_NODE_NAME` - -A unique name for the service node. -This is optional, and if omitted, -the APM Server will fall back on `system.container.id` if available, -and finally `host.name` if necessary. - -This option allows you to set the node name manually to ensure uniqueness and meaningfulness. - -[[secret-token]] -==== `secretToken` - -* *Type:* String -* *Env:* `ELASTIC_APM_SECRET_TOKEN` - -The secret token optionally expected by the APM Server. - -[[api-key]] -==== `apiKey` - -* *Type:* String -* *Env:* `ELASTIC_APM_API_KEY` - -The API key optionally expected by the APM Server. This is an alternative to `secretToken`. - -This base64-encoded string is used to ensure that only your agents can send data to your APM server. You must have created the API key using the APM server command line tool. Please see the {apm-guide-ref}/api-key.html[APM server documentation] for details on how to do that. - -NOTE: This feature is fully supported in the APM Server versions >= 7.6. - -WARNING: The API key is sent as plain-text in every request to the server, so you should secure your communications using HTTPS. Unless you do so, your API key could be observed by an attacker. - -[[server-url]] -==== `serverUrl` - -* *Type:* String -* *Default:* `http://127.0.0.1:8200` -* *Env:* `ELASTIC_APM_SERVER_URL` - -The URL to where the APM Server is deployed. - -[[validate-server-cert]] -==== `verifyServerCert` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_VERIFY_SERVER_CERT` - -By default the agent will validate the TLS/SSL certificate of the APM Server if using HTTPS. -You can switch this behavior off by setting this option to `false`. - -[[server-ca-cert-file]] -==== `serverCaCertFile` - -* *Type:* String -* *Env:* `ELASTIC_APM_SERVER_CA_CERT_FILE` - -By default the agent will validate the TLS/SSL certificate of the APM Server using the -well-known CAs curated by Mozilla, as described in the Node.js docs for -https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options[`tls.createSecureContext()`]. -You can set this option to the path of a file containing a CA certificate that will be -used instead. - -Specifying this option is required when using self-signed certificates, unless server -certificate validation is disabled. - -[[service-version]] -==== `serviceVersion` - -* *Type:* String -* *Default:* `version` field of `package.json` -* *Env:* `ELASTIC_APM_SERVICE_VERSION` - -The version of the app currently running. -This could be the version from your `package.json` file, -a git commit reference, -or any other string that might help you pinpoint a specific version or deployment. - -[[active]] -==== `active` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_ACTIVE` - -A boolean specifying if the agent should be active or not. -If active, -the agent will instrument incoming HTTP requests and track errors. -Normally you would not want to run the agent in your development or testing environments. -If you are using the `NODE_ENV` environment variable, -you can use this to determine the state: - -[source,js] ----- -var options = { - active: process.env.NODE_ENV === 'production' -} ----- - -[[environment]] -==== `environment` - -* *Type:* String -* *Default:* `process.env.NODE_ENV || 'development'` -* *Env:* `ELASTIC_APM_ENVIRONMENT` - -The environment name is automatically logged along with all errors and transactions. -If you want to overwrite this, -use this option. - -Environments allow you to easily filter data on a global level in the APM app. -It's important to be consistent when naming environments across agents. -See {kibana-ref}/filters.html#environment-selector[environment selector] in the APM app for more information. - -NOTE: This feature is fully supported in the APM app in Kibana versions >= 7.2. -You must use the query bar to filter for a specific environment in versions prior to 7.2. - - -[[context-propagation-only]] -==== `contextPropagationOnly` - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_CONTEXT_PROPAGATION_ONLY` - -If set to `true`, the agent will reduce its work to the minimum required to -support automatic https://w3c.github.io/trace-context/[HTTP trace-context] -propagation (for distributed tracing) and log correlation. The agent will not -communicate with APM server (no tracing data is forwarded, no central -configuration is retrieved) and will not collect metrics. This setting allows -using the APM agent with a service that cannot use APM server. Usage is expected -to be rare. - - -[[disable-send]] -==== `disableSend` - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_DISABLE_SEND` - -If set to `true`, the agent will work as usual, except that it will not attempt -to communicate with APM server. Tracing and metrics data will be dropped and the -agent won't be able to receive central configuration, which means that any other -configuration cannot be changed in this state without restarting the service. - -This setting is similar to <> in functionality. However, `disableSend` does not -attempt to reduce time spent collecting tracing data. A use case for this -setting is in CI environments, to test agent functionality without requiring a -configured APM server. - - -[[instrument]] -==== `instrument` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_INSTRUMENT` - -A boolean specifying if the agent should automatically apply instrumentation to supported modules when they are loaded. - -Note that both `active` and `instrument` needs to be `true` for instrumentation to be running. - -[[instrument-incoming-http-requests]] -==== `instrumentIncomingHTTPRequests` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_INSTRUMENT_INCOMING_HTTP_REQUESTS` - -A boolean specifying if the agent should instrument incoming HTTP requests. - -To configure if outgoing http requests should be instrumented, -see <>. - -[[central-config]] -==== `centralConfig` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_CENTRAL_CONFIG` - -Activate APM Agent Configuration via Kibana. -If set to `true`, the client will poll the APM Server regularly for new agent configuration. - -NOTE: This feature requires APM Server v7.3 or later. -More information is available in {kibana-ref}/agent-configuration.html[APM Agent configuration]. - -[[context-manager]] -==== `contextManager` - -[small]#Added in: v3.37.0# + -[small]#The "patch" context manager was removed in: v4.0.0# - -* *Type:* String -* *Env:* `ELASTIC_APM_CONTEXT_MANAGER` - -This configuration option provides a way to override the APM agent's default -technique for tracking Node.js asynchronous tasks; sometimes referred to as "run -context", "async context", or just "context". Most users should not need to -change this setting. This setting replaces the older `asyncHooks` configuration -option. - -To effectively trace an application, the APM agent needs to track the logical -thread of control through asynchronous tasks. The preferred mechanism for this -is https://nodejs.org/api/async_context.html#class-asynclocalstorage[`AsyncLocalStorage`], -usable in Node.js versions >=14.5 and >=12.19. In older versions of Node, the APM -agent will fallback to using -https://nodejs.org/api/async_hooks.html[`async_hooks`], which can have a higher -performance overhead, especially in Promise-heavy applications. - -Supported values for `contextManager` are: - -- `"asynclocalstorage"` - Use the `AsyncLocalStorage` mechanism, if able. Otherwise it will fallback to using `async_hooks`. -- `"asynchooks"` - Use the `async_hooks` mechanism. (Using this value will restore the agent behavior from before v3.37.0.) - - -[[transaction-ignore-urls]] -==== `transactionIgnoreUrls` - -* *Type:* Array -* *Default:* `[]` -* *Env:* `ELASTIC_APM_TRANSACTION_IGNORE_URLS` -* <> *Central config name:* `transaction_ignore_urls` - -Array or comma-separated string used to restrict requests for certain URLs from being instrumented. - -When an incoming HTTP request is detected, its URL pathname will be tested against each string -in this list. The `transactionIgnoreUrls` property supports exact string matches, -simple wildcard (`*`) matches, and may not include commas. Wildcard matches are -case-insensitive by default. You may make wildcard searches case-sensitive by -using the `(?-i)` prefix. - -Note that all errors that are captured during a request to an ignored URL are still sent -to the APM Server regardless of this setting. - -If you need full regular expression pattern matching, see <>. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - transactionIgnoreUrls: [ - '/ping', - '/fetch/*', - '(?-i)/caseSensitiveSearch' - ] -}) ----- - - -[[ignore-urls]] -==== `ignoreUrls` - -* *Type:* Array -* *Default:* `undefined` - -Used to restrict requests to certain URLs from being instrumented. - -This property should be set to an array containing one or more strings or `RegExp` objects. -When an incoming HTTP request is detected, -its URL will be tested against each element in this list. -If an element in the array is a `String`, -an exact match will be performed. -If an element in the array is a `RegExp` object, -its test function will be called with the URL being tested. - -Note that all errors that are captured during a request to an ignored URL are still sent to the APM Server regardless of this setting. - -If you'd prefer simple wildcard pattern matching, see <>. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - ignoreUrls: [ - '/ping', - /^\/admin\//i - ] -}) ----- - -[[ignore-user-agents]] -==== `ignoreUserAgents` - -* *Type:* Array -* *Default:* `undefined` - -Used to restrict requests from certain User-Agents from being instrumented. - -This property should be set to an array containing one or more strings or `RegExp` objects. -When an incoming HTTP request is detected, -the User-Agent from the request headers will be tested against each element in this list. -If an element in the array is a `String`, -it's matched against the beginning of the User-Agent. -If an element in the array is a `RegExp` object, -its test function will be called with the User-Agent string being tested. - -Note that all errors that are captured during a request by an ignored user agent are still sent to the APM Server regardless of this setting. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - ignoreUserAgents: [ - 'curl/', - /pingdom/i - ] -}) ----- - -[[capture-body]] -==== `captureBody` - -* *Type:* String -* *Default:* `off` -* *Env:* `ELASTIC_APM_CAPTURE_BODY` -* <> *Central config name:* `capture_body` - -The HTTP body of incoming HTTP requests is not recorded and sent to the APM Server by default. - -Possible options are: `off`, `all`, `errors`, and `transactions`. - -* `off` - request bodies will never be reported -* `errors` - request bodies will only be reported with errors -* `transactions` - request bodies will only be reported with request transactions -* `all` - request bodies will be reported with both errors and request transactions - -The recorded body will be truncated if larger than 2 KiB. - -If the body parsing middleware captures the body as raw `Buffer` data, the request body will be represented as the string `""`. - -For the agent to be able to access the body, -the body needs to be available as a property on the incoming HTTP https://nodejs.org/api/http.html#http_class_http_incomingmessage[`request`] object. -The agent will look for the body on the following properties: -`req.json || req.body || req.payload` - -[[capture-headers]] -==== `captureHeaders` - -* *Type:* Boolean -* *Default:* true -* *Env:* `ELASTIC_APM_CAPTURE_HEADERS` - -The HTTP headers of incoming HTTP requests, -and its resulting response headers, -are recorded and sent to the APM Server by default. -This can be disabled by setting this option to `false`. - -[[error-on-aborted-requests]] -==== `errorOnAbortedRequests` - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_ERROR_ON_ABORTED_REQUESTS` - -A boolean specifying if the agent should monitor for aborted TCP connections with un-ended HTTP requests. -An error will be generated and sent to the APM Server if this happens. - -[[aborted-error-threshold]] -==== `abortedErrorThreshold` - -* *Type:* Number -* *Default:* `25s` -* *Env:* `ELASTIC_APM_ABORTED_ERROR_THRESHOLD` - -Specify the threshold for when an aborted TCP connection with an un-ended HTTP request is considered an error. -The value is expected to be in seconds, -or should include a time suffix. - -If the `errorOnAbortedRequests` property is `false`, this property is ignored. - -[[transaction-sample-rate]] -==== `transactionSampleRate` - -* *Type:* Number -* *Default:* `1.0` -* *Env:* `ELASTIC_APM_TRANSACTION_SAMPLE_RATE` -* <> *Central config name:* `transaction_sample_rate` - -Specify the sampling rate to use when deciding whether to trace a request. - -This must be a value between `0.0` and `1.0`, where `1.0` means 100% of requests -are traced. The value is rounded to four decimal places of precision (e.g. -0.0001, 0.3333) to ensure consistency and reasonable size when propagating the -sampling rate in the `tracestate` header for -<>. - -[[hostname]] -==== `hostname` - -* *Type:* String -* *Default:* OS hostname -* *Env:* `ELASTIC_APM_HOSTNAME` - -The OS hostname is automatically logged along with all errors and transactions. -If you want to overwrite this, -use this option. - -[[framework-name]] -==== `frameworkName` - -* *Type:* String -* *Env:* `ELASTIC_APM_FRAMEWORK_NAME` - -Set the name of the web framework used by the instrumented service/application. -The name will be available as metadata for all errors and transactions sent to the APM Server. -This can be useful for debugging and filtering. - -By default, -the agent will set the value of this config option if the framework can be detected automatically. - -[[framework-version]] -==== `frameworkVersion` - -* *Type:* String -* *Env:* `ELASTIC_APM_FRAMEWORK_VERSION` - -Set the version of the web framework used by the instrumented service/application. -The version will be available as metadata for all errors and transactions sent to the APM Server. -This can be useful for debugging and filtering. - -By default, -the agent will set the value of this config option if the framework can be detected automatically. - -Example of setting <> and `frameworkVersion` for a framework named `my-custom-framework`: - -[source,js] ----- -// read the version from the package.json file -var frameworkVersion = require('my-custom-framework/package').version - -require('elastic-apm-node').start({ - frameworkName: 'my-custom-framework', - frameworkVersion: frameworkVersion -}) ----- - -[[log-level]] -==== `logLevel` - -* *Type:* String -* *Default:* `'info'` -* *Env:* `ELASTIC_APM_LOG_LEVEL` -* <> *Central config name:* `log_level` - -Set the verbosity level for the agent's logging. Note that this does not have -any influence on the types of errors that are sent to the APM Server. This only -controls how chatty the agent is in your logs. Possible levels are: `trace` -(the most verbose logging, avoid in production), `debug`, `info`, `warning`, -`error`, `critical`, and `off` (disable all logging). - -This config only applies when using the built-in logger. Log levels will not -be automatically applied to a custom <>. - -[[logger]] -==== `logger` - -* *Type:* object -* *Env:* `ELASTIC_APM_LOGGER=false` to _ignore_ a custom logger - -By default, the APM agent logs to stdout in -{ecs-logging-ref}/intro.html[ecs-logging] format. Use the `logger` config to -pass in a custom logger object. The custom logger must provide `trace`, -`debug`, `info`, `warn`, `error`, and `fatal` methods that take a string -message argument. - -A custom logger may result in _structured log data being lost_. As of version -3.13, the agent uses structured logging using the -https://getpino.io/#/docs/api?id=logger[pino API]. To avoid issues with -incompatible logger APIs, a given custom logger is wrapped in such a way that -only the log message is passed through. As a special case, if the provided -logger is a _pino logger instance_, then it will be used directly without -loss of structured fields. Setting the environment variable -`ELASTIC_APM_LOGGER=false` will *ignore* a custom logger. This is provided to -assist with <> troubleshooting. - -An example using a custom pino logger: - -[source,js] ----- -const pino = require('pino') -require('elastic-apm-node').start({ - logger: pino({ level: 'info' }) -}) ----- - -or using a https://github.com/trentm/node-bunyan[Bunyan] logger: - -[source,js] ----- -const bunyan = require('bunyan') -require('elastic-apm-node').start({ - logger: bunyan.createLogger({ level: 'info' }) -}) ----- - -To get the https://github.com/watson/console-log-level[unstructured logging output] -similar to agent versions before 3.13, use the following: - -[source,js] ----- -require('elastic-apm-node').start({ - logger: require('console-log-level')() -}) ----- - -[[capture-exceptions]] -==== `captureExceptions` - -[small]#As of v4.0.0 a captured exception will always be printed to stderr.# - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_CAPTURE_EXCEPTIONS` - -Whether or not the APM agent should monitor for uncaught exceptions -(https://nodejs.org/api/process.html#event-uncaughtexception[`uncaughtException`]) -and send them to the APM Server automatically. This also includes unhandled -rejections (https://nodejs.org/api/process.html#event-unhandledrejection[`unhandledRejection`]), -when the node process is started with `--unhandled-rejections=throw`, which is -the default Node.js behavior since v15 (https://nodejs.org/api/cli.html#--unhandled-rejectionsmode[reference]). - -When `captureExceptions` is true and an `uncaughtException` event is emitted, -the APM agent will: capture error details, send that error (and buffered -APM data) to APM server, and `process.exit(1)` (https://nodejs.org/api/process.html#warning-using-uncaughtexception-correctly[as `uncaughtException` handlers should]). -Some things to be aware of: - -- Because the APM agent's handler will `process.exit(1)`, to use your own - `uncaughtException` handler, you must pass your handler to - <>. The APM agent will capture and send the - error, and then call your handler. It is then up to your handler to - `process.exit(1)`. -- The APM agent's handler is async, so there is a short period while it is - sending error details while the Node.js event loop will still be executing. -- When the exception and stack trace are printed to stderr, the exact format - differs from https://github.com/nodejs/node/blob/v20.5.0/src/node_errors.cc#L246-L266[the Node.js core formatter]. -- Using Node.js's https://nodejs.org/api/process.html#processsetuncaughtexceptioncapturecallbackfn[`process.setUncaughtExceptionCaptureCallback(fn)`] - results in `uncaughtException` not being called, so the APM agent's capturing - will not work. - -Set `captureExceptions: false` to disable this, and get the default Node.js -behavior for uncaught exceptions. - - -[[capture-error-log-stack-traces]] -==== `captureErrorLogStackTraces` - -* *Type:* String -* *Default:* `messages` -* *Env:* `ELASTIC_APM_CAPTURE_ERROR_LOG_STACK_TRACES` - -Normally only `Error` objects have a stack trace associated with them. -This stack trace is stored along with the error message when the error is sent to the APM Server. -The stack trace points to the place where the `Error` object was instantiated. - -But sometimes it's valuable to know, -not where the `Error` was instantiated, -but where it was detected. -For instance, -when an error happens deep within a database driver, -the location where the error bubbles up to, -is sometimes more useful for debugging, -than where the error occurred. - -Set this config option to `always` to -- -besides the error stack trace -- -also capture a stack trace at the location where <> was called. - -By default, -this config option has the value `messages`, -which means that a stack trace of the capture location will be recorded only when `captureError` is called with either a <> or the <>, -in which case a normal stack trace isn't available. - -Set this config option to `never` to never record a capture location stack trace. - -A capture location stack trace is never generated for uncaught exceptions. - -[[span-stack-trace-min-duration]] -==== `spanStackTraceMinDuration` - -[small]#Added in: v3.30.0, replaces <> and <># - -* *Type:* Duration -* *Default:* `'-1s'` (never capture span stack traces) -* *Env:* `ELASTIC_APM_SPAN_STACK_TRACE_MIN_DURATION` -* <> *Central config name:* `span_stack_trace_min_duration` - -Use this option to control if stack traces are never captured for spans (the -default), always captured for spans, or only captured for spans that are longer -than a given duration. If you choose to enable span stack traces, even if only -for slower spans, please read the -<>. - -* a negative value, e.g. `'-1ms'` or `-1`, means _never_ capture stack traces for spans; -* a zero value, e.g. `'0ms'` or `0`, means _always_ capture stack traces for spans, regardless of the span's duration; and -* any positive value, e.g. `'50ms'`, means to capture stack traces for spans longer than that duration. - -The duration value should be a string of the form `''`. The -allowed units are `ms` for milliseconds, `s` for seconds, and `m` for minutes -and are case-sensitive. The '' is optional and defaults to _milliseconds_. A -Number value of milliseconds may also be provided. For example, `'10ms'` and -`10` are 10 milliseconds, `'2s'` is 2 seconds. - -(Note: If you are migrating from the deprecated `spanFramesMinDuration` option, -the meaning for negative and zero values has changed _and_ the default unit -has changed to milliseconds.) - - -[[capture-span-stack-traces]] -==== `captureSpanStackTraces` - -[small]#Deprecated in: v3.30.0, use <># - -* *Type:* Boolean -* *Env:* `ELASTIC_APM_CAPTURE_SPAN_STACK_TRACES` - -This option is *deprecated* -- use <> instead. -In versions before v3.30.0 this option was `true` by default. As of version -v3.30.0 this default has _effectively_ changed to false, because the default is -`spanStackTraceMinDuration: '-1s'`. - -If `spanStackTraceMinDuration` is specified, then any provided value for this -option is ignored. Otherwise, - -* setting `captureSpanStackTraces: false` is equivalent to setting - `spanStackTraceMinDuration: '-1s'` (stack traces will never be captured for - spans), and -* setting `captureSpanStackTraces: true` will enable capture of stack traces for - spans that are longer than <>, - or 10ms if `spanFramesMinDuration` is not specified. - - -[[span-frames-min-duration]] -==== `spanFramesMinDuration` - -[small]#Deprecated in: v3.30.0, use <># - -* *Type:* Duration -* *Env:* `ELASTIC_APM_SPAN_FRAMES_MIN_DURATION` - -This option is *deprecated* -- use <> instead. -Note that the sense of a _negative_ value and a _zero_ value has switched in the -new option. Also note that the default unit has changed from `s` to `ms` in the -new option. - -If `spanStackTraceMinDuration` is specified, then any provided value for this -option is ignored. Otherwise, - -* a zero value, e.g. `0ms`, is equivalent to `spanStackTraceMinDuration: '-1s'` (never capture span stack traces); -* a negative value, e.g. `-1ms`, is equivalent to `spanStackTraceMinDuration: 0` (always capture span stack traces); and -* any positive value, e.g. `'50ms'`, is equivalent to setting `spanStackTraceMinDuration` to the same value. - -The duration value should be a string of the form `''`. The -allowed units are `ms` for milliseconds, `s` for seconds, and `m` for minutes -and are case-sensitive. The '' is optional and defaults to seconds. A -Number value of seconds may also be provided. For example, `'10ms'` is 10 -milliseconds, `'5'` and `5` (number) are 5 seconds. - -[[use-path-as-transaction-name]] -==== `usePathAsTransactionName` - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_USE_PATH_AS_TRANSACTION_NAME` - -Set this option to `true` to use the URL path as the transaction name if no other route could be determined. If the agent do not support your router, you can set this option to `true` to use specific URL path as the transaction name instead of `GET unknown route`. - -[[source-context-error]] -==== `sourceLinesErrorAppFrames` + `sourceLinesErrorLibraryFrames` - -When an error is captured by the agent, -its stack trace is stored in Elasticsearch. - -By default, the agent will also collect a few lines of source code around the lines for each frame in the stack trace. -This can make it easier to determine the cause of an error as the source code related to the error is visible directly in Kibana. - -The agent differentiates between so-called in-app frames and library frames. -Library frames are frames belonging to Node core and code inside the application's `node_modules` folder. -In-app frames are everything else. - -Use the following two config options to change how many lines of source code to include for the different types of stack frames: - -[[source-context-error-app-frames]] -*`sourceLinesErrorAppFrames`* - -* *Type:* Number -* *Default:* `5` -* *Env:* `ELASTIC_APM_SOURCE_LINES_ERROR_APP_FRAMES` - -The default value `5` means that 5 lines of source code will be collected for in-app error frames. -2 lines above the stack frame line + 2 below + the stack frame line itself. - -Setting this config option to `0` means that no source code will be collected for in-app error frames. - -[[source-context-error-library-frames]] -*`sourceLinesErrorLibraryFrames`* - -* *Type:* Number -* *Default:* `5` -* *Env:* `ELASTIC_APM_SOURCE_LINES_ERROR_LIBRARY_FRAMES` - -The default value `5` means that 5 lines of source code will be collected for error library frames. -2 lines above the stack frame line + 2 below + the stack frame line itself. - -Setting this config option to `0` means that no source code will be collected for error library frames. - -[[source-context-span]] -==== `sourceLinesSpanAppFrames` + `sourceLinesSpanLibraryFrames` - -When a span is recorded by the agent, -a stack trace is recorded together with the span, -pointing to the location where the span was initiated. -This stack trace is stored in Elasticsearch along with the other span data. - -By default, the agent will also collect a few lines of source code around the lines for each frame in the stack trace. -This can make it easier to determine why and how the span was initiated as the source code related to the span is visible directly in Kibana. - -The agent differentiates between so-called in-app frames and library frames. -Library frames are frames belonging to Node core and code inside the applications `node_modules` folder. -In-app frames are everything else. - -Use the following two config options to change how many lines of source code to include for the different types of stack frames: - -[[source-context-span-app-frames]] -*`sourceLinesSpanAppFrames`* - -* *Type:* Number -* *Default:* `0` -* *Env:* `ELASTIC_APM_SOURCE_LINES_SPAN_APP_FRAMES` - -The default value `0` means that no source code will be collected for in-app span frames. - -[[source-context-span-library-frames]] -*`sourceLinesSpanLibraryFrames`* - -* *Type:* Number -* *Default:* `0` -* *Env:* `ELASTIC_APM_SOURCE_LINES_SPAN_LIBRARY_FRAMES` - -The default value `0` means that no source code will be collected for span library frames. - -[[error-message-max-length]] -==== `errorMessageMaxLength` - -[small]#Deprecated in: v3.21.0, use <># - -* *Type:* String -* *Default:* `longFieldMaxLength`'s value -* *Env:* `ELASTIC_APM_ERROR_MESSAGE_MAX_LENGTH` - -This option is **deprecated** -- use <> instead. - -The maximum length allowed for error messages. -It is expressed in bytes or includes a size suffix such as `2kb`. -Size suffixes are case-insensitive and include `b`, -`kb`, -`mb`, -and `gb`. -Messages above this length will be truncated before being sent to the APM Server. -Note that while the configuration option accepts a number of *bytes*, truncation -is based on a number of unicode characters, not bytes. - -Set to `-1` do disable truncation. - -This applies to the following properties: - -- `error.exception.message` -- `error.log.message` - - -[[long-field-max-length]] -==== `longFieldMaxLength` - -* *Type:* Integer -* *Default:* 10000 -* *Env:* `ELASTIC_APM_LONG_FIELD_MAX_LENGTH` - -The following transaction, span, and error fields will be truncated at this -number of unicode characters before being sent to APM server: - -- `transaction.context.request.body`, `error.context.request.body` -- `transaction.context.message.body`, `span.context.message.body`, - `error.context.message.body` -- `span.context.db.statement` -- `error.exception.message`, `error.log.message` - If - <> is specified, then that - value takes precedence for these error message fields. - -Note that tracing data is limited at the upstream APM server to -{apm-guide-ref}/configuration-process.html#max_event_size[`max_event_size`], -which defaults to 300kB. If you configure `longFieldMaxLength` too large, it -could result in transactions, spans, or errors that are rejected by APM server. - - -[[stack-trace-limit]] -==== `stackTraceLimit` - -* *Type:* Number -* *Default:* `50` -* *Env:* `ELASTIC_APM_STACK_TRACE_LIMIT` - -Setting it to `0` will disable stack trace collection. -Any finite integer value will be used as the maximum number of frames to collect. -Setting it to `Infinity` means that all frames will be collected. - -[[transaction-max-spans]] -==== `transactionMaxSpans` - -* *Type:* Number -* *Default:* `500` -* *Env:* `ELASTIC_APM_TRANSACTION_MAX_SPANS` -* <> *Central config name:* `transaction_max_spans` - -Specify the maximum number of spans to capture within a request transaction -before dropping further spans. -Setting to `-1` means that spans will never be dropped. - -[[max-queue-size]] -==== `maxQueueSize` - -* *Type:* Number -* *Default:* `1024` -* *Env:* `ELASTIC_APM_MAX_QUEUE_SIZE` - -The maximum size of buffered events. - -Events like transactions, spans, and errors are buffered when the agent can't -keep up with sending them to the APM Server or if the APM server is down. -If the queue is full, events are rejected which means you will lose -transactions and spans. This guards the application from consuming too much -memory and possibly crashing in case the APM server is unavailable for a longer -period of time. - -A lower value will decrease the heap overhead of the agent, while a higher -value makes it less likely to lose events in case of a temporary spike in -throughput. - -[[api-request-time]] -==== `apiRequestTime` - -* *Type:* String -* *Default:* `10s` -* *Env:* `ELASTIC_APM_API_REQUEST_TIME` - -The agent maintains an open HTTP request to the APM Server that is used to transmit the collected transactions, -spans, -and errors to the server. - -To avoid issues with intermittent proxies and load balancers, -the HTTP request is ended and a new one created at regular intervals controlled by this config option. -The value is expected to be in seconds, -or should include a time suffix. - -[NOTE] -==== -The HTTP request is ended before the time threshold is reached if enough bytes are sent over it. -Use the <> config option to control the byte threshold. -==== - -[[api-request-size]] -==== `apiRequestSize` - -* *Type:* String -* *Default:* `768kb` -* *Env:* `ELASTIC_APM_API_REQUEST_SIZE` - -The agent maintains an open HTTP request to the APM Server that is used to transmit the collected transactions, -spans, -and errors to the server. - -To avoid issues with intermittent proxies and load balancers, -the HTTP request is ended and a new one created if its body becomes too large. -That limit is controlled by this config option. -The value is expected to be in bytes, -or include a size suffix such as `1mb`. -Size suffixes are case-insensitive and include `b`, -`kb`, -`mb`, -and `gb`. - -[NOTE] -==== -The HTTP request is otherwise ended at regular intervals controlled by the <> config option. -==== - -[[server-timeout]] -==== `serverTimeout` - -* *Type:* String -* *Default:* `30s` -* *Env:* `ELASTIC_APM_SERVER_TIMEOUT` - -Specify a timeout on the socket used for communication between the APM agent -and APM Server. If no data is sent or received on the socket for this amount of -time, the request will be aborted. It's not recommended to set a -`serverTimeout` lower than the <> config -option. That will likely result in healthy requests being aborted prematurely. - -The value should include a time suffix ('m' for minutes, 's' for seconds, or -'ms' for milliseconds), but defaults to seconds if no suffix is given. - -[[apm-client-headers]] -==== `apmClientHeaders` - -[small]#Added in: v4.3.0# - -* *Type:* Object -* *Env:* `ELASTIC_APM_APM_CLIENT_HEADERS` - -Specify custom headers to be included in HTTP requests by the APM agent to -APM Server. Generally this should not be required for normal usage. - -Examples: - -[source,bash] ----- -ELASTIC_APM_APM_CLIENT_HEADERS="foo=bar,spam=eggs" ----- - -[source,js] ----- -require('elastic-apm-node').start({ - apmClientHeaders: { foo: 'bar', spam: 'eggs' }, - // ... -}) ----- - - -[[sanitize-field-names]] -==== `sanitizeFieldNames` -* *Type:* Array -* *Default:* `['password', 'passwd', 'pwd', 'secret', '*key', '*token*', '*session*', '*credit*', '*card*', '*auth*', 'set-cookie', '*principal*', 'pw', 'pass', 'connect.sid']` -* *Env:* `ELASTIC_APM_SANITIZE_FIELD_NAMES` -* <> *Central config name:* `sanitize_field_names` - -Remove sensitive data sent to Elastic APM. - -The `sanitizeFieldNames` configuration value allows you to configure a list of wildcard patterns of field names which should be redacted from agent payloads. Wildcard matches are -case-insensitive by default. You may make wildcard searches case-sensitive by -using the `(?-i)` prefix. These patterns apply to the request and response HTTP headers, HTTP request cookies, and also any form field captured during an `application/x-www-form-urlencoded` data request. - -The `sanitizeFieldNames` will redact any matched _field names_. If you wish to filter or _redact_ other data the <> may be a better choice. - -[[disable-instrumentations]] -==== `disableInstrumentations` - -* *Type:* Array of strings -* *Env:* `ELASTIC_APM_DISABLE_INSTRUMENTATIONS` - -Array or comma-separated string of module names for which to disable instrumentation. -When instrumentation is disabled for a module, -no spans will be collected for that module. - -Example using options object: - -[source,js] ----- -require('elastic-apm-node').start({ - disableInstrumentations: ['graphql', 'redis'] -}) ----- - -Example using environment variable: - -[source,bash] ----- -ELASTIC_APM_DISABLE_INSTRUMENTATIONS=graphql,redis ----- - -For an always up-to-date list of modules for which instrumentation can be disabled, -see the https://github.com/elastic/apm-agent-nodejs/tree/main/lib/instrumentation/modules[lib/instrumentation/modules] folder in the agent repository. -Note that not all modules represented in this directory will generate spans, -and adding those to this array has no effect. - -To configure if incoming http requests should be instrumented, -see <>. - -[[container-id]] -==== `containerId` - -* *Type:* String -* *Env:* `ELASTIC_APM_CONTAINER_ID` - -Specify the docker container id to associate with all reported events. -If absent, -it will be parsed out of the `/proc/self/cgroup` file. - -[[kubernetes-node-name]] -==== `kubernetesNodeName` - -* *Type:* String -* *Env:* `KUBERNETES_NODE_NAME` - -Specify the kubernetes node name to associate with all reported events. - -[[kubernetes-namespace]] -==== `kubernetesNamespace` - -* *Type:* String -* *Env:* `KUBERNETES_NAMESPACE` - -Specify the kubernetes namespace to associate with all reported events. - -[[kubernetes-pod-name]] -==== `kubernetesPodName` - -* *Type:* String -* *Env:* `KUBERNETES_POD_NAME` - -Specify the kubernetes pod name to associate with all reported events. -If absent, -and if `kubernetesPodUID` is parsed out of the `/proc/self/cgroup` file, -this will default to the local hostname. - -[[kubernetes-pod-uid]] -==== `kubernetesPodUID` - -* *Type:* String -* *Env:* `KUBERNETES_POD_UID` - -Specify the kubernetes pod uid to associate with all reported events. -If absent, -it will be parsed out of the `/proc/self/cgroup` file. - -[[metrics-interval]] -==== `metricsInterval` - -* *Type:* String -* *Default:* `"30s"` -* *Env:* `ELASTIC_APM_METRICS_INTERVAL` - -Specify the interval for reporting metrics to APM Server. -The interval should be in seconds, -or should include a time suffix. - -To disable all metrics reporting, including breakdown metrics, set the interval -to `"0s"`. - -[[metrics-limit]] -==== `metricsLimit` - -* *Type:* Number -* *Default:* `1000` -* *Env:* `ELASTIC_APM_METRICS_LIMIT` - -Specify the maximum number of metrics to track at any given time. -When a new metric is inserted which would exceed the limit, -the oldest metric will be dropped to give it space. - -[[global-labels]] -==== `globalLabels` - -* *Type:* Object -* *Env:* `ELASTIC_APM_GLOBAL_LABELS` - -Supply a key/value pair object of labels to apply to any data recorded by the agent. - -Example: -[source,bash] ----- -ELASTIC_APM_GLOBAL_LABELS="subspace=sap-hana,rack=number6" ----- - -[[config-file]] -==== `configFile` - -* *Type:* String -* *Default:* `elastic-apm-node.js` -* *Env:* `ELASTIC_APM_CONFIG_FILE` - -The Node.js agent will look for a file named `elastic-apm-node.js` in the current working directory. -You can specify a custom path using this config option (this path must include the filename), e.g: - -[source,bash] ----- -ELASTIC_APM_CONFIG_FILE=/path/to/my-elastic-apm-node.js ----- - -NOTE: The inline version of this config option, -that is passed to the <> function, -will be ignored if a config file was already loaded when this module was required (based on either the default value or because of the `ELASTIC_APM_CONFIG_FILE` environment variable). - -The configuration file is expected to export an object, -following the same conventions as the `options` object, -given as the first argument to the <> function, e.g.: - -[source,js] ----- -module.exports = { - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '' -} ----- - -[[breakdown-metrics]] -==== `breakdownMetrics` - -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_BREAKDOWN_METRICS` - -Set `breakdownMetrics: false` to disable reporting of breakdown metrics. Note -that if `metricsInterval: 0`, then breakdown metrics will not be reported. - -Breakdown metrics (<>) record -the self-time spent in each unique type of span. This data drives the -{kibana-ref}/service-overview.html#service-span-duration[Time spent by span type] -chart in the APM app. - - -[[disable-metrics]] -==== `disableMetrics` - -[small]#Added in: v3.45.0# - -* *Type:* Array -* *Env:* `ELASTIC_APM_DISABLE_METRICS` - -The `disableMetrics` configuration variable is a list of wildcard patterns of metric names to *not* send to APM server. The filter is applied to <>, custom metrics defined by <>, and metrics defined <>. - -For example, setting the `ELASTIC_APM_DISABLE_METRICS="nodejs.*,my_counter"` environment variable (or the equivalent `disableMetrics: ['nodejs.*', 'my_counter']` option to <>) will result in reported metrics excluding any metric named `my_counter` and any starting with `nodejs.`. Wildcard matches are case-insensitive by default. You may make wildcard searches case-sensitive by using the `(?-i)` prefix. - -Use `metricsInterval: '0s'` to completely disable metrics collection. See <>. - - -[[custom-metrics-histogram-boundaries]] -==== `customMetricsHistogramBoundaries` - -[small]#Added in: v3.45.0 as experimental# - -* *Type:* number[] -* *Default:* (See below.) -* *Env:* `ELASTIC_APM_CUSTOM_METRICS_HISTOGRAM_BOUNDARIES` - -Defines the default bucket boundaries to use for OpenTelemetry Metrics -histograms. By default the value is: - -[source,js] ----- -[ - 0.00390625, 0.00552427, 0.0078125, 0.0110485, - 0.015625, 0.0220971, 0.03125, 0.0441942, - 0.0625, 0.0883883, 0.125, 0.176777, - 0.25, 0.353553, 0.5, 0.707107, - 1, 1.41421, 2, 2.82843, - 4, 5.65685, 8, 11.3137, - 16, 22.6274, 32, 45.2548, - 64, 90.5097, 128, 181.019, - 256, 362.039, 512, 724.077, - 1024, 1448.15, 2048, 2896.31, - 4096, 5792.62, 8192, 11585.2, - 16384, 23170.5, 32768, 46341, - 65536, 92681.9, 131072 -] ----- - -This differs from the https://opentelemetry.io/docs/reference/specification/metrics/sdk/#explicit-bucket-histogram-aggregation[OpenTelemetry default histogram boundaries]. To use the OpenTelemetry default boundaries, configure the APM agent with: - -[source,js] ----- -apm.start({ - customMetricsHistogramBoundaries: [ 0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000 ], - // ... -}) ----- - -or - -[source,bash] ----- -export ELASTIC_APM_CUSTOM_METRICS_HISTOGRAM_BOUNDARIES=0,5,10,25,50,75,100,250,500,750,1000,2500,5000,7500,10000 ----- - -To customize the boundaries for specific histogram metrics, use an OpenTelemetry Metrics SDK https://opentelemetry.io/docs/reference/specification/metrics/sdk/#view[`View`]. See https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/use-otel-metrics-sdk.js[this script] for an example. - -See <> for a general guide on using OpenTelemetry with this APM agent. - - -[[cloud-provider]] -==== `cloudProvider` -* *Type:* String -* *Default:* `auto` -* *Env:* `ELASTIC_APM_CLOUD_PROVIDER` - -During startup the Node.js agent queries the local environment to determine whether the application is running in a cloud environment, and provides the agent with details about that environment. These details are called metadata, and will be sent to APM Server with other instrumented data. The `cloudProvider` configuration value allows you to control this behavior. - -- `auto`: Automatically determine which cloud provider the agent is running on. -- `gcp`: Only query for Google Cloud Platform information. -- `aws`: Only query for Amazon Web Service information. -- `azure`: Only query for Azure information. -- `none`: Do not query for any cloud provider information. - -If the value is not one of the five listed above, the agent will use the value of `auto`. - -[[ignore-message-queues]] -==== `ignoreMessageQueues` -* *Type:* Array -* *Default:* `[]` -* *Env:* `ELASTIC_APM_IGNORE_MESSAGE_QUEUES` -* <> *Central config name:* `ignore_message_queues` - -Array or comma-separated string of wildcard patterns that tell the agent to -ignore certain queues/topics when instrumenting messaging systems. - -When an instrumented messaging system sends or receives a message, the agent -will test the queue/topic name against each wildcard in this list. If -the name matches, the agent will skip instrumenting the operation. - -The `ignoreMessageQueues` property supports simple wildcard (`*`) patterns, and -may not include commas. Wildcard matches are case-insensitive by default. You -may make wildcard searches case-sensitive by using the `(?-i)` prefix. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - ignoreMessageQueues: [ - 'overnight_jobs', - 'events_*', - '(?-i)caseSensitiveSearch' - ] -}) ----- - - -[[trace-continuation-strategy]] -==== `traceContinuationStrategy` - -[small]#Added in: v3.34.0# - -* *Type:* String -* *Default:* `'continue'` -* *Env:* `ELASTIC_APM_TRACE_CONTINUATION_STRATEGY` -* <> *Central config name:* `trace_continuation_strategy` - -This option allows some control on how the APM agent handles W3C trace-context -headers on incoming requests. By default, the `traceparent` and `tracestate` -headers are used per W3C spec for distributed tracing. However, in certain cases -it can be helpful to *not* use the incoming `traceparent` header. Some example -use cases: - -- An Elastic-monitored service is receiving requests with `traceparent` headers - from *unmonitored* services. -- An Elastic-monitored service is publicly exposed, and does not want tracing - data (trace-ids, sampling decisions) to possibly be spoofed by user requests. - -Valid values are: - -- `'continue'` - The default behavior. An incoming `traceparent` value is used - to continue the trace and determine the sampling decision. -- `'restart'` - Always ignores the `traceparent` header of incoming - requests. A new trace-id will be generated and the sampling decision will be - made based on <>. A *span - link* will be made to the incoming traceparent. -- `'restart_external'` - If an incoming request includes the `es` vendor flag - in `tracestate`, then any 'traceparent' will be considered internal and - will be handled as described for 'continue' above. Otherwise, any 'traceparent' - is considered external and will be handled as described for 'restart' above. - -Starting with Elastic Observability 8.2, span links will be visible in trace -views. - - -[[span-compression-enabled]] -==== `spanCompressionEnabled` -* *Type:* Boolean -* *Default:* `true` -* *Env:* `ELASTIC_APM_SPAN_COMPRESSION_ENABLED` - -Setting this option to false will disable the https://www.elastic.co/guide/en/apm/guide/current/span-compression.html[Span compression] feature. Span compression reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that some information, such as DB statements of all the compressed spans, will not be collected. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - spanCompressionEnabled: true -}) ----- - -[[span-compression-exact-match-max-duration]] -==== `spanCompressionExactMatchMaxDuration` -* *Type:* String -* *Default:* `50ms` -* *Env:* `ELASTIC_APM_SPAN_COMPRESSION_EXACT_MATCH_MAX_DURATION` - -Consecutive spans that are exact match and that are under this threshold will be compressed into a single composite span. This option does not apply to composite spans. This reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that the DB statements of all the compressed spans will not be collected. - -Supports the duration suffixes ms (milliseconds), s (seconds) and m (minutes). - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - spanCompressionExactMatchMaxDuration:'100ms' -}) ----- - -[[span-compression-same-kind-max-duration]] -==== `spanCompressionSameKindMaxDuration` -* *Type:* String -* *Default:* `0ms` -* *Env:* `ELASTIC_APM_SPAN_COMPRESSION_SAME_KIND_MAX_DURATION` - -Consecutive spans to the same destination that are under this threshold will be compressed into a single composite span. This option does not apply to composite spans. This reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that the DB statements of all the compressed spans will not be collected. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - spanCompressionSameKindMaxDuration:'0ms' -}) ----- - - -[[opentelemetry-bridge-enabled]] -==== `opentelemetryBridgeEnabled` - -[small]#Added in: v3.34.0 as experimental# - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_OPENTELEMETRY_BRIDGE_ENABLED` - -Setting this option to true will enable the <>. Briefly, the OpenTelemetry Bridge allows one to use the vendor-neutral -https://opentelemetry.io/docs/instrumentation/js/api/[OpenTelemetry Tracing API] -(https://www.npmjs.com/package/@opentelemetry/api[`@opentelemetry/api`]) to -manually instrument your code, and have the Elastic Node.js APM agent handle -those API calls. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - opentelemetryBridgeEnabled: true -}) ----- - -[[exit-span-min-duration]] -==== `exitSpanMinDuration` -* *Type:* String -* *Default:* `0ms` -* *Env:* `ELASTIC_APM_EXIT_SPAN_MIN_DURATION` -* <> *Central config name:* `exit_span_min_duration` - -Sets the minimum duration of exit spans. If an exit span's duration is less than -this threshold the agent will attempt to drop the span and not send it. - -In some cases exit spans will not be discarded. Spans that propagate the trace -context to downstream services, such as outgoing HTTP requests, will not be -discarded. However, external calls that don't propagate context, such as calls -to a database, can be discarded using this threshold. - -Additionally, spans that lead to an error will not be discarded. - -Example usage: - -[source,js] ----- -require('elastic-apm-node').start({ - exitSpanMinDuration: '10ms' -}) ----- - -[[elasticsearch-capture-body-urls]] -==== `elasticsearchCaptureBodyUrls` - -* *Type:* Array of wildcard patterns -* *Default:* `['*/_search', '*/_search/template', '*/_msearch', '*/_msearch/template', '*/_async_search', '*/_count', '*/_sql', '*/_eql/search' ]` -* *Env:* `ELASTIC_APM_ELASTICSEARCH_CAPTURE_BODY_URLS` -// Spec name: elasticsearch_capture_body_urls - -The URL path patterns for which the APM agent will capture the request body of outgoing requests to Elasticsearch made with the `@elastic/elasticsearch` module (or the legacy `elasticsearch` module). The default setting captures the body for https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html[Elasticsearch REST APIs] making a search. - -The captured request body (if any) is stored on the `span.db.statement` field. Captured request bodies are truncated to a maximum length defined by <>. - - -[[use-elastic-traceparent-header]] -==== `useElasticTraceparentHeader` - -[small]#Change default in v4.0.0, in v3.x the default was `true`# - -* *Type:* Boolean -* *Default:* `false` -* *Env:* `ELASTIC_APM_USE_ELASTIC_TRACEPARENT_HEADER` - -To enable {apm-guide-ref}/apm-distributed-tracing.html[distributed tracing], the agent -adds trace context headers to outgoing requests (like HTTP requests, etc.). -These headers (`traceparent` and `tracestate`) are defined in the -https://www.w3.org/TR/trace-context-1/[W3C Trace Context] specification. - -When this setting is `true`, the agent will also add the header `elastic-apm-traceparent` -for backwards compatibility with older versions of Elastic APM agents. (In the -next major version of this APM agent, this setting will default to false.) diff --git a/docs/custom-stack.asciidoc b/docs/custom-stack.asciidoc deleted file mode 100644 index 52f97fd6a3..0000000000 --- a/docs/custom-stack.asciidoc +++ /dev/null @@ -1,199 +0,0 @@ -:framework: custom Node.js - -[[custom-stack]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html[elastic.co] -endif::[] - -=== Get started with a custom Node.js stack - -include::./shared-set-up.asciidoc[tag=introduction] - -If you are using Express, hapi, Koa, Restify, Fastify, or AWS Lambda, -we recommend that you read these articles instead: - -include::set-up.asciidoc[tag=web-frameworks-list] - -[float] -[[custom-stack-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[custom-stack-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `http` and before your router etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple example of how Elastic APM is normally required and started: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -var apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) ----- - -The agent will now monitor the performance of your application and record any uncaught exceptions. - -[float] -[[custom-stack-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[custom-stack-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[custom-stack-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[custom-stack-route-naming]] -===== Route naming - -The Node.js agent tracks incoming HTTP requests to your application in what are called "transactions". -All transactions with the same name are grouped together automatically. - -In a normal web application, you want to name transactions based on the route that matches the incoming HTTP request. -So say you have a route to display posts on a blog identified by `GET /posts/{id}`. -You want requests `GET /posts/12`, `GET /posts/42` etc to be grouped together under a transaction named `GET /posts/{id}`. - -If you are using Express, hapi, koa-router, Restify, or Fastify this naming happens automatically based on the names of your routes. -If you use another framework or a custom router you will see that the transactions are simply grouped together in a few big chunks named "unknown route". -In that case, -you will need to help us out a little by supplying a name for each transaction. -You can do that by calling <> at any time during the request with the name of the transaction as the first argument. - -Excerpt of an application using the https://github.com/watson/patterns[patterns] module for route handling: - -[source,js] ----- -var apm = require('elastic-apm-node').start() -var http = require('http') -var patterns = require('patterns')() - -// Setup routes and their respective route handlers -patterns.add('GET /', require('./routes/index')) -patterns.add('GET /posts', require('./routes/posts').index) -patterns.add('GET /posts/{id}', require('./routes/posts').show) - -http.createServer(function (req, res) { - // Check if we have a route matching the incoming request - var match = patterns.match(req.method + ' ' + req.url); - - // If no match is found, respond with a 404. Elastic APM will in - // this case use the default transaction name "unknown route" - if (!match) { - res.writeHead(404) - res.end() - return - } - - // The patterns module exposes the pattern used to match the - // request on the `pattern` property, e.g. `GET /posts/{id}` - apm.setTransactionName(match.pattern) - - // Populate the params and call the matching route handler - var fn = match.value - req.params = match.params - fn(req, res) -}).listen(3000) ----- - -[float] -[[custom-stack-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[custom-stack-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[custom-stack-middleware-error-handler]] -===== Middleware error handler - -If you use the https://www.npmjs.com/package/connect[connect] module and an error is either thrown synchronously inside one of the middleware functions or is passed as the first argument to the middleware `next()` function, -it will be passed to the https://www.npmjs.com/package/connect#error-middleware[Connect error handler]. - -It's recommended that you register the agent as a Connect error handler. -In the case where you have multiple Connect error handlers, -the agent error handler should be the first in the chain to ensure that it will receive the error correctly. - -[source,js] ----- -var apm = require('elastic-apm-node').start() -var connect = require('connect') - -var app = connect() - -// Your regular middleware and router... -app.use(...) -app.use(...) -app.use(...) - -// Add the Elastic APM middleware after your regular middleware -app.use(apm.middleware.connect()) - -// ...but before any other error handler -app.use(function (err, req, res, next) { - // Custom error handling goes here -}) ----- - -[float] -[[custom-stack-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[custom-stack-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[custom-stack-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[custom-stack-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/distributed-tracing.asciidoc b/docs/distributed-tracing.asciidoc deleted file mode 100644 index a50ecc475b..0000000000 --- a/docs/distributed-tracing.asciidoc +++ /dev/null @@ -1,94 +0,0 @@ -[[distributed-tracing]] -== Distributed tracing - -// Content from APM Overview documentation -// https://www.elastic.co/guide/en/apm/get-started/current/distributed-tracing.html -Distributed tracing enables you to analyze performance throughout your microservices architecture all in one view. -This is accomplished by tracing all of the requests -- -from the initial web request to your front-end service -- to queries made to your back-end services. -This makes finding possible bottlenecks throughout your application much easier and faster. - -Elastic APM automatically supports distributed tracing, -but there are some cases, outlined below, where additional setup is necessary. - -[float] -[[tracing-rum-correlation]] -=== Real User Monitoring (RUM) correlation - -// Content from RUM documentation -// https://www.elastic.co/guide/en/apm/agent/rum-js/master/distributed-tracing-guide.html -If your backend service generates an HTML page dynamically, -the trace ID and parent span ID must be injected into the page when the RUM Agent is initialized. -This ensures that the web browser’s page load appears as the root of the trace, -and allows you to analyze the time spent in the browser vs in backend services. - -// Content from transaction-api.asciidoc -include::./transaction-api.asciidoc[tag=ensure-parent-id-snippet] - -For more information, see <>. - -[float] -[[tracing-custom-protocol]] -=== Custom protocols - -Distributed tracing is automatically supported with HTTP/HTTPS. -If you're using another protocol, like TCP, UDP, WebSocket, or Protocol Buffers, -there are a few manual setup steps you must follow. - -In a distributed trace, multiple transactions are linked together with a `traceparent`. -To create your own distributed trace, you must pass the current `traceparent` from an outgoing service, -to a receiving service, and create a new transaction as a child of that `traceparent`: - -1. In one service, start a transaction with <>, -or a span with <>. - -2. Get the serialized `traceparent` string of the started transaction/span with <>. - -3. Encode the `traceparent` and send it to the receiving service inside your regular request. - -4. Decode and store the `traceparent` in the receiving service. - -5. Manually start a new transaction as a child of the received `traceparent`, -with <>. -Pass in the `traceparent` as the `childOf` option. - -[float] -[[tracing-custom-example]] -==== Example - -Consider a scenario where you're using raw UDP to communicate between two services, A and B: - -**Service A** - -Service A starts a transaction, and gets the current `traceparent`. - -[source,js] ----- -agent.startTransaction('my-service-a-transaction') -const traceparent = agent.currentTraceparent ----- - -Service A then sends the `traceparent` as a "header" to service B. - -[source,js] ----- -// Pseudocode for sending data -sendMetadata(`traceparent: ${traceparent}\n`) ----- - -**Service B** - -Service B reads the `traceparent` from the incoming request. - -[source,js] ----- -// Pseudocode for reading incoming request -const traceparent = readTraceparentFromUDPPacket() ----- - -Service B uses the `traceparent` to initialize a new transaction that is a child of the original `traceparent`. - -[source,js] ----- -agent.startTransaction('my-service-b-transaction', { childOf: traceparent }) ----- diff --git a/docs/docset.yml b/docs/docset.yml new file mode 100644 index 0000000000..1d75ef4a24 --- /dev/null +++ b/docs/docset.yml @@ -0,0 +1,16 @@ +project: 'APM Node.js agent docs' +cross_links: + - apm-agent-rum-js + - apm-aws-lambda + - apm-k8s-attacher + - docs-content + - ecs + - ecs-logging + - ecs-logging-nodejs + - elasticsearch +toc: + - toc: reference + - toc: release-notes +subs: + ecloud: "Elastic Cloud" + apm-lambda-ext: "Elastic APM AWS Lambda extension" diff --git a/docs/esm.asciidoc b/docs/esm.asciidoc deleted file mode 100644 index d984b3881e..0000000000 --- a/docs/esm.asciidoc +++ /dev/null @@ -1,121 +0,0 @@ -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/esm.html[elastic.co] -endif::[] - -[[esm]] -== ECMAScript module support - -NOTE: ECMAScript module support is currently incomplete and experimental. It was added in version v3.48.0. - -The Elastic APM Node.js agent includes _limited and experimental_ support for auto-instrumentation of https://nodejs.org/api/esm.html#modules-ecmascript-modules[ECMAScript modules] (ESM) -- i.e. modules loaded via the `import ...` statement or the `import(...)` expression. Support is based on the experimental https://nodejs.org/api/esm.html#loaders[Node.js Loaders API], which requires passing the `--experimental-loader` option to node. - -As a first example, the APM agent can provide HTTP tracing for the following Express server: - -[source,js] ----- -// server.mjs -import bodyParser from 'body-parser' -import express from 'express' - -const app = express() -app.use(bodyParser.json()) -app.get('/hello/:name', function (request, reply) { - reply.send({ hello: request.params.name }) -}) - -app.listen({ port: 3000}, () => { - console.log('Server is listening. Try:\n curl -i http://localhost:3000/hello/grace') -}) ----- - -when invoked as follows: - -[source,bash] ----- -export ELASTIC_APM_SERVER_URL='https://...apm...cloud.es.io:443' -export ELASTIC_APM_SECRET_TOKEN='...' -node -r elastic-apm-node/start.js \ - --experimental-loader=elastic-apm-node/loader.mjs' \ - node server.mjs ----- - -The current ESM support is limited -- only a subset of the modules listed at <> are implemented. More will be added in subsequent releases. See below for full details. - -The ESM limitations only affects the agent's automatic instrumentation. Other functionality -- such as metrics collection, manual instrumentation and error capture -- still work when using ES modules. - - -[float] -[[esm-enabling]] -=== Enabling ESM auto-instrumentation - -Enabling ESM auto-instrumentation requires starting Node.js with the `--experimental-loader=elastic-apm-node/loader.mjs` option. This can be done by passing the argument on the command line or by setting the https://nodejs.org/api/all.html#all_cli_node_optionsoptions[`NODE_OPTIONS`] environment variable. - -[source,bash] ----- -node --experimental-loader=elastic-apm-node/loader.mjs server.mjs - -# or - -NODE_OPTIONS='--experimental-loader=elastic-apm-node/loader.mjs' -node server.mjs ----- - -As well, the APM agent must also be separately *started* -- for example via `--require=elastic-apm-node/start.js`. See <> for the various ways of starting the APM agent. - - -[float] -[[esm-compat-node]] -=== Supported Node.js versions - -Automatic instrumentation of ES modules is based on the experimental Node.js Loaders API. ESM support in the Elastic APM Node.js agent will remain *experimental* while the Loaders API is experimental. - -ESM auto-instrumentation is only supported for Node.js versions that match *`^12.20.0 || ^14.13.1 || ^16.0.0 || ^18.1.0 || >=20.2.0`*. -The behavior when using `node --experimental-loader=elastic-apm-node/loader.mjs` with earlier Node.js versions is undefined and unsupported. - - -[float] -[[esm-compat-modules]] -=== Supported modules - -Automatic instrumentation of ES modules is currently limited as described here. Note that the supported module version ranges often differ from those for CommonJS (i.e. `require()`) auto-instrumentation. - -[options="header"] -|======================================================================= -| Module | Version | Note | -| `@aws-sdk/client-dynamodb` | >=3.15.0 <4 | | -| `@aws-sdk/client-s3` | >=3.15.0 <4 | | -| `@aws-sdk/client-sns` | >=3.15.0 <4 | | -| `@aws-sdk/client-sqs` | >=3.15.0 <4 | | -| `cassandra-driver` | >=3.0.0 <5 | | -| `express` | ^4.0.0 | | -| `fastify` | >=3.5.0 | | -| `http` | | See <> above. | -| `https` | | See <> above. | -| `ioredis` | >=2 <6 | | -| `knex` | >=0.20.0 <4 | Also, only with pg@8. | -| `pg` | ^8 | | -|======================================================================= - - -[float] -[[esm-troubleshooting]] -=== Troubleshooting ESM support - -If you see an error like the following, then you are attempting to use ESM auto-instrumentation support with too early of a version of Node.js. See <> above. - -[source] ----- -file:///.../node_modules/import-in-the-middle/hook.mjs:6 -import { createHook } from './hook.js' - ^^^^^^^^^^ -SyntaxError: The requested module './hook.js' is expected to be of type CommonJS, which does not support named exports. CommonJS modules can be imported by importing the default export. -For example: -import pkg from './hook.js'; -const { createHook } = pkg; - at ModuleJob._instantiate (internal/modules/esm/module_job.js:98:21) - at async ModuleJob.run (internal/modules/esm/module_job.js:137:5) - at async Loader.import (internal/modules/esm/loader.js:165:24) - at async internal/process/esm_loader.js:57:9 - at async Object.loadESM (internal/process/esm_loader.js:67:5) ----- diff --git a/docs/express.asciidoc b/docs/express.asciidoc deleted file mode 100644 index a4693529c8..0000000000 --- a/docs/express.asciidoc +++ /dev/null @@ -1,120 +0,0 @@ -:framework: Express - -[[express]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/express.html[elastic.co] -endif::[] - -=== Get started with Express - -Getting Elastic APM set up for your Express app is easy, -and there are various ways you can tweak it to fit your needs. -Follow the guide below to get started, and for more advanced topics, -check out the <>. - -[float] -[[express-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[express-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `express`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple Express example with the Elastic APM agent installed: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -const apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -const app = require('express')() - -app.get('/', function (req, res) { - res.send('Hello World!') -}) - -app.listen(3000) ----- - -The agent will now monitor the performance of your Express application and record any uncaught exceptions. - -[float] -[[express-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[express-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[express-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[express-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[express-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[express-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[express-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[express-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[express-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/fastify.asciidoc b/docs/fastify.asciidoc deleted file mode 100644 index fd322a49e5..0000000000 --- a/docs/fastify.asciidoc +++ /dev/null @@ -1,130 +0,0 @@ -:framework: Fastify - -[[fastify]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/fastify.html[elastic.co] -endif::[] - -=== Get started with Fastify - -Getting Elastic APM set up for your Fastify app is easy, -and there are various ways you can tweak it to fit your needs. - -Follow the guide below to get started, and for more advanced topics, -check out the <>. - -[float] -[[fastify-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[fastify-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `fastify`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple Fastify example with the Elastic APM agent installed: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -var apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -// Require the framework and instantiate it -var fastify = require('fastify')({ - logger: true -}) - -// Declare a route -fastify.get('/', function (request, reply) { - reply.send({ hello: 'world' }) -}) - -// Run the server! -fastify.listen(3000, function (err, address) { - if (err) throw err - fastify.log.info(`server listening on ${address}`) -}) ----- - -The agent will now monitor the performance of your Fastify application and record any uncaught exceptions. - -[float] -[[fastify-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[fastify-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[fastify-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[fastify-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[fastify-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[fastify-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[fastify-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[fastify-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] -See also: https://www.fastify.io/docs/latest/LTS/[Fastify's own LTS documentation.] - -[float] -[[fastify-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/hapi.asciidoc b/docs/hapi.asciidoc deleted file mode 100644 index 54153c1881..0000000000 --- a/docs/hapi.asciidoc +++ /dev/null @@ -1,128 +0,0 @@ -:framework: hapi - -[[hapi]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/hapi.html[elastic.co] -endif::[] - -=== Get started with hapi - -include::./shared-set-up.asciidoc[tag=introduction] - -[float] -[[hapi-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[hapi-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `@hapi/hapi`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple hapi example with the Elastic APM agent installed: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -const apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -const Hapi = require('@hapi/hapi') - -const init = async () => { - const server = Hapi.server({ port: 3000, host: 'localhost' }) - - server.route({ - method: 'GET', - path: '/', - handler: (request, h) => { - return 'hello world' - } - }) - - await server.start() - console.log('Server running on %s', server.info.uri) -} - -init() ----- - -The agent will now monitor the performance of your hapi application and record any uncaught exceptions. - -[float] -[[hapi-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[hapi-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[hapi-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[hapi-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[hapi-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[hapi-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[hapi-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[hapi-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[hapi-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/index.asciidoc b/docs/index.asciidoc deleted file mode 100644 index 9f495418e8..0000000000 --- a/docs/index.asciidoc +++ /dev/null @@ -1,57 +0,0 @@ -include::{asciidoc-dir}/../../shared/versions/stack/current.asciidoc[] -include::{asciidoc-dir}/../../shared/attributes.asciidoc[] - -:type-string: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type[] -:type-string-array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type[] -:type-array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array[] -:type-boolean: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type[] -:type-object: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object[] -:type-number: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type[] -:type-function: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function[] -:type-error: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error[] -:type-undefined: https://developer.mozilla.org/en-US/docs/Glossary/Undefined[] -:type-incomingmessage: https://nodejs.org/api/http.html#http_class_http_incomingmessage[] -:type-serverresponse: https://nodejs.org/api/http.html#http_class_http_serverresponse[] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs[elastic.co] -endif::[] - -= APM Node.js Agent Reference - -include::./intro.asciidoc[] - -include::./set-up.asciidoc[] - -include::./supported-technologies.asciidoc[] - -include::./setup.asciidoc[] - -include::./api.asciidoc[] - -include::./metrics.asciidoc[] - -include::./logs.asciidoc[] - -include::./api-opentelemetry.asciidoc[] - -include::./opentracing.asciidoc[] - -include::./source-maps.asciidoc[] - -include::./esm.asciidoc[] - -include::./distributed-tracing.asciidoc[] - -include::./message-queues.asciidoc[] - -include::./performance-tuning.asciidoc[] - -include::./troubleshooting.asciidoc[] - -include::./upgrading.asciidoc[] - -include::./release-notes.asciidoc[] - -include::./redirects.asciidoc[] diff --git a/docs/intro.asciidoc b/docs/intro.asciidoc deleted file mode 100644 index be2e0c4b98..0000000000 --- a/docs/intro.asciidoc +++ /dev/null @@ -1,35 +0,0 @@ -[[intro]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/intro.html[elastic.co] -endif::[] - -== Introduction - -The Elastic APM Node.js Agent sends performance metrics and errors to the APM Server. -It has built-in support for the most popular frameworks and routers, -as well as a simple API which allows you to instrument any application. - -[float] -[[how-it-works]] -=== How does the Agent work? - -The agent auto-instruments <> and records interesting events, -like HTTP requests and database queries. To do this, it patches modules as they are loaded to capture when module functions and callbacks are called. Additionally, there are some cases where a module will be patched to allow tracing context to be propagated through the asynchronous continuation. -This means that for the supported technologies, there are no code changes required. - -The Agent automatically links module function calls to callback calls to measure their duration and metadata (like the DB statement), -as well as HTTP related information (like the URL, parameters, and headers). - -These events, called Transactions and Spans, are sent to the APM Server. -The APM Server converts them to a format suitable for Elasticsearch, and sends them to an Elasticsearch cluster. -You can then use the APM app in Kibana to gain insight into latency issues and error culprits within your application. - -[float] -[[additional-components]] -=== Additional Components - -APM Agents work in conjunction with the {apm-guide-ref}/index.html[APM Server], {ref}/index.html[Elasticsearch], and {kibana-ref}/index.html[Kibana]. -The {apm-guide-ref}/index.html[APM Guide] provides details on how these components work together, -and provides a matrix outlining {apm-guide-ref}/agent-server-compatibility.html[Agent and Server compatibility]. diff --git a/docs/koa.asciidoc b/docs/koa.asciidoc deleted file mode 100644 index 6153c4b484..0000000000 --- a/docs/koa.asciidoc +++ /dev/null @@ -1,130 +0,0 @@ -:framework: Koa - -[[koa]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/koa.html[elastic.co] -endif::[] - -=== Get started with Koa - -include::./shared-set-up.asciidoc[tag=introduction] - -Koa doesn't have a built-in router, -so we can't support Koa directly since we rely on router information for full support. -We currently support the most popular Koa router called https://github.com/koajs/koa-router[koa-router]. - -If you use another router with your Koa application, -please https://github.com/elastic/apm-agent-nodejs/issues[open an issue] so we can make sure to support your stack. -In the meantime, you can <>. - -[float] -[[koa-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[koa-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `koa`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple Koa example with the Elastic APM agent installed: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -const apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -const app = require('koa')() -const router = require('koa-router')() - -router.get('/', function *(next) { - this.body = 'Hello World' -}) - -app - .use(router.routes()) - .use(router.allowedMethods()) - -app.listen(3000) ----- - -The agent will now monitor the performance of your Koa application and record any uncaught exceptions. - -[float] -[[koa-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[koa-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[koa-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[koa-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[koa-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[koa-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[koa-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[koa-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[koa-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/lambda.asciidoc b/docs/lambda.asciidoc deleted file mode 100644 index 2797865c4d..0000000000 --- a/docs/lambda.asciidoc +++ /dev/null @@ -1,83 +0,0 @@ -[[lambda]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/lambda.html[elastic.co] -endif::[] - -=== Monitoring AWS Lambda Node.js Functions -:layer-section-type: with-agent - -The Node.js APM Agent can be used with AWS Lambda to monitor the execution of your AWS Lambda functions. - -[float] -[[aws-lambda-nodejs-quick-start]] -=== Quick Start - -To get started with APM for your Node.js AWS Lambda functions follow the steps below. - -[float] -[[aws-lambda-nodejs-prerequisites]] -==== Prerequisites - -You need an APM Server to send APM data to. Follow the {apm-guide-ref}/apm-quick-start.html[APM Quick start] if you have not set one up yet. For the best-possible performance, we recommend setting up APM on {ecloud} in the same AWS region as your AWS Lambda functions. - -[float] -==== Step 1: Select the AWS Region and Architecture - -include::{apm-aws-lambda-root}/docs/lambda-selector/lambda-attributes-selector.asciidoc[] - -[float] -==== Step 2: Add the APM Layers to your Lambda function - -include::{apm-aws-lambda-root}/docs/lambda-selector/extension-arn-replacement.asciidoc[] -include::./lambda/nodejs-arn-replacement.asciidoc[] - -Both the {apm-lambda-ref}/aws-lambda-arch.html[{apm-lambda-ext}] and the Node.js APM Agent are added to your Lambda function as https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html[AWS Lambda Layers]. Therefore, you need to add the corresponding Layer ARNs (identifiers) to your Lambda function. - -include::{apm-aws-lambda-root}/docs/add-extension/add-extension-layer-widget.asciidoc[] - -[float] -==== Step 3: Configure APM on AWS Lambda - -The {apm-lambda-ext} and the APM Node.js agent are configured through environment variables on the AWS Lambda function. - -For the minimal configuration, you will need the _APM Server URL_ to set the destination for APM data and an _{apm-guide-ref}/secret-token.html[APM Secret Token]_. -If you prefer to use an {apm-guide-ref}/api-key.html[APM API key] instead of the APM secret token, use the `ELASTIC_APM_API_KEY` environment variable instead of `ELASTIC_APM_SECRET_TOKEN` in the following configuration. - -For production environments, we recommend {apm-lambda-ref}/aws-lambda-secrets-manager.html[using the AWS Secrets Manager to store your APM authentication key] instead of providing the secret value as plaintext in the environment variables. - -include::./lambda/configure-lambda-widget.asciidoc[] -<1> The {apm-lambda-ref}/aws-lambda-config-options.html#_elastic_apm_send_strategy[`ELASTIC_APM_SEND_STRATEGY`] defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the `background` strategy in production environments with steady load scenarios. - -You can optionally <> or the {apm-lambda-ref}/aws-lambda-config-options.html[configuration of the {apm-lambda-ext}]. - -That's it. After following the steps above, you're ready to go! -Your Lambda function invocations should be traced from now on. - - -[float] -[[aws-lambda-features]] -=== Features - -The AWS Lambda instrumentation will report a transaction for all function invocations -and trace any <>. In addition, the -created transactions will capture additional data for a number of Lambda -trigger types -- API Gateway, SNS, SQS, S3 (when the trigger is a single event), -and ELB. - -A transaction will be reported for Lambda invocations that fail due to a -timeout, crash, `uncaughtException`, or `unhandledRejection`. (This requires -APM agent v3.45.0 or later and -https://www.elastic.co/guide/en/apm/lambda/current/aws-lambda-arch.html[Elastic's APM Lambda extension] -version 1.4.0 or later.) - - -[float] -[[aws-lambda-caveats]] -=== Caveats and Troubleshooting - -* System and custom metrics are not collected for Lambda functions. This is both because most of those are irrelevant -and because the interval-based event sending model is not suitable for FaaS environments. -* The APM agent does not yet support a Lambda handler module that uses ECMAScript modules (ESM). That means your handler file name should end with ".js" (and not have `"type": "module"` in package.json if you have one) or end with ".cjs". A handler file that uses the ".mjs" suffix will not be instrumented by the APM agent. - diff --git a/docs/lambda/configure-lambda-widget.asciidoc b/docs/lambda/configure-lambda-widget.asciidoc deleted file mode 100644 index 1b85b4ac68..0000000000 --- a/docs/lambda/configure-lambda-widget.asciidoc +++ /dev/null @@ -1,118 +0,0 @@ -++++ -
-
- - - - - - -
-
-++++ - -include::configure-lambda.asciidoc[tag=console-{layer-section-type}] - -++++ -
- - - - - -
-++++ diff --git a/docs/lambda/configure-lambda.asciidoc b/docs/lambda/configure-lambda.asciidoc deleted file mode 100644 index af4755248a..0000000000 --- a/docs/lambda/configure-lambda.asciidoc +++ /dev/null @@ -1,113 +0,0 @@ -// tag::console-with-agent[] - -To configure APM through the AWS Management Console: - -1. Navigate to your function in the AWS Management Console -2. Click on the _Configuration_ tab -3. Click on _Environment variables_ -4. Add the following required variables: - -[source,bash] ----- -NODE_OPTIONS = -r elastic-apm-node/start # use this exact fixed value -ELASTIC_APM_LAMBDA_APM_SERVER = # this is your APM Server URL -ELASTIC_APM_SECRET_TOKEN = # this is your APM secret token -ELASTIC_APM_SEND_STRATEGY = background <1> ----- - --- -include::{apm-aws-lambda-root}/docs/images/images.asciidoc[tag=nodejs-env-vars] --- - -// end::console-with-agent[] - -// tag::cli-with-agent[] - -To configure APM through the AWS command line interface execute the following command: - -[source,bash] ----- -aws lambda update-function-configuration --function-name yourLambdaFunctionName \ - --environment "Variables={NODE_OPTIONS=-r elastic-apm-node/start,ELASTIC_APM_LAMBDA_APM_SERVER=,ELASTIC_APM_SECRET_TOKEN=,ELASTIC_APM_SEND_STRATEGY=background}" <1> ----- - -// end::cli-with-agent[] - -// tag::sam-with-agent[] - -In your SAM `template.yml` file configure the following environment variables: - -[source,yml] ----- -... -Resources: - yourLambdaFunction: - Type: AWS::Serverless::Function - Properties: - ... - Environment: - Variables: - NODE_OPTIONS: -r elastic-apm-node/start - ELASTIC_APM_LAMBDA_APM_SERVER: - ELASTIC_APM_SECRET_TOKEN: - ELASTIC_APM_SEND_STRATEGY: background <1> -... ----- - -// end::sam-with-agent[] - -// tag::serverless-with-agent[] - -In your `serverless.yml` file configure the following environment variables: - -[source,yml] ----- -... -functions: - yourLambdaFunction: - ... - environment: - NODE_OPTIONS: -r elastic-apm-node/start - ELASTIC_APM_LAMBDA_APM_SERVER: - ELASTIC_APM_SECRET_TOKEN: - ELASTIC_APM_SEND_STRATEGY: background <1> -... ----- - -// end::serverless-with-agent[] - -// tag::terraform-with-agent[] -In your Terraform file configure the following environment variables: - -[source,terraform] ----- -... -resource "aws_lambda_function" "your_lambda_function" { - ... - environment { - variables = { - NODE_OPTIONS = "-r elastic-apm-node/start" - ELASTIC_APM_LAMBDA_APM_SERVER = "" - ELASTIC_APM_SECRET_TOKEN = "" - ELASTIC_APM_SEND_STRATEGY = "background" <1> - } - } -} -... ----- - -// end::terraform-with-agent[] - -// tag::container-with-agent[] -Environment variables configured for an AWS Lambda function are passed to the container running the lambda function. -You can use one of the other options (through AWS Web Console, AWS CLI, etc.) to configure the following environment variables: - -[source,bash] ----- -NODE_OPTIONS = -r elastic-apm-node/start # use this exact fixed value -ELASTIC_APM_LAMBDA_APM_SERVER = # this is your APM Server URL -ELASTIC_APM_SECRET_TOKEN = # this is your APM secret token -ELASTIC_APM_SEND_STRATEGY = background <1> ----- - -// end::container-with-agent[] diff --git a/docs/lambda/nodejs-arn-replacement.asciidoc b/docs/lambda/nodejs-arn-replacement.asciidoc deleted file mode 100644 index 469ea9feb1..0000000000 --- a/docs/lambda/nodejs-arn-replacement.asciidoc +++ /dev/null @@ -1,9 +0,0 @@ -++++ - -++++ diff --git a/docs/logs.asciidoc b/docs/logs.asciidoc deleted file mode 100644 index 94d3ec1c39..0000000000 --- a/docs/logs.asciidoc +++ /dev/null @@ -1,34 +0,0 @@ -[[logs]] -## Logs - -The Elastic APM Node.js Agent provides support for <>. When -used together with the {ecs-logging-nodejs-ref}/intro.html[`ecs-logging-nodejs` -packages], correlation IDs will be automatically injected into log records to -allow navigation between logs, traces, and services. - -This feature is part of {observability-guide}/application-logs.html[Application log ingestion strategies]. - -[float] -[[log-correlation-ids]] -== Log correlation - -{apm-guide-ref}/log-correlation.html[Log correlation] allows you to navigate to all logs belonging to a particular trace -and vice-versa: for a specific log, see in which context it has been logged and which parameters the user provided. - -In order to correlate logs from your application with traces captured by the -Elastic APM Node.js Agent, your logs must contain the following identifiers: - -* {ecs-ref}/ecs-tracing.html[`trace.id`] -* {ecs-ref}/ecs-tracing.html[`transaction.id`] or {ecs-ref}/ecs-tracing.html[`span.id`] - -The APM Node.js Agent provides the <> API for this. -If your application is also using one of the {ecs-logging-nodejs-ref}/intro.html[ECS formatting plugin packages] -(available for Pino, Winston, and Morgan), then this APM Agent API will -automatically be used to inject the appropriate tracing fields into your log -records. Otherwise, configure your logger to add these fields when emitting a -log record. - -When your logs contain the appropriate identifiers, the final step is to ingest them into the same -Elasticsearch instance that contains your APM data. See -{apm-guide-ref}/log-correlation.html#ingest-logs-in-es[Ingest your logs into Elasticsearch] -for more information. diff --git a/docs/metrics.asciidoc b/docs/metrics.asciidoc deleted file mode 100644 index 1b1849f57e..0000000000 --- a/docs/metrics.asciidoc +++ /dev/null @@ -1,180 +0,0 @@ -[[metrics]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/metrics.html[elastic.co] -endif::[] - -== Metrics - -The Node.js agent tracks various system and application metrics. -These metrics will be sent regularly to the APM Server and from there to Elasticsearch. -You can adjust the interval by setting <>. - -The metrics will be stored in the `apm-*` index and have the `processor.event` property set to `metric`. - -[float] -[[metric-system.cpu.total.norm.pct]] -=== `system.cpu.total.norm.pct` - -* *Type:* Float -* *Format:* Percent - -The percentage of CPU time in states other than Idle and IOWait, -normalized by the number of cores. - -[float] -[[metric-system.memory.total]] -=== `system.memory.total` - -* *Type:* Long -* *Format:* Bytes - -The total memory of the system in bytes. - -[float] -[[metric-system.memory.actual.free]] -=== `system.memory.actual.free` - -* *Type:* Long -* *Format:* Bytes - -Free memory of the system in bytes. - -[float] -[[metric-system.process.cpu.total.norm.pct]] -=== `system.process.cpu.total.norm.pct` - -* *Type:* Float -* *Format:* Percent - -The percentage of CPU time spent by the process since the last event. -This value is normalized by the number of CPU cores and it ranges from 0 to 100%. - -[float] -[[metric-system.process.memory.rss.bytes]] -=== `system.process.memory.rss.bytes` - -* *Type:* Long -* *Format:* Bytes - -The Resident Set Size, -the amount of memory the process occupies in main memory (RAM). - -[float] -[[metric-nodejs.handles.active]] -=== `nodejs.handles.active` - -* *Type:* Long -* *Format:* Counter - -The number of active libuv handles, -likely held open by currently running I/O operations. - -[float] -[[metric-nodejs.requests.active]] -=== `nodejs.requests.active` - -* *Type:* Long -* *Format:* Counter - -The number of active libuv requests, -likely waiting for a response to an I/O operation. - -[float] -[[metric-system.process.cpu.user.norm.pct]] -=== `system.process.cpu.user.norm.pct` - -* *Type:* Long -* *Format:* Counter - -The number of CPU cycles spent executing application code. - -[float] -[[metric-system.process.cpu.system.norm.pct]] -=== `system.process.cpu.system.norm.pct` - -* *Type:* Long -* *Format:* Counter - -The number of CPU cycles spent executing kernel code as a result of application activity. - -[float] -[[metric-nodejs.eventloop.delay.avg.ms]] -=== `nodejs.eventloop.delay.avg.ms` - -* *Type:* Float -* *Format:* Milliseconds - -The number of milliseconds of event loop delay. -Event loop delay is sampled every 10 milliseconds. -Delays shorter than 10ms may not be observed, -for example if a blocking operation starts and ends within the same sampling period. - -[float] -[[metric-nodejs.memory.heap.allocated.bytes]] -=== `nodejs.memory.heap.allocated.bytes` - -* *Type:* Long -* *Format:* Bytes - -The current allocated heap size in bytes. - -[float] -[[metric-nodejs.memory.heap.used.bytes]] -=== `nodejs.memory.heap.used.bytes` - -* *Type:* Long -* *Format:* Bytes - -The currently used heap size in bytes. - -[float] -[[metric-nodejs.memory.external.bytes]] -=== `nodejs.memory.external.bytes` - -* *Type:* Long -* *Format:* Bytes - -Memory usage of C++ objects bound to JavaScript objects managed by V8. - -[float] -[[metric-nodejs.memory.arrayBuffers.bytes]] -=== `nodejs.memory.arrayBuffers.bytes` - -* *Type:* Long -* *Format:* Bytes - -Memory allocated for ArrayBuffers and SharedArrayBuffers, including all Node.js Buffers. -This is also included in the `nodejs.memory.external.bytes` value. - -[float] -[[metrics-span.self_time.sum]] -=== `span.self_time.sum` - -* *Type:* Long -* *Format:* Milliseconds - -The sum of all span self-times in milliseconds since the last report (the delta). -The `span.self_time.*` metrics are referred to as "breakdown metrics". - -You can filter and group by these dimensions: - -* `transaction.name`: The name of the transaction -* `transaction.type`: The type of the transaction, for example `request` -* `span.type`: The type of the span, for example `app`, `template` or `db` -* `span.subtype`: The sub-type of the span, for example `mysql` (optional) - -[float] -[[metrics-span.self_time.count]] -=== `span.self_time.count` - -* *Type:* Long -* *Format:* Counter - -You can filter and group by these dimensions: - -* `transaction.name`: The name of the transaction -* `transaction.type`: The type of the transaction, for example `request` -* `span.type`: The type of the span, for example `app`, `template` or `db` -* `span.subtype`: The sub-type of the span, for example `mysql` (optional) diff --git a/docs/nextjs.asciidoc b/docs/nextjs.asciidoc deleted file mode 100644 index d05a7ce670..0000000000 --- a/docs/nextjs.asciidoc +++ /dev/null @@ -1,209 +0,0 @@ -:framework: Next.js - -[[nextjs]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/nextjs.html[elastic.co] -endif::[] - -=== Get started with Next.js - -The Elastic APM Node.js agent can be used to trace the Next.js server (`next -start` or `next dev`) that runs your application without the need for code -changes to your app. The APM transactions for incoming HTTP requests to the -server will be named for the https://nextjs.org/docs/routing/introduction[pages] -and https://nextjs.org/docs/api-routes/introduction[API endpoints] in your -application, as well as for internal routes used by Next.js. Errors in code run -on the server will be reported for viewing in the Kibana APM app. - -Note that the Node.js APM agent can only instrument _server-side_ code. To -monitor the client-side parts of a Next.js application, see the -{apm-rum-ref}/intro.html[Elastic RUM agent]. - -NOTE: preview:[] This Next.js instrumentation is a _technical preview_ while we -solicit feedback from Next.js users. Currently `next` versions `>=12.0.0 -<13.3.0` are supported. If you are a Next.js user, please help us provide a -better Next.js observability experience with your feedback on our -https://discuss.elastic.co/tags/c/apm/nodejs[Discuss forum]. - - -[float] -[[nextjs-prerequisites]] -==== Prerequisites - -You need an APM Server to send APM data to. Follow the -{apm-guide-ref}/apm-quick-start.html[APM Quick start] if you have not set one up -yet. You will need your *APM server URL* and an APM server *secret token* (or -*API key*) for configuring the APM agent below. - -You will also need a Next.js application to monitor. If you do not have an -existing one to use, you can use the following to create a starter app (see -https://nextjs.org/docs/getting-started[Next.js Getting Started docs] for more): - -[source,bash] ----- -npx create-next-app@latest # use the defaults -cd my-app ----- - -You can also take a look at and use this https://github.com/elastic/apm-agent-nodejs/tree/main/examples/nextjs/[Next.js + Elastic APM example app]. - -[float] -[[nextjs-setup]] -==== Step 1: Add the APM agent dependency - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save # or 'yarn add elastic-apm-node' ----- - - -[float] -==== Step 2: Start the APM agent - -For the APM agent to instrument the Next.js server, it needs to be started -before the Next.js server code is loaded. The best way to do so is by using -Node's https://nodejs.org/api/cli.html#-r---require-module[`--require`] option -to load the "elastic-apm-node/start-next.js" module -- this will start the agent -(plus a little more for Next.js integration). - -Edit the "dev" and "start" scripts in your "package.json" as follows: - -[source,json] ----- -{ - // ... - "scripts": { - "dev": "NODE_OPTIONS=--require=elastic-apm-node/start-next.js next dev", - "build": "next build", - "start": "NODE_OPTIONS=--require=elastic-apm-node/start-next.js next start", - "lint": "next lint" - }, - // ... -} ----- - - -[float] -==== Step 3: Configure the APM agent - -The APM agent can be -<> -with environment variables or with an "elastic-apm-node.js" module in the -current working directory. Note that because the APM agent is being loaded -before the Next.js server, the -https://nextjs.org/docs/basic-features/environment-variables[Next.js-supported -".env" files] *cannot* be used to configure the APM agent. We will use an -"elastic-apm-node.js" file here. - -Create an "elastic-apm-node.js" file in the application root with the APM server -URL and secret token values from the <> section above: - -[source,javascript] ----- -// elastic-apm-node.js -module.exports = { - serverUrl: 'https://...', // E.g. https://my-deployment-name.apm.us-west2.gcp.elastic-cloud.com - secretToken: '...' -} ----- - -The equivalent using environment variables is: - -[source,bash] ----- -export ELASTIC_APM_SERVER_URL='https://...' -export ELASTIC_APM_SECRET_TOKEN='...' ----- - -See the <> for full details on supported configuration variables. - - -[float] -==== Step 4: Start your Next.js app - -[source,bash] ----- -npm run dev # or 'npm run build && npm start' for the production server ----- - -Open in your browser to load your Next.js app. If you -used the `create-next-app` tool above, it defines an -http://localhost:3000/api/hello[/api/hello] API endpoint. You can provide some -artificial load by running the following in a separate terminal: - -[source,bash] ----- -while true; do sleep 1; curl -i http://localhost:3000/api/hello; done ----- - -Visit your Kibana APM app and, after a few seconds, you should see a service -entry for your Next.js app. The service name will be pulled from the "name" -field in "package.json". It can be overriden with -<>. Here is an example: - -image::./images/nextjs-my-app-screenshot.png[Kibana APM app showing Next.js my-app] - - -[float] -[[nextjs-limitations]] -==== Limitations and future work - -This Next.js instrumentation has some limitations to be aware of. - -Next.js build tooling bundles dependencies (using Webpack) for both client _and_ -server-side code execution. The Node.js APM agent does not work when bundled. -See <> for details. The implication for Next.js instrumentation -is that you cannot directly import and use the APM agent in your code. That -means that using the <> for manual instrumentation is not currently -possible. - -This instrumentation supports naming APM transactions for many internal Next.js -routes. For example, for -https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props[server-side -rendering (SSR)] Next.js client code will make requests of the form `GET -/next/_data/$buildId/$page.json`, for which the APM agent names the transaction -`Next.js _next/data route $page`. However, there is a limitation with the -Next.js "public folder catchall" route. HTTP requests that resolve to files in -your "public/" directory, for example `GET /favicon.ico`, will result in a -transaction named `GET unknown route`. See <> below. - -If you notice other limitations or have any suggestions, please give us feedback -on our https://discuss.elastic.co/tags/c/apm/nodejs[Discuss forum]. - - -[float] -[[nextjs-performance-monitoring]] -==== Performance monitoring - -Elastic APM automatically measures the performance of your Next.js application. -It records spans for database queries, external HTTP requests, and other slow -operations that happen during requests to your Next.js app. Spans are grouped in -transactions -- by default one for each incoming HTTP request. - -[float] -[[nextjs-unknown-routes]] -==== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[nextjs-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[nextjs-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[nextjs-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/opentracing.asciidoc b/docs/opentracing.asciidoc deleted file mode 100644 index 2121f93572..0000000000 --- a/docs/opentracing.asciidoc +++ /dev/null @@ -1,182 +0,0 @@ -[[opentracing]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/opentracing.html[elastic.co] -endif::[] - -== OpenTracing bridge - -NOTE: https://opentracing.io/[OpenTracing] is discontinued in favor of OpenTelemetry. This Elastic APM OpenTracing bridge is **deprecated**. Consider using the <> instead. - - -The Elastic APM OpenTracing bridge allows creating Elastic APM transactions and spans, -using the https://opentracing-javascript.surge.sh/[OpenTracing API]. -In other words, -it translates the calls to the OpenTracing API to Elastic APM and thus allows for reusing existing instrumentation. - -For more information about OpenTracing, see the https://opentracing.io/[OpenTracing website]. - -[float] -[[ot-prerequisites]] -=== Prerequisites - -OpenTracing support for the Elastic APM Node.js Agent is provided via a separate module called https://www.npmjs.com/package/elastic-apm-node-opentracing[`elastic-apm-node-opentracing`]. - -This module requires that the Elastic APM Node.js Agent is installed separately. -To ensure that both dependencies are added to the application, -install them like so: - -[source,bash] ----- -npm install elastic-apm-node elastic-apm-node-opentracing --save ----- - -[float] -[[ot-terminologies]] -=== OpenTracing vs Elastic APM terminologies - -Elastic APM differentiates between {apm-guide-ref}/data-model-transactions.html[transactions] and {apm-guide-ref}/data-model-spans.html[spans]. -In the context of OpenTracing, a transaction can be thought of as a special kind of span. - -Because OpenTracing natively only has the concept of spans, -the Elastic APM OpenTracing bridge will automatically create either Elastic transactions or Elastic spans behind the scenes. -There are a set of rules that determine which is created: - -1. If `agent.currentTransaction` is `null`, - a new Elastic transaction will be created when calling `tracer.startSpan()`. -2. If `agent.currentTransaction` holds an existing transaction, - but that transaction is ended, - a new Elastic transaction will be created when calling `tracer.startSpan()`. -3. In all other cases, - a new Elastic span will be created when calling `tracer.startSpan()`. - -[float] -[[ot-initialization]] -=== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `express`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple example where we first start the agent and then initialize the OpenTracing bridge: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -const agent = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -const Tracer = require('elastic-apm-node-opentracing') - -// Pass the Elastic APM agent as an argument to the OpenTracing tracer -const tracer = new Tracer(agent) - -const span = tracer.startSpan('my-first-span') -// ... do some work ... -span.finish() ----- - -[float] -[[ot-api]] -=== API - -[source,js] ----- -tracer = new Tracer(agent) ----- - -The `elastic-apm-node-opentracing` module exposes a Tracer class which is OpenTracing compatible. - -When instantiating the Tracer object, -an instance of the Elastic APM Node.js Agent must be provided as its only argument. - -For details about the `tracer` API, -see the https://opentracing-javascript.surge.sh/[`opentracing-javascript` API docs]. - -[float] -[[ot-elastic-apm-tags]] -=== Elastic APM specific tags - -Elastic APM defines some tags which have special meaning and which will not be stored as regular tags. -Instead, they will be used to set certain metadata on the transaction or span. - -The following tags have special meaning for both transactions and spans: - -- `type` - sets the type of the transaction or span, - for example `request` for transactions or `db.mysql.query` for spans - -The following tags only have special meaning on the span if the underlying Elastic APM object is a transaction: - -- `result` - sets the result of the transaction (defaults to `success`) -- `error` - sets the result of the transaction to `error` if the tag value is `true` (defaults to `success`) -- `http.status_code` - sets the result of the transaction. - E.g. If the tag value is `200`, - the transaction result will be set to `HTTP 2xx` (defaults to `success`) -- `user.id` - sets the user id, - appears in the "User" tab in the transaction details in the Elastic APM app -- `user.email` - sets the user email, - appears in the "User" tab in the transaction details in the Elastic APM app -- `user.username` - sets the user name, - appears in the "User" tab in the transaction details in the Elastic APM app - -[float] -[[ot-caveats]] -=== Caveats - -Not all features of the OpenTracing API are supported. - -[float] -[[ot-propagation]] -==== Context propagation - -This bridge only supports the formats `opentracing.FORMAT_TEXT_MAP` and `opentracing.FORMAT_HTTP_HEADERS`. -`opentracing.FORMAT_BINARY` is currently not supported. - -[float] -[[ot-references]] -==== Span References - -Currently, this bridge only supports `opentracing.REFERENCE_CHILD_OF` references. -Other references, -like `opentracing.REFERENCE_FOLLOWS_FROM`, are not supported yet. - -[float] -[[ot-baggage]] -==== Baggage - -The `span.setBaggageItem()` method is not supported. -Baggage items are silently dropped. - -[float] -[[ot-logs]] -==== Logs - -Only error logging is supported. -Logging an Error object on the OpenTracing span will create an Elastic APM -{apm-guide-ref}/data-model-errors.html[error]. -Example: - -[source,js] ----- -const err = new Error('boom!') - -span.log({ - event: 'error', - 'error.object': err -}) ----- - -Other logs are silently dropped. diff --git a/docs/performance-tuning.asciidoc b/docs/performance-tuning.asciidoc deleted file mode 100644 index 7a588db4c3..0000000000 --- a/docs/performance-tuning.asciidoc +++ /dev/null @@ -1,169 +0,0 @@ -[[performance-tuning]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/performance-tuning.html[elastic.co] -endif::[] - -== Performance Tuning - -The Node.js APM agent offers a variety of <>, -some of which can have a significant impact on performance. Areas where APM -agent overhead might be seen are: CPU, memory, network, latency, and storage. -This document discusses the options most significant for performance tuning the -APM agent. - -[float] -[[performance-sampling]] -=== Sample rate - -The _sample rate_ is the percentage of incoming requests that are recorded and -sent to the APM Server. This is controlled by the -<> configuration option. By -default _all_ requests are traced (`transactionSampleRate: 1.0`). - -The amount of work the APM agent needs to do, generally scales linearly with -the number of traced requests. Therefore, the sample rate impacts CPU, memory, -network, and storage overhead. - -Applications with a high request rate and/or many spans per incoming request -may want to lower the the sampling rate. For example, see the example below -to trace 20% of incoming requests. Note that incoming HTTP requests that are -part of a <> already have the sampling -decision made -- the `traceparent` header includes a -https://w3c.github.io/trace-context/#sampled-flag[sampled flag]. In these cases -the `transactionSampleRate` setting will not apply. - -[source,js] ----- -require('elastic-apm-node').start({ - transactionSampleRate: 0.2 // sample 20% of incoming requests -}) ----- - - -[float] -[[performance-stack-traces]] -=== Stack Traces - -When the APM agent captures an error, it records its stack trace for later -analysis and viewing. Optionally, the APM agent can also record a stack trace -for captured *spans*. Stack traces can have a significant impact on CPU and -memory usage of the agent. There are several settings to adjust how they are -used. - -[float] -[[performance-span-stack-traces]] -==== Span Stack Traces - -The <> configuration -option controls if stack traces are never captured for spans (the -default), always captured for spans, or only captured for spans that are longer -than a given duration. In a complex application, a traced request may capture -many spans. Capturing and sending a stack trace for every span can result in -significant CPU and memory usage. - -It is because of the possibility of this CPU overhead that the APM Agent -disables stack trace collection for _spans_ by default. Unfortunately, even -the capturing of raw stack trace data at span creation and then throwing that -away for fast spans can have significant CPU overhead for heavily loaded -applications. Therefore, care must be taken before using `spanStackTraceMinDuration`. - - -[float] -[[performance-source-lines]] -==== Stack Trace Source Lines - -If you want to keep span stack traces enabled for context, -the next thing to try is adjusting how many source lines are reported for each stack trace. -When a stack trace is captured, -the agent will also capture several lines of source code around each stack frame location in the stack trace. - -The are four different settings to control this behaviour: - -- <> -- <> -- <> -- <> - -Source line settings are divided into app frames representing your app code and library frames representing the code of your dependencies. -App and library categories are both split into error and span groups. -Spans, -by default, -do not capture source lines. -Errors, -by default, -will capture five lines of code around each stack frame. - -Source lines are cached in-process. -In memory-constrained environments, -the source line cache may use more memory than desired. -Turning the limits down will help prevent excessive memory use. - - -[float] -[[performance-stack-frame-limit]] -==== Stack Frame Limit - -The <> configuration option controls how -many stack frames are captured when producing an `Error` instance of any kind. -A large value may impact CPU and memory overhead of the agent. - - -[float] -[[performance-error-log-stack-traces]] -==== Error Log Stack Traces - -Most stack traces recorded by the agent will point to where the error was instantiated, -not where it was identified and reported to the agent with <>. -For this reason, -the agent also has the <> setting to enable capturing an additional stack trace pointing to the place an error was reported to the agent. -By default, -it will only capture the stack trace to the reporting point when <> is called with a string message. - -Setting this to `always` will increase memory and bandwidth usage, -so it helps to consider how frequently the app may capture errors. - - -[float] -[[performance-transaction-max-spans]] -=== Spans - -The <> setting limits the number of spans which may be recorded within a single transaction before remaining spans are dropped. - -Spans may include many things such as a stack trace and context data. -Limiting the number of spans that may be recorded will reduce memory usage. - -Reducing max spans could result in loss of useful data about what occurred within a request, -if it is set too low. - -An alternative to limiting the maximum number of spans can be to drop spans with a very short duration, as those might not be that relevant. - -This, however, both reduces the amount of storage needed to store the spans in Elasticsearch, and the bandwidth needed to transport the data to the APM Server from the instrumented application. - -This can be implemented by providing a span-filter: - -[source,js] ----- -agent.addSpanFilter(payload => { - return payload.duration < 10 ? null : payload -}) ----- - -NOTE: Using a span filter does not reduce the load of recording the spans in your application, but merely filters them out before sending them to the APM Server. - - -[float] -[[performance-max-queue-size]] -=== Max queue size - -The APM agent uses a persistent outgoing HTTP request (periodically refreshed) -to stream data to the APM Server. If either the APM agent cannot keep up with -events (transactions, spans, errors, and metricsets) from the application or -if the APM Server is slow or not responding, then the agent will buffer events. -If the buffer exceeds <>, then events are dropped to limit -memory usage of the agent. - -A lower value for `maxQueueSize` will decrease the heap overhead (and possibly -the CPU usage) of the agent, while a higher value makes it less likely to lose -events in case of a temporary spike in throughput. diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc deleted file mode 100644 index b7c85825eb..0000000000 --- a/docs/redirects.asciidoc +++ /dev/null @@ -1,57 +0,0 @@ -["appendix",role="exclude",id="redirects"] -== Deleted pages - -The following pages have moved or been deleted. - -[role="exclude",id="compatibility"] -=== Compatibility - -This page has moved. Please see <>. - -[role="exclude",id="apm-set-tag"] -=== `apm.setTag(name, value)` - -This endpoint has moved. Please see <>. - -[role="exclude",id="apm-add-tags"] -=== `apm.addTags({ [name]: value })` - -This endpoint has moved. Please see <>. - -[role="exclude",id="span-set-tag"] -=== `span.setTag(name, value)` - -This endpoint has moved. Please see <>. - -[role="exclude",id="span-add-tags"] -=== `span.addTags({ [name]: value })` - -This endpoint has moved. Please see <>. - -[role="exclude",id="transaction-set-tag"] -=== `transaction.setTag(name, value)` - -This endpoint has moved. Please see <>. - -[role="exclude",id="transaction-add-tags"] -=== `transaction.addTags({ [name]: value })` - -This endpoint has moved. Please see <>. - -[role="exclude",id="get-started"] -=== Get started - -This page has moved. Please see <>. - -[role="exclude",id="es-modules"] -=== ES Modules support - -This page has moved. - -- For details on ES Modules (ESM) support, see <>. -- For information on using the APM agent with TypeScript, see <>. - -[role="exclude",id="log-correlation"] -=== Log correlation - -This section has moved. See <>. diff --git a/docs/reference/advanced-setup.md b/docs/reference/advanced-setup.md new file mode 100644 index 0000000000..586862c076 --- /dev/null +++ b/docs/reference/advanced-setup.md @@ -0,0 +1,20 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/advanced-setup.html +--- + +# Configuration [advanced-setup] + +Use the following pages to configure the APM Agent. + +* [Configuring the agent](/reference/configuring-agent.md) + + * [Agent configuration object](/reference/configuring-agent.md#agent-configuration-object) + * [Agent configuration file](/reference/configuring-agent.md#agent-configuration-file) + +* [Configuration options](/reference/configuration.md) + + + + + diff --git a/docs/reference/agent-api.md b/docs/reference/agent-api.md new file mode 100644 index 0000000000..83bdcc39b8 --- /dev/null +++ b/docs/reference/agent-api.md @@ -0,0 +1,748 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/agent-api.html +--- + +# Agent API [agent-api] + +The Elastic APM Node.js agent is a singleton. You get the agent instance by requiring either `elastic-apm-node` or `elastic-apm-node/start`. The agent is also returned by the [`.start()`](#apm-start) method, which allows you to require and start the agent on the same line: + +```js +const apm = require('elastic-apm-node').start(...) +``` + +If you need to access the `Agent` in any part of your codebase, you can simply require `elastic-apm-node` to access the already started singleton. You therefore don’t need to manage or pass around the started `Agent` yourself. + +## `apm.start([options])` [apm-start] + +Starts the Elastic APM agent for Node.js and returns itself. + +::::{important} +For the APM agent to automatically instrument Node.js modules, it must be started before those modules are loaded. See [Starting the agent](/reference/starting-agent.md) for details and possible surprises with compilers/transpilers/bundlers. + +:::: + + +See the [Configuration documentation](/reference/configuration.md) for available options. + + +## `apm.isStarted()` [apm-is-started] + +Added in: v1.5.0 + +Use `isStarted()` to check if the agent has already started. Returns `true` if the agent has started, otherwise returns `false`. + + +## `apm.getServiceName()` [apm-get-service-name] + +Added in: v3.11.0 + +Get the configured [`serviceName`](/reference/configuration.md#service-name). If a service name was not explicitly configured, this value may have been automatically determined. The service name is not determined until `agent.start()`, so will be `undefined` until then. A misconfigured agent can have a `null` service name. + + +## `apm.getServiceVersion()` [apm-get-service-version] + +Added in: v4.2.0 + +Get the configured [`serviceVersion`](/reference/configuration.md#service-version). If a service version was not explicitly configured, this value may have been automatically determined. The service version is not determined until `agent.start()`, so will be `undefined` until then. + + +## `apm.getServiceEnvironment()` [apm-get-service-environment] + +Added in: v4.2.0 + +Get the configured [`environment`](/reference/configuration.md#environment). + + +## `apm.getServiceNodeName()` [apm-get-service-node-name] + +Added in: v4.2.0 + +Get the configured [`serviceNodeName`](/reference/configuration.md#service-node-name). If the APM agent is not configured with an explicit value, this will return `undefined`. + + +## `apm.setFramework(options)` [apm-set-framework] + +Added in: v2.8.0 + +* `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The following options are supported: + + * `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Framework name. + * `version` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Framework version. + * `overwrite` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If set to `false`, the [`frameworkName`](/reference/configuration.md#framework-name) and [`frameworkVersion`](/reference/configuration.md#framework-version) provided as [config options](/reference/configuration.md) will not be overwritten. **Default:** `true`. + + +Set or change the [`frameworkName`](/reference/configuration.md#framework-name) or [`frameworkVersion`](/reference/configuration.md#framework-version) after the agent has started. These config options can also be provided as part of the [regular agent configuration](/reference/configuration.md). + + +## `apm.addFilter(fn)` [apm-add-filter] + +Added in: v0.1.0 + +Use `addFilter()` to supply a filter function. + +Each filter function will be called just before data is being sent to the APM Server. This will allow you to manipulate the data being sent, for instance to remove sensitive information like passwords etc. (Note: Filters added via `addFilter` are **not** applied to the "metadata" object sent to the APM Server — use `addMetadataFilter` instead.) + +Each filter function will be called in the order they were added, and will receive a `payload` object as the only argument, containing the data about to be sent to the APM Server. + +The format of the payload depends on the event type being sent. For details about the different formats, see the [events intake API docs](docs-content://solutions/observability/apm/elastic-apm-events-intake-api.md). + +The filter function is synchronous and should return the manipulated payload object. If a filter function doesn’t return any value or returns a falsy value, the remaining filter functions will not be called and the payload **will not** be sent to the APM Server. + +Example usage: + +```js +apm.addFilter(function redactSecretHeader(payload) { + if (payload.context && + payload.context.request && + payload.context.request.headers && + payload.context.request.headers['x-secret']) { + // redact sensitive data + payload.context.request.headers['x-secret'] = '[REDACTED]' + } + + // remember to return the modified payload + return payload +}) +``` + +Though you can also use filter functions to add new contextual information to the `user` and `custom` properties, it’s recommended that you use [`apm.setUserContext()`](#apm-set-user-context) and [`apm.setCustomContext()`](#apm-set-custom-context) for that purpose. + + +## `apm.addErrorFilter(fn)` [apm-add-error-filter] + +Added in: v2.0.0 + +Similar to [`apm.addFilter()`](#apm-add-filter), but the `fn` will only be called with error payloads. + + +## `apm.addTransactionFilter(fn)` [apm-add-transaction-filter] + +Added in: v2.0.0 + +Similar to [`apm.addFilter()`](#apm-add-filter), but the `fn` will only be called with transaction payloads. + + +## `apm.addSpanFilter(fn)` [apm-add-span-filter] + +Added in: v2.0.0 + +Similar to [`apm.addFilter()`](#apm-add-filter), but the `fn` will only be called with span payloads. + + +## `apm.addMetadataFilter(fn)` [apm-add-metadata-filter] + +Added in: v3.14.0 + +Use `addMetadataFilter(fn)` to supply a filter function for the [metadata object](docs-content://solutions/observability/apm/elastic-apm-events-intake-api.md#apm-api-events-schema-definition) sent to the APM Server. This will allow you to manipulate the data being sent, for instance to remove possibly sensitive information. + +Each filter function will be called in the order they were added, and will receive a `metadata` object as the only argument. The filter function is synchronous and must return the manipulated object. Example usage: + +```js +apm.addMetadataFilter(function dropArgv(metadata) { + if (metadata.process && metadata.process.argv) { + delete metadata.process.argv + } + return metadata +}) +``` + +Warning: It is the responsibility of the author to ensure the returned object conforms to the [metadata schema](docs-content://solutions/observability/apm/elastic-apm-events-intake-api.md#apm-api-events-schema-definition) otherwise all APM data injest will fail. A metadata filter that breaks the metadata will result in error logging from the agent, something like: + +```text +ERROR (elastic-apm-node): APM Server transport error (400): Unexpected APM Server response +APM Server accepted 0 events in the last request +Error: validation error: 'metadata' required + Document: {"metadata":null} +``` + + +## `apm.setUserContext(context)` [apm-set-user-context] + +Added in: v0.1.0 + +* `context` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Accepts the following optional properties: + + * `id` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The user’s ID. + * `username` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The user’s username. + * `email` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The user’s e-mail. + + +Call this to enrich collected performance data and errors with information about the user/client. This function can be called at any point during the request/response life cycle (i.e. while a transaction is active). + +The given `context` will be added to the active transaction. If no active transaction can be found, `false` is returned. Otherwise `true`. + +It’s possible to call this function multiple times within the scope of the same active transaction. For each call, the properties of the `context` argument are shallow merged with the context previously given. + +If an error is captured, the context from the active transaction is used as context for the captured error, and any custom context given as the 2nd argument to [`apm.captureError`](#apm-capture-error) takes precedence and is shallow merged on top. + +The provided user context is stored under `context.user` in Elasticsearch on both errors and transactions. + + +## `apm.setCustomContext(context)` [apm-set-custom-context] + +Added in: v0.1.0 + +* `context` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Can contain any property that can be JSON encoded. + +Call this to enrich collected errors and transactions with any information that you think will help you debug performance issues or errors. This function can be called at any point while a transaction is active (e.g. during the request/response life cycle of an incoming HTTP request). + +The provided custom context is stored under `context.custom` in APM Server pre-7.0, or `transaction.custom` and `error.custom` in APM Server 7.0+. + +The given `context` will be added to the active transaction. If no active transaction can be found, `false` is returned. Otherwise `true`. + +It’s possible to call this function multiple times within the scope of the same active transaction. For each call, the properties of the `context` argument are shallow merged with the context previously given. + +If an error is captured, the context from the active transaction is used as context for the captured error, and any custom context given as the 2nd argument to [`apm.captureError`](#apm-capture-error) takes precedence and is shallow merged on top. + +::::{tip} +Before using custom context, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + + +## `apm.setLabel(name, value[, stringify = true])` [apm-set-label] + +Added in: v0.1.0
Renamed from `apm.setTag()` to `apm.setLabel()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch +* `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +apm.setLabel('productId', 42, false); +``` + +Set a label on the current transaction. You can set multiple labels on the same transaction. If an error happens during the current transaction, it will also get tagged with the same label. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `apm.addLabels({ [name]: value }[, stringify = true])` [apm-add-labels] + +Added in: v1.5.0
Renamed from `apm.addTags()` to `apm.addLabels()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `labels` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Contains key/value pairs: + + * `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch + * `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. + +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +apm.addLabels({productId: 42, productName: 'butter'}, false); +``` + +Add several labels on the current transaction. You can add labels multiple times. If an error happens during the current transaction, it will also get tagged with the same labels. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `apm.setGlobalLabel(name, value)` [apm-set-global-label] + +Added in: v3.47.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) +* `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) + +Extends the [`globalLabels`](/reference/configuration.md#global-labels) configuration. It allows setting labels that are applied to all transactions. A potential use case is to specify a label with the state of your application: `'initializing' | 'available' | 'unhealthy'`. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `apm.captureError(error[, options][, callback])` [apm-capture-error] + +Added in: v0.1.0 + +* `error` - Can be either an [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object, a [message string](#message-strings), or a [special parameterized message object](#parameterized-message-object) +* `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The following options are supported: + + * `timestamp` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the error happened. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + * `message` - If the `error` argument is an [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object, it’s possible to use this option to supply an additional message string that will be stored along with the error message under `log.message` + * `user` - See [metadata section](#metadata) for details about this option + * `custom` - See [metadata section](#metadata) for details about this option + * `request` [``](https://nodejs.org/api/http.html#http_class_http_incomingmessage) You can associate an error with information about the incoming request to gain additional context such as the request url, headers, and cookies. However, in most cases, the agent will detect if an error was in response to an http request and automatically add the request details for you. See [http requests section](#http-requests) for more details. + * `response` [``](https://nodejs.org/api/http.html#http_class_http_serverresponse) You can associate an error with information about the http response to get additional details such as status code and headers. However, in most cases, the agent will detect if an error occured during an http request and automatically add response details for you. See [http responses section](#http-responses) for more details. + * `handled` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) Adds additional context to the exception to show whether the error is handled or uncaught. Unhandled errors are immediately flushed to APM server, in case the application is about the crash. **Default:** `true`. + * `labels` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Add additional context with labels, these labels will be added to the error along with the labels from the current transaction. See the [`apm.addLabels()`](#apm-add-labels) method for details about the format. + * `captureAttributes` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) Whether to include properties on the given [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) object in the data sent to the APM Server (as `error.exception.attributes`). **Default:** `true`. + * `skipOutcome` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) Whether to skip setting the outcome value for the current span to `failure`. See [Span outcome](/reference/span-api.md#span-outcome) for more information. **Default:** `false`. + * `parent` [Transaction](/reference/transaction-api.md) | [Span](/reference/span-api.md) | `null` - A Transaction or Span instance to make the parent of this error. If not given (or `undefined`), then the current span or transaction will be used. If `null` is given, then no span or transaction will be used. (Added in v3.33.0.) + +* `callback` - Will be called after the error has been sent to the APM Server. It will receive an `Error` instance if the agent failed to send the error, and the id of the captured error. + +Send an error to the APM Server: + +```js +apm.captureError(new Error('boom!')) +``` + +### Message strings [message-strings] + +Instead of an `Error` object, you can log a plain text message: + +```js +apm.captureError('Something happened!') +``` + +This will also be sent as an error to the APM Server, but will not be associated with an exception. + + +### Parameterized message object [parameterized-message-object] + +Instead of an `Error` object or a string, you can supply a special parameterized message object: + +```js +apm.captureError({ + message: 'Could not find user %s with id %d in the database', + params: ['Peter', 42] +}) +``` + +This makes it possible to better group error messages that contain variable data like ID’s or names. + + +### Metadata [metadata] + +To ease debugging it’s possible to send some extra data with each error you send to the APM Server. The APM Server intake API supports a lot of different metadata fields, most of which are automatically managed by the Elastic APM Node.js Agent. But if you wish you can supply some extra details using `user` or `custom`. For more details on the properties accepted by the events intake API see the [events intake API docs](docs-content://solutions/observability/apm/elastic-apm-events-intake-api.md). + +To supply any of these extra fields, use the optional options argument when calling `apm.captureError()`. + +Here are some examples: + +```js +// Sending some extra details about the user +apm.captureError(error, { + user: { + id: 'unique_id', + username: 'foo', + email: 'foo@example.com' + } +}) + +// Sending some arbitrary details using the `custom` field +apm.captureError(error, { + custom: { + some_important_metric: 'foobar' + } +}) +``` + +To supply per-request metadata to all errors captured in one central location, use [`apm.setUserContext()`](#apm-set-user-context) and [`apm.setCustomContext()`](#apm-set-custom-context). + + +### HTTP requests [http-requests] + +Besides the options described in the [metadata section](#metadata), you can use the `options` argument to associate the error with an HTTP request: + +```js +apm.captureError(err, { + request: req // an instance of http.IncomingMessage +}) +``` + +This will log the URL that was requested, the HTTP headers, cookies and other useful details to help you debug the error. + +In most cases, this isn’t needed, as the agent is pretty smart at figuring out if your Node.js app is an HTTP server and if an error occurred during an incoming request. In which case it will automate this processes for you. + + +### HTTP responses [http-responses] + +Besides the options described in the [metadata section](#metadata), you can use the `options` argument to associate the error with an HTTP response: + +```js +apm.captureError(err, { + response: res // an instance of http.ServerResponse +}) +``` + +This will log the response status code, headers and other useful details to help you debug the error. + +In most cases, this isn’t needed, as the agent is pretty smart at figuring out if your Node.js app is an HTTP server and if an error occurred during an incoming request. In which case it will automate this processes for you. + + + +## `apm.middleware.connect()` [apm-middleware-connect] + +Added in: v0.1.0 + +Returns a middleware function used to collect and send errors to the APM Server. + +```js +const apm = require('elastic-apm-node').start() +const connect = require('connect') + +const app = connect() + +// your regular middleware: +app.use(...) +app.use(...) + +// your main HTTP router +app.use(function (req, res, next) { + throw new Error('Broke!') +}) + +// add Elastic APM in the bottom of the middleware stack +app.use(apm.middleware.connect()) + +app.listen(3000) +``` + +::::{note} +`apm.middleware.connect` *must* be added to the middleware stack *before* any other error handling middleware functions or there’s a chance that the error will never get to the agent. +:::: + + + +## `apm.startTransaction([name][, type][, options])` [apm-start-transaction] + +Added in: v0.1.0
Transaction `subtype` and `action` deprecated in: v3.25.0
Transaction `subtype` and `action` removed in: v4.0.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The name of the transaction. You can always set this later via [`transaction.name`](/reference/transaction-api.md#transaction-name) or [`apm.setTransactionName()`](#apm-set-transaction-name). **Default:** `unnamed` +* `type` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The type of the transaction. You can always set this later via [`transaction.type`](/reference/transaction-api.md#transaction-type). +* `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The following options are supported: + + * `startTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the transaction started. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + * `childOf` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) A W3C trace-context "traceparent" string, typically received from a remote service call. + * `tracestate` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) A W3C trace-context "tracestate" string. + * `links` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) Span links. A transaction can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `links` argument is an array of objects with a single "context" field that is a `Transaction`, `Span`, or W3C trace-context *traceparent* string. For example: `apm.startTransaction('aName', { links: [{ context: anotherSpan }] })`. + + +Start a new custom/manual transaction. See the [Transaction API](/reference/transaction-api.md) docs for details on how to use custom transactions. + +Note that the APM agent will automatically start a transaction for incoming HTTP requests. You only need to use this function to create custom transactions, for example for a periodic background routine. There’s a special `type` called `request` which is used by the agent for the transactions automatically created when an incoming HTTP request is detected. + +If the APM agent has not yet been started, then a do-nothing "no-op" transaction object will be returned. + + +## `apm.endTransaction([result][, endTime])` [apm-end-transaction] + +Added in: v0.1.0 + +* `result` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Describes the result of the transaction. This is typically the HTTP status code, or e.g. "success" or "failure" for a background task +* `endTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the transaction ended. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + +Ends the active transaction. If no transaction is currently active, nothing happens. + +Note that the agent will do this for you automatically for all regular HTTP transactions. You only need to use this function to end custom transactions created by [`apm.startTransaction()`](#apm-start-transaction) or if you wish the end a regular transaction prematurely. + +Alternatively you can call [`end()`](/reference/transaction-api.md#transaction-end) directly on an active transaction object. + + +## `apm.currentTransaction` [apm-current-transaction] + +Added in: v1.9.0 + +Get the currently active transaction, if used within the context of a transaction. + +::::{note} +If there’s no active transaction available, `null` will be returned. +:::: + + + +## `apm.currentSpan` [apm-current-span] + +Added in: v2.0.0 + +Get the currently active span, if used within the context of a span. + +::::{note} +If there’s no active span available, `null` will be returned. +:::: + + + +## `apm.currentTraceparent` [apm-current-traceparent] + +Added in: v2.9.0 + +Get the serialized traceparent string of the current transaction or span. + +::::{note} +If there’s no active transaction or span available, `null` will be returned. +:::: + + + +## `apm.setTransactionName(name)` [apm-set-transaction-name] + +Added in: v0.1.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Set or overwrite the name of the current transaction. + +If you use a supported router/framework the agent will automatically set the transaction name for you. + +If you do not use Express, hapi, koa-router, Restify, or Fastify or if the agent for some reason cannot detect the name of the HTTP route, the transaction name will default to `METHOD unknown route` (e.g. `POST unknown route`). + +Read more about naming routes manually in the [Get started with a custom Node.js stack](/reference/custom-stack.md#custom-stack-route-naming) article. + + +## `apm.startSpan([name][, type][, subtype][, action][, options])` [apm-start-span] + +Added in: v1.1.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The name of the span. You can alternatively set this via [`span.name`](/reference/span-api.md#span-name). **Default:** `unnamed` +* `type` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The type of the span. You can alternatively set this via [`span.type`](/reference/span-api.md#span-type). +* `subtype` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The subtype of the span. You can alternatively set this via [`span.subtype`](/reference/span-api.md#span-subtype). +* `action` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The action of the span. You can alternatively set this via [`span.action`](/reference/span-api.md#span-action). +* `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The following options are supported: + + * `startTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the span started. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + * `exitSpan` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) Make an "exit span". Exit spans represent outgoing communication. They are used to create a node in the [Service Map](docs-content://solutions/observability/apm/service-map.md) and a downstream service in the [Dependencies Table](docs-content://solutions/observability/apm/dependencies.md). The provided subtype will be used as the downstream service name. + * `links` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) Span links. A span can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `links` argument is an array of objects with a single "context" field that is a `Transaction`, `Span`, or W3C trace-context *traceparent* string. For example: `apm.startSpan('aName', { links: [{ context: anotherSpan }] })`. + + +Start and return a new custom span associated with the current active transaction. This is the same as getting the current transaction with `apm.currentTransaction` and, if a transaction was found, calling `transaction.startSpan(name, type, options)` on it. + +When a span is started it will measure the time until [`span.end()`](/reference/span-api.md#span-end) is called. + +See [Span API](/reference/span-api.md) docs for details on how to use custom spans. + +::::{note} +If there’s no active transaction available, `null` will be returned. +:::: + + + +## `apm.handleUncaughtExceptions([callback])` [apm-handle-uncaught-exceptions] + +Added in: v0.1.0 + +By default, the agent will terminate the Node.js process when an uncaught exception is detected. Use this function if you need to run any custom code before the process is terminated. + +```js +apm.handleUncaughtExceptions(function (err) { + // Do your own stuff... and then exit: + process.exit(1) +}) +``` + +The callback is called **after** the event has been sent to the APM Server with the following arguments: + +* `err` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error) the captured exception + +This function will also enable the uncaught exception handler if it was disabled using the [`captureExceptions`](/reference/configuration.md#capture-exceptions) configuration option. + +If you don’t specify a callback, the node process is terminated automatically when an uncaught exception has been captured and sent to the APM Server. + +[It is recommended](https://nodejs.org/api/process.md#process_event_uncaughtexception) that you don’t leave the process running after receiving an uncaught exception, so if you are using the optional callback, remember to terminate the node process. + + +## `apm.flush([callback])` [apm-flush] + +Added in: v0.12.0 + +```js +// with node-style callback +apm.flush(function (err) { + // Flush complete +}) + +// with promises +apm.flush().then(function () { + // Flush complete +}).catch(function (err) { + // Flush returned an error +}) + +// inside of an async function +try { + await apm.flush() + // Flush complete +} catch (err) { + // Flush returned an error +} +``` + +Manually end the active outgoing HTTP request to the APM Server. The HTTP request is otherwise ended automatically at regular intervals, controlled by the [`apiRequestTime`](/reference/configuration.md#api-request-time) and [`apiRequestSize`](/reference/configuration.md#api-request-size) config options. + +If an optional `callback` is provided as the first argument to this method, it will call `callback(flushErr)` when complete. If no `callback` is provided, then a `Promise` will be returned, which will either resolve with `void` or reject with `flushErr`. + +The callback is called (or the `Promise` resolves if no `callback` argument is provided) **after** the active HTTP request has ended. The callback is called even if no HTTP request is currently active. + + +## `apm.lambda([type, ]handler)` [apm-lambda] + +Added in: v1.4.0 + +```js +exports.hello = apm.lambda(function (event, context, callback) { + callback(null, `Hello, ${payload.name}!`) +}) +``` + +Manually instrument an AWS Lambda function to form a transaction around each execution. Optionally, a type may also be provided to group lambdas together. By default, "lambda" will be used as the type name. + +Read more lambda support in the [Lambda](/reference/lambda.md) article. + + +## `apm.addPatch(modules, handler)` [apm-add-patch] + +Added in: v2.7.0 + +* `modules` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | `https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type[]` Name of module(s) to apply the patch to, when required. +* `handler` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Must be a patch function or a path to a module exporting a patch function + + * `exports` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The original export object of the module + * `agent` - The agent instance to use in the patch function + * `options` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) The following options are supported: + + * `version` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Glossary/Undefined) The module version, if applicable. + * `enabled` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) A flag indicating if the instrumentation is enabled. Any module patch can be disabled, by module name, with [`disableInstrumentations`](/reference/configuration.md#disable-instrumentations). + + +Register a module patch to apply on intercepted `require` calls. + +A module can have any number of patches and will be applied in the order they are added. + +```js +apm.addPatch('timers', (exports, agent, { version, enabled }) => { + const setTimeout = exports.setTimeout + exports.setTimeout = (fn, ms) => { + const span = agent.startSpan('set-timeout') + return setTimeout(() => { + span.end() + fn() + }, ms) + } + + return exports +}) + +// or ... + +apm.addPatch('timers', './timer-patch') +``` + +This and the other "Patch"-related API methods should be called **before** starting the APM agent. Changes after the agent has started and relevant modules have been `require`d can have surprising caching behavior. + + +## `apm.removePatch(modules, handler)` [apm-remove-patch] + +Added in: v2.7.0 + +Removes a module patch. This will generally only be needed when replacing an existing patch. To *disable* instrumentation while keeping context propagation support, see [`disableInstrumentations`](/reference/configuration.md#disable-instrumentations). + +```js +apm.removePatch('timers', './timers-patch') + +// or ... + +apm.removePatch(['timers'], './timers-patch') + +// or ... + +apm.removePatch('timers', timerPatchFunction) +``` + + +## `apm.clearPatches(modules)` [apm-clear-patches] + +Added in: v2.7.0 + +Clear all patches for the given module. This will generally only be needed when replacing an existing patch. To *disable* instrumentation while keeping context propagation support, see [`disableInstrumentations`](/reference/configuration.md#disable-instrumentations). + +```js +apm.clearPatches('timers') + +// or ... + +apm.clearPatches(['timers']) +``` + + +## `apm.currentTraceIds` [apm-current-trace-ids] + +Added in: v2.17.0 + +`apm.currentTraceIds` produces an object containing `trace.id` and either `transaction.id` or `span.id` when a current transaction or span is available. When no transaction or span is available it will return an empty object. This enables [log correlation](/reference/logs.md#log-correlation-ids) to APM traces with structured loggers. + +```js +{ + "trace.id": "abc123", + "transaction.id": "abc123" +} +// or ... +{ + "trace.id": "abc123", + "span.id": "abc123" +} +``` + + +## `apm.registerMetric(name[, labels], callback)` [apm-register-custom-metrics] + +::::{warning} +This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. +:::: + + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Name of the metrics. +* `labels` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Contains key/value pairs. Optional labels. Omittable. +* `callback` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function) Must be a function that returns the current metric value. + +Register a metric callback. + +Take care not to use the names of [built-in metrics](/reference/metrics.md). + +```js +apm.registerMetric( 'ws.connections' , () => { + return wss.clients.size; +}) + +// or, to additionally label the metric with "module: 'ws'": + +apm.registerMetric( 'ws.connections' , {module : 'ws'}, () => { + return wss.clients.size; +}) +``` + + +## `apm.setTransactionOutcome(outcome)` [apm-transaction-outcome] + +Added in: v3.12.0 + +* `outcome` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) + +Will set the outcome property on the *current* transaction. + +See the [Transaction Outcome docs](/reference/transaction-api.md#transaction-outcome) for more information. + + +## `apm.setSpanOutcome(outcome)` [apm-span-outcome] + +Added in: v3.12.0 + +* `outcome` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) + +Will set the outcome property on the *current* span. + +See the [Span Outcome docs](/reference/span-api.md#span-outcome) for more information. + + diff --git a/docs/reference/api.md b/docs/reference/api.md new file mode 100644 index 0000000000..18aeab55d5 --- /dev/null +++ b/docs/reference/api.md @@ -0,0 +1,16 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/api.html +--- + +# API Reference [api] + +The API reference documentation is divided into three parts: + +* [The `Agent` API](/reference/agent-api.md) - All functions and properties on the `Agent` object. An instance of the `Agent` object is acquired by requiring/importing the Node.js APM Agent module. The `Agent` is a singleton and the instance is usually referred to by the variable `apm` in this documentation +* [The `Transaction` API](/reference/transaction-api.md) - All functions and properties on the `Transaction` object. An instance of the `Transaction` object is acquired by calling `apm.startTransaction()` +* [The `Span` API](/reference/span-api.md) - All functions and properties on the `Span` object. An instance of the `Span` object is acquired by calling `apm.startSpan()` + + + + diff --git a/docs/reference/azure-functions.md b/docs/reference/azure-functions.md new file mode 100644 index 0000000000..7cfcef33ac --- /dev/null +++ b/docs/reference/azure-functions.md @@ -0,0 +1,115 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/azure-functions.html +--- + +# Monitoring Node.js Azure Functions [azure-functions] + +The Node.js APM Agent can trace function invocations in an [Azure Functions](https://learn.microsoft.com/en-us/azure/azure-functions/) app, using either v3 or [v4 of the Node.js programming model](https://learn.microsoft.com/en-us/azure/azure-functions/functions-node-upgrade-v4). + + +## Prerequisites [azure-functions-prerequisites] + +You need an APM Server to send APM data to. Follow the [APM Quick start](docs-content://solutions/observability/apm/get-started.md) if you have not set one up yet. You will need your **APM server URL** and an APM server **secret token** (or **API key**) for configuring the APM agent below. + +You will also need an Azure Function app to monitor. If you do not have an existing one, you can follow [this Azure guide](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-node#create-supporting-azure-resources-for-your-function) to create one. + +::::{important} +If you use `func init --javascript ...` as suggested in this Azure guide, then it is recommended that you **uninstall** the `azure-functions-core-tools` dependency by running `npm uninstall azure-functions-core-tools` and [install it separately](https://github.com/Azure/azure-functions-core-tools#installing). Having `azure-functions-core-tools` as a "devDependency" in your package.json will result in unreasonably large deployments that will be very slow to publish and will run your Azure Function app VM out of disk space. + +:::: + + +You can also take a look at and use this [Azure Functions example app with Elastic APM already integrated](https://github.com/elastic/apm-agent-nodejs/tree/main/examples/azure-function-app/). + + +## Step 1: Add the APM agent dependency [azure-functions-setup] + +Add the `elastic-apm-node` module as a dependency of your application: + +```bash +npm install elastic-apm-node --save # or 'yarn add elastic-apm-node' +``` + + +## Step 2: Start the APM agent [_step_2_start_the_apm_agent] + +For the APM agent to instrument Azure Functions, it needs to be started when the Azure host starts its Node.js worker processes. The best way to do so is by using an app-level entry point (support for this was added for Node.js Azure Functions [here](https://github.com/Azure/azure-functions-nodejs-worker/issues/537)). + +1. Create a module to start the APM agent. For example, a file at the root of your repository named "initapm.js": + + ```javascript + // initapm.js + require('elastic-apm-node').start({ + // Add configuration options here + }) + ``` + + Optional [configuration options](/reference/configuration.md) can be added on start. + +2. Change the "main" entry in your "package.json" to point to the initapm.js file. + + ```json + ... + "main": "{initapm.js,src/functions/*.js}", + ... + ``` + + + +## Step 3: Configure the APM agent [_step_3_configure_the_apm_agent] + +The APM agent can be [configured](/reference/configuring-agent.md) with options to the `.start()` method or with environment variables. Using environment variables allows one to use [application settings in the Azure Portal](https://learn.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings?tabs=portal#settings) which allows hiding values and updating settings without needing to re-deploy code. + +Open *Configuration > Application settings* for your Function App in the Azure Portal and set: + +```yaml +ELASTIC_APM_SERVER_URL: +ELASTIC_APM_SECRET_TOKEN: +``` + +For example: + +![Configuring the APM Agent in the Azure Portal](images/azure-functions-configuration.png) + +For local testing via `func start`, you can set these environment variables in your terminal, or in the "local.settings.json" file. See the [agent configuration guide](/reference/configuration.md) for full details on supported configuration variables. + + +## Step 4: (Re-)deploy your Azure Function app [_step_4_re_deploy_your_azure_function_app] + +```bash +func azure functionapp publish +``` + +Now, when you invoke your Azure Functions, you should see your application show up as a Service in the APM app in Kibana and see APM transactions for function invocations. Tracing data is forwarded to APM server after a period of time, so allow a minute or so for data to appear. + + +## Limitations [azure-functions-limitations] + +Distributed tracing for incoming HTTP requests to Azure Functions (using v4 of the programming model) does **not** work, because of a issue with Azure’s handling of trace-context. See [this](https://github.com/elastic/apm-agent-nodejs/pull/4426#issuecomment-2596922653) for details. + +Azure Functions instrumentation currently does *not* collect system metrics in the background because of a concern with unintentionally increasing Azure Functions costs (for Consumption plans). + +Elastic APM’s [central configuration](/reference/configuration.md#central-config) is not supported for Azure Functions. + + +## Filter sensitive information [azure-functions-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Compatibility [azure-functions-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [azure-functions-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md new file mode 100644 index 0000000000..999b63c535 --- /dev/null +++ b/docs/reference/configuration.md @@ -0,0 +1,1137 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/configuration.html +--- + +# Configuration options [configuration] + +The available configuration options and equivalent environment variable names are listed below. + +For more information on setting configuration options, including configuration precedence, see [configuring the agent](/reference/configuring-agent.md). + +::::{tip} +The only required parameter is [`serviceName`](#service-name). However, the agent will use the `name` from `package.json` by default if available. +:::: + + +## `serviceName` [service-name] + +* **Type:** String +* **Default:** `name` field of `package.json`, or "unknown-nodejs-service" +* **Env:** `ELASTIC_APM_SERVICE_NAME` + +The name to identify this service in Elastic APM. Multiple instances of the same service should use the same name. Allowed characters: `a-z`, `A-Z`, `0-9`, `-`, `_`, and space. + +If `serviceName` is not provided, the agent will attempt to use the "name" field from "package.json" — looking up from the current working directory. The name will be normalized to the allowed characters. If the name cannot be inferred from package.json, then a fallback value of "unknown-nodejs-service" is used. + + +## `serviceNodeName` [service-node-name] + +* **Type:** String +* **Env:** `ELASTIC_APM_SERVICE_NODE_NAME` + +A unique name for the service node. This is optional, and if omitted, the APM Server will fall back on `system.container.id` if available, and finally `host.name` if necessary. + +This option allows you to set the node name manually to ensure uniqueness and meaningfulness. + + +## `secretToken` [secret-token] + +* **Type:** String +* **Env:** `ELASTIC_APM_SECRET_TOKEN` + +The secret token optionally expected by the APM Server. + + +## `apiKey` [api-key] + +* **Type:** String +* **Env:** `ELASTIC_APM_API_KEY` + +The API key optionally expected by the APM Server. This is an alternative to `secretToken`. + +This base64-encoded string is used to ensure that only your agents can send data to your APM server. You must have created the API key using the APM server command line tool. Please see the [APM server documentation](docs-content://solutions/observability/apm/api-keys.md) for details on how to do that. + +::::{note} +This feature is fully supported in the APM Server versions >= 7.6. +:::: + + +::::{warning} +The API key is sent as plain-text in every request to the server, so you should secure your communications using HTTPS. Unless you do so, your API key could be observed by an attacker. +:::: + + + +## `serverUrl` [server-url] + +* **Type:** String +* **Default:** `http://127.0.0.1:8200` +* **Env:** `ELASTIC_APM_SERVER_URL` + +The URL to where the APM Server is deployed. + + +## `verifyServerCert` [validate-server-cert] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_VERIFY_SERVER_CERT` + +By default the agent will validate the TLS/SSL certificate of the APM Server if using HTTPS. You can switch this behavior off by setting this option to `false`. + + +## `serverCaCertFile` [server-ca-cert-file] + +* **Type:** String +* **Env:** `ELASTIC_APM_SERVER_CA_CERT_FILE` + +By default the agent will validate the TLS/SSL certificate of the APM Server using the well-known CAs curated by Mozilla, as described in the Node.js docs for [`tls.createSecureContext()`](https://nodejs.org/api/tls.md#tls_tls_createsecurecontext_options). You can set this option to the path of a file containing a CA certificate that will be used instead. + +Specifying this option is required when using self-signed certificates, unless server certificate validation is disabled. + + +## `serviceVersion` [service-version] + +* **Type:** String +* **Default:** `version` field of `package.json` +* **Env:** `ELASTIC_APM_SERVICE_VERSION` + +The version of the app currently running. This could be the version from your `package.json` file, a git commit reference, or any other string that might help you pinpoint a specific version or deployment. + + +## `active` [active] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_ACTIVE` + +A boolean specifying if the agent should be active or not. If active, the agent will instrument incoming HTTP requests and track errors. Normally you would not want to run the agent in your development or testing environments. If you are using the `NODE_ENV` environment variable, you can use this to determine the state: + +```js +var options = { + active: process.env.NODE_ENV === 'production' +} +``` + + +## `environment` [environment] + +* **Type:** String +* **Default:** `process.env.NODE_ENV || 'development'` +* **Env:** `ELASTIC_APM_ENVIRONMENT` + +The environment name is automatically logged along with all errors and transactions. If you want to overwrite this, use this option. + +Environments allow you to easily filter data on a global level in the APM app. It’s important to be consistent when naming environments across agents. See [environment selector](docs-content://solutions/observability/apm/filter-data.md#apm-filter-your-data-service-environment-filter) in the APM app for more information. + +::::{note} +This feature is fully supported in the APM app in Kibana versions >= 7.2. You must use the query bar to filter for a specific environment in versions prior to 7.2. +:::: + + + +## `contextPropagationOnly` [context-propagation-only] + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_CONTEXT_PROPAGATION_ONLY` + +If set to `true`, the agent will reduce its work to the minimum required to support automatic [HTTP trace-context](https://w3c.github.io/trace-context/) propagation (for distributed tracing) and log correlation. The agent will not communicate with APM server (no tracing data is forwarded, no central configuration is retrieved) and will not collect metrics. This setting allows using the APM agent with a service that cannot use APM server. Usage is expected to be rare. + + +## `disableSend` [disable-send] + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_DISABLE_SEND` + +If set to `true`, the agent will work as usual, except that it will not attempt to communicate with APM server. Tracing and metrics data will be dropped and the agent won’t be able to receive central configuration, which means that any other configuration cannot be changed in this state without restarting the service. + +This setting is similar to [`contextPropagationOnly`](#context-propagation-only) in functionality. However, `disableSend` does not attempt to reduce time spent collecting tracing data. A use case for this setting is in CI environments, to test agent functionality without requiring a configured APM server. + + +## `instrument` [instrument] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_INSTRUMENT` + +A boolean specifying if the agent should automatically apply instrumentation to supported modules when they are loaded. + +Note that both `active` and `instrument` needs to be `true` for instrumentation to be running. + + +## `instrumentIncomingHTTPRequests` [instrument-incoming-http-requests] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_INSTRUMENT_INCOMING_HTTP_REQUESTS` + +A boolean specifying if the agent should instrument incoming HTTP requests. + +To configure if outgoing http requests should be instrumented, see [`disableInstrumentations`](#disable-instrumentations). + + +## `centralConfig` [central-config] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_CENTRAL_CONFIG` + +Activate APM Agent Configuration via Kibana. If set to `true`, the client will poll the APM Server regularly for new agent configuration. + +::::{note} +This feature requires APM Server v7.3 or later. More information is available in [APM Agent configuration](docs-content://solutions/observability/apm/apm-agent-central-configuration.md). +:::: + + + +## `contextManager` [context-manager] + +Added in: v3.37.0
The "patch" context manager was removed in: v4.0.0 + +* **Type:** String +* **Env:** `ELASTIC_APM_CONTEXT_MANAGER` + +This configuration option provides a way to override the APM agent’s default technique for tracking Node.js asynchronous tasks; sometimes referred to as "run context", "async context", or just "context". Most users should not need to change this setting. This setting replaces the older `asyncHooks` configuration option. + +To effectively trace an application, the APM agent needs to track the logical thread of control through asynchronous tasks. The preferred mechanism for this is [`AsyncLocalStorage`](https://nodejs.org/api/async_context.md#class-asynclocalstorage), usable in Node.js versions >=14.5 and >=12.19. In older versions of Node, the APM agent will fallback to using [`async_hooks`](https://nodejs.org/api/async_hooks.md), which can have a higher performance overhead, especially in Promise-heavy applications. + +Supported values for `contextManager` are: + +* `"asynclocalstorage"` - Use the `AsyncLocalStorage` mechanism, if able. Otherwise it will fallback to using `async_hooks`. +* `"asynchooks"` - Use the `async_hooks` mechanism. (Using this value will restore the agent behavior from before v3.37.0.) + + +## `transactionIgnoreUrls` [transaction-ignore-urls] + +* **Type:** Array +* **Default:** `[]` +* **Env:** `ELASTIC_APM_TRANSACTION_IGNORE_URLS` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `transaction_ignore_urls` + +Array or comma-separated string used to restrict requests for certain URLs from being instrumented. + +When an incoming HTTP request is detected, its URL pathname will be tested against each string in this list. The `transactionIgnoreUrls` property supports exact string matches, simple wildcard (`*`) matches, and may not include commas. Wildcard matches are case-insensitive by default. You may make wildcard searches case-sensitive by using the `(?-i)` prefix. + +Note that all errors that are captured during a request to an ignored URL are still sent to the APM Server regardless of this setting. + +If you need full regular expression pattern matching, see [`ignoreUrls`](#ignore-urls). + +Example usage: + +```js +require('elastic-apm-node').start({ + transactionIgnoreUrls: [ + '/ping', + '/fetch/*', + '(?-i)/caseSensitiveSearch' + ] +}) +``` + + +## `ignoreUrls` [ignore-urls] + +* **Type:** Array +* **Default:** `undefined` + +Used to restrict requests to certain URLs from being instrumented. + +This property should be set to an array containing one or more strings or `RegExp` objects. When an incoming HTTP request is detected, its URL will be tested against each element in this list. If an element in the array is a `String`, an exact match will be performed. If an element in the array is a `RegExp` object, its test function will be called with the URL being tested. + +Note that all errors that are captured during a request to an ignored URL are still sent to the APM Server regardless of this setting. + +If you’d prefer simple wildcard pattern matching, see [`transactionIgnoreUrls`](#transaction-ignore-urls). + +Example usage: + +```js +require('elastic-apm-node').start({ + ignoreUrls: [ + '/ping', + /^\/admin\//i + ] +}) +``` + + +## `ignoreUserAgents` [ignore-user-agents] + +* **Type:** Array +* **Default:** `undefined` + +Used to restrict requests from certain User-Agents from being instrumented. + +This property should be set to an array containing one or more strings or `RegExp` objects. When an incoming HTTP request is detected, the User-Agent from the request headers will be tested against each element in this list. If an element in the array is a `String`, it’s matched against the beginning of the User-Agent. If an element in the array is a `RegExp` object, its test function will be called with the User-Agent string being tested. + +Note that all errors that are captured during a request by an ignored user agent are still sent to the APM Server regardless of this setting. + +Example usage: + +```js +require('elastic-apm-node').start({ + ignoreUserAgents: [ + 'curl/', + /pingdom/i + ] +}) +``` + + +## `captureBody` [capture-body] + +* **Type:** String +* **Default:** `off` +* **Env:** `ELASTIC_APM_CAPTURE_BODY` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `capture_body` + +The HTTP body of incoming HTTP requests is not recorded and sent to the APM Server by default. + +Possible options are: `off`, `all`, `errors`, and `transactions`. + +* `off` - request bodies will never be reported +* `errors` - request bodies will only be reported with errors +* `transactions` - request bodies will only be reported with request transactions +* `all` - request bodies will be reported with both errors and request transactions + +The recorded body will be truncated if larger than 2 KiB. + +If the body parsing middleware captures the body as raw `Buffer` data, the request body will be represented as the string `""`. + +For the agent to be able to access the body, the body needs to be available as a property on the incoming HTTP [`request`](https://nodejs.org/api/http.md#http_class_http_incomingmessage) object. The agent will look for the body on the following properties: `req.json || req.body || req.payload` + + +## `captureHeaders` [capture-headers] + +* **Type:** Boolean +* **Default:** true +* **Env:** `ELASTIC_APM_CAPTURE_HEADERS` + +The HTTP headers of incoming HTTP requests, and its resulting response headers, are recorded and sent to the APM Server by default. This can be disabled by setting this option to `false`. + + +## `errorOnAbortedRequests` [error-on-aborted-requests] + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_ERROR_ON_ABORTED_REQUESTS` + +A boolean specifying if the agent should monitor for aborted TCP connections with un-ended HTTP requests. An error will be generated and sent to the APM Server if this happens. + + +## `abortedErrorThreshold` [aborted-error-threshold] + +* **Type:** Number +* **Default:** `25s` +* **Env:** `ELASTIC_APM_ABORTED_ERROR_THRESHOLD` + +Specify the threshold for when an aborted TCP connection with an un-ended HTTP request is considered an error. The value is expected to be in seconds, or should include a time suffix. + +If the `errorOnAbortedRequests` property is `false`, this property is ignored. + + +## `transactionSampleRate` [transaction-sample-rate] + +* **Type:** Number +* **Default:** `1.0` +* **Env:** `ELASTIC_APM_TRANSACTION_SAMPLE_RATE` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `transaction_sample_rate` + +Specify the sampling rate to use when deciding whether to trace a request. + +This must be a value between `0.0` and `1.0`, where `1.0` means 100% of requests are traced. The value is rounded to four decimal places of precision (e.g. 0.0001, 0.3333) to ensure consistency and reasonable size when propagating the sampling rate in the `tracestate` header for [distributed tracing](/reference/distributed-tracing.md). + + +## `hostname` [hostname] + +* **Type:** String +* **Default:** OS hostname +* **Env:** `ELASTIC_APM_HOSTNAME` + +The OS hostname is automatically logged along with all errors and transactions. If you want to overwrite this, use this option. + + +## `frameworkName` [framework-name] + +* **Type:** String +* **Env:** `ELASTIC_APM_FRAMEWORK_NAME` + +Set the name of the web framework used by the instrumented service/application. The name will be available as metadata for all errors and transactions sent to the APM Server. This can be useful for debugging and filtering. + +By default, the agent will set the value of this config option if the framework can be detected automatically. + + +## `frameworkVersion` [framework-version] + +* **Type:** String +* **Env:** `ELASTIC_APM_FRAMEWORK_VERSION` + +Set the version of the web framework used by the instrumented service/application. The version will be available as metadata for all errors and transactions sent to the APM Server. This can be useful for debugging and filtering. + +By default, the agent will set the value of this config option if the framework can be detected automatically. + +Example of setting [`frameworkName`](#framework-name) and `frameworkVersion` for a framework named `my-custom-framework`: + +```js +// read the version from the package.json file +var frameworkVersion = require('my-custom-framework/package').version + +require('elastic-apm-node').start({ + frameworkName: 'my-custom-framework', + frameworkVersion: frameworkVersion +}) +``` + + +## `logLevel` [log-level] + +* **Type:** String +* **Default:** `'info'` +* **Env:** `ELASTIC_APM_LOG_LEVEL` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `log_level` + +Set the verbosity level for the agent’s logging. Note that this does not have any influence on the types of errors that are sent to the APM Server. This only controls how chatty the agent is in your logs. Possible levels are: `trace` (the most verbose logging, avoid in production), `debug`, `info`, `warning`, `error`, `critical`, and `off` (disable all logging). + +This config only applies when using the built-in logger. Log levels will not be automatically applied to a custom [`logger`](#logger). + + +## `logger` [logger] + +* **Type:** object +* **Env:** `ELASTIC_APM_LOGGER=false` to *ignore* a custom logger + +By default, the APM agent logs to stdout in [ecs-logging](ecs-logging://reference/intro.md) format. Use the `logger` config to pass in a custom logger object. The custom logger must provide `trace`, `debug`, `info`, `warn`, `error`, and `fatal` methods that take a string message argument. + +A custom logger may result in *structured log data being lost*. As of version 3.13, the agent uses structured logging using the [pino API](https://getpino.io/#/docs/api?id=logger). To avoid issues with incompatible logger APIs, a given custom logger is wrapped in such a way that only the log message is passed through. As a special case, if the provided logger is a *pino logger instance*, then it will be used directly without loss of structured fields. Setting the environment variable `ELASTIC_APM_LOGGER=false` will **ignore** a custom logger. This is provided to assist with [Debug mode](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md#debug-mode) troubleshooting. + +An example using a custom pino logger: + +```js +const pino = require('pino') +require('elastic-apm-node').start({ + logger: pino({ level: 'info' }) +}) +``` + +or using a [Bunyan](https://github.com/trentm/node-bunyan) logger: + +```js +const bunyan = require('bunyan') +require('elastic-apm-node').start({ + logger: bunyan.createLogger({ level: 'info' }) +}) +``` + +To get the [unstructured logging output](https://github.com/watson/console-log-level) similar to agent versions before 3.13, use the following: + +```js +require('elastic-apm-node').start({ + logger: require('console-log-level')() +}) +``` + + +## `captureExceptions` [capture-exceptions] + +As of v4.0.0 a captured exception will always be printed to stderr. + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_CAPTURE_EXCEPTIONS` + +Whether or not the APM agent should monitor for uncaught exceptions ([`uncaughtException`](https://nodejs.org/api/process.md#event-uncaughtexception)) and send them to the APM Server automatically. This also includes unhandled rejections ([`unhandledRejection`](https://nodejs.org/api/process.md#event-unhandledrejection)), when the node process is started with `--unhandled-rejections=throw`, which is the default Node.js behavior since v15 ([reference](https://nodejs.org/api/cli.md#--unhandled-rejectionsmode)). + +When `captureExceptions` is true and an `uncaughtException` event is emitted, the APM agent will: capture error details, send that error (and buffered APM data) to APM server, and `process.exit(1)` ([as `uncaughtException` handlers should](https://nodejs.org/api/process.md#warning-using-uncaughtexception-correctly)). Some things to be aware of: + +* Because the APM agent’s handler will `process.exit(1)`, to use your own `uncaughtException` handler, you must pass your handler to [`apm.handleUncaughtExceptions([callback])`](/reference/agent-api.md#apm-handle-uncaught-exceptions). The APM agent will capture and send the error, and then call your handler. It is then up to your handler to `process.exit(1)`. +* The APM agent’s handler is async, so there is a short period while it is sending error details while the Node.js event loop will still be executing. +* When the exception and stack trace are printed to stderr, the exact format differs from [the Node.js core formatter](https://github.com/nodejs/node/blob/v20.5.0/src/node_errors.cc#L246-L266). +* Using Node.js’s [`process.setUncaughtExceptionCaptureCallback(fn)`](https://nodejs.org/api/process.md#processsetuncaughtexceptioncapturecallbackfn) results in `uncaughtException` not being called, so the APM agent’s capturing will not work. + +Set `captureExceptions: false` to disable this, and get the default Node.js behavior for uncaught exceptions. + + +## `captureErrorLogStackTraces` [capture-error-log-stack-traces] + +* **Type:** String +* **Default:** `messages` +* **Env:** `ELASTIC_APM_CAPTURE_ERROR_LOG_STACK_TRACES` + +Normally only `Error` objects have a stack trace associated with them. This stack trace is stored along with the error message when the error is sent to the APM Server. The stack trace points to the place where the `Error` object was instantiated. + +But sometimes it’s valuable to know, not where the `Error` was instantiated, but where it was detected. For instance, when an error happens deep within a database driver, the location where the error bubbles up to, is sometimes more useful for debugging, than where the error occurred. + +Set this config option to `always` to — besides the error stack trace — also capture a stack trace at the location where [`captureError`](/reference/agent-api.md#apm-capture-error) was called. + +By default, this config option has the value `messages`, which means that a stack trace of the capture location will be recorded only when `captureError` is called with either a [string](/reference/agent-api.md#message-strings) or the [special parameterized message object](/reference/agent-api.md#parameterized-message-object), in which case a normal stack trace isn’t available. + +Set this config option to `never` to never record a capture location stack trace. + +A capture location stack trace is never generated for uncaught exceptions. + + +## `spanStackTraceMinDuration` [span-stack-trace-min-duration] + +Added in: v3.30.0, replaces [`captureSpanStackTraces`](#capture-span-stack-traces) and [`spanFramesMinDuration`](#span-frames-min-duration) + +* **Type:** Duration +* **Default:** `'-1s'` (never capture span stack traces) +* **Env:** `ELASTIC_APM_SPAN_STACK_TRACE_MIN_DURATION` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `span_stack_trace_min_duration` + +Use this option to control if stack traces are never captured for spans (the default), always captured for spans, or only captured for spans that are longer than a given duration. If you choose to enable span stack traces, even if only for slower spans, please read the [possible performance implications](/reference/performance-tuning.md#performance-stack-traces). + +* a negative value, e.g. `'-1ms'` or `-1`, means *never* capture stack traces for spans; +* a zero value, e.g. `'0ms'` or `0`, means *always* capture stack traces for spans, regardless of the span’s duration; and +* any positive value, e.g. `'50ms'`, means to capture stack traces for spans longer than that duration. + +The duration value should be a string of the form `''`. The allowed units are `ms` for milliseconds, `s` for seconds, and `m` for minutes and are case-sensitive. The ** is optional and defaults to *milliseconds*. A Number value of milliseconds may also be provided. For example, `'10ms'` and `10` are 10 milliseconds, `'2s'` is 2 seconds. + +(Note: If you are migrating from the deprecated `spanFramesMinDuration` option, the meaning for negative and zero values has changed *and* the default unit has changed to milliseconds.) + + +## `captureSpanStackTraces` [capture-span-stack-traces] + +Deprecated in: v3.30.0, use [`spanStackTraceMinDuration`](#span-stack-trace-min-duration) + +* **Type:** Boolean +* **Env:** `ELASTIC_APM_CAPTURE_SPAN_STACK_TRACES` + +This option is **deprecated** — use [`spanStackTraceMinDuration`](#span-stack-trace-min-duration) instead. In versions before v3.30.0 this option was `true` by default. As of version v3.30.0 this default has *effectively* changed to false, because the default is `spanStackTraceMinDuration: '-1s'`. + +If `spanStackTraceMinDuration` is specified, then any provided value for this option is ignored. Otherwise, + +* setting `captureSpanStackTraces: false` is equivalent to setting `spanStackTraceMinDuration: '-1s'` (stack traces will never be captured for spans), and +* setting `captureSpanStackTraces: true` will enable capture of stack traces for spans that are longer than [`spanFramesMinDuration`](#span-frames-min-duration), or 10ms if `spanFramesMinDuration` is not specified. + + +## `spanFramesMinDuration` [span-frames-min-duration] + +Deprecated in: v3.30.0, use [`spanStackTraceMinDuration`](#span-stack-trace-min-duration) + +* **Type:** Duration +* **Env:** `ELASTIC_APM_SPAN_FRAMES_MIN_DURATION` + +This option is **deprecated** — use [`spanStackTraceMinDuration`](#span-stack-trace-min-duration) instead. Note that the sense of a *negative* value and a *zero* value has switched in the new option. Also note that the default unit has changed from `s` to `ms` in the new option. + +If `spanStackTraceMinDuration` is specified, then any provided value for this option is ignored. Otherwise, + +* a zero value, e.g. `0ms`, is equivalent to `spanStackTraceMinDuration: '-1s'` (never capture span stack traces); +* a negative value, e.g. `-1ms`, is equivalent to `spanStackTraceMinDuration: 0` (always capture span stack traces); and +* any positive value, e.g. `'50ms'`, is equivalent to setting `spanStackTraceMinDuration` to the same value. + +The duration value should be a string of the form `''`. The allowed units are `ms` for milliseconds, `s` for seconds, and `m` for minutes and are case-sensitive. The ** is optional and defaults to seconds. A Number value of seconds may also be provided. For example, `'10ms'` is 10 milliseconds, `'5'` and `5` (number) are 5 seconds. + + +## `usePathAsTransactionName` [use-path-as-transaction-name] + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_USE_PATH_AS_TRANSACTION_NAME` + +Set this option to `true` to use the URL path as the transaction name if no other route could be determined. If the agent do not support your router, you can set this option to `true` to use specific URL path as the transaction name instead of `GET unknown route`. + + +## `sourceLinesErrorAppFrames` + `sourceLinesErrorLibraryFrames` [source-context-error] + +When an error is captured by the agent, its stack trace is stored in Elasticsearch. + +By default, the agent will also collect a few lines of source code around the lines for each frame in the stack trace. This can make it easier to determine the cause of an error as the source code related to the error is visible directly in Kibana. + +The agent differentiates between so-called in-app frames and library frames. Library frames are frames belonging to Node core and code inside the application’s `node_modules` folder. In-app frames are everything else. + +Use the following two config options to change how many lines of source code to include for the different types of stack frames: + +$$$source-context-error-app-frames$$$ +**`sourceLinesErrorAppFrames`** + +* **Type:** Number +* **Default:** `5` +* **Env:** `ELASTIC_APM_SOURCE_LINES_ERROR_APP_FRAMES` + +The default value `5` means that 5 lines of source code will be collected for in-app error frames. 2 lines above the stack frame line + 2 below + the stack frame line itself. + +Setting this config option to `0` means that no source code will be collected for in-app error frames. + +$$$source-context-error-library-frames$$$ +**`sourceLinesErrorLibraryFrames`** + +* **Type:** Number +* **Default:** `5` +* **Env:** `ELASTIC_APM_SOURCE_LINES_ERROR_LIBRARY_FRAMES` + +The default value `5` means that 5 lines of source code will be collected for error library frames. 2 lines above the stack frame line + 2 below + the stack frame line itself. + +Setting this config option to `0` means that no source code will be collected for error library frames. + + +## `sourceLinesSpanAppFrames` + `sourceLinesSpanLibraryFrames` [source-context-span] + +When a span is recorded by the agent, a stack trace is recorded together with the span, pointing to the location where the span was initiated. This stack trace is stored in Elasticsearch along with the other span data. + +By default, the agent will also collect a few lines of source code around the lines for each frame in the stack trace. This can make it easier to determine why and how the span was initiated as the source code related to the span is visible directly in Kibana. + +The agent differentiates between so-called in-app frames and library frames. Library frames are frames belonging to Node core and code inside the applications `node_modules` folder. In-app frames are everything else. + +Use the following two config options to change how many lines of source code to include for the different types of stack frames: + +$$$source-context-span-app-frames$$$ +**`sourceLinesSpanAppFrames`** + +* **Type:** Number +* **Default:** `0` +* **Env:** `ELASTIC_APM_SOURCE_LINES_SPAN_APP_FRAMES` + +The default value `0` means that no source code will be collected for in-app span frames. + +$$$source-context-span-library-frames$$$ +**`sourceLinesSpanLibraryFrames`** + +* **Type:** Number +* **Default:** `0` +* **Env:** `ELASTIC_APM_SOURCE_LINES_SPAN_LIBRARY_FRAMES` + +The default value `0` means that no source code will be collected for span library frames. + + +## `errorMessageMaxLength` [error-message-max-length] + +Deprecated in: v3.21.0, use [`longFieldMaxLength`](#long-field-max-length) + +* **Type:** String +* **Default:** `longFieldMaxLength`'s value +* **Env:** `ELASTIC_APM_ERROR_MESSAGE_MAX_LENGTH` + +This option is **deprecated** — use [`longFieldMaxLength`](#long-field-max-length) instead. + +The maximum length allowed for error messages. It is expressed in bytes or includes a size suffix such as `2kb`. Size suffixes are case-insensitive and include `b`, `kb`, `mb`, and `gb`. Messages above this length will be truncated before being sent to the APM Server. Note that while the configuration option accepts a number of **bytes**, truncation is based on a number of unicode characters, not bytes. + +Set to `-1` do disable truncation. + +This applies to the following properties: + +* `error.exception.message` +* `error.log.message` + + +## `longFieldMaxLength` [long-field-max-length] + +* **Type:** Integer +* **Default:** 10000 +* **Env:** `ELASTIC_APM_LONG_FIELD_MAX_LENGTH` + +The following transaction, span, and error fields will be truncated at this number of unicode characters before being sent to APM server: + +* `transaction.context.request.body`, `error.context.request.body` +* `transaction.context.message.body`, `span.context.message.body`, `error.context.message.body` +* `span.context.db.statement` +* `error.exception.message`, `error.log.message` - If [`errorMessageMaxLength`](#error-message-max-length) is specified, then that value takes precedence for these error message fields. + +Note that tracing data is limited at the upstream APM server to [`max_event_size`](docs-content://solutions/observability/apm/general-configuration-options.md#apm-max_event_size), which defaults to 300kB. If you configure `longFieldMaxLength` too large, it could result in transactions, spans, or errors that are rejected by APM server. + + +## `stackTraceLimit` [stack-trace-limit] + +* **Type:** Number +* **Default:** `50` +* **Env:** `ELASTIC_APM_STACK_TRACE_LIMIT` + +Setting it to `0` will disable stack trace collection. Any finite integer value will be used as the maximum number of frames to collect. Setting it to `Infinity` means that all frames will be collected. + + +## `transactionMaxSpans` [transaction-max-spans] + +* **Type:** Number +* **Default:** `500` +* **Env:** `ELASTIC_APM_TRANSACTION_MAX_SPANS` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `transaction_max_spans` + +Specify the maximum number of spans to capture within a request transaction before dropping further spans. Setting to `-1` means that spans will never be dropped. + + +## `maxQueueSize` [max-queue-size] + +* **Type:** Number +* **Default:** `1024` +* **Env:** `ELASTIC_APM_MAX_QUEUE_SIZE` + +The maximum size of buffered events. + +Events like transactions, spans, and errors are buffered when the agent can’t keep up with sending them to the APM Server or if the APM server is down. If the queue is full, events are rejected which means you will lose transactions and spans. This guards the application from consuming too much memory and possibly crashing in case the APM server is unavailable for a longer period of time. + +A lower value will decrease the heap overhead of the agent, while a higher value makes it less likely to lose events in case of a temporary spike in throughput. + + +## `apiRequestTime` [api-request-time] + +* **Type:** String +* **Default:** `10s` +* **Env:** `ELASTIC_APM_API_REQUEST_TIME` + +The agent maintains an open HTTP request to the APM Server that is used to transmit the collected transactions, spans, and errors to the server. + +To avoid issues with intermittent proxies and load balancers, the HTTP request is ended and a new one created at regular intervals controlled by this config option. The value is expected to be in seconds, or should include a time suffix. + +::::{note} +The HTTP request is ended before the time threshold is reached if enough bytes are sent over it. Use the [`apiRequestSize`](#api-request-size) config option to control the byte threshold. + +:::: + + + +## `apiRequestSize` [api-request-size] + +* **Type:** String +* **Default:** `768kb` +* **Env:** `ELASTIC_APM_API_REQUEST_SIZE` + +The agent maintains an open HTTP request to the APM Server that is used to transmit the collected transactions, spans, and errors to the server. + +To avoid issues with intermittent proxies and load balancers, the HTTP request is ended and a new one created if its body becomes too large. That limit is controlled by this config option. The value is expected to be in bytes, or include a size suffix such as `1mb`. Size suffixes are case-insensitive and include `b`, `kb`, `mb`, and `gb`. + +::::{note} +The HTTP request is otherwise ended at regular intervals controlled by the [`apiRequestTime`](#api-request-time) config option. + +:::: + + + +## `serverTimeout` [server-timeout] + +* **Type:** String +* **Default:** `30s` +* **Env:** `ELASTIC_APM_SERVER_TIMEOUT` + +Specify a timeout on the socket used for communication between the APM agent and APM Server. If no data is sent or received on the socket for this amount of time, the request will be aborted. It’s not recommended to set a `serverTimeout` lower than the [`apiRequestTime`](#api-request-time) config option. That will likely result in healthy requests being aborted prematurely. + +The value should include a time suffix (*m* for minutes, *s* for seconds, or *ms* for milliseconds), but defaults to seconds if no suffix is given. + + +## `apmClientHeaders` [apm-client-headers] + +Added in: v4.3.0 + +* **Type:** Object +* **Env:** `ELASTIC_APM_APM_CLIENT_HEADERS` + +Specify custom headers to be included in HTTP requests by the APM agent to APM Server. Generally this should not be required for normal usage. + +Examples: + +```bash +ELASTIC_APM_APM_CLIENT_HEADERS="foo=bar,spam=eggs" +``` + +```js +require('elastic-apm-node').start({ + apmClientHeaders: { foo: 'bar', spam: 'eggs' }, + // ... +}) +``` + + +## `sanitizeFieldNames` [sanitize-field-names] + +* **Type:** Array +* **Default:** `['password', 'passwd', 'pwd', 'secret', '*key', '*token*', '*session*', '*credit*', '*card*', '*auth*', 'set-cookie', '*principal*', 'pw', 'pass', 'connect.sid']` +* **Env:** `ELASTIC_APM_SANITIZE_FIELD_NAMES` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `sanitize_field_names` + +Remove sensitive data sent to Elastic APM. + +The `sanitizeFieldNames` configuration value allows you to configure a list of wildcard patterns of field names which should be redacted from agent payloads. Wildcard matches are case-insensitive by default. You may make wildcard searches case-sensitive by using the `(?-i)` prefix. These patterns apply to the request and response HTTP headers, HTTP request cookies, and also any form field captured during an `application/x-www-form-urlencoded` data request. + +The `sanitizeFieldNames` will redact any matched *field names*. If you wish to filter or *redact* other data the [API filtering functions](/reference/agent-api.md#apm-add-filter) may be a better choice. + + +## `disableInstrumentations` [disable-instrumentations] + +* **Type:** Array of strings +* **Env:** `ELASTIC_APM_DISABLE_INSTRUMENTATIONS` + +Array or comma-separated string of module names for which to disable instrumentation. When instrumentation is disabled for a module, no spans will be collected for that module. + +Example using options object: + +```js +require('elastic-apm-node').start({ + disableInstrumentations: ['graphql', 'redis'] +}) +``` + +Example using environment variable: + +```bash +ELASTIC_APM_DISABLE_INSTRUMENTATIONS=graphql,redis +``` + +For an always up-to-date list of modules for which instrumentation can be disabled, see the [lib/instrumentation/modules](https://github.com/elastic/apm-agent-nodejs/tree/main/lib/instrumentation/modules) folder in the agent repository. Note that not all modules represented in this directory will generate spans, and adding those to this array has no effect. + +To configure if incoming http requests should be instrumented, see [`instrumentIncomingHTTPRequests`](#instrument-incoming-http-requests). + + +## `containerId` [container-id] + +* **Type:** String +* **Env:** `ELASTIC_APM_CONTAINER_ID` + +Specify the docker container id to associate with all reported events. If absent, it will be parsed out of the `/proc/self/cgroup` file. + + +## `kubernetesNodeName` [kubernetes-node-name] + +* **Type:** String +* **Env:** `KUBERNETES_NODE_NAME` + +Specify the kubernetes node name to associate with all reported events. + + +## `kubernetesNamespace` [kubernetes-namespace] + +* **Type:** String +* **Env:** `KUBERNETES_NAMESPACE` + +Specify the kubernetes namespace to associate with all reported events. + + +## `kubernetesPodName` [kubernetes-pod-name] + +* **Type:** String +* **Env:** `KUBERNETES_POD_NAME` + +Specify the kubernetes pod name to associate with all reported events. If absent, and if `kubernetesPodUID` is parsed out of the `/proc/self/cgroup` file, this will default to the local hostname. + + +## `kubernetesPodUID` [kubernetes-pod-uid] + +* **Type:** String +* **Env:** `KUBERNETES_POD_UID` + +Specify the kubernetes pod uid to associate with all reported events. If absent, it will be parsed out of the `/proc/self/cgroup` file. + + +## `metricsInterval` [metrics-interval] + +* **Type:** String +* **Default:** `"30s"` +* **Env:** `ELASTIC_APM_METRICS_INTERVAL` + +Specify the interval for reporting metrics to APM Server. The interval should be in seconds, or should include a time suffix. + +To disable all metrics reporting, including breakdown metrics, set the interval to `"0s"`. + + +## `metricsLimit` [metrics-limit] + +* **Type:** Number +* **Default:** `1000` +* **Env:** `ELASTIC_APM_METRICS_LIMIT` + +Specify the maximum number of metrics to track at any given time. When a new metric is inserted which would exceed the limit, the oldest metric will be dropped to give it space. + + +## `globalLabels` [global-labels] + +* **Type:** Object +* **Env:** `ELASTIC_APM_GLOBAL_LABELS` + +Supply a key/value pair object of labels to apply to any data recorded by the agent. + +Example: + +```bash +ELASTIC_APM_GLOBAL_LABELS="subspace=sap-hana,rack=number6" +``` + + +## `configFile` [config-file] + +* **Type:** String +* **Default:** `elastic-apm-node.js` +* **Env:** `ELASTIC_APM_CONFIG_FILE` + +The Node.js agent will look for a file named `elastic-apm-node.js` in the current working directory. You can specify a custom path using this config option (this path must include the filename), e.g: + +```bash +ELASTIC_APM_CONFIG_FILE=/path/to/my-elastic-apm-node.js +``` + +::::{note} +The inline version of this config option, that is passed to the [`start`](/reference/agent-api.md#apm-start) function, will be ignored if a config file was already loaded when this module was required (based on either the default value or because of the `ELASTIC_APM_CONFIG_FILE` environment variable). +:::: + + +The configuration file is expected to export an object, following the same conventions as the `options` object, given as the first argument to the [`start`](/reference/agent-api.md#apm-start) function, e.g.: + +```js +module.exports = { + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '' +} +``` + + +## `breakdownMetrics` [breakdown-metrics] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_BREAKDOWN_METRICS` + +Set `breakdownMetrics: false` to disable reporting of breakdown metrics. Note that if `metricsInterval: 0`, then breakdown metrics will not be reported. + +Breakdown metrics ([`span.self_time.*`](/reference/metrics.md#metrics-span.self_time.sum)) record the self-time spent in each unique type of span. This data drives the [Time spent by span type](docs-content://solutions/observability/apm/service-overview.md#service-span-duration) chart in the APM app. + + +## `disableMetrics` [disable-metrics] + +Added in: v3.45.0 + +* **Type:** Array +* **Env:** `ELASTIC_APM_DISABLE_METRICS` + +The `disableMetrics` configuration variable is a list of wildcard patterns of metric names to **not** send to APM server. The filter is applied to [core APM agent metrics](/reference/metrics.md), custom metrics defined by [`apm.registerMetric(name[, labels], callback)`](/reference/agent-api.md#apm-register-custom-metrics), and metrics defined [using the OpenTelemetry Metrics API](/reference/opentelemetry-bridge.md#otel-metrics-api). + +For example, setting the `ELASTIC_APM_DISABLE_METRICS="nodejs.*,my_counter"` environment variable (or the equivalent `disableMetrics: ['nodejs.*', 'my_counter']` option to [`apm.start([options])`](/reference/agent-api.md#apm-start)) will result in reported metrics excluding any metric named `my_counter` and any starting with `nodejs.`. Wildcard matches are case-insensitive by default. You may make wildcard searches case-sensitive by using the `(?-i)` prefix. + +Use `metricsInterval: '0s'` to completely disable metrics collection. See [`metricsInterval`](#metrics-interval). + + +## `customMetricsHistogramBoundaries` [custom-metrics-histogram-boundaries] + +Added in: v3.45.0 as experimental + +* **Type:** number[] +* **Default:** (See below.) +* **Env:** `ELASTIC_APM_CUSTOM_METRICS_HISTOGRAM_BOUNDARIES` + +Defines the default bucket boundaries to use for OpenTelemetry Metrics histograms. By default the value is: + +```js +[ + 0.00390625, 0.00552427, 0.0078125, 0.0110485, + 0.015625, 0.0220971, 0.03125, 0.0441942, + 0.0625, 0.0883883, 0.125, 0.176777, + 0.25, 0.353553, 0.5, 0.707107, + 1, 1.41421, 2, 2.82843, + 4, 5.65685, 8, 11.3137, + 16, 22.6274, 32, 45.2548, + 64, 90.5097, 128, 181.019, + 256, 362.039, 512, 724.077, + 1024, 1448.15, 2048, 2896.31, + 4096, 5792.62, 8192, 11585.2, + 16384, 23170.5, 32768, 46341, + 65536, 92681.9, 131072 +] +``` + +This differs from the [OpenTelemetry default histogram boundaries](https://opentelemetry.io/docs/reference/specification/metrics/sdk/#explicit-bucket-histogram-aggregation). To use the OpenTelemetry default boundaries, configure the APM agent with: + +```js +apm.start({ + customMetricsHistogramBoundaries: [ 0, 5, 10, 25, 50, 75, 100, 250, 500, 750, 1000, 2500, 5000, 7500, 10000 ], + // ... +}) +``` + +or + +```bash +export ELASTIC_APM_CUSTOM_METRICS_HISTOGRAM_BOUNDARIES=0,5,10,25,50,75,100,250,500,750,1000,2500,5000,7500,10000 +``` + +To customize the boundaries for specific histogram metrics, use an OpenTelemetry Metrics SDK [`View`](https://opentelemetry.io/docs/reference/specification/metrics/sdk/#view). See [this script](https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/use-otel-metrics-sdk.js) for an example. + +See [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) for a general guide on using OpenTelemetry with this APM agent. + + +## `cloudProvider` [cloud-provider] + +* **Type:** String +* **Default:** `auto` +* **Env:** `ELASTIC_APM_CLOUD_PROVIDER` + +During startup the Node.js agent queries the local environment to determine whether the application is running in a cloud environment, and provides the agent with details about that environment. These details are called metadata, and will be sent to APM Server with other instrumented data. The `cloudProvider` configuration value allows you to control this behavior. + +* `auto`: Automatically determine which cloud provider the agent is running on. +* `gcp`: Only query for Google Cloud Platform information. +* `aws`: Only query for Amazon Web Service information. +* `azure`: Only query for Azure information. +* `none`: Do not query for any cloud provider information. + +If the value is not one of the five listed above, the agent will use the value of `auto`. + + +## `ignoreMessageQueues` [ignore-message-queues] + +* **Type:** Array +* **Default:** `[]` +* **Env:** `ELASTIC_APM_IGNORE_MESSAGE_QUEUES` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `ignore_message_queues` + +Array or comma-separated string of wildcard patterns that tell the agent to ignore certain queues/topics when instrumenting messaging systems. + +When an instrumented messaging system sends or receives a message, the agent will test the queue/topic name against each wildcard in this list. If the name matches, the agent will skip instrumenting the operation. + +The `ignoreMessageQueues` property supports simple wildcard (`*`) patterns, and may not include commas. Wildcard matches are case-insensitive by default. You may make wildcard searches case-sensitive by using the `(?-i)` prefix. + +Example usage: + +```js +require('elastic-apm-node').start({ + ignoreMessageQueues: [ + 'overnight_jobs', + 'events_*', + '(?-i)caseSensitiveSearch' + ] +}) +``` + + +## `traceContinuationStrategy` [trace-continuation-strategy] + +Added in: v3.34.0 + +* **Type:** String +* **Default:** `'continue'` +* **Env:** `ELASTIC_APM_TRACE_CONTINUATION_STRATEGY` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `trace_continuation_strategy` + +This option allows some control on how the APM agent handles W3C trace-context headers on incoming requests. By default, the `traceparent` and `tracestate` headers are used per W3C spec for distributed tracing. However, in certain cases it can be helpful to **not** use the incoming `traceparent` header. Some example use cases: + +* An Elastic-monitored service is receiving requests with `traceparent` headers from **unmonitored** services. +* An Elastic-monitored service is publicly exposed, and does not want tracing data (trace-ids, sampling decisions) to possibly be spoofed by user requests. + +Valid values are: + +* `'continue'` - The default behavior. An incoming `traceparent` value is used to continue the trace and determine the sampling decision. +* `'restart'` - Always ignores the `traceparent` header of incoming requests. A new trace-id will be generated and the sampling decision will be made based on [`transactionSampleRate`](#transaction-sample-rate). A **span link** will be made to the incoming traceparent. +* `'restart_external'` - If an incoming request includes the `es` vendor flag in `tracestate`, then any *traceparent* will be considered internal and will be handled as described for *continue* above. Otherwise, any *traceparent* is considered external and will be handled as described for *restart* above. + +Starting with Elastic Observability 8.2, span links will be visible in trace views. + + +## `spanCompressionEnabled` [span-compression-enabled] + +* **Type:** Boolean +* **Default:** `true` +* **Env:** `ELASTIC_APM_SPAN_COMPRESSION_ENABLED` + +Setting this option to false will disable the [Span compression](docs-content://solutions/observability/apm/spans.md) feature. Span compression reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that some information, such as DB statements of all the compressed spans, will not be collected. + +Example usage: + +```js +require('elastic-apm-node').start({ + spanCompressionEnabled: true +}) +``` + + +## `spanCompressionExactMatchMaxDuration` [span-compression-exact-match-max-duration] + +* **Type:** String +* **Default:** `50ms` +* **Env:** `ELASTIC_APM_SPAN_COMPRESSION_EXACT_MATCH_MAX_DURATION` + +Consecutive spans that are exact match and that are under this threshold will be compressed into a single composite span. This option does not apply to composite spans. This reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that the DB statements of all the compressed spans will not be collected. + +Supports the duration suffixes ms (milliseconds), s (seconds) and m (minutes). + +Example usage: + +```js +require('elastic-apm-node').start({ + spanCompressionExactMatchMaxDuration:'100ms' +}) +``` + + +## `spanCompressionSameKindMaxDuration` [span-compression-same-kind-max-duration] + +* **Type:** String +* **Default:** `0ms` +* **Env:** `ELASTIC_APM_SPAN_COMPRESSION_SAME_KIND_MAX_DURATION` + +Consecutive spans to the same destination that are under this threshold will be compressed into a single composite span. This option does not apply to composite spans. This reduces the collection, processing, and storage overhead, and removes clutter from the UI. The tradeoff is that the DB statements of all the compressed spans will not be collected. + +Example usage: + +```js +require('elastic-apm-node').start({ + spanCompressionSameKindMaxDuration:'0ms' +}) +``` + + +## `opentelemetryBridgeEnabled` [opentelemetry-bridge-enabled] + +Added in: v3.34.0 as experimental + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_OPENTELEMETRY_BRIDGE_ENABLED` + +Setting this option to true will enable the [OpenTelemetry Bridge](/reference/opentelemetry-bridge.md). Briefly, the OpenTelemetry Bridge allows one to use the vendor-neutral [OpenTelemetry Tracing API](https://opentelemetry.io/docs/instrumentation/js/api/) ([`@opentelemetry/api`](https://www.npmjs.com/package/@opentelemetry/api)) to manually instrument your code, and have the Elastic Node.js APM agent handle those API calls. + +Example usage: + +```js +require('elastic-apm-node').start({ + opentelemetryBridgeEnabled: true +}) +``` + + +## `exitSpanMinDuration` [exit-span-min-duration] + +* **Type:** String +* **Default:** `0ms` +* **Env:** `ELASTIC_APM_EXIT_SPAN_MIN_DURATION` +* [![dynamic config](images/dynamic-config.svg "") ](/reference/configuring-agent.md#dynamic-configuration) **Central config name:** `exit_span_min_duration` + +Sets the minimum duration of exit spans. If an exit span’s duration is less than this threshold the agent will attempt to drop the span and not send it. + +In some cases exit spans will not be discarded. Spans that propagate the trace context to downstream services, such as outgoing HTTP requests, will not be discarded. However, external calls that don’t propagate context, such as calls to a database, can be discarded using this threshold. + +Additionally, spans that lead to an error will not be discarded. + +Example usage: + +```js +require('elastic-apm-node').start({ + exitSpanMinDuration: '10ms' +}) +``` + + +## `elasticsearchCaptureBodyUrls` [elasticsearch-capture-body-urls] + +* **Type:** Array of wildcard patterns +* **Default:** `['*/_search', '*/_search/template', '*/_msearch', '*/_msearch/template', '*/_async_search', '*/_count', '*/_sql', '*/_eql/search' ]` +* **Env:** `ELASTIC_APM_ELASTICSEARCH_CAPTURE_BODY_URLS` + +The URL path patterns for which the APM agent will capture the request body of outgoing requests to Elasticsearch made with the `@elastic/elasticsearch` module (or the legacy `elasticsearch` module). The default setting captures the body for [Elasticsearch REST APIs](elasticsearch://reference/elasticsearch/rest-apis/index.md) making a search. + +The captured request body (if any) is stored on the `span.db.statement` field. Captured request bodies are truncated to a maximum length defined by [`longFieldMaxLength`](#long-field-max-length). + + +## `useElasticTraceparentHeader` [use-elastic-traceparent-header] + +Change default in v4.0.0, in v3.x the default was `true` + +* **Type:** Boolean +* **Default:** `false` +* **Env:** `ELASTIC_APM_USE_ELASTIC_TRACEPARENT_HEADER` + +To enable [distributed tracing](docs-content://solutions/observability/apm/traces.md), the agent adds trace context headers to outgoing requests (like HTTP requests, etc.). These headers (`traceparent` and `tracestate`) are defined in the [W3C Trace Context](https://www.w3.org/TR/trace-context-1/) specification. + +When this setting is `true`, the agent will also add the header `elastic-apm-traceparent` for backwards compatibility with older versions of Elastic APM agents. (In the next major version of this APM agent, this setting will default to false.) diff --git a/docs/reference/configuring-agent.md b/docs/reference/configuring-agent.md new file mode 100644 index 0000000000..0dd7494f76 --- /dev/null +++ b/docs/reference/configuring-agent.md @@ -0,0 +1,62 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/configuring-the-agent.html +--- + +# Configuring the agent [configuring-the-agent] + +There are multiple ways to configure the Node.js agent. In order of precedence: + +1. APM Agent Central Configuration via Kibana. (supported options are marked with [![dynamic config](images/dynamic-config.svg "") ](#dynamic-configuration)) +2. Environment variables. +3. If calling the `apm.start()` function, supply a [configurations object](#agent-configuration-object) as the first argument. +4. Via the [agent configuration file](#agent-configuration-file). + +For information on the available configuration properties and the expected names of environment variables, see the [Configuration options](/reference/configuration.md) documentation. + + +## Dynamic configuration [dynamic-configuration] + +Configuration options marked with the ![dynamic config](images/dynamic-config.svg "") badge can be changed at runtime when set from a supported source. + +The Node.js Agent supports [Central configuration](docs-content://solutions/observability/apm/apm-agent-central-configuration.md), which allows you to fine-tune certain configurations via the APM app in Kibana. This feature is enabled in the Agent by default, with [`centralConfig`](/reference/configuration.md#central-config). + + +## Agent configuration object [agent-configuration-object] + +To use the optional `options` argument, pass it into the `apm.start()` method: + +```js +var apm = require('elastic-apm-node').start({ + // add configuration options here +}) +``` + +This example shows how to configure the agent to only be active in production: + +```js +// Add this to the VERY top of the first file loaded in your app +require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', + + // Only activate the agent if it's running in production + active: process.env.NODE_ENV === 'production' +}) +``` + + +## Agent configuration file [agent-configuration-file] + +The Node.js agent looks for a file named `elastic-apm-node.js` in the current working directory. You can specify a custom path for this file with the [`configFile`](/reference/configuration.md#config-file) configuration option. + diff --git a/docs/custom-spans.asciidoc b/docs/reference/custom-spans.md similarity index 73% rename from docs/custom-spans.asciidoc rename to docs/reference/custom-spans.md index 4fdc4f4491..2417688c44 100644 --- a/docs/custom-spans.asciidoc +++ b/docs/reference/custom-spans.md @@ -1,26 +1,20 @@ -[[custom-spans]] +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-spans.html +--- -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-spans.html[elastic.co] -endif::[] +# Custom spans [custom-spans] -=== Custom spans +This is an example of how to use custom spans. For general information about the Elastic APM Node.js Span API, see the [Span API documentation](/reference/span-api.md). -This is an example of how to use custom spans. -For general information about the Elastic APM Node.js Span API, -see the <>. - -If you want to track and time a custom event that happens in your application during a transaction, -you can add a new span to an existing transaction. +If you want to track and time a custom event that happens in your application during a transaction, you can add a new span to an existing transaction. In the example below, we create an Express app that times how long it takes to: 1. Receive the body of an HTTP POST or PUT request 2. Parse JSON sent by the client -[source,js] ----- +```js var apm = require('elastic-apm-node').start() var app = require('express')() @@ -72,4 +66,5 @@ app.use(function (req, res, next) { // ...your route handler goes here... app.listen(3000) ----- +``` + diff --git a/docs/reference/custom-stack.md b/docs/reference/custom-stack.md new file mode 100644 index 0000000000..c5e1a3a3f4 --- /dev/null +++ b/docs/reference/custom-stack.md @@ -0,0 +1,217 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-stack.html +--- + +# Get started with a custom Node.js stack [custom-stack] + +Getting Elastic APM set up for your custom Node.js app is easy, and there are various ways you can tweak it to fit your needs. Follow the guide below to get started, and for more advanced topics, check out the [API Reference](/reference/api.md). + +If you are using Express, hapi, Koa, Restify, Fastify, or AWS Lambda, we recommend that you read these articles instead: + +* [Monitoring AWS Lambda Node.js Functions](/reference/lambda.md) +* [Monitoring Node.js Azure Functions](/reference/azure-functions.md) +* [Get started with Express](/reference/express.md) +* [Get started with Fastify](/reference/fastify.md) +* [Get started with hapi](/reference/hapi.md) +* [Get started with Koa](/reference/koa.md) +* [Get started with Next.js](/reference/nextjs.md) +* [Get started with Restify](/reference/restify.md) +* [Get started with TypeScript](/reference/typescript.md) + + +## Installation [custom-stack-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [custom-stack-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `http` and before your router etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple example of how Elastic APM is normally required and started: + +```js +// Add this to the VERY top of the first file loaded in your app +var apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) +``` + +The agent will now monitor the performance of your application and record any uncaught exceptions. + + +### Advanced configuration [custom-stack-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [custom-stack-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [custom-stack-performance-monitoring] + +Elastic APM automatically measures the performance of your custom Node.js application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your custom Node.js app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Route naming [custom-stack-route-naming] + +The Node.js agent tracks incoming HTTP requests to your application in what are called "transactions". All transactions with the same name are grouped together automatically. + +In a normal web application, you want to name transactions based on the route that matches the incoming HTTP request. So say you have a route to display posts on a blog identified by `GET /posts/{{id}}`. You want requests `GET /posts/12`, `GET /posts/42` etc to be grouped together under a transaction named `GET /posts/{{id}}`. + +If you are using Express, hapi, koa-router, Restify, or Fastify this naming happens automatically based on the names of your routes. If you use another framework or a custom router you will see that the transactions are simply grouped together in a few big chunks named "unknown route". In that case, you will need to help us out a little by supplying a name for each transaction. You can do that by calling [`apm.setTransactionName()`](/reference/agent-api.md#apm-set-transaction-name) at any time during the request with the name of the transaction as the first argument. + +Excerpt of an application using the [patterns](https://github.com/watson/patterns) module for route handling: + +```js +var apm = require('elastic-apm-node').start() +var http = require('http') +var patterns = require('patterns')() + +// Setup routes and their respective route handlers +patterns.add('GET /', require('./routes/index')) +patterns.add('GET /posts', require('./routes/posts').index) +patterns.add('GET /posts/{id}', require('./routes/posts').show) + +http.createServer(function (req, res) { + // Check if we have a route matching the incoming request + var match = patterns.match(req.method + ' ' + req.url); + + // If no match is found, respond with a 404. Elastic APM will in + // this case use the default transaction name "unknown route" + if (!match) { + res.writeHead(404) + res.end() + return + } + + // The patterns module exposes the pattern used to match the + // request on the `pattern` property, e.g. `GET /posts/{id}` + apm.setTransactionName(match.pattern) + + // Populate the params and call the matching route handler + var fn = match.value + req.params = match.params + fn(req, res) +}).listen(3000) +``` + + +### Unknown routes [custom-stack-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your custom Node.js app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [custom-stack-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +### Middleware error handler [custom-stack-middleware-error-handler] + +If you use the [connect](https://www.npmjs.com/package/connect) module and an error is either thrown synchronously inside one of the middleware functions or is passed as the first argument to the middleware `next()` function, it will be passed to the [Connect error handler](https://www.npmjs.com/package/connect#error-middleware). + +It’s recommended that you register the agent as a Connect error handler. In the case where you have multiple Connect error handlers, the agent error handler should be the first in the chain to ensure that it will receive the error correctly. + +```js +var apm = require('elastic-apm-node').start() +var connect = require('connect') + +var app = connect() + +// Your regular middleware and router... +app.use(...) +app.use(...) +app.use(...) + +// Add the Elastic APM middleware after your regular middleware +app.use(apm.middleware.connect()) + +// ...but before any other error handler +app.use(function (err, req, res, next) { + // Custom error handling goes here +}) +``` + + +## Filter sensitive information [custom-stack-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [custom-stack-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [custom-stack-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [custom-stack-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/custom-transactions.asciidoc b/docs/reference/custom-transactions.md similarity index 63% rename from docs/custom-transactions.asciidoc rename to docs/reference/custom-transactions.md index b5aba01a34..bf3a5c0362 100644 --- a/docs/custom-transactions.asciidoc +++ b/docs/reference/custom-transactions.md @@ -1,28 +1,19 @@ -[[custom-transactions]] +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-transactions.html +--- -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-transactions.html[elastic.co] -endif::[] +# Custom transactions [custom-transactions] -=== Custom transactions +This is an example of how to use custom transactions. For general information about the Elastic APM Node.js Transaction API, see the [Transaction API documentation](/reference/transaction-api.md). -This is an example of how to use custom transactions. -For general information about the Elastic APM Node.js Transaction API, -see the <>. +The Elastic APM agent for Node.js instruments your application by grouping incoming HTTP requests into logical buckets. Each HTTP request is recorded in what we call a transaction. But if your application is not a regular HTTP server, the Node.js agent will not able to know when a transaction should start and when it ends. -The Elastic APM agent for Node.js instruments your application by grouping incoming HTTP requests into logical buckets. -Each HTTP request is recorded in what we call a transaction. -But if your application is not a regular HTTP server, -the Node.js agent will not able to know when a transaction should start and when it ends. - -If for instance your application is a background job processing worker or is only accepting WebSockets, -you'll need to manually start and end transactions. +If for instance your application is a background job processing worker or is only accepting WebSockets, you’ll need to manually start and end transactions. Example of a background job application polling the SQS queuing system for jobs: -[source,js] ----- +```js var apm = require('elastic-apm-node').start() var sqs = require('simple-sqs')() @@ -65,4 +56,5 @@ queue.on('error', function (err) { // in case the queue encounters an error, report it to Elastic APM apm.captureError(err) }) ----- +``` + diff --git a/docs/reference/distributed-tracing.md b/docs/reference/distributed-tracing.md new file mode 100644 index 0000000000..37ebae5fde --- /dev/null +++ b/docs/reference/distributed-tracing.md @@ -0,0 +1,78 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/distributed-tracing.html +--- + +# Distributed tracing [distributed-tracing] + +Distributed tracing enables you to analyze performance throughout your microservices architecture all in one view. This is accomplished by tracing all of the requests — from the initial web request to your front-end service — to queries made to your back-end services. This makes finding possible bottlenecks throughout your application much easier and faster. + +Elastic APM automatically supports distributed tracing, but there are some cases, outlined below, where additional setup is necessary. + + +## Real User Monitoring (RUM) correlation [tracing-rum-correlation] + +If your backend service generates an HTML page dynamically, the trace ID and parent span ID must be injected into the page when the RUM Agent is initialized. This ensures that the web browser’s page load appears as the root of the trace, and allows you to analyze the time spent in the browser vs in backend services. + +To enable the JavaScript RUM agent, add a snippet similar to this to the body of your HTML page, preferably before other JavaScript libraries: + +```js +elasticApm.init({ + serviceName: 'my-frontend-app', // Name of your frontend app + serverUrl: 'https://example.com:8200', // APM Server host + pageLoadTraceId: '${transaction.traceId}', + pageLoadSpanId: '${transaction.ensureParentId()}', + pageLoadSampled: ${transaction.sampled} +}) +``` + +For more information, see [`transaction.ensureParentId()`](/reference/transaction-api.md#transaction-ensure-parent-id). + + +## Custom protocols [tracing-custom-protocol] + +Distributed tracing is automatically supported with HTTP/HTTPS. If you’re using another protocol, like TCP, UDP, WebSocket, or Protocol Buffers, there are a few manual setup steps you must follow. + +In a distributed trace, multiple transactions are linked together with a `traceparent`. To create your own distributed trace, you must pass the current `traceparent` from an outgoing service, to a receiving service, and create a new transaction as a child of that `traceparent`: + +1. In one service, start a transaction with [`apm.startTransaction()`](/reference/agent-api.md#apm-start-transaction), or a span with [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). +2. Get the serialized `traceparent` string of the started transaction/span with [`apm.currentTraceparent`](/reference/agent-api.md#apm-current-traceparent). +3. Encode the `traceparent` and send it to the receiving service inside your regular request. +4. Decode and store the `traceparent` in the receiving service. +5. Manually start a new transaction as a child of the received `traceparent`, with [`apm.startTransaction()`](/reference/agent-api.md#apm-start-transaction). Pass in the `traceparent` as the `childOf` option. + + +### Example [tracing-custom-example] + +Consider a scenario where you’re using raw UDP to communicate between two services, A and B: + +**Service A** + +Service A starts a transaction, and gets the current `traceparent`. + +```js +agent.startTransaction('my-service-a-transaction') +const traceparent = agent.currentTraceparent +``` + +Service A then sends the `traceparent` as a "header" to service B. + +```js +// Pseudocode for sending data +sendMetadata(`traceparent: ${traceparent}\n`) +``` + +**Service B** + +Service B reads the `traceparent` from the incoming request. + +```js +// Pseudocode for reading incoming request +const traceparent = readTraceparentFromUDPPacket() +``` + +Service B uses the `traceparent` to initialize a new transaction that is a child of the original `traceparent`. + +```js +agent.startTransaction('my-service-b-transaction', { childOf: traceparent }) +``` diff --git a/docs/reference/esm.md b/docs/reference/esm.md new file mode 100644 index 0000000000..e3cf0607eb --- /dev/null +++ b/docs/reference/esm.md @@ -0,0 +1,109 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/esm.html +--- + +# ECMAScript module support [esm] + +::::{note} +ECMAScript module support is currently incomplete and experimental. It was added in version v3.48.0. +:::: + + +The Elastic APM Node.js agent includes *limited and experimental* support for auto-instrumentation of [ECMAScript modules](https://nodejs.org/api/esm.html#modules-ecmascript-modules) (ESM) — i.e. modules loaded via the `import ...` statement or the `import(...)` expression. Support is based on the experimental [Node.js Loaders API](https://nodejs.org/api/#loaders), which requires passing the `--experimental-loader` option to node. + +As a first example, the APM agent can provide HTTP tracing for the following Express server: + +```js +// server.mjs +import bodyParser from 'body-parser' +import express from 'express' + +const app = express() +app.use(bodyParser.json()) +app.get('/hello/:name', function (request, reply) { + reply.send({ hello: request.params.name }) +}) + +app.listen({ port: 3000}, () => { + console.log('Server is listening. Try:\n curl -i http://localhost:3000/hello/grace') +}) +``` + +when invoked as follows: + +```bash +export ELASTIC_APM_SERVER_URL='https://...apm...cloud.es.io:443' +export ELASTIC_APM_SECRET_TOKEN='...' +node -r elastic-apm-node/start.js \ + --experimental-loader=elastic-apm-node/loader.mjs \ + node server.mjs +``` + +The current ESM support is limited — only a subset of the modules listed at [*Supported technologies*](/reference/supported-technologies.md) are implemented. More will be added in subsequent releases. See below for full details. + +The ESM limitations only affects the agent’s automatic instrumentation. Other functionality — such as metrics collection, manual instrumentation and error capture — still work when using ES modules. + + +## Enabling ESM auto-instrumentation [esm-enabling] + +Enabling ESM auto-instrumentation requires starting Node.js with the `--experimental-loader=elastic-apm-node/loader.mjs` option. This can be done by passing the argument on the command line or by setting the [`NODE_OPTIONS`](https://nodejs.org/api/all.html#all_cli_node_optionsoptions) environment variable. + +```bash +node --experimental-loader=elastic-apm-node/loader.mjs server.mjs + +# or + +NODE_OPTIONS='--experimental-loader=elastic-apm-node/loader.mjs' +node server.mjs +``` + +As well, the APM agent must also be separately **started** — for example via `--require=elastic-apm-node/start.js`. See [Starting the agent](/reference/starting-agent.md) for the various ways of starting the APM agent. + + +## Supported Node.js versions [esm-compat-node] + +Automatic instrumentation of ES modules is based on the experimental Node.js Loaders API. ESM support in the Elastic APM Node.js agent will remain **experimental** while the Loaders API is experimental. + +ESM auto-instrumentation is only supported for Node.js versions that match **`^12.20.0 || ^14.13.1 || ^16.0.0 || ^18.1.0 || >=20.2.0`**. The behavior when using `node --experimental-loader=elastic-apm-node/loader.mjs` with earlier Node.js versions is undefined and unsupported. + + +## Supported modules [esm-compat-modules] + +Automatic instrumentation of ES modules is currently limited as described here. Note that the supported module version ranges often differ from those for CommonJS (i.e. `require()`) auto-instrumentation. + +| Module | Version | Note | | +| --- | --- | --- | --- | +| `@aws-sdk/client-dynamodb` | >=3.15.0 <4 | | | +| `@aws-sdk/client-s3` | >=3.15.0 <4 | | | +| `@aws-sdk/client-sns` | >=3.15.0 <4 | | | +| `@aws-sdk/client-sqs` | >=3.15.0 <4 | | | +| `cassandra-driver` | >=3.0.0 <5 | | | +| `express` | >=4.0.0 <6 | | | +| `fastify` | >=3.5.0 | | | +| `http` | | See [Supported Node.js versions](#esm-compat-node) above. | | +| `https` | | See [Supported Node.js versions](#esm-compat-node) above. | | +| `ioredis` | >=2 <6 | | | +| `knex` | >=0.20.0 <4 | Also, only with pg@8. | | +| `pg` | ^8 | | | + + +## Troubleshooting ESM support [esm-troubleshooting] + +If you see an error like the following, then you are attempting to use ESM auto-instrumentation support with too early of a version of Node.js. See [Supported Node.js versions](#esm-compat-node) above. + +``` +file:///.../node_modules/import-in-the-middle/hook.mjs:6 +import { createHook } from './hook.js' + ^^^^^^^^^^ +SyntaxError: The requested module './hook.js' is expected to be of type CommonJS, which does not support named exports. CommonJS modules can be imported by importing the default export. +For example: +import pkg from './hook.js'; +const { createHook } = pkg; + at ModuleJob._instantiate (internal/modules/esm/module_job.js:98:21) + at async ModuleJob.run (internal/modules/esm/module_job.js:137:5) + at async Loader.import (internal/modules/esm/loader.js:165:24) + at async internal/process/esm_loader.js:57:9 + at async Object.loadESM (internal/process/esm_loader.js:67:5) +``` + diff --git a/docs/reference/express.md b/docs/reference/express.md new file mode 100644 index 0000000000..2d95da9b58 --- /dev/null +++ b/docs/reference/express.md @@ -0,0 +1,142 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/express.html +--- + +# Get started with Express [express] + +Getting Elastic APM set up for your Express app is easy, and there are various ways you can tweak it to fit your needs. Follow the guide below to get started, and for more advanced topics, check out the [*API Reference*](/reference/api.md). + + +## Installation [express-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [express-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `express`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple Express example with the Elastic APM agent installed: + +```js +// Add this to the VERY top of the first file loaded in your app +const apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +const app = require('express')() + +app.get('/', function (req, res) { + res.send('Hello World!') +}) + +app.listen(3000) +``` + +The agent will now monitor the performance of your Express application and record any uncaught exceptions. + + +### Advanced configuration [express-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [express-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [express-performance-monitoring] + +Elastic APM automatically measures the performance of your Express application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your Express app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Unknown routes [express-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your Express app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [express-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +## Filter sensitive information [express-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [express-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [express-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [express-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/fastify.md b/docs/reference/fastify.md new file mode 100644 index 0000000000..d19045f106 --- /dev/null +++ b/docs/reference/fastify.md @@ -0,0 +1,154 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/fastify.html +--- + +# Get started with Fastify [fastify] + +Getting Elastic APM set up for your Fastify app is easy, and there are various ways you can tweak it to fit your needs. + +Follow the guide below to get started, and for more advanced topics, check out the [API Reference](/reference/api.md). + + +## Installation [fastify-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [fastify-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `fastify`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple Fastify example with the Elastic APM agent installed: + +```js +// Add this to the VERY top of the first file loaded in your app +var apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +// Require the framework and instantiate it +var fastify = require('fastify')({ + logger: true +}) + +// Declare a route +fastify.get('/', function (request, reply) { + reply.send({ hello: 'world' }) +}) + +// Run the server! +fastify.listen(3000, function (err, address) { + if (err) throw err + fastify.log.info(`server listening on ${address}`) +}) +``` + +The agent will now monitor the performance of your Fastify application and record any uncaught exceptions. + + +### Advanced configuration [fastify-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [fastify-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [fastify-performance-monitoring] + +Elastic APM automatically measures the performance of your Fastify application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your Fastify app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Unknown routes [fastify-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your Fastify app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [fastify-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +## Filter sensitive information [fastify-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [fastify-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [fastify-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + +See also: [Fastify’s own LTS documentation.](https://www.fastify.io/docs/latest/LTS/) + + +## Troubleshooting [fastify-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/hapi.md b/docs/reference/hapi.md new file mode 100644 index 0000000000..6132a25cca --- /dev/null +++ b/docs/reference/hapi.md @@ -0,0 +1,153 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/hapi.html +--- + +# Get started with hapi [hapi] + +Getting Elastic APM set up for your hapi app is easy, and there are various ways you can tweak it to fit your needs. Follow the guide below to get started, and for more advanced topics, check out the [API Reference](/reference/api.md). + + +## Installation [hapi-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [hapi-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `@hapi/hapi`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple hapi example with the Elastic APM agent installed: + +```js +// Add this to the VERY top of the first file loaded in your app +const apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +const Hapi = require('@hapi/hapi') + +const init = async () => { + const server = Hapi.server({ port: 3000, host: 'localhost' }) + + server.route({ + method: 'GET', + path: '/', + handler: (request, h) => { + return 'hello world' + } + }) + + await server.start() + console.log('Server running on %s', server.info.uri) +} + +init() +``` + +The agent will now monitor the performance of your hapi application and record any uncaught exceptions. + + +### Advanced configuration [hapi-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [hapi-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [hapi-performance-monitoring] + +Elastic APM automatically measures the performance of your hapi application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your hapi app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Unknown routes [hapi-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your hapi app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [hapi-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +## Filter sensitive information [hapi-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [hapi-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [hapi-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [hapi-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/images/azure-functions-configuration.png b/docs/reference/images/azure-functions-configuration.png similarity index 100% rename from docs/images/azure-functions-configuration.png rename to docs/reference/images/azure-functions-configuration.png diff --git a/docs/reference/images/choose-a-layer.png b/docs/reference/images/choose-a-layer.png new file mode 100644 index 0000000000..49cfd9917c Binary files /dev/null and b/docs/reference/images/choose-a-layer.png differ diff --git a/docs/reference/images/config-layer.png b/docs/reference/images/config-layer.png new file mode 100644 index 0000000000..ec6c045d34 Binary files /dev/null and b/docs/reference/images/config-layer.png differ diff --git a/docs/images/dynamic-config.svg b/docs/reference/images/dynamic-config.svg similarity index 100% rename from docs/images/dynamic-config.svg rename to docs/reference/images/dynamic-config.svg diff --git a/docs/images/nextjs-my-app-screenshot.png b/docs/reference/images/nextjs-my-app-screenshot.png similarity index 100% rename from docs/images/nextjs-my-app-screenshot.png rename to docs/reference/images/nextjs-my-app-screenshot.png diff --git a/docs/images/node_release_schedule.svg b/docs/reference/images/node_release_schedule.svg similarity index 100% rename from docs/images/node_release_schedule.svg rename to docs/reference/images/node_release_schedule.svg diff --git a/docs/reference/images/nodejs-lambda-env-vars.png b/docs/reference/images/nodejs-lambda-env-vars.png new file mode 100644 index 0000000000..79476738dd Binary files /dev/null and b/docs/reference/images/nodejs-lambda-env-vars.png differ diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000000..fa78d0bb06 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,24 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/intro.html + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/index.html +--- + +# APM Node.js agent [intro] + +The Elastic APM Node.js Agent sends performance metrics and errors to the APM Server. It has built-in support for the most popular frameworks and routers, as well as a simple API which allows you to instrument any application. + + +## How does the Agent work? [how-it-works] + +The agent auto-instruments [supported frameworks](/reference/supported-technologies.md#compatibility-frameworks) and records interesting events, like HTTP requests and database queries. To do this, it patches modules as they are loaded to capture when module functions and callbacks are called. Additionally, there are some cases where a module will be patched to allow tracing context to be propagated through the asynchronous continuation. This means that for the supported technologies, there are no code changes required. + +The Agent automatically links module function calls to callback calls to measure their duration and metadata (like the DB statement), as well as HTTP related information (like the URL, parameters, and headers). + +These events, called Transactions and Spans, are sent to the APM Server. The APM Server converts them to a format suitable for Elasticsearch, and sends them to an Elasticsearch cluster. You can then use the APM app in Kibana to gain insight into latency issues and error culprits within your application. + + +## Additional Components [additional-components] + +APM Agents work in conjunction with the [APM Server](docs-content://solutions/observability/apm/index.md), [Elasticsearch](docs-content://get-started/index.md), and [Kibana](docs-content://get-started/the-stack.md). The [APM Guide](docs-content://solutions/observability/apm/index.md) provides details on how these components work together, and provides a matrix outlining [Agent and Server compatibility](docs-content://solutions/observability/apm/apm-agent-compatibility.md). + diff --git a/docs/reference/koa.md b/docs/reference/koa.md new file mode 100644 index 0000000000..219d0f85bb --- /dev/null +++ b/docs/reference/koa.md @@ -0,0 +1,151 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/koa.html +--- + +# Get started with Koa [koa] + +Getting Elastic APM set up for your Koa app is easy, and there are various ways you can tweak it to fit your needs. Follow the guide below to get started, and for more advanced topics, check out the [API Reference](/reference/api.md). + +Koa doesn’t have a built-in router, so we can’t support Koa directly since we rely on router information for full support. We currently support the most popular Koa router called [koa-router](https://github.com/koajs/koa-router). + +If you use another router with your Koa application, please [open an issue](https://github.com/elastic/apm-agent-nodejs/issues) so we can make sure to support your stack. In the meantime, you can [configure Elastic APM to work with any stack](/reference/custom-stack.md). + + +## Installation [koa-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [koa-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `koa`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple Koa example with the Elastic APM agent installed: + +```js +// Add this to the VERY top of the first file loaded in your app +const apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +const app = require('koa')() +const router = require('koa-router')() + +router.get('/', function *(next) { + this.body = 'Hello World' +}) + +app + .use(router.routes()) + .use(router.allowedMethods()) + +app.listen(3000) +``` + +The agent will now monitor the performance of your Koa application and record any uncaught exceptions. + + +### Advanced configuration [koa-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [koa-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [koa-performance-monitoring] + +Elastic APM automatically measures the performance of your Koa application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your Koa app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Unknown routes [koa-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your Koa app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [koa-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +## Filter sensitive information [koa-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [koa-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [koa-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [koa-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/lambda.md b/docs/reference/lambda.md new file mode 100644 index 0000000000..e0a2ecc31a --- /dev/null +++ b/docs/reference/lambda.md @@ -0,0 +1,281 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/lambda.html +sub: + apm-lambda-ext-v: ver-1-5-7 + apm-node-v: ver-4-11-0 +--- + +# Monitoring AWS Lambda Node.js Functions [lambda] + +The Node.js APM Agent can be used with AWS Lambda to monitor the execution of your AWS Lambda functions. + + +## Quick Start [aws-lambda-nodejs-quick-start] + +To get started with APM for your Node.js AWS Lambda functions follow the steps below. + + +### Prerequisites [aws-lambda-nodejs-prerequisites] + +You need an APM Server to send APM data to. Follow the [APM Quick start](docs-content://solutions/observability/apm/get-started.md) if you have not set one up yet. For the best-possible performance, we recommend setting up APM on {{ecloud}} in the same AWS region as your AWS Lambda functions. + +### Step 1: Add the APM Layers to your Lambda function [add_the_apm_layers_to_your_lambda_function] + +Both the [{{apm-lambda-ext}}](apm-aws-lambda://reference/index.md) and the Node.js APM Agent are added to your Lambda function as [AWS Lambda Layers](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html). Therefore, you need to add the corresponding Layer ARNs (identifiers) to your Lambda function. + +:::::::{tab-set} + +::::::{tab-item} AWS Web Console +To add the layers to your Lambda function through the AWS Management Console: + +1. Navigate to your function in the AWS Management Console +2. Scroll to the Layers section and click the *Add a layer* button ![image of layer configuration section in AWS Console](images/config-layer.png "") +3. Choose the *Specify an ARN* radio button +4. Copy and paste the following ARNs of the {{apm-lambda-ext}} layer and the APM agent layer in the *Specify an ARN* text input: + * APM Extension layer: + ``` + arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-extension-{{apm-lambda-ext-v}}-{ARCHITECTURE}:1 <1> + ``` + 1. Replace `{AWS_REGION}` with the AWS region of your Lambda function and `{ARCHITECTURE}` with its architecture. + + * APM agent layer: + ``` + arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-node-{{apm-node-v}}:1 <1> + ``` + 1. Replace `{AWS_REGION}` with the AWS region of your Lambda function. + + ![image of choosing a layer in AWS Console](images/choose-a-layer.png "") +5. Click the *Add* button +:::::: + +::::::{tab-item} AWS CLI +To add the Layer ARNs of the {{apm-lambda-ext}} and the APM agent through the AWS command line interface execute the following command: + +```bash +aws lambda update-function-configuration --function-name yourLambdaFunctionName \ +--layers arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-extension-{{apm-lambda-ext-v}}-{ARCHITECTURE}:1 \ <1> +arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-node-{{apm-node-v}}:1 <2> +``` +1. Replace `{AWS_REGION}` with the AWS region of your Lambda function and `{ARCHITECTURE}` with its architecture. +2. Replace `{AWS_REGION}` with the AWS region of your Lambda function. +:::::: + +::::::{tab-item} SAM +In your SAM `template.yml` file add the Layer ARNs of the {{apm-lambda-ext}} and the APM agent as follows: + +```yaml +... +Resources: + yourLambdaFunction: + Type: AWS::Serverless::Function + Properties: + ... + Layers: + - arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-extension-{{apm-lambda-ext-v}}-{ARCHITECTURE}:1 <1> + - arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-node-{{apm-node-v}}:1 <2> +... +``` +1. Replace `{AWS_REGION}` with the AWS region of your Lambda function and `{ARCHITECTURE}` with its architecture. +2. Replace `{AWS_REGION}` with the AWS region of your Lambda function. +:::::: + +::::::{tab-item} Serverless +In your `serverless.yml` file add the Layer ARNs of the {{apm-lambda-ext}} and the APM agent to your function as follows: + +```yaml +... +functions: + yourLambdaFunction: + handler: ... + layers: + - arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-extension-{{apm-lambda-ext-v}}-{ARCHITECTURE}:1 <1> + - arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-node-{{apm-node-v}}:1 <2> +... +``` +1. Replace `{AWS_REGION}` with the AWS region of your Lambda function and `{ARCHITECTURE}` with its architecture. +2. Replace `{AWS_REGION}` with the AWS region of your Lambda function. +:::::: + +::::::{tab-item} Terraform +To add the{{apm-lambda-ext}} and the APM agent to your function add the ARNs to the `layers` property in your Terraform file: + +```yaml +... +resource "aws_lambda_function" "your_lambda_function" { + ... + layers = ["arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-extension-{{apm-lambda-ext-v}}-{ARCHITECTURE}:1", "arn:aws:lambda:{AWS_REGION}:267093732750:layer:elastic-apm-node-{{apm-node-v}}:1"] <1> +} +... +``` +1. Replace `{AWS_REGION}` with the AWS region of your Lambda function and `{ARCHITECTURE}` with its architecture. +:::::: + +::::::{tab-item} Container Image +To add the {{apm-lambda-ext}} and the APM agent to your container-based function extend the Dockerfile of your function image as follows: + +```Dockerfile +FROM docker.elastic.co/observability/apm-lambda-extension-{IMAGE_ARCH}:latest AS lambda-extension <1> +FROM docker.elastic.co/observability/apm-agent-nodejs:latest AS nodejs-agent + +# FROM ... <-- this is the base image of your Lambda function + +COPY --from=lambda-extension /opt/elastic-apm-extension /opt/extensions/elastic-apm-extension +COPY --from=nodejs-agent /opt/nodejs/ /opt/nodejs/ + +# ... +``` +1. Replace `{IMAGE_ARCH}` with the architecture of the image. +:::::: + +::::::: + +### Step 2: Configure APM on AWS Lambda [configure_apm_on_aws_lambda] + +The {{apm-lambda-ext}} and the APM Node.js agent are configured through environment variables on the AWS Lambda function. + +For the minimal configuration, you will need the *APM Server URL* to set the destination for APM data and an [APM Secret Token](docs-content://solutions/observability/apm/secret-token.md). If you prefer to use an [APM API key](docs-content://solutions/observability/apm/api-keys.md) instead of the APM secret token, use the `ELASTIC_APM_API_KEY` environment variable instead of `ELASTIC_APM_SECRET_TOKEN` in the following configuration. + +For production environments, we recommend [using the AWS Secrets Manager to store your APM authentication key](apm-aws-lambda://reference/aws-lambda-secrets-manager.md) instead of providing the secret value as plaintext in the environment variables. + +:::::::{tab-set} + +::::::{tab-item} AWS Web Console +To configure APM through the AWS Management Console: + +1. Navigate to your function in the AWS Management Console +2. Click on the *Configuration* tab +3. Click on *Environment variables* +4. Add the following required variables: + +```bash +NODE_OPTIONS = -r elastic-apm-node/start <1> +ELASTIC_APM_LAMBDA_APM_SERVER = <2> +ELASTIC_APM_SECRET_TOKEN = <3> +ELASTIC_APM_SEND_STRATEGY = background <4> +``` + +1. Use this exact fixed value. +2. This is your APM Server URL. +3. This is your APM secret token. +4. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +![Node.js environment variables configuration section in AWS Console](images/nodejs-lambda-env-vars.png "") +:::::: + +::::::{tab-item} AWS CLI +To configure APM through the AWS command line interface execute the following command: + +```bash +aws lambda update-function-configuration --function-name yourLambdaFunctionName \ + --environment "Variables={NODE_OPTIONS=-r elastic-apm-node/start,ELASTIC_APM_LAMBDA_APM_SERVER=,ELASTIC_APM_SECRET_TOKEN=,ELASTIC_APM_SEND_STRATEGY=background}" <1> +``` + +1. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +:::::: + +::::::{tab-item} SAM +In your SAM `template.yml` file configure the following environment variables: + +```yaml +... +Resources: + yourLambdaFunction: + Type: AWS::Serverless::Function + Properties: + ... + Environment: + Variables: + NODE_OPTIONS: -r elastic-apm-node/start + ELASTIC_APM_LAMBDA_APM_SERVER: + ELASTIC_APM_SECRET_TOKEN: + ELASTIC_APM_SEND_STRATEGY: background <1> +... +``` + +1. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +:::::: + +::::::{tab-item} Serverless +In your `serverless.yml` file configure the following environment variables: + +```yaml +... +functions: + yourLambdaFunction: + ... + environment: + NODE_OPTIONS: -r elastic-apm-node/start + ELASTIC_APM_LAMBDA_APM_SERVER: + ELASTIC_APM_SECRET_TOKEN: + ELASTIC_APM_SEND_STRATEGY: background <1> +... +``` + +1. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +:::::: + +::::::{tab-item} Terraform +In your Terraform file configure the following environment variables: + +```yaml +... +resource "aws_lambda_function" "your_lambda_function" { + ... + environment { + variables = { + NODE_OPTIONS = "-r elastic-apm-node/start" + ELASTIC_APM_LAMBDA_APM_SERVER = "" + ELASTIC_APM_SECRET_TOKEN = "" + ELASTIC_APM_SEND_STRATEGY = "background" <1> + } + } +} +... +``` + +1. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +:::::: + +::::::{tab-item} Container Image +Environment variables configured for an AWS Lambda function are passed to the container running the lambda function. You can use one of the other options (through AWS Web Console, AWS CLI, etc.) to configure the following environment variables: + +```bash +NODE_OPTIONS = -r elastic-apm-node/start <1> +ELASTIC_APM_LAMBDA_APM_SERVER = <2> +ELASTIC_APM_SECRET_TOKEN = <3> +ELASTIC_APM_SEND_STRATEGY = background <4> +``` + +1. Use this exact fixed value. +2. This is your APM Server URL. +3. This is your APM secret token. +4. The [ELASTIC_APM_SEND_STRATEGY](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the background strategy in production environments with steady load scenarios. + +:::::: + +::::::: +1. The [`ELASTIC_APM_SEND_STRATEGY`](apm-aws-lambda://reference/aws-lambda-config-options.md#_elastic_apm_send_strategy) defines when APM data is sent to your Elastic APM backend. To reduce the execution time of your lambda functions, we recommend to use the `background` strategy in production environments with steady load scenarios. + + +You can optionally [fine-tune the Node.js agent](/reference/configuration.md) or the [configuration of the {{apm-lambda-ext}}](apm-aws-lambda://reference/aws-lambda-config-options.md). + +That’s it. After following the steps above, you’re ready to go! Your Lambda function invocations should be traced from now on. + + +## Features [aws-lambda-features] + +The AWS Lambda instrumentation will report a transaction for all function invocations and trace any [supported modules](/reference/supported-technologies.md#compatibility-frameworks). In addition, the created transactions will capture additional data for a number of Lambda trigger types — API Gateway, SNS, SQS, S3 (when the trigger is a single event), and ELB. + +A transaction will be reported for Lambda invocations that fail due to a timeout, crash, `uncaughtException`, or `unhandledRejection`. (This requires APM agent v3.45.0 or later and [Elastic’s APM Lambda extension](apm-aws-lambda://reference/index.md) version 1.4.0 or later.) + + +## Caveats and Troubleshooting [aws-lambda-caveats] + +* System and custom metrics are not collected for Lambda functions. This is both because most of those are irrelevant and because the interval-based event sending model is not suitable for FaaS environments. +* The APM agent does not yet support a Lambda handler module that uses ECMAScript modules (ESM). That means your handler file name should end with ".js" (and not have `"type": "module"` in package.json if you have one) or end with ".cjs". A handler file that uses the ".mjs" suffix will not be instrumented by the APM agent. + diff --git a/docs/reference/logs.md b/docs/reference/logs.md new file mode 100644 index 0000000000..32799ebd82 --- /dev/null +++ b/docs/reference/logs.md @@ -0,0 +1,25 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/logs.html +--- + +# Logs [logs] + +The Elastic APM Node.js Agent provides support for [Log correlation](#log-correlation-ids). When used together with the [`ecs-logging-nodejs` packages](ecs-logging-nodejs://reference/index.md), correlation IDs will be automatically injected into log records to allow navigation between logs, traces, and services. + +This feature is part of [Application log ingestion strategies](docs-content://solutions/observability/logs/stream-application-logs.md). + + +## Log correlation [log-correlation-ids] + +[Log correlation](docs-content://solutions/observability/apm/logs.md) allows you to navigate to all logs belonging to a particular trace and vice-versa: for a specific log, see in which context it has been logged and which parameters the user provided. + +In order to correlate logs from your application with traces captured by the Elastic APM Node.js Agent, your logs must contain the following identifiers: + +* [`trace.id`](ecs://reference/ecs-tracing.md) +* [`transaction.id`](ecs://reference/ecs-tracing.md) or [`span.id`](ecs://reference/ecs-tracing.md) + +The APM Node.js Agent provides the [`apm.currentTraceIds`](/reference/agent-api.md#apm-current-trace-ids) API for this. If your application is also using one of the [ECS formatting plugin packages](ecs-logging-nodejs://reference/index.md) (available for Pino, Winston, and Morgan), then this APM Agent API will automatically be used to inject the appropriate tracing fields into your log records. Otherwise, configure your logger to add these fields when emitting a log record. + +When your logs contain the appropriate identifiers, the final step is to ingest them into the same Elasticsearch instance that contains your APM data. See [Ingest your logs into Elasticsearch](docs-content://solutions/observability/logs/stream-application-logs.md) for more information. + diff --git a/docs/message-queues.asciidoc b/docs/reference/message-queues.md similarity index 52% rename from docs/message-queues.asciidoc rename to docs/reference/message-queues.md index 80310a2b0c..766b98d7ec 100644 --- a/docs/message-queues.asciidoc +++ b/docs/reference/message-queues.md @@ -1,12 +1,15 @@ -[[message-queues]] -== Message queues +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/message-queues.html +--- -The Node.js Agent will automatically create spans for activity to/from your Amazon SQS message queues. To record these spans, your message queue activity must occur during a transaction. If you're performing queue operations during an HTTP request from a <>, the agent will start a transaction automatically. However, if you're performing queue operations in a stand-alone program (such as a message processor), you'll need to use the Node.js Agent's <> method to manually create transactions for your messages. +# Message queues [message-queues] + +The Node.js Agent will automatically create spans for activity to/from your Amazon SQS message queues. To record these spans, your message queue activity must occur during a transaction. If you’re performing queue operations during an HTTP request from a [supported framework](/reference/supported-technologies.md#compatibility-frameworks), the agent will start a transaction automatically. However, if you’re performing queue operations in a stand-alone program (such as a message processor), you’ll need to use the Node.js Agent’s [`startTransaction()`](/reference/agent-api.md#apm-start-transaction) method to manually create transactions for your messages. You can see an example of this in the following code sample. -[source,js] ----- +```js const apm = require('elastic-apm-node').start({/*...*/}) const AWS = require('aws-sdk'); // Set the region @@ -28,23 +31,24 @@ sqs.receiveMessage(params, function(err, data) { // end the transaction transaction.end() <2> }) ----- -<1> Prior to calling the `sqs.receiveMessage` method, start a new transaction. -<2> Only end the transaction _after_ the queue's processing callback finishes executing. The will ensure a transaction is active while processing your queue messages. +``` + +1. Prior to calling the `sqs.receiveMessage` method, start a new transaction. +2. Only end the transaction *after* the queue’s processing callback finishes executing. The will ensure a transaction is active while processing your queue messages. + -[float] -[[message-queues-distributed-tracing]] -=== Distributed tracing and messaging queues -To enable queue scheduling and queue processing with distributed tracing, use the Node.js Agent's API to _store_ a `traceparent` header with your queue message; then, provide that `traceparent` header when starting a new transaction. +## Distributed tracing and messaging queues [message-queues-distributed-tracing] -Here's a _new_ example that uses the Node.js Agent API to store the `traceparent` as a message attribute and then uses that attribute to link your new transaction with the original. +To enable queue scheduling and queue processing with distributed tracing, use the Node.js Agent’s API to *store* a `traceparent` header with your queue message; then, provide that `traceparent` header when starting a new transaction. + +Here’s a *new* example that uses the Node.js Agent API to store the `traceparent` as a message attribute and then uses that attribute to link your new transaction with the original. **Storing the Traceparent** -When sending the message, you'll want to add the trace as one of the `MessageAttributes`. -[source,js] ----- +When sending the message, you’ll want to add the trace as one of the `MessageAttributes`. + +```js // stores the traceparent when sending the queue message const traceParent = apm.currentTransaction ? apm.currentTransaction.traceparent : '' @@ -64,16 +68,15 @@ const params = { sqs.sendMessage(params, function(err, data) { /* ... */ }); ----- +``` This will save the traceparent value so we can use it later on when receiving the messages. **Applying the Traceparent** -When we receive our queue messages, we'll check the message for our Traceparent header, and use it to start a new transaction. By starting a transaction with this traceparent header we'll be linking the sending and receiving via distributed tracing. +When we receive our queue messages, we’ll check the message for our Traceparent header, and use it to start a new transaction. By starting a transaction with this traceparent header we’ll be linking the sending and receiving via distributed tracing. -[source,js] ----- +```js // uses the traceparent to start a transaction sqs.receiveMessage(params, function(err, data) { @@ -96,9 +99,8 @@ sqs.receiveMessage(params, function(err, data) { transactionMessage.end() <3> } }) +``` ----- -<1> Even though we only scheduled one queue message, Amazon's SQS API returns an array of _multiple_ messages. Therefore we'll need to loop over each one. -<2> We extract the traceparent header we'd previously save, and use it to start a transaction. -<3> Once we're done processing a single message, we end the transaction and move on to the next. - +1. Even though we only scheduled one queue message, Amazon’s SQS API returns an array of *multiple* messages. Therefore we’ll need to loop over each one. +2. We extract the traceparent header we’d previously save, and use it to start a transaction. +3. Once we’re done processing a single message, we end the transaction and move on to the next. diff --git a/docs/reference/metrics.md b/docs/reference/metrics.md new file mode 100644 index 0000000000..0ad10a9c1e --- /dev/null +++ b/docs/reference/metrics.md @@ -0,0 +1,151 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/metrics.html +--- + +# Metrics [metrics] + +The Node.js agent tracks various system and application metrics. These metrics will be sent regularly to the APM Server and from there to Elasticsearch. You can adjust the interval by setting [`metricsInterval`](/reference/configuration.md#metrics-interval). + +The metrics will be stored in the `apm-*` index and have the `processor.event` property set to `metric`. + + +## `system.cpu.total.norm.pct` [metric-system.cpu.total.norm.pct] + +* **Type:** Float +* **Format:** Percent + +The percentage of CPU time in states other than Idle and IOWait, normalized by the number of cores. + + +## `system.memory.total` [metric-system.memory.total] + +* **Type:** Long +* **Format:** Bytes + +The total memory of the system in bytes. + + +## `system.memory.actual.free` [metric-system.memory.actual.free] + +* **Type:** Long +* **Format:** Bytes + +Free memory of the system in bytes. + + +## `system.process.cpu.total.norm.pct` [metric-system.process.cpu.total.norm.pct] + +* **Type:** Float +* **Format:** Percent + +The percentage of CPU time spent by the process since the last event. This value is normalized by the number of CPU cores and it ranges from 0 to 100%. + + +## `system.process.memory.rss.bytes` [metric-system.process.memory.rss.bytes] + +* **Type:** Long +* **Format:** Bytes + +The Resident Set Size, the amount of memory the process occupies in main memory (RAM). + + +## `nodejs.handles.active` [metric-nodejs.handles.active] + +* **Type:** Long +* **Format:** Counter + +The number of active libuv handles, likely held open by currently running I/O operations. + + +## `nodejs.requests.active` [metric-nodejs.requests.active] + +* **Type:** Long +* **Format:** Counter + +The number of active libuv requests, likely waiting for a response to an I/O operation. + + +## `system.process.cpu.user.norm.pct` [metric-system.process.cpu.user.norm.pct] + +* **Type:** Long +* **Format:** Counter + +The number of CPU cycles spent executing application code. + + +## `system.process.cpu.system.norm.pct` [metric-system.process.cpu.system.norm.pct] + +* **Type:** Long +* **Format:** Counter + +The number of CPU cycles spent executing kernel code as a result of application activity. + + +## `nodejs.eventloop.delay.avg.ms` [metric-nodejs.eventloop.delay.avg.ms] + +* **Type:** Float +* **Format:** Milliseconds + +The number of milliseconds of event loop delay. Event loop delay is sampled every 10 milliseconds. Delays shorter than 10ms may not be observed, for example if a blocking operation starts and ends within the same sampling period. + + +## `nodejs.memory.heap.allocated.bytes` [metric-nodejs.memory.heap.allocated.bytes] + +* **Type:** Long +* **Format:** Bytes + +The current allocated heap size in bytes. + + +## `nodejs.memory.heap.used.bytes` [metric-nodejs.memory.heap.used.bytes] + +* **Type:** Long +* **Format:** Bytes + +The currently used heap size in bytes. + + +## `nodejs.memory.external.bytes` [metric-nodejs.memory.external.bytes] + +* **Type:** Long +* **Format:** Bytes + +Memory usage of C++ objects bound to JavaScript objects managed by V8. + + +## `nodejs.memory.arrayBuffers.bytes` [metric-nodejs.memory.arrayBuffers.bytes] + +* **Type:** Long +* **Format:** Bytes + +Memory allocated for ArrayBuffers and SharedArrayBuffers, including all Node.js Buffers. This is also included in the `nodejs.memory.external.bytes` value. + + +## `span.self_time.sum` [metrics-span.self_time.sum] + +* **Type:** Long +* **Format:** Milliseconds + +The sum of all span self-times in milliseconds since the last report (the delta). The `span.self_time.*` metrics are referred to as "breakdown metrics". + +You can filter and group by these dimensions: + +* `transaction.name`: The name of the transaction +* `transaction.type`: The type of the transaction, for example `request` +* `span.type`: The type of the span, for example `app`, `template` or `db` +* `span.subtype`: The sub-type of the span, for example `mysql` (optional) + + +## `span.self_time.count` [metrics-span.self_time.count] + +* **Type:** Long +* **Format:** Counter + +You can filter and group by these dimensions: + +* `transaction.name`: The name of the transaction +* `transaction.type`: The type of the transaction, for example `request` +* `span.type`: The type of the span, for example `app`, `template` or `db` +* `span.subtype`: The sub-type of the span, for example `mysql` (optional) + diff --git a/docs/reference/nextjs.md b/docs/reference/nextjs.md new file mode 100644 index 0000000000..a0d8d444b8 --- /dev/null +++ b/docs/reference/nextjs.md @@ -0,0 +1,143 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/nextjs.html +--- + +# Get started with Next.js [nextjs] + +The Elastic APM Node.js agent can be used to trace the Next.js server (`next start` or `next dev`) that runs your application without the need for code changes to your app. The APM transactions for incoming HTTP requests to the server will be named for the [pages](https://nextjs.org/docs/routing/introduction) and [API endpoints](https://nextjs.org/docs/api-routes/introduction) in your application, as well as for internal routes used by Next.js. Errors in code run on the server will be reported for viewing in the Kibana APM app. + +Note that the Node.js APM agent can only instrument *server-side* code. To monitor the client-side parts of a Next.js application, see the [Elastic RUM agent](apm-agent-rum-js://reference/index.md). + +::::{note} +This Next.js instrumentation is a *technical preview* while we solicit feedback from Next.js users. Currently `next` versions `>=12.0.0 <13.3.0` are supported. If you are a Next.js user, please help us provide a better Next.js observability experience with your feedback on our [Discuss forum](https://discuss.elastic.co/tags/c/apm/nodejs). +:::: + + + +## Prerequisites [nextjs-prerequisites] + +You need an APM Server to send APM data to. Follow the [APM Quick start](docs-content://solutions/observability/apm/get-started.md) if you have not set one up yet. You will need your **APM server URL** and an APM server **secret token** (or **API key**) for configuring the APM agent below. + +You will also need a Next.js application to monitor. If you do not have an existing one to use, you can use the following to create a starter app (see [Next.js Getting Started docs](https://nextjs.org/docs/getting-started) for more): + +```bash +npx create-next-app@latest # use the defaults +cd my-app +``` + +You can also take a look at and use this [Next.js + Elastic APM example app](https://github.com/elastic/apm-agent-nodejs/tree/main/examples/nextjs/). + + +## Step 1: Add the APM agent dependency [nextjs-setup] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save # or 'yarn add elastic-apm-node' +``` + + +## Step 2: Start the APM agent [_step_2_start_the_apm_agent_2] + +For the APM agent to instrument the Next.js server, it needs to be started before the Next.js server code is loaded. The best way to do so is by using Node’s [`--require`](https://nodejs.org/api/cli.md#-r---require-module) option to load the "elastic-apm-node/start-next.js" module — this will start the agent (plus a little more for Next.js integration). + +Edit the "dev" and "start" scripts in your "package.json" as follows: + +```json +{ + // ... + "scripts": { + "dev": "NODE_OPTIONS=--require=elastic-apm-node/start-next.js next dev", + "build": "next build", + "start": "NODE_OPTIONS=--require=elastic-apm-node/start-next.js next start", + "lint": "next lint" + }, + // ... +} +``` + + +## Step 3: Configure the APM agent [_step_3_configure_the_apm_agent_2] + +The APM agent can be [configured](/reference/configuring-agent.md) with environment variables or with an "elastic-apm-node.js" module in the current working directory. Note that because the APM agent is being loaded before the Next.js server, the [Next.js-supported ".env" files](https://nextjs.org/docs/basic-features/environment-variables) **cannot** be used to configure the APM agent. We will use an "elastic-apm-node.js" file here. + +Create an "elastic-apm-node.js" file in the application root with the APM server URL and secret token values from the [Prerequisites](#nextjs-prerequisites) section above: + +```javascript +// elastic-apm-node.js +module.exports = { + serverUrl: 'https://...', // E.g. https://my-deployment-name.apm.us-west2.gcp.elastic-cloud.com + secretToken: '...' +} +``` + +The equivalent using environment variables is: + +```bash +export ELASTIC_APM_SERVER_URL='https://...' +export ELASTIC_APM_SECRET_TOKEN='...' +``` + +See the [agent configuration guide](/reference/configuration.md) for full details on supported configuration variables. + + +## Step 4: Start your Next.js app [_step_4_start_your_next_js_app] + +```bash +npm run dev # or 'npm run build && npm start' for the production server +``` + +Open [http://localhost:3000](http://localhost:3000) in your browser to load your Next.js app. If you used the `create-next-app` tool above, it defines an [/api/hello](http://localhost:3000/api/hello) API endpoint. You can provide some artificial load by running the following in a separate terminal: + +```bash +while true; do sleep 1; curl -i http://localhost:3000/api/hello; done +``` + +Visit your Kibana APM app and, after a few seconds, you should see a service entry for your Next.js app. The service name will be pulled from the "name" field in "package.json". It can be overriden with [`serviceName`](/reference/configuration.md#service-name). Here is an example: + +![Kibana APM app showing Next.js my-app](images/nextjs-my-app-screenshot.png) + +## Limitations and future work [nextjs-limitations] + +This Next.js instrumentation has some limitations to be aware of. + +Next.js build tooling bundles dependencies (using Webpack) for both client *and* server-side code execution. The Node.js APM agent does not work when bundled. See [Bundlers and APM](/reference/starting-agent.md#start-bundlers) for details. The implication for Next.js instrumentation is that you cannot directly import and use the APM agent in your code. That means that using the [`Agent` API](/reference/agent-api.md) for manual instrumentation is not currently possible. + +This instrumentation supports naming APM transactions for many internal Next.js routes. For example, for [server-side rendering (SSR)](https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props) Next.js client code will make requests of the form `GET /next/_data/$buildId/$page.json`, for which the APM agent names the transaction `Next.js _next/data route $page`. However, there is a limitation with the Next.js "public folder catchall" route. HTTP requests that resolve to files in your "public/" directory, for example `GET /favicon.ico`, will result in a transaction named `GET unknown route`. See [Unknown routes](#nextjs-unknown-routes) below. + +If you notice other limitations or have any suggestions, please give us feedback on our [Discuss forum](https://discuss.elastic.co/tags/c/apm/nodejs). + + +## Performance monitoring [nextjs-performance-monitoring] + +Elastic APM automatically measures the performance of your Next.js application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your Next.js app. Spans are grouped in transactions — by default one for each incoming HTTP request. + + +## Unknown routes [nextjs-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your Next.js app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Filter sensitive information [nextjs-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Compatibility [nextjs-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [nextjs-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/opentelemetry-bridge.md b/docs/reference/opentelemetry-bridge.md new file mode 100644 index 0000000000..68cc12e24d --- /dev/null +++ b/docs/reference/opentelemetry-bridge.md @@ -0,0 +1,194 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/opentelemetry-bridge.html +--- + +# OpenTelemetry bridge [opentelemetry-bridge] + +::::{note} +Integration with the OpenTelemetry Tracing API was added as experimental in v3.34.0. Integration with the OpenTelemetry Metrics API was added as experimental in v3.45.0. +:::: + + +The Elastic APM OpenTelemetry bridge allows one to use the vendor-neutral [OpenTelemetry API](https://opentelemetry.io/docs/instrumentation/js/) ([`@opentelemetry/api`](https://www.npmjs.com/package/@opentelemetry/api)) in your code, and have the Elastic Node.js APM agent handle those API calls. This allows one to use the Elastic APM agent for tracing and metrics without any vendor lock-in to the APM agent’s own [public API](/reference/api.md) when adding manual tracing or custom metrics. + + +## Using the OpenTelemetry Tracing API [otel-tracing-api] + +① First, you will need to add the Elastic APM agent and OpenTelemetry API dependencies to your project. The minimum required OpenTelemetry API version is 1.0.0; see [the OpenTelemetry compatibility section](/reference/supported-technologies.md#compatibility-opentelemetry) for the current maximum supported API version. For example: + +```bash +npm install --save elastic-apm-node @opentelemetry/api +``` + +② Second, you will need to configure and start the APM agent. This can be done completely with environment variables (so that there is no need to touch your application code): + +```bash +export ELASTIC_APM_SERVER_URL='' +export ELASTIC_APM_SECRET_TOKEN='' <1> +export ELASTIC_APM_OPENTELEMETRY_BRIDGE_ENABLED=true <2> +export NODE_OPTIONS='-r elastic-apm-node/start.js' <3> +node my-app.js +``` + +1. Or use ELASTIC_APM_API_KEY= +2. Future versions may drop this config var and enable usage of the tracing API by default. +3. Tell node to preload and start the APM agent. + +Or, alternatively, you can configure and start the APM agent at the top of your application code: + +```js +require('elastic-apm-node').start({ + serverUrl: '', + secretToken: '', <1> + opentelemetryBridgeEnabled: true +}); + +// Application code ... +``` +1. Alternatively, you can use `apiKey: ''`. + +See [the full APM agent configuration reference](/reference/configuration.md) for other configuration options. + +③ Finally, you can use the [OpenTelemetry API](https://open-telemetry.github.io/opentelemetry-js/modules/_opentelemetry_api.html) for any manual tracing in your code. For example, the following script uses [Tracer#startActiveSpan()](https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Tracer.html#startActiveSpan) to trace an outgoing HTTPS request: + +```js +const https = require('https') +const otel = require('@opentelemetry/api') +const tracer = otel.trace.getTracer('trace-https-request') + +tracer.startActiveSpan('makeRequest', span => { + https.get('https://httpstat.us/200', (response) => { + console.log('STATUS:', response.statusCode) + const body = [] + response.on('data', (chunk) => body.push(chunk)) + response.on('end', () => { + console.log('BODY:', body.toString()) + span.end() + }) + }) +}) +``` + +The APM agent source code repository includes [some examples using the OpenTelemetry tracing bridge](https://github.com/elastic/apm-agent-nodejs/tree/main/examples/opentelemetry-bridge). + + +## Using the OpenTelemetry Metrics API [otel-metrics-api] + +① As above, install the needed dependencies. The minimum required OpenTelemetry API version is 1.3.0 (the version when metrics were added); see [the OpenTelemetry compatibility section](/reference/supported-technologies.md#compatibility-opentelemetry) for the current maximum supported API version. For example: + +```bash +npm install --save elastic-apm-node @opentelemetry/api +``` + +② Configure and start the APM agent. This can be done completely with environment variables — as shown below — or in code. (See [Starting the agent](/reference/starting-agent.md) and [the full APM agent configuration reference](/reference/configuration.md) for other configuration options.) + +```bash +export ELASTIC_APM_SERVER_URL='' +export ELASTIC_APM_SECRET_TOKEN='' # or ELASTIC_APM_API_KEY=... +export NODE_OPTIONS='-r elastic-apm-node/start.js' # Tell node to preload and start the APM agent +node my-app.js +``` + +③ Finally, you can use the OpenTelemetry Metrics API, to [create metrics](https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Meter.html) and the APM agent will periodically ship those metrics to your Elastic APM deployment where you can visualize them in Kibana. + +```js +// otel-metrics-hello-world.js <1> +const { createServer } = require('http') +const otel = require('@opentelemetry/api') + +const meter = otel.metrics.getMeter('my-meter') +const numReqs = meter.createCounter('num_requests', { description: 'number of HTTP requests' }) + +const server = createServer((req, res) => { + numReqs.add(1) + req.resume() + req.on('end', () => { + res.end('pong\n') + }) +}) +server.listen(3000, () => { + console.log('listening at http://127.0.0.1:3000/') +}) +``` + +1. The full example is [here](https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/otel-metrics-hello-world.js). + + + +### Using the OpenTelemetry Metrics SDK [otel-metrics-sdk] + +The Elastic APM agent also supports exporting metrics to APM server when the OpenTelemetry Metrics **SDK** is being used directly. You might want to use the OpenTelemetry Metrics SDK to use a [`View`](https://opentelemetry.io/docs/reference/specification/metrics/sdk/#view) to configure histogram bucket sizes, to setup a Prometheus exporter, or for other reasons. For example: + +```js +// use-otel-metrics-sdk.js <1> +const otel = require('@opentelemetry/api') +const { MeterProvider } = require('@opentelemetry/sdk-metrics') +const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus') + +const exporter = new PrometheusExporter({ host: '127.0.0.1', port: 3001 }) +const meterProvider = new MeterProvider() +meterProvider.addMetricReader(exporter) +otel.metrics.setGlobalMeterProvider(meterProvider) + +const meter = otel.metrics.getMeter('my-meter') +const latency = meter.createHistogram('latency', { description: 'Response latency (s)' }) +// ... +``` + +1. The full example is [here](https://github.com/elastic/apm-agent-nodejs/blob/main/examples/opentelemetry-metrics/use-otel-metrics-sdk.js). + + + +### OpenTelemetry Metrics configuration [otel-metrics-conf] + +A few configuration options can be used to control OpenTelemetry Metrics support. + +* Specific metrics names can be filtered out via the [`disableMetrics`](/reference/configuration.md#disable-metrics) configuration option. +* Integration with the OpenTelemetry Metrics API can be disabled via the [`disableInstrumentations: '@opentelemetry/api'`](/reference/configuration.md#disable-instrumentations) configuration option. +* Integration with the OpenTelemetry Metrics SDK can be disabled via the [`disableInstrumentations: '@opentelemetry/sdk-metrics'`](/reference/configuration.md#disable-instrumentations) configuration option. +* All metrics support in the APM agent can be disabled via the [`metricsInterval: '0s'`](/reference/configuration.md#metrics-interval) configuration option. +* The default histogram bucket boundaries are different from the OpenTelemetry default, to provide better resolution. The boundaries used by the APM agent can be configured with the [`customMetricsHistogramBoundaries`](/reference/configuration.md#custom-metrics-histogram-boundaries) configuration option. + + +## Bridge architecture [otel-architecture] + +The OpenTelemetry Tracing bridge works similarly to the [OpenTelemetry Node.js Trace SDK](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node/). It registers Tracer and ContextManager providers with the OpenTelemetry API. Subsequent `@opentelemetry/api` calls in user code will use those providers. The APM agent translates from OpenTelemetry to Elastic APM semantics and sends tracing data to your APM server for full support in [Elastic Observability’s APM app](https://www.elastic.co/apm). + +Some examples of semantic translations: The first entry span of a service (e.g. an incoming HTTP request) will be converted to an [Elasic APM `Transaction`](docs-content://solutions/observability/apm/transactions.md), subsequent spans are mapped to [Elastic APM `Span`s](docs-content://solutions/observability/apm/spans.md). OpenTelemetry Span attributes are translated into the appropriate fields in Elastic APM’s data model. + +The only difference, from the user’s point of view, is in the setup of tracing. Instead of setting up the OpenTelemetry JS SDK, one sets up the APM agent as [described above](#otel-tracing-api). + +
+The OpenTelemetry Metrics support, is slightly different. If your code uses just the Metrics **API**, then the APM agent provides a full MeterProvider so that metrics are accumulated and sent to APM server. If your code uses the Metrics **SDK**, then the APM agents adds a MetricReader to your MeterProvider to send metrics on to APM server. This allows you to use the APM agent as either an easy setup for using metrics or in conjunction with your existing OpenTelemetry Metrics configuration. + + +## Caveats [otel-caveats] + +Not all features of the OpenTelemetry API are supported. This section describes any limitations and differences. + + +#### Tracing [otel-caveats-tracing] + +* Span Link Attributes. Adding links when [starting a span](https://open-telemetry.github.io/opentelemetry-js/interfaces/\_opentelemetry_api.Tracer.md) is supported, but any added span link **attributes** are silently dropped. +* Span events ([`Span#addEvent()`](https://open-telemetry.github.io/opentelemetry-js/interfaces/_opentelemetry_api.Span.html#addEvent)) are not currently supported. Events will be silently dropped. +* [Propagating baggage](https://open-telemetry.github.io/opentelemetry-js/classes/_opentelemetry_api.PropagationAPI.html) within or outside the process is not supported. Baggage items are silently dropped. + + +#### Metrics [otel-caveats-metrics] + +* Metrics [exemplars](https://opentelemetry.io/docs/reference/specification/metrics/data-model/#exemplars) are not supported. +* [Summary metrics](https://opentelemetry.io/docs/reference/specification/metrics/data-model/#summary-legacy) are not supported. +* [Exponential Histograms](https://opentelemetry.io/docs/reference/specification/metrics/data-model/#exponentialhistogram) are not yet supported. +* The `sum`, `count`, `min` and `max` within the OpenTelemetry histogram data are discarded. +* The default histogram bucket boundaries are different from the OpenTelemetry default. They provide better resolution. They can be configured with the [`customMetricsHistogramBoundaries`](/reference/configuration.md#custom-metrics-histogram-boundaries) configuration option. +* Metrics label names are dedotted (`s/\./_/g`) in APM server to avoid possible mapping collisions in Elasticsearch. +* The default [Aggregation Temporality](https://github.com/elastic/apm/blob/main/specs/agents/metrics-otel.md#aggregation-temporality) used differs from the OpenTelemetry default — preferring **delta**-temporality (nicer for visualizing in Kibana) to cumulative-temporality. + +Metrics support requires an APM server >=7.11 — for earlier APM server versions, metrics with label names including `.`, `*`, or `"` will get dropped. + + +#### Logs [otel-caveats-logs] + +The OpenTelemetry Logs API is currently not support — only the Tracing and Metrics APIs. + diff --git a/docs/reference/opentracing.md b/docs/reference/opentracing.md new file mode 100644 index 0000000000..9de4791628 --- /dev/null +++ b/docs/reference/opentracing.md @@ -0,0 +1,140 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/opentracing.html +--- + +# OpenTracing bridge [opentracing] + +::::{note} +[OpenTracing](https://opentracing.io/) is discontinued in favor of OpenTelemetry. This Elastic APM OpenTracing bridge is **deprecated**. Consider using the [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) instead. +:::: + + +The Elastic APM OpenTracing bridge allows creating Elastic APM transactions and spans, using the [OpenTracing API](https://opentracing-javascript.surge.sh/). In other words, it translates the calls to the OpenTracing API to Elastic APM and thus allows for reusing existing instrumentation. + +For more information about OpenTracing, see the [OpenTracing website](https://opentracing.io/). + + +## Prerequisites [ot-prerequisites] + +OpenTracing support for the Elastic APM Node.js Agent is provided via a separate module called [`elastic-apm-node-opentracing`](https://www.npmjs.com/package/elastic-apm-node-opentracing). + +This module requires that the Elastic APM Node.js Agent is installed separately. To ensure that both dependencies are added to the application, install them like so: + +```bash +npm install elastic-apm-node elastic-apm-node-opentracing --save +``` + + +## OpenTracing vs Elastic APM terminologies [ot-terminologies] + +Elastic APM differentiates between [transactions](docs-content://solutions/observability/apm/transactions.md) and [spans](docs-content://solutions/observability/apm/spans.md). In the context of OpenTracing, a transaction can be thought of as a special kind of span. + +Because OpenTracing natively only has the concept of spans, the Elastic APM OpenTracing bridge will automatically create either Elastic transactions or Elastic spans behind the scenes. There are a set of rules that determine which is created: + +1. If `agent.currentTransaction` is `null`, a new Elastic transaction will be created when calling `tracer.startSpan()`. +2. If `agent.currentTransaction` holds an existing transaction, but that transaction is ended, a new Elastic transaction will be created when calling `tracer.startSpan()`. +3. In all other cases, a new Elastic span will be created when calling `tracer.startSpan()`. + + +## Initialization [ot-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `express`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple example where we first start the agent and then initialize the OpenTracing bridge: + +```js +// Add this to the VERY top of the first file loaded in your app +const agent = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +const Tracer = require('elastic-apm-node-opentracing') + +// Pass the Elastic APM agent as an argument to the OpenTracing tracer +const tracer = new Tracer(agent) + +const span = tracer.startSpan('my-first-span') +// ... do some work ... +span.finish() +``` + + +## API [ot-api] + +```js +tracer = new Tracer(agent) +``` + +The `elastic-apm-node-opentracing` module exposes a Tracer class which is OpenTracing compatible. + +When instantiating the Tracer object, an instance of the Elastic APM Node.js Agent must be provided as its only argument. + +For details about the `tracer` API, see the [`opentracing-javascript` API docs](https://opentracing-javascript.surge.sh/). + + +## Elastic APM specific tags [ot-elastic-apm-tags] + +Elastic APM defines some tags which have special meaning and which will not be stored as regular tags. Instead, they will be used to set certain metadata on the transaction or span. + +The following tags have special meaning for both transactions and spans: + +* `type` - sets the type of the transaction or span, for example `request` for transactions or `db.mysql.query` for spans + +The following tags only have special meaning on the span if the underlying Elastic APM object is a transaction: + +* `result` - sets the result of the transaction (defaults to `success`) +* `error` - sets the result of the transaction to `error` if the tag value is `true` (defaults to `success`) +* `http.status_code` - sets the result of the transaction. E.g. If the tag value is `200`, the transaction result will be set to `HTTP 2xx` (defaults to `success`) +* `user.id` - sets the user id, appears in the "User" tab in the transaction details in the Elastic APM app +* `user.email` - sets the user email, appears in the "User" tab in the transaction details in the Elastic APM app +* `user.username` - sets the user name, appears in the "User" tab in the transaction details in the Elastic APM app + + +## Caveats [ot-caveats] + +Not all features of the OpenTracing API are supported. + + +### Context propagation [ot-propagation] + +This bridge only supports the formats `opentracing.FORMAT_TEXT_MAP` and `opentracing.FORMAT_HTTP_HEADERS`. `opentracing.FORMAT_BINARY` is currently not supported. + + +### Span References [ot-references] + +Currently, this bridge only supports `opentracing.REFERENCE_CHILD_OF` references. Other references, like `opentracing.REFERENCE_FOLLOWS_FROM`, are not supported yet. + + +### Baggage [ot-baggage] + +The `span.setBaggageItem()` method is not supported. Baggage items are silently dropped. + + +### Logs [ot-logs] + +Only error logging is supported. Logging an Error object on the OpenTracing span will create an Elastic APM [error](docs-content://solutions/observability/apm/errors.md). Example: + +```js +const err = new Error('boom!') + +span.log({ + event: 'error', + 'error.object': err +}) +``` + +Other logs are silently dropped. diff --git a/docs/reference/performance-tuning.md b/docs/reference/performance-tuning.md new file mode 100644 index 0000000000..858146ba9f --- /dev/null +++ b/docs/reference/performance-tuning.md @@ -0,0 +1,97 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/performance-tuning.html +--- + +# Performance Tuning [performance-tuning] + +The Node.js APM agent offers a variety of [configuration options](/reference/configuration.md), some of which can have a significant impact on performance. Areas where APM agent overhead might be seen are: CPU, memory, network, latency, and storage. This document discusses the options most significant for performance tuning the APM agent. + + +## Sample rate [performance-sampling] + +The *sample rate* is the percentage of incoming requests that are recorded and sent to the APM Server. This is controlled by the [`transactionSampleRate`](/reference/configuration.md#transaction-sample-rate) configuration option. By default *all* requests are traced (`transactionSampleRate: 1.0`). + +The amount of work the APM agent needs to do, generally scales linearly with the number of traced requests. Therefore, the sample rate impacts CPU, memory, network, and storage overhead. + +Applications with a high request rate and/or many spans per incoming request may want to lower the the sampling rate. For example, see the example below to trace 20% of incoming requests. Note that incoming HTTP requests that are part of a [distributed trace](/reference/distributed-tracing.md) already have the sampling decision made — the `traceparent` header includes a [sampled flag](https://w3c.github.io/trace-context/#sampled-flag). In these cases the `transactionSampleRate` setting will not apply. + +```js +require('elastic-apm-node').start({ + transactionSampleRate: 0.2 // sample 20% of incoming requests +}) +``` + + +## Stack Traces [performance-stack-traces] + +When the APM agent captures an error, it records its stack trace for later analysis and viewing. Optionally, the APM agent can also record a stack trace for captured **spans**. Stack traces can have a significant impact on CPU and memory usage of the agent. There are several settings to adjust how they are used. + + +### Span Stack Traces [performance-span-stack-traces] + +The [`spanStackTraceMinDuration`](/reference/configuration.md#span-stack-trace-min-duration) configuration option controls if stack traces are never captured for spans (the default), always captured for spans, or only captured for spans that are longer than a given duration. In a complex application, a traced request may capture many spans. Capturing and sending a stack trace for every span can result in significant CPU and memory usage. + +It is because of the possibility of this CPU overhead that the APM Agent disables stack trace collection for *spans* by default. Unfortunately, even the capturing of raw stack trace data at span creation and then throwing that away for fast spans can have significant CPU overhead for heavily loaded applications. Therefore, care must be taken before using `spanStackTraceMinDuration`. + + +### Stack Trace Source Lines [performance-source-lines] + +If you want to keep span stack traces enabled for context, the next thing to try is adjusting how many source lines are reported for each stack trace. When a stack trace is captured, the agent will also capture several lines of source code around each stack frame location in the stack trace. + +The are four different settings to control this behaviour: + +* [`sourceLinesErrorAppFrames`](/reference/configuration.md#source-context-error-app-frames) +* [`sourceLinesErrorLibraryFrames`](/reference/configuration.md#source-context-error-library-frames) +* [`sourceLinesSpanAppFrames`](/reference/configuration.md#source-context-span-app-frames) +* [`sourceLinesSpanLibraryFrames`](/reference/configuration.md#source-context-span-library-frames) + +Source line settings are divided into app frames representing your app code and library frames representing the code of your dependencies. App and library categories are both split into error and span groups. Spans, by default, do not capture source lines. Errors, by default, will capture five lines of code around each stack frame. + +Source lines are cached in-process. In memory-constrained environments, the source line cache may use more memory than desired. Turning the limits down will help prevent excessive memory use. + + +### Stack Frame Limit [performance-stack-frame-limit] + +The [`stackTraceLimit`](/reference/configuration.md#stack-trace-limit) configuration option controls how many stack frames are captured when producing an `Error` instance of any kind. A large value may impact CPU and memory overhead of the agent. + + +### Error Log Stack Traces [performance-error-log-stack-traces] + +Most stack traces recorded by the agent will point to where the error was instantiated, not where it was identified and reported to the agent with [`captureError`](/reference/agent-api.md#apm-capture-error). For this reason, the agent also has the [`captureErrorLogStackTraces`](/reference/configuration.md#capture-error-log-stack-traces) setting to enable capturing an additional stack trace pointing to the place an error was reported to the agent. By default, it will only capture the stack trace to the reporting point when [`captureError`](/reference/agent-api.md#apm-capture-error) is called with a string message. + +Setting this to `always` will increase memory and bandwidth usage, so it helps to consider how frequently the app may capture errors. + + +## Spans [performance-transaction-max-spans] + +The [`transactionMaxSpans`](/reference/configuration.md#transaction-max-spans) setting limits the number of spans which may be recorded within a single transaction before remaining spans are dropped. + +Spans may include many things such as a stack trace and context data. Limiting the number of spans that may be recorded will reduce memory usage. + +Reducing max spans could result in loss of useful data about what occurred within a request, if it is set too low. + +An alternative to limiting the maximum number of spans can be to drop spans with a very short duration, as those might not be that relevant. + +This, however, both reduces the amount of storage needed to store the spans in Elasticsearch, and the bandwidth needed to transport the data to the APM Server from the instrumented application. + +This can be implemented by providing a span-filter: + +```js +agent.addSpanFilter(payload => { + return payload.duration < 10 ? null : payload +}) +``` + +::::{note} +Using a span filter does not reduce the load of recording the spans in your application, but merely filters them out before sending them to the APM Server. +:::: + + + +## Max queue size [performance-max-queue-size] + +The APM agent uses a persistent outgoing HTTP request (periodically refreshed) to stream data to the APM Server. If either the APM agent cannot keep up with events (transactions, spans, errors, and metricsets) from the application or if the APM Server is slow or not responding, then the agent will buffer events. If the buffer exceeds [`maxQueueSize`](/reference/configuration.md#max-queue-size), then events are dropped to limit memory usage of the agent. + +A lower value for `maxQueueSize` will decrease the heap overhead (and possibly the CPU usage) of the agent, while a higher value makes it less likely to lose events in case of a temporary spike in throughput. + diff --git a/docs/reference/restify.md b/docs/reference/restify.md new file mode 100644 index 0000000000..2d95ad524a --- /dev/null +++ b/docs/reference/restify.md @@ -0,0 +1,145 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/restify.html +--- + +# Get started with Restify [restify] + +Getting Elastic APM set up for your Restify app is easy, and there are various ways you can tweak it to fit your needs. Follow the guide below to get started, and for more advanced topics, check out the [API Reference](/reference/api.md). + + +## Installation [restify-installation] + +Add the `elastic-apm-node` module as a dependency to your application: + +```bash +npm install elastic-apm-node --save +``` + + +## Initialization [restify-initialization] + +It’s important that the agent is started before you require **any** other modules in your Node.js application - i.e. before `restify`, `http`, etc. + +This means that you should probably require and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). + +Here’s a simple Restify example with the Elastic APM agent installed: + +```js +// Add this to the VERY top of the first file loaded in your app +const apm = require('elastic-apm-node').start({ + // Override service name from package.json + // Allowed characters: a-z, A-Z, 0-9, -, _, and space + serviceName: '', + + // Use if APM Server requires a token + secretToken: '', + + // Use if APM Server uses API keys for authentication + apiKey: '', + + // Set custom APM Server URL (default: http://127.0.0.1:8200) + serverUrl: '', +}) + +const restify = require('restify') + +const app = restify.createServer() + +app.get('/hello/:name', function (req, res, next) { + res.send('hello ' + req.params.name) + next() +}) + +app.listen(3000) +``` + +The agent will now monitor the performance of your Restify application and record any uncaught exceptions. + + +### Advanced configuration [restify-advanced-configuration] + +In the above example we initialize the agent by calling the [`start()`](/reference/agent-api.md#apm-start) function. This function takes an optional options object used to configure the agent. Any option not supplied via the options object can instead be configured using environment variables. So if you prefer, you can set the same configuration options using environment variables: + +```bash +ELASTIC_APM_SERVICE_NAME= +ELASTIC_APM_SECRET_TOKEN= +ELASTIC_APM_SERVER_URL= +``` + +And then just start the agent like so: + +```js +// Start the agent before any thing else in your app +var apm = require('elastic-apm-node').start() +``` + +See all possible ways to configure the agent [in the API documentation](/reference/configuring-agent.md). + + +### Full documentation [restify-full-documentation] + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + + +## Performance monitoring [restify-performance-monitoring] + +Elastic APM automatically measures the performance of your Restify application. It records spans for database queries, external HTTP requests, and other slow operations that happen during requests to your Restify app. + +By default, the agent will instrument [the most common modules](/reference/supported-technologies.md). To instrument other events, you can use custom spans. For information about custom spans, see the [Custom Spans section](/reference/custom-spans.md). + +Spans are grouped in transactions - by default one for each incoming HTTP request. But it’s possible to create custom transactions not associated with an HTTP request. See the [Custom Transactions section](/reference/custom-transactions.md) for details. + + +### Unknown routes [restify-unknown-routes] + +When viewing the performance metrics of your application in Elastic APM, you might see some transactions named "unknown route". This indicates that the agent detected an incoming HTTP request to your application, but didn’t know which route in your Restify app the HTTP request matched. + +This might simply be 404 requests, which by definition don’t match any route, or it might be a symptom that the agent wasn’t installed correctly. If you see this or can’t get any meaningful metrics to show up, please follow the [Troubleshooting Guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + + +## Error logging [restify-error-logging] + +By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. But in most cases, errors are not thrown but returned via a callback, caught by a promise, or simply manually created. Those errors will not automatically be sent to Elastic APM. To manually send an error to Elastic APM, simply call `apm.captureError()` with the error: + +```js +var err = new Error('Ups, something broke!') + +apm.captureError(err) +``` + +For advanced logging of errors, including adding extra metadata to the error, see [the API documentation](/reference/agent-api.md#apm-capture-error). + + +## Filter sensitive information [restify-filter-sensitive-information] + +By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. + +It’s possible for you to tweak these defaults or remove any information you don’t want to send to Elastic APM: + +* By default, the Node.js agent will not log the body of HTTP requests. To enable this, use the [`captureBody`](/reference/configuration.md#capture-body) config option +* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. To disable this, use the [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) config option +* To apply custom filters, use one of the [filtering](/reference/agent-api.md#apm-add-filter) functions + + +## Add your own data [restify-add-your-own-data] + +The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. + +But in many cases, information about the HTTP request itself isn’t enough. To add even more metadata to errors and transactions, use one of the functions below: + +* [`apm.setUserContext()`](/reference/agent-api.md#apm-set-user-context) - Call this to enrich collected performance data and errors with information about the user/client +* [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context) - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) +* [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) + + +## Compatibility [restify-compatibility] + +See [*Supported technologies*](/reference/supported-technologies.md) for details. + + +## Troubleshooting [restify-troubleshooting] + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/set-up.md b/docs/reference/set-up.md new file mode 100644 index 0000000000..5f09fc23d3 --- /dev/null +++ b/docs/reference/set-up.md @@ -0,0 +1,41 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/set-up.html +--- + +# Set up the Agent [set-up] + +To get you off the ground, we’ve prepared guides for setting up the Agent with a few different popular web frameworks and technologies: + +* [Monitoring AWS Lambda Node.js Functions](/reference/lambda.md) +* [Monitoring Node.js Azure Functions](/reference/azure-functions.md) +* [Get started with Express](/reference/express.md) +* [Get started with Fastify](/reference/fastify.md) +* [Get started with hapi](/reference/hapi.md) +* [Get started with Koa](/reference/koa.md) +* [Get started with Next.js](/reference/nextjs.md) +* [Get started with Restify](/reference/restify.md) +* [Get started with TypeScript](/reference/typescript.md) + +Alternatively, you can [Get started with a custom Node.js stack](/reference/custom-stack.md). For Kubernetes, we support auto-attachment using the [APM attacher](apm-k8s-attacher://reference/index.md). + +To see an overview of which components of your application we instrument automatically, use the [*Supported technologies*](/reference/supported-technologies.md) page. + +Other useful documentation includes: + +* [Starting the agent](/reference/starting-agent.md) +* [*Configuration*](/reference/advanced-setup.md) +* [*API Reference*](/reference/api.md) +* [*Troubleshooting*](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md) + + + + + + + + + + + + diff --git a/docs/reference/source-maps.md b/docs/reference/source-maps.md new file mode 100644 index 0000000000..1cf3e5efd5 --- /dev/null +++ b/docs/reference/source-maps.md @@ -0,0 +1,37 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/source-maps.html +--- + +# Source map support [source-maps] + +The Elastic APM Node.js agent supports source maps by default. If you transpile your source code and supply a source map, the agent will be able to collect the correct stack traces and even the original source code if available. + +To take advantage of this, simply make sure that your transpiled source code contains a `sourceMappingURL` comment at the bottom of each JavaScript file. It can either point to a source map file on disk: + +```js +//# sourceMappingURL=/path/to/file.js.map +``` + +Or you can inline the source map using base64 encoding: + +```js +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyJmb28uanMiLCJiYXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O1VBQ0c7Ozs7Ozs7Ozs7Ozs7O3NCQ0RIO3NCQUNBIn0= +``` + +All modern build toolchains support generating source maps and adding these comments to the transpiled source code. + + +## Original source code [original-source-code] + +Elastic APM uses source maps for two purposes: to collect stack traces that point to your original source code, *and* to collect the original source code as inline code snippets related to each frame in your stack traces. + +For optimal support, we recommend that you either inline the original source code using the `sourcesContent` property inside the source map, or that you deploy the original source code to your production server along with the transpiled source code. + +If you choose to deploy the original source code, make sure that it’s accessible via the file system at the path specified with the `sourceRoot` property in the source map. + + +## Public access? [public-access] + +Your source maps or original source code **does not** need to be available via the internet. Everything is handled by the local Node.js agent on your server. + diff --git a/docs/reference/span-api.md b/docs/reference/span-api.md new file mode 100644 index 0000000000..a790c5c456 --- /dev/null +++ b/docs/reference/span-api.md @@ -0,0 +1,215 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/span-api.html +--- + +# Span API [span-api] + +A span measures the duration of a single event. When a span is created it will measure the time until [`span.end()`](#span-end) is called. + +To get a `Span` object, you need to call [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). + +To see an example of using custom spans, see the [Custom Spans in Node.js](/reference/custom-spans.md) article. + +## `span.transaction` [span-transaction] + +Added in: v0.1.0 + +* **Type:** Transaction + +A reference to the parent transaction object. + +All spans belong to a transaction. + + +## `span.name` [span-name] + +Added in: v0.1.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `unnamed` + +The name of the span. This can also be set via [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). + + +## `span.type` [span-type] + +Added in: v0.1.0 + +Split components into `type`, `subtype` and `action` in: v3.0.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The type of span. This can also be set via [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). + +The type is used to group similar spans together. For instance, all spans of MySQL queries are given the type `db`, with a subtype of `mysql` and an action of `query`. + +In the above example, `db` is considered the type. Though there are no naming restrictions for the type, the following are standardized across all Elastic APM agents: `app`, `db`, `cache`, `template`, and `ext`. + + +## `span.subtype` [span-subtype] + +Added in: v0.1.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The subtype of the span. This can also be set via [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). + +The subtype is typically the name of a module or library. For example, MySQL queries have a subtype of `mysql`. + + +## `span.action` [span-action] + +Added in: v0.1.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The action of the span. This can also be set via [`apm.startSpan()`](/reference/agent-api.md#apm-start-span). + +The action is typically a specific function name or a general description of specific functionality. For example, a database query would generally have an action of `query`. + + +## `span.traceparent` [span-traceparent] + +Added in: v2.9.0 + +Get the serialized traceparent string of the span. + + +## `span.setLabel(name, value[, stringify = true])` [span-set-label] + +Added in: v2.1.0
Renamed from `span.setTag()` to `span.setLabel()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch +* `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +span.setLabel('productId', 42, false); +``` + +Set a label on the span. You can set multiple labels on the same span. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `span.addLabels({ [name]: value }[, stringify = true])` [span-add-labels] + +Added in: v2.1.0
Renamed from `span.addTags()` to `span.addLabels()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `labels` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Contains key/value pairs: + + * `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch + * `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. + +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +span.addLabels({productId: 42, productName: 'butter'}, false); +``` + +Add several labels on the span. You can add labels multiple times. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `span.ids` [span-ids] + +Added in: v2.17.0 + +Produces an object containing `span.id` and `trace.id`. This enables log correlation to APM traces with structured loggers. + +```js +{ + "trace.id": "abc123", + "span.id": "abc123" +} +``` + + +## `span.end([endTime])` [span-end] + +Added in: v0.1.0 + +* `endTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the span ended. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + +End the span. If the span has already ended, nothing happens. + + +## `span.outcome` [span-outcome] + +Added in: v3.12.0 + +The Node.js agent automatically sets an `outcome` property on spans. This property will be one of three values: + +* `success`: Indicates the span’s operation was a success. +* `failure`: Indicates the span’s operation was *not* a success. +* `unknown`: Indicates the agent was unable to determine whether the span’s operation was a success or not. An `unknown` outcome removes a transaction from error rate considerations. + +What constitutes a success or failure will depend on the span type. + +For the general case, a span’s outcome is considered a failure if the Node.js agent captures an error during the execution of the work a span represents. + +However, for exit spans that represent an HTTP request, the `outcome` is based on the status code of the HTTP response. A status code less than `400` is considered a success. A status code greater or equal to `400` is considered a failure. + + +## `span.setOutcome(outcome)` [span-setoutcome] + +Added in: v3.12.0 + +* `outcome` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) + +The `setOutcome` method allows an end user to override the Node.js agent’s default setting of a span’s `outcome` property. The `setOutcome` method accepts a string of either `success`, `failure`, or `unknown`, and will force the agent to report this value for a specific span. + + +## `span.setServiceTarget(type, name)` [span-setservicetarget] + +Added in: v3.39.0 + +* `type` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | null The target service type, usually the same value as `span.subtype`, e.g. "mysql". +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | null The target service name, an optional scoping of the service. For databases it is typically the database name. + +Manually set the `service.target.type` and `service.target.name` fields that identify a downstream service. They are used for [Service Maps](docs-content://solutions/observability/apm/service-map.md) and [Dependencies](docs-content://solutions/observability/apm/dependencies.md) in the Kibana APM app. The values are only used for "exit" spans — spans representing outgoing communication, marked with `exitSpan: true` at span creation. + +If false-y values (e.g. `null`) are given for both `type` and `name`, then `service.target` will explicitly be excluded from this span. This may impact Service Maps and other Kibana APM app reporting for this service. + +If this method is not called, the service target values are inferred from other span fields ([spec](https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans-service-target.md#field-values)). + +`service.target.*` fields are ignored for APM Server before v8.3. + + +## `span.addLink(link)` [span-addlink] + +Added in: v4.7.0 + +* `link` `{{type-link}}` + +A span can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `link` argument is an object with a single "context" field that is a `Transaction`, `Span`, OpenTelemetry `SpanContext` object, or W3C trace-context *traceparent* string. For example: `span.addLink({ context: anotherSpan })`. + + +## `span.addLinks([links])` [span-addlinks] + +Added in: v4.7.0 + +* `links` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) Span links. + +Add span links to this span. + +A span can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `link` argument is an object with a single "context" field that is a `Transaction`, `Span`, OpenTelemetry `SpanContext` object, or W3C trace-context *traceparent* string. For example: `span.addLinks([{ context: anotherSpan }])`. + + diff --git a/docs/reference/starting-agent.md b/docs/reference/starting-agent.md new file mode 100644 index 0000000000..e53430a8b7 --- /dev/null +++ b/docs/reference/starting-agent.md @@ -0,0 +1,260 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/starting-the-agent.html +--- + +# Starting the agent [starting-the-agent] + +There are a few ways to start the Node.js APM agent. Choose the one that works best for you. The most important considerations for selecting a method are: + +* ensuring the APM agent starts early enough, and +* having a convenient way to configure the agent. + +For the Node.js APM agent to be able to fully function, it **must be started before `require(...)` statements for other modules**. The APM agent automatically instruments modules by interposing itself in the import process. If a given module is imported before the APM agent has started, then it won’t be able to instrument that module. + +## Start methods [_start_methods] + +### `require('elastic-apm-node').start(...)` [start-option-require-and-start] + +The most common way to start the APM agent is to require the `elastic-apm-node` module and call the [`.start()`](/reference/agent-api.md#apm-start) method at the top of your main module. This allows you to use any of the methods to [configure the agent](/reference/configuring-agent.md). + +```js +const apm = require('elastic-apm-node').start({ + // Add configuration options here. +}); + +// Application main code goes here. +``` + + +### `require('elastic-apm-node/start')` [start-option-require-start-module] + +Another way to start the agent is with the `elastic-apm-node/start` module that imports and *starts* the agent. + +```js +const apm = require('elastic-apm-node/start'); + +// Application main code goes here. +``` + +This start method exists for those that use a tool like Babel or esbuild to translate/transpile from code using ES modules (as in the following example) to code using CommonJS. It ensures that the APM agent is started before other imports in the same file. See [Hoisted ES module imports](#start-esm-imports) below for details. + +```js +import 'elastic-apm-node/start.js'; + +// Application main code goes here. +``` + +A limitation of this approach is that you cannot configure the agent with an options object, but instead have to rely on [one of the other methods of configuration](/reference/configuring-agent.md), such as setting `ELASTIC_APM_...` environment variables. + +Note: As of elastic-apm-node version 3.47.0, the "elastic-apm-node/start.js" will **not start the agent in a Node.js Worker thread.** + + +### `node -r elastic-apm-node/start.js ...` [start-option-node-require-opt] + +Another way to start the agent is with the `-r elastic-apm-node/start.js` [command line option to `node`](https://nodejs.org/api/cli.md#-r---require-module). This will load and start the APM agent before your application code starts. This method allows you to enable the agent *without touching any code*. This is the recommended start method for [monitoring AWS Lambda functions](/reference/lambda.md) and for tracing [a Next.js server](/reference/nextjs.md). + +```bash +node -r elastic-apm-node/start.js app.js +``` + +The `-r, --require` option can also be specified via the [`NODE_OPTIONS` environment variable](https://nodejs.org/api/cli.md#node_optionsoptions): + +```bash +# export ELASTIC_APM_... # Configure the agent with envvars. +export NODE_OPTIONS='-r elastic-apm-node/start.js' +node app.js +``` + +Note: As of elastic-apm-node version 3.47.0, the "elastic-apm-node/start.js" will **not start the agent in a [Node.js Worker thread](https://nodejs.org/api/worker_threads.md).** New Worker threads inherit the `process.execArgv` and environment, so "elastic-apm-node/start.js" is executed again. Starting a new APM agent in each Worker thread because of "start.js" is deemed surprise, so is disabled for now. + + +### Separate APM init module [start-option-separate-init-module] + +If you want to avoid [the gotcha with hoisted ES modules](#start-esm-imports) but still want the flexibility of passing a config object to the [agent start method](/reference/agent-api.md#apm-start), then a good option is to write a separate JavaScript or TypeScript module that starts the agent, and import **that** init module at the top of your main file. For example: + +```ts +// initapm.ts +import apm from 'elastic-apm-node'; +apm.start({ + serverUrl: 'https://...', + secretToken: '...', + // ... +}); +``` + +```ts +// main.ts +import './initapm.js'; + +// Application code starts here. +``` + + + +## Start gotchas [start-gotchas] + +This section shows some sometimes subtle surprises starting the APM agent with some technologies. A general troubleshooting tip for using the agent with any build tool/system that produces compiled JavaScript is to look at the compiled JavaScript to see what is actually being executed by `node`. + +### Hoisted ES module imports [start-esm-imports] + +When using a tool like Babel or esbuild to translate/transpile from code using ES modules (i.e. `import ...` statements) to code using CommonJS (i.e. `require(...)`), all imports are "hoisted" to the top of a module, properly following ECMAScript module (ESM) semantics. This means the `apm.start()` method is called too late—**after** the `http` module has been imported. + +For example, running Babel on the following code does not initiate APM early enough: + +```js +import apm from 'elastic-apm-node'; +apm.start() // This does not work. + +import http from 'http'; +// ... +``` + +Babel translates this to the equivalent of: + +```js +var apm = require('elastic-apm-node'); +var http = require('http'); +apm.start() // This is started too late. +// ... +``` + +The [the `elastic-apm-node/start` module](#start-option-require-start-module) fixes this problem. The following will work: + +```js +import 'elastic-apm-node/start'; // This works. +import http from 'http'; +// ... +``` + +A more complete example using Babel is [here](https://github.com/elastic/apm-agent-nodejs/tree/main/test/babel). + +The same is true for ES module usage translated by esbuild (as explained well in [the esbuild docs here](https://esbuild.github.io/content-types/#real-esm-imports)). Notably, TypeScript does *not* following ECMAScript module semantics in this regard. + +Another good option is [to use a separate APM init module](#start-option-separate-init-module) and import that first. + + +### TypeScript gotcha [start-typescript] + +TypeScript is a language that compiles to JavaScript, via the `tsc` TypeScript compiler, and is then executed via `node` (or some other JavaScript interpreter). Sometimes the produced JavaScript has a gotcha for using this APM agent. TypeScript assumes that module imports do not have side-effects, so it will [elide the following import](https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-imports-being-elided-in-my-emit) if the `apm` variable is not used: + +```js +import apm from 'elastic-apm-node/start'; // Be careful +``` + +One can avoid that elision with: + +```js +import 'elastic-apm-node/start'; +``` + +Or with something like this: + +```js +import apm from 'elastic-apm-node/start'; apm; // Ensure import is kept for its side-effect. +``` + +TypeScript 5.0 [introduced a `--verbatimModuleSyntax`](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#verbatimmodulesyntax) option that avoids this elision. + + +### Bundlers and APM [start-bundlers] + +JavaScript Bundlers are tools that bundle up a number of JavaScript files into one, or a few, JavaScript files to be executed. Often they also include other features such as compilation (from newer to older JavaScript syntax, from TypeScript), tree-shaking (removing sections of code that are unused), minifying, bundling of CSS/images, etc. There are many bundler tools, including: [Webpack](https://webpack.js.org/), [esbuild](https://esbuild.github.io/), [Rollup](https://rollupjs.org/), [Parcel](https://parceljs.org/). + +The main use case for bundlers is for improving performance in *browser apps*, where reducing the size and number of separate files helps with network and CPU overhead. The use case is typically less strong for server-side JavaScript code executed with `node`. However, some tooling will use bundlers for server-side JavaScript, not necessarily for the *bundling* but for some of the other features. + +Unfortunately, **using a bundler typically breaks the APM agent**. Bundling multiple modules into a single file necessarily means replacing `require(...)` calls with custom bundler code that handles returning the module object. But the APM agent relies on those `require(...)` calls to instrument a module. There is no automatic fix for this. The workaround is to: + +1. exclude the `elastic-apm-node` APM agent module from the bundle; and +2. optionally exclude other modules from the bundle that you would like the APM agent to instrument. + +"Excluding" a module *foo* from the bundle (Webpack calls these "externals") means that a `require('foo')` expects "node_modules/foo/…​" to exist at runtime. This means that you need to deploy both your bundle file(s) *and* the excluded modules. This may or may not defeat your reasons for using a bundler. + +The rest of this section shows how to configure externals with various bundlers. If you know of a mechanism for a bundler that we haven’t documented, please [let us know.](https://github.com/elastic/apm-agent-nodejs/blob/main/CONTRIBUTING.md#contributing-to-the-apm-agent) + + +### Webpack [start-webpack] + +Webpack supports ["externals"](https://webpack.js.org/configuration/externals/) configuration options to exclude specific modules from its bundle. At a minimum, the *elastic-apm-agent* module must be made external. In addition, any modules that you want the APM agent to instrument (e.g. a database client) must also be made external. The easiest way to do this is to **use the [*webpack-node-externals*](https://github.com/liady/webpack-node-externals) module to make all of "node_modules/…​" external**. + +For webpack@5 ensure your "webpack.config.js" has the following: + +```js +const nodeExternals = require('webpack-node-externals'); + +module.exports = { + // ... + + // Set these so Webpack emits code using Node's CommonJS + // require functions and knows to use Node's core modules. + target: 'node', + externalsPresets: { + node: true + }, + + // This tells Webpack to make everything under + // "node_modules/" external. + externals: [nodeExternals()], +}; +``` + +For webpack@4, the `externalsPresets` config var does not exist, so use: + +```js +const nodeExternals = require('webpack-node-externals'); + +module.exports = { + // ... + + target: 'node', + externals: [nodeExternals()], +}; +``` + + +### esbuild [start-esbuild] + +Esbuild supports marking modules/files as ["external"](https://esbuild.github.io/api/#external) to the bundle. At a minimum, the *elastic-apm-agent* module must be made external for the APM agent to work. In addition, any modules that you want the APM agent to instrument (e.g. a database client) must also be made external. + +Here is an example build script for "package.json" to bundle a Node.js application (with "src/index.js" as the entry point, targetting node v14.x, and ensuring that the `pg` PostgreSQL module is instrumented): + +```json +{ + "scripts": { + "build": "esbuild src/index.js --outdir=dist --bundle --sourcemap --minify --platform=node --target=node14 --external:elastic-apm-node --external:pg" + } +} +``` + +This can be invoked via: + +```bash +npm run build +``` + +Or the esbuild configuration can be put into a build script and invoked via `node esbuild.build.js`. + +```js +// esbuild.build.js +require('esbuild').build({ + entryPoints: ['./src/index.js'], + outdir: 'dist', + bundle: true, + platform: 'node', + target: 'node14', + sourcemap: true, + minify: true, + external: ['elastic-apm-node', 'pg'] +}).catch(() => process.exit(1)) +``` + +An alternative to manually listing specific dependencies as "external" is to use the following esbuild option to exclude **all** dependencies: + +```bash +esbuild ... --external:'./node_modules/*' +``` + +A more complete example using esbuild and the APM agent is [here](https://github.com/elastic/apm-agent-nodejs/tree/main/examples/esbuild/). + + + diff --git a/docs/reference/supported-technologies.md b/docs/reference/supported-technologies.md new file mode 100644 index 0000000000..57c4555918 --- /dev/null +++ b/docs/reference/supported-technologies.md @@ -0,0 +1,138 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/supported-technologies.html +--- + +# Supported technologies [supported-technologies] + +The Elastic APM Node.js Agent automatically instruments various APIs in Node.js core and third-party frameworks and packages. This page lists all supported technologies and version ranges. + + +## Node.js versions [compatibility-node] + +Support for the Elastic APM Node.js agent follows the [support schedule of Node.js itself](https://nodejs.org/en/about/releases/) to the end-of-life period of each version after its maintenance term. Versions of Node.js past their end-of-life date are not supported. + +![Node.js release schedule](images/node_release_schedule.svg) + +APM agent 4.x releases work with Node.js versions 14.17.0 and later. APM agent 3.x maintenance releases work with Node.js versions 8.6 and later. We will only break support for older Node.js versions with a major version release of the APM agent. + + +## ECMAScript Modules (ESM) [compatibility-esm] + +Beginning with version v3.48.0, the Elastic APM Node.js agent includes *limited and experimental* support for instrumenting [ECMAScript module imports](https://nodejs.org/api/esm.html#modules-ecmascript-modules), i.e. modules that are loaded via `import ...` statements and `import('...')` (dynamic import). See the [*ECMAScript module support*](/reference/esm.md) document for details. + +Note: If you are using TypeScript or JavaScript that is *compiled/translated/transpiled to CommonJS-using JavaScript* via tools like Babel, Webpack, esbuild, etc., then using `import ...` in your source code is fine. To ensure your compiler is generating JS that uses CommonJS imports, use the following settings: + +* For TypeScript, use [`"module": "commonjs"` in your "tsconfig.json"](https://www.typescriptlang.org/tsconfig#module) (a [complete tsconfig.json example](https://github.com/tsconfig/bases/blob/main/bases/node16.json)). +* For Babel, use [`"modules": "commonjs"` in your Babel config](https://babeljs.io/docs/en/babel-preset-env#modules) ([for example](https://github.com/elastic/apm-agent-nodejs/blob/main/test/babel/.babelrc)). +* For Webpack, use `target: 'node', externalsPresets: { node: true }` in your "webpack.config.js". +* For esbuild, use `--platform=node --target=node...` options to `esbuild` ([for example](https://github.com/elastic/apm-agent-nodejs/blob/main/examples/esbuild/package.json#L7)). + + +## Elastic Stack Compatibility [elastic-stack-compatibility] + +This agent is compatible with [APM Server](docs-content://solutions/observability/apm/index.md) v6.6 and above. + + +## Frameworks [compatibility-frameworks] + +Though you can use Elastic APM [with any Node.js framework](/reference/custom-stack.md), we automate a few things for the most popular Node.js modules. These are the frameworks that we officially support: + +| Framework | Version | Note | +| --- | --- | --- | +| [AWS Lambda](/reference/lambda.md) | N/A | | +| [Azure Functions](/reference/azure-functions.md) | v3, v4 | [Node.js programming model v3 and v4](https://learn.microsoft.com/en-us/azure/azure-functions/functions-node-upgrade-v4) | +| [Express](/reference/express.md) | >=4.0.0 <6.0.0 | | +| [Fastify](/reference/fastify.md) | >=1.0.0 | See also [Fastify’s own LTS documentation](https://www.fastify.io/docs/latest/Reference/LTS/) | +| [@hapi/hapi](/reference/hapi.md) | >=17.9.0 <22.0.0 | | +| [Koa](/reference/koa.md) via koa-router or @koa/router | >=5.2.0 <14.0.0 | Koa doesn’t have a built in router, so we can’t support Koa directly since we rely on router information for full support. We currently support the most popular Koa router called [koa-router](https://github.com/koajs/koa-router). | +| [Next.js](/reference/nextjs.md) | >=12.0.0 <13.3.0 | (Technical Preview) This instruments Next.js routing to name transactions for incoming HTTP transactions; and reports errors in user pages. It supports the Next.js production server (`next start`) and development server (`next dev`). See the [Getting Started document](/reference/nextjs.md). | +| [Restify](/reference/restify.md) | >=5.2.0 <12.0.0 | | + + +## OpenTelemetry [compatibility-opentelemetry] + +The Node.js Elastic APM agent supports usage of the OpenTelemetry Tracing API via its [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md). As well, it instruments the OpenTelemetry Metrics API and Metrics SDK to allow [usage of the OpenTelemetry Metrics API](/reference/opentelemetry-bridge.md#otel-metrics-api). + +| Framework | Version | +| --- | --- | +| [@opentelemetry/api](/reference/opentelemetry-bridge.md) | >=1.0.0 <1.10.0 | +| [@opentelemetry/sdk-metrics](https://www.npmjs.com/package/@opentelemetry/sdk-metrics) | >=1.11.0 <2 | + + +## Custom Transactions [compatibility-custom-transactions] + +By default transactions are named based on their matched HTTP route if the framework used is listed above. These modules override that behavior to give better insights into specialized HTTP servers: + +| Module | Version | Note | +| --- | --- | --- | +| [express-graphql](https://www.npmjs.com/package/express-graphql) | >=0.6.1 <0.13.0 | Will name all transactions by the GraphQL query name. There is a [known issue with node <10.4](https://github.com/elastic/apm-agent-nodejs/issues/2516). This module is deprecated and is no longer tested. | +| [apollo-server-express](https://www.npmjs.com/package/apollo-server-express) | >=2.0.4 <4 | Will name all transactions by the GraphQL query name. Versions before 2.9.6 are no longer tested. | +| [@apollo/server](https://www.npmjs.com/package/@apollo/server) | >=4.0.0 | Will name all transactions by the GraphQL query name | + + +## Tracing and Instrumentation [compatibility-tracing-and-instrumentation] + +The Node.js agent will automatically instrument the following modules to give you detailed performance metrics: + +| Module | Version | Note | +| --- | --- | --- | +| [aws-sdk](https://www.npmjs.com/package/aws-sdk) | >=2.858.0 <3 | Will instrument SQS send/receive/delete messages, all S3 methods, all DynamoDB methods, and the SNS publish method | +| [@aws-sdk/client-s3](https://www.npmjs.com/package/@aws-sdk/client-s3) | >=3.15.0 <4 | Will instrument all S3 methods | +| [@aws-sdk/client-sns](https://www.npmjs.com/package/@aws-sdk/client-s3) | >=3.15.0 <4 | Will instrument the SNS publish method | +| [@aws-sdk/client-sqs](https://www.npmjs.com/package/@aws-sdk/client-s3) | >=3.15.0 <4 | Will instrument SQS send/receive/delete messages | +| [@aws-sdk/client-dynamodb](https://www.npmjs.com/package/@aws-sdk/client-dynamodb) | >=3.15.0 <4 | Will instrument all DynamoDB methods | +| [cassandra-driver](https://www.npmjs.com/package/cassandra-driver) | >=3.0.0 <5 | Will instrument all queries | +| [elasticsearch](https://www.npmjs.com/package/elasticsearch) | >=8.0.0 | Will instrument all queries | +| [@elastic/elasticsearch](https://www.npmjs.com/package/@elastic/elasticsearch) | >=7.0.0 <9.0.0 | Will instrument all queries | +| [graphql](https://www.npmjs.com/package/graphql) | >=0.7.0 <17 | Will instrument all queries | +| [handlebars](https://www.npmjs.com/package/handlebars) | * | Will instrument compile and render calls | +| [jade](https://www.npmjs.com/package/jade) | >=0.5.6 | Will instrument compile and render calls; Deprecated. No longer tested. Use pug. | +| [pug](https://www.npmjs.com/package/pug) | >=0.1.0 | Will instrument compile and render calls | +| [ioredis](https://www.npmjs.com/package/ioredis) | >=2.0.0 <6.0.0 | Will instrument all queries | +| [memcached](https://www.npmjs.com/package/memcached) | >=2.2.0 | Will instrument all commands. | +| [mongodb-core](https://www.npmjs.com/package/mongodb-core) | >=1.2.19 <4 | Will instrument all queries.A lot of higher level MongoDB modules use mongodb-core,so those should be supported as well. | +| [mongodb](https://www.npmjs.com/package/mongodb) | >=2.0.0 <3.3.0 | Supported via mongodb-core | +| [mongodb](https://www.npmjs.com/package/mongodb) | >=3.3.0 <7 | Will instrument all queries | +| [mongojs](https://www.npmjs.com/package/mongojs) | >=1.0.0 <2.7.0 | Supported via mongodb-core | +| [mongoose](https://www.npmjs.com/package/mongoose) | >=4.0.0 <5.7.0 | Supported via mongodb-core | +| [mongoose](https://www.npmjs.com/package/mongoose) | >=5.7.0 <8 | Supported via mongodb | +| [mysql](https://www.npmjs.com/package/mysql) | ^2.0.0 | Will instrument all queries | +| [mysql2](https://www.npmjs.com/package/mysql2) | >=1.0.0 <4.0.0 | Will instrument all queries | +| [pg](https://www.npmjs.com/package/pg) | >=4.0.0 <9.0.0 | Will instrument all queries | +| [redis](https://www.npmjs.com/package/redis) | >=2.0.0 <5.0.0 | Will instrument all queries | +| [tedious](https://www.npmjs.com/package/tedious) | >=1.9 <20.0.0 | (Excluding v4.0.0.) Will instrument all queries | +| [undici](https://www.npmjs.com/package/undici) | >=4.7.1 <8 | Will instrument undici HTTP requests, except HTTP CONNECT. Requires node v14.17.0 or later, or the user to have installed the [*diagnostics_channel* polyfill](https://www.npmjs.com/package/diagnostics_channel). | +| [ws](https://www.npmjs.com/package/ws) | >=1.0.0 <8.0.0 | Will instrument outgoing WebSocket messages | +| [kafkajs](https://www.npmjs.com/package/kafkajs) | >=2.0.0 <3.0.0 | Will instrument all send methods for producers and message and batch processing for consumers. | + + +## Better Stack Traces [compatibility-better-stack-traces] + +The APM agent [can be configured](/reference/configuration.md#span-stack-trace-min-duration) to capture span stack traces, to show where in your code a span (e.g. for a database query) was initiated. + +Given the async nature of Node.js, it’s not possible for the APM agent to see further back than the last async boundary. Modules that happen to have an async boundary between a call from your application code and the action that leads to an APM span will limit the utility of these span stack traces. + +The modules listed below are those that the APM agent instruments to provide more useful span stack traces — ones that point to your application code — when enabled. + +If you don’t see your own code in spans, please create a new topic in the [Elastic APM discuss forum](https://discuss.elastic.co/c/apm) and include information about your dependencies. + +| Module | Version | Note | +| --- | --- | --- | +| [knex](https://www.npmjs.com/package/knex) | >=0.10.0 <4.0.0 | Provides better span stack traces for *pg* and *mysql* spans. | + + +## Continuity [compatibility-continuity] + +The Elastic APM agent monitors async operations in your Node.js application to maintain awareness of which request is the active request at any given time. Certain modules can interfere with this monitoring if not handled properly. + +Below is a list of modules known to cause issues with this monitoring. The versions listed are the versions we support. If you use an unsupported version you might experience missing spans. This does not impact the stability of your application in any way - only the collected metrics. + +If you do experience missing spans in your performance metrics, please create a new topic in the [Elastic APM discuss forum](https://discuss.elastic.co/c/apm) and include information about your dependencies and what data is missing. + +| Module | Version | Note | +| --- | --- | --- | +| [bluebird](https://www.npmjs.com/package/bluebird) | >=2.0.0 <4.0.0 | | +| [generic-pool](https://www.npmjs.com/package/generic-pool) | ^2.0.0 || ^3.1.0 | Usedby a lot of database modules like for instance "pg" | +| [express-queue](https://www.npmjs.com/package/express-queue) | >=0.0.11 <1.0.0 | | + diff --git a/docs/reference/toc.yml b/docs/reference/toc.yml new file mode 100644 index 0000000000..b7c7bee090 --- /dev/null +++ b/docs/reference/toc.yml @@ -0,0 +1,43 @@ +project: 'APM Node.js agent reference' +toc: + - file: index.md + - file: set-up.md + children: + - file: lambda.md + - file: azure-functions.md + - file: express.md + - file: fastify.md + - file: hapi.md + - file: koa.md + - file: nextjs.md + - file: restify.md + - file: typescript.md + - file: custom-stack.md + - file: starting-agent.md + - file: supported-technologies.md + - file: advanced-setup.md + children: + - file: configuring-agent.md + - file: configuration.md + - file: custom-transactions.md + - file: custom-spans.md + - file: api.md + children: + - file: agent-api.md + - file: transaction-api.md + - file: span-api.md + - file: metrics.md + - file: logs.md + - file: opentelemetry-bridge.md + - file: opentracing.md + - file: source-maps.md + - file: esm.md + - file: distributed-tracing.md + - file: message-queues.md + - file: performance-tuning.md + - file: upgrading.md + children: + - file: upgrade-to-v4.md + - file: upgrade-to-v3.md + - file: upgrade-to-v2.md + - file: upgrade-to-v1.md \ No newline at end of file diff --git a/docs/reference/transaction-api.md b/docs/reference/transaction-api.md new file mode 100644 index 0000000000..165c3f1531 --- /dev/null +++ b/docs/reference/transaction-api.md @@ -0,0 +1,243 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/transaction-api.html +--- + +# Transaction API [transaction-api] + +A transaction groups multiple spans in a logical group. + +To get a `Transaction` object, you need to call [`apm.startTransaction()`](/reference/agent-api.md#apm-start-transaction). + +To see an example of using custom transactions, see the [Custom Transactions in Node.js](/reference/custom-transactions.md) article. + +## `transaction.name` [transaction-name] + +Added in: v0.1.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `unnamed` + +The name of the transaction. + +Can be used to set or overwrite the name of the transaction (visible in the performance monitoring breakdown). If you don’t have access to the current transaction, you can also set the name using [`apm.setTransactionName()`](/reference/agent-api.md#apm-set-transaction-name). + +Transactions with the same name and [type](#transaction-type) are grouped together. + + +## `transaction.type` [transaction-type] + +Added in: v0.1.0 + +Split components into `type`, `subtype` and `action` in: v3.0.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The type of the transaction. + +There’s a special type called `request` which is used by the agent for the transactions automatically created when an incoming HTTP request is detected. + + +## `transaction.subtype` [v3.25.0] [transaction-subtype] + +Added in: v3.0.0
Deprecated in: v3.25.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The subtype of the transaction. The transaction `subtype` field is deprecated: it is not used and will be removed in the next major version. + + +## `transaction.action` [v3.25.0] [transaction-action] + +Added in: v3.0.0
Deprecated in: v3.25.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `custom` + +The action of the transaction. The transaction `action` field is deprecated: it is not used and will be removed in the next major version. + + +## `transaction.traceparent` [transaction-traceparent] + +Added in: v2.9.0 + +Get the serialized traceparent string of the transaction. + + +## `transaction.result` [transaction-result] + +Added in: v0.1.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) **Default:** `success` + +A string describing the result of the transaction. This is typically the HTTP status code, or e.g. "success" or "failure" for a background task. + + +## `transaction.startSpan([name][, type][, subtype][, action][, options])` [transaction-start-span] + +Added in: v2.0.0 + +Split `type` into `type`, `subtype` and `action` in: v3.0.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The name of the span. You can alternatively set this via [`span.name`](/reference/span-api.md#span-name). **Default:** `unnamed` +* `type` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The type of the span. You can alternatively set this via [`span.type`](/reference/span-api.md#span-type). +* `subtype` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The subtype of the span. You can alternatively set this via [`span.subtype`](/reference/span-api.md#span-subtype). +* `action` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) The action of the span. You can alternatively set this via [`span.action`](/reference/span-api.md#span-action). +* `options` - The following options are supported: + + * `startTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the span started. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + * `exitSpan` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) Make an "exit span". Exit spans represent outgoing communication. They are used to create a node in the [Service Map](docs-content://solutions/observability/apm/service-map.md) and a downstream service in the [Dependencies Table](docs-content://solutions/observability/apm/dependencies.md). The provided subtype will be used as the downstream service name. + * `links` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) Span links. A span can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `links` argument is an array of objects with a single "context" field that is a `Transaction`, `Span`, or W3C trace-context *traceparent* string. For example: `transaction.startSpan('aName', { links: [{ context: anotherSpan }] })`. + + +Start and return a new custom span associated with this transaction. When a span is started it will measure the time until [`span.end()`](/reference/span-api.md#span-end) is called. + +See [Span API](/reference/span-api.md) docs for details on how to use custom spans. + + +## `transaction.setLabel(name, value[, stringify = true])` [transaction-set-label] + +Added in: v0.1.0
Renamed from `transaction.setTag()` to `transaction.setLabel()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch +* `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +transaction.setLabel('productId', 42, false); +``` + +Set a label on the transaction. You can set multiple labels on the same transaction. If an error happens during the transaction, it will also get tagged with the same labels. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `transaction.addLabels({ [name]: value }[, stringify = true])` [transaction-add-labels] + +Added in: v1.5.0
Renamed from `transaction.addTags()` to `transaction.addLabels()`: v2.10.0
Added `stringify` argument in: v3.11.0 + +* `labels` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) Contains key/value pairs: + + * `name` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), as those characters have special meaning in Elasticsearch + * `value` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) | [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) If the `stringify` argument is not given, or set to `true` then the given value will be converted to a string. + +* `stringify` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type) This defaults to `true` for backwards compatibility, but new usage will typically want `false`. When true, if a non-string `value` is given, it is converted to a string before being sent to the APM Server. + +```js +transaction.addLabels({productId: 42, productName: 'butter'}, false); +``` + +Add several labels on the transaction. You can add labels multiple times. If an error happens during the transaction, it will also get tagged with the same labels. + +::::{tip} +Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable (as opposed to data set via [`apm.setCustomContext()`](/reference/agent-api.md#apm-set-custom-context)). Before using custom labels, ensure you understand the different types of [metadata](docs-content://solutions/observability/apm/metadata.md) that are available. +:::: + + +::::{warning} +Avoid defining too many user-specified labels. Defining too many unique fields in an index is a condition that can lead to a [mapping explosion](docs-content://manage-data/data-store/mapping.md#mapping-limit-settings). +:::: + + + +## `transaction.ensureParentId()` [transaction-ensure-parent-id] + +Added in: v2.0.0 + +* [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) + +If the transaction does not already have a parent id, calling this method generates a new parent id, sets it as the parent id of this transaction, and returns it as a [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type). + +This enables the correlation of the spans the JavaScript Real User Monitoring (RUM) agent creates for the initial page load with the transaction of the backend service. If your backend service generates the HTML page dynamically, initializing the JavaScript RUM agent with the value of this method allows analyzing the time spent in the browser vs in the backend services. + +To enable the JavaScript RUM agent, add a snippet similar to this to the body of your HTML page, preferably before other JavaScript libraries: + +```js +elasticApm.init({ + serviceName: 'my-frontend-app', // Name of your frontend app + serverUrl: 'https://example.com:8200', // APM Server host + pageLoadTraceId: '${transaction.traceId}', + pageLoadSpanId: '${transaction.ensureParentId()}', + pageLoadSampled: ${transaction.sampled} +}) +``` + +See the [JavaScript RUM agent documentation](apm-agent-rum-js://reference/index.md) for more information. + + +## `transaction.ids` [transaction-ids] + +Added in: v2.17.0 + +Produces an object containing `transaction.id` and `trace.id`. This enables log correlation to APM traces with structured loggers. + +```js +{ + "trace.id": "abc123", + "transaction.id": "abc123" +} +``` + + +## `transaction.end([result][, endTime])` [transaction-end] + +Added in: v0.1.0 + +* `result` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) Describes the result of the transaction. This is typically the HTTP status code, or e.g. "success" or "failure" for a background task +* `endTime` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type) The time when the transaction ended. Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. Sub-millisecond precision can be achieved using decimals. If not provided, the current time will be used + +Ends the transaction. If the transaction has already ended, nothing happens. + +Alternatively you can call [`apm.endTransaction()`](/reference/agent-api.md#apm-end-transaction) to end the active transaction. + + +## `transaction.outcome` [transaction-outcome] + +Added in: v3.12.0 + +The Node.js agent automatically sets an `outcome` property on transactions. This property will be one of three values: + +* `success`: Indicates the transaction’s operation was a success. +* `failure`: Indicates the transaction’s operation was *not* a success. +* `unknown`: Indicates we were unable to determine if the transaction’s operation was a success or not. An `unknown` outcome removes a transaction from error rate considerations. + +A transaction is considered a success if the underlying HTTP request handling produces a response with a status code that is less than `500`. A status code of `500` or greater is considered a failure. + +Non-HTTP transactions will begin with an outcome of `unknown`. + + +## `transaction.setOutcome(outcome)` [transaction-setoutcome] + +Added in: v3.12.0 + +* `outcome` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type) + +The `setOutcome` method allows an end user to override the Node.js agent’s default setting of a transaction’s `outcome` property. The `setOutcome` method accepts a string of either `success`, `failure`, or `unknown`, and will force the agent to report this value for a specific span. + + +## `transaction.addLink(link)` [transaction-addlink] + +Added in: v4.7.0 + +* `link` `{{type-link}}` + +A transaction can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `link` argument is an object with a single "context" field that is a `Transaction`, `Span`, OpenTelemetry `SpanContext` object, or W3C trace-context *traceparent* string. For example: `transaction.addLink({ context: anotherSpan })`. + + +## `transaction.addLinks([links])` [transaction-addlinks] + +Added in: v4.7.0 + +* `links` [``](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) Span links. + +Add span links to this transaction. + +A transaction can refer to zero or more other transactions or spans (separate from its parent). Span links will be shown in the Kibana APM app trace view. The `link` argument is an object with a single "context" field that is a `Transaction`, `Span`, OpenTelemetry `SpanContext` object, or W3C trace-context *traceparent* string. For example: `transaction.addLinks([{ context: anotherSpan }])`. + + diff --git a/docs/reference/typescript.md b/docs/reference/typescript.md new file mode 100644 index 0000000000..860a432f53 --- /dev/null +++ b/docs/reference/typescript.md @@ -0,0 +1,76 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/typescript.html +--- + +# Get started with TypeScript [typescript] + +The Elastic APM Node.js agent is implemented in vanilla JavaScript, but includes TypeScript types. This document shows how to integrate the APM agent with your TypeScript project. + +A small, complete example project can be found [here](https://github.com/elastic/apm-agent-nodejs/tree/main/examples/typescript). + + +## Installation [typescript-installation] + +Add `elastic-apm-node` as a dependency to your application, and possibly `@types/node` as a dev-dependency for type checking: + +```bash +npm install --save elastic-apm-node +npm install --save-dev @types/node <1> +``` + +1. Installing `@types/node` can be skipped if you use [`skipLibCheck: true`](https://www.typescriptlang.org/tsconfig#skipLibCheck) in your "tsconfig.json". + + + +## tsconfig compiler options [typescript-tsconfig] + +The TypeScript authors strongly recommend that you use the [`"esModuleInterop": true`](https://www.typescriptlang.org/tsconfig/#esModuleInterop) option in your "tsconfig.json". In case you do not, then the "default" import of the agent will not work, so instead of using `import apm from 'elastic-apm-node/start'` or similar, you will have to use: + +```js +import * as apm from 'elastic-apm-node/start' // if using esModuleInterop:false +``` + +Currently the Elastic APM Node.js agent [does not support instrumenting ECMA Script modules (ESM)](/reference/supported-technologies.md#compatibility-esm), so for full APM support you will need to tell TypeScript to generate JavaScript using CommonJS modules via the [`"module": "commonjs"`](https://www.typescriptlang.org/tsconfig/#module) compiler option. + +```json +// tsconfig.json +{ + "compilerOptions": { + "module": "commonjs", + "esModuleInterop": true, + "moduleResolution": "node" + // ... + } +} +``` + +The current TypeScript [recommended tsconfigs for node](https://github.com/tsconfig/bases#node-10-tsconfigjson) use options that work with the APM agent. + + +## Starting the agent [typescript-start] + +For the APM agent to be able to automatically instrument modules it **must be started before you import other modules**. This means that you should probably import and start the agent in your application’s main file (usually `index.js`, `server.js` or `app.js`). One way to do this is as follows. + +```typescript +import 'elastic-apm-node/start' <1> + +// Application code starts here. +// ... +``` + +1. This start method requires you to use environment variables to configure the agent. See [Starting the agent](/reference/starting-agent.md) for all the ways to start the agent. + + +Pay special attention to [the possible surprise gotcha](/reference/starting-agent.md#start-typescript) where the TypeScript compiler can throw away your import in the generated JavaScript. + + +## Next steps [typescript-next-steps] + +The APM agent will now trace your application, monitor performance, and record any uncaught exceptions. Refer to the following documentation to configure and use the APM agent. + +* [Setup and Configuration](/reference/advanced-setup.md) +* [API Reference](/reference/api.md) + +If you can’t get the Node.js agent to work as expected, please follow the [troubleshooting guide](docs-content://troubleshoot/observability/apm-agent-nodejs/apm-nodejs-agent.md). + diff --git a/docs/reference/upgrade-to-v1.md b/docs/reference/upgrade-to-v1.md new file mode 100644 index 0000000000..a8e6ad6d16 --- /dev/null +++ b/docs/reference/upgrade-to-v1.md @@ -0,0 +1,57 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v1.html +--- + +# Upgrade to v1.x [upgrade-to-v1] + +The following is a guide on upgrading your Node.js agent from version 0.x to version 1.x. + +## Overview [v1-overview] + +Version 1.x of the Node.js agent requires version 6.2 of the APM Server or higher. + +The term "trace" was previously used to describe a small piece of work instrumented by the agent during a transaction. To align with modern APM vendors, we now refer to this as a "span" + +The term "app" was previously used to describe your Node.js application in relation to Elastic APM. To be more specific, we now refer to this as a "service". + + +## Config options [v1-config-options] + +The following config options have been removed in version 1.0.0: + +| | | +| --- | --- | +| Name | Note | +| `logBody` | Use [`captureBody`](/reference/configuration.md#capture-body) instead. Note that this option is not a boolean | + +The following config options have been renamed between version 0.x and 1.x. + +::::{note} +The associated environment variable for each renamed config option have been renamed accordingly as well. +:::: + + +| | | | +| --- | --- | --- | +| Old name | New name | Note | +| `appName` | [`serviceName`](/reference/configuration.md#service-name) | Renamed to align with new naming conventions | +| `appVersion` | [`serviceVersion`](/reference/configuration.md#service-version) | Renamed to align with new naming conventions | +| `captureTraceStackTrace` | [`captureSpanStackTraces`](/reference/configuration.md#capture-span-stack-traces) | Renamed to align with new naming conventions | +| `sourceContextErrorAppFrames` | [`sourceLinesErrorAppFrames`](/reference/configuration.md#source-context-error-app-frames) | Renamed to align with other agents | +| `sourceContextSpanAppFrames` | [`sourceLinesSpanAppFrames`](/reference/configuration.md#source-context-span-app-frames) | Renamed to align with other agents | +| `sourceContextErrorLibraryFrames` | [`sourceLinesErrorLibraryFrames`](/reference/configuration.md#source-context-error-library-frames) | Renamed to align with other agents | +| `sourceContextSpanLibraryFrames` | [`sourceLinesSpanLibraryFrames`](/reference/configuration.md#source-context-span-library-frames) | Renamed to align with other agents | +| `validateServerCert` | [`verifyServerCert`](/reference/configuration.md#validate-server-cert) | Renamed to align with other agents | + + +## Agent API [v1-agent-api] + +The following functions have been renamed between version 0.x and 1.x: + +| | | | +| --- | --- | --- | +| Old name | New name | Note | +| `buildTrace()` | `buildSpan()` | Renamed to align with new naming conventions | + + diff --git a/docs/reference/upgrade-to-v2.md b/docs/reference/upgrade-to-v2.md new file mode 100644 index 0000000000..8f346d5221 --- /dev/null +++ b/docs/reference/upgrade-to-v2.md @@ -0,0 +1,75 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v2.html +--- + +# Upgrade to v2.x [upgrade-to-v2] + +The following is a guide on upgrading your Node.js agent from version 1.x to version 2.x. + +## Overview [v2-overview] + +Version 2.0.0 of the Node.js agent requires version 6.5 of the APM Server or higher and makes use of the new HTTP intake API. + +The new agent supports Node.js 6, 8, and 10+. + +The format of the error ID’s have changed from a UUID4 to a hex formatted random 128 bit number. Likewise, the format of the transaction ID’s have changed from a UUID4 to a hex formatted random 64 bit number. + + +## Config options [v2-config-options] + +### Configuration order [v2-configuration-order] + +The Node.js agent can be configured using a combination of inline config options, environment variables, and a config file. Many config options also have default values. The order in which these are applied has changed in 2.0.0. + +In 1.x the order in which config options overruled each other was (higher overwrites lower): + +* Inline options given to [`.start()`](/reference/agent-api.md#apm-start) +* [Agent config file](/reference/configuring-agent.md#agent-configuration-file) +* Environment variables +* Default values + +The new order in 2.0.0 is (higher overwrites lower): + +* Environment variables +* Inline options given to [`.start()`](/reference/agent-api.md#apm-start) +* [Agent config file](/reference/configuring-agent.md#agent-configuration-file) +* Default values + + +### Changed units [v2-changed-units] + +In 1.x, the config option [`abortedErrorThreshold`](/reference/configuration.md#aborted-error-threshold) expected a millisecond value. In 2.0.0 the default time unit is seconds. If you’d like to keep using milliseconds, you need to specify the unit, e.g: `1500ms`. + +In 1.x, all boolean config options could be configured using the strings `on`, `yes`, `1`, etc., to mean `true` with similar values representing `false`. In 2.0.0 this has been restricted, and only the strings `true` and `false` will be interpreted as the boolean equivalent. + + +### Removed config options [v2-removed-config-options] + +The following config options have been removed in version 2.0.0: + +| | | +| --- | --- | +| Name | Note | +| `flushInterval` | Use [`apiRequestTime`](/reference/configuration.md#api-request-time) instead. Note that this option has a slightly different meaning as the intake API has changed. | +| `maxQueueSize` | Use [`apiRequestSize`](/reference/configuration.md#api-request-size) instead. Note that this option has a slightly different meaning as the intake API has changed. | + + + +## Agent API [v2-agent-api] + +The [`agent.addFilter()`](/reference/agent-api.md#apm-add-filter) callback is called with a different payload in 2.0.0 (see docs for details). + +::::{note} +While the `addFilter()` function is still called for all types of data sent to the APM Server, three new filter functions have been added in 2.0.0 as well: [`agent.addErrorFilter()`](/reference/agent-api.md#apm-add-error-filter), [`agent.addTransactionFilter()`](/reference/agent-api.md#apm-add-transaction-filter), and [`agent.addSpanFilter()`](/reference/agent-api.md#apm-add-span-filter), called only for errors, transactions, and spans respectively. + +:::: + + +The previously undocumented method `span.offsetTime()` has been removed in 2.0.0. + +The previously undocumented `transaction.buildSpan()` method has been replaced with [`transaction.startSpan(name, type)`](/reference/transaction-api.md#transaction-start-span) in 2.0.0. + +The `agent.buildSpan(name, type)` and `span.start(name, type)` methods have been removed in 2.0.0. They have been replaced by [`agent.startSpan(name, type)`](/reference/agent-api.md#apm-start-span). + + diff --git a/docs/reference/upgrade-to-v3.md b/docs/reference/upgrade-to-v3.md new file mode 100644 index 0000000000..029a400227 --- /dev/null +++ b/docs/reference/upgrade-to-v3.md @@ -0,0 +1,48 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v3.html +--- + +# Upgrade to v3.x [upgrade-to-v3] + +The following is a guide on upgrading your Node.js agent from version 2.x to version 3.x. + +## Overview [v3-overview] + +Version 3.0.0 of the Node.js agent supports Node.js v8 (from v8.6.0 and onwards), v10, and v12. + + +## Config options [v3-config-options] + +The [`disableInstrumentations`](/reference/configuration.md#disable-instrumentations) config option now behaves differently if given the values `http` and/or `https`. Previously this would disable tracing of incoming and outgoing requests. Now this config option only deals with outgoing requests. To disable tracing of incoming http(s) requests, use the new [`instrumentIncomingHTTPRequests`](/reference/configuration.md#instrument-incoming-http-requests) config option. + +It’s now possible to make use of manual instrumention while the [`instrument`](/reference/configuration.md#instrument) config option is set to `false`. This means that calls to for instance [`apm.startTransaction()`](/reference/agent-api.md#apm-start-transaction) or [`apm.startSpan()`](/reference/agent-api.md#apm-start-span) will produce transactions and spans even if `instrument` is set to `false`. + + +## API changes [v3-api-changes] + +The `type` associated with transactions and spans is no longer dot-separated. Instead the `type` property has been split into three distinct properties: `type`, `subtype`, and `action`. This has resulted in changes to the following API’s: + +* [`apm.startTransaction()`](/reference/agent-api.md#apm-start-transaction): Function arguments changed +* [`apm.startSpan()`](/reference/agent-api.md#apm-start-span): Function arguments changed +* [`transaction.startSpan()`](/reference/transaction-api.md#transaction-start-span): Function arguments changed +* [`transaction.type`](/reference/transaction-api.md#transaction-type): String format changed +* [`span.type`](/reference/span-api.md#span-type): String format changed + +The following deprecated API’s has been removed: + +* `apm.setTag()`: Replaced by [`apm.setLabel()`](/reference/agent-api.md#apm-set-label) +* `apm.addTags()`: Replaced by [`apm.addLabels()`](/reference/agent-api.md#apm-add-labels) +* `transaction.setTag()`: Replaced by [`transaction.setLabel()`](/reference/transaction-api.md#transaction-set-label) +* `transaction.addTags()`: Replaced by [`transaction.addLabels()`](/reference/transaction-api.md#transaction-add-labels) +* `span.setTag()`: Replaced by [`span.setLabel()`](/reference/span-api.md#span-set-label) +* `span.addTags()`: Replaced by [`span.addLabels()`](/reference/span-api.md#span-add-labels) + + +## Changes in collected data [v3-changes-in-collected-data] + +When instrumenting a GraphQL server that is run by [`apollo-server-express`](https://www.npmjs.com/package/apollo-server-express) the Transaction type is now `graphql` instead of `request`. + +All Spans whose type was previously `ext` is now `external`. + + diff --git a/docs/reference/upgrade-to-v4.md b/docs/reference/upgrade-to-v4.md new file mode 100644 index 0000000000..333e694748 --- /dev/null +++ b/docs/reference/upgrade-to-v4.md @@ -0,0 +1,111 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v4.html +--- + +# Upgrade to v4.x [upgrade-to-v4] + +The following is a guide on upgrading your usage of the Elastic APM Node.js agent (`elastic-apm-node`) from version 3.x to version 4.x. + +## Node.js versions [v4-nodejs] + +Version 4.x of `elastic-apm-node` supports Node.js v14.17.0 and later. (The previous 3.x major supported back to Node.js v8.6.0.) + + +## Config options [v4-config-options] + +### `ELASTIC_APM_KUBERNETES_*` [_elastic_apm_kubernetes] + +Support for the following Kubernetes environment variables have been removed: `ELASTIC_APM_KUBERNETES_NAMESPACE`, `ELASTIC_APM_KUBERNETES_NODE_NAME`, `ELASTIC_APM_KUBERNETES_POD_NAME`, and `ELASTIC_APM_KUBERNETES_POD_UID`. The correct environment variables for these config vars are *without* the `ELASTIC_APM_` prefix — for example [`KUBERNETES_POD_NAME`](/reference/configuration.md#kubernetes-pod-name) — and has been documented that way since v2.11.0. + +**How to check.** Search for any usage of `ELASTIC_APM_KUBERNETES_` in your project. For example, using [ripgrep](https://github.com/BurntSushi/ripgrep), run `rg ELASTIC_APM_KUBERNETES_`. If there are any hits, remove the `ELASTIC_APM_` prefix. + + +### `filterHttpHeaders` [_filterhttpheaders] + +Support for `filterHttpHeaders` config option has been removed. Redaction of HTTP headers and also request cookies is controlled by the existing config option [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names). + +**How to check.** Search your project for `rg filterHttpHeaders` or `rg ELASTIC_APM_FILTER_HTTP_HEADERS` and remove them. + + +### `useElasticTraceparentHeader` [_useelastictraceparentheader] + +The default value of the [`useElasticTraceparentHeader`](/reference/configuration.md#use-elastic-traceparent-header) config option has changed to `false`. This means that the vendor-specific `elastic-apm-traceparent` header will no longer be added to outgoing HTTP requests by default. The `traceparent` header (from the [W3C trace-context standard](https://w3c.github.io/trace-context/)) is added by the APM agent. If you need the agent to continue sending `elastic-apm-traceparent` HTTP header you can set it to `true` via env var or start options. + +**How to check.** Search your project for `rg useElasticTraceparentHeader` or `rg ELASTIC_APM_USE_ELASTIC_TRACEPARENT_HEADER`. + + +### `contextManager: "patch"` [_contextmanager_patch] + +The "patch" value for the [`contextManager`](/reference/configuration.md#context-manager) config option has been removed. This was a limited async context management that predated the preferred `AsyncLocalStorage` core Node.js mechanism for context tracking. As well, the related and deprecated `asyncHooks` config option has been removed. Both were deprecated in v3.37.0. + +**How to check.** Search your project for `rg -w contextManager` or `rg -w ELASTIC_APM_CONTEXT_MANAGER` which set the value to "patch". Also search for `rg -w asyncHooks` or `rg -w ELASTIC_APM_ASYNC_HOOKS` which set the value to `false`. If so, that config setting is no longer supported. + + +### `logUncaughtExceptions` [_loguncaughtexceptions] + +The `logUncaughtExceptions` config option has been removed. In v3 and earlier, when the APM agent was [capturing an uncaught exception](/reference/configuration.md#capture-exceptions) setting `logUncaughtExceptions: true` would tell the agent to print the error details to stderr before exiting; but `logUncaughtExceptions` was `false` by default. In v4, printing the error to stderr is done by default (to mimic the default Node.js uncaught exception behavior) and there is no option to disable that. + +**How to check.** Search your project for `rg -w logUncaughtExceptions` or `rg -w ELASTIC_APM_LOG_UNCAUGHT_EXCEPTIONS` and remove any usages. + + +### `ELASTIC_SANITIZE_FIELD_NAMES`, `ELASTIC_IGNORE_MESSAGE_QUEUES` [_elastic_sanitize_field_names_elastic_ignore_message_queues] + +Support for the erroneous `ELASTIC_SANITIZE_FIELD_NAMES` and `ELASTIC_IGNORE_MESSAGE_QUEUES` config environment variables has been removed. The correct env vars are `ELASTIC_APM_SANITIZE_FIELD_NAMES` and `ELASTIC_APM_IGNORE_MESSAGE_QUEUES`, respectively, and were supported starting in v3.36.0. + + + +## API changes [v4-api-changes] + +### `apm.startTransaction(...)` [v4-api-start-transaction] + +The `apm.startTransaction()` method has been changed to return a do-nothing no-op Transaction, if the agent is not yet started. The return type has changed to no longer include `| null`. The intent of these changes is to allow the user to use `.startTransaction()` without having to worry if the agent is yet started, nor to have to handle a possible `null` return value. + +**How to check.** Search your project for `rg '\.startTransaction\b'`. If your code handled a possible `null` return value from this function call, you can remove that handling. + + +### `transaction.subtype` and `transaction.action` [v4-api-transaction-subtype-action] + +The `subtype` and `action` properties have been removed from `Transaction`. This also impacts [`apm.startTransaction([name][, type][, options])`](/reference/agent-api.md#apm-start-transaction) and `transaction.setType(...)`, both of which now no longer accept `subtype` and `action` parameters. These two properties were deprecated in v3.25.0. + +**How to check.** Search your project for `rg '\.startTransaction\b'`. If your code passed in `subtype` or `action` arguments, e.g. `apm.startTransaction('a-name', 'a-type', 'a-subtype', 'an-action', { /* options */ })`, then those need to be updated. Also search your project for `rg '\.subtype\b'` and `rg '\.action\b'`. If those property accesses are on an APM Transaction object, then you should remove them. (Note that `subtype` and `action` on APM **Span** objects remain in the API.) + + +### `span.toString()`, `transaction.toString()` [v4-api-to-string] + +The `span.toString()` and `transaction.toString()` methods have been removed as documented APIs. They were never in the "index.d.ts" types and were deprecated in v3.23.0. + +Since v2.17.0 they would return a string of the form `trace.id= span.id=`, with the intent that this could be used in text-only loggers for log correlation. Using `.toString()` for this was deprecated in v3.23.0, and has now been removed in v4. In v4 the output of `.toString()` is not defined. + +Instead, prefer the use of [`span.ids`](/reference/span-api.md#span-ids), [`transaction.ids`](/reference/transaction-api.md#transaction-ids), or [`apm.currentTraceIds`](/reference/agent-api.md#apm-current-trace-ids). The v3 format may be reproduced via: + +```js +const {stringify} = require('querystring'); +console.log(stringify(span.ids, ' ', '=')); +``` + +For log correlation with *structured* logs, see [Log correlation](/reference/logs.md#log-correlation-ids). + + +### `apm.destroy()` [v4-api-destroy] + +The `apm.destroy()` method is now async. Almost no users should need to use this method. However, if used, to be sure to wait for APM agent shutdown to be complete, one can now `await apm.destroy()`. + + + +## Log warnings [v4-warnings] + +This section documents some new log output warnings from the APM agent, and how to avoid them. + +### "units missing in duration value" [v4-warning-duration-units] + +```json +{"log.level":"warn","@timestamp":"2023-08-04T16:54:03.116Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"units missing in duration value \"5\" for \"metricsInterval\" config option: using default units \"s\""} +``` + +Configuration options that define a duration, like `metricsInterval` or `exitSpanMinDuration`, expect to have their units specified in the value (e.g. `"10s"`, `"100ms"`). While current duration options have a default unit, to avoid ambiguity the APM agent will now warn if the units are not provided. + + +### "units missing in size value" [v4-warning-size-units] + +Byte size config options like `apiRequestSize` expect to have the size units specified in the value (e.g. `"10kb"`, `"1gb"`). If the unit is not in the value, the agent will warn about it and fallback to bytes (`b`). diff --git a/docs/reference/upgrading.md b/docs/reference/upgrading.md new file mode 100644 index 0000000000..0843ff8178 --- /dev/null +++ b/docs/reference/upgrading.md @@ -0,0 +1,30 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrading.html +--- + +# Upgrading [upgrading] + +The Elastic APM Node.js Agent uses [semantic versioning](https://semver.org/), and therefore upgrades between minor versions of the agent, for example from 1.1 to 1.2, are always backwards compatible. Upgrades that involve a major version bump often come with some backwards incompatible changes. + +Before upgrading the agent, be sure to review the: + +* [Node.js APM Agent release notes](/release-notes/index.md) +* [APM Agent and Server compatibility chart](docs-content://solutions/observability/apm/apm-agent-compatibility.md) + +The following upgrade guides are available: + +* [Upgrade to v4.x](/reference/upgrade-to-v4.md) from version 3.x of the Elastic APM Node.js agent. +* [Upgrade to v3.x](/reference/upgrade-to-v3.md) from version 2.x of the Elastic APM Node.js agent. +* [Upgrade to v2.x](/reference/upgrade-to-v2.md) from version 1.x of the Elastic APM Node.js agent. +* [Upgrade to v1.x](/reference/upgrade-to-v1.md) from version 0.x of the Elastic APM Node.js agent. + + +## End of life dates [end-of-life-dates] + +We love all our products, but sometimes we must say goodbye to a release so that we can continue moving forward on future development and innovation. Our [End of life policy](https://www.elastic.co/support/eol) defines how long a given release is considered supported, as well as how long a release is considered still in active development or maintenance. + + + + + diff --git a/docs/release-notes.asciidoc b/docs/release-notes.asciidoc deleted file mode 100644 index 1d230eb282..0000000000 --- a/docs/release-notes.asciidoc +++ /dev/null @@ -1,13 +0,0 @@ -:pull: https://github.com/elastic/apm-agent-nodejs/pull/ -:issues: https://github.com/elastic/apm-agent-nodejs/issues/ - -[[release-notes]] -== Release notes - -* <> -* <> -* <> -* <> -* <> - -include::../CHANGELOG.asciidoc[] diff --git a/docs/release-notes/breaking-changes.md b/docs/release-notes/breaking-changes.md new file mode 100644 index 0000000000..9e3d6ca08d --- /dev/null +++ b/docs/release-notes/breaking-changes.md @@ -0,0 +1,36 @@ +--- +navigation_title: "Breaking changes" +--- + +# Elastic APM Node.js Agent breaking changes +Before you upgrade, carefully review the Elastic APM Node.js Agent breaking changes and take the necessary steps to mitigate any issues. + +To learn how to upgrade, check out [Upgrading](/reference/upgrading.md). + +% ## Next version [next-version] +% **Release date:** Month day, year + +% ::::{dropdown} Title of breaking change +% Description of the breaking change. +% For more information, check [PR #](PR link). +% **Impact**
Impact of the breaking change. +% **Action**
Steps for mitigating deprecation impact. +% :::: + +## 4.2.0 [4-2-0] +**Release date:** November 23, 2023 + +* Drop support for next@11. Next.js instrumentation support is currently in technical preview, so it is not considered a semver-major change to drop support for this old version of next. For more information, check ([#3664](https://github.com/elastic/apm-agent-nodejs/pull/3664)). + +## 4.0.0 [4-0-0] +* Set the new minimum supported Node.js to version 14.17.0. Users of earlier Node.js versions can use elastic-apm-node v3.x, which supports back to Node.js v8.6. +* Ignore a `timer` option passed to `startTransaction()` and `startSpan()` APIs. This option was never documented. It would be surprising if any user is impacted by this. +* Remove long deprecated support for the `ELASTIC_APM_`-prefixed environment variables for the [Kubernetes config options](/reference/configuration.md#kubernetes-node-name). For example, one must use `KUBERNETES_POD_NAME` and not `ELASTIC_APM_KUBERNETES_POD_NAME`. ([#2661](https://github.com/elastic/apm-agent-nodejs/issues/2661)) +* The config option `filterHttpHeaders` is now *removed*. ([#3539](https://github.com/elastic/apm-agent-nodejs/pull/3539)) +* Remove the deprecated `span.toString()` and `transaction.toString()` APIs. ([#2348](https://github.com/elastic/apm-agent-nodejs/issues/2348)) +* Remove instrumentation support for the old *hapi* package — the current *@hapi/hapi* package is still instrumented. ([#2691](https://github.com/elastic/apm-agent-nodejs/issues/2691)) +* Change `apm.startTransaction()` api to return a noop transaction instead of null, if the agent is not yet started. ([#2429](https://github.com/elastic/apm-agent-nodejs/issues/2429)) +* Drop support for the obsolete "patch" context manager, i.e. the `contextManager: "patch"` config option. This was a limited async context management that predated the preferred `AsyncLocalStorage` core Node.js mechanism for context tracking. It was deprecated in v3.37.0. As well, the related and deprecated `asyncHooks` config option has been removed. ([#3529](https://github.com/elastic/apm-agent-nodejs/issues/3529)) +* Remove the `logUncaughtExceptions` config option. ([#2412](https://github.com/elastic/apm-agent-nodejs/issues/2412)) +* Remove `transaction.subtype` and `transaction.action` properties from API. This also impacts [`apm.startTransaction([name][, type][, options])`](/reference/agent-api.md#apm-start-transaction) and `transaction.setType(...)`, both of which now no longer accept `subtype` and `action` parameters. These two properties were deprecated in v3.25.0. ([#3557](https://github.com/elastic/apm-agent-nodejs/issues/3557)) +* Remove support for the erroneous `ELASTIC_SANITIZE_FIELD_NAMES` and `ELASTIC_IGNORE_MESSAGE_QUEUES` config environment variables. The correct env vars are `ELASTIC_APM_SANITIZE_FIELD_NAMES` and `ELASTIC_APM_IGNORE_MESSAGE_QUEUES`, respectively, and were supported starting in v3.36.0. \ No newline at end of file diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md new file mode 100644 index 0000000000..fb12413954 --- /dev/null +++ b/docs/release-notes/index.md @@ -0,0 +1,291 @@ +--- +navigation_title: "Elastic APM Node.js Agent" +mapped_pages: + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes.html + - https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes-4.x.html +--- + +# Elastic APM Node.js Agent release notes + +Review the changes, fixes, and more in each version of Elastic Node.js Agent. + +To check for security updates, go to [Security announcements for the Elastic stack](https://discuss.elastic.co/c/announcements/security-announcements/31). + +% Release notes includes only features, enhancements, and fixes. Add breaking changes, deprecations, and known issues to the applicable release notes sections. + +% ## Next [next] +% **Release date:** Month day, year + +% ### Features and enhancements [next-features-enhancements] + +% ### Fixes [next-fixes] + +## 4.13.0 [4-13-0] +**Release date:** May 6, 2025 + +### Features and enhancements [4-13-0-features-enhancements] + +* Add support for `express` v5. ([#4581](https://github.com/elastic/apm-agent-nodejs/pull/4581)) + +## 4.12.0 [4-12-0] +**Release date:** April 24, 2025 + +### Features and enhancements [4-12-0-next-features-enhancements] + +* Get sourcemap handling for captured exceptions to work with stack frames in + ES Modules (ESM). Before this, sourcemap handling would only work for stack + frames in CommonJS modules. ([#4578](https://github.com/elastic/apm-agent-nodejs/issues/4578)) + + +## 4.11.2 [4-11-2] +**Release date:** March 17, 2025 + +### Fixes [4-11-2-fixes] + +* Fix bug in instrumentation of Azure Functions that could result in crashing the application. The known case was with a ServiceBus function (using `app.serviceBusTopic(...)` from `@azure/functions`). ([#4508](https://github.com/elastic/apm-agent-nodejs/issues/4508)) + +## 4.11.1 [4-11-1] +**Release date:** March 14, 2025 + +### Features and enhancements [4-11-1-features-enhancements] + +* Update base image of alpine in `Dockerfile` to version `3.21.3`. ([#4465](https://github.com/elastic/apm-agent-nodejs/pulls/4465)) +* Test FIPS 140 compliance. ([#4441](https://github.com/elastic/apm-agent-nodejs/pulls/4441)) + +### Fixes [4-11-1-fixes] + +* Change how `@hapi/hapi` instrumentation includes additional data when + capturing an error for Hapi `log` and `request` Server events to avoid + possible capture of large amounts of data, that could lead to latency issues + and high memory usage. Some data that may have been captured before will + *no longer* be captured. ([#4503](https://github.com/elastic/apm-agent-nodejs/issues/4503)) + + The `@hapi/hapi` instrumentation will capture an APM error whenever a + Hapi `log` or `request` server event ([https://hapi.dev/api/#server.events](https://hapi.dev/api/#server.events)) with + the "error" tag is emitted, e.g. when a Hapi server responds with an HTTP 500 + error. Before this change, any and all properties on the logged Error or data + would be included in the APM error data sent to APM server (in the + `error.custom` field). This could cause a surprise for applications that attach + (sometimes large) data to the internal server Error for other purposes (e.g. + application error handling). + + The expected surprise case is when a deeply-nested object is added as a + property to the event data. To protect against serializing these, the Hapi + instrumentation will only serialize event data properties that are "simple" + types (boolean, string, number, Date), other types (Array, object, Buffer, etc.) + will *not* be captured. This is similar behavior as is used for the + `captureAttributes` option to [`apm.captureError()`](/reference/agent-api.md#apm-capture-error) + for the same purpose. + + In addition, the updated Hapi instrumentation will no longer capture to + `error.custom` when the emitted data is an `Error` instance, because this was a + duplication of the `Error` properties already being captured to the + `error.exception.attributes` field. + +## 4.11.0 [4-11-0] +**Release date:** January 20, 2025 + +### Features and enhancements [4-11-0-features-enhancements] +* Support instrumentation of Azure Functions using the [v4 Node.js programming model](https://learn.microsoft.com/en-ca/azure/azure-functions/functions-node-upgrade-v4). ([#4426](https://github.com/elastic/apm-agent-nodejs/pull/4426)) + +### Fixes [4-11-0-fixes] +* Fix instrumentation of `@aws-sdk/client-s3`, `@aws-sdk/client-sqs`, and `@aws-sdk/client-sns` for versions 3.723.0 and later. Internally the AWS SDK clients updated to `@smithy/smithy-client@4`. ([#4398](https://github.com/elastic/apm-agent-nodejs/pull/4398)) + +## 4.10.0 [4-10-0] +**Release date:** December 24, 2024 + +### Features and enhancements [4-10-0-features-enhancements] +* Improve trace-level logging to better support debugging central config and transaction sampling issues. ([#4291](https://github.com/elastic/apm-agent-nodejs/issues/4291)) + +## 4.9.0 [4-9-0] +**Release date:** December 9, 2024 + +### Features and enhancements [4-9-0-features-enhancements] +* Add support for `undici` v7. ([#4336](https://github.com/elastic/apm-agent-nodejs/pull/4336)) + +### Fixes [4-9-0-fixes] +* Fix to support a internal refactor in `mysql2` v3.11.5. ([#4334](https://github.com/elastic/apm-agent-nodejs/pull/4334)) +* Guard against a possible encoding error of tracing data in the APM client, before it is sent. It is **possible** this could wedge the APM client, resulting in the APM agent no longer sending tracing data. ([#4359](https://github.com/elastic/apm-agent-nodejs/pull/4359)) + +## 4.8.1 [4-8-1] +**Release date:** November 4, 2024 + +### Fixes [4-8-1-fixes] +* Fix AWS Lambda instrumentation to work with a "handler" string that includes a period (`.`) in the module path. E.g. the leading `.` in `Handler: ./src/functions/myfunc/handler.main`. ([#4293](https://github.com/elastic/apm-agent-nodejs/issues/4293)). + +## 4.8.0 [4-8-0] +**Release date:** October 8, 2024 + +### Features and enhancements [4-8-0-features-enhancements] +* Minor improvement to container ID parsing from /etc/cgroup v1 files in AWS ECS Fargate, where the pattern has been observed to sometimes differ from the documented pattern. ([APM spec issue #888](https://github.com/elastic/apm/issues/888)) +* Add support for `tedious` v19. ([#4218](https://github.com/elastic/apm-agent-nodejs/issues/4218)) +* Add support for `koa-router` v13. ([#4236](https://github.com/elastic/apm-agent-nodejs/pull/4236)) + +### Fixes [4-8-0-fixes] +* Update `cookie` to version `v0.7.2` to fix security issue [CVE-2024-47764](https://github.com/advisories/GHSA-pxg6-pf52-xh8x) + +## 4.7.3 [4-7-3] +**Release date:** August 9, 2024 + +### Fixes [4-7-3-fixes] +* Update import-in-the-middle to 1.11.0, which fixes [an issue](https://github.com/nodejs/import-in-the-middle/issues/144) that can crash users using Nuxt and ESM. ([#4175](https://github.com/elastic/apm-agent-nodejs/pull/4175)) + +## 4.7.2 [4-7-2] +**Release date:** August 1, 2024 + +### Features and enhancements [4-7-2-features-enhancements] +* Support hooking built-in Node.js modules loaded via [`process.getBuiltinModule`](https://nodejs.org/api/all.html#all_process_processgetbuiltinmoduleid), added in v22.3.0. ([#4160](https://github.com/elastic/apm-agent-nodejs/pull/4160)) + +### Fixes [4-7-2-fixes] +* Fix for instrumentation for `@aws-sdk/sns-client` that will prevent a crash if the client is used when there is no parent transaction present. ([#4168](https://github.com/elastic/apm-agent-nodejs/pull/4168)) +* Fix for config resolution process. Before this change falsy config options coming from the `elastic-apm-node.js` file were ignored. ([#4119](https://github.com/elastic/apm-agent-nodejs/pull/4119)) +* Fix publishing of AWS Lambda layer to all AWS regions. This was broken in the 4.7.1 release. ([#4171](https://github.com/elastic/apm-agent-nodejs/issues/4171)) + +## 4.7.1 [4-7-1] +**Release date:** July 24, 2024 + +### Fixes [4-7-1-fixes] +* Update import-in-the-middle internally-used library to v1.9.1. This can fix usage with ESM code (see [*ECMAScript module support*](/reference/esm.md)) in some cases, e.g. usage with [Nuxt 3](https://github.com/elastic/apm-agent-nodejs/issues/4143). + +## 4.7.0 [4-7-0] +**Release date:** June 13, 2024 + +### Features and enhancements [4-7-0-features-enhancements] +* Update [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) support to `@opentelemetry/api` version 1.9.0. ([#4078](https://github.com/elastic/apm-agent-nodejs/issues/4078)) + + Support for the new `addLink` and `addLinks` methods on Span have been added. However, support for the new synchronous gauge have not yet been added. + +## 4.6.0 [4-6-0] +**Release date:** June 5, 2024 + +### Features and enhancements [4-6-0-features-enhancements] +* Make published `docker.elastic.co/observability/apm-agent-nodejs` Docker images multi-platform, with support for `linux/amd64,linux/arm64` for now. This is necessary for users of the Elastic APM Attacher for Kubernetes, when deploying to k8s nodes that are ARM64 (e.g. Gravitron on AWS). ([#4038](https://github.com/elastic/apm-agent-nodejs/issues/4038)) + +### Fixes [4-6-0-fixes] +* Fix instrumentation for recent `@aws-sdk/client-*` releases that use `@smithy/smithy-client` v3. (For example `@aws-sdk/client-s3@3.575.0` released 2024-05-13 updated to smithy-client v3.) Before this change the APM agent had been limiting patching of `@smithy/smithy-client` to `>=1 <3`. ([#4036](https://github.com/elastic/apm-agent-nodejs/pull/4036)) +* Mark the published AWS Lambda layers as supporting the "nodejs20.x" Lambda Runtime (`--compatible-runtimes`). The "nodejs20.x" runtime was released by AWS on 2023-11-15. ([#4033](https://github.com/elastic/apm-agent-nodejs/issues/4033)) + + Note that this Node.js APM agent supports Node.js 20.x, so the new AWS Lambda runtime was supported when it was released. However, the metadata stating compatible runtimes (which is advisory) was not updated until now. + +## 4.5.4 [4-5-4] +**Release date:** May 13, 2024 + +### Fixes [4-5-4-fixes] +* Change how the "cookie" HTTP request header is represented in APM transaction data to avoid a rare, but possible, intake bug where the transaction could be rejected due to a mapping conflict. + + Before this change a `Cookie: foo=bar; sessionid=42` HTTP request header would be represented in the transaction document in Elasticsearch with these document fields (the example assumes [`sanitizeFieldNames`](/reference/configuration.md#sanitize-field-names) matches "sessionid", as it does by default): + + ``` + http.request.headers.cookie: "[REDACTED]" + ... + http.request.cookies.foo: "bar" + http.request.cookies.sessionid: "[REDACTED]" + ``` + + After this change it is represented as: + + ``` + http.request.headers.cookie: "foo=bar; sessionid=REDACTED" + ``` + + In other words, `http.request.cookies` are no longer separated out. ([#4006](https://github.com/elastic/apm-agent-nodejs/issues/4006)) + + +## 4.5.3 [4-5-3] +**Release date:** April 23, 2024 + +### Fixes [4-5-3-fixes] +* Fix message handling for tombstone messages in `kafkajs` instrumentation. ([#3985](https://github.com/elastic/apm-agent-nodejs/pull/3985)) + +## 4.5.2 [4-5-2] +**Release date:** April 12, 2024 + +### Fixes [4-5-2-fixes] +* Fix path resolution for requests that contain invalid characters in its host header. ([#3923](https://github.com/elastic/apm-agent-nodejs/pull/3923)) +* Fix span names for `getMore` command of mongodb. ([#3919](https://github.com/elastic/apm-agent-nodejs/pull/3919)) +* Fix undici instrumentation to cope with a bug in undici@6.11.0 where `request.addHeader()` was accidentally removed. (It was re-added in undici@6.11.1.) ([#3963](https://github.com/elastic/apm-agent-nodejs/pull/3963)) +* Update undici instrumentation to avoid possibly adding a **second** *traceparent* header to outgoing HTTP requests, because this can break Elasticsearch requests. ([#3964](https://github.com/elastic/apm-agent-nodejs/issues/3964)) + +## 4.5.0 [4-5-0] +**Release date:** March 13, 2024 + +### Features and enhancements [4-5-0-features-enhancements] +* Update [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) support to `@opentelemetry/api` version 1.8.0. +* Update `tedious` instrumentation to support versions 17 and 18. ([#3901](https://github.com/elastic/apm-agent-nodejs/pull/3901), [#3911](https://github.com/elastic/apm-agent-nodejs/pull/3911)) +* Add new `kafkajs` instrumentation. ([#2905](https://github.com/elastic/apm-agent-nodejs/issues/2905)) + +### Fixes [4-5-0-fixes] +* Fix instrumentation of mongodb to not break mongodb@6.4.0. Mongodb v6.4.0 included changes that resulted in the APM agent’s instrumentation breaking it. ([#3897](https://github.com/elastic/apm-agent-nodejs/pull/3897)) +* Fix hostname detection on Windows in some cases (where a powershell profile could break collection). ([#3899](https://github.com/elastic/apm-agent-nodejs/pull/3899)) +* Fix a path normalization issue that broke (or partially broke) instrumentation of some modules on Windows: Next.js, redis v4+, mongodb. ([#3905](https://github.com/elastic/apm-agent-nodejs/pull/3905)) + +## 4.4.1 [4-4-1] +**Release date:** February 6, 2024 + +### Fixes [4-4-1-fixes] +* Add support for [instrumentation of ES module-using (ESM) code](/reference/esm.md) with Node.js versions matching `^18.19.0 || >=20.2.0`. Before this version of the APM agent, ESM instrumentation was only supported for some **earlier** Node.js versions. Changes in Node.js’s ESM loader in v18.19.0 and v20 broke earlier ESM support. ([#3784](https://github.com/elastic/apm-agent-nodejs/issues/3784), [#3844](https://github.com/elastic/apm-agent-nodejs/pull/3844)) + +## 4.4.0 [4-4-0] +**Release date:** January 12, 2024 + +### Features and enhancements [4-4-0-features-enhancements] +* Support `ELASTIC_APM_ACTIVATION_METHOD=K8S_ATTACH` (in addition to the current `K8S` value) to indicate the agent is being started by apm-k8s-attacher. Newer releases of apm-k8s-attacher will be using this value (to have a common value used between APM agents). + +### Fixes [4-4-0-fixes] +* Fix bug where `NODE_ENV` environment value was not used as a default for the [`environment`](/reference/configuration.md#environment) config setting. The bug was introduced in v4.2.0. ([#3807](https://github.com/elastic/apm-agent-nodejs/issues/3807)) +* Improve Fastify instrumentation to no longer cause the [`FSTDEP017`](https://fastify.dev/docs/latest/Reference/Warnings/#FSTDEP017) and [`FSTDEP018`](https://fastify.dev/docs/latest/Reference/Warnings/#FSTDEP018) deprecation warnings. ([#3814](https://github.com/elastic/apm-agent-nodejs/pull/3814)) + +## 4.3.0 [4-3-0] +**Release date:** December 5, 2023 + +### Features and enhancements [4-3-0-features-enhancements] +* Add the [`apmClientHeaders`](/reference/configuration.md#apm-client-headers) config option, to allow adding custom headers to HTTP requests made to APM server by the APM agent. ([#3759](https://github.com/elastic/apm-agent-nodejs/issues/3759)) +* Skip undici tests for `undici` `>=5.28.0` and NodeJS `<14.18.0`. ([#3755](https://github.com/elastic/apm-agent-nodejs/pull/3755)) +* Change the log level of `Sending error to Elastic APM: ...` from `info` to `debug`. There is no need to clutter the log output with this message. ([#3748](https://github.com/elastic/apm-agent-nodejs/issues/3748)) +* Explicitly mark this package as being of type="commonjs". The experimental `node --experimental-default-type=module ...` option [added in Node.js v20.10.0](https://nodejs.org/en/blog/release/v20.10.0#--experimental-default-type-flag-to-flip-module-defaults) means that a default to "commonjs" isn’t guaranteed. + +### Fixes [4-3-0-fixes] +* Fix the dependency version range for `@elastic/ecs-pino-format`. ([#3774](https://github.com/elastic/apm-agent-nodejs/issues/3774)) + +## 4.2.0 [4-2-0] +**Release date:** November 23, 2023 + +### Features and enhancements [4-2-0-features-enhancements] +* Add [`apm.getServiceVersion()`](/reference/agent-api.md#apm-get-service-version), [`apm.getServiceEnvironment()`](/reference/agent-api.md#apm-get-service-environment), and [`apm.getServiceNodeName()`](/reference/agent-api.md#apm-get-service-node-name). These are intended for use by [ecs-logging-nodejs formatting packages](ecs-logging-nodejs://reference/index.md). See [https://github.com/elastic/ecs-logging-nodejs/pull/152](https://github.com/elastic/ecs-logging-nodejs/pull/152). ([#3195](https://github.com/elastic/apm-agent-nodejs/issues/3195)) +* Add knex@3 instrumentation. ([#3659](https://github.com/elastic/apm-agent-nodejs/pull/3659)) +* Update [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) support to `@opentelemetry/api` version 1.7.0. + +### Fixes [4-2-0-fixes] +* Fix `mongodb` instrumentation to avoid loosing context when multiple cursors are running concurrently. ([#3161](https://github.com/elastic/apm-agent-nodejs/issues/3161)) +* Set `mongodb` span’s outcome according to the result of the command being traced. ([#3695](https://github.com/elastic/apm-agent-nodejs/pull/3695)) +* Fix `@aws-sdk/client-sqs` instrumentation which was failing for `SendMessageBatch` command when any of the entities does not contain `MessageAttributes`. ([#3746](https://github.com/elastic/apm-agent-nodejs/issues/3746)) + +## 4.1.0 [4-1-0] +**Release date:** October 9, 2023 + +### Features and enhancements [4-1-0-features-enhancements] +* Update [*OpenTelemetry bridge*](/reference/opentelemetry-bridge.md) support to `@opentelemetry/api` version 1.6.0. [#3622](https://github.com/elastic/apm-agent-nodejs/pull/3622) +* Add support for `@aws-sdk/client-dynamodb`, one of the AWS SDK v3 clients. ([#2958](https://github.com/elastic/apm-agent-nodejs/issues/2958)) +* Add support for `@aws-sdk/client-sns`, one of the AWS SDK v3 clients. ([#2956](https://github.com/elastic/apm-agent-nodejs/issues/2956)) +* Add support for `@aws-sdk/client-sqs`, one of the AWS SDK v3 clients. ([#2957](https://github.com/elastic/apm-agent-nodejs/issues/2957)) +* Fixes for some values of the [`disableInstrumentations`](/reference/configuration.md#disable-instrumentations) config setting. "redis" will now properly disable instrumentation for redis@4. "next" will propertly disable all Next.js instrumentation. ([#3658](https://github.com/elastic/apm-agent-nodejs/pull/3658)) + +### Fixes [4-1-0-fixes] +* Changes to cloud metadata collection for Google Cloud (GCP). Most notably the `cloud.project.id` field is now the `project-id` from [https://cloud.google.com/compute/docs/metadata/default-metadata-values#project_metadata](https://cloud.google.com/compute/docs/metadata/default-metadata-values#project_metadata) rather than the `numeric-project-id`. This matches the value produced by Elastic Beats (like filebeat). [#3614](https://github.com/elastic/apm-agent-nodejs/issues/3614) + +## 4.0.0 [4-0-0] +**Release date:** September 7, 2023 + +### Features and enhancements [4-0-0-features-enhancements] +* The `apm.destroy()` method is now async. Almost no users should need to use this method. However, if used, to be sure to wait for APM agent shutdown to be complete, one can now `await apm.destroy()`. ([#3222](https://github.com/elastic/apm-agent-nodejs/issues/3222)) +* Support instrumenting `mongodb` v6. ([#3596](https://github.com/elastic/apm-agent-nodejs/pull/3596)) +* Add a warning message when a duration or size config option is provided without units. ([#2121](https://github.com/elastic/apm-agent-nodejs/issues/2121)) +* Change default value of `useElasticTraceparentHeader` config option to `false`. This means that for outgoing HTTP requests, the APM agent will no longer add the `elastic-apm-traceparent` header. This vendor-specific header was used in the past while the [W3C trace-context](https://w3c.github.io/trace-context/) spec was still in development. Now that it is in wide use, the `elastic-apm-traceparent` header is only useful for interaction with very old Elastic APM agents. +* Add default ports into `context.service.target.name` for HTTP spans conforming to the spec update done in [https://github.com/elastic/apm/pull/700](https://github.com/elastic/apm/pull/700) ([#3590](https://github.com/elastic/apm-agent-nodejs/pull/3590)) + +### Fixes [4-0-0-fixes] +* Fix instrumentation of `mongodb` to avoid multiple command handler registrations when client is created via `MongoClient.connect` static method. ([#3586](https://github.com/elastic/apm-agent-nodejs/pull/3586)) + + + + diff --git a/docs/release-notes/known-issues.md b/docs/release-notes/known-issues.md new file mode 100644 index 0000000000..c931a5f33d --- /dev/null +++ b/docs/release-notes/known-issues.md @@ -0,0 +1,31 @@ +--- +navigation_title: "Known issues" +--- + +# Elastic APM Node.js Agent known issues [elastic-apm-nodejs-agent-known-issues] + +% Use the following template to add entries to this page. + +% :::{dropdown} Title of known issue +% **Details** +% On [Month/Day/Year], a known issue was discovered that [description of known issue]. + +% **Workaround** +% Workaround description. + +% **Resolved** +% On [Month/Day/Year], this issue was resolved. + +::: + +## 4.4.0 [4-4-0] + +**Release date:** January 12, 2024 + +**Known issue**: Using the APM agent’s [*ECMAScript module support*](/reference/esm.md) with Node.js **v18.19.0** is not supported in this version. Upgrade to APM agent version v4.5.0 or later, or use Node.js v18.18.1 or earlier. See [https://github.com/elastic/apm-agent-nodejs/issues/3784](https://github.com/elastic/apm-agent-nodejs/issues/3784) for details. + +## 4.3.0 [4-3-0] + +**Release date:** December 5, 2023 + +**Known issue**: Using the APM agent’s [*ECMAScript module support*](/reference/esm.md) with Node.js **v18.19.0** is not supported in this version. Upgrade to APM agent version v4.5.0 or later, or use Node.js v18.18.1 or earlier. See [https://github.com/elastic/apm-agent-nodejs/issues/3784](https://github.com/elastic/apm-agent-nodejs/issues/3784) for details. \ No newline at end of file diff --git a/docs/release-notes/toc.yml b/docs/release-notes/toc.yml new file mode 100644 index 0000000000..7000d42b96 --- /dev/null +++ b/docs/release-notes/toc.yml @@ -0,0 +1,4 @@ +toc: + - file: index.md + - file: known-issues.md + - file: breaking-changes.md \ No newline at end of file diff --git a/docs/restify.asciidoc b/docs/restify.asciidoc deleted file mode 100644 index bbc7b4b845..0000000000 --- a/docs/restify.asciidoc +++ /dev/null @@ -1,120 +0,0 @@ -:framework: Restify - -[[restify]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/restify.html[elastic.co] -endif::[] - -=== Get started with Restify - -include::./shared-set-up.asciidoc[tag=introduction] - -[float] -[[restify-installation]] -==== Installation - -Add the `elastic-apm-node` module as a dependency to your application: - -[source,bash] ----- -npm install elastic-apm-node --save ----- - -[float] -[[restify-initialization]] -==== Initialization - -It's important that the agent is started before you require *any* other modules in your Node.js application - i.e. before `restify`, `http`, etc. - -This means that you should probably require and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). - -Here's a simple Restify example with the Elastic APM agent installed: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -const apm = require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', -}) - -const restify = require('restify') - -const app = restify.createServer() - -app.get('/hello/:name', function (req, res, next) { - res.send('hello ' + req.params.name) - next() -}) - -app.listen(3000) ----- - -The agent will now monitor the performance of your Restify application and record any uncaught exceptions. - -[float] -[[restify-advanced-configuration]] -===== Advanced configuration - -include::./shared-set-up.asciidoc[tag=advanced-configuration] - -[float] -[[restify-full-documentation]] -===== Full documentation - -* <> -* <> - -[float] -[[restify-performance-monitoring]] -==== Performance monitoring - -include::./shared-set-up.asciidoc[tag=performance-monitoring] - -[float] -[[restify-unknown-routes]] -===== Unknown routes - -include::./shared-set-up.asciidoc[tag=unknown-roots] - -[float] -[[restify-error-logging]] -==== Error logging - -include::./shared-set-up.asciidoc[tag=error-logging] - -[float] -[[restify-filter-sensitive-information]] -==== Filter sensitive information - -include::./shared-set-up.asciidoc[tag=filter-sensitive-info] - -[float] -[[restify-add-your-own-data]] -==== Add your own data - -include::./shared-set-up.asciidoc[tag=add-your-own-data] - -[float] -[[restify-compatibility]] -==== Compatibility - -include::./shared-set-up.asciidoc[tag=compatibility-link] - -[float] -[[restify-troubleshooting]] -==== Troubleshooting - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/set-up.asciidoc b/docs/set-up.asciidoc deleted file mode 100644 index 4dcb884d10..0000000000 --- a/docs/set-up.asciidoc +++ /dev/null @@ -1,335 +0,0 @@ -[[set-up]] -== Set up the Agent - -To get you off the ground, we've prepared guides for setting up the Agent with a few different popular web frameworks and technologies: - -// This tagged region is used throughout the documentation to link to the framework guides -// Updates made here will be applied elsewhere as well. -// tag::web-frameworks-list[] -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> -// end::web-frameworks-list[] - -Alternatively, you can <>. -For Kubernetes, we support auto-attachment using the {apm-attacher-ref}/index.html[APM attacher]. - -To see an overview of which components of your application we instrument automatically, -use the <> page. - -Other useful documentation includes: - -* <> -* <> -* <> -* <> - -include::./lambda.asciidoc[] - -include::./azure-functions.asciidoc[] - -include::./express.asciidoc[] - -include::./fastify.asciidoc[] - -include::./hapi.asciidoc[] - -include::./koa.asciidoc[] - -include::./nextjs.asciidoc[] - -include::./restify.asciidoc[] - -include::./typescript.asciidoc[] - -include::./custom-stack.asciidoc[] - - -[[starting-the-agent]] -=== Starting the agent - -There are a few ways to start the Node.js APM agent. Choose the one that works best for you. The most important considerations for selecting a method are: - -- ensuring the APM agent starts early enough, and -- having a convenient way to configure the agent. - -For the Node.js APM agent to be able to fully function, it *must be started before `require(...)` statements for other modules*. The APM agent automatically instruments modules by interposing itself in the import process. If a given module is imported before the APM agent has started, then it won't be able to instrument that module. - - -==== Start methods - -[[start-option-require-and-start]] -===== `require('elastic-apm-node').start(...)` - -The most common way to start the APM agent is to require the `elastic-apm-node` module and call the <> method at the top of your main module. This allows you to use any of the methods to <>. - -[source,js] ----- -const apm = require('elastic-apm-node').start({ - // Add configuration options here. -}); - -// Application main code goes here. ----- - - -[[start-option-require-start-module]] -===== `require('elastic-apm-node/start')` - -Another way to start the agent is with the `elastic-apm-node/start` module that imports and _starts_ the agent. - -[source,js] ----- -const apm = require('elastic-apm-node/start'); - -// Application main code goes here. ----- - -This start method exists for those that use a tool like Babel or esbuild to translate/transpile from code using ES modules (as in the following example) to code using CommonJS. It ensures that the APM agent is started before other imports in the same file. See <> below for details. - -[source,js] ----- -import 'elastic-apm-node/start.js'; - -// Application main code goes here. ----- - -A limitation of this approach is that you cannot configure the agent with an options object, but instead have to rely on <>, such as setting `ELASTIC_APM_...` environment variables. - -Note: As of elastic-apm-node version 3.47.0, the "elastic-apm-node/start.js" will *not start the agent in a Node.js Worker thread.* - - -[[start-option-node-require-opt]] -===== `node -r elastic-apm-node/start.js ...` - -Another way to start the agent is with the `-r elastic-apm-node/start.js` https://nodejs.org/api/cli.html#-r---require-module[command line option to `node`]. This will load and start the APM agent before your application code starts. This method allows you to enable the agent _without touching any code_. This is the recommended start method for <> and for tracing <>. - -[source,bash] ----- -node -r elastic-apm-node/start.js app.js ----- - -The `-r, --require` option can also be specified via the https://nodejs.org/api/cli.html#node_optionsoptions[`NODE_OPTIONS` environment variable]: - -[source,bash] ----- -# export ELASTIC_APM_... # Configure the agent with envvars. -export NODE_OPTIONS='-r elastic-apm-node/start.js' -node app.js ----- - -Note: As of elastic-apm-node version 3.47.0, the "elastic-apm-node/start.js" will *not start the agent in a https://nodejs.org/api/worker_threads.html[Node.js Worker thread].* New Worker threads inherit the `process.execArgv` and environment, so "elastic-apm-node/start.js" is executed again. Starting a new APM agent in each Worker thread because of "start.js" is deemed surprise, so is disabled for now. - - -[[start-option-separate-init-module]] -===== Separate APM init module - -If you want to avoid <> but still want the flexibility of passing a config object to the <>, then a good option is to write a separate JavaScript or TypeScript module that starts the agent, and import *that* init module at the top of your main file. For example: - -[source,ts] ----- -// initapm.ts -import apm from 'elastic-apm-node'; -apm.start({ - serverUrl: 'https://...', - secretToken: '...', - // ... -}) ----- - -[source,ts] ----- -// main.ts -import 'initapm' - -// Application code starts here. ----- - - -[[start-gotchas]] -==== Start gotchas - -This section shows some sometimes subtle surprises starting the APM agent with some technologies. A general troubleshooting tip for using the agent with any build tool/system that produces compiled JavaScript is to look at the compiled JavaScript to see what is actually being executed by `node`. - -[[start-esm-imports]] -===== Hoisted ES module imports - -When using a tool like Babel or esbuild to translate/transpile from code using ES modules (i.e. `import ...` statements) to code using CommonJS (i.e. `require(...)`), all imports are "hoisted" to the top of a module, properly following ECMAScript module (ESM) semantics. This means the `apm.start()` method is called too late—*after* the `http` module has been imported. - -For example, running Babel on the following code does not initiate APM early enough: - -[source,js] ----- -import apm from 'elastic-apm-node'; -apm.start() // This does not work. - -import http from 'http'; -// ... ----- - -Babel translates this to the equivalent of: - -[source,js] ----- -var apm = require('elastic-apm-node'); -var http = require('http'); -apm.start() // This is started too late. -// ... ----- - -The <> fixes this problem. The following will work: - -[source,js] ----- -import 'elastic-apm-node/start'; // This works. -import http from 'http'; -// ... ----- - -A more complete example using Babel is https://github.com/elastic/apm-agent-nodejs/tree/main/test/babel[here]. - -The same is true for ES module usage translated by esbuild (as explained well in https://esbuild.github.io/content-types/#real-esm-imports[the esbuild docs here]). Notably, TypeScript does _not_ following ECMAScript module semantics in this regard. - -Another good option is <> and import that first. - - -[[start-typescript]] -===== TypeScript gotcha - -TypeScript is a language that compiles to JavaScript, via the `tsc` TypeScript compiler, and is then executed via `node` (or some other JavaScript interpreter). Sometimes the produced JavaScript has a gotcha for using this APM agent. TypeScript assumes that module imports do not have side-effects, so it will https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-imports-being-elided-in-my-emit[elide the following import] if the `apm` variable is not used: - -[source,js] ----- -import apm from 'elastic-apm-node/start'; // Be careful ----- - -One can avoid that elision with: - -[source,js] ----- -import 'elastic-apm-node/start'; ----- - -Or with something like this: - -[source,js] ----- -import apm from 'elastic-apm-node/start'; apm; // Ensure import is kept for its side-effect. ----- - -TypeScript 5.0 https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#verbatimmodulesyntax[introduced a `--verbatimModuleSyntax`] -option that avoids this elision. - - -[[start-bundlers]] -===== Bundlers and APM - -JavaScript Bundlers are tools that bundle up a number of JavaScript files into one, or a few, JavaScript files to be executed. Often they also include other features such as compilation (from newer to older JavaScript syntax, from TypeScript), tree-shaking (removing sections of code that are unused), minifying, bundling of CSS/images, etc. There are many bundler tools, including: https://webpack.js.org/[Webpack], https://esbuild.github.io/[esbuild], https://rollupjs.org/[Rollup], https://parceljs.org/[Parcel]. - -The main use case for bundlers is for improving performance in _browser apps_, where reducing the size and number of separate files helps with network and CPU overhead. The use case is typically less strong for server-side JavaScript code executed with `node`. However, some tooling will use bundlers for server-side JavaScript, not necessarily for the _bundling_ but for some of the other features. - -Unfortunately, *using a bundler typically breaks the APM agent*. Bundling multiple modules into a single file necessarily means replacing `require(...)` calls with custom bundler code that handles returning the module object. But the APM agent relies on those `require(...)` calls to instrument a module. There is no automatic fix for this. The workaround is to: - -1. exclude the `elastic-apm-node` APM agent module from the bundle; and -2. optionally exclude other modules from the bundle that you would like the APM agent to instrument. - -"Excluding" a module 'foo' from the bundle (Webpack calls these "externals") means that a `require('foo')` expects "node_modules/foo/..." to exist at runtime. This means that you need to deploy both your bundle file(s) _and_ the excluded modules. This may or may not defeat your reasons for using a bundler. - -The rest of this section shows how to configure externals with various bundlers. If you know of a mechanism for a bundler that we haven't documented, please https://github.com/elastic/apm-agent-nodejs/blob/main/CONTRIBUTING.md#contributing-to-the-apm-agent[let us know.] - -[[start-webpack]] -===== Webpack - -Webpack supports https://webpack.js.org/configuration/externals/["externals"] configuration options to exclude specific modules from its bundle. At a minimum, the 'elastic-apm-agent' module must be made external. In addition, any modules that you want the APM agent to instrument (e.g. a database client) must also be made external. The easiest way to do this is to *use the https://github.com/liady/webpack-node-externals['webpack-node-externals'] module to make all of "node_modules/..." external*. - -For webpack@5 ensure your "webpack.config.js" has the following: - -[source,js] ----- -const nodeExternals = require('webpack-node-externals'); - -module.exports = { - // ... - - // Set these so Webpack emits code using Node's CommonJS - // require functions and knows to use Node's core modules. - target: 'node', - externalsPresets: { - node: true - }, - - // This tells Webpack to make everything under - // "node_modules/" external. - externals: [nodeExternals()], -}; ----- - -For webpack@4, the `externalsPresets` config var does not exist, so use: - -[source,js] ----- -const nodeExternals = require('webpack-node-externals'); - -module.exports = { - // ... - - target: 'node', - externals: [nodeExternals()], -}; ----- - - -[[start-esbuild]] -===== esbuild - -Esbuild supports marking modules/files as https://esbuild.github.io/api/#external["external"] to the bundle. At a minimum, the 'elastic-apm-agent' module must be made external for the APM agent to work. In addition, any modules that you want the APM agent to instrument (e.g. a database client) must also be made external. - -Here is an example build script for "package.json" to bundle a Node.js application (with "src/index.js" as the entry point, targetting node v14.x, and ensuring that the `pg` PostgreSQL module is instrumented): - -[source,json] ----- -{ - "scripts": { - "build": "esbuild src/index.js --outdir=dist --bundle --sourcemap --minify --platform=node --target=node14 --external:elastic-apm-node --external:pg" - } -} ----- - -This can be invoked via: - -[source,bash] ----- -npm run build ----- - -Or the esbuild configuration can be put into a build script and invoked via `node esbuild.build.js`. - -[source,js] ----- -// esbuild.build.js -require('esbuild').build({ - entryPoints: ['./src/index.js'], - outdir: 'dist', - bundle: true, - platform: 'node', - target: 'node14', - sourcemap: true, - minify: true, - external: ['elastic-apm-node', 'pg'] -}).catch(() => process.exit(1)) ----- - -An alternative to manually listing specific dependencies as "external" is to use the following esbuild option to exclude *all* dependencies: - -[source,bash] ----- -esbuild ... --external:'./node_modules/*' ----- - -A more complete example using esbuild and the APM agent is https://github.com/elastic/apm-agent-nodejs/tree/main/examples/esbuild/[here]. diff --git a/docs/setup.asciidoc b/docs/setup.asciidoc deleted file mode 100644 index e595ebb2b4..0000000000 --- a/docs/setup.asciidoc +++ /dev/null @@ -1,93 +0,0 @@ -[[advanced-setup]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/advanced-setup.html[elastic.co]. -endif::[] - -== Configuration - -Use the following pages to configure the APM Agent. - -* <> -** <> -** <> -* <> - -[[configuring-the-agent]] -=== Configuring the agent - -There are multiple ways to configure the Node.js agent. In order of precedence: - -1. APM Agent Central Configuration via Kibana. -(supported options are marked with <>) - -2. Environment variables. - -3. If calling the `apm.start()` function, supply a <> as the first argument. - -4. Via the <>. - -For information on the available configuration properties and the expected names of environment variables, see the <> documentation. - -[float] -[[dynamic-configuration]] -==== Dynamic configuration - -Configuration options marked with the image:./images/dynamic-config.svg[] badge can be changed at runtime -when set from a supported source. - -The Node.js Agent supports {apm-app-ref}/agent-configuration.html[Central configuration], -which allows you to fine-tune certain configurations via the APM app in Kibana. -This feature is enabled in the Agent by default, with <>. - -[float] -[[agent-configuration-object]] -==== Agent configuration object - -To use the optional `options` argument, pass it into the `apm.start()` method: - -[source,js] ----- -var apm = require('elastic-apm-node').start({ - // add configuration options here -}) ----- - -This example shows how to configure the agent to only be active in production: - -[source,js] ----- -// Add this to the VERY top of the first file loaded in your app -require('elastic-apm-node').start({ - // Override service name from package.json - // Allowed characters: a-z, A-Z, 0-9, -, _, and space - serviceName: '', - - // Use if APM Server requires a token - secretToken: '', - - // Use if APM Server uses API keys for authentication - apiKey: '', - - // Set custom APM Server URL (default: http://127.0.0.1:8200) - serverUrl: '', - - // Only activate the agent if it's running in production - active: process.env.NODE_ENV === 'production' -}) ----- - -[float] -[[agent-configuration-file]] -==== Agent configuration file - -The Node.js agent looks for a file named `elastic-apm-node.js` in the current working directory. -You can specify a custom path for this file with the <> configuration option. - - -include::./configuration.asciidoc[] - -include::./custom-transactions.asciidoc[] - -include::./custom-spans.asciidoc[] diff --git a/docs/shared-set-up.asciidoc b/docs/shared-set-up.asciidoc deleted file mode 100644 index 0f48c65458..0000000000 --- a/docs/shared-set-up.asciidoc +++ /dev/null @@ -1,148 +0,0 @@ -// Content in this file is shared across the Node.js documentation. -// Ensure any changes made here are relevant to all areas where the documentation is included. -// You can search for the tag name to determine where the content is used. -// ----------------------------------------------------------------- - -// tag::introduction[] -Getting Elastic APM set up for your {framework} app is easy, -and there are various ways you can tweak it to fit your needs. -Follow the guide below to get started, and for more advanced topics, -check out the <>. -// end::introduction[] - -// ----------------------------------------------------------------- - -// Advanced configuration -// tag::advanced-configuration[] -In the above example we initialize the agent by calling the <> function. -This function takes an optional options object used to configure the agent. -Any option not supplied via the options object can instead be configured using environment variables. -So if you prefer, you can set the same configuration options using environment variables: - -[source,bash] ----- -ELASTIC_APM_SERVICE_NAME= -ELASTIC_APM_SECRET_TOKEN= -ELASTIC_APM_SERVER_URL= ----- - -And then just start the agent like so: - -[source,js] ----- -// Start the agent before any thing else in your app -var apm = require('elastic-apm-node').start() ----- - -See all possible ways to configure the agent <>. -// end::advanced-configuration[] - -// ----------------------------------------------------------------- - -// Performance monitoring -// tag::performance-monitoring[] -Elastic APM automatically measures the performance of your {framework} application. -It records spans for database queries, -external HTTP requests, -and other slow operations that happen during requests to your {framework} app. - -By default, the agent will instrument <>. -To instrument other events, -you can use custom spans. -For information about custom spans, -see the <>. - -Spans are grouped in transactions - by default one for each incoming HTTP request. -But it's possible to create custom transactions not associated with an HTTP request. -See the <> for details. -// end::performance-monitoring[] - -// ----------------------------------------------------------------- - -// Unknown roots -// tag::unknown-roots[] -When viewing the performance metrics of your application in Elastic APM, -you might see some transactions named "unknown route". -This indicates that the agent detected an incoming HTTP request to your application, -but didn't know which route in your {framework} app the HTTP request matched. - -This might simply be 404 requests, -which by definition don't match any route, -or it might be a symptom that the agent wasn't installed correctly. -If you see this or can't get any meaningful metrics to show up, -please follow the <>. -// end::unknown-roots[] - -// ----------------------------------------------------------------- - -// Error logging -// tag::error-logging[] -By default, the Node.js agent will watch for uncaught exceptions and send them to Elastic APM automatically. -But in most cases, errors are not thrown but returned via a callback, -caught by a promise, -or simply manually created. -Those errors will not automatically be sent to Elastic APM. -To manually send an error to Elastic APM, -simply call `apm.captureError()` with the error: - -[source,js] ----- -var err = new Error('Ups, something broke!') - -apm.captureError(err) ----- - -For advanced logging of errors, -including adding extra metadata to the error, -see <>. -// end::error-logging[] - -// ----------------------------------------------------------------- - -// Filter sensitive information -// tag::filter-sensitive-info[] -By default, the Node.js agent will filter common sensitive information before sending errors and metrics to the Elastic APM server. - -It's possible for you to tweak these defaults or remove any information you don't want to send to Elastic APM: - -* By default, the Node.js agent will not log the body of HTTP requests. -To enable this, -use the <> config option -* By default, the Node.js agent will filter certain HTTP headers known to contain sensitive information. -To disable this, -use the <> config option -* To apply custom filters, -use one of the <> functions -//end::filter-sensitive-info[] - -// ----------------------------------------------------------------- - -// Add your own data -// tag::add-your-own-data[] -The Node.js agent will keep track of the active HTTP request and will link it to errors and recorded transaction metrics when they are sent to the Elastic APM server. -This allows you to see details about which request resulted in a particular error or which requests cause a certain HTTP endpoint to be slow. - -But in many cases, -information about the HTTP request itself isn't enough. -To add even more metadata to errors and transactions, -use one of the functions below: - -* <> - Call this to enrich collected performance data and errors with information about the user/client -* <> - Call this to enrich collected performance data and errors with any information that you think will help you debug performance issues and errors (this data is only stored, but not indexed in Elasticsearch) -* <> - Call this to enrich collected performance data and errors with simple key/value strings that you think will help you debug performance issues and errors (labels are indexed in Elasticsearch) -//end::add-your-own-data[] - -// ----------------------------------------------------------------- - -// Compatibility -// tag::compatibility-link[] -See <> for details. -// end::compatibility-link[] - -// ----------------------------------------------------------------- - -// Troubleshooting -// tag::troubleshooting-link[] -If you can't get the Node.js agent to work as expected, -please follow the <>. -// end::troubleshooting-link[] \ No newline at end of file diff --git a/docs/source-maps.asciidoc b/docs/source-maps.asciidoc deleted file mode 100644 index 940afe05aa..0000000000 --- a/docs/source-maps.asciidoc +++ /dev/null @@ -1,51 +0,0 @@ -[[source-maps]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/source-maps.html[elastic.co] -endif::[] - -== Source map support - -The Elastic APM Node.js agent supports source maps by default. -If you transpile your source code and supply a source map, -the agent will be able to collect the correct stack traces and even the original source code if available. - -To take advantage of this, simply make sure that your transpiled source code contains a `sourceMappingURL` comment at the bottom of each JavaScript file. -It can either point to a source map file on disk: - -[source,js] ----- -//# sourceMappingURL=/path/to/file.js.map ----- - -Or you can inline the source map using base64 encoding: - -[source,js] ----- -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyJmb28uanMiLCJiYXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O1VBQ0c7Ozs7Ozs7Ozs7Ozs7O3NCQ0RIO3NCQUNBIn0= ----- - -All modern build toolchains support generating source maps and adding these comments to the transpiled source code. - -[float] -[[original-source-code]] -=== Original source code - -Elastic APM uses source maps for two purposes: -to collect stack traces that point to your original source code, -_and_ to collect the original source code as inline code snippets related to each frame in your stack traces. - -For optimal support, -we recommend that you either inline the original source code using the `sourcesContent` property inside the source map, -or that you deploy the original source code to your production server along with the transpiled source code. - -If you choose to deploy the original source code, -make sure that it's accessible via the file system at the path specified with the `sourceRoot` property in the source map. - -[float] -[[public-access]] -=== Public access? - -Your source maps or original source code *does not* need to be available via the internet. -Everything is handled by the local Node.js agent on your server. diff --git a/docs/span-api.asciidoc b/docs/span-api.asciidoc deleted file mode 100644 index 79d01af262..0000000000 --- a/docs/span-api.asciidoc +++ /dev/null @@ -1,244 +0,0 @@ -[[span-api]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/span-api.html[elastic.co] -endif::[] - -=== `Span` API - -A span measures the duration of a single event. -When a span is created it will measure the time until <> is called. - -To get a `Span` object, -you need to call <>. - -To see an example of using custom spans, -see the <> article. - -[[span-transaction]] -==== `span.transaction` - -[small]#Added in: v0.1.0# - -* *Type:* Transaction - -A reference to the parent transaction object. - -All spans belong to a transaction. - -[[span-name]] -==== `span.name` - -[small]#Added in: v0.1.0# - -* +{type-string}+ *Default:* `unnamed` - -The name of the span. -This can also be set via <>. - -[[span-type]] -==== `span.type` - -[small]#Added in: v0.1.0# - -[small]#Split components into `type`, `subtype` and `action` in: v3.0.0# - -* +{type-string}+ *Default:* `custom` - -The type of span. -This can also be set via <>. - -The type is used to group similar spans together. -For instance, -all spans of MySQL queries are given the type `db`, -with a subtype of `mysql` and an action of `query`. - -In the above example, `db` is considered the type. -Though there are no naming restrictions for the type, -the following are standardized across all Elastic APM agents: -`app`, `db`, `cache`, `template`, and `ext`. - -[[span-subtype]] -==== `span.subtype` - -[small]#Added in: v0.1.0# - -* +{type-string}+ *Default:* `custom` - -The subtype of the span. -This can also be set via <>. - -The subtype is typically the name of a module or library. -For example, -MySQL queries have a subtype of `mysql`. - -[[span-action]] -==== `span.action` - -[small]#Added in: v0.1.0# - -* +{type-string}+ *Default:* `custom` - -The action of the span. -This can also be set via <>. - -The action is typically a specific function name or a general description of specific functionality. -For example, -a database query would generally have an action of `query`. - -[[span-traceparent]] -==== `span.traceparent` - -[small]#Added in: v2.9.0# - -Get the serialized traceparent string of the span. - - -[[span-set-label]] -==== `span.setLabel(name, value[, stringify = true])` - -[small]#Added in: v2.1.0# + -[small]#Renamed from `span.setTag()` to `span.setLabel()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -* `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -span.setLabel('productId', 42, false); ----- - -Set a label on the span. -You can set multiple labels on the same span. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - - -[[span-add-labels]] -==== `span.addLabels({ [name]: value }[, stringify = true])` - -[small]#Added in: v2.1.0# + -[small]#Renamed from `span.addTags()` to `span.addLabels()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `labels` +{type-object}+ Contains key/value pairs: -** `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -** `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -span.addLabels({productId: 42, productName: 'butter'}, false); ----- - -Add several labels on the span. -You can add labels multiple times. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - - -[[span-ids]] -==== `span.ids` - -[small]#Added in: v2.17.0# - -Produces an object containing `span.id` and `trace.id`. -This enables log correlation to APM traces with structured loggers. - -[source,js] ----- -{ - "trace.id": "abc123", - "span.id": "abc123" -} ----- - - -[[span-end]] -==== `span.end([endTime])` - -[small]#Added in: v0.1.0# - -* `endTime` +{type-number}+ The time when the span ended. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -End the span. -If the span has already ended, -nothing happens. - -[[span-outcome]] -==== `span.outcome` -[small]#Added in: v3.12.0# - -The Node.js agent automatically sets an `outcome` property on spans. This property will be one of three values: - -- `success`: Indicates the span's operation was a success. - -- `failure`: Indicates the span's operation was _not_ a success. - -- `unknown`: Indicates the agent was unable to determine whether the span's operation was a success or not. An `unknown` outcome removes a transaction from error rate considerations. - -What constitutes a success or failure will depend on the span type. - -For the general case, a span's outcome is considered a failure if the Node.js agent captures an error during the execution of the work a span represents. - -However, for exit spans that represent an HTTP request, the `outcome` is based on the status code of the HTTP response. A status code less than `400` is considered a success. A status code greater or equal to `400` is considered a failure. - -[[span-setoutcome]] -==== `span.setOutcome(outcome)` - -[small]#Added in: v3.12.0# - -* `outcome` +{type-string}+ - -The `setOutcome` method allows an end user to override the Node.js agent's default setting of a span's `outcome` property. The `setOutcome` method accepts a string of either `success`, `failure`, or `unknown`, and will force the agent to report this value for a specific span. - -[[span-setservicetarget]] -==== `span.setServiceTarget(type, name)` - -[small]#Added in: v3.39.0# - -* `type` +{type-string}+ | null The target service type, usually the same value as `span.subtype`, e.g. "mysql". -* `name` +{type-string}+ | null The target service name, an optional scoping of the service. For databases it is typically the database name. - -Manually set the `service.target.type` and `service.target.name` fields that identify a downstream service. They are used for https://www.elastic.co/guide/en/kibana/current/service-maps.html[Service Maps] and https://www.elastic.co/guide/en/kibana/current/dependencies.html[Dependencies] in the Kibana APM app. The values are only used for "exit" spans -- spans representing outgoing communication, marked with `exitSpan: true` at span creation. - -If false-y values (e.g. `null`) are given for both `type` and `name`, then `service.target` will explicitly be excluded from this span. This may impact Service Maps and other Kibana APM app reporting for this service. - -If this method is not called, the service target values are inferred from other span fields (https://github.com/elastic/apm/blob/main/specs/agents/tracing-spans-service-target.md#field-values[spec]). - -`service.target.*` fields are ignored for APM Server before v8.3. diff --git a/docs/supported-technologies.asciidoc b/docs/supported-technologies.asciidoc deleted file mode 100644 index 5461eaec9b..0000000000 --- a/docs/supported-technologies.asciidoc +++ /dev/null @@ -1,196 +0,0 @@ -[[supported-technologies]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/supported-technologies.html[elastic.co] -endif::[] - -== Supported technologies - -The Elastic APM Node.js Agent automatically instruments various APIs in Node.js core and third-party frameworks and packages. This page lists all supported technologies and version ranges. - - -[float] -[[compatibility-node]] -=== Node.js versions - -Support for the Elastic APM Node.js agent follows the https://nodejs.org/en/about/releases/[support schedule of Node.js itself] -to the end-of-life period of each version after its maintenance term. -Versions of Node.js past their end-of-life date are not supported. - -image::./images/node_release_schedule.svg[Node.js release schedule] - -APM agent 4.x releases work with Node.js versions 14.17.0 and later. -APM agent 3.x maintenance releases work with Node.js versions 8.6 and later. -We will only break support for older Node.js versions with a major version release of the APM agent. - -[float] -[[compatibility-esm]] -=== ECMAScript Modules (ESM) - -Beginning with version v3.48.0, the Elastic APM Node.js agent includes -_limited and experimental_ support for instrumenting -https://nodejs.org/api/esm.html#modules-ecmascript-modules[ECMAScript module imports], -i.e. modules that are loaded via `import ...` statements and `import('...')` (dynamic import). -See the <> document for details. - -Note: If you are using TypeScript or JavaScript that is _compiled/translated/transpiled to CommonJS-using JavaScript_ via tools like Babel, Webpack, esbuild, etc., then using `import ...` in your source code is fine. To ensure your compiler is generating JS that uses CommonJS imports, use the following settings: - -- For TypeScript, use https://www.typescriptlang.org/tsconfig#module[`"module": "commonjs"` in your "tsconfig.json"] (a https://github.com/tsconfig/bases/blob/main/bases/node16.json[complete tsconfig.json example]). -- For Babel, use https://babeljs.io/docs/en/babel-preset-env#modules[`"modules": "commonjs"` in your Babel config] (https://github.com/elastic/apm-agent-nodejs/blob/main/test/babel/.babelrc[for example]). -- For Webpack, use `target: 'node', externalsPresets: { node: true }` in your "webpack.config.js". -- For esbuild, use `--platform=node --target=node...` options to `esbuild` (https://github.com/elastic/apm-agent-nodejs/blob/main/examples/esbuild/package.json#L7[for example]). - - -[float] -[[elastic-stack-compatibility]] -=== Elastic Stack Compatibility - -// See the APM agent compatibility table: https://www.elastic.co/guide/en/apm/guide/current/agent-server-compatibility.html - -This agent is compatible with {apm-guide-ref}[APM Server] v6.6 and above. - - -[float] -[[compatibility-frameworks]] -=== Frameworks - -Though you can use Elastic APM <>, -we automate a few things for the most popular Node.js modules. -These are the frameworks that we officially support: - -[options="header"] -|======================================================================= -| Framework | Version | Note -| <> | N/A | -| <> | ~4 | See https://learn.microsoft.com/en-ca/azure/azure-functions/set-runtime-version[the guide on Azure Functions runtime versions]. -| <> | ^4.0.0 | -| <> | >=1.0.0 | See also https://www.fastify.io/docs/latest/Reference/LTS/[Fastify's own LTS documentation] -| <> | >=17.9.0 <22.0.0 | -| <> via koa-router or @koa/router | >=5.2.0 <13.0.0 | Koa doesn't have a built in router, so we can't support Koa directly since we rely on router information for full support. We currently support the most popular Koa router called https://github.com/koajs/koa-router[koa-router]. -| <> | >=12.0.0 <13.3.0 | (Technical Preview) This instruments Next.js routing to name transactions for incoming HTTP transactions; and reports errors in user pages. It supports the Next.js production server (`next start`) and development server (`next dev`). See the <>. -| <> | >=5.2.0 <12.0.0 | -|======================================================================= - -[float] -[[compatibility-opentelemetry]] -=== OpenTelemetry - -The Node.js Elastic APM agent supports usage of the OpenTelemetry Tracing API -via its <>. As well, it instruments the OpenTelemetry -Metrics API and Metrics SDK to allow -<>. - -[options="header"] -|======================================================================= -| Framework | Version -| <> | >=1.0.0 <1.9.0 -| https://www.npmjs.com/package/@opentelemetry/sdk-metrics[@opentelemetry/sdk-metrics] | >=1.11.0 <2 -|======================================================================= - - -[float] -[[compatibility-custom-transactions]] -=== Custom Transactions - -By default transactions are named based on their matched HTTP route if the framework used is listed above. -These modules override that behavior to give better insights into specialized HTTP servers: - -[options="header"] -|======================================================================= -|Module |Version |Note -|https://www.npmjs.com/package/express-graphql[express-graphql] |>=0.6.1 <0.13.0 |Will name all transactions by the GraphQL query name. There is a https://github.com/elastic/apm-agent-nodejs/issues/2516[known issue with node <10.4]. This module is deprecated and is no longer tested. -|https://www.npmjs.com/package/apollo-server-express[apollo-server-express] |>=2.0.4 <4|Will name all transactions by the GraphQL query name. Versions before 2.9.6 are no longer tested. -|https://www.npmjs.com/package/@apollo/server[@apollo/server] |>=4.0.0|Will name all transactions by the GraphQL query name -|======================================================================= - -[float] -[[compatibility-tracing-and-instrumentation]] -=== Tracing and Instrumentation - -The Node.js agent will automatically instrument the following modules to give you detailed performance metrics: - -[options="header"] -|======================================================================= -|Module |Version |Note -|https://www.npmjs.com/package/aws-sdk[aws-sdk] |>=2.858.0 <3 |Will instrument SQS send/receive/delete messages, all S3 methods, all DynamoDB methods, and the SNS publish method -|https://www.npmjs.com/package/@aws-sdk/client-s3[@aws-sdk/client-s3] |>=3.15.0 <4 |Will instrument all S3 methods -|https://www.npmjs.com/package/@aws-sdk/client-s3[@aws-sdk/client-sns] |>=3.15.0 <4 |Will instrument the SNS publish method -|https://www.npmjs.com/package/@aws-sdk/client-s3[@aws-sdk/client-sqs] |>=3.15.0 <4 |Will instrument SQS send/receive/delete messages -|https://www.npmjs.com/package/@aws-sdk/client-dynamodb[@aws-sdk/client-dynamodb] |>=3.15.0 <4 |Will instrument all DynamoDB methods -|https://www.npmjs.com/package/cassandra-driver[cassandra-driver] |>=3.0.0 <5 |Will instrument all queries -|https://www.npmjs.com/package/elasticsearch[elasticsearch] |>=8.0.0 |Will instrument all queries -|https://www.npmjs.com/package/@elastic/elasticsearch[@elastic/elasticsearch] |>=7.0.0 <9.0.0 |Will instrument all queries -|https://www.npmjs.com/package/graphql[graphql] |>=0.7.0 <17 |Will instrument all queries -|https://www.npmjs.com/package/handlebars[handlebars] |* |Will instrument compile and render calls -|https://www.npmjs.com/package/jade[jade] |>=0.5.6 |Will instrument compile and render calls; Deprecated. No longer tested. Use pug. -|https://www.npmjs.com/package/pug[pug] |>=0.1.0 |Will instrument compile and render calls -|https://www.npmjs.com/package/ioredis[ioredis] |>=2.0.0 <6.0.0 |Will instrument all queries -|https://www.npmjs.com/package/memcached[memcached] |>=2.2.0 |Will instrument all commands. -|https://www.npmjs.com/package/mongodb-core[mongodb-core] |>=1.2.19 <4 |Will instrument all queries. -A lot of higher level MongoDB modules use mongodb-core, -so those should be supported as well. -|https://www.npmjs.com/package/mongodb[mongodb] |>=2.0.0 <3.3.0 |Supported via mongodb-core -|https://www.npmjs.com/package/mongodb[mongodb] |>=3.3.0 <7 |Will instrument all queries -|https://www.npmjs.com/package/mongojs[mongojs] |>=1.0.0 <2.7.0 |Supported via mongodb-core -|https://www.npmjs.com/package/mongoose[mongoose] |>=4.0.0 <5.7.0 |Supported via mongodb-core -|https://www.npmjs.com/package/mongoose[mongoose] |>=5.7.0 <8 |Supported via mongodb -|https://www.npmjs.com/package/mysql[mysql] |^2.0.0 |Will instrument all queries -|https://www.npmjs.com/package/mysql2[mysql2] |>=1.0.0 <4.0.0 |Will instrument all queries -|https://www.npmjs.com/package/pg[pg] |>=4.0.0 <9.0.0 |Will instrument all queries -|https://www.npmjs.com/package/redis[redis] |>=2.0.0 <5.0.0 |Will instrument all queries -|https://www.npmjs.com/package/tedious[tedious] |>=1.9 <19.0.0 | (Excluding v4.0.0.) Will instrument all queries -|https://www.npmjs.com/package/undici[undici] | >=4.7.1 <6 | Will instrument undici HTTP requests, except HTTP CONNECT. Requires node v14.17.0 or later, or the user to have installed the https://www.npmjs.com/package/diagnostics_channel['diagnostics_channel' polyfill]. -|https://www.npmjs.com/package/ws[ws] |>=1.0.0 <8.0.0 |Will instrument outgoing WebSocket messages -|https://www.npmjs.com/package/kafkajs[kafkajs] |>=2.0.0 <3.0.0 |Will instrument all send methods for producers and message and batch processing for consumers. -|======================================================================= - -[float] -[[compatibility-better-stack-traces]] -=== Better Stack Traces - -The APM agent <> to capture -span stack traces, to show where in your code a span (e.g. for a database query) -was initiated. - -Given the async nature of Node.js, it's not possible for the APM agent to see -further back than the last async boundary. Modules that happen to have an async -boundary between a call from your application code and the action that leads -to an APM span will limit the utility of these span stack traces. - -The modules listed below are those that the APM agent instruments to provide -more useful span stack traces -- ones that point to your application code -- -when enabled. - -If you don't see your own code in spans, -please create a new topic in the https://discuss.elastic.co/c/apm[Elastic APM discuss forum] and include information about your dependencies. - -[options="header"] -|================================================= -|Module |Version |Note -|https://www.npmjs.com/package/knex[knex] |>=0.10.0 <4.0.0 | Provides better span stack traces for 'pg' and 'mysql' spans. -|================================================= - -[float] -[[compatibility-continuity]] -=== Continuity - -The Elastic APM agent monitors async operations in your Node.js application to maintain awareness of which request is the active request at any given time. -Certain modules can interfere with this monitoring if not handled properly. - -Below is a list of modules known to cause issues with this monitoring. -The versions listed are the versions we support. -If you use an unsupported version you might experience missing spans. -This does not impact the stability of your application in any way - only the collected metrics. - -If you do experience missing spans in your performance metrics, -please create a new topic in the https://discuss.elastic.co/c/apm[Elastic APM discuss forum] and include information about your dependencies and what data is missing. - -[options="header"] -|======================================================================= -|Module |Version |Note -|https://www.npmjs.com/package/bluebird[bluebird] |>=2.0.0 <4.0.0 | -|https://www.npmjs.com/package/generic-pool[generic-pool] | ^2.0.0 \|\| ^3.1.0 |Used -by a lot of database modules like for instance "pg" -|https://www.npmjs.com/package/express-queue[express-queue] |>=0.0.11 <1.0.0 | -|======================================================================= diff --git a/docs/transaction-api.asciidoc b/docs/transaction-api.asciidoc deleted file mode 100644 index e834b2ccb1..0000000000 --- a/docs/transaction-api.asciidoc +++ /dev/null @@ -1,310 +0,0 @@ -[[transaction-api]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/transaction-api.html[elastic.co] -endif::[] - -=== `Transaction` API - -A transaction groups multiple spans in a logical group. - -To get a `Transaction` object, -you need to call <>. - -To see an example of using custom transactions, -see the <> article. - -[[transaction-name]] -==== `transaction.name` - -[small]#Added in: v0.1.0# - -* +{type-string}+ *Default:* `unnamed` - -The name of the transaction. - -Can be used to set or overwrite the name of the transaction (visible in the performance monitoring breakdown). -If you don't have access to the current transaction, -you can also set the name using <>. - -Transactions with the same name and <> are grouped together. - -[[transaction-type]] -==== `transaction.type` - -[small]#Added in: v0.1.0# - -[small]#Split components into `type`, `subtype` and `action` in: v3.0.0# - -* +{type-string}+ *Default:* `custom` - -The type of the transaction. - -There's a special type called `request` which is used by the agent for the transactions automatically created when an incoming HTTP request is detected. - -[[transaction-subtype]] -==== `transaction.subtype` deprecated:[v3.25.0] - -[small]#Added in: v3.0.0# + -[small]#Deprecated in: v3.25.0# - -* +{type-string}+ *Default:* `custom` - -The subtype of the transaction. -The transaction `subtype` field is deprecated: it is not used and will be -removed in the next major version. - -[[transaction-action]] -==== `transaction.action` deprecated:[v3.25.0] - -[small]#Added in: v3.0.0# + -[small]#Deprecated in: v3.25.0# - -* +{type-string}+ *Default:* `custom` - -The action of the transaction. -The transaction `action` field is deprecated: it is not used and will be removed -in the next major version. - -[[transaction-traceparent]] -==== `transaction.traceparent` - -[small]#Added in: v2.9.0# - -Get the serialized traceparent string of the transaction. - -[[transaction-result]] -==== `transaction.result` - -[small]#Added in: v0.1.0# - -* +{type-string}+ *Default:* `success` - -A string describing the result of the transaction. -This is typically the HTTP status code, -or e.g. "success" or "failure" for a background task. - -[[transaction-start-span]] -==== `transaction.startSpan([name][, type][, subtype][, action][, options])` - -[small]#Added in: v2.0.0# - -[small]#Split `type` into `type`, `subtype` and `action` in: v3.0.0# - -* `name` +{type-string}+ The name of the span. -You can alternatively set this via <>. -*Default:* `unnamed` - -* `type` +{type-string}+ The type of the span. -You can alternatively set this via <>. - -* `subtype` +{type-string}+ The subtype of the span. -You can alternatively set this via <>. - -* `action` +{type-string}+ The action of the span. -You can alternatively set this via <>. - -* `options` - The following options are supported: - -** `startTime` +{type-number}+ The time when the span started. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -** `exitSpan` +{type-boolean}+ Make an "exit span". -Exit spans represent outgoing communication. They are used to create a node -in the {kibana-ref}/service-maps.html[Service Map] and a downstream service -in the {kibana-ref}/dependencies.html[Dependencies Table]. The provided subtype -will be used as the downstream service name. - -** `links` +{type-array}+ Span links. -A span can refer to zero or more other transactions or spans (separate from -its parent). Span links will be shown in the Kibana APM app trace view. The -`links` argument is an array of objects with a single "context" field that is a -`Transaction`, `Span`, or W3C trace-context 'traceparent' string. For example: -`transaction.startSpan('aName', { links: [{ context: anotherSpan }] })`. - -Start and return a new custom span associated with this transaction. -When a span is started it will measure the time until <> is called. - -See <> docs for details on how to use custom spans. - -[[transaction-set-label]] -==== `transaction.setLabel(name, value[, stringify = true])` - -[small]#Added in: v0.1.0# + -[small]#Renamed from `transaction.setTag()` to `transaction.setLabel()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -* `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -transaction.setLabel('productId', 42, false); ----- - -Set a label on the transaction. -You can set multiple labels on the same transaction. -If an error happens during the transaction, -it will also get tagged with the same labels. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - - -[[transaction-add-labels]] -==== `transaction.addLabels({ [name]: value }[, stringify = true])` - -[small]#Added in: v1.5.0# + -[small]#Renamed from `transaction.addTags()` to `transaction.addLabels()`: v2.10.0# + -[small]#Added `stringify` argument in: v3.11.0# - -* `labels` +{type-object}+ Contains key/value pairs: -** `name` +{type-string}+ -Any periods (`.`), asterisks (`*`), or double quotation marks (`"`) will be replaced by underscores (`_`), -as those characters have special meaning in Elasticsearch -** `value` +{type-string}+ | +{type-number}+ | +{type-boolean}+ -If the `stringify` argument is not given, or set to `true` then the given value -will be converted to a string. -* `stringify` +{type-boolean}+ -This defaults to `true` for backwards compatibility, but new usage will -typically want `false`. When true, if a non-string `value` is given, it is -converted to a string before being sent to the APM Server. - -[source,js] ----- -transaction.addLabels({productId: 42, productName: 'butter'}, false); ----- - -Add several labels on the transaction. -You can add labels multiple times. -If an error happens during the transaction, -it will also get tagged with the same labels. - -TIP: Labels are key/value pairs that are indexed by Elasticsearch and therefore searchable -(as opposed to data set via <>). -Before using custom labels, ensure you understand the different types of -{apm-guide-ref}/data-model-metadata.html[metadata] that are available. - -WARNING: Avoid defining too many user-specified labels. -Defining too many unique fields in an index is a condition that can lead to a -{ref}/mapping.html#mapping-limit-settings[mapping explosion]. - - -[[transaction-ensure-parent-id]] -==== `transaction.ensureParentId()` - -[small]#Added in: v2.0.0# - -* +{type-string}+ - -If the transaction does not already have a parent id, -calling this method generates a new parent id, -sets it as the parent id of this transaction, -and returns it as a +{type-string}+. - -This enables the correlation of the spans the JavaScript Real User Monitoring (RUM) agent creates for the initial page load with the transaction of the backend service. -If your backend service generates the HTML page dynamically, -initializing the JavaScript RUM agent with the value of this method allows analyzing the time spent in the browser vs in the backend services. - -// WARNING: The below content is reused in distributed-tracing.asciidoc -// Ensure any changes made here are safe to include on that page as well. -// tag::ensure-parent-id-snippet[] -To enable the JavaScript RUM agent, -add a snippet similar to this to the body of your HTML page, -preferably before other JavaScript libraries: - -[source,js] ----- -elasticApm.init({ - serviceName: 'my-frontend-app', // Name of your frontend app - serverUrl: 'https://example.com:8200', // APM Server host - pageLoadTraceId: '${transaction.traceId}', - pageLoadSpanId: '${transaction.ensureParentId()}', - pageLoadSampled: ${transaction.sampled} -}) ----- -// end::ensure-parent-id-snippet[] - -See the {apm-rum-ref}[JavaScript RUM agent documentation] for more information. - -[[transaction-ids]] -==== `transaction.ids` - -[small]#Added in: v2.17.0# - -Produces an object containing `transaction.id` and `trace.id`. -This enables log correlation to APM traces with structured loggers. - -[source,js] ----- -{ - "trace.id": "abc123", - "transaction.id": "abc123" -} ----- - - -[[transaction-end]] -==== `transaction.end([result][, endTime])` - -[small]#Added in: v0.1.0# - -* `result` +{type-string}+ Describes the result of the transaction. -This is typically the HTTP status code, -or e.g. "success" or "failure" for a background task - -* `endTime` +{type-number}+ The time when the transaction ended. -Must be a Unix Time Stamp representing the number of milliseconds since January 1, 1970, 00:00:00 UTC. -Sub-millisecond precision can be achieved using decimals. -If not provided, -the current time will be used - -Ends the transaction. -If the transaction has already ended, -nothing happens. - -Alternatively you can call <> to end the active transaction. - -[[transaction-outcome]] -==== `transaction.outcome` - -[small]#Added in: v3.12.0# - -The Node.js agent automatically sets an `outcome` property on transactions. This property will be one of three values: - -- `success`: Indicates the transaction's operation was a success. - -- `failure`: Indicates the transaction's operation was _not_ a success. - -- `unknown`: Indicates we were unable to determine if the transaction's operation was a success or not. An `unknown` outcome removes a transaction from error rate considerations. - -A transaction is considered a success if the underlying HTTP request handling produces a response with a status code that is less than `500`. A status code of `500` or greater is considered a failure. - -Non-HTTP transactions will begin with an outcome of `unknown`. - -[[transaction-setoutcome]] -==== `transaction.setOutcome(outcome)` - -[small]#Added in: v3.12.0# - -* `outcome` +{type-string}+ - -The `setOutcome` method allows an end user to override the Node.js agent's default setting of a transaction's `outcome` property. The `setOutcome` method accepts a string of either `success`, `failure`, or `unknown`, and will force the agent to report this value for a specific span. diff --git a/docs/troubleshooting.asciidoc b/docs/troubleshooting.asciidoc deleted file mode 100644 index 892f794692..0000000000 --- a/docs/troubleshooting.asciidoc +++ /dev/null @@ -1,129 +0,0 @@ -[[troubleshooting]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/troubleshooting.html[elastic.co] -endif::[] - -== Troubleshooting - -Is something not working as expected? -Don't worry if you can't figure out what the problem is; we’re here to help! -As a first step, ensure your app is compatible with the agent's <>. - -If you're an existing Elastic customer with a support contract, please create a ticket in the -https://support.elastic.co/customers/s/login/[Elastic Support portal]. -Other users can post in the https://discuss.elastic.co/c/apm[APM discuss forum]. - -IMPORTANT: *Please upload your complete debug logs* to a service like https://gist.github.com[GitHub Gist] -so that we can analyze the problem. -Logs should include everything from when the application starts up until the first request executes. -See <> for more information. - - -[float] -[[use-latest-agent]] -=== Updating to latest agent version - -The Elastic Node.js APM Agent is updated frequently and releases are not -strongly tied to other components in the Elastic Stack. Therefore, -updating to the most recently released agent version is often the recommended -first troubleshooting step. - -See <> for more details. - - -[float] -[[debug-mode]] -=== Debug mode - -To capture enough information for troubleshooting, perform these steps: - -1. Start your app with "trace"-level logging. This can be done by setting the - environment variable `ELASTIC_APM_LOG_LEVEL=trace` or adding `logLevel: 'trace'` - to the `apm.start(options)` call (see <> for details). -2. Disable a possible custom `logger` config, because a custom logger can - result in structured log data being lost. This can be done by setting the - environment variable `ELASTIC_APM_LOGGER=false`. -3. Send a few HTTP requests to some of the app endpoints and/or reproduce the - issue you are seeing. -4. Wait at least 10 seconds to allow the agent to try and connect to the APM - Server (controlled by <>). - -For example: - -[source,bash] ----- -ELASTIC_APM_LOG_LEVEL=trace ELASTIC_APM_LOGGER=false node app.js | tee -a apm-debug.log ----- - -If you are capturing debugging output for Elastic support, for help on the -Elastic forums, or for a GitHub issue, *please upload the complete debug -output* to a service like https://gist.github.com[GitHub Gist] so that -we can analyze the problem. - - -[float] -[[common-problems]] -=== Common problems - -[float] -[[no-data-sent]] -==== No data is sent to the APM Server - -If there is no data for your service in the Kibana APM app, check the log output -for messages like the following. - -The most common source of problems are connection issues between the agent and -the APM server. Look for a log message of the form `APM Server transport error ...`. -For example: - -[source,text] ----- -APM Server transport error (ECONNREFUSED): connect ECONNREFUSED 127.0.0.1:8200 ----- - -These may indicate an issue with the agent configuration (see <>, -<> or <>), a network problem between agent and server, or -that the APM server is down or misconfigured (see -{apm-guide-ref}/troubleshooting.html[the APM server troubleshooting docs]). - -Also look for error messages starting with `Elastic APM ...`. Some examples: - -[source,text] ----- -Elastic APM agent disabled (`active` is false) ----- - -This indicates that you have likely set the `active` option or the `ELASTIC_APM_ACTIVE` environment variable to `false`. See <>. - - -[source,text] ----- -Elastic APM is incorrectly configured: serverUrl "..." contains an invalid port! (allowed: 1-65535) ----- - - -[float] -[[missing-performance-metrics]] -==== No metrics or trace data is sent to APM Server - -Errors get tracked just fine, but you don't see any performance metrics or -trace data. - -Make sure that the agent is *both required and started at the very top of your main app file* (usually the `index.js`, `server.js` or `app.js` file). -It's important that the agent is started before any other modules are -`require`d. If not, the agent will not be able to hook into any modules and -will not be able to measure the performance of your application. -See <> for a number of possible surprises in correctly starting the APM agent when used with some compilers or bundlers. - - -[float] -[[disable-agent]] -=== Disable the Agent - -In the unlikely event the agent causes disruptions to a production application, -you can disable the agent while you troubleshoot. - -To disable the agent, set <> to `false`. -You'll need to restart your application for the changes to apply. diff --git a/docs/typescript.asciidoc b/docs/typescript.asciidoc deleted file mode 100644 index 83cf19ba50..0000000000 --- a/docs/typescript.asciidoc +++ /dev/null @@ -1,85 +0,0 @@ -[[typescript]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/typescript.html[elastic.co] -endif::[] - -=== Get started with TypeScript - -The Elastic APM Node.js agent is implemented in vanilla JavaScript, but includes TypeScript types. This document shows how to integrate the APM agent with your TypeScript project. - -A small, complete example project can be found https://github.com/elastic/apm-agent-nodejs/tree/main/examples/typescript[here]. - - -[float] -[[typescript-installation]] -==== Installation - -Add `elastic-apm-node` as a dependency to your application, and possibly `@types/node` as a dev-dependency for type checking: - -[source,bash] ----- -npm install --save elastic-apm-node -npm install --save-dev @types/node <1> ----- -<1> Installing `@types/node` can be skipped if you use https://www.typescriptlang.org/tsconfig#skipLibCheck[`skipLibCheck: true`] in your "tsconfig.json". - - -[float] -[[typescript-tsconfig]] -==== tsconfig compiler options - -The TypeScript authors strongly recommend that you use the https://www.typescriptlang.org/tsconfig/#esModuleInterop[`"esModuleInterop": true`] option in your "tsconfig.json". In case you do not, then the "default" import of the agent will not work, so instead of using `import apm from 'elastic-apm-node/start'` or similar, you will have to use: - -[source,js] ----- -import * as apm from 'elastic-apm-node/start' // if using esModuleInterop:false ----- - -Currently the Elastic APM Node.js agent <>, so for full APM support you will need to tell TypeScript to generate JavaScript using CommonJS modules via the https://www.typescriptlang.org/tsconfig/#module[`"module": "commonjs"`] compiler option. - -[source,json] ----- -// tsconfig.json -{ - "compilerOptions": { - "module": "commonjs", - "esModuleInterop": true, - "moduleResolution": "node" - // ... - } -} ----- - -The current TypeScript https://github.com/tsconfig/bases#node-10-tsconfigjson[recommended tsconfigs for node] use options that work with the APM agent. - - -[float] -[[typescript-start]] -==== Starting the agent - -For the APM agent to be able to automatically instrument modules it *must be started before you import other modules*. This means that you should probably import and start the agent in your application's main file (usually `index.js`, `server.js` or `app.js`). One way to do this is as follows. - -[source,typescript] ----- -import 'elastic-apm-node/start' <1> - -// Application code starts here. -// ... ----- -<1> This start method requires you to use environment variables to configure the agent. See <> for all the ways to start the agent. - -Pay special attention to <> where the TypeScript compiler can throw away your import in the generated JavaScript. - - -[float] -[[typescript-next-steps]] -==== Next steps - -The APM agent will now trace your application, monitor performance, and record any uncaught exceptions. Refer to the following documentation to configure and use the APM agent. - -* <> -* <> - -include::./shared-set-up.asciidoc[tag=troubleshooting-link] diff --git a/docs/upgrade-to-v1.asciidoc b/docs/upgrade-to-v1.asciidoc deleted file mode 100644 index 49ac38bf09..0000000000 --- a/docs/upgrade-to-v1.asciidoc +++ /dev/null @@ -1,59 +0,0 @@ -[[upgrade-to-v1]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v1.html[elastic.co] -endif::[] - -=== Upgrade to v1.x - -The following is a guide on upgrading your Node.js agent from version 0.x to version 1.x. - -[[v1-overview]] -==== Overview - -Version 1.x of the Node.js agent requires version 6.2 of the APM Server or higher. - -The term "trace" was previously used to describe a small piece of work instrumented by the agent during a transaction. -To align with modern APM vendors, -we now refer to this as a "span" - -The term "app" was previously used to describe your Node.js application in relation to Elastic APM. -To be more specific, -we now refer to this as a "service". - -[[v1-config-options]] -==== Config options - -The following config options have been removed in version 1.0.0: - -|======================================================================= -|Name |Note -|`logBody` |Use <> instead. Note that this option is not a boolean -|======================================================================= - -The following config options have been renamed between version 0.x and 1.x. - -NOTE: The associated environment variable for each renamed config option have been renamed accordingly as well. - -|======================================================================= -|Old name |New name| Note -|`appName` |<> |Renamed to align with new naming conventions -|`appVersion` |<> |Renamed to align with new naming conventions -|`captureTraceStackTrace` |<> |Renamed to align with new naming conventions -|`sourceContextErrorAppFrames` |<> |Renamed to align with other agents -|`sourceContextSpanAppFrames` |<> |Renamed to align with other agents -|`sourceContextErrorLibraryFrames` |<> |Renamed to align with other agents -|`sourceContextSpanLibraryFrames` |<> |Renamed to align with other agents -|`validateServerCert` |<> |Renamed to align with other agents -|======================================================================= - -[[v1-agent-api]] -==== Agent API - -The following functions have been renamed between version 0.x and 1.x: - -|======================================================================= -|Old name |New name| Note -|`buildTrace()` |`buildSpan()` |Renamed to align with new naming conventions -|======================================================================= diff --git a/docs/upgrade-to-v2.asciidoc b/docs/upgrade-to-v2.asciidoc deleted file mode 100644 index 5c2e004394..0000000000 --- a/docs/upgrade-to-v2.asciidoc +++ /dev/null @@ -1,99 +0,0 @@ -[[upgrade-to-v2]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v2.html[elastic.co] -endif::[] - -=== Upgrade to v2.x - -The following is a guide on upgrading your Node.js agent from version 1.x to version 2.x. - -[[v2-overview]] -==== Overview - -Version 2.0.0 of the Node.js agent requires version 6.5 of the APM Server or higher and makes use of the new HTTP intake API. - -The new agent supports Node.js 6, 8, and 10+. - -The format of the error ID's have changed from a UUID4 to a hex formatted random 128 bit number. -Likewise, -the format of the transaction ID's have changed from a UUID4 to a hex formatted random 64 bit number. - -[[v2-config-options]] -==== Config options - -[[v2-configuration-order]] -===== Configuration order - -The Node.js agent can be configured using a combination of inline config options, -environment variables, -and a config file. -Many config options also have default values. -The order in which these are applied has changed in 2.0.0. - -In 1.x the order in which config options overruled each other was (higher overwrites lower): - -- Inline options given to <> -- <> -- Environment variables -- Default values - -The new order in 2.0.0 is (higher overwrites lower): - -- Environment variables -- Inline options given to <> -- <> -- Default values - -[[v2-changed-units]] -===== Changed units - -In 1.x, -the config option <> expected a millisecond value. -In 2.0.0 the default time unit is seconds. -If you'd like to keep using milliseconds, -you need to specify the unit, -e.g: `1500ms`. - -In 1.x, -all boolean config options could be configured using the strings `on`, -`yes`, -`1`, etc., to mean `true` with similar values representing `false`. -In 2.0.0 this has been restricted, -and only the strings `true` and `false` will be interpreted as the boolean equivalent. - -[[v2-removed-config-options]] -===== Removed config options - -The following config options have been removed in version 2.0.0: - -|======================================================================= -|Name |Note -|`flushInterval` |Use <> instead. Note that this option has a slightly different meaning as the intake API has changed. -|`maxQueueSize` |Use <> instead. Note that this option has a slightly different meaning as the intake API has changed. -|======================================================================= - -[[v2-agent-api]] -==== Agent API - -The <> callback is called with a different payload in 2.0.0 (see docs for details). - -[NOTE] -==== -While the `addFilter()` function is still called for all types of data sent to the APM Server, -three new filter functions have been added in 2.0.0 as well: -<>, -<>, -and <>, -called only for errors, -transactions, -and spans respectively. -==== - -The previously undocumented method `span.offsetTime()` has been removed in 2.0.0. - -The previously undocumented `transaction.buildSpan()` method has been replaced with <> in 2.0.0. - -The `agent.buildSpan(name, type)` and `span.start(name, type)` methods have been removed in 2.0.0. -They have been replaced by <>. diff --git a/docs/upgrade-to-v3.asciidoc b/docs/upgrade-to-v3.asciidoc deleted file mode 100644 index 8b6c30382a..0000000000 --- a/docs/upgrade-to-v3.asciidoc +++ /dev/null @@ -1,56 +0,0 @@ -[[upgrade-to-v3]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v3.html[elastic.co] -endif::[] - -=== Upgrade to v3.x - -The following is a guide on upgrading your Node.js agent from version 2.x to version 3.x. - -[[v3-overview]] -==== Overview - -Version 3.0.0 of the Node.js agent supports Node.js v8 (from v8.6.0 and onwards), v10, and v12. - -[[v3-config-options]] -==== Config options - -The <> config option now behaves differently if given the values `http` and/or `https`. -Previously this would disable tracing of incoming and outgoing requests. -Now this config option only deals with outgoing requests. -To disable tracing of incoming http(s) requests, use the new <> config option. - -It's now possible to make use of manual instrumention while the <> config option is set to `false`. -This means that calls to for instance <> or <> will produce transactions and spans even if `instrument` is set to `false`. - -[[v3-api-changes]] -==== API changes - -The `type` associated with transactions and spans is no longer dot-separated. -Instead the `type` property has been split into three distinct properties: `type`, `subtype`, and `action`. -This has resulted in changes to the following API's: - -- <>: Function arguments changed -- <>: Function arguments changed -- <>: Function arguments changed -- <>: String format changed -- <>: String format changed - -The following deprecated API's has been removed: - -- `apm.setTag()`: Replaced by <> -- `apm.addTags()`: Replaced by <> -- `transaction.setTag()`: Replaced by <> -- `transaction.addTags()`: Replaced by <> -- `span.setTag()`: Replaced by <> -- `span.addTags()`: Replaced by <> - -[[v3-changes-in-collected-data]] -==== Changes in collected data - -When instrumenting a GraphQL server that is run by https://www.npmjs.com/package/apollo-server-express[`apollo-server-express`] -the Transaction type is now `graphql` instead of `request`. - -All Spans whose type was previously `ext` is now `external`. diff --git a/docs/upgrade-to-v4.asciidoc b/docs/upgrade-to-v4.asciidoc deleted file mode 100644 index 600817e05b..0000000000 --- a/docs/upgrade-to-v4.asciidoc +++ /dev/null @@ -1,188 +0,0 @@ -[[upgrade-to-v4]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrade-to-v4.html[elastic.co] -endif::[] - -=== Upgrade to v4.x - -The following is a guide on upgrading your usage of the Elastic APM Node.js agent -(`elastic-apm-node`) from version 3.x to version 4.x. - -[[v4-nodejs]] -==== Node.js versions - -Version 4.x of `elastic-apm-node` supports Node.js v14.17.0 and later. -(The previous 3.x major supported back to Node.js v8.6.0.) - - -[[v4-config-options]] -==== Config options - -===== `ELASTIC_APM_KUBERNETES_*` - -Support for the following Kubernetes environment variables have been removed: -`ELASTIC_APM_KUBERNETES_NAMESPACE`, `ELASTIC_APM_KUBERNETES_NODE_NAME`, -`ELASTIC_APM_KUBERNETES_POD_NAME`, and `ELASTIC_APM_KUBERNETES_POD_UID`. The -correct environment variables for these config vars are _without_ the -`ELASTIC_APM_` prefix -- for example -<> -- and has been documented that -way since v2.11.0. - -**How to check.** Search for any usage of `ELASTIC_APM_KUBERNETES_` in your -project. For example, using https://github.com/BurntSushi/ripgrep[ripgrep], -run `rg ELASTIC_APM_KUBERNETES_`. If there are any hits, remove the -`ELASTIC_APM_` prefix. - -===== `filterHttpHeaders` - -Support for `filterHttpHeaders` config option has been removed. Redaction of -HTTP headers and also request cookies is controlled by the existing config -option <>. - -**How to check.** Search your project for `rg filterHttpHeaders` or -`rg ELASTIC_APM_FILTER_HTTP_HEADERS` and remove them. - -===== `useElasticTraceparentHeader` - -The default value of the <> config option has -changed to `false`. This means that the vendor-specific -`elastic-apm-traceparent` header will no longer be added to outgoing HTTP -requests by default. The `traceparent` header (from the -https://w3c.github.io/trace-context/[W3C trace-context standard]) is added by -the APM agent. If you need the agent to continue sending -`elastic-apm-traceparent` HTTP header you can set it to `true` via env var or -start options. - -**How to check.** Search your project for `rg useElasticTraceparentHeader` or -`rg ELASTIC_APM_USE_ELASTIC_TRACEPARENT_HEADER`. - -===== `contextManager: "patch"` - -The "patch" value for the <> config option has been removed. -This was a limited async context management that predated the preferred -`AsyncLocalStorage` core Node.js mechanism for context tracking. As well, the -related and deprecated `asyncHooks` config option has been removed. Both were -deprecated in v3.37.0. - -**How to check.** Search your project for `rg -w contextManager` or -`rg -w ELASTIC_APM_CONTEXT_MANAGER` which set the value to "patch". Also search -for `rg -w asyncHooks` or `rg -w ELASTIC_APM_ASYNC_HOOKS` which set the value to -`false`. If so, that config setting is no longer supported. - -===== `logUncaughtExceptions` - -The `logUncaughtExceptions` config option has been removed. In v3 and earlier, -when the APM agent was <> -setting `logUncaughtExceptions: true` would tell the agent to print the error -details to stderr before exiting; but `logUncaughtExceptions` was `false` by -default. In v4, printing the error to stderr is done by default (to mimic the -default Node.js uncaught exception behavior) and there is no option to disable -that. - -**How to check.** Search your project for `rg -w logUncaughtExceptions` or -`rg -w ELASTIC_APM_LOG_UNCAUGHT_EXCEPTIONS` and remove any usages. - -===== `ELASTIC_SANITIZE_FIELD_NAMES`, `ELASTIC_IGNORE_MESSAGE_QUEUES` - -Support for the erroneous `ELASTIC_SANITIZE_FIELD_NAMES` and -`ELASTIC_IGNORE_MESSAGE_QUEUES` config environment variables has been removed. -The correct env vars are `ELASTIC_APM_SANITIZE_FIELD_NAMES` and -`ELASTIC_APM_IGNORE_MESSAGE_QUEUES`, respectively, and were supported starting -in v3.36.0. - - -[[v4-api-changes]] -==== API changes - -[[v4-api-start-transaction]] -===== `apm.startTransaction(...)` - -The `apm.startTransaction()` method has been changed to return a do-nothing -no-op Transaction, if the agent is not yet started. The return type has changed to -no longer include `| null`. The intent of these changes is to allow the user to use -`.startTransaction()` without having to worry if the agent is yet started, nor to -have to handle a possible `null` return value. - -**How to check.** Search your project for `rg '\.startTransaction\b'`. If your -code handled a possible `null` return value from this function call, you can -remove that handling. - -[[v4-api-transaction-subtype-action]] -===== `transaction.subtype` and `transaction.action` - -The `subtype` and `action` properties have been removed from `Transaction`. -This also impacts <> and `transaction.setType(...)`, -both of which now no longer accept `subtype` and `action` parameters. -These two properties were deprecated in v3.25.0. - -**How to check.** Search your project for `rg '\.startTransaction\b'`. If your -code passed in `subtype` or `action` arguments, e.g. -`apm.startTransaction('a-name', 'a-type', 'a-subtype', 'an-action', { /* options */ })`, -then those need to be updated. Also search your project for `rg '\.subtype\b'` -and `rg '\.action\b'`. If those property accesses are on an APM Transaction -object, then you should remove them. (Note that `subtype` and `action` on -APM **Span** objects remain in the API.) - -[[v4-api-to-string]] -===== `span.toString()`, `transaction.toString()` - -The `span.toString()` and `transaction.toString()` methods have been removed as -documented APIs. They were never in the "index.d.ts" types and were deprecated -in v3.23.0. - -Since v2.17.0 they would return a string of the form `trace.id= span.id=`, with the intent that this could be used in -text-only loggers for log correlation. Using `.toString()` for this was -deprecated in v3.23.0, and has now been removed in v4. In v4 the output of -`.toString()` is not defined. - -Instead, prefer the use of <>, -<>, or -<>. The v3 format may be reproduced -via: - -[source,js] ----- -const {stringify} = require('querystring'); -console.log(stringify(span.ids, ' ', '=')); ----- - -For log correlation with _structured_ logs, see <>. - -[[v4-api-destroy]] -===== `apm.destroy()` - -The `apm.destroy()` method is now async. Almost no users should need to use -this method. However, if used, to be sure to wait for APM agent shutdown to -be complete, one can now `await apm.destroy()`. - - -[[v4-warnings]] -==== Log warnings - -This section documents some new log output warnings from the APM agent, and how to avoid them. - -[[v4-warning-duration-units]] -===== "units missing in duration value" - - -[source,json] ----- -{"log.level":"warn","@timestamp":"2023-08-04T16:54:03.116Z","log":{"logger":"elastic-apm-node"},"ecs":{"version":"1.6.0"},"message":"units missing in duration value \"5\" for \"metricsInterval\" config option: using default units \"s\""} ----- - -Configuration options that define a duration, like `metricsInterval` or -`exitSpanMinDuration`, expect to have their units specified in the value -(e.g. `"10s"`, `"100ms"`). While current duration options have a default -unit, to avoid ambiguity the APM agent will now warn if the units are not -provided. - -[[v4-warning-size-units]] -===== "units missing in size value" - -Byte size config options like `apiRequestSize` expect to have the size -units specified in the value (e.g. `"10kb"`, `"1gb"`). If the unit is not -in the value, the agent will warn about it and fallback to bytes (`b`). - diff --git a/docs/upgrading.asciidoc b/docs/upgrading.asciidoc deleted file mode 100644 index 81c26e7f2d..0000000000 --- a/docs/upgrading.asciidoc +++ /dev/null @@ -1,44 +0,0 @@ -[[upgrading]] - -ifdef::env-github[] -NOTE: For the best reading experience, -please view this documentation at https://www.elastic.co/guide/en/apm/agent/nodejs/current/upgrading.html[elastic.co] -endif::[] - -== Upgrading - -The Elastic APM Node.js Agent uses https://semver.org/[semantic versioning], and -therefore upgrades between minor versions of the agent, for example from 1.1 to -1.2, are always backwards compatible. Upgrades that involve a major version bump -often come with some backwards incompatible changes. - -Before upgrading the agent, be sure to review the: - -* <> -* {apm-guide-ref}/agent-server-compatibility.html[APM Agent and Server compatibility chart] - -The following upgrade guides are available: - -* <> from version 3.x of the Elastic APM Node.js agent. -* <> from version 2.x of the Elastic APM Node.js agent. -* <> from version 1.x of the Elastic APM Node.js agent. -* <> from version 0.x of the Elastic APM Node.js agent. - -[float] -[[end-of-life-dates]] -=== End of life dates - -We love all our products, but sometimes we must say goodbye to a release so that we can continue moving -forward on future development and innovation. -Our https://www.elastic.co/support/eol[End of life policy] defines how long a given release is considered supported, -as well as how long a release is considered still in active development or maintenance. - -include::./upgrade-to-v4.asciidoc[Upgrade to v4.x] - -include::./upgrade-to-v3.asciidoc[Upgrade to v3.x] - -include::./upgrade-to-v2.asciidoc[Upgrade to v2.x] - -include::./upgrade-to-v1.asciidoc[Upgrade to v1.x] - - diff --git a/eslint.config.js b/eslint.config.js index 95e9566fcd..ecadd738cf 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -21,7 +21,6 @@ module.exports = [ '*.example.js', // a pattern for uncommited local dev files to avoid linting '*.example.mjs', // a pattern for uncommited local dev files to avoid linting - 'test_output/**', 'tmp/**', '.nyc_output/**', 'build/**', @@ -31,7 +30,7 @@ module.exports = [ 'examples/esbuild/dist/**', 'examples/typescript/dist/**', - 'examples/an-azure-function-app/**', + 'examples/azure-function-app/**', 'lib/opentelemetry-bridge/opentelemetry-core-mini/**', 'test/babel/out.js', 'test/lambda/fixtures/esbuild-bundled-handler/hello.js', diff --git a/examples/an-azure-function-app/Bye/index.js b/examples/an-azure-function-app/Bye/index.js deleted file mode 100644 index f0d0364ce0..0000000000 --- a/examples/an-azure-function-app/Bye/index.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = async function (context, _req) { - const body = JSON.stringify({ good: 'bye' }) - context.res = { - status: 200, - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body) - }, - body - } -} diff --git a/examples/an-azure-function-app/Hi/function.json b/examples/an-azure-function-app/Hi/function.json deleted file mode 100644 index 91052aaf8a..0000000000 --- a/examples/an-azure-function-app/Hi/function.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "bindings": [ - { - "authLevel": "Anonymous", - "type": "httpTrigger", - "direction": "in", - "name": "req", - "methods": [ - "get", - "post" - ] - }, - { - "type": "http", - "direction": "out", - "name": "res" - } - ] -} \ No newline at end of file diff --git a/examples/an-azure-function-app/Hi/index.js b/examples/an-azure-function-app/Hi/index.js deleted file mode 100644 index 2a50aa6ac0..0000000000 --- a/examples/an-azure-function-app/Hi/index.js +++ /dev/null @@ -1,28 +0,0 @@ -const http = require('http') -const https = require('https') - -module.exports = async function (context, req) { - return new Promise((resolve, reject) => { - // Call the 'Bye' Function in this same Function App... - const url = new URL(req.url) - url.pathname = '/api/Bye' - const proto = (url.protocol === 'https:' ? https : http) - proto.get(url, res => { - res.resume() - res.on('error', reject) - res.on('end', () => { - // ... then respond. - const body = JSON.stringify({ hi: 'there' }) - context.res = { - status: 200, - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body) - }, - body - } - resolve() - }) - }) - }) -} diff --git a/examples/an-azure-function-app/initapm.js b/examples/an-azure-function-app/initapm.js deleted file mode 100644 index 482b0b1be4..0000000000 --- a/examples/an-azure-function-app/initapm.js +++ /dev/null @@ -1,3 +0,0 @@ -require('elastic-apm-node').start({ - // ... -}) diff --git a/examples/an-azure-function-app/package.json b/examples/an-azure-function-app/package.json deleted file mode 100644 index 275269bd46..0000000000 --- a/examples/an-azure-function-app/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "an-azure-function-app", - "version": "1.0.0", - "description": "An example Azure Function app showing Elastic APM integration for tracing/monitoring", - "private": true, - "main": "initapm.js", - "scripts": { - "start": "func start" - }, - "dependencies": { - "elastic-apm-node": "^3.42.0" - } -} diff --git a/examples/an-azure-function-app/.gitignore b/examples/azure-function-app/.gitignore similarity index 100% rename from examples/an-azure-function-app/.gitignore rename to examples/azure-function-app/.gitignore diff --git a/examples/an-azure-function-app/.npmrc b/examples/azure-function-app/.npmrc similarity index 100% rename from examples/an-azure-function-app/.npmrc rename to examples/azure-function-app/.npmrc diff --git a/examples/azure-function-app/Makefile b/examples/azure-function-app/Makefile new file mode 100644 index 0000000000..cb7b5530b9 --- /dev/null +++ b/examples/azure-function-app/Makefile @@ -0,0 +1,15 @@ +APP_NAME=$(USER)-example-azure-function-app + +.PHONY: print-app-name +print-app-name: + @echo "APP_NAME: $(APP_NAME)" + +.PHONY: publish +publish: + func azure functionapp publish "$(APP_NAME)" + +# Note that the Azure Functions log stream is extremely flaky. Don't expect it +# to reliably be able to show logs from the deployed function app. +.PHONY: logstream +logstream: + func azure functionapp logstream "$(APP_NAME)" diff --git a/examples/an-azure-function-app/README.md b/examples/azure-function-app/README.md similarity index 63% rename from examples/an-azure-function-app/README.md rename to examples/azure-function-app/README.md index e34bd852a7..f6dafbca62 100644 --- a/examples/an-azure-function-app/README.md +++ b/examples/azure-function-app/README.md @@ -1,10 +1,10 @@ -This directory holds a very small Azure Function App implemented in Node.js -and setup to be traced by the Elastic APM agent. The App has two "functions": - -1. `Hi` - an HTTP-triggered function that will call the `Bye` function, then - respond with `{"hi":"there"}`. -2. `Bye` - an HTTP-triggered function that will respond with `{"good":"bye"}`. +This directory holds a simple Azure Function (using v4 of the Node.js +programming model) implemented in Node.js and setup to be traced by the Elastic +APM agent. The App has a single function: +- `Hello`: an HTTP-triggered function that will call worldtimeapi.org to get + the current time in Vancouver and respond with + `{"hello": "world", "current time in Vancouver": "..."}` # Testing locally @@ -13,14 +13,7 @@ and setup to be traced by the Elastic APM agent. The App has two "functions": 2. Install the [Azure Functions Core Tools](https://github.com/Azure/azure-functions-core-tools), which provide a `func` CLI tool for running Azure Functions locally for - development, and for publishing an Function App to Azure. One way to - install is via: - - npm install -g azure-functions-core-tools@4 - - It is recommended that you **not** install it in the local `./node_modules` - folder, because its large install size will get in the way of publishing to - Azure. + development, and for publishing an Function App to Azure. 3. Set environment variable to configure the APM agent, for example: @@ -29,12 +22,12 @@ and setup to be traced by the Elastic APM agent. The App has two "functions": export ELASTIC_APM_SECRET_TOKEN=... ``` -4. `npm start` +4. `npm start` (This calls `func start` to run the Azure Function app locally.) 5. In a separate terminal, call the Azure Function via: ``` - curl -i http://localhost:7071/api/Hi + curl -i http://localhost:7071/api/Hello ``` @@ -52,7 +45,7 @@ and setup to be traced by the Elastic APM agent. The App has two "functions": 4. Call your functions: ``` - curl -i https://.azurewebsites.net/api/hi + curl -i https://.azurewebsites.net/api/hello ``` The result (after a minute for data to propagate) should be a `` service diff --git a/examples/azure-function-app/host.json b/examples/azure-function-app/host.json new file mode 100644 index 0000000000..06d01bdaa9 --- /dev/null +++ b/examples/azure-function-app/host.json @@ -0,0 +1,15 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } + } + }, + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[4.*, 5.0.0)" + } +} diff --git a/examples/azure-function-app/initapm.js b/examples/azure-function-app/initapm.js new file mode 100644 index 0000000000..00a368a32e --- /dev/null +++ b/examples/azure-function-app/initapm.js @@ -0,0 +1 @@ +require('elastic-apm-node').start() diff --git a/examples/an-azure-function-app/local.settings.json b/examples/azure-function-app/local.settings.json similarity index 79% rename from examples/an-azure-function-app/local.settings.json rename to examples/azure-function-app/local.settings.json index 9dcd935ef0..8638bc7ec7 100644 --- a/examples/an-azure-function-app/local.settings.json +++ b/examples/azure-function-app/local.settings.json @@ -5,7 +5,7 @@ "AzureWebJobsStorage": "", "REGION_NAME": "test-region-name", - "WEBSITE_SITE_NAME": "an-azure-function-app", + "WEBSITE_SITE_NAME": "example-azure-function-app", "WEBSITE_INSTANCE_ID": "test-website-instance-id" } } diff --git a/examples/azure-function-app/package.json b/examples/azure-function-app/package.json new file mode 100644 index 0000000000..bd09f8c86d --- /dev/null +++ b/examples/azure-function-app/package.json @@ -0,0 +1,18 @@ +{ + "name": "example-azure-function-app", + "version": "2.0.0", + "description": "An example Azure Function app showing Elastic APM integration for tracing/monitoring", + "private": true, + "main": "{initapm.js,src/functions/*.js}", + "engines": { + "node": ">=20" + }, + "scripts": { + "start": "func start", + "dev:sync-local-apm-agent-changes": "rsync -av ../../lib/ ./node_modules/elastic-apm-node/lib/" + }, + "dependencies": { + "@azure/functions": "^4.0.0", + "elastic-apm-node": "^4.11.0" + } +} diff --git a/examples/azure-function-app/src/functions/Hello.js b/examples/azure-function-app/src/functions/Hello.js new file mode 100644 index 0000000000..5d2bc432f4 --- /dev/null +++ b/examples/azure-function-app/src/functions/Hello.js @@ -0,0 +1,24 @@ +const { app } = require('@azure/functions'); + +app.http('Hello', { + methods: ['GET'], + authLevel: 'anonymous', + handler: async (_request, _context) => { + const url = new URL('http://worldtimeapi.org/api/timezone/America/Vancouver'); + const timeRes = await fetch(url, { signal: AbortSignal.timeout(5000) }); + const timeBody = await timeRes.json(); + + const body = JSON.stringify({ + hello: 'world', + 'current time in Vancouver': timeBody.datetime + }); + return { + status: 200, + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(body) + }, + body + }; + }, +}); diff --git a/examples/esbuild/package.json b/examples/esbuild/package.json index eab3527e24..38b46ed009 100644 --- a/examples/esbuild/package.json +++ b/examples/esbuild/package.json @@ -12,6 +12,6 @@ "pug": "^3.0.2" }, "devDependencies": { - "esbuild": "^0.14.49" + "esbuild": ">=0.25.0" } } diff --git a/examples/nextjs/.gitignore b/examples/nextjs/.gitignore index a248576abd..4317ee2c0c 100644 --- a/examples/nextjs/.gitignore +++ b/examples/nextjs/.gitignore @@ -7,9 +7,6 @@ /.pnp .pnp.js -# testing -/coverage - # next.js /.next/ /out/ diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 45168c859e..c437ac2059 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "elastic-apm-node": "elastic/apm-agent-nodejs#main", - "next": "12.3.1", + "next": "14.2.26", "react": "18.2.0", "react-dom": "18.2.0" }, diff --git a/examples/trace-elasticsearch8.js b/examples/trace-elasticsearch.js similarity index 69% rename from examples/trace-elasticsearch8.js rename to examples/trace-elasticsearch.js index 34bf9b63b3..e6373a266e 100755 --- a/examples/trace-elasticsearch8.js +++ b/examples/trace-elasticsearch.js @@ -6,7 +6,7 @@ * compliance with the BSD 2-Clause License. */ -// A small example showing Elastic APM tracing @elastic/elasticsearch version 8. +// A small example showing Elastic APM tracing @elastic/elasticsearch. // // This assumes an Elasticsearch running on localhost. You can use: // npm run docker:start elasticsearch @@ -14,17 +14,12 @@ // npm run docker:stop const apm = require('../').start({ - serviceName: 'example-trace-elasticsearch8', + serviceName: 'example-trace-elasticsearch', }); -// eslint-disable-next-line no-unused-vars -const { Client, HttpConnection } = require('@elastic/elasticsearch'); +const { Client } = require('@elastic/elasticsearch'); const client = new Client({ - // By default version 8 uses the new undici HTTP client lib. You can specify - // `HttpConnection` to use the older HTTP client. - // Connection: HttpConnection, - node: process.env.ES_URL || 'http://localhost:9200', auth: { username: process.env.ES_USERNAME || undefined, @@ -33,7 +28,7 @@ const client = new Client({ maxRetries: 1, }); -async function run() { +async function main() { // For tracing spans to be created, there must be an active transaction. // Typically, a transaction is automatically started for incoming HTTP // requests to a Node.js server. However, because this script is not running @@ -75,25 +70,23 @@ async function run() { t2.end(); }); - // Example aborting requests using AbortController (node v15 and above). - if (global.AbortController) { - const t3 = apm.startTransaction('t3'); - const ac = new AbortController(); // eslint-disable-line no-undef - setImmediate(() => { - ac.abort(); - }); - try { - const res = await client.search( - { query: { match_all: {} } }, - { signal: ac.signal }, - ); - console.log('[example 3] search response:', res); - } catch (err) { - console.log('[example 3] search error:', err); - } finally { - t3.end(); - } + // Example aborting requests using AbortController. + const t3 = apm.startTransaction('t3'); + const ac = new AbortController(); // eslint-disable-line no-undef + setImmediate(() => { + ac.abort(); + }); + try { + const res = await client.search( + { query: { match_all: {} } }, + { signal: ac.signal }, + ); + console.log('[example 3] search response:', res); + } catch (err) { + console.log('[example 3] search error:', err); + } finally { + t3.end(); } } -run(); +main(); diff --git a/examples/trace-elasticsearch7.js b/examples/trace-elasticsearch7.js deleted file mode 100755 index 858c624379..0000000000 --- a/examples/trace-elasticsearch7.js +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env node --unhandled-rejections=strict - -/* - * Copyright Elasticsearch B.V. and other contributors where applicable. - * Licensed under the BSD 2-Clause License; you may not use this file except in - * compliance with the BSD 2-Clause License. - */ - -// A small example showing Elastic APM tracing @elastic/elasticsearch version 7. -// -// This assumes an Elasticsearch running on localhost. You can use: -// npm run docker:start elasticsearch -// to start an Elasticsearch docker container. Then the following to stop: -// npm run docker:stop - -const apm = require('../').start({ - serviceName: 'example-trace-elasticsearch7', -}); - -// Note that version 7 is *not* installed by default. To use v7 you'll need to: -// npm install @elastic/elasticsearch@7 -const { Client } = require('@elastic/elasticsearch'); - -const client = new Client({ - node: process.env.ES_URL || 'http://localhost:9200', - auth: { - username: process.env.ES_USERNAME || undefined, - password: process.env.ES_PASSWORD || undefined, - }, -}); - -async function run() { - // For tracing spans to be created, there must be an active transaction. - // Typically, a transaction is automatically started for incoming HTTP - // requests to a Node.js server. However, because this script is not running - // an HTTP server, we manually start a transaction. More details at: - // https://www.elastic.co/guide/en/apm/agent/nodejs/current/custom-transactions.html - const t1 = apm.startTransaction('t1'); - - // Using await. - try { - const res = await client.search({ q: 'pants' }); - console.log('search succeeded: hits:', res.body.hits); - } catch (err) { - console.log('search error:', err.message); - } finally { - t1.end(); - } - - // Using Promises directly. - const t2 = apm.startTransaction('t2'); - client - .ping() - .then((_res) => { - console.log('ping succeeded'); - }) - .catch((err) => { - console.log('ping error:', err); - }); - // Another request to have two concurrent requests. Also use a bogus index - // to trigger an error and see APM error capture. - client - .search({ index: 'no-such-index', q: 'pants' }) - .then((_res) => { - console.log('search succeeded'); - }) - .catch((err) => { - console.log('search error:', err.message); - }) - .finally(() => { - t2.end(); - }); - - // Callback style. - const t3 = apm.startTransaction('t3'); - client.ping(function (err, _res) { - console.log( - 'ping', - err ? `error ${err.name}: ${err.message}` : 'succeeded', - ); - t3.end(); - }); -} - -run(); diff --git a/examples/trace-tedious.js b/examples/trace-tedious.js index 5324220d37..78b6e44e96 100755 --- a/examples/trace-tedious.js +++ b/examples/trace-tedious.js @@ -20,7 +20,7 @@ const apm = require('../').start({ const tedious = require('tedious'); const host = process.env.MSSQL_HOST || 'localhost'; -const passwd = process.env.SA_PASSWORD || 'Very(!)Secure'; +const passwd = process.env.MSSQL_SA_PASSWORD || 'Very(!)Secure'; const connOpts = { server: host, authentication: { diff --git a/examples/typescript/README.md b/examples/typescript/README.md index a5eb5f0ab6..8ec54b638f 100644 --- a/examples/typescript/README.md +++ b/examples/typescript/README.md @@ -1,12 +1,13 @@ -This directory includes an example TypeScript project using the Elastic -Node.js APM agent. It uses a tsconfig as recommended at -https://github.com/tsconfig/bases#node-14-tsconfigjson +This directory includes an example TypeScript project using the Elastic Node.js +APM agent. It uses a tsconfig as recommended at https://github.com/tsconfig/bases#node-20-tsconfigjson +and because `"type": "module"` is set in package.json, the built JavaScript will +use ES Modules (i.e. `import`). Install dependencies: npm install -Compile the TypeScript ("index.ts") to JavaScript ("dist/index.js"): +Compile the TypeScript to JavaScript ("dist/..."): npm run build @@ -15,7 +16,7 @@ the top of "index.ts". (See [the docs](https://www.elastic.co/guide/en/apm/agent for other ways of starting the APM agent.) ```ts -import 'elastic-apm-node/start' +import 'elastic-apm-node/start.js' ``` This start methods means that we need to use environment variables (or an @@ -26,7 +27,7 @@ Configure the APM agent with values from [your Elastic Stack](https://www.elasti export ELASTIC_APM_SERVER_URL='https://...apm...cloud.es.io:443' export ELASTIC_APM_SECRET_TOKEN='...' export ELASTIC_APM_USE_PATH_AS_TRANSACTION_NAME=true - node dist/index.js + node --experimental-loader=elastic-apm-node/loader.mjs dist/index.js This simple script creates an HTTP server and makes a single request to it. If things work properly, you should see a trace with a single HTTP transaction diff --git a/examples/typescript/index.ts b/examples/typescript/index.ts index ff096bdc69..59d8104136 100755 --- a/examples/typescript/index.ts +++ b/examples/typescript/index.ts @@ -4,10 +4,10 @@ * compliance with the BSD 2-Clause License. */ -// Be sure to import and *start* the agent before other imports. -import 'elastic-apm-node/start' +// Be sure to import and *start* the APM agent before other imports. +import 'elastic-apm-node/start.js' -import http from 'http' +import * as http from 'http' // Create an HTTP server listening at port 3000. const server = http.createServer((req, res) => { diff --git a/examples/typescript/package.json b/examples/typescript/package.json index ec305c8706..1db5bb1452 100644 --- a/examples/typescript/package.json +++ b/examples/typescript/package.json @@ -1,16 +1,17 @@ { "name": "elastic-apm-node-typescript-example", - "version": "1.0.0", + "version": "2.0.0", "private": true, - "main": "index.ts", + "type": "module", "scripts": { - "build": "tsc" + "build": "tsc", + "start": "node --enable-source-maps --experimental-loader=elastic-apm-node/loader.mjs dist/index.js" }, "dependencies": { - "elastic-apm-node": "^3.37.0" + "elastic-apm-node": "^4.11.2" }, "devDependencies": { - "@tsconfig/node14": "^1.0.3", - "typescript": "^4.7.4" + "@tsconfig/node20": "^20.1.5", + "typescript": "^5.0.4" } } diff --git a/examples/typescript/tsconfig.json b/examples/typescript/tsconfig.json index 440bbffea0..737196932f 100644 --- a/examples/typescript/tsconfig.json +++ b/examples/typescript/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tsconfig/node14/tsconfig.json", + "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "outDir": "dist" } diff --git a/index.d.ts b/index.d.ts index 7cc33d028e..681c86dc03 100644 --- a/index.d.ts +++ b/index.d.ts @@ -150,6 +150,8 @@ declare namespace apm { setLabel (name: string, value: LabelValue, stringify?: boolean): boolean; addLabels (labels: Labels, stringify?: boolean): boolean; setOutcome(outcome: Outcome): void; + addLink (link: Link): void; + addLinks (links: Link[]): void; startSpan( name?: string | null, @@ -201,6 +203,8 @@ declare namespace apm { addLabels (labels: Labels, stringify?: boolean): boolean; setOutcome(outcome: Outcome): void; setServiceTarget(type?: string | null, name?: string | null): void; + addLink (link: Link): void; + addLinks (links: Link[]): void; end (endTime?: number): void; } @@ -349,8 +353,8 @@ declare namespace apm { // equivalent APIs in "opentelemetry-js-api/src/trace/link.ts". Currently // span link attributes are not supported. export interface Link { - /** A W3C trace-context 'traceparent' string, Transaction, or Span. */ - context: Transaction | Span | string; // This is a SpanContext in OTel. + /** A W3C trace-context 'traceparent' string, Transaction, Span, or OTel SpanContext. */ + context: Transaction | Span | {traceId: string, spanId: string} | string; } export interface TransactionOptions { diff --git a/lib/activation-method.js b/lib/activation-method.js index 6161133cbc..fe56223f47 100644 --- a/lib/activation-method.js +++ b/lib/activation-method.js @@ -23,8 +23,7 @@ const CONTAINS_R_ELASTIC_APM_NODE_START = * * @param {Error} startStack - An Error object with a captured stack trace. * The `stackTraceLimit` for the stack should be at least 15 -- higher - * that the default of 10. Using `nyc` for coverage testing adds at least - * one stack frame. + * that the default of 10. * @returns {string} one of the following values: * - "unknown" * - "require": diff --git a/lib/agent.js b/lib/agent.js index 2a1e26dfd6..090ad6e45f 100644 --- a/lib/agent.js +++ b/lib/agent.js @@ -24,6 +24,7 @@ const errors = require('./errors'); const { InflightEventSet } = require('./InflightEventSet'); const { Instrumentation } = require('./instrumentation'); const { elasticApmAwsLambda } = require('./lambda'); +const logging = require('./logging'); const Metrics = require('./metrics'); const parsers = require('./parsers'); const symbols = require('./symbols'); @@ -317,6 +318,23 @@ Agent.prototype.start = function (opts) { this.logger.info(preambleData, 'Elastic APM Node.js Agent v%s', version); + if (!logging.isLoggerCustom(this.logger)) { + // Periodically dump the current config (delta from defaults) when logging + // at "trace"-level. This allows getting the effective config from a running + // agent by setting trace-level logging and getting 1 minute of logs. + // (Sometimes getting logs from application *start* is no possible.) + setInterval(() => { + if (this.logger.isLevelEnabled('trace')) { + try { + const currConfig = this._conf.getCurrConfig(); + this.logger.trace({ currConfig }, 'currConfig'); + } catch (err) { + this.logger.trace({ err }, 'error calculating currConfig'); + } + } + }, 60 * 1000).unref(); + } + if (isPreviewVersion) { this.logger.warn( 'Version %s is a pre-release and not intended for use in production environments', diff --git a/lib/apm-client/apm-client.js b/lib/apm-client/apm-client.js index d05a606c0a..1d0d999c2f 100644 --- a/lib/apm-client/apm-client.js +++ b/lib/apm-client/apm-client.js @@ -70,6 +70,8 @@ function createApmClient(config, agent) { !logging.isLoggerCustom(agent.logger) ) { logging.setLogLevel(agent.logger, value); + // Hackily also set the HttpApmClient._log level. + logging.setLogLevel(client._log, value); agent.logger.info( `Central config success: updated logger with new logLevel: ${value}`, ); diff --git a/lib/apm-client/http-apm-client/container-info.js b/lib/apm-client/http-apm-client/container-info.js index 58bd42383e..04dbbf89c5 100644 --- a/lib/apm-client/http-apm-client/container-info.js +++ b/lib/apm-client/http-apm-client/container-info.js @@ -12,7 +12,7 @@ const uuidSource = '[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}'; const containerSource = '[0-9a-f]{64}'; const taskSource = '[0-9a-f]{32}'; -const awsEcsSource = '[0-9a-f]{32}-[0-9]{10}'; +const awsEcsSource = '[0-9a-f]{32}-[0-9]{1,10}'; const lineReg = /^(\d+):([^:]*):(.+)$/; const podReg = new RegExp(`pod(${uuidSource})(?:.slice)?$`); diff --git a/lib/apm-client/http-apm-client/index.js b/lib/apm-client/http-apm-client/index.js index 24055ba468..bf7a9dca9c 100644 --- a/lib/apm-client/http-apm-client/index.js +++ b/lib/apm-client/http-apm-client/index.js @@ -405,6 +405,15 @@ Client.prototype._resetEncodedMetadata = function () { // This is the only code path that should set `_encodedMetadata`. this._encodedMetadata = this._encode({ metadata }, Client.encoding.METADATA); + if (!this._encodedMetadata) { + // The APM client cannot function without encoded metadata. Handling this + // could be improved (e.g. log details and disable the APM agent). However, + // this suffices for now as we have never observed a metadata encoding + // failure. + throw new Error( + 'could not encode metadata (trace-level logging will include details)', + ); + } this._log.trace( { _encodedMetadata: this._encodedMetadata }, '_resetEncodedMetadata', @@ -504,6 +513,9 @@ Client.prototype._write = function (obj, enc, cb) { } else { const t = process.hrtime(); const chunk = this._encode(obj, enc); + if (!chunk) { + return; + } this._numEventsEnqueued++; this._chopper.write(chunk, cb); this._log.trace( @@ -579,12 +591,18 @@ Client.prototype._writeBatch = function (objs, cb) { const chunks = []; for (var i = 0; i < objs.length; i++) { const obj = objs[i]; - chunks.push(this._encode(obj.chunk, obj.encoding)); + const encoded = this._encode(obj.chunk, obj.encoding); + if (encoded) { + chunks.push(encoded); + } + } + if (chunks.length === 0) { + return; } const chunk = chunks.join(''); const encodeTimeMs = deltaMs(t); - this._numEventsEnqueued += objs.length; + this._numEventsEnqueued += chunks.length; this._chopper.write(chunk, cb); const fullTimeMs = deltaMs(t); @@ -601,7 +619,7 @@ Client.prototype._writeBatch = function (objs, cb) { { encodeTimeMs, fullTimeMs, - numEvents: objs.length, + numEvents: chunks.length, numBytes: chunk.length, }, '_writeBatch', @@ -687,24 +705,54 @@ Client.prototype._maybeUncork = function () { }; Client.prototype._encode = function (obj, enc) { - const out = {}; + let thing; + let truncFunc; + let outAttr; switch (enc) { case Client.encoding.SPAN: - out.span = truncate.span(obj.span, this._conf); + thing = obj.span; + truncFunc = truncate.span; + outAttr = 'span'; break; case Client.encoding.TRANSACTION: - out.transaction = truncate.transaction(obj.transaction, this._conf); + thing = obj.transaction; + truncFunc = truncate.transaction; + outAttr = 'transaction'; break; case Client.encoding.METADATA: - out.metadata = truncate.metadata(obj.metadata, this._conf); + thing = obj.metadata; + truncFunc = truncate.metadata; + outAttr = 'metadata'; break; case Client.encoding.ERROR: - out.error = truncate.error(obj.error, this._conf); + thing = obj.error; + truncFunc = truncate.error; + outAttr = 'error'; break; case Client.encoding.METRICSET: - out.metricset = truncate.metricset(obj.metricset, this._conf); + thing = obj.metricset; + truncFunc = truncate.metricset; + outAttr = 'metricset'; break; } + + const out = {}; + try { + out[outAttr] = truncFunc(thing, this._conf); + } catch (err) { + this._log.warn( + { + err, + // Only log full problematic object at TRACE level to limit noise. + thing: this._log.isLevelEnabled('trace') ? thing : '[REDACTED]', + thing_id: thing?.id, + thing_name: thing?.name, + }, + `could not encode "${outAttr}" object`, + ); + return null; + } + return ndjson.serialize(out); }; @@ -765,7 +813,6 @@ Client.prototype.lambdaRegisterTransaction = function (trans, awsRequestId) { { awsRequestId, traceId: trans.trace_id, transId: trans.id }, 'lambdaRegisterTransaction start', ); - var out = this._encode({ transaction: trans }, Client.encoding.TRANSACTION); const finish = (errOrErrMsg) => { const durationMs = performance.now() - startTime; @@ -784,6 +831,12 @@ Client.prototype.lambdaRegisterTransaction = function (trans, awsRequestId) { resolve(); // always resolve, never reject }; + var out = this._encode({ transaction: trans }, Client.encoding.TRANSACTION); + if (!out) { + finish('could not encode transaction'); + return; + } + // Every `POST /register/transaction` request must set the // `x-elastic-aws-request-id` header. Instead of creating a new options obj // each time, we just modify in-place. diff --git a/lib/config/config.js b/lib/config/config.js index 09e1a85753..58c1e8459d 100644 --- a/lib/config/config.js +++ b/lib/config/config.js @@ -34,6 +34,7 @@ const { setStartOptions, getPreambleData, readEnvOptions, + CENTRAL_CONFIG_OPTS, } = require('./schema'); const { @@ -244,6 +245,27 @@ class Config { } return loggable; } + + // Returns an object showing the current config, excluding default values. + getCurrConfig() { + const currConfig = {}; + + // Start with the values from the logging preamble. This selected keys + // that were specified, and handles redaction. + for (let [k, v] of Object.entries(this.loggingPreambleData.config)) { + currConfig[k] = v.value; + } + + // Then add the current value of any var possibly set by central config. + currConfig.centralConfig = this.centralConfig; + if (this.centralConfig) { + for (let k of Object.values(CENTRAL_CONFIG_OPTS)) { + currConfig[k] = this[k]; + } + } + + return currConfig; + } } function validateServiceName(s) { diff --git a/lib/config/schema.js b/lib/config/schema.js index a8f10c8116..1433c53046 100644 --- a/lib/config/schema.js +++ b/lib/config/schema.js @@ -876,7 +876,7 @@ CONFIG_SCHEMA.forEach((def) => { if (def.envVar && process.env[def.envVar]) { def.environmentValue = process.env[def.envVar]; def.source = 'environment'; - } else if (fileOpts && fileOpts[def.name]) { + } else if (fileOpts && typeof fileOpts[def.name] !== 'undefined') { def.fileValue = fileOpts[def.name]; def.source = 'file'; } diff --git a/lib/instrumentation/azure-functions.js b/lib/instrumentation/azure-functions.js index ea1247bae0..f6db3474d6 100644 --- a/lib/instrumentation/azure-functions.js +++ b/lib/instrumentation/azure-functions.js @@ -363,30 +363,57 @@ function instrument(agent) { isFirstRun = false; } + // In programming model v3 the InvocationContext includes + // `bindingDefinitions` and `executionContext`. In v4 the structure is a + // little different. + let bindingDefinitions = context.bindingDefinitions; + if (!bindingDefinitions) { + bindingDefinitions = []; + // Input bindings + bindingDefinitions.push({ + name: context?.options?.trigger?.name, + type: context?.options?.trigger?.type, + direction: context?.options?.trigger?.direction, + }); + // Output bindings + if (context?.options?.return) { + bindingDefinitions.push(context?.options?.return); + } + } + let executionContext = context.executionContext; + if (!executionContext) { + executionContext = { + functionDirectory: '', + functionName: context.functionName, + }; + } + const funcInfo = (hookCtx.hookData.funcInfo = new FunctionInfo( - context.bindingDefinitions, - context.executionContext, + bindingDefinitions, + executionContext, log, )); const triggerType = funcInfo.triggerType; - // Handle trace-context. - // Note: We ignore the `context.traceContext`. By default it is W3C - // trace-context that continues the given traceparent in headers. However, - // we do not injest that span, so would get a broken distributed trace if - // we included it. + // `InvocationContext.traceContext` is broken: it results in sampled=false + // (i.e. traces are discarded) and/or broken traces because it creates an + // internal Span ID in the trace that cannot be ingested. + // See this for full explanation: + // https://github.com/elastic/apm-agent-nodejs/pull/4426#issuecomment-2596922653 let traceparent; let tracestate; - if (triggerType === TRIGGER_HTTP && context.req && context.req.headers) { - traceparent = - context.req.headers.traceparent || - context.req.headers['elastic-apm-traceparent']; + if (triggerType === TRIGGER_HTTP && context?.req?.headers?.traceparent) { + traceparent = context.req.headers.traceparent; tracestate = context.req.headers.tracestate; + log.trace( + { traceparent, tracestate }, + 'azure-functions: get trace-context from HTTP trigger request headers', + ); } const trans = (hookCtx.hookData.trans = ins.startTransaction( // This is the default name. Trigger-specific values are added below. - context.executionContext.functionName, + executionContext.functionName, TRANS_TYPE_FROM_TRIGGER_TYPE[triggerType], { childOf: traceparent, @@ -399,7 +426,7 @@ function instrument(agent) { const accountId = getAzureAccountId(); const resourceGroup = process.env.WEBSITE_RESOURCE_GROUP; const fnAppName = process.env.WEBSITE_SITE_NAME; - const fnName = context.executionContext.functionName; + const fnName = executionContext.functionName; const faasData = { trigger: { type: FAAS_TRIGGER_TYPE_FROM_TRIGGER_TYPE[triggerType], diff --git a/lib/instrumentation/generic-span.js b/lib/instrumentation/generic-span.js index 0fcd7f43ac..f049167e38 100644 --- a/lib/instrumentation/generic-span.js +++ b/lib/instrumentation/generic-span.js @@ -170,28 +170,31 @@ GenericSpan.prototype.addLabels = function (labels, stringify) { return true; }; -// This method is private because the APM agents spec says that (for OTel -// compat), adding links after span creation should not be allowed. -// https://github.com/elastic/apm/blob/main/specs/agents/span-links.md -// -// To support adding span links for SQS ReceiveMessage and equivalent, the -// message data isn't known until the *response*, after the span has been -// created. +// Add span links. // // @param {Array} links - An array of objects with a `context` property that is -// a Transaction, Span, or TraceParent instance, or a W3C trace-context -// 'traceparent' string. -GenericSpan.prototype._addLinks = function (links) { +// a Transaction, Span, or TraceParent instance; an OTel SpanContext object; +// or a W3C trace-context 'traceparent' string. +GenericSpan.prototype.addLinks = function (links) { if (links) { for (let i = 0; i < links.length; i++) { - const link = linkFromLinkArg(links[i]); - if (link) { - this._links.push(link); - } + this.addLink(links[i]); } } }; +// Add a span link. +// +// @param {Link} link - An object with a `context` property that is +// a Transaction, Span, or TraceParent instance; an OTel SpanContext object; +// or a W3C trace-context 'traceparent' string. +GenericSpan.prototype.addLink = function (linkArg) { + const link = linkFromLinkArg(linkArg); + if (link) { + this._links.push(link); + } +}; + GenericSpan.prototype._freezeOutcome = function () { this._isOutcomeFrozen = true; }; @@ -278,9 +281,9 @@ GenericSpan.prototype._serializeOTel = function (payload) { // span link as it will be serialized and sent to APM server. If the linkArg is // invalid, this will return null. // -// @param {Object} linkArg - An object with a `context` property that is a -// Transaction, Span, or TraceParent instance, or a W3C trace-context -// 'traceparent' string. +// @param {Object} linkArg - An object with a `context` property that is +// a Transaction, Span, or TraceParent instance; an OTel SpanContext object; +// or a W3C trace-context 'traceparent' string. function linkFromLinkArg(linkArg) { if (!linkArg || !linkArg.context) { return null; @@ -290,7 +293,13 @@ function linkFromLinkArg(linkArg) { let traceId; let spanId; - if (ctx._context instanceof TraceContext) { + if (ctx.traceId && ctx.spanId) { + // Duck-typing for an OTel SpanContext. APM intake v2 only supports the + // trace id and span id fields for span links, so we only need care about + // those attributes. + traceId = ctx.traceId; + spanId = ctx.spanId; + } else if (ctx._context instanceof TraceContext) { // Transaction or Span traceId = ctx._context.traceparent.traceId; spanId = ctx._context.traceparent.id; diff --git a/lib/instrumentation/index.js b/lib/instrumentation/index.js index 8af059cff2..0b81cf8fc9 100644 --- a/lib/instrumentation/index.js +++ b/lib/instrumentation/index.js @@ -374,7 +374,7 @@ Instrumentation.prototype.clearPatches = function (modules) { // If in a Lambda environment, find its handler and add a patcher for it. Instrumentation.prototype._maybeLoadLambdaPatcher = function () { - let lambdaHandlerInfo = getLambdaHandlerInfo(process.env); + let lambdaHandlerInfo = getLambdaHandlerInfo(process.env, this._log); if (lambdaHandlerInfo && this._patcherReg.has(lambdaHandlerInfo.modName)) { this._log.warn( @@ -745,6 +745,10 @@ Instrumentation.prototype.addEndedTransaction = function (transaction) { !transaction.sampled && !agent._apmClient.supportsKeepingUnsampledTransaction() ) { + agent.logger.debug( + { trans: transaction.id, trace: transaction.traceId }, + 'dropping unsampled transaction', + ); return; } diff --git a/lib/instrumentation/modules/@aws-sdk/client-sns.js b/lib/instrumentation/modules/@aws-sdk/client-sns.js index 5b0de919c1..225bedb866 100644 --- a/lib/instrumentation/modules/@aws-sdk/client-sns.js +++ b/lib/instrumentation/modules/@aws-sdk/client-sns.js @@ -36,28 +36,30 @@ function snsMiddlewareFactory(client, agent) { const targetId = input && (input.TopicArn || input.TargetArn || input.PhoneNumber); - // Though our spec only mentions a 10-message-attribute limit for *SQS*, we'll - // do the same limit here, because - // https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html - // mentions the 10-message-attribute limit for SQS subscriptions. - input.MessageAttributes = input.MessageAttributes || {}; - const attributesCount = Object.keys(input.MessageAttributes).length; - - if (attributesCount + 2 > MAX_SNS_MESSAGE_ATTRIBUTES) { - log.warn( - 'cannot propagate trace-context with SNS message to %s, too many MessageAttributes', - targetId, - ); - } else { - parentSpan.propagateTraceContextHeaders( - input.MessageAttributes, - function (msgAttrs, name, value) { - if (name.startsWith('elastic-')) { - return; - } - msgAttrs[name] = { DataType: 'String', StringValue: value }; - }, - ); + if (parentSpan) { + // Though our spec only mentions a 10-message-attribute limit for *SQS*, we'll + // do the same limit here, because + // https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html + // mentions the 10-message-attribute limit for SQS subscriptions. + input.MessageAttributes = input.MessageAttributes || {}; + const attributesCount = Object.keys(input.MessageAttributes).length; + + if (attributesCount + 2 > MAX_SNS_MESSAGE_ATTRIBUTES) { + log.warn( + 'cannot propagate trace-context with SNS message to %s, too many MessageAttributes', + targetId, + ); + } else { + parentSpan.propagateTraceContextHeaders( + input.MessageAttributes, + function (msgAttrs, name, value) { + if (name.startsWith('elastic-')) { + return; + } + msgAttrs[name] = { DataType: 'String', StringValue: value }; + }, + ); + } } // Ensure there is a span from the wrapped `client.send()`. diff --git a/lib/instrumentation/modules/@aws-sdk/client-sqs.js b/lib/instrumentation/modules/@aws-sdk/client-sqs.js index e6fab7dd22..ab3bb5348d 100644 --- a/lib/instrumentation/modules/@aws-sdk/client-sqs.js +++ b/lib/instrumentation/modules/@aws-sdk/client-sqs.js @@ -160,7 +160,7 @@ function sqsMiddlewareFactory(client, agent) { // Links const links = getSpanLinksFromResponseData(result && result.output); if (links) { - span._addLinks(links); + span.addLinks(links); } // Metrics diff --git a/lib/instrumentation/modules/@hapi/hapi.js b/lib/instrumentation/modules/@hapi/hapi.js index e33b996c85..838d395523 100644 --- a/lib/instrumentation/modules/@hapi/hapi.js +++ b/lib/instrumentation/modules/@hapi/hapi.js @@ -12,6 +12,69 @@ var shimmer = require('../../shimmer'); var onPreAuthSym = Symbol('ElasticAPMOnPreAuth'); +// Collect simple data a Hapi `event.data` object, typically from a Hapi +// 'log' or 'request' server event (https://hapi.dev/api/#server.events). This +// limits to including simple property values (bool, string, number, Date) to +// limit the possibility of accidentally capturing huge data in `captureError` +// below. +// +// This implementation is based on lib/errors.js#attributesFromErr. +function simpleDataFromEventData(agent, eventData) { + try { + let simpleRepr = simpleReprFromVal(eventData); + if (simpleRepr !== undefined) { + return simpleRepr; + } + + let n = 0; + const attrs = {}; + const keys = Object.keys(eventData); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + let val = eventData[key]; + simpleRepr = simpleReprFromVal(val); + if (simpleRepr) { + attrs[key] = simpleRepr; + n++; + } + } + return n ? attrs : undefined; + } catch (err) { + agent.logger.trace( + 'hapi: could not gather simple attrs from event data: ' + err.message, + ); + } +} + +// If `val` is a "simple" type (bool, string, number, Date), then return a +// reasonable value to represent it in a JSON serialization. Otherwise, return +// undefined. +function simpleReprFromVal(val) { + switch (typeof val) { + case 'boolean': + case 'string': + case 'number': + break; + case 'object': + // Ignore all objects except Dates. + if ( + val === null || + typeof val.toISOString !== 'function' || + typeof val.getTime !== 'function' + ) { + return; + } else if (Number.isNaN(val.getTime())) { + val = 'Invalid Date'; // calling toISOString() on invalid dates throws + } else { + val = val.toISOString(); + } + break; + default: + return; + } + return val; +} + module.exports = function (hapi, agent, { version, enabled }) { if (!enabled) { return hapi; @@ -64,23 +127,28 @@ module.exports = function (hapi, agent, { version, enabled }) { return; } - // TODO: Find better location to put this than custom - var payload = { + // Hapi 'log' and 'request' events (https://hapi.dev/api/#server.events) + // have `event.error`, `event.data`, or neither. + // `agent.captureError` requires an Error instance or string for its first + // arg: bias to getting that, then any other data add to `opts.custom.data`. + const info = event.error || event.data; + let errOrStr, data; + if (info instanceof Error || typeof info === 'string') { + errOrStr = info; + } else if (info) { + data = simpleDataFromEventData(agent, info); + } + if (!errOrStr) { + errOrStr = 'hapi server emitted a "' + type + '" event tagged "error"'; + } + + agent.captureError(errOrStr, { custom: { tags: event.tags, - internals: event.internals, - // Moved from data to error in hapi 17 - data: event.data || event.error, + data, }, request: req && req.raw && req.raw.req, - }; - - var err = payload.custom.data; - if (!(err instanceof Error) && typeof err !== 'string') { - err = 'hapi server emitted a ' + type + ' event tagged error'; - } - - agent.captureError(err, payload); + }); } function onPreAuth(request, reply) { diff --git a/lib/instrumentation/modules/@smithy/smithy-client.js b/lib/instrumentation/modules/@smithy/smithy-client.js index e54b868600..fb128e53a9 100644 --- a/lib/instrumentation/modules/@smithy/smithy-client.js +++ b/lib/instrumentation/modules/@smithy/smithy-client.js @@ -107,10 +107,10 @@ module.exports = function (mod, agent, { name, version, enabled }) { if (!enabled) return mod; // As of `@aws-sdk/*@3.363.0` the underlying smithy-client is under the - // `@smithy/` npm org and is 1.x. + // `@smithy/` npm org. if ( name === '@smithy/smithy-client' && - !semver.satisfies(version, '>=1 <3') + !semver.satisfies(version, '>=1 <5') ) { agent.logger.debug( 'cannot instrument @aws-sdk/client-*: @smithy/smithy-client version %s not supported', diff --git a/lib/instrumentation/modules/aws-sdk/sqs.js b/lib/instrumentation/modules/aws-sdk/sqs.js index 3586f55210..1ef51f534d 100644 --- a/lib/instrumentation/modules/aws-sdk/sqs.js +++ b/lib/instrumentation/modules/aws-sdk/sqs.js @@ -320,7 +320,7 @@ function instrumentationSqs( if (receiveMsgData) { const links = getSpanLinksFromResponseData(receiveMsgData); if (links) { - span._addLinks(links); + span.addLinks(links); } } diff --git a/lib/instrumentation/modules/express.js b/lib/instrumentation/modules/express.js index d7784cfaf1..a9c33df75f 100644 --- a/lib/instrumentation/modules/express.js +++ b/lib/instrumentation/modules/express.js @@ -17,10 +17,19 @@ module.exports = function (express, agent, { version, enabled }) { agent.setFramework({ name: 'express', version, overwrite: false }); - if (!semver.satisfies(version, '^4.0.0')) { + if (!semver.satisfies(version, '>=4.0.0 <6')) { + agent.logger.debug('cannot instrument express version %s', version); + return express; + } + + if ( + semver.satisfies(version, '>5') && + semver.satisfies(process.version, '<18') + ) { agent.logger.debug( - 'express version %s not supported - aborting...', + 'express version %s not supported for node version %s, skipping express instrumentation', version, + process.version, ); return express; } diff --git a/lib/instrumentation/modules/kafkajs.js b/lib/instrumentation/modules/kafkajs.js index 8838f3dd64..c0e10b1685 100644 --- a/lib/instrumentation/modules/kafkajs.js +++ b/lib/instrumentation/modules/kafkajs.js @@ -238,7 +238,7 @@ module.exports = function (mod, agent, { version, enabled }) { } } } - trans._addLinks(links); + trans.addLinks(links); } let result, err; diff --git a/lib/instrumentation/modules/koa-router.js b/lib/instrumentation/modules/koa-router.js index 360fd9fee4..5d71ead9b7 100644 --- a/lib/instrumentation/modules/koa-router.js +++ b/lib/instrumentation/modules/koa-router.js @@ -12,13 +12,24 @@ var shimmer = require('../shimmer'); module.exports = function (Router, agent, { version, enabled }) { if (!enabled) return Router; - if (!semver.satisfies(version, '>=5.2.0 <13')) { + if (!semver.satisfies(version, '>=5.2.0 <14')) { agent.logger.debug( 'koa-router version %s not supported - aborting...', version, ); return Router; } + if ( + semver.satisfies(version, '>=13') && + semver.satisfies(process.version, '<18') + ) { + agent.logger.debug( + 'koa-router version %s not supported for node %s - aborting...', + version, + process.version, + ); + return Router; + } agent.logger.debug('shimming koa-router prototype.match function'); shimmer.wrap(Router.prototype, 'match', function (orig) { diff --git a/lib/instrumentation/modules/mysql2.js b/lib/instrumentation/modules/mysql2.js index b75d663b03..46f031fb23 100644 --- a/lib/instrumentation/modules/mysql2.js +++ b/lib/instrumentation/modules/mysql2.js @@ -27,8 +27,22 @@ module.exports = function (mysql2, agent, { version, enabled }) { var ins = agent._instrumentation; - shimmer.wrap(mysql2.Connection.prototype, 'query', wrapQuery); - shimmer.wrap(mysql2.Connection.prototype, 'execute', wrapQuery); + // mysql2@3.11.5 added BaseConnection class which is extended by Connection + // but is not in the public API so we need to extract it via prototype chain + // ref: https://github.com/sidorares/node-mysql2/pull/3081 + const baseClass = Object.getPrototypeOf(mysql2.Connection); + const baseProto = baseClass.prototype; + const hasQuery = typeof baseProto?.query === 'function'; + const hasExec = typeof baseProto?.execute === 'function'; + const shouldPatchBase = hasQuery && hasExec; + + if (shouldPatchBase) { + shimmer.wrap(baseProto, 'query', wrapQuery); + shimmer.wrap(baseProto, 'execute', wrapQuery); + } else { + shimmer.wrap(mysql2.Connection.prototype, 'query', wrapQuery); + shimmer.wrap(mysql2.Connection.prototype, 'execute', wrapQuery); + } return mysql2; diff --git a/lib/instrumentation/modules/tedious.js b/lib/instrumentation/modules/tedious.js index 8fc23153e8..a5f6a46958 100644 --- a/lib/instrumentation/modules/tedious.js +++ b/lib/instrumentation/modules/tedious.js @@ -14,7 +14,18 @@ var { getDBDestination } = require('../context'); module.exports = function (tedious, agent, { version, enabled }) { if (!enabled) return tedious; - if (version === '4.0.0' || !semver.satisfies(version, '>=1.9.0 <19')) { + if ( + semver.satisfies(version, '>=19') && + !semver.satisfies(process.version, '>=18.17') + ) { + agent.logger.debug( + 'tedious version %s not supported for node %s - aborting...', + version, + process.version, + ); + return tedious; + } + if (version === '4.0.0' || !semver.satisfies(version, '>=1.9.0 <20')) { agent.logger.debug( 'tedious version %s not supported - aborting...', version, diff --git a/lib/instrumentation/noop-transaction.js b/lib/instrumentation/noop-transaction.js index 2d3dffc795..5c1e4df291 100644 --- a/lib/instrumentation/noop-transaction.js +++ b/lib/instrumentation/noop-transaction.js @@ -69,6 +69,11 @@ class NoopTransaction { duration() { return 0; } + setFaas() {} + setMessageContext() {} + setServiceContext() {} + setCloudContext() {} + _setOutcomeFromHttpStatusCode() {} } module.exports = { diff --git a/lib/instrumentation/transaction.js b/lib/instrumentation/transaction.js index d5be893936..feb9d469df 100644 --- a/lib/instrumentation/transaction.js +++ b/lib/instrumentation/transaction.js @@ -88,8 +88,10 @@ function Transaction(agent, name, ...args) { trans: this.id, parent: this.parentId, trace: this.traceId, + sampled: this.sampled, name: this.name, type: this.type, + traceparent: this.traceparent, }); this._defaultName = name || ''; diff --git a/lib/lambda.js b/lib/lambda.js index b7d4d9ada5..5255c09fba 100644 --- a/lib/lambda.js +++ b/lib/lambda.js @@ -383,7 +383,7 @@ function setSqsData(agent, trans, event, context, faasId, isColdStart) { trans.setCloudContext(cloudContext); const links = spanLinksFromSqsRecords(event.Records); - trans._addLinks(links); + trans.addLinks(links); } function setSnsData(agent, trans, event, context, faasId, isColdStart) { @@ -424,7 +424,7 @@ function setSnsData(agent, trans, event, context, faasId, isColdStart) { trans.setCloudContext(cloudContext); const links = spanLinksFromSnsRecords(event.Records); - trans._addLinks(links); + trans.addLinks(links); } function setS3SingleData(trans, event, context, faasId, isColdStart) { @@ -817,18 +817,34 @@ function isLambdaExecutionEnvironment() { // .mjs file extension (which indicates an ECMAScript/import module, which the // agent does not support. // -// @param string taskRoot -// @param string handlerModule -// @return string -function getFilePath(taskRoot, handlerModule) { - let filePath = path.resolve(taskRoot, `${handlerModule}.js`); - if (!fs.existsSync(filePath)) { - filePath = path.resolve(taskRoot, `${handlerModule}.cjs`); +// TODO: support "extensionless"? per https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/blob/v3.2.1/src/UserFunction.js#L149 Is this for a dir/index.js? +// TODO: support ESM and .mjs +// +// @param {string} taskRoot +// @param {string} moduleRoot - The subdir under `taskRoot` holding the module. +// @param {string} module - The module name. +// @return {string | null} +function getFilePath(taskRoot, moduleRoot, module) { + const lambdaStylePath = path.resolve(taskRoot, moduleRoot, module); + if (fs.existsSync(lambdaStylePath + '.js')) { + return lambdaStylePath + '.js'; + } else if (fs.existsSync(lambdaStylePath + '.cjs')) { + return lambdaStylePath + '.cjs'; + } else { + return null; } - return filePath; } -function getLambdaHandlerInfo(env) { +/** + * Gather module and export info for the Lambda "handler" string. + * + * Compare to the Node.js Lambda runtime's equivalent processing here: + * https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/blob/v3.2.1/src/UserFunction.js#L288 + * + * @param {object} env - The process environment. + * @param {any} [logger] - Optional logger for trace/warn log output. + */ +function getLambdaHandlerInfo(env, logger) { if ( !isLambdaExecutionEnvironment() || !env._HANDLER || @@ -837,22 +853,48 @@ function getLambdaHandlerInfo(env) { return null; } - // extract module name and "path" from handler using the same regex as the runtime - // from https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/blob/c31c41ffe5f2f03ae9e8589b96f3b005e2bb8a4a/src/utils/UserFunction.ts#L21 - const functionExpression = /^([^.]*)\.(.*)$/; - const match = env._HANDLER.match(functionExpression); + // Dev Note: This intentionally uses some of the same var names at + // https://github.com/aws/aws-lambda-nodejs-runtime-interface-client/blob/v3.2.1/src/UserFunction.js#L288 + const fullHandlerString = env._HANDLER; + const moduleAndHandler = path.basename(fullHandlerString); + const moduleRoot = fullHandlerString.substring( + 0, + fullHandlerString.indexOf(moduleAndHandler), + ); + const FUNCTION_EXPR = /^([^.]*)\.(.*)$/; + const match = moduleAndHandler.match(FUNCTION_EXPR); if (!match || match.length !== 3) { + if (logger) { + logger.warn( + { fullHandlerString, moduleAndHandler }, + 'Lambda handler string did not match FUNCTION_EXPR', + ); + } + return null; + } + const module = match[1]; + const handlerPath = match[2]; + + const moduleAbsPath = getFilePath(env.LAMBDA_TASK_ROOT, moduleRoot, module); + if (!moduleAbsPath) { + if (logger) { + logger.warn( + { fullHandlerString, moduleRoot, module }, + 'could not find Lambda handler module file (ESM not yet supported)', + ); + } return null; } - const handlerModule = match[1].split('/').pop(); - const handlerFunctionPath = match[2]; - const handlerFilePath = getFilePath(env.LAMBDA_TASK_ROOT, match[1]); - return { - filePath: handlerFilePath, - modName: handlerModule, - propPath: handlerFunctionPath, + const lambdaHandlerInfo = { + filePath: moduleAbsPath, + modName: module, + propPath: handlerPath, }; + if (logger) { + logger.trace({ fullHandlerString, lambdaHandlerInfo }, 'lambdaHandlerInfo'); + } + return lambdaHandlerInfo; } function lowerCaseObjectKeys(obj) { diff --git a/lib/opentelemetry-bridge/OTelBridgeNonRecordingSpan.js b/lib/opentelemetry-bridge/OTelBridgeNonRecordingSpan.js index 7fef832d71..7b85d87eed 100644 --- a/lib/opentelemetry-bridge/OTelBridgeNonRecordingSpan.js +++ b/lib/opentelemetry-bridge/OTelBridgeNonRecordingSpan.js @@ -127,6 +127,14 @@ class OTelBridgeNonRecordingSpan { return this; } + addLink(_link) { + return this; + } + + addLinks(_links) { + return this; + } + end(_endTime) {} // isRecording always returns false for NonRecordingSpan. diff --git a/lib/opentelemetry-bridge/OTelSpan.js b/lib/opentelemetry-bridge/OTelSpan.js index 7ea1139ca2..62684a3c8e 100644 --- a/lib/opentelemetry-bridge/OTelSpan.js +++ b/lib/opentelemetry-bridge/OTelSpan.js @@ -167,6 +167,16 @@ class OTelSpan { return this; } + addLink(link) { + this._span.addLink(link); + return this; + } + + addLinks(links) { + this._span.addLinks(links); + return this; + } + end(otelEndTime) { oblog.apicall('%s.end(endTime=%s)', this, otelEndTime); const endTime = diff --git a/lib/stacktraces.js b/lib/stacktraces.js index 3bb510c613..d3eafbd6e9 100644 --- a/lib/stacktraces.js +++ b/lib/stacktraces.js @@ -16,6 +16,7 @@ var fsPromises = require('fs/promises'); var path = require('path'); var { promisify } = require('util'); +const { fileURLToPath } = require('url'); // avoid loading error-callsites until needed to avoid // Error.prepareStackTrace side-effects @@ -89,6 +90,20 @@ function getCwd(log) { return cwd; } +// "filePath" refers to frame.fileName(), but with the possible "file://..." +// URL converted to a local path. An callsite in an ES module will have a +// file URL for the `fileName`. +// +// This just relies on `callsite.getFileName() -> ` +// so it works with CallSite or StackFrames (from `error-stack-parser`). +function filePathFromCallSite(callsite) { + let filePath = callsite.getFileName(); + if (filePath && filePath.startsWith('file://')) { + filePath = fileURLToPath(filePath); + } + return filePath; +} + // If gathering a stacktrace from the structured CallSites fails, this is // used as a fallback: parsing the `err.stack` *string*. function stackTraceFromErrStackString(log, err) { @@ -114,7 +129,7 @@ function stackTraceFromErrStackString(log, err) { const cwd = getCwd(log); for (var i = 0; i < frames.length; i++) { const frame = frames[i]; - const filename = frame.getFileName() || ''; + const filename = filePathFromCallSite(frame) || ''; stacktrace.push({ filename: getRelativeFileName(filename, cwd), function: frame.getFunctionName(), @@ -136,7 +151,7 @@ function isStackFrameApp(stackframe) { if (isStackFrameNode(stackframe)) { return false; } else { - const fileName = stackframe.getFileName(); + const fileName = filePathFromCallSite(stackframe); if (!fileName) { return true; } else if (fileName.indexOf(NODE_MODULES_PATH_SEG) === -1) { @@ -153,7 +168,7 @@ function isStackFrameNode(stackframe) { if (stackframe.isNative) { return true; } else { - const fileName = stackframe.getFileName(); + const fileName = filePathFromCallSite(stackframe); if (!fileName) { return true; } else { @@ -166,7 +181,7 @@ function isCallSiteApp(callsite) { if (isCallSiteNode(callsite)) { return false; } else { - const fileName = callsite.getFileName(); + const fileName = filePathFromCallSite(callsite); if (!fileName) { return true; } else if (fileName.indexOf(NODE_MODULES_PATH_SEG) === -1) { @@ -181,7 +196,7 @@ function isCallSiteNode(callsite) { if (callsite.isNative()) { return true; } else { - const fileName = callsite.getFileName(); + const fileName = filePathFromCallSite(callsite); if (!fileName) { return true; } else { @@ -244,7 +259,7 @@ async function getSourceMapConsumer(callsite) { if (isCallSiteNode(callsite)) { return null; } else { - var filename = callsite.getFileName(); + var filename = filePathFromCallSite(callsite); if (!filename) { return null; } else { @@ -277,7 +292,7 @@ async function frameFromCallSite( sourceLinesLibraryFrames, ) { // getFileName can return null, e.g. with a `at Generator.next ()` frame. - const filename = callsite.getFileName() || ''; + const filename = filePathFromCallSite(callsite) || ''; const lineno = callsite.getLineNumber(); const colno = callsite.getColumnNumber(); diff --git a/package-lock.json b/package-lock.json index ab1853b7e3..c912db48fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "elastic-apm-node", - "version": "4.5.4", + "version": "4.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "elastic-apm-node", - "version": "4.5.4", + "version": "4.13.0", "license": "BSD-2-Clause", "dependencies": { "@elastic/ecs-pino-format": "^1.5.0", @@ -18,7 +18,7 @@ "async-value-promise": "^1.1.1", "basic-auth": "^2.0.1", "breadth-filter": "^2.0.0", - "cookie": "^0.6.0", + "cookie": "^0.7.1", "core-util-is": "^1.0.2", "end-of-stream": "^1.4.4", "error-callsites": "^2.0.4", @@ -27,9 +27,9 @@ "fast-safe-stringify": "^2.0.7", "fast-stream-to-buffer": "^1.0.0", "http-headers": "^3.0.2", - "import-in-the-middle": "1.7.4", + "import-in-the-middle": "1.13.1", "json-bigint": "^1.0.0", - "lru-cache": "^10.0.1", + "lru-cache": "10.2.0", "measured-reporting": "^1.51.1", "module-details-from-path": "^1.0.3", "monitor-event-loop-delay": "^1.0.0", @@ -57,11 +57,11 @@ "@babel/cli": "^7.8.4", "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", - "@elastic/elasticsearch": "^8.6.0", - "@fastify/formbody": "^7.0.1", + "@elastic/elasticsearch": "^9.0.0", + "@fastify/formbody": "^8.0.1", "@hapi/hapi": "^21.0.0", - "@koa/router": "^12.0.0", - "@types/node": "^20.1.0", + "@koa/router": "^13.0.1", + "@types/node": "^22.0.0", "ajv": "^8.12.0", "apollo-server-core": "^3.0.0", "apollo-server-express": "^3.0.0", @@ -77,23 +77,22 @@ "diagnostics_channel": "^1.1.0", "elasticsearch": "^16.7.3", "eslint": "^9.0.0", - "eslint-config-prettier": "^9.0.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.28.0", - "eslint-plugin-license-header": "^0.6.0", + "eslint-plugin-license-header": "^0.8.0", "eslint-plugin-n": "^17.2.0", "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "express": "^4.17.1", + "eslint-plugin-promise": "^7.0.0", + "express": "^5.0.0", "express-queue": "^0.0.13", - "fastify": "^4.16.3", - "finalhandler": "^1.1.2", + "fastify": "^5.0.0", + "finalhandler": "^2.1.0", "generic-pool": "^3.7.1", "get-port": "^5.1.1", - "glob": "^10.3.4", + "glob": "^7.2.3", "got": "^11.8.5", "graphql": "^16.6.0", "handlebars": "^4.7.3", - "https-pem": "^3.0.0", "ioredis": "^5.1.0", "js-yaml": "^4.1.0", "json": "^11.0.0", @@ -101,7 +100,7 @@ "knex": "^3.0.1", "koa": "^2.11.0", "koa-bodyparser": "^4.3.0", - "koa-router": "^12.0.0", + "koa-router": "^13.0.1", "lambda-local": "^2.0.2", "memcached": "^2.2.2", "mimic-response": "1.0.0", @@ -112,25 +111,22 @@ "mysql2": "^3.2.4", "ndjson": "^2.0.0", "numeral": "^2.0.6", - "nyc": "^15.0.0", "once": "^1.4.0", "pg": "^8.7.1", "prettier": "^3.0.0", "pug": "^3.0.1", "redis": "^4.3.0", - "request": "^2.88.2", "restify": "^11.0.0", - "rimraf": "^5.0.1", - "tap-junit": "^5.0.1", + "rimraf": "^3.0.2", "tape": "^5.0.0", - "tedious": "^18.1.0", + "tedious": "^19.0.0", "test-all-versions": "^6.1.0", "thunky": "^1.1.0", "tree-kill": "^1.2.2", "typescript": "^5.0.2", - "undici": "^6.2.1", + "undici": "^7.0.0", "vasync": "^2.2.0", - "wait-on": "^7.0.1", + "wait-on": "^8.0.0", "ws": "^7.2.1" }, "engines": { @@ -201,15 +197,16 @@ "dev": true }, "node_modules/@apollo/server": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.4.tgz", - "integrity": "sha512-HS12CUa1wq8f5zKXOKJRwRdESFp4por9AINecpcsEUV9jsCP/NqPILgx0hCOOFJuKxmnaL7070xO6l5xmOq4Fw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.0.tgz", + "integrity": "sha512-Z5RNTCnIia+dFsP5HW2ugQMrIOWgyNWyKP+jMVXthp/ECjYyyRYPC41ukCDwxHQY4vNZ3rgbgqroWVQUGFt2gA==", "dev": true, + "license": "MIT", "dependencies": { "@apollo/cache-control-types": "^1.0.3", "@apollo/server-gateway-interface": "^1.1.1", "@apollo/usage-reporting-protobuf": "^4.1.1", - "@apollo/utils.createhash": "^2.0.0", + "@apollo/utils.createhash": "^2.0.2", "@apollo/utils.fetcher": "^2.0.0", "@apollo/utils.isnodelike": "^2.0.0", "@apollo/utils.keyvaluecache": "^2.1.0", @@ -217,13 +214,12 @@ "@apollo/utils.usagereporting": "^2.1.0", "@apollo/utils.withrequired": "^2.0.0", "@graphql-tools/schema": "^9.0.0", - "@josephg/resolvable": "^1.0.0", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.30", "@types/node-fetch": "^2.6.1", "async-retry": "^1.2.1", "cors": "^2.8.5", - "express": "^4.17.1", + "express": "^4.21.1", "loglevel": "^1.6.8", "lru-cache": "^7.10.1", "negotiator": "^0.6.3", @@ -431,6 +427,128 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, + "node_modules/@apollo/server/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@apollo/server/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/@apollo/server/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@apollo/server/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@apollo/server/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@apollo/server/node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@apollo/server/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@apollo/server/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@apollo/server/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -440,6 +558,110 @@ "node": ">=12" } }, + "node_modules/@apollo/server/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@apollo/server/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/@apollo/server/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "node_modules/@apollo/server/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/@apollo/server/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@apollo/server/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@apollo/server/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/@apollo/server/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@apollo/server/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@apollo/server/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -493,12 +715,12 @@ } }, "node_modules/@apollo/utils.createhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.0.tgz", - "integrity": "sha512-9GhGGD3J0HJF/VC+odwYpKi3Cg1NWrsO8GQvyGwDS5v/78I3154Hn8s4tpW+nqoaQ/lAvxdQQr3HM1b5HLM6Ww==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.2.tgz", + "integrity": "sha512-UkS3xqnVFLZ3JFpEmU/2cM2iKJotQXMoSTgxXsfQgXLC5gR1WaepoXagmYnPSA7Q/2cmnyTYK5OgAgoC4RULPg==", "dev": true, "dependencies": { - "@apollo/utils.isnodelike": "^2.0.0", + "@apollo/utils.isnodelike": "^2.0.1", "sha.js": "^2.4.11" }, "engines": { @@ -527,9 +749,9 @@ } }, "node_modules/@apollo/utils.isnodelike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.0.tgz", - "integrity": "sha512-77CiAM2qDXn0haQYrgX0UgrboQykb+bOHaz5p3KKItMwUZ/EFphzuB2vqHvubneIc9dxJcTx2L7MFDswRw/JAQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz", + "integrity": "sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==", "dev": true, "engines": { "node": ">=14" @@ -546,9 +768,9 @@ } }, "node_modules/@apollo/utils.keyvaluecache/node_modules/lru-cache": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", - "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" @@ -2130,35 +2352,59 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", - "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", "dev": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-auth/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz", - "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dev": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.5.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-client/node_modules/@azure/core-tracing": { @@ -2215,50 +2461,46 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.8.1.tgz", - "integrity": "sha512-R/XpxZcDgGbnneEifnsAcjLoR2NCmlDxKDmzd8oi5jx5YEnPE6gsxHQWAk2+uY55Ka717x/fdctyoCYKnumrqw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.0.tgz", + "integrity": "sha512-CeuTvsXxCUmEuxH5g/aceuSl6w2EugvNHKAtKKVdiX915EjJJxAwfzNNWZreNnbxHZ2fi0zaM6wwS23x2JVqSQ==", "dev": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.9.0", "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", + "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "tslib": "^2.2.0" }, "engines": { - "node": ">= 6" + "node": ">=12.0.0" } }, "node_modules/@azure/core-tracing": { @@ -2275,33 +2517,45 @@ } }, "node_modules/@azure/core-util": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", - "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/identity": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.1.tgz", - "integrity": "sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.3.0.tgz", + "integrity": "sha512-LHZ58/RsIpIWa4hrrE2YuJ/vzG1Jv9f774RfTTAVDZDriubvJ0/S5u4pnw4akJDlS0TiJb6VMphmVUFsWmgodQ==", "dev": true, "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", - "@azure/core-client": "^1.4.0", + "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.6.1", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.5.0", - "@azure/msal-node": "^2.5.1", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -2309,19 +2563,19 @@ "tslib": "^2.2.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/identity/node_modules/@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", "dev": true, "dependencies": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=18.0.0" } }, "node_modules/@azure/identity/node_modules/events": { @@ -2380,48 +2634,49 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.6.0.tgz", - "integrity": "sha512-FrFBJXRJMyWXjAjg4cUNZwEKktzfzD/YD9+S1kj2ors67hKoveam4aL0bZuCZU/jTiHTn0xDQGQh2ksCMXTXtA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.17.0.tgz", + "integrity": "sha512-csccKXmW2z7EkZ0I3yAoW/offQt+JECdTIV/KrnRoZyM7wCSsQWODpwod8ZhYy7iOyamcHApR9uCh0oD1M+0/A==", "dev": true, "dependencies": { - "@azure/msal-common": "14.5.0" + "@azure/msal-common": "14.12.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.5.0.tgz", - "integrity": "sha512-Gx5rZbiZV/HiZ2nEKfjfAF/qDdZ4/QWxMvMo2jhIFVz528dVKtaZyFAOtsX2Ak8+TQvRsGCaEfuwJFuXB6tu1A==", + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.0.tgz", - "integrity": "sha512-RWAWCYYrSldIYC47oWtofIun41e6SB9TBYgGYsezq6ednagwo9ZRFyRsvl1NabmdTkdDDXRAABIdveeN2Gtd8w==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", "dev": true, "dependencies": { - "@azure/msal-common": "14.5.0", + "@azure/msal-common": "14.12.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, "engines": { - "node": "16|| 18 || 20" + "node": ">=16" } }, "node_modules/@babel/cli": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", - "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.0.tgz", + "integrity": "sha512-bZfxn8DRxwiVzDO5CEeV+7IqXeCkzI4yYnrQbpwjT76CUyossQc6RYE7n+xfm0/2k40lPaCpW0FhxYs7EBAetw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", - "commander": "^4.0.1", + "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.2.0", @@ -2437,7 +2692,7 @@ }, "optionalDependencies": { "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" + "chokidar": "^3.6.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -2449,64 +2704,48 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/@babel/cli/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2537,15 +2776,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -2566,38 +2807,28 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -2630,19 +2861,18 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -2657,18 +2887,20 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -2688,10 +2920,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -2703,75 +2936,44 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2781,35 +2983,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2819,14 +3024,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2835,116 +3041,88 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@babel/parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.27.1" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -2952,13 +3130,15 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2967,31 +3147,30 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.13.0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3000,104 +3179,46 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, "engines": { "node": ">=6.9.0" }, @@ -3105,109 +3226,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3216,13 +3242,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3248,12 +3275,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3263,15 +3291,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3281,14 +3309,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3298,12 +3327,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3313,12 +3343,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3328,13 +3359,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3344,14 +3376,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3361,18 +3393,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -3383,13 +3414,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3399,12 +3431,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3414,13 +3447,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3430,12 +3464,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3444,14 +3479,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3461,13 +3513,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3477,13 +3529,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3493,13 +3545,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3509,14 +3562,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3526,13 +3580,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3542,12 +3596,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3557,13 +3612,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3573,12 +3628,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3588,13 +3644,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3604,14 +3661,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3621,15 +3678,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3639,13 +3697,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3655,13 +3714,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3671,12 +3731,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3686,13 +3747,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3702,13 +3763,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3718,16 +3779,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", + "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3737,13 +3797,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3753,13 +3814,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3769,14 +3830,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3786,12 +3847,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3801,13 +3863,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3817,15 +3880,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3835,12 +3898,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3850,13 +3914,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3865,13 +3929,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3881,12 +3963,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3896,13 +3979,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3912,12 +3996,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3927,12 +4012,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3942,12 +4028,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3957,12 +4044,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3972,13 +4060,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3988,13 +4077,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4004,13 +4094,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4020,90 +4111,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz", + "integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.1", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -4136,52 +4217,33 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -4190,14 +4252,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4243,12 +4305,14 @@ } }, "node_modules/@elastic/elasticsearch": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.13.1.tgz", - "integrity": "sha512-2G4Vu6OHw4+XTrp7AGIcOEezpPEoVrWg2JTK1v/exEKSLYquZkUdd+m4yOL3/UZ6bTj7hmXwrmYzW76BnLCkJQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-9.0.1.tgz", + "integrity": "sha512-V/Hj/ePRiC6H8vOQF4GfOGIUFjYyA2C1Je6qKBD20AShmxqkaTRAQSvia4tvLobHqjrljUzb6khfhDuPrb6E8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@elastic/transport": "~8.4.1", + "@elastic/transport": "^9.0.1", + "apache-arrow": "18.x - 19.x", "tslib": "^2.4.0" }, "engines": { @@ -4256,29 +4320,38 @@ } }, "node_modules/@elastic/transport": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.4.1.tgz", - "integrity": "sha512-/SXVuVnuU5b4dq8OFY4izG+dmGla185PcoqgK6+AJMpmOeY1QYVNbWtCwvSvoAANN5D/wV+EBU8+x7Vf9EphbA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-9.0.1.tgz", + "integrity": "sha512-6jVZQzAe2iTRsZA6I/wkO2BjzJFD9BHTASo2YgGfbcoV95ey/8D/ABRhpgfg35LIDrmialIGJBizunSwxsRDLg==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "hpagent": "^1.0.0", + "@opentelemetry/api": "1.x", + "debug": "^4.4.0", + "hpagent": "^1.2.0", "ms": "^2.1.3", - "secure-json-parse": "^2.4.0", - "tslib": "^2.4.0", - "undici": "^5.22.1" + "secure-json-parse": "^3.0.2", + "tslib": "^2.8.1", + "undici": "^7.2.3" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@elastic/transport/node_modules/hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", + "node_modules/@elastic/transport/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=14" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/@elastic/transport/node_modules/ms": { @@ -4287,37 +4360,29 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/@elastic/transport/node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4327,19 +4392,58 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -4363,6 +4467,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4379,6 +4484,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4390,80 +4496,121 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, "engines": { - "node": ">=14" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", - "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==", - "dev": true + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.1.tgz", + "integrity": "sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==", + "dev": true, + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } }, "node_modules/@fastify/error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", - "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.0.0.tgz", + "integrity": "sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==", "dev": true }, "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", - "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.1.tgz", + "integrity": "sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==", + "dev": true, + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "node_modules/@fastify/formbody": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-8.0.2.tgz", + "integrity": "sha512-84v5J2KrkXzjgBpYnaNRPqwgMsmY7ZDjuj0YVuMR3NXCJRCgKEZy/taSP1wUYGn0onfxJpLyRGDLa+NMaDJtnA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "dependencies": { - "fast-json-stringify": "^5.7.0" + "fast-querystring": "^1.1.2", + "fastify-plugin": "^5.0.0" } }, - "node_modules/@fastify/fast-json-stringify-compiler/node_modules/fast-json-stringify": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.7.0.tgz", - "integrity": "sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==", + "node_modules/@fastify/forwarded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.0.tgz", + "integrity": "sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==", + "dev": true + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", "dev": true, "dependencies": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" + "fast-deep-equal": "^3.1.3" } }, - "node_modules/@fastify/formbody": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-7.4.0.tgz", - "integrity": "sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==", + "node_modules/@fastify/proxy-addr": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.0.0.tgz", + "integrity": "sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==", "dev": true, "dependencies": { - "fast-querystring": "^1.0.0", - "fastify-plugin": "^4.0.0" + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@fastify/proxy-addr/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" } }, "node_modules/@graphql-tools/merge": { @@ -4555,9 +4702,9 @@ } }, "node_modules/@hapi/accept": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.1.tgz", - "integrity": "sha512-aLkYj7zzgC3CSlEVOs84eBOEE3i9xZK2tdQEP+TOj2OFzMWCi9zjkRet82V3GGjecE//zFrCLKIykuaE0uM4bg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.3.tgz", + "integrity": "sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw==", "dev": true, "dependencies": { "@hapi/boom": "^10.0.1", @@ -4565,9 +4712,9 @@ } }, "node_modules/@hapi/accept/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.6.tgz", + "integrity": "sha512-mu8He+jghTDJ+la/uGBT4b1rqQdqFADZiXhzd98b3XW5nb/c+5woXx3FiNco2nm4wPJFHQVRGxYeWeSDPIYpYw==", "dev": true }, "node_modules/@hapi/ammo": { @@ -4616,9 +4763,9 @@ "dev": true }, "node_modules/@hapi/bounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.1.tgz", - "integrity": "sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.2.tgz", + "integrity": "sha512-d0XmlTi3H9HFDHhQLjg4F4auL1EY3Wqj7j7/hGDhFFe6xAbnm3qiGrXeT93zZnPH8gH+SKAFYiRzu26xkXcH3g==", "dev": true, "dependencies": { "@hapi/boom": "^10.0.1", @@ -4666,9 +4813,9 @@ } }, "node_modules/@hapi/catbox-memory": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.1.tgz", - "integrity": "sha512-sVb+/ZxbZIvaMtJfAbdyY+QJUQg9oKTwamXpEg/5xnfG5WbJLTjvEn4kIGKz9pN3ENNbIL/bIdctmHmqi/AdGA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz", + "integrity": "sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g==", "dev": true, "dependencies": { "@hapi/boom": "^10.0.1", @@ -4676,9 +4823,9 @@ } }, "node_modules/@hapi/catbox-memory/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.4.tgz", + "integrity": "sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ==", "dev": true }, "node_modules/@hapi/catbox/node_modules/@hapi/hoek": { @@ -4701,6 +4848,7 @@ "resolved": "https://registry.npmjs.org/@hapi/cryptiles/-/cryptiles-6.0.1.tgz", "integrity": "sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/boom": "^10.0.1" }, @@ -4715,28 +4863,29 @@ "dev": true }, "node_modules/@hapi/hapi": { - "version": "21.3.9", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.9.tgz", - "integrity": "sha512-AT5m+Rb8iSOFG3zWaiEuTJazf4HDYl5UpRpyxMJ3yR+g8tOEmqDv6FmXrLHShdvDOStAAepHGnr1G7egkFSRdw==", + "version": "21.4.0", + "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.4.0.tgz", + "integrity": "sha512-kqiRWbYYLSSt2rYbxyNj8svPsXP715p4W/K3OXpXeiiVLNSdBX4f+zfmC+dY6eyb6rqTqTAbx6x8b5HpJTkviQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@hapi/accept": "^6.0.1", + "@hapi/accept": "^6.0.3", "@hapi/ammo": "^6.0.1", "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", + "@hapi/bounce": "^3.0.2", "@hapi/call": "^9.0.1", "@hapi/catbox": "^12.1.1", - "@hapi/catbox-memory": "^6.0.1", + "@hapi/catbox-memory": "^6.0.2", "@hapi/heavy": "^8.0.1", - "@hapi/hoek": "^11.0.2", + "@hapi/hoek": "^11.0.6", "@hapi/mimos": "^7.0.1", "@hapi/podium": "^5.0.1", "@hapi/shot": "^6.0.1", "@hapi/somever": "^4.1.1", - "@hapi/statehood": "^8.1.1", + "@hapi/statehood": "^8.2.0", "@hapi/subtext": "^8.1.0", "@hapi/teamwork": "^6.0.0", - "@hapi/topo": "^6.0.1", + "@hapi/topo": "^6.0.2", "@hapi/validate": "^2.0.1" }, "engines": { @@ -4744,15 +4893,15 @@ } }, "node_modules/@hapi/hapi/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.6.tgz", + "integrity": "sha512-mu8He+jghTDJ+la/uGBT4b1rqQdqFADZiXhzd98b3XW5nb/c+5woXx3FiNco2nm4wPJFHQVRGxYeWeSDPIYpYw==", "dev": true }, "node_modules/@hapi/hapi/node_modules/@hapi/topo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.1.tgz", - "integrity": "sha512-JioWUZL1Bm7r8bnCDx2AUggiPwpV7djFfDTWT1aZSyHjN++fVz7XPdW8YVCxvyv9bSWcbbOLV/h4U1zGdwrN3w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dev": true, "dependencies": { "@hapi/hoek": "^11.0.2" @@ -4786,6 +4935,7 @@ "resolved": "https://registry.npmjs.org/@hapi/iron/-/iron-7.0.1.tgz", "integrity": "sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/b64": "^6.0.1", "@hapi/boom": "^10.0.1", @@ -4795,10 +4945,11 @@ } }, "node_modules/@hapi/iron/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", - "dev": true + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@hapi/mimos": { "version": "7.0.1", @@ -4904,10 +5055,11 @@ "dev": true }, "node_modules/@hapi/statehood": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.1.1.tgz", - "integrity": "sha512-YbK7PSVUA59NArAW5Np0tKRoIZ5VNYUicOk7uJmWZF6XyH5gGL+k62w77SIJb0AoAJ0QdGQMCQ/WOGL1S3Ydow==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.2.0.tgz", + "integrity": "sha512-63JlCVIrsmuunWsyc3OeuFO+gH6v56swLCl7OM1w09l/exQKPUxSUDF2Slkuw8k91nIzr0A2/aPvjLOWf9ksrg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bounce": "^3.0.1", @@ -4919,10 +5071,11 @@ } }, "node_modules/@hapi/statehood/node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", - "dev": true + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@hapi/subtext": { "version": "8.1.0", @@ -5020,18 +5173,39 @@ "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", "dev": true }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -5047,17 +5221,12 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -5072,149 +5241,6 @@ "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", "dev": true }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@josephg/resolvable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", @@ -5275,18 +5301,17 @@ "dev": true }, "node_modules/@koa/router": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz", - "integrity": "sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz", + "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==", "dev": true, "dependencies": { "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^6.3.0" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/@koa/router/node_modules/depd": { @@ -5314,6 +5339,12 @@ "node": ">= 0.8" } }, + "node_modules/@koa/router/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, "node_modules/@koa/router/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -5324,40 +5355,129 @@ } }, "node_modules/@ljharb/resumer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.2.tgz", - "integrity": "sha512-opZnY9WsZ6tjPSpmTEdPY+LpxpEwqg3VsQiGFv+wAaA1ffTghnG019mAD8BKxkcpZx6HtvNj0vdyxDHTxPQlJw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", + "integrity": "sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==", "dev": true, "dependencies": { - "@ljharb/through": "^2.3.12" + "@ljharb/through": "^2.3.13", + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" } }, "node_modules/@ljharb/through": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", - "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5" + "call-bind": "^1.0.7" }, "engines": { "node": ">= 0.4" } }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", + "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", "dev": true, + "license": "MIT", "dependencies": { - "sparse-bitfield": "^3.0.3" + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@netflix/nerror": { - "version": "1.1.3", + "node_modules/@modelcontextprotocol/sdk/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "dev": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@netflix/nerror": { + "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", "dev": true, @@ -5418,138 +5538,72 @@ "node": ">= 8" } }, - "node_modules/@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", - "dev": true, - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", - "dev": true, - "dependencies": { - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", - "dev": true, - "dependencies": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, "node_modules/@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "engines": { "node": ">=8.0.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.1.tgz", - "integrity": "sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.9.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/resources": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.1.tgz", - "integrity": "sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dependencies": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.9.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.1.tgz", - "integrity": "sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", "dependencies": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.9.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.1.tgz", - "integrity": "sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "engines": { "node": ">=14" } }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "node_modules/@pkgr/core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", + "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -5557,36 +5611,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -5661,9 +5685,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.16.tgz", - "integrity": "sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", "dev": true, "dependencies": { "cluster-key-slot": "1.1.2", @@ -5684,36 +5708,42 @@ } }, "node_modules/@redis/json": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", - "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", "dev": true, "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/search": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", - "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", "dev": true, "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@redis/time-series": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", - "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", "dev": true, "peerDependencies": { "@redis/client": "^1.0.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0" @@ -6444,6 +6474,15 @@ "node": ">=14.0.0" } }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -6456,15 +6495,6 @@ "node": ">=10" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", @@ -6496,6 +6526,18 @@ "@types/responselike": "*" } }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "dev": true + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "dev": true + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -6511,6 +6553,12 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", @@ -6550,6 +6598,13 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -6584,12 +6639,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", - "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", + "version": "22.15.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.2.tgz", + "integrity": "sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-fetch": { @@ -6616,6 +6672,13 @@ "node": ">= 6" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -6703,9 +6766,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -6726,6 +6789,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -6777,21 +6841,21 @@ "integrity": "sha1-asL8ICtQD4jaj09VMM+hAPTGotA=" }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -6799,19 +6863,6 @@ "node": ">= 8.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -6829,9 +6880,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "dependencies": { "ajv": "^8.0.0" @@ -6878,21 +6929,42 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "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://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "optional": true, "dependencies": { @@ -6903,6 +6975,35 @@ "node": ">= 8" } }, + "node_modules/apache-arrow": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.0.0.tgz", + "integrity": "sha512-gFlPaqN9osetbB83zC29AbbZqGiCuFH1vyyPseJ+B7SIbfBtESV62mMT/CkiIt77W6ykC/nTWFzTXFs0Uldg4g==", + "dev": true, + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.js" + } + }, + "node_modules/apache-arrow/node_modules/@types/node": { + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/apollo-datasource": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz", @@ -7069,40 +7170,25 @@ "graphql": "^15.3.0 || ^16.0.0" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node": ">=6" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7111,19 +7197,20 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -7143,14 +7230,15 @@ } }, "node_modules/array.prototype.every": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.5.tgz", - "integrity": "sha512-FfMQJ+/joFGXpRCltbzV3znaP5QxIhLFySo0fEPn3GuoYlud9LhknMCIxdYKC2qsM/6VHoSp6YGwe3EZXrEcwQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.6.tgz", + "integrity": "sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" }, "engines": { @@ -7161,16 +7249,17 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7216,15 +7305,17 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -7307,9 +7398,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -7318,14 +7412,12 @@ } }, "node_modules/avvio": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.3.0.tgz", - "integrity": "sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.0.0.tgz", + "integrity": "sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==", "dev": true, "dependencies": { - "@fastify/error": "^3.3.0", - "archy": "^1.0.0", - "debug": "^4.0.0", + "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, @@ -7381,36 +7473,31 @@ "node": ">=4.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "node_modules/aws-ssl-profiles": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.1.tgz", + "integrity": "sha512-+H+kuK34PfMaI9PNU/NSjBKL5hh/KDM9J72kwYeYEm0A8B1AC4fuCy3qsjnA7lxklgyXsB68yn8Z2xoZEjgwCQ==", "dev": true, "engines": { - "node": "*" + "node": ">= 6.0.0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -7422,13 +7509,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -7445,25 +7532,26 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -7536,15 +7624,6 @@ "platform": "^1.3.3" } }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -7554,13 +7633,16 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "optional": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/binary-search": { @@ -7656,9 +7738,9 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -7669,7 +7751,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -7734,18 +7816,6 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "dev": true }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7757,12 +7827,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -7777,9 +7847,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -7795,11 +7865,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -7809,10 +7880,11 @@ } }, "node_modules/bson": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", - "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.20.1" } @@ -7840,21 +7912,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -7904,55 +7961,43 @@ "node": ">=8" } }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caching-transform/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { - "semver": "^6.0.0" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">= 0.4" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -7970,19 +8015,10 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001593", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", - "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", + "version": "1.0.30001716", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", + "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", "dev": true, "funding": [ { @@ -7997,66 +8033,77 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + ], + "license": "CC-BY-4.0" }, "node_modules/cassandra-driver": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.7.2.tgz", - "integrity": "sha512-gwl1DeYvL8Wy3i1GDMzFtpUg5G473fU7EnHFZj7BUtdLB7loAfgZgB3zBhROc9fbaDSUDs6YwOPPojS5E1kbSA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.8.0.tgz", + "integrity": "sha512-HritfMGq9V7SuESeSodHvArs0mLuMk7uh+7hQK2lqdvXrvm50aWxb4RPxkK3mPDdsgHjJ427xNRFITMH2ei+Sw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/long": "~5.0.0", - "@types/node": ">=8", + "@types/node": "^18.11.18", "adm-zip": "~0.5.10", "long": "~5.2.3" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/cassandra-driver/node_modules/@types/long": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/long/-/long-5.0.0.tgz", - "integrity": "sha512-eQs9RsucA/LNjnMoJvWG/nXa7Pot/RbBzilF/QRIU/xRl+0ApxrSUFsV5lmf01SvSlqMzJ7Zwxe440wmz2SJGA==", - "deprecated": "This is a stub types definition. long provides its own type definitions, so you do not need this installed.", + "node_modules/cassandra-driver/node_modules/@types/node": { + "version": "18.19.76", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.76.tgz", + "integrity": "sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==", "dev": true, + "license": "MIT", "dependencies": { - "long": "*" + "undici-types": "~5.26.4" } }, "node_modules/cassandra-driver/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "dev": true + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.5.tgz", + "integrity": "sha512-e0r9YBBgNCq1D1o5Dp8FMH0N5hsFtXDBiVa0qoJPHpakvZkmDKPRoGffZJII/XsHvj9An9blm+cRJ01yQqU+Dw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/cassandra-driver/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, "node_modules/character-parser": { @@ -8069,16 +8116,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "optional": true, "dependencies": { "anymatch": "~3.1.2", @@ -8092,6 +8133,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -8116,15 +8160,6 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -8262,21 +8297,63 @@ "node": ">= 0.8" } }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "dev": true, + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8405,28 +8482,22 @@ "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } }, "node_modules/cookies": { "version": "0.9.0", @@ -8457,12 +8528,13 @@ "dev": true }, "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.22.3" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -8488,9 +8560,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -8564,10 +8636,59 @@ "node": ">=10.x" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -8580,15 +8701,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -8637,68 +8749,13 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "dependencies": { - "clone": "^1.0.2" + "clone": "^1.0.2" } }, "node_modules/defaults/node_modules/clone": { @@ -8825,26 +8882,6 @@ "node": ">=10.0.0" } }, - "node_modules/dependency-check/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/dependency-check/node_modules/globby": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", @@ -8971,11 +9008,18 @@ "node": ">=0.10" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/ecc-jsbn": { "version": "0.1.2", @@ -9018,9 +9062,9 @@ } }, "node_modules/elasticsearch/node_modules/agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.3.tgz", + "integrity": "sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==", "dev": true, "dependencies": { "humanize-ms": "^1.2.1" @@ -9094,16 +9138,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", - "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "version": "1.5.149", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", + "dev": true, + "license": "ISC" }, "node_modules/enabled": { "version": "2.0.0", @@ -9129,9 +9168,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -9158,49 +9197,56 @@ } }, "node_modules/es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -9210,12 +9256,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -9254,14 +9297,25 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -9292,16 +9346,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -9331,28 +9379,35 @@ } }, "node_modules/eslint": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", - "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.3.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -9361,15 +9416,12 @@ "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" @@ -9378,14 +9430,25 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, "engines": { "node": ">=12" }, @@ -9394,10 +9457,11 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", + "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9426,9 +9490,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -9452,54 +9516,57 @@ } }, "node_modules/eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, "peerDependencies": { "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -9533,28 +9600,30 @@ } }, "node_modules/eslint-plugin-license-header": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.1.tgz", - "integrity": "sha512-9aIz8q3OaMr1/uQmCGCWySjTs5nEXUJexNegz/8lluNcZbEl82Ag1Vyr1Hu3oIveRW1NbXDPs6nu4zu9mbrmWA==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.8.0.tgz", + "integrity": "sha512-khTCz6G3JdoQfwrtY4XKl98KW4PpnWUKuFx8v+twIRhJADEyYglMDC0td8It75C1MZ88gcvMusWuUlJsos7gYg==", "dev": true, + "license": "MIT", "dependencies": { "requireindex": "^1.2.0" } }, "node_modules/eslint-plugin-n": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz", - "integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==", + "version": "17.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz", + "integrity": "sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "enhanced-resolve": "^5.15.0", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^15.0.0", - "ignore": "^5.2.4", - "minimatch": "^9.0.0", - "semver": "^7.5.3" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9576,9 +9645,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.1.0.tgz", - "integrity": "sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==", + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "dev": true, "engines": { "node": ">=18" @@ -9588,9 +9657,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -9603,13 +9672,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.3.1.tgz", + "integrity": "sha512-vad9VWgEm9xaVXRNmb4aeOt0PWDc61IAdzghkbYQ2wavgax148iKoX1rNJcgkBGCipzLzOnHYVgL7xudM9yccQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9620,7 +9690,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -9633,22 +9703,29 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -9661,10 +9738,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -9688,55 +9766,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9765,15 +9794,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9825,18 +9845,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -9847,14 +9855,15 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9863,19 +9872,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -9893,6 +9889,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -9944,13 +9941,27 @@ "node": ">=0.4.x" } }, - "node_modules/events-to-array": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", - "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", + "node_modules/eventsource": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", + "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" } }, "node_modules/ewma": { @@ -9962,111 +9973,64 @@ "assert-plus": "^1.0.0" } }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.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.7", + "qs": "^6.14.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.0.1", + "vary": "^1.1.2" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">= 18" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/express-end": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/express-end/-/express-end-0.0.8.tgz", + "integrity": "sha1-DI/ZVCiTIVjytM+R9ARTRr8sUyM=", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "debug": "^2.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10" } }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-end": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/express-end/-/express-end-0.0.8.tgz", - "integrity": "sha1-DI/ZVCiTIVjytM+R9ARTRr8sUyM=", - "dev": true, - "dependencies": { - "debug": "^2.2.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/express-end/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/express-end/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { "ms": "2.0.0" @@ -10092,13 +10056,82 @@ "node": ">=6" } }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/express/node_modules/depd": { @@ -10110,6 +10143,24 @@ "node": ">= 0.8" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -10126,17 +10177,92 @@ "node": ">= 0.8" } }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true + "node_modules/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", @@ -10158,6 +10284,28 @@ } ] }, + "node_modules/express/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/express/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -10167,11 +10315,19 @@ "node": ">= 0.8" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/extsprintf": { "version": "1.3.0", @@ -10182,12 +10338,6 @@ "node >=0.6.0" ] }, - "node_modules/fast-content-type-parse": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", - "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", - "dev": true - }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -10228,6 +10378,27 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", + "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "dev": true, + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.1", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.3.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "dev": true + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -10235,9 +10406,9 @@ "dev": true }, "node_modules/fast-querystring": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", - "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dev": true, "dependencies": { "fast-decode-uri-component": "^1.0.1" @@ -10265,9 +10436,9 @@ } }, "node_modules/fast-uri": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.1.0.tgz", - "integrity": "sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", "dev": true }, "node_modules/fast-xml-parser": { @@ -10293,9 +10464,9 @@ } }, "node_modules/fastify": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.27.0.tgz", - "integrity": "sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.2.tgz", + "integrity": "sha512-AIPqBgtqBAwkOkrnwesEE+dOyU30dQ4kh7udxeGVR05CRGwubZx+p2H8P0C4cRnQT0+EPK4VGea2DTL2RtWttg==", "dev": true, "funding": [ { @@ -10307,112 +10478,45 @@ "url": "https://opencollective.com/fastify" } ], + "license": "MIT", "dependencies": { - "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.4.0", - "@fastify/fast-json-stringify-compiler": "^4.3.0", + "@fastify/ajv-compiler": "^4.0.0", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", - "avvio": "^8.3.0", - "fast-content-type-parse": "^1.1.0", - "fast-json-stringify": "^5.8.0", - "find-my-way": "^8.0.0", - "light-my-request": "^5.11.0", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", "pino": "^9.0.0", - "process-warning": "^3.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.7.0", - "semver": "^7.5.4", - "toad-cache": "^3.3.0" + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" } }, "node_modules/fastify-plugin": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.2.1.tgz", - "integrity": "sha512-dlGKiwLzRBKkEf5J5ho0uAD/Jdv8GQVUbriB3tAX3ehRUXE4gTV3lRd5inEg9li1aLzb0EGj8y2K4/8g1TN06g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.0.1.tgz", + "integrity": "sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==", "dev": true }, - "node_modules/fastify/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/fastify/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fastify/node_modules/fast-json-stringify": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.8.0.tgz", - "integrity": "sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==", - "dev": true, - "dependencies": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" - } - }, "node_modules/fastify/node_modules/find-my-way": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.1.0.tgz", - "integrity": "sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.0.1.tgz", + "integrity": "sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^4.0.0" }, "engines": { "node": ">=14" } }, - "node_modules/fastify/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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" - } - ] - }, "node_modules/fastify/node_modules/pino": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/pino/-/pino-9.0.0.tgz", @@ -10435,47 +10539,65 @@ "pino": "bin.js" } }, - "node_modules/fastify/node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dev": true, - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/fastify/node_modules/process-warning": { + "node_modules/fastify/node_modules/pino/node_modules/process-warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/fastify/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/fastify/node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastify/node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", "dev": true, - "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": ">=10" } }, - "node_modules/fastify/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "node_modules/fastify/node_modules/safe-regex2": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.0.tgz", + "integrity": "sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==", "dev": true, - "engines": { - "node": ">= 10.x" + "dependencies": { + "ret": "~0.5.0" } }, + "node_modules/fastify/node_modules/secure-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz", + "integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -10504,9 +10626,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -10516,86 +10638,64 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "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": ">= 0.8" } }, "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/finalhandler/node_modules/ms": { + "node_modules/finalhandler/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">= 0.8" } }, "node_modules/find-my-way": { @@ -10612,17 +10712,16 @@ "node": ">=14" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "array-back": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, "node_modules/flat-cache": { @@ -10638,6 +10737,12 @@ "node": ">=16" } }, + "node_modules/flatbuffers": { + "version": "24.3.25", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.3.25.tgz", + "integrity": "sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==", + "dev": true + }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -10651,9 +10756,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -10678,42 +10783,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/formidable": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", @@ -10747,26 +10816,6 @@ "node": ">= 0.6" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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" - } - ] - }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -10780,9 +10829,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -10802,14 +10851,14 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -10853,25 +10902,21 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "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", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "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" @@ -10901,6 +10946,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "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://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -10917,12 +10974,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -10932,9 +10990,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -10959,22 +11017,21 @@ } }, "node_modules/glob": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", - "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10992,67 +11049,6 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/glob/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -11077,11 +11073,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11113,9 +11109,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/graphql": { @@ -11178,62 +11174,6 @@ "node": ">=0.10.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -11280,12 +11220,12 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -11300,9 +11240,9 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -11311,9 +11251,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -11322,11 +11262,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -11335,22 +11275,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/hashring": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", @@ -11362,9 +11286,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -11414,11 +11338,14 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "engines": { + "node": ">=14" + } }, "node_modules/http-assert": { "version": "1.5.0", @@ -11470,32 +11397,16 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 14" } }, "node_modules/http2-wrapper": { @@ -11511,36 +11422,17 @@ "node": ">=10.19.0" } }, - "node_modules/https-pem": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/https-pem/-/https-pem-3.0.0.tgz", - "integrity": "sha512-JqYVRTpk1WeXziwBaTX6eyXod6Dt70d/kehtY3DR6ygl+11XgcksTjSl4NjZbNCKK3rpTB1qH9hnu75RSOFUWQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "selfsigned": "^2.0.1" - } - }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" + "node": ">= 14" } }, "node_modules/humanize-ms": { @@ -11570,9 +11462,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -11595,11 +11487,12 @@ } }, "node_modules/import-in-the-middle": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.4.tgz", - "integrity": "sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", + "license": "Apache-2.0", "dependencies": { - "acorn": "^8.8.2", + "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" @@ -11611,16 +11504,7 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, "node_modules/inflation": { @@ -11648,12 +11532,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11670,10 +11554,11 @@ } }, "node_modules/ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", + "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "dev": true, + "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -11719,13 +11604,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11794,11 +11681,28 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11875,15 +11779,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -11911,39 +11806,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "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-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "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-integer": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", @@ -11962,9 +11824,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "engines": { "node": ">= 0.4" }, @@ -11995,15 +11857,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -12053,11 +11906,14 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12094,374 +11950,110 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "glob": "^7.1.3" + "which-typed-array": "^1.1.14" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "unc-path-regex": "^0.1.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dependencies": { - "has-flag": "^4.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "node_modules/jackpot": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/jackpot/-/jackpot-0.0.6.tgz", @@ -12480,24 +12072,6 @@ "node": "*" } }, - "node_modules/jackspeak": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", - "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -12508,14 +12082,14 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -12563,15 +12137,15 @@ "dev": true }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json": { @@ -12594,6 +12168,15 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -12612,6 +12195,15 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -12685,21 +12277,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -12831,10 +12408,11 @@ } }, "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -12898,18 +12476,17 @@ } }, "node_modules/koa-router": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-12.0.0.tgz", - "integrity": "sha512-zGrdiXygGYW8WvrzeGsHZvKnHs4DzyGoqJ9a8iHlRkiwuEAOAPyI27//OlhoWdgFAEIM3qbUgr0KCuRaP/TCag==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-13.0.1.tgz", + "integrity": "sha512-4/sijXdSxocIe2wv7RFFSxvo2ic1pDzPSmy11yCGztng1hx408qfw1wVmN3aqhQaU7U6nJ039JKC8ObE73Ohgw==", "dev": true, "dependencies": { "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^8.1.0" }, "engines": { - "node": ">= 12" + "node": ">= 18" } }, "node_modules/koa-router/node_modules/depd": { @@ -13001,35 +12578,33 @@ } }, "node_modules/light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.5.1.tgz", + "integrity": "sha512-0q82RyxIextuDtkA0UDofhPHIiQ2kmpa7fwElCSlm/8nQl36cDU1Cw+CAO90Es0lReH2HChClKL84I86Nc52hg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "dependencies": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", - "set-cookie-parser": "^2.4.1" + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" } }, "node_modules/light-my-request/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/lodash": { @@ -13038,6 +12613,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -13050,12 +12631,6 @@ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", "dev": true }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -13101,7 +12676,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.once": { "version": "4.1.1", @@ -13124,80 +12700,10 @@ "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/logform": { @@ -13242,13 +12748,28 @@ } }, "node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { "node": "14 || >=16.14" } }, + "node_modules/lru.min": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.0.tgz", + "integrity": "sha512-86xXMB6DiuKrTqkE/lRL0drlNh568awttBPJ7D66fzDHpy6NC5r3N+Ly/lKCS2zjmeGyvFDx670z0cD0PVBwGA==", + "dev": true, + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -13276,6 +12797,14 @@ "resolved": "https://registry.npmjs.org/mapcap/-/mapcap-1.0.0.tgz", "integrity": "sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/measured-core": { "version": "1.51.1", "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", @@ -13328,16 +12857,16 @@ "dev": true }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge2": { "version": "1.4.1", @@ -13351,7 +12880,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" @@ -13403,18 +12932,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", @@ -13497,17 +13014,18 @@ } }, "node_modules/mock-property": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", - "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.1.0.tgz", + "integrity": "sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", "functions-have-names": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "hasown": "^2.0.0", - "isarray": "^2.0.5" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.2", + "isarray": "^2.0.5", + "object-inspect": "^1.13.2" }, "engines": { "node": ">= 0.4" @@ -13523,18 +13041,20 @@ "dev": true }, "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" }, "node_modules/mongodb": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", - "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", + "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -13542,7 +13062,7 @@ }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", @@ -13690,16 +13210,18 @@ } }, "node_modules/mysql2": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.8.tgz", - "integrity": "sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz", + "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==", "dev": true, + "license": "MIT", "dependencies": { + "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^8.0.0", + "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -13726,15 +13248,6 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", "dev": true }, - "node_modules/mysql2/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "engines": { - "node": ">=16.14" - } - }, "node_modules/mysql2/node_modules/sqlstring": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", @@ -13880,32 +13393,12 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13915,322 +13408,66 @@ "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-versions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-package-versions/-/npm-package-versions-1.0.1.tgz", - "integrity": "sha512-iEiETp11ZuiWKAlLRBaUD3zKjZTzAco3xrkCbIJaxs+iu2+zIbaKXdVpzmsjyDCe0r7IpDW55iAyVHzktTg5DA==", - "dev": true - }, - "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/nyc/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { - "semver": "bin/semver.js" + "semver": "bin/semver" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "optional": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-versions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-package-versions/-/npm-package-versions-1.0.1.tgz", + "integrity": "sha512-iEiETp11ZuiWKAlLRBaUD3zKjZTzAco3xrkCbIJaxs+iu2+zIbaKXdVpzmsjyDCe0r7IpDW55iAyVHzktTg5DA==", + "dev": true + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", "dev": true, "engines": { "node": "*" @@ -14259,21 +13496,24 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -14321,14 +13561,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14338,26 +13579,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14412,21 +13655,6 @@ "fn.name": "1.x.x" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/only": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", @@ -14504,18 +13732,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -14525,21 +13741,6 @@ "node": ">=6" } }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14602,37 +13803,15 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "node_modules/path-to-regexp": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", + "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", "dev": true, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16" } }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -14642,21 +13821,16 @@ "node": ">=8" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==", "dev": true, + "license": "MIT", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.8.5", + "pg-pool": "^3.9.6", + "pg-protocol": "^1.9.5", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -14664,7 +13838,7 @@ "node": ">= 8.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.1.1" + "pg-cloudflare": "^1.2.5" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -14676,10 +13850,11 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", + "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { @@ -14698,19 +13873,21 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.9.6.tgz", + "integrity": "sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==", "dev": true, + "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", - "dev": true + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.9.5.tgz", + "integrity": "sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==", + "dev": true, + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", @@ -14729,10 +13906,11 @@ } }, "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", - "dev": true + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.8.5.tgz", + "integrity": "sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==", + "dev": true, + "license": "MIT" }, "node_modules/pgpass": { "version": "1.0.5", @@ -14753,9 +13931,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -14924,16 +14102,14 @@ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16.20.0" } }, "node_modules/pkg-up": { @@ -15000,6 +14176,14 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -15049,10 +14233,11 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -15089,23 +14274,22 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" }, "node_modules/promise": { "version": "7.3.1", @@ -15135,12 +14319,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/pug": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", @@ -15284,12 +14462,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15415,26 +14593,6 @@ "npm-normalize-package-bin": "^1.0.0" } }, - "node_modules/read-package-json/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -15482,17 +14640,17 @@ } }, "node_modules/redis": { - "version": "4.6.14", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.14.tgz", - "integrity": "sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", "dev": true, "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.16", + "@redis/client": "1.6.0", "@redis/graph": "1.1.1", - "@redis/json": "1.0.6", - "@redis/search": "1.1.6", - "@redis/time-series": "1.0.5" + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" } }, "node_modules/redis-errors": { @@ -15520,13 +14678,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -15534,29 +14694,15 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -15566,111 +14712,48 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relative-microtime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/relative-microtime/-/relative-microtime-2.0.0.tgz", - "integrity": "sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==" - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, - "engines": { - "node": ">=0.6" - } + "license": "MIT" }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, "bin": { - "uuid": "bin/uuid" + "regjsparser": "bin/parser" } }, + "node_modules/relative-microtime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/relative-microtime/-/relative-microtime-2.0.0.tgz", + "integrity": "sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==" + }, "node_modules/require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -15699,15 +14782,6 @@ "semver": "bin/semver" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -15718,23 +14792,34 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", - "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", + "debug": "^4.3.5", "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" + "resolve": "^1.22.8" }, "engines": { "node": ">=8.6.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, "node_modules/requireindex": { "version": "1.2.0", @@ -15876,9 +14961,9 @@ } }, "node_modules/restify/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" @@ -15934,132 +15019,80 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { - "glob": "^10.2.5" + "glob": "^7.1.3" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" + "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, "dependencies": { - "execa": "^5.0.0" + "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": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 18" } }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/router/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "ms": "^2.1.3" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/router/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/router/node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/run-parallel": { "version": "1.2.0", @@ -16085,21 +15118,22 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -16128,14 +15162,17 @@ "optional": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16183,10 +15220,20 @@ "dev": true }, "node_modules/secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", + "integrity": "sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] }, "node_modules/select-hose": { "version": "2.0.0", @@ -16194,25 +15241,10 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -16220,17 +15252,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -16292,55 +15313,167 @@ "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", + "dev": true + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/serve-static/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/send/node_modules/ms": { + "node_modules/serve-static/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/serve-static/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">= 18" } }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==", "dev": true }, "node_modules/set-function-length": { @@ -16418,23 +15551,72 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "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/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "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://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "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/simple-lru-cache": { "version": "0.0.2", @@ -16503,82 +15685,6 @@ "dargs": "^4.0.0" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -16650,12 +15756,6 @@ "readable-stream": "^3.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "node_modules/sql-summary": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sql-summary/-/sql-summary-1.0.1.tgz", @@ -16799,43 +15899,15 @@ } ] }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16845,26 +15917,29 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16882,19 +15957,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -16904,23 +15966,12 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -16935,15 +15986,15 @@ "dev": true }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -16958,62 +16009,42 @@ } }, "node_modules/synckit": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", - "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", + "integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==", "dev": true, + "license": "MIT", "dependencies": { - "@pkgr/utils": "^2.4.2", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.0", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tap-junit": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tap-junit/-/tap-junit-5.0.3.tgz", - "integrity": "sha512-pbBXzjWoqkr11NDNvINfvN+I/zdKm88Iu2KtFfnx/FEq4yNJGC1TVj6Kg8QJrD4m8Zahkp4xF/Gf45a8vua0tg==", - "dev": true, - "dependencies": { - "minimist": "1.2.8", - "tap-parser": "15.3.1", - "xmlbuilder2": "3.1.1" - }, - "bin": { - "tap-junit": "bin/tap-junit" + "url": "https://opencollective.com/synckit" } }, - "node_modules/tap-parser": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-15.3.1.tgz", - "integrity": "sha512-hwAtXX5TBGt2MJeYvASc7DjP48PUzA7P8RTbLxQcgKCEH7ICD5IsRco7l5YvkzjHlZbUbeI9wzO8B4hw2sKgnQ==", + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dev": true, "dependencies": { - "events-to-array": "^2.0.3", - "tap-yaml": "2.2.1" - }, - "bin": { - "tap-parser": "bin/cmd.cjs" + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" }, "engines": { - "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" + "node": ">=12.17" } }, - "node_modules/tap-yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-2.2.1.tgz", - "integrity": "sha512-ovZuUMLAIH59jnFHXKEGJ+WyDYl6Cuduwg9qpvnqkZOUA1nU84q02Sry1HT0KXcdv2uB91bEKKxnIybBgrb6oA==", + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, - "dependencies": { - "yaml": "^2.3.0", - "yaml-types": "^0.3.0" - }, "engines": { - "node": "16 >=16.17.0 || 18 >= 18.6.0 || >=20" + "node": ">=12.17" } }, "node_modules/tapable": { @@ -17026,14 +16057,14 @@ } }, "node_modules/tape": { - "version": "5.7.5", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.7.5.tgz", - "integrity": "sha512-C5Gm1MR8ujZmNrsmOiHSkKFfY2thrnUrFw/fFtcva9FABbN7LrHuQPi3MTS0Z0i/SLfYSJtRIcJYDUpwPsQ8yA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.9.0.tgz", + "integrity": "sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==", "dev": true, "dependencies": { - "@ljharb/resumer": "^0.1.2", - "@ljharb/through": "^2.3.12", - "array.prototype.every": "^1.1.5", + "@ljharb/resumer": "^0.1.3", + "@ljharb/through": "^2.3.13", + "array.prototype.every": "^1.1.6", "call-bind": "^1.0.7", "deep-equal": "^2.2.3", "defined": "^1.0.1", @@ -17042,17 +16073,17 @@ "get-package-type": "^0.1.0", "glob": "^7.2.3", "has-dynamic-import": "^2.1.0", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "inherits": "^2.0.4", "is-regex": "^1.1.4", "minimist": "^1.2.8", - "mock-property": "^1.0.3", - "object-inspect": "^1.13.1", - "object-is": "^1.1.5", + "mock-property": "^1.1.0", + "object-inspect": "^1.13.2", + "object-is": "^1.1.6", "object-keys": "^1.1.1", "object.assign": "^4.1.5", "resolve": "^2.0.0-next.5", - "string.prototype.trim": "^1.2.8" + "string.prototype.trim": "^1.2.9" }, "bin": { "tape": "bin/tape" @@ -17093,26 +16124,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tape/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tape/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -17146,12 +16157,13 @@ } }, "node_modules/tedious": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.2.0.tgz", - "integrity": "sha512-PCELoE17gN71lk0A87+WITcIJ6uGagrV2hXVJT5ige/Yef+YCLVpQ/Je12rOZT7vBhVZoMp6MvaBmbfI8fw0ag==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-19.0.0.tgz", + "integrity": "sha512-nmxNBAT72mMVCIYp0Ts0Zzd5+LBQjoXlqigCrIjSo2OERSi04vr3EHq3qJxv/zgrSkg7si03SoIIfekTAadA7w==", "dev": true, "dependencies": { - "@azure/identity": "^3.4.1", + "@azure/core-auth": "^1.7.2", + "@azure/identity": "^4.2.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.6.1", "@types/node": ">=18", @@ -17162,7 +16174,7 @@ "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=18" + "node": ">=18.17" } }, "node_modules/tedious/node_modules/iconv-lite": { @@ -17201,50 +16213,16 @@ "npm-package-versions": "^1.0.1", "once": "^1.4.0", "parse-env-string": "^1.0.1", - "resolve": "^1.22.8", - "semver": "^7.5.4", - "spawn-npm-install": "^1.2.0", - "which": "^2.0.2" - }, - "bin": { - "tav": "index.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "resolve": "^1.22.8", + "semver": "^7.5.4", + "spawn-npm-install": "^1.2.0", + "which": "^2.0.2" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "bin": { + "tav": "index.js" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14" } }, "node_modules/text-hex": { @@ -17253,12 +16231,6 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "node_modules/thread-stream": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", @@ -17316,27 +16288,6 @@ "node": ">=8" } }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17350,9 +16301,9 @@ } }, "node_modules/toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "dev": true, "engines": { "node": ">=12" @@ -17373,19 +16324,6 @@ "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", "dev": true }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", @@ -17434,9 +16372,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/tsscmp": { @@ -17448,18 +16386,6 @@ "node": ">=0.6.x" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -17478,15 +16404,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -17501,27 +16418,28 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -17531,15 +16449,16 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -17549,32 +16468,30 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17583,6 +16500,15 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/uglify-js": { "version": "3.15.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", @@ -17620,18 +16546,19 @@ } }, "node_modules/undici": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.1.tgz", - "integrity": "sha512-/0BWqR8rJNRysS5lqVmfc7eeOErcOP4tZpATVjJOojjHZ71gSYVAtFhEmadcIjwMIUehh5NFyKGsXCnXIajtbA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.8.0.tgz", + "integrity": "sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/unicode-byte-truncate": { @@ -17644,10 +16571,11 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17657,6 +16585,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -17666,10 +16595,11 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17679,6 +16609,7 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17697,19 +16628,10 @@ "node": ">= 0.8" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -17725,9 +16647,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -17867,16 +16790,17 @@ } }, "node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", + "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.8.2", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", - "rxjs": "^7.8.1" + "rxjs": "^7.8.2" }, "bin": { "wait-on": "bin/wait-on" @@ -17972,22 +16896,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -18053,78 +16971,24 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=12.17" } }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -18142,34 +17006,6 @@ } } }, - "node_modules/xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", - "dev": true, - "dependencies": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" - }, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/xmlbuilder2/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/xss": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.11.tgz", @@ -18204,29 +17040,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.3.0.tgz", - "integrity": "sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==", - "dev": true, - "engines": { - "node": ">= 16", - "npm": ">= 7" - }, - "peerDependencies": { - "yaml": "^2.3.0" - } + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/ylru": { "version": "1.3.2", @@ -18248,6 +17063,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } }, "dependencies": { @@ -18303,15 +17138,15 @@ } }, "@apollo/server": { - "version": "4.10.4", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.4.tgz", - "integrity": "sha512-HS12CUa1wq8f5zKXOKJRwRdESFp4por9AINecpcsEUV9jsCP/NqPILgx0hCOOFJuKxmnaL7070xO6l5xmOq4Fw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.0.tgz", + "integrity": "sha512-Z5RNTCnIia+dFsP5HW2ugQMrIOWgyNWyKP+jMVXthp/ECjYyyRYPC41ukCDwxHQY4vNZ3rgbgqroWVQUGFt2gA==", "dev": true, "requires": { "@apollo/cache-control-types": "^1.0.3", "@apollo/server-gateway-interface": "^1.1.1", "@apollo/usage-reporting-protobuf": "^4.1.1", - "@apollo/utils.createhash": "^2.0.0", + "@apollo/utils.createhash": "^2.0.2", "@apollo/utils.fetcher": "^2.0.0", "@apollo/utils.isnodelike": "^2.0.0", "@apollo/utils.keyvaluecache": "^2.1.0", @@ -18319,13 +17154,12 @@ "@apollo/utils.usagereporting": "^2.1.0", "@apollo/utils.withrequired": "^2.0.0", "@graphql-tools/schema": "^9.0.0", - "@josephg/resolvable": "^1.0.0", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.30", "@types/node-fetch": "^2.6.1", "async-retry": "^1.2.1", "cors": "^2.8.5", - "express": "^4.17.1", + "express": "^4.21.1", "loglevel": "^1.6.8", "lru-cache": "^7.10.1", "negotiator": "^0.6.3", @@ -18398,36 +17232,136 @@ "@apollo/utils.stripsensitiveliterals": "^2.0.1" } }, - "@graphql-tools/merge": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.0.tgz", - "integrity": "sha512-3XYCWe0d3I4F1azNj1CdShlbHfTIfiDgj00R9uvFH8tHKh7i1IWN3F7QQYovcHKhayaR6zPok3YYMESYQcBoaA==", + "@graphql-tools/merge": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.0.tgz", + "integrity": "sha512-3XYCWe0d3I4F1azNj1CdShlbHfTIfiDgj00R9uvFH8tHKh7i1IWN3F7QQYovcHKhayaR6zPok3YYMESYQcBoaA==", + "dev": true, + "requires": { + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0" + } + }, + "@graphql-tools/schema": { + "version": "9.0.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.17.tgz", + "integrity": "sha512-HVLq0ecbkuXhJlpZ50IHP5nlISqH2GbNgjBJhhRzHeXhfwlUOT4ISXGquWTmuq61K0xSaO0aCjMpxe4QYbKTng==", + "dev": true, + "requires": { + "@graphql-tools/merge": "8.4.0", + "@graphql-tools/utils": "9.2.1", + "tslib": "^2.4.0", + "value-or-promise": "1.0.12" + } + }, + "@graphql-tools/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "dev": true, + "requires": { + "@graphql-typed-document-node/core": "^3.1.1", + "tslib": "^2.4.0" + } + }, + "cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "requires": { - "@graphql-tools/utils": "9.2.1", - "tslib": "^2.4.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" } }, - "@graphql-tools/schema": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.17.tgz", - "integrity": "sha512-HVLq0ecbkuXhJlpZ50IHP5nlISqH2GbNgjBJhhRzHeXhfwlUOT4ISXGquWTmuq61K0xSaO0aCjMpxe4QYbKTng==", + "finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { - "@graphql-tools/merge": "8.4.0", - "@graphql-tools/utils": "9.2.1", - "tslib": "^2.4.0", - "value-or-promise": "1.0.12" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" } }, - "@graphql-tools/utils": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz", - "integrity": "sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==", + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "@graphql-typed-document-node/core": "^3.1.1", - "tslib": "^2.4.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "lru-cache": { @@ -18436,6 +17370,83 @@ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, + "merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "requires": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -18518,12 +17529,12 @@ } }, "@apollo/utils.createhash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.0.tgz", - "integrity": "sha512-9GhGGD3J0HJF/VC+odwYpKi3Cg1NWrsO8GQvyGwDS5v/78I3154Hn8s4tpW+nqoaQ/lAvxdQQr3HM1b5HLM6Ww==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@apollo/utils.createhash/-/utils.createhash-2.0.2.tgz", + "integrity": "sha512-UkS3xqnVFLZ3JFpEmU/2cM2iKJotQXMoSTgxXsfQgXLC5gR1WaepoXagmYnPSA7Q/2cmnyTYK5OgAgoC4RULPg==", "dev": true, "requires": { - "@apollo/utils.isnodelike": "^2.0.0", + "@apollo/utils.isnodelike": "^2.0.1", "sha.js": "^2.4.11" } }, @@ -18540,9 +17551,9 @@ "dev": true }, "@apollo/utils.isnodelike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.0.tgz", - "integrity": "sha512-77CiAM2qDXn0haQYrgX0UgrboQykb+bOHaz5p3KKItMwUZ/EFphzuB2vqHvubneIc9dxJcTx2L7MFDswRw/JAQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz", + "integrity": "sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q==", "dev": true }, "@apollo/utils.keyvaluecache": { @@ -18556,9 +17567,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.1.tgz", - "integrity": "sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true } } @@ -19915,31 +18926,51 @@ } }, "@azure/core-auth": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", - "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", + "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", "dev": true, "requires": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } } }, "@azure/core-client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.6.0.tgz", - "integrity": "sha512-YhSf4cb61ApSjItscp9XoaLq8KRnacPDAhmjAZSMnn/gs6FhFbZNfOBOErG2dDj7JRknVtCmJ5mLmfR2sLa11A==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dev": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.5.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + }, "@azure/core-tracing": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", @@ -19984,23 +19015,30 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.8.1.tgz", - "integrity": "sha512-R/XpxZcDgGbnneEifnsAcjLoR2NCmlDxKDmzd8oi5jx5YEnPE6gsxHQWAk2+uY55Ka717x/fdctyoCYKnumrqw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.16.0.tgz", + "integrity": "sha512-CeuTvsXxCUmEuxH5g/aceuSl6w2EugvNHKAtKKVdiX915EjJJxAwfzNNWZreNnbxHZ2fi0zaM6wwS23x2JVqSQ==", "dev": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.4.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.9.0", "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0", - "uuid": "^8.3.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + }, "@azure/core-tracing": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", @@ -20009,17 +19047,6 @@ "requires": { "tslib": "^2.2.0" } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } } } }, @@ -20034,30 +19061,41 @@ } }, "@azure/core-util": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", - "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz", + "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==", "dev": true, "requires": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dev": true, + "requires": { + "tslib": "^2.6.2" + } + } } }, "@azure/identity": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-3.4.1.tgz", - "integrity": "sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.3.0.tgz", + "integrity": "sha512-LHZ58/RsIpIWa4hrrE2YuJ/vzG1Jv9f774RfTTAVDZDriubvJ0/S5u4pnw4akJDlS0TiJb6VMphmVUFsWmgodQ==", "dev": true, "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", - "@azure/core-client": "^1.4.0", + "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.6.1", + "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.5.0", - "@azure/msal-node": "^2.5.1", + "@azure/msal-browser": "^3.11.1", + "@azure/msal-node": "^2.9.2", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -20066,12 +19104,12 @@ }, "dependencies": { "@azure/core-tracing": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz", - "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", + "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", "dev": true, "requires": { - "tslib": "^2.2.0" + "tslib": "^2.6.2" } }, "events": { @@ -20122,41 +19160,41 @@ } }, "@azure/msal-browser": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.6.0.tgz", - "integrity": "sha512-FrFBJXRJMyWXjAjg4cUNZwEKktzfzD/YD9+S1kj2ors67hKoveam4aL0bZuCZU/jTiHTn0xDQGQh2ksCMXTXtA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.17.0.tgz", + "integrity": "sha512-csccKXmW2z7EkZ0I3yAoW/offQt+JECdTIV/KrnRoZyM7wCSsQWODpwod8ZhYy7iOyamcHApR9uCh0oD1M+0/A==", "dev": true, "requires": { - "@azure/msal-common": "14.5.0" + "@azure/msal-common": "14.12.0" } }, "@azure/msal-common": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.5.0.tgz", - "integrity": "sha512-Gx5rZbiZV/HiZ2nEKfjfAF/qDdZ4/QWxMvMo2jhIFVz528dVKtaZyFAOtsX2Ak8+TQvRsGCaEfuwJFuXB6tu1A==", + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz", + "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==", "dev": true }, "@azure/msal-node": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.6.0.tgz", - "integrity": "sha512-RWAWCYYrSldIYC47oWtofIun41e6SB9TBYgGYsezq6ednagwo9ZRFyRsvl1NabmdTkdDDXRAABIdveeN2Gtd8w==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz", + "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==", "dev": true, "requires": { - "@azure/msal-common": "14.5.0", + "@azure/msal-common": "14.12.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } }, "@babel/cli": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", - "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.27.0.tgz", + "integrity": "sha512-bZfxn8DRxwiVzDO5CEeV+7IqXeCkzI4yYnrQbpwjT76CUyossQc6RYE7n+xfm0/2k40lPaCpW0FhxYs7EBAetw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.25", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0", - "commander": "^4.0.1", + "chokidar": "^3.6.0", + "commander": "^6.2.0", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.2.0", @@ -20169,55 +19207,42 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } } } }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", "dev": true }, "@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -20240,15 +19265,16 @@ } }, "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "dev": true, "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "dependencies": { "@jridgewell/gen-mapping": { @@ -20265,32 +19291,23 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, "requires": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.27.1" } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -20319,19 +19336,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "dependencies": { @@ -20344,13 +19359,13 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "dependencies": { @@ -20363,9 +19378,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.22.6", @@ -20375,370 +19390,203 @@ "resolve": "^1.14.2" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, "requires": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "requires": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.27.1" } }, "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/types": "^7.27.1" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-syntax-unicode-sets-regex": { @@ -20752,574 +19600,565 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" } }, "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", - "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", + "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" } }, "@babel/preset-env": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", - "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz", + "integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.24.0", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.1", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "dependencies": { @@ -21342,59 +20181,40 @@ "esutils": "^2.0.2" } }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@colors/colors": { @@ -21428,79 +20248,101 @@ } }, "@elastic/elasticsearch": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.13.1.tgz", - "integrity": "sha512-2G4Vu6OHw4+XTrp7AGIcOEezpPEoVrWg2JTK1v/exEKSLYquZkUdd+m4yOL3/UZ6bTj7hmXwrmYzW76BnLCkJQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-9.0.1.tgz", + "integrity": "sha512-V/Hj/ePRiC6H8vOQF4GfOGIUFjYyA2C1Je6qKBD20AShmxqkaTRAQSvia4tvLobHqjrljUzb6khfhDuPrb6E8g==", "dev": true, "requires": { - "@elastic/transport": "~8.4.1", + "@elastic/transport": "^9.0.1", + "apache-arrow": "18.x - 19.x", "tslib": "^2.4.0" } }, "@elastic/transport": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.4.1.tgz", - "integrity": "sha512-/SXVuVnuU5b4dq8OFY4izG+dmGla185PcoqgK6+AJMpmOeY1QYVNbWtCwvSvoAANN5D/wV+EBU8+x7Vf9EphbA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-9.0.1.tgz", + "integrity": "sha512-6jVZQzAe2iTRsZA6I/wkO2BjzJFD9BHTASo2YgGfbcoV95ey/8D/ABRhpgfg35LIDrmialIGJBizunSwxsRDLg==", "dev": true, "requires": { - "debug": "^4.3.4", - "hpagent": "^1.0.0", + "@opentelemetry/api": "1.x", + "debug": "^4.4.0", + "hpagent": "^1.2.0", "ms": "^2.1.3", - "secure-json-parse": "^2.4.0", - "tslib": "^2.4.0", - "undici": "^5.22.1" + "secure-json-parse": "^3.0.2", + "tslib": "^2.8.1", + "undici": "^7.2.3" }, "dependencies": { - "hpagent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.0.0.tgz", - "integrity": "sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A==", - "dev": true + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true - }, - "undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, - "requires": { - "@fastify/busboy": "^2.0.0" - } } } }, "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "requires": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } }, "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true + }, + "@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "requires": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + } + }, + "@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", "dev": true }, + "@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.15" + } + }, "@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -21541,73 +20383,94 @@ } }, "@eslint/js": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.3.0.tgz", - "integrity": "sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true }, - "@fastify/ajv-compiler": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.5.0.tgz", - "integrity": "sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==", + "@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true + }, + "@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", "dev": true, "requires": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" } }, - "@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", - "dev": true - }, - "@fastify/deepmerge": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-1.3.0.tgz", - "integrity": "sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==", - "dev": true + "@fastify/ajv-compiler": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.1.tgz", + "integrity": "sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==", + "dev": true, + "requires": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } }, "@fastify/error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", - "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.0.0.tgz", + "integrity": "sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==", "dev": true }, "@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", - "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.1.tgz", + "integrity": "sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==", "dev": true, "requires": { - "fast-json-stringify": "^5.7.0" - }, - "dependencies": { - "fast-json-stringify": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.7.0.tgz", - "integrity": "sha512-sBVPTgnAZseLu1Qgj6lUbQ0HfjFhZWXAmpZ5AaSGkyLh5gAXBga/uPJjQPHpDFjC9adWIpdOcCLSDTgrZ7snoQ==", - "dev": true, - "requires": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" - } - } + "fast-json-stringify": "^6.0.0" } }, "@fastify/formbody": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-7.4.0.tgz", - "integrity": "sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-8.0.2.tgz", + "integrity": "sha512-84v5J2KrkXzjgBpYnaNRPqwgMsmY7ZDjuj0YVuMR3NXCJRCgKEZy/taSP1wUYGn0onfxJpLyRGDLa+NMaDJtnA==", "dev": true, "requires": { - "fast-querystring": "^1.0.0", - "fastify-plugin": "^4.0.0" + "fast-querystring": "^1.1.2", + "fastify-plugin": "^5.0.0" + } + }, + "@fastify/forwarded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.0.tgz", + "integrity": "sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==", + "dev": true + }, + "@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "@fastify/proxy-addr": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.0.0.tgz", + "integrity": "sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==", + "dev": true, + "requires": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true + } } }, "@graphql-tools/merge": { @@ -21692,9 +20555,9 @@ "dev": true }, "@hapi/accept": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.1.tgz", - "integrity": "sha512-aLkYj7zzgC3CSlEVOs84eBOEE3i9xZK2tdQEP+TOj2OFzMWCi9zjkRet82V3GGjecE//zFrCLKIykuaE0uM4bg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-6.0.3.tgz", + "integrity": "sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw==", "dev": true, "requires": { "@hapi/boom": "^10.0.1", @@ -21702,9 +20565,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.6.tgz", + "integrity": "sha512-mu8He+jghTDJ+la/uGBT4b1rqQdqFADZiXhzd98b3XW5nb/c+5woXx3FiNco2nm4wPJFHQVRGxYeWeSDPIYpYw==", "dev": true } } @@ -21761,9 +20624,9 @@ } }, "@hapi/bounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.1.tgz", - "integrity": "sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/bounce/-/bounce-3.0.2.tgz", + "integrity": "sha512-d0XmlTi3H9HFDHhQLjg4F4auL1EY3Wqj7j7/hGDhFFe6xAbnm3qiGrXeT93zZnPH8gH+SKAFYiRzu26xkXcH3g==", "dev": true, "requires": { "@hapi/boom": "^10.0.1", @@ -21823,9 +20686,9 @@ } }, "@hapi/catbox-memory": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.1.tgz", - "integrity": "sha512-sVb+/ZxbZIvaMtJfAbdyY+QJUQg9oKTwamXpEg/5xnfG5WbJLTjvEn4kIGKz9pN3ENNbIL/bIdctmHmqi/AdGA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz", + "integrity": "sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g==", "dev": true, "requires": { "@hapi/boom": "^10.0.1", @@ -21833,9 +20696,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.4.tgz", + "integrity": "sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ==", "dev": true } } @@ -21865,41 +20728,41 @@ "dev": true }, "@hapi/hapi": { - "version": "21.3.9", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.9.tgz", - "integrity": "sha512-AT5m+Rb8iSOFG3zWaiEuTJazf4HDYl5UpRpyxMJ3yR+g8tOEmqDv6FmXrLHShdvDOStAAepHGnr1G7egkFSRdw==", + "version": "21.4.0", + "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.4.0.tgz", + "integrity": "sha512-kqiRWbYYLSSt2rYbxyNj8svPsXP715p4W/K3OXpXeiiVLNSdBX4f+zfmC+dY6eyb6rqTqTAbx6x8b5HpJTkviQ==", "dev": true, "requires": { - "@hapi/accept": "^6.0.1", + "@hapi/accept": "^6.0.3", "@hapi/ammo": "^6.0.1", "@hapi/boom": "^10.0.1", - "@hapi/bounce": "^3.0.1", + "@hapi/bounce": "^3.0.2", "@hapi/call": "^9.0.1", "@hapi/catbox": "^12.1.1", - "@hapi/catbox-memory": "^6.0.1", + "@hapi/catbox-memory": "^6.0.2", "@hapi/heavy": "^8.0.1", - "@hapi/hoek": "^11.0.2", + "@hapi/hoek": "^11.0.6", "@hapi/mimos": "^7.0.1", "@hapi/podium": "^5.0.1", "@hapi/shot": "^6.0.1", "@hapi/somever": "^4.1.1", - "@hapi/statehood": "^8.1.1", + "@hapi/statehood": "^8.2.0", "@hapi/subtext": "^8.1.0", "@hapi/teamwork": "^6.0.0", - "@hapi/topo": "^6.0.1", + "@hapi/topo": "^6.0.2", "@hapi/validate": "^2.0.1" }, "dependencies": { "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.6.tgz", + "integrity": "sha512-mu8He+jghTDJ+la/uGBT4b1rqQdqFADZiXhzd98b3XW5nb/c+5woXx3FiNco2nm4wPJFHQVRGxYeWeSDPIYpYw==", "dev": true }, "@hapi/topo": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.1.tgz", - "integrity": "sha512-JioWUZL1Bm7r8bnCDx2AUggiPwpV7djFfDTWT1aZSyHjN++fVz7XPdW8YVCxvyv9bSWcbbOLV/h4U1zGdwrN3w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dev": true, "requires": { "@hapi/hoek": "^11.0.2" @@ -21946,9 +20809,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "dev": true } } @@ -22066,9 +20929,9 @@ } }, "@hapi/statehood": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.1.1.tgz", - "integrity": "sha512-YbK7PSVUA59NArAW5Np0tKRoIZ5VNYUicOk7uJmWZF6XyH5gGL+k62w77SIJb0AoAJ0QdGQMCQ/WOGL1S3Ydow==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@hapi/statehood/-/statehood-8.2.0.tgz", + "integrity": "sha512-63JlCVIrsmuunWsyc3OeuFO+gH6v56swLCl7OM1w09l/exQKPUxSUDF2Slkuw8k91nIzr0A2/aPvjLOWf9ksrg==", "dev": true, "requires": { "@hapi/boom": "^10.0.1", @@ -22081,9 +20944,9 @@ }, "dependencies": { "@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", "dev": true } } @@ -22189,15 +21052,28 @@ } } }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true + }, + "@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "dependencies": { + "@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true + } } }, "@humanwhocodes/module-importer": { @@ -22206,16 +21082,10 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, "@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true }, "@ioredis/commands": { @@ -22224,108 +21094,6 @@ "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", "dev": true }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, "@josephg/resolvable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", @@ -22377,15 +21145,84 @@ "dev": true }, "@koa/router": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.0.tgz", - "integrity": "sha512-cnnxeKHXlt7XARJptflGURdJaO+ITpNkOHmQu7NHmCoRinPbyvFzce/EG/E8Zy81yQ1W9MoSdtklc3nyaDReUw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz", + "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==", "dev": true, "requires": { "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^6.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "@ljharb/resumer": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.3.tgz", + "integrity": "sha512-d+tsDgfkj9X5QTriqM4lKesCkMMJC3IrbPKHvayP00ELx2axdXvDfWkqjxrLXIzGcQzmj7VAUT1wopqARTvafw==", + "dev": true, + "requires": { + "@ljharb/through": "^2.3.13", + "call-bind": "^1.0.7" + } + }, + "@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, + "@modelcontextprotocol/sdk": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", + "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", + "dev": true, + "requires": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" }, "dependencies": { "depd": { @@ -22407,6 +21244,27 @@ "toidentifier": "1.0.1" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -22415,28 +21273,10 @@ } } }, - "@ljharb/resumer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.1.2.tgz", - "integrity": "sha512-opZnY9WsZ6tjPSpmTEdPY+LpxpEwqg3VsQiGFv+wAaA1ffTghnG019mAD8BKxkcpZx6HtvNj0vdyxDHTxPQlJw==", - "dev": true, - "requires": { - "@ljharb/through": "^2.3.12" - } - }, - "@ljharb/through": { - "version": "2.3.12", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.12.tgz", - "integrity": "sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==", - "dev": true, - "requires": { - "call-bind": "^1.0.5" - } - }, "@mongodb-js/saslprep": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", - "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", "dev": true, "requires": { "sparse-bitfield": "^3.0.3" @@ -22494,119 +21334,47 @@ "fastq": "^1.6.0" } }, - "@oozcitak/dom": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", - "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/url": "1.0.4", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/infra": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", - "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", - "dev": true, - "requires": { - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/url": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", - "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", - "dev": true, - "requires": { - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8" - } - }, - "@oozcitak/util": { - "version": "8.3.8", - "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", - "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", - "dev": true - }, "@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.1.tgz", - "integrity": "sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "requires": { - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/semantic-conventions": "1.28.0" } }, "@opentelemetry/resources": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.1.tgz", - "integrity": "sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "requires": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" } }, "@opentelemetry/sdk-metrics": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.1.tgz", - "integrity": "sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", "requires": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" } }, "@opentelemetry/semantic-conventions": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.1.tgz", - "integrity": "sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==" + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==" }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "dependencies": { - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "requires": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - } - } - } + "@pkgr/core": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", + "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", + "dev": true }, "@protobufjs/aspromise": { "version": "1.1.2", @@ -22679,9 +21447,9 @@ "dev": true }, "@redis/client": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.16.tgz", - "integrity": "sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", + "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", "dev": true, "requires": { "cluster-key-slot": "1.1.2", @@ -22696,27 +21464,33 @@ "dev": true }, "@redis/json": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.6.tgz", - "integrity": "sha512-rcZO3bfQbm2zPRpqo82XbW8zg4G/w4W3tI7X8Mqleq9goQjAGLL7q/1n1ZX4dXEAmORVZ4s1+uKLaUOg7LrUhw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", "dev": true }, "@redis/search": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.6.tgz", - "integrity": "sha512-mZXCxbTYKBQ3M2lZnEddwEAks0Kc7nauire8q20oA0oA/LoA+E/b5Y5KZn232ztPb1FkIGqo12vh3Lf+Vw5iTw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", "dev": true }, "@redis/time-series": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.5.tgz", - "integrity": "sha512-IFjIgTusQym2B5IZJG3XKr5llka7ey84fw/NOYqESP5WUfQs9zz1ww/9+qoz4ka/S6KcGBodzlCeZ5UImKbscg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "dev": true + }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0" @@ -23320,6 +22094,15 @@ "tslib": "^2.5.0" } }, + "@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "requires": { + "tslib": "^2.8.0" + } + }, "@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -23329,12 +22112,6 @@ "defer-to-connect": "^2.0.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, "@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", @@ -23366,6 +22143,18 @@ "@types/responselike": "*" } }, + "@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "dev": true + }, + "@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "dev": true + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -23381,6 +22170,12 @@ "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, + "@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, "@types/express": { "version": "4.17.14", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", @@ -23420,6 +22215,12 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -23454,12 +22255,20 @@ "dev": true }, "@types/node": { - "version": "20.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", - "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", + "version": "22.15.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.2.tgz", + "integrity": "sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.21.0" + }, + "dependencies": { + "undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + } } }, "@types/node-fetch": { @@ -23566,9 +22375,9 @@ } }, "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -23618,32 +22427,22 @@ "integrity": "sha1-asL8ICtQD4jaj09VMM+hAPTGotA=" }, "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "requires": { - "debug": "4" + "debug": "^4.3.4" } }, "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "requires": { "humanize-ms": "^1.2.1" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -23657,9 +22456,9 @@ } }, "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "requires": { "ajv": "^8.0.0" @@ -23691,18 +22490,35 @@ "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" + }, + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "optional": true, "requires": { @@ -23710,6 +22526,34 @@ "picomatch": "^2.0.4" } }, + "apache-arrow": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.0.0.tgz", + "integrity": "sha512-gFlPaqN9osetbB83zC29AbbZqGiCuFH1vyyPseJ+B7SIbfBtESV62mMT/CkiIt77W6ykC/nTWFzTXFs0Uldg4g==", + "dev": true, + "requires": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "dependencies": { + "@types/node": { + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + } + } + }, "apollo-datasource": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.2.tgz", @@ -23832,55 +22676,38 @@ "apollo-server-env": "^4.2.1" } }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" } }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, @@ -23891,28 +22718,30 @@ "dev": true }, "array.prototype.every": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.5.tgz", - "integrity": "sha512-FfMQJ+/joFGXpRCltbzV3znaP5QxIhLFySo0fEPn3GuoYlud9LhknMCIxdYKC2qsM/6VHoSp6YGwe3EZXrEcwQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.6.tgz", + "integrity": "sha512-gNEqZD97w6bfQRNmHkFv7rNnGM+VWyHZT+h/rf9C+22owcXuENr66Lfo0phItpU5KoXW6Owb34q2+8MnSIZ57w==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0", "is-string": "^1.0.7" } }, "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flat": { @@ -23940,15 +22769,17 @@ } }, "arraybuffer.prototype.slice": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", - "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" } }, @@ -24019,19 +22850,20 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "avvio": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.3.0.tgz", - "integrity": "sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.0.0.tgz", + "integrity": "sha512-UbYrOXgE/I+knFG+3kJr9AgC7uNo8DG+FGGODpH9Bj1O1kL/QDjBXnTem9leD3VdQKtaHjV3O85DQ7hHh4IIHw==", "dev": true, "requires": { - "@fastify/error": "^3.3.0", - "archy": "^1.0.0", - "debug": "^4.0.0", + "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, @@ -24077,33 +22909,27 @@ } } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "aws-ssl-profiles": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.1.tgz", + "integrity": "sha512-+H+kuK34PfMaI9PNU/NSjBKL5hh/KDM9J72kwYeYEm0A8B1AC4fuCy3qsjnA7lxklgyXsB68yn8Z2xoZEjgwCQ==", "dev": true }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" }, "dependencies": { "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -24114,13 +22940,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "dependencies": { @@ -24133,22 +22959,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" } }, "babel-walk": { @@ -24198,21 +23024,15 @@ "platform": "^1.3.3" } }, - "big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true - }, "bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" }, "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "optional": true }, @@ -24277,9 +23097,9 @@ "dev": true }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -24290,7 +23110,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -24344,15 +23164,6 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "dev": true }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "requires": { - "big-integer": "^1.6.44" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -24364,12 +23175,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "breadth-filter": { @@ -24381,21 +23192,21 @@ } }, "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" } }, "bson": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", - "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", + "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", "dev": true }, "buffer": { @@ -24421,15 +23232,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "requires": { - "run-applescript": "^5.0.0" - } - }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -24467,35 +23269,6 @@ "responselike": "^2.0.0" } }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -24508,76 +23281,87 @@ "set-function-length": "^1.2.1" } }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001593", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001593.tgz", - "integrity": "sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "caniuse-lite": { + "version": "1.0.30001716", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", + "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", "dev": true }, "cassandra-driver": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.7.2.tgz", - "integrity": "sha512-gwl1DeYvL8Wy3i1GDMzFtpUg5G473fU7EnHFZj7BUtdLB7loAfgZgB3zBhROc9fbaDSUDs6YwOPPojS5E1kbSA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.8.0.tgz", + "integrity": "sha512-HritfMGq9V7SuESeSodHvArs0mLuMk7uh+7hQK2lqdvXrvm50aWxb4RPxkK3mPDdsgHjJ427xNRFITMH2ei+Sw==", "dev": true, "requires": { - "@types/long": "~5.0.0", - "@types/node": ">=8", + "@types/node": "^18.11.18", "adm-zip": "~0.5.10", "long": "~5.2.3" }, "dependencies": { - "@types/long": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/long/-/long-5.0.0.tgz", - "integrity": "sha512-eQs9RsucA/LNjnMoJvWG/nXa7Pot/RbBzilF/QRIU/xRl+0ApxrSUFsV5lmf01SvSlqMzJ7Zwxe440wmz2SJGA==", + "@types/node": { + "version": "18.19.76", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.76.tgz", + "integrity": "sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==", "dev": true, "requires": { - "long": "*" + "undici-types": "~5.26.4" } }, "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.5.tgz", + "integrity": "sha512-e0r9YBBgNCq1D1o5Dp8FMH0N5hsFtXDBiVa0qoJPHpakvZkmDKPRoGffZJII/XsHvj9An9blm+cRJ01yQqU+Dw==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true } } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "requires": { + "chalk": "^4.1.2" } }, "character-parser": { @@ -24590,9 +23374,9 @@ } }, "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "optional": true, "requires": { @@ -24617,12 +23401,6 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli-spinners": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", @@ -24740,16 +23518,48 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true + "command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "dev": true, + "requires": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "dependencies": { + "array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true + }, + "typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "dev": true + } + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "concat-map": { @@ -24855,24 +23665,15 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" }, "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true }, "cookies": { @@ -24900,12 +23701,12 @@ "dev": true }, "core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "dev": true, "requires": { - "browserslist": "^4.22.3" + "browserslist": "^4.24.4" } }, "core-util-is": { @@ -24924,9 +23725,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -24988,20 +23789,45 @@ "assert-plus": "^1.0.0" } }, + "data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "requires": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -25037,45 +23863,6 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, - "default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "requires": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - } - }, - "default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "requires": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - } - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } - } - }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", @@ -25172,20 +23959,6 @@ "resolve": "^1.1.7" }, "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "globby": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", @@ -25279,11 +24052,15 @@ "nan": "^2.14.0" } }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } }, "ecc-jsbn": { "version": "0.1.2", @@ -25322,9 +24099,9 @@ }, "dependencies": { "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.3.tgz", + "integrity": "sha512-yqXL+k5rr8+ZRpOAntkaaRgWgE5o8ESAj5DyRmVTCSoZxXmqemb9Dd7T4i5UzwuERdLAJUy6XzR9zFVuf0kzkw==", "dev": true, "requires": { "humanize-ms": "^1.2.1" @@ -25379,15 +24156,9 @@ } }, "electron-to-chromium": { - "version": "1.4.690", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", - "integrity": "sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "1.5.149", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", "dev": true }, "enabled": { @@ -25411,9 +24182,9 @@ } }, "enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -25434,58 +24205,62 @@ } }, "es-abstract": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", - "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "which-typed-array": "^1.1.15" } }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", @@ -25517,14 +24292,22 @@ } } }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" } }, "es-shim-unscopables": { @@ -25546,16 +24329,10 @@ "is-symbol": "^1.0.2" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -25576,28 +24353,34 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.3.0.tgz", - "integrity": "sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.3.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -25606,15 +24389,12 @@ "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "zod": "^3.24.2" }, "dependencies": { "ajv": { @@ -25629,40 +24409,6 @@ "uri-js": "^4.2.2" } }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -25682,12 +24428,6 @@ "is-glob": "^4.0.3" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -25720,28 +24460,22 @@ "requires": { "p-limit": "^3.0.2" } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "eslint-compat-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz", - "integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==", - "dev": true + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "requires": { + "semver": "^7.5.4" + } }, "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz", + "integrity": "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==", "dev": true }, "eslint-import-resolver-node": { @@ -25767,9 +24501,9 @@ } }, "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "requires": { "debug": "^3.2.7" @@ -25787,38 +24521,40 @@ } }, "eslint-plugin-es-x": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz", - "integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.6.0", - "eslint-compat-utils": "^0.1.2" + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" } }, "eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "dependencies": { @@ -25849,28 +24585,28 @@ } }, "eslint-plugin-license-header": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.1.tgz", - "integrity": "sha512-9aIz8q3OaMr1/uQmCGCWySjTs5nEXUJexNegz/8lluNcZbEl82Ag1Vyr1Hu3oIveRW1NbXDPs6nu4zu9mbrmWA==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.8.0.tgz", + "integrity": "sha512-khTCz6G3JdoQfwrtY4XKl98KW4PpnWUKuFx8v+twIRhJADEyYglMDC0td8It75C1MZ88gcvMusWuUlJsos7gYg==", "dev": true, "requires": { "requireindex": "^1.2.0" } }, "eslint-plugin-n": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.7.0.tgz", - "integrity": "sha512-4Jg4ZKVE4VjHig2caBqPHYNW5na84RVufUuipFLJbgM/G57O6FdpUKJbHakCDJb/yjQuyqVzYWRtU3HNYaZUwg==", + "version": "17.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz", + "integrity": "sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "enhanced-resolve": "^5.15.0", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^15.0.0", - "ignore": "^5.2.4", - "minimatch": "^9.0.0", - "semver": "^7.5.3" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" }, "dependencies": { "brace-expansion": { @@ -25883,15 +24619,15 @@ } }, "globals": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.1.0.tgz", - "integrity": "sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==", + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", "dev": true }, "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -25900,25 +24636,28 @@ } }, "eslint-plugin-prettier": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", - "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.3.1.tgz", + "integrity": "sha512-vad9VWgEm9xaVXRNmb4aeOt0PWDc61IAdzghkbYQ2wavgax148iKoX1rNJcgkBGCipzLzOnHYVgL7xudM9yccQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.6" + "synckit": "^0.11.0" } }, "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0" + } }, "eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -25926,9 +24665,9 @@ } }, "eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true }, "esm": { @@ -25938,22 +24677,16 @@ "dev": true }, "espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "requires": { - "acorn": "^8.11.3", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.2.0" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -26001,98 +24734,108 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, - "events-to-array": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz", - "integrity": "sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==", - "dev": true - }, - "ewma": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ewma/-/ewma-2.0.1.tgz", - "integrity": "sha512-MYYK17A76cuuyvkR7MnqLW4iFYPEi5Isl2qb8rXiWpLiwFS9dxW/rncuNnjjgSENuVqZQkIuR4+DChVL4g1lnw==", + "eventsource": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", + "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "eventsource-parser": "^3.0.1" } }, - "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - } - } + "eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "ewma": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ewma/-/ewma-2.0.1.tgz", + "integrity": "sha512-MYYK17A76cuuyvkR7MnqLW4iFYPEi5Isl2qb8rXiWpLiwFS9dxW/rncuNnjjgSENuVqZQkIuR4+DChVL4g1lnw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "requires": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.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.7", + "qs": "^6.14.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.0.1", + "vary": "^1.1.2" }, "dependencies": { + "accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "requires": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + } + }, + "body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "requires": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + } + }, + "content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.3" } }, "depd": { @@ -26101,6 +24844,18 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -26114,29 +24869,110 @@ "toidentifier": "1.0.1" } }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true + }, + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true }, + "qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "requires": { + "side-channel": "^1.1.0" + } + }, + "raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "requires": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true + }, + "type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "requires": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + } } } }, @@ -26177,10 +25013,10 @@ "mini-queue": "0.0.14" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "dev": true }, "extsprintf": { @@ -26189,12 +25025,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "fast-content-type-parse": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", - "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==", - "dev": true - }, "fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -26232,6 +25062,29 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "fast-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.0.0.tgz", + "integrity": "sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==", + "dev": true, + "requires": { + "@fastify/merge-json-schemas": "^0.1.1", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.3.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + }, + "dependencies": { + "fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "dev": true + } + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -26239,9 +25092,9 @@ "dev": true }, "fast-querystring": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", - "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dev": true, "requires": { "fast-decode-uri-component": "^1.0.1" @@ -26266,9 +25119,9 @@ } }, "fast-uri": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.1.0.tgz", - "integrity": "sha512-qKRta6N7BWEFVlyonVY/V+BMLgFqktCUV0QjT259ekAIlbVrMaFnFLxJ4s/JPl4tou56S1BzPufI60bLe29fHA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", "dev": true }, "fast-xml-parser": { @@ -26281,76 +25134,39 @@ } }, "fastify": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.27.0.tgz", - "integrity": "sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.2.tgz", + "integrity": "sha512-AIPqBgtqBAwkOkrnwesEE+dOyU30dQ4kh7udxeGVR05CRGwubZx+p2H8P0C4cRnQT0+EPK4VGea2DTL2RtWttg==", "dev": true, "requires": { - "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.4.0", - "@fastify/fast-json-stringify-compiler": "^4.3.0", + "@fastify/ajv-compiler": "^4.0.0", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", - "avvio": "^8.3.0", - "fast-content-type-parse": "^1.1.0", - "fast-json-stringify": "^5.8.0", - "find-my-way": "^8.0.0", - "light-my-request": "^5.11.0", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", "pino": "^9.0.0", - "process-warning": "^3.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.7.0", - "semver": "^7.5.4", - "toad-cache": "^3.3.0" + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" }, "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "fast-json-stringify": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.8.0.tgz", - "integrity": "sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==", - "dev": true, - "requires": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" - } - }, "find-my-way": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.1.0.tgz", - "integrity": "sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.0.1.tgz", + "integrity": "sha512-/5NN/R0pFWuff16TMajeKt2JyiW+/OE8nOO8vo1DwZTxLaIURb7lcBYPIgRPh61yCNh9l8voeKwcrkUzmB00vw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^4.0.0" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, "pino": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/pino/-/pino-9.0.0.tgz", @@ -26368,49 +25184,49 @@ "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" - } - }, - "pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dev": true, - "requires": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" + }, + "dependencies": { + "process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + } } }, "process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "dev": true }, - "readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "dev": true + }, + "safe-regex2": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.0.tgz", + "integrity": "sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==", "dev": true, "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "ret": "~0.5.0" } }, - "split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "secure-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.0.0.tgz", + "integrity": "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==", "dev": true } } }, "fastify-plugin": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.2.1.tgz", - "integrity": "sha512-dlGKiwLzRBKkEf5J5ho0uAD/Jdv8GQVUbriB3tAX3ehRUXE4gTV3lRd5inEg9li1aLzb0EGj8y2K4/8g1TN06g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.0.1.tgz", + "integrity": "sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==", "dev": true }, "fastq": { @@ -26438,42 +25254,47 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "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" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.3" } }, - "ms": { + "encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "statuses": { @@ -26484,34 +25305,6 @@ } } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "find-my-way": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", @@ -26523,14 +25316,13 @@ "safe-regex2": "^2.0.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "array-back": "^3.0.1" } }, "flat-cache": { @@ -26543,6 +25335,12 @@ "keyv": "^4.5.4" } }, + "flatbuffers": { + "version": "24.3.25", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.3.25.tgz", + "integrity": "sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==", + "dev": true + }, "flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -26556,9 +25354,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true }, "for-each": { @@ -26569,33 +25367,6 @@ "is-callable": "^1.1.3" } }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "formidable": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", @@ -26619,12 +25390,6 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -26638,9 +25403,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -26650,14 +25415,14 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -26686,22 +25451,21 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "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", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-package-type": { @@ -26716,6 +25480,15 @@ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -26726,18 +25499,19 @@ } }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" } }, "get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, "requires": { "resolve-pkg-maps": "^1.0.0" @@ -26759,58 +25533,17 @@ } }, "glob": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", - "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -26837,12 +25570,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "got": { "version": "11.8.6", @@ -26864,9 +25594,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "graphql": { @@ -26911,50 +25641,6 @@ } } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -26988,9 +25674,9 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-property-descriptors": { @@ -27002,31 +25688,21 @@ } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "has-symbols": "^1.0.3" } }, "hashring": { @@ -27040,9 +25716,9 @@ } }, "hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { "function-bind": "^1.1.2" } @@ -27091,10 +25767,10 @@ } } }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", "dev": true }, "http-assert": { @@ -27141,25 +25817,13 @@ } }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" } }, "http2-wrapper": { @@ -27172,31 +25836,16 @@ "resolve-alpn": "^1.0.0" } }, - "https-pem": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/https-pem/-/https-pem-3.0.0.tgz", - "integrity": "sha512-JqYVRTpk1WeXziwBaTX6eyXod6Dt70d/kehtY3DR6ygl+11XgcksTjSl4NjZbNCKK3rpTB1qH9hnu75RSOFUWQ==", - "dev": true, - "requires": { - "selfsigned": "^2.0.1" - } - }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" } }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -27221,9 +25870,9 @@ "dev": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "import-fresh": { @@ -27237,11 +25886,11 @@ } }, "import-in-the-middle": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.4.tgz", - "integrity": "sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz", + "integrity": "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA==", "requires": { - "acorn": "^8.8.2", + "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" @@ -27253,12 +25902,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, "inflation": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", @@ -27281,12 +25924,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -27297,9 +25940,9 @@ "dev": true }, "ioredis": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", - "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", + "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "dev": true, "requires": { "@ioredis/commands": "^1.1.1", @@ -27330,13 +25973,12 @@ } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" } }, "is-bigint": { @@ -27381,11 +26023,19 @@ } }, "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "requires": { + "is-typed-array": "^1.1.13" } }, "is-date-object": { @@ -27431,12 +26081,6 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, "is-generator-function": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", @@ -27455,23 +26099,6 @@ "is-extglob": "^2.1.1" } }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - }, - "dependencies": { - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - } - } - }, "is-integer": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", @@ -27487,9 +26114,9 @@ "dev": true }, "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==" }, "is-number": { "version": "7.0.0", @@ -27505,12 +26132,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -27548,11 +26169,11 @@ "dev": true }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" } }, "is-stream": { @@ -27578,23 +26199,13 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -27621,229 +26232,40 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "call-bind": "^1.0.2" } }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" } }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "is-docker": "^2.0.0" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, "jackpot": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/jackpot/-/jackpot-0.0.6.tgz", @@ -27861,16 +26283,6 @@ } } }, - "jackspeak": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", - "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -27878,14 +26290,14 @@ "dev": true }, "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -27932,9 +26344,9 @@ "dev": true }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json": { @@ -27951,6 +26363,12 @@ "bignumber.js": "^9.0.0" } }, + "json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "dev": true + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -27969,6 +26387,15 @@ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, + "json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -28034,18 +26461,6 @@ } } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -28138,9 +26553,9 @@ } }, "koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -28204,15 +26619,14 @@ } }, "koa-router": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-12.0.0.tgz", - "integrity": "sha512-zGrdiXygGYW8WvrzeGsHZvKnHs4DzyGoqJ9a8iHlRkiwuEAOAPyI27//OlhoWdgFAEIM3qbUgr0KCuRaP/TCag==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-13.0.1.tgz", + "integrity": "sha512-4/sijXdSxocIe2wv7RFFSxvo2ic1pDzPSmy11yCGztng1hx408qfw1wVmN3aqhQaU7U6nJ039JKC8ObE73Ohgw==", "dev": true, "requires": { "http-errors": "^2.0.0", "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^8.1.0" }, "dependencies": { "depd": { @@ -28278,39 +26692,36 @@ } }, "light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.5.1.tgz", + "integrity": "sha512-0q82RyxIextuDtkA0UDofhPHIiQ2kmpa7fwElCSlm/8nQl36cDU1Cw+CAO90Es0lReH2HChClKL84I86Nc52hg==", "dev": true, "requires": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", - "set-cookie-parser": "^2.4.1" + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" }, "dependencies": { "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "dev": true } } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -28323,12 +26734,6 @@ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -28374,7 +26779,8 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "lodash.once": { "version": "4.1.1", @@ -28395,57 +26801,6 @@ "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "logform": { @@ -28480,9 +26835,15 @@ "dev": true }, "lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==" + }, + "lru.min": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.0.tgz", + "integrity": "sha512-86xXMB6DiuKrTqkE/lRL0drlNh568awttBPJ7D66fzDHpy6NC5r3N+Ly/lKCS2zjmeGyvFDx670z0cD0PVBwGA==", + "dev": true }, "make-dir": { "version": "2.1.0", @@ -28507,6 +26868,11 @@ "resolved": "https://registry.npmjs.org/mapcap/-/mapcap-1.0.0.tgz", "integrity": "sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==" }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "measured-core": { "version": "1.51.1", "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", @@ -28550,15 +26916,9 @@ "dev": true }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true }, "merge2": { @@ -28570,7 +26930,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { @@ -28604,12 +26964,6 @@ "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, "mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", @@ -28673,17 +27027,18 @@ } }, "mock-property": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", - "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.1.0.tgz", + "integrity": "sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==", "dev": true, "requires": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", "functions-have-names": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "hasown": "^2.0.0", - "isarray": "^2.0.5" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.2", + "isarray": "^2.0.5", + "object-inspect": "^1.13.2" }, "dependencies": { "isarray": { @@ -28695,18 +27050,18 @@ } }, "module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==" }, "mongodb": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", - "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", + "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", "dev": true, "requires": { - "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.7.0", + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", "mongodb-connection-string-url": "^3.0.0" } }, @@ -28816,16 +27171,17 @@ } }, "mysql2": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.8.tgz", - "integrity": "sha512-+5JKNjPuks1FNMoy9TYpl77f+5frbTklz7eb3XDwbpsERRLEeXiW2PDEkakYF50UuKU2qwfGnyXpKYvukv8mGA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz", + "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==", "dev": true, "requires": { + "aws-ssl-profiles": "^1.1.1", "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", "long": "^5.2.1", - "lru-cache": "^8.0.0", + "lru.min": "^1.0.0", "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" @@ -28846,12 +27202,6 @@ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", "dev": true }, - "lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true - }, "sqlstring": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", @@ -28976,25 +27326,10 @@ } } }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { @@ -29042,23 +27377,6 @@ "integrity": "sha512-iEiETp11ZuiWKAlLRBaUD3zKjZTzAco3xrkCbIJaxs+iu2+zIbaKXdVpzmsjyDCe0r7IpDW55iAyVHzktTg5DA==", "dev": true }, - "npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -29066,186 +27384,9 @@ "dev": true }, "numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha1-StCAk21EPCVhrtnyGX7//iX05QY=", "dev": true }, "object-assign": { @@ -29268,18 +27409,18 @@ } }, "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" }, "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" } }, "object-keys": { @@ -29309,37 +27450,37 @@ } }, "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "obliterator": { @@ -29385,15 +27526,6 @@ "fn.name": "1.x.x" } }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, "only": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", @@ -29453,33 +27585,12 @@ "p-try": "^2.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -29524,28 +27635,10 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", - "dev": true - } - } - }, "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", + "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", "dev": true }, "path-type": { @@ -29554,38 +27647,32 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "pg": { - "version": "8.11.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", - "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-yvao7YI3GdmmrslNVsZgx9PfntfWrnXwtR+K/DjI0I/sTKif4Z623um+sjVZ1hk5670B+ODjvHDAckKdjmPTsg==", "dev": true, "requires": { - "pg-cloudflare": "^1.1.1", - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-cloudflare": "^1.2.5", + "pg-connection-string": "^2.8.5", + "pg-pool": "^3.9.6", + "pg-protocol": "^1.9.5", "pg-types": "^2.1.0", "pgpass": "1.x" }, "dependencies": { "pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.8.5.tgz", + "integrity": "sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==", "dev": true } } }, "pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", + "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", "dev": true, "optional": true }, @@ -29602,15 +27689,15 @@ "dev": true }, "pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.9.6.tgz", + "integrity": "sha512-rFen0G7adh1YmgvrmE5IPIqbb+IgEzENUm+tzm6MLLDSlPRoZVhzU1WdML9PV2W5GOdRA9qBKURlbt1OsXOsPw==", "dev": true }, "pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.9.5.tgz", + "integrity": "sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==", "dev": true }, "pg-types": { @@ -29644,9 +27731,9 @@ } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -29755,14 +27842,11 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } + "pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true }, "pkg-up": { "version": "3.1.0", @@ -29815,6 +27899,11 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -29849,9 +27938,9 @@ "dev": true }, "prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true }, "prettier-linter-helpers": { @@ -29874,19 +27963,10 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, "process-warning": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", - "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", "dev": true }, "promise": { @@ -29914,12 +27994,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "pug": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", @@ -30060,12 +28134,12 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystring": { @@ -30146,22 +28220,6 @@ "json-parse-even-better-errors": "^2.3.0", "normalize-package-data": "^2.0.0", "npm-normalize-package-bin": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "readable-stream": { @@ -30199,17 +28257,17 @@ } }, "redis": { - "version": "4.6.14", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.14.tgz", - "integrity": "sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", + "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", "dev": true, "requires": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.16", + "@redis/client": "1.6.0", "@redis/graph": "1.1.1", - "@redis/json": "1.0.6", - "@redis/search": "1.1.6", - "@redis/time-series": "1.0.5" + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" } }, "redis-errors": { @@ -30234,68 +28292,52 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "requires": { "regenerate": "^1.4.2" } }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "requires": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } + "jsesc": "~3.0.2" } }, "relative-microtime": { @@ -30303,57 +28345,6 @@ "resolved": "https://registry.npmjs.org/relative-microtime/-/relative-microtime-2.0.0.tgz", "integrity": "sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==" }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -30378,12 +28369,6 @@ } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -30391,21 +28376,25 @@ "dev": true }, "require-in-the-middle": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", - "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", "requires": { - "debug": "^4.1.1", + "debug": "^4.3.5", "module-details-from-path": "^1.0.3", - "resolve": "^1.22.1" + "resolve": "^1.22.8" + }, + "dependencies": { + "debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "requires": { + "ms": "2.1.2" + } + } } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -30503,9 +28492,9 @@ } }, "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "mime": { @@ -30553,86 +28542,58 @@ "dev": true }, "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^10.2.5" + "glob": "^7.1.3" } }, - "run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, "requires": { - "execa": "^5.0.0" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "ms": "^2.1.3" } }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -30647,21 +28608,21 @@ } }, "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -30686,12 +28647,12 @@ "optional": true }, "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" } }, @@ -30732,9 +28693,9 @@ "dev": true }, "secure-json-parse": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", - "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", + "integrity": "sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==", "dev": true }, "select-hose": { @@ -30743,32 +28704,10 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - } - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "send": { "version": "0.18.0", @@ -30848,27 +28787,109 @@ "dev": true }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, + "fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "requires": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-cookie-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", - "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz", + "integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==", "dev": true }, "set-function-length": { @@ -30931,20 +28952,48 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" } }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { + "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" + } }, "simple-lru-cache": { "version": "0.0.2", @@ -31009,60 +29058,6 @@ "dargs": "^4.0.0" } }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -31131,12 +29126,6 @@ "readable-stream": "^3.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "sql-summary": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sql-summary/-/sql-summary-1.0.1.tgz", @@ -31243,56 +29232,35 @@ } } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -31304,27 +29272,12 @@ "ansi-regex": "^5.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -31338,12 +29291,12 @@ "dev": true }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -31352,44 +29305,31 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "synckit": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", - "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", - "dev": true, - "requires": { - "@pkgr/utils": "^2.4.2", - "tslib": "^2.6.2" - } - }, - "tap-junit": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tap-junit/-/tap-junit-5.0.3.tgz", - "integrity": "sha512-pbBXzjWoqkr11NDNvINfvN+I/zdKm88Iu2KtFfnx/FEq4yNJGC1TVj6Kg8QJrD4m8Zahkp4xF/Gf45a8vua0tg==", - "dev": true, - "requires": { - "minimist": "1.2.8", - "tap-parser": "15.3.1", - "xmlbuilder2": "3.1.1" - } - }, - "tap-parser": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-15.3.1.tgz", - "integrity": "sha512-hwAtXX5TBGt2MJeYvASc7DjP48PUzA7P8RTbLxQcgKCEH7ICD5IsRco7l5YvkzjHlZbUbeI9wzO8B4hw2sKgnQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.2.tgz", + "integrity": "sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==", "dev": true, "requires": { - "events-to-array": "^2.0.3", - "tap-yaml": "2.2.1" + "@pkgr/core": "^0.2.0", + "tslib": "^2.8.1" } }, - "tap-yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-2.2.1.tgz", - "integrity": "sha512-ovZuUMLAIH59jnFHXKEGJ+WyDYl6Cuduwg9qpvnqkZOUA1nU84q02Sry1HT0KXcdv2uB91bEKKxnIybBgrb6oA==", + "table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", "dev": true, "requires": { - "yaml": "^2.3.0", - "yaml-types": "^0.3.0" + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "dependencies": { + "array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true + } } }, "tapable": { @@ -31399,14 +29339,14 @@ "dev": true }, "tape": { - "version": "5.7.5", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.7.5.tgz", - "integrity": "sha512-C5Gm1MR8ujZmNrsmOiHSkKFfY2thrnUrFw/fFtcva9FABbN7LrHuQPi3MTS0Z0i/SLfYSJtRIcJYDUpwPsQ8yA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.9.0.tgz", + "integrity": "sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==", "dev": true, "requires": { - "@ljharb/resumer": "^0.1.2", - "@ljharb/through": "^2.3.12", - "array.prototype.every": "^1.1.5", + "@ljharb/resumer": "^0.1.3", + "@ljharb/through": "^2.3.13", + "array.prototype.every": "^1.1.6", "call-bind": "^1.0.7", "deep-equal": "^2.2.3", "defined": "^1.0.1", @@ -31415,17 +29355,17 @@ "get-package-type": "^0.1.0", "glob": "^7.2.3", "has-dynamic-import": "^2.1.0", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "inherits": "^2.0.4", "is-regex": "^1.1.4", "minimist": "^1.2.8", - "mock-property": "^1.0.3", - "object-inspect": "^1.13.1", - "object-is": "^1.1.5", + "mock-property": "^1.1.0", + "object-inspect": "^1.13.2", + "object-is": "^1.1.6", "object-keys": "^1.1.1", "object.assign": "^4.1.5", "resolve": "^2.0.0-next.5", - "string.prototype.trim": "^1.2.8" + "string.prototype.trim": "^1.2.9" }, "dependencies": { "deep-equal": { @@ -31454,20 +29394,6 @@ "which-typed-array": "^1.1.13" } }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -31494,12 +29420,13 @@ "dev": true }, "tedious": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.2.0.tgz", - "integrity": "sha512-PCELoE17gN71lk0A87+WITcIJ6uGagrV2hXVJT5ige/Yef+YCLVpQ/Je12rOZT7vBhVZoMp6MvaBmbfI8fw0ag==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-19.0.0.tgz", + "integrity": "sha512-nmxNBAT72mMVCIYp0Ts0Zzd5+LBQjoXlqigCrIjSo2OERSi04vr3EHq3qJxv/zgrSkg7si03SoIIfekTAadA7w==", "dev": true, "requires": { - "@azure/identity": "^3.4.1", + "@azure/core-auth": "^1.7.2", + "@azure/identity": "^4.2.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.6.1", "@types/node": ">=18", @@ -31551,45 +29478,12 @@ "which": "^2.0.2" } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, "thread-stream": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.7.0.tgz", @@ -31646,18 +29540,6 @@ "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", "dev": true }, - "titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -31668,9 +29550,9 @@ } }, "toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", "dev": true }, "toidentifier": { @@ -31685,16 +29567,6 @@ "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", "dev": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", @@ -31739,9 +29611,9 @@ } }, "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "tsscmp": { @@ -31750,15 +29622,6 @@ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -31774,12 +29637,6 @@ "prelude-ls": "^1.2.1" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -31791,61 +29648,63 @@ } }, "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" } }, "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "requires": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" } }, "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true }, "uglify-js": { @@ -31873,15 +29732,15 @@ "dev": true }, "undici": { - "version": "6.18.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.1.tgz", - "integrity": "sha512-/0BWqR8rJNRysS5lqVmfc7eeOErcOP4tZpATVjJOojjHZ71gSYVAtFhEmadcIjwMIUehh5NFyKGsXCnXIajtbA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.8.0.tgz", + "integrity": "sha512-vFv1GA99b7eKO1HG/4RPu2Is3FBTWBrmzqzO0mz+rLxN3yXkE4mqRcb8g8fHxzX4blEysrNZLqg5RbJLqX5buA==", "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "unicode-byte-truncate": { @@ -31894,9 +29753,9 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true }, "unicode-match-property-ecmascript": { @@ -31910,9 +29769,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true }, "unicode-property-aliases-ecmascript": { @@ -31932,20 +29791,14 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" } }, "uri-js": { @@ -32062,16 +29915,16 @@ "dev": true }, "wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", + "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", "dev": true, "requires": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.8.2", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", - "rxjs": "^7.8.1" + "rxjs": "^7.8.2" } }, "wbuf": { @@ -32146,22 +29999,16 @@ "is-weakset": "^2.0.1" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" } }, "winston": { @@ -32212,90 +30059,23 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } + "wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true }, - "xmlbuilder2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", - "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", - "dev": true, - "requires": { - "@oozcitak/dom": "1.15.10", - "@oozcitak/infra": "1.0.8", - "@oozcitak/util": "8.3.8", - "js-yaml": "3.14.1" - }, - "dependencies": { - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, "xss": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.11.tgz", @@ -32323,18 +30103,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true - }, - "yaml-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/yaml-types/-/yaml-types-0.3.0.tgz", - "integrity": "sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "ylru": { @@ -32348,6 +30117,18 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true + }, + "zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true } } } diff --git a/package.json b/package.json index 66bc724c92..d4b015eb2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "elastic-apm-node", - "version": "4.5.4", + "version": "4.13.0", "description": "The official Elastic APM agent for Node.js", "type": "commonjs", "main": "index.js", @@ -15,7 +15,6 @@ "lint:license-files": "./dev-utils/gen-notice.sh --lint . # requires node >=16", "lint:yaml-files": "./dev-utils/lint-yaml-files.sh # requires node >=10", "lint:tav": "./dev-utils/lint-tav-json.js", - "coverage": "COVERAGE=true ./test/script/run_tests.sh", "test": "./test/script/run_tests.sh", "test:deps": "dependency-check index.js start.js start-next.js 'lib/**/*.js' 'test/**/*.js' '!test/activation-method/fixtures' '!test/instrumentation/azure-functions/fixtures' '!test/instrumentation/modules/next/a-nextjs-app' '!test/opentelemetry-bridge' '!test/opentelemetry-metrics/fixtures' --no-dev -i async_hooks -i perf_hooks -i node:http -i @azure/functions-core -i worker_threads -i timers", "test:tav": "(cd test/opentelemetry-metrics/fixtures && tav --quiet) && (cd test/opentelemetry-bridge && tav --quiet) && (cd test/instrumentation/modules/next/a-nextjs-app && tav --quiet) && tav --quiet", @@ -28,8 +27,7 @@ "docker:start": "docker compose -f ./test/docker-compose.yml up -d", "docker:stop": "docker compose -f ./test/docker-compose.yml down", "docker:clean": "./test/script/docker/cleanup.sh", - "docker:dev": "docker compose -f ./dev-utils/docker-compose.yml run --workdir=/agent nodejs-agent", - "package:snapshot": "rm -rf ./build/snapshot && mkdir -p ./build/snapshot && npm pack --pack-destination ./build/snapshot" + "docker:dev": "docker compose -f ./dev-utils/docker-compose.yml run --workdir=/agent nodejs-agent" }, "directories": { "test": "test" @@ -99,7 +97,7 @@ "async-value-promise": "^1.1.1", "basic-auth": "^2.0.1", "breadth-filter": "^2.0.0", - "cookie": "^0.6.0", + "cookie": "^0.7.1", "core-util-is": "^1.0.2", "end-of-stream": "^1.4.4", "error-callsites": "^2.0.4", @@ -108,9 +106,9 @@ "fast-safe-stringify": "^2.0.7", "fast-stream-to-buffer": "^1.0.0", "http-headers": "^3.0.2", - "import-in-the-middle": "1.7.4", + "import-in-the-middle": "1.13.1", "json-bigint": "^1.0.0", - "lru-cache": "^10.0.1", + "lru-cache": "10.2.0", "measured-reporting": "^1.51.1", "module-details-from-path": "^1.0.3", "monitor-event-loop-delay": "^1.0.0", @@ -138,11 +136,11 @@ "@babel/cli": "^7.8.4", "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", - "@elastic/elasticsearch": "^8.6.0", - "@fastify/formbody": "^7.0.1", + "@elastic/elasticsearch": "^9.0.0", + "@fastify/formbody": "^8.0.1", "@hapi/hapi": "^21.0.0", - "@koa/router": "^12.0.0", - "@types/node": "^20.1.0", + "@koa/router": "^13.0.1", + "@types/node": "^22.0.0", "ajv": "^8.12.0", "apollo-server-core": "^3.0.0", "apollo-server-express": "^3.0.0", @@ -158,23 +156,22 @@ "diagnostics_channel": "^1.1.0", "elasticsearch": "^16.7.3", "eslint": "^9.0.0", - "eslint-config-prettier": "^9.0.0", + "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.28.0", - "eslint-plugin-license-header": "^0.6.0", + "eslint-plugin-license-header": "^0.8.0", "eslint-plugin-n": "^17.2.0", "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "express": "^4.17.1", + "eslint-plugin-promise": "^7.0.0", + "express": "^5.0.0", "express-queue": "^0.0.13", - "fastify": "^4.16.3", - "finalhandler": "^1.1.2", + "fastify": "^5.0.0", + "finalhandler": "^2.1.0", "generic-pool": "^3.7.1", "get-port": "^5.1.1", - "glob": "^10.3.4", + "glob": "^7.2.3", "got": "^11.8.5", "graphql": "^16.6.0", "handlebars": "^4.7.3", - "https-pem": "^3.0.0", "ioredis": "^5.1.0", "js-yaml": "^4.1.0", "json": "^11.0.0", @@ -182,7 +179,7 @@ "knex": "^3.0.1", "koa": "^2.11.0", "koa-bodyparser": "^4.3.0", - "koa-router": "^12.0.0", + "koa-router": "^13.0.1", "lambda-local": "^2.0.2", "memcached": "^2.2.2", "mimic-response": "1.0.0", @@ -193,25 +190,22 @@ "mysql2": "^3.2.4", "ndjson": "^2.0.0", "numeral": "^2.0.6", - "nyc": "^15.0.0", "once": "^1.4.0", "pg": "^8.7.1", "prettier": "^3.0.0", "pug": "^3.0.1", "redis": "^4.3.0", - "request": "^2.88.2", "restify": "^11.0.0", - "rimraf": "^5.0.1", - "tap-junit": "^5.0.1", + "rimraf": "^3.0.2", "tape": "^5.0.0", - "tedious": "^18.1.0", + "tedious": "^19.0.0", "test-all-versions": "^6.1.0", "thunky": "^1.1.0", "tree-kill": "^1.2.2", "typescript": "^5.0.2", - "undici": "^6.2.1", + "undici": "^7.0.0", "vasync": "^2.2.0", - "wait-on": "^7.0.1", + "wait-on": "^8.0.0", "ws": "^7.2.1" } } diff --git a/test/_is_cassandra_incompat.js b/test/_is_cassandra_incompat.js deleted file mode 100644 index 9ed70d08aa..0000000000 --- a/test/_is_cassandra_incompat.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and other contributors where applicable. - * Licensed under the BSD 2-Clause License; you may not use this file except in - * compliance with the BSD 2-Clause License. - */ - -'use strict'; - -var semver = require('semver'); -const { safeGetPackageVersion } = require('./_utils'); - -/** - * Return whether the current 'cassandra-driver' version is incompatible with the - * current version of node. If so, this returns a string that can be used - * as a reason for a test skip message. Otherwise it returns false. - * - * Usage: - * const isCassandraIncompat = require('.../_is_cassandra_incompat')() - * if (isCassandraIncompat) { - * console.log(`# SKIP ${isCassandraIncompat}`) - * process.exit() - * } - * - * Dev Note: These version ranges should mirror the cassandra section of ".tav.yml". - * - * @returns {string | boolean} - */ -function isCassandraIncompat() { - const nodeVer = process.version; - const cassandraVer = safeGetPackageVersion('cassandra-driver'); - const msg = `cassandra@${cassandraVer} is incompatible with node@${nodeVer}`; - - // In version 4.7.0 there was a change introduced that is only supported - // by nodejs v16.9.0 and above although the package.json defined - // support range to >=8 - // https://datastax-oss.atlassian.net/browse/NODEJS-665 - if ( - semver.satisfies(cassandraVer, '4.7.0') && - !semver.satisfies(nodeVer, '>=16.9') - ) { - return msg; - } - // Since 4.7.1 the driver requires node >=16 - if ( - semver.satisfies(cassandraVer, '>=4.7.1') && - !semver.satisfies(nodeVer, '>=16') - ) { - return msg; - } - // The default support until 4.7.0 release - if ( - semver.satisfies(cassandraVer, '>=3.0.0 <4.7.0') && - !semver.satisfies(nodeVer, '>=8') - ) { - return msg; - } - - return false; -} - -module.exports = isCassandraIncompat; diff --git a/test/_is_express_incompat.js b/test/_is_express_incompat.js new file mode 100644 index 0000000000..bf0bf0f9c3 --- /dev/null +++ b/test/_is_express_incompat.js @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +'use strict'; + +var semver = require('semver'); + +/** + * Return whether the current 'express' version is incompatible with the + * current version of node. If so, this returns a string that can be used + * as a reason for a test skip message. Otherwise it returns false. + * + * Usage: + * const isExpressIncompat = require('.../_is_express_incompat')() + * if (isExpressIncompat) { + * console.log(`# SKIP ${isExpressIncompat}`) + * process.exit() + * } + * + * Dev Note: These version ranges should mirror the express section of ".tav.yml". + * + * @returns {string | boolean} + */ +function isExpressIncompat() { + const nodeVer = process.version; + const expressVer = require('express/package.json').version; + const msg = `express@${expressVer} is incompatible with node@${nodeVer}`; + + if ( + semver.satisfies(expressVer, '>=5') && + semver.satisfies(nodeVer, '<18.0.0') + ) { + return msg; + } + + return false; +} + +module.exports = isExpressIncompat; diff --git a/test/_is_fastify_incompat.js b/test/_is_fastify_incompat.js index 3bf542482d..cc87b77f30 100644 --- a/test/_is_fastify_incompat.js +++ b/test/_is_fastify_incompat.js @@ -53,6 +53,13 @@ function isFastifyIncompat() { ) { return msg; } + // https://fastify.dev/docs/latest/Guides/Migration-Guide-V5/#long-term-support-cycle + if ( + semver.satisfies(fastifyVer, '5.x') && + !semver.satisfies(nodeVer, '>=20') + ) { + return msg; + } return false; } diff --git a/test/_is_undici_incompat.js b/test/_is_undici_incompat.js index 0584eb6491..0c556123c6 100644 --- a/test/_is_undici_incompat.js +++ b/test/_is_undici_incompat.js @@ -29,7 +29,13 @@ function isUndiciIncompat() { const undiciVer = require('undici/package.json').version; const msg = `undici@${undiciVer} is incompatible with node@${nodeVer}`; - if (satisfies(undiciVer, '>=6.13.0') && satisfies(nodeVer, '<18.17.0')) { + if (satisfies(undiciVer, '>=7.0.0') && satisfies(nodeVer, '<20.18.1')) { + // https://github.com/nodejs/undici/pull/3880 + return msg; + } else if ( + satisfies(undiciVer, '>=6.13.0') && + satisfies(nodeVer, '<18.17.0') + ) { // See discussion at https://github.com/nodejs/undici/issues/3123 return msg; } else if (satisfies(undiciVer, '>=6.0.0') && satisfies(nodeVer, '<18.0.0')) { diff --git a/test/_mock_express_app.js b/test/_mock_express_app.js new file mode 100644 index 0000000000..d57492c3a8 --- /dev/null +++ b/test/_mock_express_app.js @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +'use strict'; + +const http = require('http'); + +/** + * @param {Map} routes + * @param {http.IncomingMessage} req + * @returns {((req, res) => void ) | undefined} + */ +function getRouteHandler(routes, req) { + const url = new URL(req.url, 'http://localhost'); + const method = req.method.toUpperCase(); + let path = url.pathname; + let handler = routes.get(`${method} ${path}`); + + if (!handler) { + // Some routes are defined wihtout a final slash `/` + path = path.replace(/\/$/, ''); + handler = routes.get(`${method} ${path}`); + } + + // Express sets metadata about the hit route + if (handler) { + req.route = { path }; + } + return handler; +} + +/** + * @param {http.IncomingMessage} req + * @returns {any} + */ +function makeExpressReq(req) { + const url = new URL(req.url, 'http://localhost'); + req.header = (name) => req.headers[name.toLowerCase()]; + req.query = {}; + url.searchParams.forEach((val, key) => { + req.query[key] = val; + }); + return req; +} + +/** + * @param {http.ServerResponse} res + * @returns {any} + */ +function makeExpressRes(res) { + res.set = res.setHeader; + res.status = function (code) { + this.statusCode = code; + }; + res.send = function (data) { + const payload = typeof data === 'string' ? data : JSON.stringify(data); + + if (!this.statusCode) { + this.statusCode = 200; + } + if (!this.getHeader('content-type')) { + this.setHeader('content-type', 'application/json'); + } + this.setHeader('content-length', payload.length); + this.write(payload); + this.end(); + }; + return res; +} + +/** + * this function returns a HTTP server which replaces the previous usage of `express` + * for mocking cloud metadata responses. + */ +function createMockExpressApp() { + const routes = new Map(); + const server = http.createServer((req, res) => { + const handler = getRouteHandler(routes, req); + if (typeof handler === 'function') { + // make express like req & res + const expReq = makeExpressReq(req); + const expRes = makeExpressRes(res); + return handler(expReq, expRes); + } + + res.writeHead(404, 'Not found'); + res.end(); + }); + + // return express like app object + return { + _server: server, + get: (path, handler) => routes.set(`GET ${path}`, handler), + post: (path, handler) => routes.set(`POST ${path}`, handler), + put: (path, handler) => routes.set(`PUT ${path}`, handler), + listen: server.listen.bind(server), + }; +} + +module.exports = createMockExpressApp; diff --git a/test/agent.test.js b/test/agent.test.js index 8d9aaaf02f..f6ccc7df63 100644 --- a/test/agent.test.js +++ b/test/agent.test.js @@ -2127,11 +2127,12 @@ test('#active: false', function (t) { }); test('patches', function (t) { + // NOTE: we're using `generic-pool` package since it still supports Node.js v14 t.test('#clearPatches(name)', function (t) { const agent = new Agent().start(); - t.ok(agent._instrumentation._patcherReg.has('express')); - t.doesNotThrow(() => agent.clearPatches('express')); - t.notOk(agent._instrumentation._patcherReg.has('express')); + t.ok(agent._instrumentation._patcherReg.has('generic-pool')); + t.doesNotThrow(() => agent.clearPatches('generic-pool')); + t.notOk(agent._instrumentation._patcherReg.has('generic-pool')); t.doesNotThrow(() => agent.clearPatches('does-not-exists')); agent.destroy(); t.end(); @@ -2139,16 +2140,16 @@ test('patches', function (t) { t.test('#addPatch(name, moduleName)', function (t) { const agent = new Agent(); - agent.clearPatches('express'); + agent.clearPatches('generic-pool'); agent.start(agentOptsNoopTransport); - agent.addPatch('express', './test/_patch.js'); + agent.addPatch('generic-pool', './test/_patch.js'); - const before = require('express'); + const before = require('generic-pool'); const patch = require('./_patch'); - delete require.cache[require.resolve('express')]; - t.deepEqual(require('express'), patch(before)); + delete require.cache[require.resolve('generic-pool')]; + t.deepEqual(require('generic-pool'), patch(before)); agent.destroy(); t.end(); @@ -2156,14 +2157,14 @@ test('patches', function (t) { t.test('#addPatch(name, function) - does not exist', function (t) { const agent = new Agent(); - agent.clearPatches('express'); + agent.clearPatches('generic-pool'); agent.start(agentOptsNoopTransport); var replacement = { foo: 'bar', }; - agent.addPatch('express', (exports, agent, { version, enabled }) => { + agent.addPatch('generic-pool', (exports, agent, { version, enabled }) => { t.ok(exports); t.ok(agent); t.ok(version); @@ -2171,8 +2172,8 @@ test('patches', function (t) { return replacement; }); - delete require.cache[require.resolve('express')]; - t.deepEqual(require('express'), replacement); + delete require.cache[require.resolve('generic-pool')]; + t.deepEqual(require('generic-pool'), replacement); agent.destroy(); t.end(); diff --git a/test/apm-client/http-apm-client/config.test.js b/test/apm-client/http-apm-client/config.test.js index 04898c2e3e..dbe35f49bb 100644 --- a/test/apm-client/http-apm-client/config.test.js +++ b/test/apm-client/http-apm-client/config.test.js @@ -235,7 +235,10 @@ test('reject unauthorized TLS by default', function (t) { client.on('request-error', function (err) { t.ok(err instanceof Error); let expectedErrorMessage = 'self signed certificate'; - if (semver.gte(process.version, 'v17.0.0')) { + if (semver.gte(process.version, 'v23.11.0')) { + expectedErrorMessage = + 'self-signed certificate; if the root CA is installed locally, try running Node.js with --use-system-ca'; + } else if (semver.gte(process.version, 'v17.0.0')) { expectedErrorMessage = 'self-signed certificate'; } t.equal(err.message, expectedErrorMessage); diff --git a/test/apm-client/http-apm-client/container-info.test.js b/test/apm-client/http-apm-client/container-info.test.js index 9b6ca70838..ea2c2a8505 100644 --- a/test/apm-client/http-apm-client/container-info.test.js +++ b/test/apm-client/http-apm-client/container-info.test.js @@ -265,6 +265,48 @@ tape.test('basics', (t) => { }, ); + // https://github.com/elastic/apm/issues/888 Fewer than ten digits observed + // for the suffix in ECS Fargate in the wild. + t.deepEqual( + parse( + '1:name=systemd:/ecs/46686c7c701cdfdf2549f88f7b9575e9/46686c7c701cdfdf2549f88f7b9575e9-123456789', + // ^^^^^^^^^ + ), + { + entries: [ + { + id: '1', + groups: 'name=systemd', + path: '/ecs/46686c7c701cdfdf2549f88f7b9575e9/46686c7c701cdfdf2549f88f7b9575e9-123456789', + controllers: ['name=systemd'], + taskId: '46686c7c701cdfdf2549f88f7b9575e9', + }, + ], + containerId: + '34dc0b5e626f2c5c4c5170e34b10e7654ce36f0fcd532739f4445baabea03376', + taskId: '46686c7c701cdfdf2549f88f7b9575e9', + }, + ); + t.deepEqual( + parse( + '1:name=systemd:/ecs/46686c7c701cdfdf2549f88f7b9575e9/46686c7c701cdfdf2549f88f7b9575e9-1', + ), + { + entries: [ + { + id: '1', + groups: 'name=systemd', + path: '/ecs/46686c7c701cdfdf2549f88f7b9575e9/46686c7c701cdfdf2549f88f7b9575e9-1', + controllers: ['name=systemd'], + taskId: '46686c7c701cdfdf2549f88f7b9575e9', + }, + ], + containerId: + '34dc0b5e626f2c5c4c5170e34b10e7654ce36f0fcd532739f4445baabea03376', + taskId: '46686c7c701cdfdf2549f88f7b9575e9', + }, + ); + t.deepEqual( parse(` 12:devices:/user.slice diff --git a/test/apm-client/http-apm-client/lib/utils.js b/test/apm-client/http-apm-client/lib/utils.js index 6877c94e14..53ca3648c9 100644 --- a/test/apm-client/http-apm-client/lib/utils.js +++ b/test/apm-client/http-apm-client/lib/utils.js @@ -6,9 +6,11 @@ 'use strict'; +const fs = require('fs'); const http = require('http'); const https = require('https'); const os = require('os'); +const path = require('path'); const { URL } = require('url'); const zlib = require('zlib'); const semver = require('semver'); @@ -23,6 +25,13 @@ exports.assertMetadata = assertMetadata; exports.assertEvent = assertEvent; exports.validOpts = validOpts; +const tlsCert = fs.readFileSync( + path.resolve(__dirname, '../../../fixtures/certs/cert.pem'), +); +const tlsKey = fs.readFileSync( + path.resolve(__dirname, '../../../fixtures/certs/key.pem'), +); + function APMServer(opts, onreq) { if (typeof opts === 'function') return APMServer(null, opts); opts = opts || {}; @@ -235,45 +244,3 @@ function validOpts(opts) { opts, ); } - -// tlsCert and tlsKey were generated via the same method as Go's builtin -// test certificate/key pair, using -// https://github.com/golang/go/blob/master/src/crypto/tls/generate_cert.go: -// -// go run generate_cert.go --rsa-bits 1024 --host 127.0.0.1,::1,localhost \ -// --ca --start-date "Jan 1 00:00:00 1970" \ -// --duration=1000000h -// -// The certificate is valid for 127.0.0.1, ::1, and localhost; and expires in the year 2084. - -const tlsCert = `-----BEGIN CERTIFICATE----- -MIICETCCAXqgAwIBAgIQQalo5z3llnTiwERMPZQxujANBgkqhkiG9w0BAQsFADAS -MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw -MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQDrW9Z8jSgTMeN9Dt36HBj/kbU/aeFp10GshKm8IKWBpyyWKrTSjiYJIpTK -l/6sdC77UCDokYAk66T+IXIvvRvqOtD1HUt+KLlqZ7acunTp1Qq4PnASHBm9fdKs -F1c8gWlEXOMzCsC5BmokcijW7z8JTKszAVi2vpq5MHbtYxZXKQIDAQABo2YwZDAO -BgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUw -AwEB/zAsBgNVHREEJTAjgglsb2NhbGhvc3SHBH8AAAGHEAAAAAAAAAAAAAAAAAAA -AAEwDQYJKoZIhvcNAQELBQADgYEA4yzI/6gjkACdvrnlFm/MJlDQztPYYEAtQ6Sp -0q0PMQcynLfhH94KMjxJb31HNPJYXr7UrE6gwL2sUnfioXUTQTk35okpphR8MGu2 -hZ704px4wdeK/9B5Vh96oMZLYhm9SXizRVAZz7bPFYNMrhyk9lrWZXOaX526w4wI -Y5LTiUQ= ------END CERTIFICATE-----`; - -const tlsKey = `-----BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOtb1nyNKBMx430O -3focGP+RtT9p4WnXQayEqbwgpYGnLJYqtNKOJgkilMqX/qx0LvtQIOiRgCTrpP4h -ci+9G+o60PUdS34ouWpntpy6dOnVCrg+cBIcGb190qwXVzyBaURc4zMKwLkGaiRy -KNbvPwlMqzMBWLa+mrkwdu1jFlcpAgMBAAECgYEAtZc9LQooIm86izHeWOw26XD9 -u/iwf94igL42y70QlbFreE1pCI++jwvMa2fMijh2S1bunSIuEc5yldUuaeDp2FtJ -k7U9orbJspnWy6ixk1KgpjffdHP73r4S3a5G81G8sq9Uvwl0vxF90eTvg9C7kUfk -J1YMy4zcpLtwkCHEkNUCQQDx79t6Dqswi8vDoS0+MCIJNCO4J49ZchL8aXE8n9GT -mF+eOsKy6e5qYH0oYPpeXchwf1tWhX1gBCb3fXrtOoPTAkEA+QoX9S1XofY8YS1M -iNVVSkLjpKgVoTQVe4j+vj16NHouVQ+oOvEUca2LTrHRx+utdar1NSexl51NO0Lj -3sqnkwJAPNWCC3Pqyb8tEljRxoRV2piYrrKL0gLkEUH2LjdFfGZhDKlb0Z8OywLO -Fbwk2FuejeMINX5FY0JIBg0wPrxq7wJAMoot2n/dLO0/y6jZw1sn9+4jLKM/4Hsl -cPCYYhsv1b6F8JVA2tVaBMfnYY0MubnGdf6/zI3FqLMvnTsx62DNKQJBAMYUaw/D -plXTexeEU/c0BRxQdOkGmDqOQtnuRQUCQq6gu+occTeilgFoKHWT3QcZHIpHxawJ -N2K67EWPRgr3suE= ------END PRIVATE KEY-----`; diff --git a/test/cloud-metadata/_lib.js b/test/cloud-metadata/_lib.js index bb0c73e256..a61d9caad3 100644 --- a/test/cloud-metadata/_lib.js +++ b/test/cloud-metadata/_lib.js @@ -5,7 +5,7 @@ */ 'use strict'; -const express = require('express'); +const http = require('http'); const fixtures = require('./_fixtures'); // how many seconds to wait for a "slow" server @@ -211,7 +211,7 @@ function createTestServer(provider, fixtureName) { if (!fixture) { throw new Error(`Unknown ${provider} fixture named ${fixtureName}`); } - const app = express(); + const app = createApp(); return addRoutesToExpressApp(app, provider, fixture); } @@ -229,7 +229,7 @@ function createSlowTestServer(provider, fixtureName) { if (!fixture) { throw new Error(`Unknown ${provider} fixture named ${fixtureName}`); } - const app = express(); + const app = createApp(); return addSlowRoutesToExpressApp(app, provider, fixture); } @@ -243,6 +243,60 @@ function loadFixtureData(provider, fixtureName) { return fixture; } +/** + * This function returns a HTTP server similar enough to Express for these tests, + * but avoids using Express because v5 only works with node >=18. + */ +function createApp() { + const routes = new Map(); + const server = http.createServer((req, res) => { + const url = new URL(req.url, 'http://localhost'); + const path = url.pathname.replace(/\/$/, ''); + const route = `${req.method.toUpperCase()} ${path}`; + const handler = routes.get(route); + + if (typeof handler === 'function') { + // make express like req & res + const expReq = { + headers: req.headers, + header: (name) => req.headers[name.toLowerCase()], + query: {}, + }; + url.searchParams.forEach((val, key) => { + expReq.query[key] = val; + }); + + const expRes = { + status: (num) => (res.statusCode = num), + set: (key, val) => res.setHeader(key, val), + send: (data) => { + const payload = + typeof data === 'string' ? data : JSON.stringify(data); + res.writeHead(200, { + 'content-type': 'application/json', + 'content-length': payload.length, + }); + res.write(payload); + res.end(); + }, + }; + + return handler(expReq, expRes); + } + + res.writeHead(404, 'Not found'); + res.end(); + }); + + // return express like app object + return { + get: (path, handler) => routes.set(`GET ${path}`, handler), + post: (path, handler) => routes.set(`POST ${path}`, handler), + put: (path, handler) => routes.set(`PUT ${path}`, handler), + listen: (port, cb) => server.listen(port, cb), + }; +} + module.exports = { createTestServer, createSlowTestServer, diff --git a/test/cloud-metadata/test-server.test.js b/test/cloud-metadata/test-server.test.js index 279813cfd4..dd2859b5e8 100644 --- a/test/cloud-metadata/test-server.test.js +++ b/test/cloud-metadata/test-server.test.js @@ -5,9 +5,9 @@ */ 'use strict'; +const http = require('http'); const { createTestServer } = require('./_lib'); const tape = require('tape'); -const request = require('request'); tape.test('test the test server: valid', function (t) { const serverAws = createTestServer('aws', 'default aws fixture'); @@ -32,14 +32,17 @@ tape.test('basic metadata request: aws', function (t) { const url = `http://127.0.0.1:${ listener.address().port }/latest/dynamic/instance-identity/document`; - request(url, function (error, response, rawBody) { - if (error) { - throw error; - } - const body = JSON.parse(rawBody); - t.ok(body.version, 'version set'); - listener.close(); - t.end(); + http.get(url, (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = JSON.parse(Buffer.concat(chunks)); + t.ok(body.version, 'version set'); + listener.close(); + t.end(); + }); }); }); }); @@ -47,92 +50,112 @@ tape.test('basic metadata request: aws', function (t) { tape.test('basic metadata request: gcp', function (t) { const serverGcp = createTestServer('gcp', 'default gcp fixture'); const listener = serverGcp.listen(0, function () { - const url = `http://127.0.0.1:${ - listener.address().port - }/computeMetadata/v1/?recursive=true`; - const options = { - url, - headers: { - 'Metadata-Flavor': 'Google', + http.get( + { + hostname: '127.0.0.1', + port: listener.address().port, + path: '/computeMetadata/v1/?recursive=true', + headers: { + 'Metadata-Flavor': 'Google', + }, }, - }; - request(options, function (error, response, rawBody) { - if (error) { - throw error; - } - const body = JSON.parse(rawBody); - t.ok(body.instance.id, 'id set'); - listener.close(); - t.end(); - }); + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = JSON.parse(Buffer.concat(chunks)); + t.ok(body.instance.id, 'id set'); + listener.close(); + t.end(); + }); + }, + ); }); }); tape.test('basic metadata request: azure', function (t) { const serverAzure = createTestServer('azure', 'default azure fixture'); const listener = serverAzure.listen(0, function () { - const url = `http://127.0.0.1:${ - listener.address().port - }/metadata/instance?api-version=2020-09-01`; - const options = { - url, - headers: { - Metadata: 'true', + http.get( + { + hostname: '127.0.0.1', + port: listener.address().port, + path: '/metadata/instance?api-version=2020-09-01', + headers: { + Metadata: 'true', + }, }, - }; - request(options, function (error, response, rawBody) { - if (error) { - throw error; - } - const body = JSON.parse(rawBody); - t.ok(body.compute.vmId, 'vmId set'); - listener.close(); - t.end(); - }); + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = JSON.parse(Buffer.concat(chunks)); + t.ok(body.compute.vmId, 'vmId set'); + listener.close(); + t.end(); + }); + }, + ); }); }); tape.test('IMDSv2 token fetching: aws', function (t) { const serverAws = createTestServer('aws-IMDSv2', 'default aws fixture'); const listener = serverAws.listen(0, function () { - const urlToken = `http://127.0.0.1:${ - listener.address().port - }/latest/api/token`; - const optionsToken = { - url: urlToken, - headers: { - 'X-aws-ec2-metadata-token-ttl-seconds': '300', + // First request to get API token. + const req = http.request( + { + method: 'PUT', + hostname: '127.0.0.1', + port: listener.address().port, + path: '/latest/api/token', + headers: { + 'X-aws-ec2-metadata-token-ttl-seconds': '300', + }, }, - }; - request.put( - optionsToken, - function (errorToken, responseToken, rawBodyToken) { - // token request succeded, now make real request - t.equals( - rawBodyToken, - 'AQAAAOaONNcThIsIsAfAkEtOkEn_b94UPLuLYRThIsIsAfAkEtOkEn==', - 'returns correct fake token', - ); - const url = `http://127.0.0.1:${ - listener.address().port - }/latest/dynamic/instance-identity/document`; - const options = { - url, - headers: { - 'X-aws-ec2-metadata-token': rawBodyToken, - }, - }; - request(options, function (error, response, rawBody) { - if (error) { - throw error; - } + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const rawBodyToken = Buffer.concat(chunks).toString('utf8'); + t.equals( + rawBodyToken, + 'AQAAAOaONNcThIsIsAfAkEtOkEn_b94UPLuLYRThIsIsAfAkEtOkEn==', + 'returns correct fake token', + ); - const body = JSON.parse(rawBody); - t.ok(body.version, 'version set'); - listener.close(); - t.end(); + // Second request to get metadata, using that token. + http.get( + { + hostname: '127.0.0.1', + port: listener.address().port, + path: '/latest/dynamic/instance-identity/document', + headers: { + 'X-aws-ec2-metadata-token': rawBodyToken, + }, + }, + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = JSON.parse(Buffer.concat(chunks)); + t.ok(body.version, 'version set'); + listener.close(); + t.end(); + }); + }, + ); }); }, ); + req.end(); }); }); diff --git a/test/config.test.js b/test/config.test.js index 9eef1d4c96..c412847866 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -297,19 +297,19 @@ test('custom transport', function (t) { }); test('addPatch', function (t) { - const before = require('express'); + const before = require('generic-pool'); const patch = require('./_patch'); - delete require.cache[require.resolve('express')]; + delete require.cache[require.resolve('generic-pool')]; const agent = new Agent(); agent.start( Object.assign({}, agentOptsNoopTransport, { - addPatch: 'express=./test/_patch.js', + addPatch: 'generic-pool=./test/_patch.js', }), ); - t.deepEqual(require('express'), patch(before)); + t.deepEqual(require('generic-pool'), patch(before)); agent.destroy(); t.end(); diff --git a/test/docker-compose.yml b/test/docker-compose.yml index a87e4435c3..b3c412c8d8 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -1,5 +1,3 @@ -version: '2.1' - services: postgres: user: postgres @@ -31,24 +29,28 @@ services: retries: 30 mssql: - image: mcr.microsoft.com/mssql/server + # Tags listed at https://hub.docker.com/r/microsoft/mssql-server + # Docs: https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker + image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 platform: linux/amd64 environment: - ACCEPT_EULA=Y - - SA_PASSWORD=Very(!)Secure + - MSSQL_SA_PASSWORD=Very(!)Secure - MSSQL_PID=Developer ports: - "1433:1433" volumes: - nodemssqldata:/var/opt/mssql healthcheck: - test: ["CMD", "/opt/mssql-tools/bin/sqlcmd", "-S", "mssql", "-U", "sa", "-P", "Very(!)Secure", "-Q", "select 1"] - interval: 30s + test: ["CMD", "/opt/mssql-tools18/bin/sqlcmd", "-C", "-S", "mssql", "-U", "sa", "-P", "Very(!)Secure", "-Q", "select 1"] + interval: 1s timeout: 10s - retries: 5 + retries: 30 mysql: image: mysql:5.7 + # No ARM64 image layer. See https://stackoverflow.com/a/65592942 + platform: linux/x86_64 environment: MYSQL_ALLOW_EMPTY_PASSWORD: 1 ports: @@ -72,7 +74,7 @@ services: retries: 30 elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1 + image: docker.elastic.co/elasticsearch/elasticsearch:9.0.0 environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - "network.host=_site_" @@ -81,13 +83,11 @@ services: - "xpack.security.enabled=false" ports: - "9200:9200" - volumes: - - nodeesdata:/usr/share/elasticsearch/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9200"] - interval: 30s + interval: 1s timeout: 10s - retries: 5 + retries: 30 cassandra: # Avoid the latest cassandra:3 until @@ -103,9 +103,9 @@ services: - nodecassandradata:/var/lib/cassandra healthcheck: test: ["CMD-SHELL", "[ $$(nodetool statusgossip) = running ]"] - interval: 30s + interval: 1s timeout: 10s - retries: 5 + retries: 30 memcached: image: memcached:alpine @@ -114,9 +114,9 @@ services: - "11211:11211" healthcheck: test: ["CMD", "nc", "127.0.0.1:11211", "-z"] - interval: 30s + interval: 1s timeout: 10s - retries: 5 + retries: 30 localstack: # https://hub.docker.com/r/localstack/localstack/tags @@ -127,9 +127,9 @@ services: - "4566:4566" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4566/_localstack/health"] - interval: 30s + interval: 1s timeout: 10s - retries: 5 + retries: 30 volumes: - nodelocalstackdata:/var/lib/localstack @@ -146,9 +146,9 @@ services: # Using 'srvr' instead of the more common 'ruok' because this bitnami # image does not have 'ruok' on the '4lw.commands.whitelist' in zoo.cfg. test: ["CMD-SHELL", "echo srvr | nc -w 2 localhost 2181"] - interval: 5s - timeout: 5s - retries: 5 + interval: 1s + timeout: 10s + retries: 30 kafka: # https://hub.docker.com/r/bitnami/kafka/tags @@ -172,9 +172,9 @@ services: healthcheck: # Kafka healthcheck ideas from https://github.com/wurstmeister/kafka-docker/issues/167 test: kafka-cluster.sh cluster-id --bootstrap-server localhost:9092 || exit 1 - interval: 30s + interval: 1s timeout: 10s - retries: 5 + retries: 30 volumes: nodepgdata: @@ -185,8 +185,6 @@ volumes: driver: local nodemysqldata: driver: local - nodeesdata: - driver: local nodecassandradata: driver: local nodelocalstackdata: diff --git a/test/fixtures/certs/.gitignore b/test/fixtures/certs/.gitignore new file mode 100644 index 0000000000..2536019b02 --- /dev/null +++ b/test/fixtures/certs/.gitignore @@ -0,0 +1 @@ +/generate_cert.go diff --git a/test/fixtures/certs/README.md b/test/fixtures/certs/README.md new file mode 100644 index 0000000000..c4fb658524 --- /dev/null +++ b/test/fixtures/certs/README.md @@ -0,0 +1,6 @@ +This dir holds a self-signed TLS certificate (and key) to be used from some +HTTPS tests. + +They were generated via the same method as Go's builtin test certificate/key +pair, using https://github.com/golang/go/blob/master/src/crypto/tls/generate_cert.go. +Use "./regenerate.sh" to regenerate the TLS cert if necessary. diff --git a/test/fixtures/certs/cert.pem b/test/fixtures/certs/cert.pem new file mode 100644 index 0000000000..73779c7371 --- /dev/null +++ b/test/fixtures/certs/cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDNzCCAh+gAwIBAgIQGUMr0aqX8M8e3S/On3YzNzANBgkqhkiG9w0BAQsFADAS +MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw +MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAwamgs6WRC9RFVur2ejltBOtA71+qPXl1rWRx7tMMYzzUXl4YLdGj +tHxAv2XK1IzEH1WsdB1fkOosWoEMlExBMje5i3w2fZmrfdwHjTB7HRhfA8jtRDvC +zswHqeuMsierSYgs/HD4ZGe0ep3wCa2cEsNZpwG0UERLFIv/mCe9Sz61CmduFEBT +0YPxQKRLP3LN9pnD9afliP+yGZx8OvOQhqAD7mKIyoZWUPtZJi7rHHJ3dEXgnZKc +XvSzhgUV8dtW4ER0UuQ3y08L2cntzQRQDNC0R/oyiCm9o224YARu35VSuKGb2YCY +2ZlxuziWKtvF1I1JKpx83JqrNSGXWYom3QIDAQABo4GGMIGDMA4GA1UdDwEB/wQE +AwICpDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSEutVWCaITNGTjJ97epH9sul9q0jAsBgNVHREEJTAjgglsb2NhbGhvc3SH +BH8AAAGHEAAAAAAAAAAAAAAAAAAAAAEwDQYJKoZIhvcNAQELBQADggEBAGUa4teT +78ux/5skaLeB5J7PUzT5e+9eCKtIhZBW+7ZZMueMdTsP1CGpvc758+LWgiPkEeX+ +RbC1F8s5UZhqA5Jj0lnTCRglrc7L0irgCWMYm9UTjgaeB/4u3yH0fJtz+Z7CP7ZM +A4rFmqRuiGxdiLAa6iqtiKvL6bsyvU4OVr+qaBU24vQnMxK/Usjsi/t26aDPkpmE +qi4owSRiWTKwf1W3RJmrdJNXHAhybcy8HHLL50uIntEu1B6LBjZDL1B3vRWyNVN6 +4w+cpFPmC6gGfqq8Xm2QLhVUUHljkrCUY1sgSItivS2qBHeDEURnwWxkii3SBnRj +/g6fc37lUT9FNeM= +-----END CERTIFICATE----- diff --git a/test/fixtures/certs/key.pem b/test/fixtures/certs/key.pem new file mode 100644 index 0000000000..63cf97b9c9 --- /dev/null +++ b/test/fixtures/certs/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBqaCzpZEL1EVW +6vZ6OW0E60DvX6o9eXWtZHHu0wxjPNReXhgt0aO0fEC/ZcrUjMQfVax0HV+Q6ixa +gQyUTEEyN7mLfDZ9mat93AeNMHsdGF8DyO1EO8LOzAep64yyJ6tJiCz8cPhkZ7R6 +nfAJrZwSw1mnAbRQREsUi/+YJ71LPrUKZ24UQFPRg/FApEs/cs32mcP1p+WI/7IZ +nHw685CGoAPuYojKhlZQ+1kmLusccnd0ReCdkpxe9LOGBRXx21bgRHRS5DfLTwvZ +ye3NBFAM0LRH+jKIKb2jbbhgBG7flVK4oZvZgJjZmXG7OJYq28XUjUkqnHzcmqs1 +IZdZiibdAgMBAAECggEBAItnFiWarZENSKhrU+bhRWeADGsCuuGrd5jLr/OQ+d7J +X7laFB+PQz7dHiJoHJvphBdmLVAcALmoxyqSsEJjrZ5/XFFapUK+BiL/6nOojUaB +T4vC63/tYKpJVc7rnohzY6n3myJQE4z61YBaBfqBfNJIylUcNfZ9Ymo06FRXbrwk +88vQyL2ROqJKB3QlGtF3vCWWForqMfpsxph1EeUUYla2Se54FN+83X9xGa0QIGTt +1+z9vU7zfBWNnJS6oYYevSy3DST4CdQe9yXmCyds7KyZdL5K7BLtscK4p08L/ZIB +4AFOBk0boQvhyYP64RIrmuW3q/jPXnfkA3klYpFdVwUCgYEA3F1Nk+f394e3Y/Oy +vYrNeoWfxI7vhmB2OyDeq2jhWUnG+GLsD7UZ5wcurpp8/u5eP9Bv9NkoVG/bhuP4 +8AK0FS4eT8pRMxQecpnpQU1+PjDbDypTKnjfn2ktrVRb1HNf4LENC5jlE4oPfr95 +OWdRBgGZQs1PMjphXNjubDrf/McCgYEA4PrqUrIoORrUA9JyIbUsszgX99TEiIcD +9ZbdF710N8vNiCKuMQT17sYXsv53/xz07aeSKauRX8Gt5+zIDyj7tN+CPQSp1qBn +lyJGQ9Ur3kQCLxrX4pyOXV6GVtXJfvVrAuh4LdcXz5IsS3AzRNZx0bKQbTqBM279 +GfRfml828zsCgYB7ZfgaOgy+XQ5R91aBE2gLEyarcAsrKXsrkzV9sQZ39Htp/iMI +jLZLi9cVSUdzjlHS1ErNRolx9w1sVN7CsBDdx2yL69RakQqXzB41RkrKUptou5/E +qdk3sDM224Vsy4rGDP8sHlsw/N++b0RX48YYYe7L3KJbkxuQXZ3tl250YwKBgQDW +fiJ9KSG0H+HWqwLpJCQz0dz4CUA+sgqSUH0FrzhoIcQYcIgGcCZQuUfK/VVGQkM5 +eTOeytXUp4C3x0WNPpOLhDRVHGcYGuHoc2LuNQSX6drzMfJ1OLF6Ty5hB34NrsmR +gjVh7tniqgfU/GnEzXbCaC3OFaMseDqSTiv/r5tiFQKBgDTYsqWHpBTXMvPebB+L +ZMqqX/s9ngFaFsiZj6x6783hGA7DeGc7/8bkynP3FtcXbA42JP20tLR+DtdKdJ1g +7jcSHkoC6ufGHkuq4pYD8Egys65Fggmh3xIgOzY8i+9X11ko1fXvVLFhVCNqC1a3 +VtnqKIRCPO1khrzCjPNwawpn +-----END PRIVATE KEY----- diff --git a/test/fixtures/certs/regenerate-cert.sh b/test/fixtures/certs/regenerate-cert.sh new file mode 100644 index 0000000000..a46fa22c56 --- /dev/null +++ b/test/fixtures/certs/regenerate-cert.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh +# +# Regenerate the certificate files that are used for tests using TLS. +# The certificate is valid for 127.0.0.1, ::1, and localhost; and expires in the year 2084. + +curl -O https://raw.githubusercontent.com/golang/go/refs/heads/master/src/crypto/tls/generate_cert.go +go run generate_cert.go --rsa-bits 2048 --host 127.0.0.1,::1,localhost \ + --ca --start-date "Jan 1 00:00:00 1970" \ + --duration=1000000h diff --git a/test/instrumentation/azure-functions/azfunctestutils.js b/test/instrumentation/azure-functions/azfunctestutils.js new file mode 100644 index 0000000000..910cf2c7a6 --- /dev/null +++ b/test/instrumentation/azure-functions/azfunctestutils.js @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +'use strict'; + +const http = require('http'); + +/** + * Wait for the test "func start" to be ready. + * + * This polls the admin endpoint until + * it gets a 200 response, assuming the server is ready by then. + * It times out after ~60s -- so long because startup on Windows CI has been + * found to take a long time (it is downloading 250MB+ in "ExtensionBundle"s). + * + * @param {Test} t - This is only used to `t.comment(...)` with progress. + * @param {Function} cb - Calls `cb(err)` if there was a timeout, `cb()` on + * success. + */ +function waitForServerReady(t, cb) { + let sentinel = 30; + const INTERVAL_MS = 2000; + + const pollForServerReady = () => { + const req = http.get( + 'http://127.0.0.1:7071/admin/functions', + { + agent: false, + timeout: 500, + }, + (res) => { + res.resume(); + res.on('end', () => { + if (res.statusCode !== 200) { + scheduleNextPoll(`statusCode=${res.statusCode}`); + } else { + cb(); + } + }); + }, + ); + req.on('error', (err) => { + scheduleNextPoll(err.message); + }); + }; + + const scheduleNextPoll = (msg) => { + t.comment( + `[sentinel=${sentinel} ${new Date().toISOString()}] wait another 2s for server ready: ${msg}`, + ); + sentinel--; + if (sentinel <= 0) { + cb(new Error('timed out')); + } else { + setTimeout(pollForServerReady, INTERVAL_MS); + } + }; + + pollForServerReady(); +} + +async function makeTestRequest(t, testReq) { + return new Promise((resolve, reject) => { + const reqOpts = testReq.reqOpts; + const url = `http://127.0.0.1:7071${reqOpts.path}`; + t.comment( + `makeTestRequest: "${testReq.testName}" (${reqOpts.method} ${url})`, + ); + const req = http.request( + url, + { + method: reqOpts.method, + }, + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = Buffer.concat(chunks); + if (testReq.expectedRes.statusCode) { + t.equal( + res.statusCode, + testReq.expectedRes.statusCode, + `res.statusCode === ${testReq.expectedRes.statusCode}`, + ); + } + if (testReq.expectedRes.headers) { + for (const [k, v] of Object.entries(testReq.expectedRes.headers)) { + if (v instanceof RegExp) { + t.ok( + v.test(res.headers[k]), + `res.headers[${JSON.stringify(k)}] =~ ${v}`, + ); + } else { + t.equal( + res.headers[k], + v, + `res.headers[${JSON.stringify(k)}] === ${JSON.stringify(v)}`, + ); + } + } + } + if (testReq.expectedRes.body) { + if (testReq.expectedRes.body instanceof RegExp) { + t.ok( + testReq.expectedRes.body.test(body), + `body =~ ${testReq.expectedRes.body}`, + ); + } else if (typeof testReq.expectedRes.body === 'string') { + t.equal(body.toString(), testReq.expectedRes.body, 'body'); + } else { + t.fail( + `unsupported type for TEST_REQUESTS[].expectedRes.body: ${typeof testReq + .expectedRes.body}`, + ); + } + } + resolve(); + }); + }, + ); + req.on('error', reject); + req.end(); + }); +} + +function getEventField(e, fieldName) { + return (e.transaction || e.error || e.span)[fieldName]; +} + +module.exports = { + getEventField, + makeTestRequest, + waitForServerReady, +}; diff --git a/test/instrumentation/azure-functions/azure-functions.test.js b/test/instrumentation/azure-functions/azure-functions-v3.test.js similarity index 78% rename from test/instrumentation/azure-functions/azure-functions.test.js rename to test/instrumentation/azure-functions/azure-functions-v3.test.js index 758435bc2d..9c368cade9 100644 --- a/test/instrumentation/azure-functions/azure-functions.test.js +++ b/test/instrumentation/azure-functions/azure-functions-v3.test.js @@ -6,10 +6,11 @@ 'use strict'; +// Test Azure Functions programming model v3. + const assert = require('assert'); const { exec, spawn } = require('child_process'); const fs = require('fs'); -const http = require('http'); const os = require('os'); const path = require('path'); @@ -19,13 +20,20 @@ const treekill = require('tree-kill'); const { MockAPMServer } = require('../../_mock_apm_server'); const { formatForTComment } = require('../../_utils'); - -if (!semver.satisfies(process.version, '>=14.1.0 <19')) { - // The "14.1.0" version is selected to skip testing on Node.js v14.0.0 - // because of the issue described here: - // https://github.com/elastic/apm-agent-nodejs/issues/3279#issuecomment-1532084620 +const { + getEventField, + makeTestRequest, + waitForServerReady, +} = require('./azfunctestutils'); + +// Azure Functions programming model v3 supports node 14.x-20.x: +// https://learn.microsoft.com/en-ca/azure/azure-functions/functions-reference-node?tabs=javascript%2Cwindows%2Cazure-cli&pivots=nodejs-model-v4#supported-versions +// However, let's only test with node 18.x for now. The testing involves +// installing the ridiculously large "azure-functions-core-tools" dep, so it +// isn't worth testing all versions. +if (!semver.satisfies(process.version, '^18.0.1')) { console.log( - `# SKIP Azure Functions runtime ~4 does not support node ${process.version} (https://aka.ms/functions-node-versions)`, + '# SKIP Azure Functions v3 tests, only testing with Node.js v18.latest', ); process.exit(); } else if (os.platform() === 'win32') { @@ -35,130 +43,6 @@ if (!semver.satisfies(process.version, '>=14.1.0 <19')) { process.exit(); } -/** - * Wait for the test "func start" to be ready. - * - * This polls the admin endpoint until - * it gets a 200 response, assuming the server is ready by then. - * It times out after ~60s -- so long because startup on Windows CI has been - * found to take a long time (it is downloading 250MB+ in "ExtensionBundle"s). - * - * @param {Test} t - This is only used to `t.comment(...)` with progress. - * @param {Function} cb - Calls `cb(err)` if there was a timeout, `cb()` on - * success. - */ -function waitForServerReady(t, cb) { - let sentinel = 30; - const INTERVAL_MS = 2000; - - const pollForServerReady = () => { - const req = http.get( - 'http://127.0.0.1:7071/admin/functions', - { - agent: false, - timeout: 500, - }, - (res) => { - res.resume(); - res.on('end', () => { - if (res.statusCode !== 200) { - scheduleNextPoll(`statusCode=${res.statusCode}`); - } else { - cb(); - } - }); - }, - ); - req.on('error', (err) => { - scheduleNextPoll(err.message); - }); - }; - - const scheduleNextPoll = (msg) => { - t.comment( - `[sentinel=${sentinel} ${new Date().toISOString()}] wait another 2s for server ready: ${msg}`, - ); - sentinel--; - if (sentinel <= 0) { - cb(new Error('timed out')); - } else { - setTimeout(pollForServerReady, INTERVAL_MS); - } - }; - - pollForServerReady(); -} - -async function makeTestRequest(t, testReq) { - return new Promise((resolve, reject) => { - const reqOpts = testReq.reqOpts; - const url = `http://127.0.0.1:7071${reqOpts.path}`; - t.comment( - `makeTestRequest: "${testReq.testName}" (${reqOpts.method} ${url})`, - ); - const req = http.request( - url, - { - method: reqOpts.method, - }, - (res) => { - const chunks = []; - res.on('data', (chunk) => { - chunks.push(chunk); - }); - res.on('end', () => { - const body = Buffer.concat(chunks); - if (testReq.expectedRes.statusCode) { - t.equal( - res.statusCode, - testReq.expectedRes.statusCode, - `res.statusCode === ${testReq.expectedRes.statusCode}`, - ); - } - if (testReq.expectedRes.headers) { - for (const [k, v] of Object.entries(testReq.expectedRes.headers)) { - if (v instanceof RegExp) { - t.ok( - v.test(res.headers[k]), - `res.headers[${JSON.stringify(k)}] =~ ${v}`, - ); - } else { - t.equal( - res.headers[k], - v, - `res.headers[${JSON.stringify(k)}] === ${JSON.stringify(v)}`, - ); - } - } - } - if (testReq.expectedRes.body) { - if (testReq.expectedRes.body instanceof RegExp) { - t.ok( - testReq.expectedRes.body.test(body), - `body =~ ${testReq.expectedRes.body}`, - ); - } else if (typeof testReq.expectedRes.body === 'string') { - t.equal(body.toString(), testReq.expectedRes.body, 'body'); - } else { - t.fail( - `unsupported type for TEST_REQUESTS[].expectedRes.body: ${typeof testReq - .expectedRes.body}`, - ); - } - } - resolve(); - }); - }, - ); - req.on('error', reject); - req.end(); - }); -} - -function getEventField(e, fieldName) { - return (e.transaction || e.error || e.span)[fieldName]; -} - /** * Assert that the given `apmEvents` (events that the mock APM server received) * match all the expected APM events in `TEST_REQUESTS`. @@ -168,7 +52,7 @@ function checkExpectedApmEvents(t, apmEvents) { if (apmEvents.length > 0) { const metadata = apmEvents.shift().metadata; t.ok(metadata, 'metadata is first event'); - t.equal(metadata.service.name, 'AJsAzureFnApp', 'metadata.service.name'); + t.equal(metadata.service.name, 'azfunc3', 'metadata.service.name'); t.equal( metadata.service.framework.name, 'Azure Functions', @@ -196,7 +80,7 @@ function checkExpectedApmEvents(t, apmEvents) { ); t.equal( metadata.cloud.instance.name, - 'AJsAzureFnApp', + 'azfunc3', 'metadata.cloud.instance.name', ); t.equal( @@ -256,7 +140,7 @@ function checkExpectedApmEvents(t, apmEvents) { const UUID_RE = /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; -const fnAppDir = path.join(__dirname, 'fixtures', 'AJsAzureFnApp'); +const fnAppDir = path.join(__dirname, 'fixtures', 'azfunc3'); const funcExe = path.resolve(fnAppDir, 'node_modules/.bin/func') + (os.platform() === 'win32' ? '.cmd' : ''); @@ -277,14 +161,10 @@ var TEST_REQUESTS = [ t.equal(trans.type, 'request', 'transaction.type'); t.equal(trans.outcome, 'success', 'transaction.outcome'); t.equal(trans.result, 'HTTP 2xx', 'transaction.result'); - t.equal( - trans.faas.name, - 'AJsAzureFnApp/HttpFn1', - 'transaction.faas.name', - ); + t.equal(trans.faas.name, 'azfunc3/HttpFn1', 'transaction.faas.name'); t.equal( trans.faas.id, - '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/AJsAzureFnApp/functions/HttpFn1', + '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/azfunc3/functions/HttpFn1', 'transaction.faas.id', ); t.equal(trans.faas.trigger.type, 'http', 'transaction.faas.trigger.type'); @@ -332,11 +212,7 @@ var TEST_REQUESTS = [ t.equal(trans.name, 'GET /api/HttpFnError', 'transaction.name'); t.equal(trans.outcome, 'failure', 'transaction.outcome'); t.equal(trans.result, 'HTTP 5xx', 'transaction.result'); - t.equal( - trans.faas.name, - 'AJsAzureFnApp/HttpFnError', - 'transaction.faas.name', - ); + t.equal(trans.faas.name, 'azfunc3/HttpFnError', 'transaction.faas.name'); t.equal(trans.faas.coldstart, false, 'transaction.faas.coldstart'); t.equal( trans.context.request.method, @@ -538,14 +414,10 @@ var TEST_REQUESTS = [ const trans = apmEventsForReq[0].transaction; t.equal(trans.name, 'GET /api/HttpFn1', 'transaction.name'); t.equal(trans.result, 'HTTP 2xx', 'transaction.result'); - t.equal( - trans.faas.name, - 'AJsAzureFnApp/HttpFn1', - 'transaction.faas.name', - ); + t.equal(trans.faas.name, 'azfunc3/HttpFn1', 'transaction.faas.name'); t.equal( trans.faas.id, - '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/AJsAzureFnApp/functions/HttpFn1', + '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/azfunc3/functions/HttpFn1', 'transaction.faas.id', ); t.equal( @@ -574,12 +446,12 @@ var TEST_REQUESTS = [ t.equal(trans.result, 'HTTP 2xx', 'transaction.result'); t.equal( trans.faas.name, - 'AJsAzureFnApp/HttpFnRouteTemplate', + 'azfunc3/HttpFnRouteTemplate', 'transaction.faas.name', ); t.equal( trans.faas.id, - '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/AJsAzureFnApp/functions/HttpFnRouteTemplate', + '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/azfunc3/functions/HttpFnRouteTemplate', 'transaction.faas.id', ); t.equal( @@ -605,7 +477,7 @@ var TEST_REQUESTS = [ t.equal(apmEventsForReq.length, 4); const t1 = apmEventsForReq[0].transaction; t.equal(t1.name, 'GET /api/HttpFnDistTraceA', 't1.name'); - t.equal(t1.faas.name, 'AJsAzureFnApp/HttpFnDistTraceA', 't1.faas.name'); + t.equal(t1.faas.name, 'azfunc3/HttpFnDistTraceA', 't1.faas.name'); const s1 = apmEventsForReq[1].span; t.equal(s1.name, 'spanA', 's1.name'); t.equal(s1.parent_id, t1.id, 's1 is a child of t1'); @@ -615,7 +487,7 @@ var TEST_REQUESTS = [ t.equal(s2.parent_id, s1.id, 's2 is a child of s1'); const t2 = apmEventsForReq[3].transaction; t.equal(t2.name, 'GET /api/HttpFnDistTraceB', 't2.name'); - t.equal(t2.faas.name, 'AJsAzureFnApp/HttpFnDistTraceB', 't2.faas.name'); + t.equal(t2.faas.name, 'azfunc3/HttpFnDistTraceB', 't2.faas.name'); t.equal(t2.parent_id, s2.id, 't2 is a child of s2'); t.equal( t2.context.request.headers.traceparent, @@ -659,7 +531,7 @@ tape.test( }, ); -tape.test('azure functions', function (suite) { +tape.test('azure functions v3', function (suite) { let apmServer; let apmServerUrl; @@ -673,7 +545,7 @@ tape.test('azure functions', function (suite) { }); let fnAppProc; - suite.test('setup: "func start" for AJsAzureFnApp fixture', (t) => { + suite.test('setup: "func start" for azfunc3 fixture', (t) => { fnAppProc = spawn(funcExe, ['start'], { cwd: fnAppDir, env: Object.assign({}, process.env, { @@ -698,11 +570,11 @@ tape.test('azure functions', function (suite) { // binaries to "$fnAppDir/node_modules/azure-functions-core-tools/...", // which means a local test run on macOS followed by an attempted test run // in Docker will result in a crash: - // node_tests_1 | # ["func start" stderr] /app/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/node_modules/azure-functions-core-tools/bin/func: 1: Syntax error: "(" unexpected + // node_tests_1 | # ["func start" stderr] /app/test/instrumentation/azure-functions/fixtures/azfunc3/node_modules/azure-functions-core-tools/bin/func: 1: Syntax error: "(" unexpected // node_tests_1 | not ok 2 "func start" failed early: code=2 // For now the workaround is to manually clean that tree before running // tests on a separate OS: - // rm -rf test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/node_modules + // rm -rf test/instrumentation/azure-functions/fixtures/azfunc3/node_modules t.fail(`"func start" failed early: code=${code}`); fnAppProc = null; clearTimeout(earlyCloseTimer); diff --git a/test/instrumentation/azure-functions/azure-functions-v4.test.js b/test/instrumentation/azure-functions/azure-functions-v4.test.js new file mode 100644 index 0000000000..80977f2505 --- /dev/null +++ b/test/instrumentation/azure-functions/azure-functions-v4.test.js @@ -0,0 +1,341 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +'use strict'; + +// Test Azure Functions programming model v4. + +const assert = require('assert'); +const { exec, spawn } = require('child_process'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); + +const semver = require('semver'); +const tape = require('tape'); +const treekill = require('tree-kill'); + +const { MockAPMServer } = require('../../_mock_apm_server'); +const { formatForTComment } = require('../../_utils'); +const { + getEventField, + makeTestRequest, + waitForServerReady, +} = require('./azfunctestutils'); + +// Azure Functions programming model v4 supports node 18.x-20.x: +// https://learn.microsoft.com/en-ca/azure/azure-functions/functions-reference-node?tabs=javascript%2Cwindows%2Cazure-cli&pivots=nodejs-model-v4#supported-versions +// However, let's only test with node 20.x for now. The testing involves +// installing the ridiculously large "azure-functions-core-tools" dep, so it +// isn't worth testing all versions. +if (!semver.satisfies(process.version, '^20.0.1')) { + console.log( + '# SKIP Azure Functions v4 tests, only testing with Node.js v20.latest', + ); + process.exit(); +} else if (os.platform() === 'win32') { + console.log( + '# SKIP Azure Functions tests on Windows because of flaky azure-functions-core-tools install (see https://github.com/elastic/apm-agent-nodejs/issues/3107)', + ); + process.exit(); +} + +/** + * Assert that the given `apmEvents` (events that the mock APM server received) + * match all the expected APM events in `TEST_REQUESTS`. + */ +function checkExpectedApmEvents(t, apmEvents) { + // metadata + if (apmEvents.length > 0) { + const metadata = apmEvents.shift().metadata; + t.ok(metadata, 'metadata is first event'); + t.equal(metadata.service.name, 'azfunc4', 'metadata.service.name'); + t.equal( + metadata.service.framework.name, + 'Azure Functions', + 'metadata.service.framework.name', + ); + t.equal( + metadata.service.framework.version, + '~4', + 'metadata.service.framework.version', + ); + t.equal( + metadata.service.runtime.name, + 'node', + 'metadata.service.runtime.name', + ); + t.equal( + metadata.service.node.configured_name, + 'test-website-instance-id', + 'metadata.service.node.configured_name', + ); + t.equal( + metadata.cloud.account.id, + '2491fc8e-f7c1-4020-b9c6-78509919fd16', + 'metadata.cloud.account.id', + ); + t.equal( + metadata.cloud.instance.name, + 'azfunc4', + 'metadata.cloud.instance.name', + ); + t.equal( + metadata.cloud.project.name, + 'my-resource-group', + 'metadata.cloud.project.name', + ); + t.equal(metadata.cloud.provider, 'azure', 'metadata.cloud.provider'); + t.equal(metadata.cloud.region, 'test-region-name', 'metadata.cloud.region'); + t.equal( + metadata.cloud.service.name, + 'functions', + 'metadata.cloud.service.name', + ); + } + + // Filter out any metadata from separate requests, and metricsets which we + // aren't testing. + apmEvents = apmEvents.filter((e) => !e.metadata).filter((e) => !e.metricset); + + // Sort all the remaining APM events and check expectations from TEST_REQUESTS. + apmEvents = apmEvents.sort((a, b) => { + return getEventField(a, 'timestamp') < getEventField(b, 'timestamp') + ? -1 + : 1; + }); + TEST_REQUESTS.forEach((testReq) => { + t.comment(`check APM events for "${testReq.testName}"`); + // Collect all events for this transaction's trace_id, and pass that to + // the `checkApmEvents` function for this request. + let apmEventsForReq = []; + if (apmEvents.length > 0) { + assert( + apmEvents[0].transaction, + `next APM event is a transaction: ${JSON.stringify(apmEvents[0])}`, + ); + const traceId = apmEvents[0].transaction.trace_id; + apmEventsForReq = apmEvents.filter( + (e) => getEventField(e, 'trace_id') === traceId, + ); + apmEvents = apmEvents.filter( + (e) => getEventField(e, 'trace_id') !== traceId, + ); + } + testReq.checkApmEvents(t, apmEventsForReq); + }); + + t.equal( + apmEvents.length, + 0, + 'no additional unexpected APM server events: ' + JSON.stringify(apmEvents), + ); +} + +// ---- tests + +const UUID_RE = + /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i; + +const fnAppDir = path.join(__dirname, 'fixtures', 'azfunc4'); +const funcExe = + path.resolve(fnAppDir, 'node_modules/.bin/func') + + (os.platform() === 'win32' ? '.cmd' : ''); + +var TEST_REQUESTS = [ + { + testName: 'HttpExample', + reqOpts: { method: 'GET', path: '/api/HttpExample' }, + expectedRes: { + statusCode: 200, // the Azure Functions default + headers: { myheadername: 'MyHeaderValue' }, + body: 'HttpExample body', + }, + checkApmEvents: (t, apmEventsForReq) => { + t.equal(apmEventsForReq.length, 1); + const trans = apmEventsForReq[0].transaction; + t.equal(trans.name, 'GET /api/HttpExample', 'transaction.name'); + t.equal(trans.type, 'request', 'transaction.type'); + t.equal(trans.outcome, 'success', 'transaction.outcome'); + t.equal(trans.result, 'HTTP 2xx', 'transaction.result'); + t.equal(trans.faas.name, 'azfunc4/HttpExample', 'transaction.faas.name'); + t.equal( + trans.faas.id, + '/subscriptions/2491fc8e-f7c1-4020-b9c6-78509919fd16/resourceGroups/my-resource-group/providers/Microsoft.Web/sites/azfunc4/functions/HttpExample', + 'transaction.faas.id', + ); + t.equal(trans.faas.trigger.type, 'http', 'transaction.faas.trigger.type'); + t.ok( + UUID_RE.test(trans.faas.execution), + 'transaction.faas.execution ' + trans.faas.execution, + ); + t.equal(trans.faas.coldstart, true, 'transaction.faas.coldstart'); + t.equal( + trans.context.request.method, + 'GET', + 'transaction.context.request.method', + ); + t.equal( + trans.context.request.url.full, + 'http://127.0.0.1:7071/api/HttpExample', + 'transaction.context.request.url.full', + ); + t.ok( + trans.context.request.headers, + 'transaction.context.request.headers', + ); + t.equal( + trans.context.response.status_code, + 200, + 'transaction.context.response.status_code', + ); + t.equal( + trans.context.response.headers.MyHeaderName, + 'MyHeaderValue', + 'transaction.context.response.headers.MyHeaderName', + ); + }, + }, + // TODO: test more of the cases that are covered in azure-functions-v3.test.js +]; + +// We need to `npm ci` for a first test run. +tape.test( + `setup: npm ci (in ${fnAppDir})`, + { skip: fs.existsSync(funcExe) }, + (t) => { + const startTime = Date.now(); + exec( + 'npm ci', + { + cwd: fnAppDir, + }, + function (err, stdout, stderr) { + t.error( + err, + `"npm ci" succeeded (took ${(Date.now() - startTime) / 1000}s)`, + ); + if (err) { + t.comment( + `$ npm ci\n-- stdout --\n${stdout}\n-- stderr --\n${stderr}\n--`, + ); + } + t.end(); + }, + ); + }, +); + +tape.test('azure functions v4', function (suite) { + let apmServer; + let apmServerUrl; + + suite.test('setup', function (t) { + apmServer = new MockAPMServer(); + apmServer.start(function (serverUrl) { + apmServerUrl = serverUrl; + t.comment('mock APM apmServerUrl: ' + apmServerUrl); + t.end(); + }); + }); + + let fnAppProc; + suite.test('setup: "func start" for azfunc4 fixture', (t) => { + fnAppProc = spawn(funcExe, ['start'], { + cwd: fnAppDir, + env: Object.assign({}, process.env, { + ELASTIC_APM_SERVER_URL: apmServerUrl, + ELASTIC_APM_API_REQUEST_TIME: '2s', + }), + }); + fnAppProc.on('error', (err) => { + t.error(err, 'no error from "func start"'); + }); + fnAppProc.stdout.on('data', (data) => { + t.comment(`["func start" stdout] ${formatForTComment(data)}`); + }); + fnAppProc.stderr.on('data', (data) => { + t.comment(`["func start" stderr] ${formatForTComment(data)}`); + }); + + // Allow some time for an early fail of `func start`, e.g. if there is + // already a user of port 7071... + const onEarlyClose = (code) => { + // Warning/Limitation: The 'npm ci' above installs platform-specific + // binaries to "$fnAppDir/node_modules/azure-functions-core-tools/...", + // which means a local test run on macOS followed by an attempted test run + // in Docker will result in a crash: + // node_tests_1 | # ["func start" stderr] /app/test/instrumentation/azure-functions/fixtures/azfunc3/node_modules/azure-functions-core-tools/bin/func: 1: Syntax error: "(" unexpected + // node_tests_1 | not ok 2 "func start" failed early: code=2 + // For now the workaround is to manually clean that tree before running + // tests on a separate OS: + // rm -rf test/instrumentation/azure-functions/fixtures/azfunc3/node_modules + t.fail(`"func start" failed early: code=${code}`); + fnAppProc = null; + clearTimeout(earlyCloseTimer); + t.end(); + }; + fnAppProc.on('close', onEarlyClose); + const earlyCloseTimer = setTimeout(() => { + fnAppProc.removeListener('close', onEarlyClose); + + // ... then wait for the server to be ready. + waitForServerReady(t, (waitErr) => { + if (waitErr) { + t.fail( + `error waiting for "func start" to be ready: ${waitErr.message}`, + ); + treekill(fnAppProc.pid, 'SIGKILL'); + fnAppProc = null; + } else { + t.comment('"func start" is ready'); + } + t.end(); + }); + }, 1000); + }); + + suite.test('make requests', async (t) => { + if (!fnAppProc) { + t.skip('there is no fnAppProc'); + t.end(); + return; + } + + apmServer.clear(); + for (let i = 0; i < TEST_REQUESTS.length; i++) { + await makeTestRequest(t, TEST_REQUESTS[i]); + } + + t.end(); + }); + + suite.test('check all APM events', (t) => { + if (!fnAppProc) { + t.skip('there is no fnAppProc'); + t.end(); + return; + } + + // To ensure we get all the trace data from the instrumented function app + // server, we wait 2x the `apiRequestTime` (set above) before stopping it. + fnAppProc.on('close', (_code) => { + checkExpectedApmEvents(t, apmServer.events); + t.end(); + }); + t.comment('wait 4s for trace data to be sent before closing "func start"'); + setTimeout(() => { + treekill(fnAppProc.pid, 'SIGKILL'); + }, 4000); // 2x ELASTIC_APM_API_REQUEST_TIME set above + }); + + suite.test('teardown', function (t) { + apmServer.close(); + t.end(); + }); + + suite.end(); +}); diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnError/function.json b/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnError/function.json deleted file mode 100644 index 91052aaf8a..0000000000 --- a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnError/function.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "bindings": [ - { - "authLevel": "Anonymous", - "type": "httpTrigger", - "direction": "in", - "name": "req", - "methods": [ - "get", - "post" - ] - }, - { - "type": "http", - "direction": "out", - "name": "res" - } - ] -} \ No newline at end of file diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/README.md b/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/README.md deleted file mode 100644 index e9264594af..0000000000 --- a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/README.md +++ /dev/null @@ -1,12 +0,0 @@ -A Node.js JavaScript Azure function app to be used for testing of -elastic-apm-node. - -# Notes on how this was created - -- `func init AJsAzureFnApp` -- Remove "azure-functions-core-tools" devDep and move to top-level to share - between possibly many fixtures. -- An HTTP-triggered function: `func new --name HttpFn1 --template "HTTP trigger" --authlevel "anonymous"` -- ... - - diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/.gitignore b/test/instrumentation/azure-functions/fixtures/azfunc3/.gitignore similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/.gitignore rename to test/instrumentation/azure-functions/fixtures/azfunc3/.gitignore diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFn1/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFn1/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFn1/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFn1/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFn1/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFn1/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFn1/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFn1/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnBindingsRes/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnBindingsRes/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnBindingsRes/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnBindingsRes/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnBindingsRes/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnBindingsRes/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnBindingsRes/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnBindingsRes/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnContextDone/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnContextDone/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnContextDone/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnContextDone/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnContextDone/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnContextDone/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnContextDone/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnContextDone/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceA/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceA/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceA/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceA/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceA/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceA/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceA/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceA/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceB/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceB/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceB/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceB/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceB/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceB/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnDistTraceB/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnDistTraceB/index.js diff --git a/examples/an-azure-function-app/Bye/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnError/function.json similarity index 100% rename from examples/an-azure-function-app/Bye/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnError/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnError/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnError/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnError/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnError/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnContext/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnContext/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnContext/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnContext/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnContext/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnContext/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnContext/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnContext/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnObject/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnObject/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnObject/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnObject/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnObject/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnObject/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnObject/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnObject/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnResponseData/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnResponseData/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnResponseData/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnResponseData/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnResponseData/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnResponseData/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnResponseData/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnResponseData/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnString/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnString/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnString/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnString/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnString/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnString/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnReturnString/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnReturnString/index.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnRouteTemplate/function.json b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnRouteTemplate/function.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnRouteTemplate/function.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnRouteTemplate/function.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnRouteTemplate/index.js b/test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnRouteTemplate/index.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/HttpFnRouteTemplate/index.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/HttpFnRouteTemplate/index.js diff --git a/test/instrumentation/azure-functions/fixtures/azfunc3/README.md b/test/instrumentation/azure-functions/fixtures/azfunc3/README.md new file mode 100644 index 0000000000..9e3ea2e8ed --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc3/README.md @@ -0,0 +1,3 @@ +A Node.js Azure Functions app, using **version 3** of the Node.js +programming model. See: +https://learn.microsoft.com/en-ca/azure/azure-functions/functions-node-upgrade-v4 diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/host.json b/test/instrumentation/azure-functions/fixtures/azfunc3/host.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/host.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/host.json diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/initapm.js b/test/instrumentation/azure-functions/fixtures/azfunc3/initapm.js similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/initapm.js rename to test/instrumentation/azure-functions/fixtures/azfunc3/initapm.js diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/local.settings.json b/test/instrumentation/azure-functions/fixtures/azfunc3/local.settings.json similarity index 92% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/local.settings.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/local.settings.json index 51058f07a5..8910ca349e 100644 --- a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/local.settings.json +++ b/test/instrumentation/azure-functions/fixtures/azfunc3/local.settings.json @@ -7,7 +7,7 @@ "WEBSITE_NODE_DEFAULT_VERSION": "~16", "FUNCTIONS_EXTENSION_VERSION": "~4", - "WEBSITE_SITE_NAME": "AJsAzureFnApp", + "WEBSITE_SITE_NAME": "azfunc3", "WEBSITE_OWNER_NAME": "2491fc8e-f7c1-4020-b9c6-78509919fd16+my-resource-group-ARegionShortNamewebspace", "WEBSITE_RESOURCE_GROUP": "my-resource-group", "WEBSITE_INSTANCE_ID": "test-website-instance-id", diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json b/test/instrumentation/azure-functions/fixtures/azfunc3/package-lock.json similarity index 71% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/package-lock.json index e9bb92e3fb..699790bf7a 100644 --- a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json +++ b/test/instrumentation/azure-functions/fixtures/azfunc3/package-lock.json @@ -1,5 +1,5 @@ { - "name": "AJsAzureFnApp", + "name": "azfunc3", "version": "1.0.0", "lockfileVersion": 2, "requires": true, @@ -11,12 +11,13 @@ } }, "node_modules/azure-functions-core-tools": { - "version": "4.0.5801", - "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5801.tgz", - "integrity": "sha512-6riuUu7X9yI3A9HtYDg8dx8bgb6NGtd+2sRaiXLMDJ0wpS6v/7lyeyXYMLG7OHMvItrhPYP619rRvu33l1tmTg==", + "version": "4.0.7030", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.7030.tgz", + "integrity": "sha512-rsnAH5jVfkZKj7L6vYyDC0lDi3MxkJrngIIBJVc24ygG5Yl339iCD2PkGYRZLaupzj67zirOllfT4vFf8BKq2A==", "dev": true, "hasInstallScript": true, "hasShrinkwrap": true, + "license": "MIT", "os": [ "win32", "darwin", @@ -25,7 +26,7 @@ "dependencies": { "chalk": "3.0.0", "extract-zip": "^2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "progress": "2.0.3", "rimraf": "4.4.1" }, @@ -87,19 +88,20 @@ } }, "node_modules/azure-functions-core-tools/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, "node_modules/azure-functions-core-tools/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/azure-functions-core-tools/node_modules/buffer-crc32": { @@ -142,20 +144,22 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/azure-functions-core-tools/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "node_modules/azure-functions-core-tools/node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/azure-functions-core-tools/node_modules/end-of-stream": { @@ -199,8 +203,9 @@ "node_modules/azure-functions-core-tools/node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" }, "node_modules/azure-functions-core-tools/node_modules/get-stream": { "version": "5.2.0", @@ -218,20 +223,19 @@ } }, "node_modules/azure-functions-core-tools/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -247,10 +251,11 @@ } }, "node_modules/azure-functions-core-tools/node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -259,39 +264,45 @@ "node": ">= 6" } }, - "node_modules/azure-functions-core-tools/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/azure-functions-core-tools/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/azure-functions-core-tools/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "license": "ISC" }, "node_modules/azure-functions-core-tools/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" } }, "node_modules/azure-functions-core-tools/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/azure-functions-core-tools/node_modules/once": { "version": "1.4.0", @@ -302,13 +313,31 @@ "wrappy": "1" } }, - "node_modules/azure-functions-core-tools/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/azure-functions-core-tools/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/azure-functions-core-tools/node_modules/pend": { @@ -337,15 +366,19 @@ } }, "node_modules/azure-functions-core-tools/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, + "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^9.2.0" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -382,14 +415,14 @@ }, "dependencies": { "azure-functions-core-tools": { - "version": "4.0.5801", - "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5801.tgz", - "integrity": "sha512-6riuUu7X9yI3A9HtYDg8dx8bgb6NGtd+2sRaiXLMDJ0wpS6v/7lyeyXYMLG7OHMvItrhPYP619rRvu33l1tmTg==", + "version": "4.0.7030", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.7030.tgz", + "integrity": "sha512-rsnAH5jVfkZKj7L6vYyDC0lDi3MxkJrngIIBJVc24ygG5Yl339iCD2PkGYRZLaupzj67zirOllfT4vFf8BKq2A==", "dev": true, "requires": { "chalk": "3.0.0", "extract-zip": "^2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "progress": "2.0.3", "rimraf": "4.4.1" }, @@ -437,19 +470,18 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "buffer-crc32": { @@ -483,19 +515,13 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "^2.1.3" } }, "end-of-stream": { @@ -531,7 +557,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "get-stream": { @@ -544,17 +570,15 @@ } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" } }, "has-flag": { @@ -564,44 +588,40 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", "debug": "4" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, + "minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true + }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "once": { @@ -613,11 +633,23 @@ "wrappy": "1" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } }, "pend": { "version": "1.2.0", @@ -642,11 +674,12 @@ } }, "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^9.2.0" } }, "supports-color": { diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package.json b/test/instrumentation/azure-functions/fixtures/azfunc3/package.json similarity index 100% rename from test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package.json rename to test/instrumentation/azure-functions/fixtures/azfunc3/package.json diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/.funcignore b/test/instrumentation/azure-functions/fixtures/azfunc4/.funcignore new file mode 100644 index 0000000000..17bd0f697c --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/.funcignore @@ -0,0 +1,10 @@ +*.js.map +*.ts +.git* +.vscode +local.settings.json +test +getting_started.md +node_modules/@types/ +node_modules/azure-functions-core-tools/ +node_modules/typescript/ \ No newline at end of file diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/.npmrc b/test/instrumentation/azure-functions/fixtures/azfunc4/.npmrc new file mode 100644 index 0000000000..4eae7876ff --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/.npmrc @@ -0,0 +1 @@ +lockfile-version=3 diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/README.md b/test/instrumentation/azure-functions/fixtures/azfunc4/README.md new file mode 100644 index 0000000000..1da6020a3a --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/README.md @@ -0,0 +1,3 @@ +A Node.js Azure Functions app, using **version 4** of the Node.js +programming model. See: +https://learn.microsoft.com/en-ca/azure/azure-functions/functions-node-upgrade-v4 diff --git a/examples/an-azure-function-app/host.json b/test/instrumentation/azure-functions/fixtures/azfunc4/host.json similarity index 89% rename from examples/an-azure-function-app/host.json rename to test/instrumentation/azure-functions/fixtures/azfunc4/host.json index fd4bee790b..9df913614d 100644 --- a/examples/an-azure-function-app/host.json +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/host.json @@ -10,6 +10,6 @@ }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", - "version": "[3.*, 4.0.0)" + "version": "[4.*, 5.0.0)" } } \ No newline at end of file diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/initapm.js b/test/instrumentation/azure-functions/fixtures/azfunc4/initapm.js new file mode 100644 index 0000000000..db2f85666c --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/initapm.js @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +// For the normal use case an "initapm.js" would look like: +// module.exports = require('elastic-apm-node').start(/* { ... } */) + +module.exports = require('../../../../../').start(); diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/local.settings.json b/test/instrumentation/azure-functions/fixtures/azfunc4/local.settings.json new file mode 100644 index 0000000000..574eb48063 --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/local.settings.json @@ -0,0 +1,14 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "node", + "AzureWebJobsStorage": "", + + "FUNCTIONS_EXTENSION_VERSION": "~4", + "WEBSITE_SITE_NAME": "azfunc4", + "WEBSITE_OWNER_NAME": "2491fc8e-f7c1-4020-b9c6-78509919fd16+my-resource-group-ARegionShortNamewebspace", + "WEBSITE_RESOURCE_GROUP": "my-resource-group", + "WEBSITE_INSTANCE_ID": "test-website-instance-id", + "REGION_NAME": "test-region-name" + } +} diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/package-lock.json b/test/instrumentation/azure-functions/fixtures/azfunc4/package-lock.json new file mode 100644 index 0000000000..7319e024bf --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/package-lock.json @@ -0,0 +1,429 @@ +{ + "name": "azfunc4", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "dependencies": { + "@azure/functions": "^4.0.0", + "azure-functions-core-tools": "^4.0.6821" + } + }, + "node_modules/@azure/functions": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@azure/functions/-/functions-4.7.0.tgz", + "integrity": "sha512-y1caGX6LYrA7msAckQVb/quFOhWHSPiGzWfIML17t0ee2ydpinJTBF+Sti+URfLAH63dtmXJR4meraZkhhK9tw==", + "license": "MIT", + "dependencies": { + "cookie": "^0.7.0", + "long": "^4.0.0", + "undici": "^5.13.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/azure-functions-core-tools": { + "version": "4.0.7030", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.7030.tgz", + "integrity": "sha512-rsnAH5jVfkZKj7L6vYyDC0lDi3MxkJrngIIBJVc24ygG5Yl339iCD2PkGYRZLaupzj67zirOllfT4vFf8BKq2A==", + "hasInstallScript": true, + "hasShrinkwrap": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "chalk": "3.0.0", + "extract-zip": "^2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "rimraf": "4.4.1" + }, + "bin": { + "azfun": "lib/main.js", + "azurefunctions": "lib/main.js", + "func": "lib/main.js" + }, + "engines": { + "node": ">=6.9.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "node_modules/azure-functions-core-tools/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "optional": true + }, + "node_modules/azure-functions-core-tools/node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/azure-functions-core-tools/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/ansi-styles": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.0.tgz", + "integrity": "sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==", + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/azure-functions-core-tools/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/azure-functions-core-tools/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/azure-functions-core-tools/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/azure-functions-core-tools/node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "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/azure-functions-core-tools/node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/azure-functions-core-tools/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/azure-functions-core-tools/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/azure-functions-core-tools/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/azure-functions-core-tools/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/azure-functions-core-tools/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/azure-functions-core-tools/node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/azure-functions-core-tools/node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/azure-functions-core-tools/node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/azure-functions-core-tools/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/azure-functions-core-tools/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/azure-functions-core-tools/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/azure-functions-core-tools/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/undici": { + "version": "5.28.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz", + "integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + } + } +} diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/package.json b/test/instrumentation/azure-functions/fixtures/azfunc4/package.json new file mode 100644 index 0000000000..4f755c02b7 --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/package.json @@ -0,0 +1,13 @@ +{ + "name": "", + "version": "1.0.0", + "description": "", + "main": "{initapm.js,src/functions/*.js}", + "scripts": { + "start": "func start" + }, + "dependencies": { + "@azure/functions": "^4.0.0", + "azure-functions-core-tools": "^4.0.6821" + } +} diff --git a/test/instrumentation/azure-functions/fixtures/azfunc4/src/functions/HttpExample.js b/test/instrumentation/azure-functions/fixtures/azfunc4/src/functions/HttpExample.js new file mode 100644 index 0000000000..4b85e0f3f3 --- /dev/null +++ b/test/instrumentation/azure-functions/fixtures/azfunc4/src/functions/HttpExample.js @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and other contributors where applicable. + * Licensed under the BSD 2-Clause License; you may not use this file except in + * compliance with the BSD 2-Clause License. + */ + +const { app } = require('@azure/functions'); + +app.http('HttpExample', { + methods: ['GET', 'POST'], + authLevel: 'anonymous', + handler: async (_request, _context) => { + return { + body: 'HttpExample body', + headers: { + MyHeaderName: 'MyHeaderValue', + }, + }; + }, +}); diff --git a/test/instrumentation/modules/@aws-sdk/client-dynamodb.test.js b/test/instrumentation/modules/@aws-sdk/client-dynamodb.test.js index 48ceeffa77..438357e40d 100644 --- a/test/instrumentation/modules/@aws-sdk/client-dynamodb.test.js +++ b/test/instrumentation/modules/@aws-sdk/client-dynamodb.test.js @@ -15,6 +15,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); diff --git a/test/instrumentation/modules/@aws-sdk/client-s3.test.js b/test/instrumentation/modules/@aws-sdk/client-s3.test.js index 086c639df7..3d3134ad51 100644 --- a/test/instrumentation/modules/@aws-sdk/client-s3.test.js +++ b/test/instrumentation/modules/@aws-sdk/client-s3.test.js @@ -18,6 +18,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); diff --git a/test/instrumentation/modules/@aws-sdk/client-sns.test.js b/test/instrumentation/modules/@aws-sdk/client-sns.test.js index 1bcaa93641..0c70c269aa 100644 --- a/test/instrumentation/modules/@aws-sdk/client-sns.test.js +++ b/test/instrumentation/modules/@aws-sdk/client-sns.test.js @@ -14,6 +14,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); @@ -235,6 +238,24 @@ const testFixtures = [ t.equal(spans.length, 0, 'all spans accounted for'); }, }, + + { + name: 'use-client-sns.js without a created transaction to ensure does not crash', + script: 'fixtures/use-client-sns.js', + cwd: __dirname, + env: { + AWS_ACCESS_KEY_ID: 'fake', + AWS_SECRET_ACCESS_KEY: 'fake', + TEST_ENDPOINT: endpoint, + TEST_REGION: 'us-east-2', + TEST_NO_TRANSACTION: 'true', + }, + versionRanges: { + node: '>=14', + }, + verbose: true, + }, + { name: '@aws-sdk/client-sns ESM', script: 'fixtures/use-client-sns.mjs', diff --git a/test/instrumentation/modules/@aws-sdk/client-sqs.test.js b/test/instrumentation/modules/@aws-sdk/client-sqs.test.js index 8c1596631e..991c5eb856 100644 --- a/test/instrumentation/modules/@aws-sdk/client-sqs.test.js +++ b/test/instrumentation/modules/@aws-sdk/client-sqs.test.js @@ -18,6 +18,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); diff --git a/test/instrumentation/modules/@aws-sdk/fixtures/use-client-sns.js b/test/instrumentation/modules/@aws-sdk/fixtures/use-client-sns.js index 80602a5419..6bf696c3f8 100644 --- a/test/instrumentation/modules/@aws-sdk/fixtures/use-client-sns.js +++ b/test/instrumentation/modules/@aws-sdk/fixtures/use-client-sns.js @@ -225,6 +225,9 @@ function main() { const endpoint = process.env.TEST_ENDPOINT || null; const topicName = process.env.TEST_TOPIC_NAME || TEST_TOPIC_NAME_PREFIX + getTimestamp(); + // `TEST_NO_TRANSACTION=true` can be used to disable the creating of a + // current transaction for SNS calls; useful only for testing. + const noTransaction = process.env.TEST_NO_TRANSACTION === 'true'; // Guard against any topic name being used because we will be publishing // messages in it, and potentially *deleting* the topic. @@ -240,18 +243,25 @@ function main() { }); // Ensure an APM transaction so spans can happen. - const tx = apm.startTransaction('manual'); + let tx = null; + if (!noTransaction) { + tx = apm.startTransaction('manual'); + } useClientSNS(snsClient, topicName).then( function () { - tx.end(); + if (tx) { + tx.end(); + } snsClient.destroy(); process.exitCode = 0; }, function (err) { apm.logger.error(err, 'useClientSNS rejected'); - tx.setOutcome('failure'); - tx.end(); + if (tx) { + tx.setOutcome('failure'); + tx.end(); + } snsClient.destroy(); process.exitCode = 1; }, diff --git a/test/instrumentation/modules/@elastic/elasticsearch.test.js b/test/instrumentation/modules/@elastic/elasticsearch.test.js index 625a9ad8c6..01c85bba70 100644 --- a/test/instrumentation/modules/@elastic/elasticsearch.test.js +++ b/test/instrumentation/modules/@elastic/elasticsearch.test.js @@ -17,6 +17,9 @@ const isUndiciIncompat = require('../../../_is_undici_incompat')(); if (isUndiciIncompat) { console.log(`# SKIP dependency issue: ${isUndiciIncompat}`); process.exit(); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } process.env.ELASTIC_APM_TEST = true; @@ -1218,10 +1221,6 @@ function checkDataAndEnd( expectedStatusCode, 'context.http.status_code', ); - t.ok( - esSpan.context.http.response.encoded_body_size, - 'context.http.response.encoded_body_size is present', - ); t.end(); }; diff --git a/test/instrumentation/modules/apollo-server-express.test.js b/test/instrumentation/modules/apollo-server-express.test.js index 777b58b8cb..5fb712b71f 100644 --- a/test/instrumentation/modules/apollo-server-express.test.js +++ b/test/instrumentation/modules/apollo-server-express.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP dependency issue: ${isExpressIncompat}`); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/aws-sdk/aws4-retries.test.js b/test/instrumentation/modules/aws-sdk/aws4-retries.test.js index 1fdbfa8bc0..aed2c0da95 100644 --- a/test/instrumentation/modules/aws-sdk/aws4-retries.test.js +++ b/test/instrumentation/modules/aws-sdk/aws4-retries.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } // Test the fix for bug #2134, that AWS4 signature auth with the aws-sdk diff --git a/test/instrumentation/modules/aws-sdk/dynamodb.test.js b/test/instrumentation/modules/aws-sdk/dynamodb.test.js index e5fe6762de..6fb3ee59ce 100644 --- a/test/instrumentation/modules/aws-sdk/dynamodb.test.js +++ b/test/instrumentation/modules/aws-sdk/dynamodb.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const agent = require('../../../..').start({ @@ -21,11 +24,10 @@ const agent = require('../../../..').start({ const tape = require('tape'); process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE = 1; const AWS = require('aws-sdk'); -const express = require('express'); -const bodyParser = require('body-parser'); const fixtures = require('./fixtures/dynamodb'); const mockClient = require('../../../_mock_http_client'); +const mockExpressApp = require('../../../_mock_express_app'); const { getRegionFromRequest, @@ -50,8 +52,8 @@ function initializeAwsSdk() { } function createMockServer(fixture) { - const app = express(); - app.use(bodyParser.urlencoded({ extended: false })); + const app = mockExpressApp(); + // app.use(bodyParser.urlencoded({ extended: false })); app.post('/', (req, res) => { res.status(fixture.httpStatusCode); res.setHeader('Content-Type', 'application/javascript'); diff --git a/test/instrumentation/modules/aws-sdk/s3.test.js b/test/instrumentation/modules/aws-sdk/s3.test.js index 12801c2dbe..56e6574004 100644 --- a/test/instrumentation/modules/aws-sdk/s3.test.js +++ b/test/instrumentation/modules/aws-sdk/s3.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } // Test S3 instrumentation of the 'aws-sdk' module. diff --git a/test/instrumentation/modules/aws-sdk/sns.test.js b/test/instrumentation/modules/aws-sdk/sns.test.js index 28b8de8dca..adec5d1039 100644 --- a/test/instrumentation/modules/aws-sdk/sns.test.js +++ b/test/instrumentation/modules/aws-sdk/sns.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const agent = require('../../../..').start({ @@ -23,7 +26,6 @@ const agent = require('../../../..').start({ }); const tape = require('tape'); -const express = require('express'); const bodyParser = require('body-parser'); process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE = 1; @@ -37,6 +39,7 @@ const { } = require('../../../../lib/instrumentation/modules/aws-sdk/sns'); const fixtures = require('./fixtures/sns'); const mockClient = require('../../../_mock_http_client'); +const mockExpressApp = require('../../../_mock_express_app'); initializeAwsSdk(); @@ -51,19 +54,21 @@ function initializeAwsSdk() { } function createMockServer(fixture) { - const app = express(); + const app = mockExpressApp(); app._receivedReqs = []; - app.use(bodyParser.urlencoded({ extended: false })); + const encodeMiddleware = bodyParser.urlencoded({ extended: false }); app.post('/', (req, res) => { - app._receivedReqs.push({ - method: req.method, - url: req.url, - headers: req.headers, - body: req.body, + encodeMiddleware(req, res, () => { + app._receivedReqs.push({ + method: req.method, + url: req.url, + headers: req.headers, + body: req.body, + }); + res.status(fixture.httpStatusCode); + res.setHeader('Content-Type', 'text/xml'); + res.send(fixture.response); }); - res.status(fixture.httpStatusCode); - res.setHeader('Content-Type', 'text/xml'); - res.send(fixture.response); }); return app; } diff --git a/test/instrumentation/modules/aws-sdk/sqs.test.js b/test/instrumentation/modules/aws-sdk/sqs.test.js index 4d76050fbe..995d7f322f 100644 --- a/test/instrumentation/modules/aws-sdk/sqs.test.js +++ b/test/instrumentation/modules/aws-sdk/sqs.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const { execFile } = require('child_process'); diff --git a/test/instrumentation/modules/bluebird/_coroutine.js b/test/instrumentation/modules/bluebird/_coroutine.js index 6b83b5a5d8..0d86caef33 100644 --- a/test/instrumentation/modules/bluebird/_coroutine.js +++ b/test/instrumentation/modules/bluebird/_coroutine.js @@ -105,19 +105,20 @@ module.exports = function (test, Promise, ins) { }; function assertPingPong(t, ins, p) { - // Since setTimeout has a weird behavior[1] the function might be called 1ms - // before it's scheduled, which is why we allow for only 9ms to have passed - // instead of 10ms in the two asserts below + // Since setTimeout has a weird behavior[1] the function might be called + // slightly before it's scheduled. For pingDelay=10ms we have observed an + // actual delay of as low as 8ms. // // [1] https://twitter.com/wa7son/status/1009048999972818944 + const tolerance = 3; t.ok( - p.start + 9 <= p.pingDelay, + p.start + (10 - tolerance) <= p.pingDelay, 'ping should be delayed min 9ms (delayed ' + (p.pingDelay - p.start) + 'ms)', ); t.ok( - p.pingDelay + 9 <= p.pongDelay, + p.pingDelay + (10 - tolerance) <= p.pongDelay, 'pong should be delayed min 9ms (delayed ' + (p.pongDelay - p.pingDelay) + 'ms)', diff --git a/test/instrumentation/modules/bluebird/bluebird.test.js b/test/instrumentation/modules/bluebird/bluebird.test.js index 061bb3a437..d93f278d67 100644 --- a/test/instrumentation/modules/bluebird/bluebird.test.js +++ b/test/instrumentation/modules/bluebird/bluebird.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } // The unhandledRejection will be fired by our bluebird tests, which is to be @@ -1229,14 +1232,15 @@ test('new Promise -> delay', function (t) { var trans = ins.startTransaction(); var start = Date.now(); + const tolerance = 5; // We've observed scheduling slop up to 2ms. Promise.resolve('foo') .delay(50) .then(function () { - var expected = start + 49; // timings are hard + var expected = start + (50 - tolerance); var now = Date.now(); t.ok( expected <= now, - 'start + 49 should be <= ' + now + ' - was ' + expected, + '(start + 50 - tolerance) should be <= ' + now + ' - was ' + expected, ); t.strictEqual(ins.currTransaction().id, trans.id); }); diff --git a/test/instrumentation/modules/bluebird/cancel.test.js b/test/instrumentation/modules/bluebird/cancel.test.js index 1fc16aaaf6..d42756717e 100644 --- a/test/instrumentation/modules/bluebird/cancel.test.js +++ b/test/instrumentation/modules/bluebird/cancel.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js b/test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js index 63098d395b..f66240ebaf 100644 --- a/test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js +++ b/test/instrumentation/modules/cassandra-driver/cassandra-driver.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); @@ -28,7 +31,7 @@ const TEST_USE_PROMISES = semver.satisfies(CASSANDRA_VERSION, '>=3.2'); const testFixtures = [ { - name: 'cassandra-driver simple usage', + name: 'cassandra-driver simple usage (<4.8.0)', script: 'fixtures/use-cassandra-driver.js', cwd: __dirname, timeout: 20000, // sanity guard on the test hanging @@ -45,384 +48,427 @@ const testFixtures = [ // Because of these complications and because Node v14 is EOL, we are skipping testing // with earlier node versions. node: '>=16.9', + 'cassandra-driver': '<4.8.0', + }, + // verbose: true, + checkApmServer, + }, + { + name: 'cassandra-driver simple usage (>=4.8.0)', + script: 'fixtures/use-cassandra-driver.js', + cwd: __dirname, + timeout: 20000, // sanity guard on the test hanging + maxBuffer: 10 * 1024 * 1024, // This is big, but I don't ever want this to be a failure reason. + env: { + TEST_KEYSPACE, + TEST_TABLE, + TEST_DATACENTER, + TEST_USE_PROMISES: String(TEST_USE_PROMISES), + }, + versionRanges: { + // - cassandra-driver >=4.8.0 only supports node >=18 + node: '>=18', + 'cassandra-driver': '>=4.8.0', + }, + // verbose: true, + checkApmServer, + }, + { + name: 'cassandra-driver ESM (<4.8.0)', + script: 'fixtures/use-cassandra-driver.mjs', + cwd: __dirname, + timeout: 20000, // sanity guard on the test hanging + maxBuffer: 10 * 1024 * 1024, // This is big, but I don't ever want this to be a failure reason. + env: { + NODE_OPTIONS: + '--experimental-loader=../../../../loader.mjs --require=../../../../start.js', + TEST_DATACENTER, + }, + versionRanges: { + node: '^16.9.0 || ^18.1.0 <20', + 'cassandra-driver': '>=4.7.0 <4.8.0', }, - verbose: true, - checkApmServer: (t, apmServer) => { - t.ok(apmServer.events[0].metadata, 'metadata'); - const events = sortApmEvents(apmServer.events); + // verbose: true, + checkApmServerEsm, + }, + { + name: 'cassandra-driver ESM (>=4.8.0)', + script: 'fixtures/use-cassandra-driver.mjs', + cwd: __dirname, + timeout: 20000, // sanity guard on the test hanging + maxBuffer: 10 * 1024 * 1024, // This is big, but I don't ever want this to be a failure reason. + env: { + NODE_OPTIONS: + '--experimental-loader=../../../../loader.mjs --require=../../../../start.js', + TEST_DATACENTER, + }, + versionRanges: { + node: '^18.1.0 <20', + 'cassandra-driver': '>=4.8.0', + }, + // verbose: true, + checkApmServerEsm, + }, +]; - // First the transaction. - t.ok(events[0].transaction, 'got the transaction'); - const tx = events.shift().transaction; +function checkApmServer(t, apmServer) { + t.ok(apmServer.events[0].metadata, 'metadata'); + const events = sortApmEvents(apmServer.events); - // Get the spans to check - const spans = events - .filter((e) => e.span) - // 1st span is a `connect` and some commands may - // connect again so we filter them out - .filter((e, i) => i === 0 || e.span.action !== 'connect') - .map((e) => e.span); + // First the transaction. + t.ok(events[0].transaction, 'got the transaction'); + const tx = events.shift().transaction; - // Compare some common fields across all spans. - spans.forEach((s) => { - const errs = validateSpan(s); - t.equal(errs, null, 'span is valid (per apm-server intake schema)'); - }); - t.equal( - spans.filter((s) => s.trace_id === tx.trace_id).length, - spans.length, - 'all spans have the same trace_id', - ); - t.equal( - spans.filter((s) => s.transaction_id === tx.id).length, - spans.length, - 'all spans have the same transaction_id', - ); - t.equal( - spans.filter((s) => s.sync === false).length, - spans.length, - 'all spans have sync=false', - ); - t.equal( - spans.filter((s) => s.sample_rate === 1).length, - spans.length, - 'all spans have sample_rate=1', - ); - spans.forEach((s) => { - // Remove variable and common fields to facilitate t.deepEqual below. - delete s.id; - delete s.transaction_id; - delete s.parent_id; - delete s.trace_id; - delete s.timestamp; - delete s.duration; - delete s.sync; - delete s.sample_rate; - }); + // Get the spans to check + const spans = events + .filter((e) => e.span) + // 1st span is a `connect` and some commands may + // connect again so we filter them out + .filter((e, i) => i === 0 || e.span.action !== 'connect') + .map((e) => e.span); - // Work through each of the pipeline functions (connect, execute, ...) in the script: - t.deepEqual( - spans.shift(), - { - name: 'Cassandra: Connect', - type: 'db', - subtype: 'cassandra', - action: 'connect', - context: { - db: { type: 'cassandra' }, - service: { target: { type: 'cassandra' } }, - destination: { - service: { - type: '', - name: '', - resource: 'cassandra', - }, - }, + // Compare some common fields across all spans. + spans.forEach((s) => { + const errs = validateSpan(s); + t.equal(errs, null, 'span is valid (per apm-server intake schema)'); + }); + t.equal( + spans.filter((s) => s.trace_id === tx.trace_id).length, + spans.length, + 'all spans have the same trace_id', + ); + t.equal( + spans.filter((s) => s.transaction_id === tx.id).length, + spans.length, + 'all spans have the same transaction_id', + ); + t.equal( + spans.filter((s) => s.sync === false).length, + spans.length, + 'all spans have sync=false', + ); + t.equal( + spans.filter((s) => s.sample_rate === 1).length, + spans.length, + 'all spans have sample_rate=1', + ); + spans.forEach((s) => { + // Remove variable and common fields to facilitate t.deepEqual below. + delete s.id; + delete s.transaction_id; + delete s.parent_id; + delete s.trace_id; + delete s.timestamp; + delete s.duration; + delete s.sync; + delete s.sample_rate; + }); + + // Work through each of the pipeline functions (connect, execute, ...) in the script: + t.deepEqual( + spans.shift(), + { + name: 'Cassandra: Connect', + type: 'db', + subtype: 'cassandra', + action: 'connect', + context: { + db: { type: 'cassandra' }, + service: { target: { type: 'cassandra' } }, + destination: { + service: { + type: '', + name: '', + resource: 'cassandra', }, - outcome: 'success', }, - 'connect produced expected span', - ); + }, + outcome: 'success', + }, + 'connect produced expected span', + ); - t.deepEqual( - spans.shift(), - { - name: 'CREATE', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - service: { - target: { type: 'cassandra' }, - }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra`, - }, - }, - db: { - type: 'cassandra', - statement: `CREATE KEYSPACE IF NOT EXISTS ${TEST_KEYSPACE} WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1 };`, - }, + t.deepEqual( + spans.shift(), + { + name: 'CREATE', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + service: { + target: { type: 'cassandra' }, + }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra`, }, - outcome: 'success', }, - 'create keyspace produced expected span', - ); + db: { + type: 'cassandra', + statement: `CREATE KEYSPACE IF NOT EXISTS ${TEST_KEYSPACE} WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1 };`, + }, + }, + outcome: 'success', + }, + 'create keyspace produced expected span', + ); - t.deepEqual( - spans.shift(), - { - name: `USE ${TEST_KEYSPACE}`, - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - service: { - target: { - type: 'cassandra', - }, - }, - destination: { - service: { - type: '', - name: '', - resource: 'cassandra', - }, - }, - db: { - type: 'cassandra', - statement: `USE ${TEST_KEYSPACE}`, - }, + t.deepEqual( + spans.shift(), + { + name: `USE ${TEST_KEYSPACE}`, + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + service: { + target: { + type: 'cassandra', }, - outcome: 'success', }, - 'use keyspace produced expected span', - ); - - t.deepEqual( - spans.shift(), - { - name: 'CREATE TABLE IF', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - service: { - target: { - type: 'cassandra', - name: TEST_KEYSPACE, - }, - }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, - db: { - type: 'cassandra', - statement: `CREATE TABLE IF NOT EXISTS ${TEST_KEYSPACE}.${TEST_TABLE}(id uuid,text varchar,PRIMARY KEY(id));`, - instance: TEST_KEYSPACE, - }, + destination: { + service: { + type: '', + name: '', + resource: 'cassandra', }, - outcome: 'success', }, - 'create table produced expected span', - ); + db: { + type: 'cassandra', + statement: `USE ${TEST_KEYSPACE}`, + }, + }, + outcome: 'success', + }, + 'use keyspace produced expected span', + ); - t.deepEqual( - spans.shift(), - { - name: 'SELECT FROM system.local', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: 'SELECT key FROM system.local', - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, + t.deepEqual( + spans.shift(), + { + name: 'CREATE TABLE IF', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + service: { + target: { + type: 'cassandra', + name: TEST_KEYSPACE, }, - outcome: 'success', }, - 'execute with callback produced expected span', - ); - - if (TEST_USE_PROMISES) { - t.deepEqual( - spans.shift(), - { - name: 'SELECT FROM system.local', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: 'SELECT key FROM system.local', - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, - }, - outcome: 'success', + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, }, - 'execute with promise produced expected span', - ); - } + }, + db: { + type: 'cassandra', + statement: `CREATE TABLE IF NOT EXISTS ${TEST_KEYSPACE}.${TEST_TABLE}(id uuid,text varchar,PRIMARY KEY(id));`, + instance: TEST_KEYSPACE, + }, + }, + outcome: 'success', + }, + 'create table produced expected span', + ); - t.deepEqual( - spans.shift(), - { - name: 'Cassandra: Batch query', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: [ - `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, - `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, - ].join(';\n'), - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, + t.deepEqual( + spans.shift(), + { + name: 'SELECT FROM system.local', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: 'SELECT key FROM system.local', + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, }, - outcome: 'success', }, - 'batch with callback produced expected span', - ); + }, + outcome: 'success', + }, + 'execute with callback produced expected span', + ); - if (TEST_USE_PROMISES) { - t.deepEqual( - spans.shift(), - { - name: 'Cassandra: Batch query', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: [ - `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, - `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, - ].join(';\n'), - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, + if (TEST_USE_PROMISES) { + t.deepEqual( + spans.shift(), + { + name: 'SELECT FROM system.local', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: 'SELECT key FROM system.local', + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, }, - outcome: 'success', }, - 'batch with promise produced expected span', - ); - } + }, + outcome: 'success', + }, + 'execute with promise produced expected span', + ); + } - t.deepEqual( - spans.shift(), - { - name: 'SELECT FROM system.local', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: 'SELECT key FROM system.local', - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, - }, + t.deepEqual( + spans.shift(), + { + name: 'Cassandra: Batch query', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: [ + `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, + `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, + ].join(';\n'), + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, }, - outcome: 'success', }, - 'eachRow produced expected span', - ); + }, + outcome: 'success', + }, + 'batch with callback produced expected span', + ); - t.deepEqual( - spans.shift(), - { - name: 'SELECT FROM system.local', - type: 'db', - subtype: 'cassandra', - action: 'query', - context: { - db: { - type: 'cassandra', - statement: 'SELECT key FROM system.local', - instance: TEST_KEYSPACE, - }, - service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, - destination: { - service: { - type: '', - name: '', - resource: `cassandra/${TEST_KEYSPACE}`, - }, + if (TEST_USE_PROMISES) { + t.deepEqual( + spans.shift(), + { + name: 'Cassandra: Batch query', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: [ + `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, + `INSERT INTO ${TEST_TABLE} (id, text) VALUES (uuid(), ?)`, + ].join(';\n'), + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, }, }, - outcome: 'success', }, - 'stream produced expected span', - ); + outcome: 'success', + }, + 'batch with promise produced expected span', + ); + } - t.equal(spans.length, 0, 'all spans accounted for'); - }, - }, - { - name: 'cassandra-driver ESM', - script: 'fixtures/use-cassandra-driver.mjs', - cwd: __dirname, - timeout: 20000, // sanity guard on the test hanging - maxBuffer: 10 * 1024 * 1024, // This is big, but I don't ever want this to be a failure reason. - env: { - NODE_OPTIONS: - '--experimental-loader=../../../../loader.mjs --require=../../../../start.js', - TEST_DATACENTER, + t.deepEqual( + spans.shift(), + { + name: 'SELECT FROM system.local', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: 'SELECT key FROM system.local', + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, + }, + }, + }, + outcome: 'success', }, - versionRanges: { - node: '^16.9.0 || ^18.1.0 <20', - 'cassandra-driver': '>=4.7.0', + 'eachRow produced expected span', + ); + + t.deepEqual( + spans.shift(), + { + name: 'SELECT FROM system.local', + type: 'db', + subtype: 'cassandra', + action: 'query', + context: { + db: { + type: 'cassandra', + statement: 'SELECT key FROM system.local', + instance: TEST_KEYSPACE, + }, + service: { target: { type: 'cassandra', name: TEST_KEYSPACE } }, + destination: { + service: { + type: '', + name: '', + resource: `cassandra/${TEST_KEYSPACE}`, + }, + }, + }, + outcome: 'success', }, - verbose: true, - checkApmServer: (t, apmServer) => { - t.ok(apmServer.events[0].metadata, 'metadata'); - const events = sortApmEvents(apmServer.events); + 'stream produced expected span', + ); - // First the transaction. - t.ok(events[0].transaction, 'got the transaction'); - const tx = events.shift().transaction; - const connSpan = events.shift().span; - const querySpan = events.shift().span; + t.equal(spans.length, 0, 'all spans accounted for'); +} - t.equal(connSpan.parent_id, tx.id, 'span.parent_id'); - t.equal(connSpan.name, 'Cassandra: Connect', 'span.name'); - t.equal(querySpan.parent_id, tx.id, 'span.parent_id'); - t.equal(querySpan.name, 'SELECT FROM system.local', 'span.name'); - t.equal(events.length, 0, 'all events accounted for'); - }, - }, -]; +function checkApmServerEsm(t, apmServer) { + t.ok(apmServer.events[0].metadata, 'metadata'); + const events = sortApmEvents(apmServer.events); + + // First the transaction. + t.ok(events[0].transaction, 'got the transaction'); + const tx = events.shift().transaction; + const connSpan = events.shift().span; + const querySpan = events.shift().span; + + t.equal(connSpan.parent_id, tx.id, 'span.parent_id'); + t.equal(connSpan.name, 'Cassandra: Connect', 'span.name'); + t.equal(querySpan.parent_id, tx.id, 'span.parent_id'); + t.equal(querySpan.name, 'SELECT FROM system.local', 'span.name'); + t.equal(events.length, 0, 'all events accounted for'); +} test('cassandra-driver fixtures', (suite) => { runTestFixtures(suite, testFixtures); diff --git a/test/instrumentation/modules/elasticsearch.test.js b/test/instrumentation/modules/elasticsearch.test.js index 4ad82d7c59..eb161b0033 100644 --- a/test/instrumentation/modules/elasticsearch.test.js +++ b/test/instrumentation/modules/elasticsearch.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } process.env.ELASTIC_APM_TEST = true; diff --git a/test/instrumentation/modules/express-queue.test.js b/test/instrumentation/modules/express-queue.test.js index 973b4d30c7..64771b756a 100644 --- a/test/instrumentation/modules/express-queue.test.js +++ b/test/instrumentation/modules/express-queue.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP ${isExpressIncompat}`); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/express/basic.test.js b/test/instrumentation/modules/express/basic.test.js index 9dde1c4744..f308d66892 100644 --- a/test/instrumentation/modules/express/basic.test.js +++ b/test/instrumentation/modules/express/basic.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP ${isExpressIncompat}`); + process.exit(0); } var agent = require('../../../..').start({ @@ -509,7 +518,8 @@ test('expose app.use handle properties', function (t) { }); const handle = function (req, res) { - const stack = req.app._router.stack; + const router = req.app._router || req.app.router; // https://expressjs.com/en/guide/migrating-5.html#app.router + const stack = router.stack; const handle = stack[stack.length - 1].handle; t.ok(Array.isArray(handle.stack), 'expose stack array on handle'); diff --git a/test/instrumentation/modules/express/capture-exceptions-off.test.js b/test/instrumentation/modules/express/capture-exceptions-off.test.js index fff4d964ef..c1a4f7db89 100644 --- a/test/instrumentation/modules/express/capture-exceptions-off.test.js +++ b/test/instrumentation/modules/express/capture-exceptions-off.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP ${isExpressIncompat}`); + process.exit(0); } const agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/express/capture-exceptions-on.test.js b/test/instrumentation/modules/express/capture-exceptions-on.test.js index 76ad424837..8b8cd90f2d 100644 --- a/test/instrumentation/modules/express/capture-exceptions-on.test.js +++ b/test/instrumentation/modules/express/capture-exceptions-on.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP ${isExpressIncompat}`); + process.exit(0); } const agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/express/express-fixtures.test.js b/test/instrumentation/modules/express/express-fixtures.test.js index 1903e7bc45..25361a6ffc 100644 --- a/test/instrumentation/modules/express/express-fixtures.test.js +++ b/test/instrumentation/modules/express/express-fixtures.test.js @@ -10,7 +10,10 @@ const os = require('os'); const test = require('tape'); const { runTestFixtures, sortApmEvents } = require('../../../_utils'); -const { NODE_VER_RANGE_IITM } = require('../../../testconsts'); +const { + NODE_VER_RANGE_IITM, + NODE_VER_RANGE_IITM_GE18, +} = require('../../../testconsts'); const testFixtures = [ { @@ -25,46 +28,66 @@ const testFixtures = [ }, versionRanges: { node: NODE_VER_RANGE_IITM, + express: '^4.0.0', }, testOpts: { // The `express.static()` path config doesn't work on windows. Meh windows. skip: os.platform() === 'win32', }, verbose: true, - checkApmServer: (t, apmServer) => { - t.equal( - apmServer.events.length, - 3, - 'expected number of APM server events', - ); - const metadata = apmServer.events[0].metadata; - t.ok(metadata, 'metadata'); - t.equal( - metadata.service.framework.name, - 'express', - 'metadata.service.framework.name', - ); - - const events = sortApmEvents(apmServer.events); - let trans = events[0].transaction; - t.equal(trans.name, 'GET static file', 'transaction.name'); - - trans = events[1].transaction; - t.equal(trans.name, 'POST /hello/:name', 'transaction.name'); - t.equal( - trans.context.request.method, - 'POST', - 'transaction.context.request.method', - ); - t.equal( - trans.context.request.body, - JSON.stringify({ foo: 'bar' }), - 'transaction.context.request.body', - ); + checkApmServer, + }, + { + name: 'express@5 ESM', + script: '../fixtures/use-express.mjs', + cwd: __dirname, + env: { + NODE_OPTIONS: + '--experimental-loader=../../../../loader.mjs --require=../../../../start.js', + NODE_NO_WARNINGS: '1', // skip warnings about --experimental-loader + ELASTIC_APM_CAPTURE_BODY: 'all', }, + versionRanges: { + node: NODE_VER_RANGE_IITM_GE18, + express: '>=5', + }, + testOpts: { + // The `express.static()` path config doesn't work on windows. Meh windows. + skip: os.platform() === 'win32', + }, + verbose: true, + checkApmServer, }, ]; +function checkApmServer(t, apmServer) { + t.equal(apmServer.events.length, 3, 'expected number of APM server events'); + const metadata = apmServer.events[0].metadata; + t.ok(metadata, 'metadata'); + t.equal( + metadata.service.framework.name, + 'express', + 'metadata.service.framework.name', + ); + + const events = sortApmEvents(apmServer.events); + let trans = events[0].transaction; + t.equal(trans.name, 'GET static file', 'transaction.name'); + + trans = events[1].transaction; + t.equal(trans.name, 'POST /hello/:name', 'transaction.name'); + t.equal( + trans.context.request.method, + 'POST', + 'transaction.context.request.method', + ); + t.equal( + trans.context.request.body, + JSON.stringify({ foo: 'bar' }), + 'transaction.context.request.body', + ); +} + test('express fixtures', (suite) => { runTestFixtures(suite, testFixtures); suite.end(); diff --git a/test/instrumentation/modules/express/set-framework.test.js b/test/instrumentation/modules/express/set-framework.test.js index e834a62481..4f83307eb2 100644 --- a/test/instrumentation/modules/express/set-framework.test.js +++ b/test/instrumentation/modules/express/set-framework.test.js @@ -9,6 +9,15 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +const isExpressIncompat = require('../../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP ${isExpressIncompat}`); + process.exit(0); } const agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/fastify/async-await.test.js b/test/instrumentation/modules/fastify/async-await.test.js index 540003d189..73090316b1 100644 --- a/test/instrumentation/modules/fastify/async-await.test.js +++ b/test/instrumentation/modules/fastify/async-await.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } require('../../../..').start({ diff --git a/test/instrumentation/modules/fastify/set-framework.test.js b/test/instrumentation/modules/fastify/set-framework.test.js index 904faf0b76..5fd574e42c 100644 --- a/test/instrumentation/modules/fastify/set-framework.test.js +++ b/test/instrumentation/modules/fastify/set-framework.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/finalhandler.test.js b/test/instrumentation/modules/finalhandler.test.js index a41a4a9daf..a2822aa967 100644 --- a/test/instrumentation/modules/finalhandler.test.js +++ b/test/instrumentation/modules/finalhandler.test.js @@ -9,6 +9,28 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); +} + +// finalhandler@2.1.0 broke <=14 support (https://github.com/pillarjs/finalhandler/issues/87) +var finalhandlerVer = require('finalhandler/package.json').version; +var semver = require('semver'); +if ( + semver.gte(finalhandlerVer, '2.1.0') && + semver.lt(process.version, '16.0.0') +) { + console.log( + `# SKIP finalhandler@${finalhandlerVer} does not support node ${process.version}`, + ); + process.exit(); +} + +const isExpressIncompat = require('../../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP dependency issue: ${isExpressIncompat}`); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/generic-pool.test.js b/test/instrumentation/modules/generic-pool.test.js index 23aee93d99..49e522b6b6 100644 --- a/test/instrumentation/modules/generic-pool.test.js +++ b/test/instrumentation/modules/generic-pool.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/graphql.test.js b/test/instrumentation/modules/graphql.test.js index a3033dc0ca..9fad6114c0 100644 --- a/test/instrumentation/modules/graphql.test.js +++ b/test/instrumentation/modules/graphql.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/handlebars.test.js b/test/instrumentation/modules/handlebars.test.js index 73d91ff532..17036ecfce 100644 --- a/test/instrumentation/modules/handlebars.test.js +++ b/test/instrumentation/modules/handlebars.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } process.env.ELASTIC_APM_TEST = true; diff --git a/test/instrumentation/modules/hapi/hapi.test.js b/test/instrumentation/modules/hapi/hapi.test.js index 7cf304f8a7..1ddc842070 100644 --- a/test/instrumentation/modules/hapi/hapi.test.js +++ b/test/instrumentation/modules/hapi/hapi.test.js @@ -47,7 +47,7 @@ test('extract URL from request', function (t) { t.strictEqual(request.url.pathname, '/captureError'); t.strictEqual(request.url.search, '?foo=bar'); t.strictEqual(request.url.raw, '/captureError?foo=bar'); - t.strictEqual(request.url.hostname, 'localhost'); + t.strictEqual(request.url.hostname, '127.0.0.1'); t.strictEqual(request.url.port, String(server.info.port)); server.stop(noop); t.end(); @@ -57,7 +57,7 @@ test('extract URL from request', function (t) { var server = startServer(function (err, port) { t.error(err, 'no error from startServer'); - http.get('http://localhost:' + port + '/captureError?foo=bar'); + http.get('http://127.0.0.1:' + port + '/captureError?foo=bar'); }); }); @@ -71,7 +71,7 @@ test('route naming', function (t) { var server = startServer(function (err, port) { t.error(err); - http.get('http://localhost:' + port + '/hello', function (res) { + http.get('http://127.0.0.1:' + port + '/hello', function (res) { t.strictEqual(res.statusCode, 200); res.on('data', function (chunk) { t.strictEqual(chunk.toString(), 'hello world'); @@ -103,7 +103,7 @@ test('captureBody', function (t) { const cReq = http.request( { method: 'POST', - hostname: 'localhost', + hostname: '127.0.0.1', port, path: '/postSomeData', headers: { @@ -151,7 +151,7 @@ test('connectionless server error logging with Error', function (t) { return; } - t.plan(6); + t.plan(5); var customError = new Error('custom error'); @@ -163,8 +163,7 @@ test('connectionless server error logging with Error', function (t) { t.strictEqual(err, customError); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(opts.custom.data instanceof Error); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -182,7 +181,7 @@ test('connectionless server error logging with String', function (t) { return; } - t.plan(6); + t.plan(5); var customError = 'custom error'; @@ -194,8 +193,7 @@ test('connectionless server error logging with String', function (t) { t.strictEqual(err, customError); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(typeof opts.custom.data === 'string'); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -213,7 +211,7 @@ test('connectionless server error logging with Object', function (t) { return; } - t.plan(6); + t.plan(5); var customError = { error: 'I forgot to turn this into an actual Error', @@ -224,10 +222,9 @@ test('connectionless server error logging with Object', function (t) { agent.captureError = function (err, opts) { server.stop(noop); - t.strictEqual(err, 'hapi server emitted a log event tagged error'); + t.strictEqual(err, 'hapi server emitted a "log" event tagged "error"'); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); t.deepEqual(opts.custom.data, customError); }; @@ -240,7 +237,7 @@ test('connectionless server error logging with Object', function (t) { }); test('server error logging with Error', function (t) { - t.plan(6); + t.plan(5); var customError = new Error('custom error'); @@ -252,8 +249,7 @@ test('server error logging with Error', function (t) { t.strictEqual(err, customError); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(opts.custom.data instanceof Error); + t.strictEqual(opts.custom.data, undefined); }; var server = startServer(function (err) { @@ -264,7 +260,7 @@ test('server error logging with Error', function (t) { }); test('server error logging with Error does not affect event tags', function (t) { - t.plan(8); + t.plan(7); var customError = new Error('custom error'); @@ -276,8 +272,7 @@ test('server error logging with Error does not affect event tags', function (t) t.strictEqual(err, customError); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(opts.custom.data instanceof Error); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -299,7 +294,7 @@ test('server error logging with Error does not affect event tags', function (t) }); test('server error logging with String', function (t) { - t.plan(6); + t.plan(5); var customError = 'custom error'; @@ -311,8 +306,7 @@ test('server error logging with String', function (t) { t.strictEqual(err, customError); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(typeof opts.custom.data === 'string'); + t.strictEqual(opts.custom.data, undefined); }; var server = startServer(function (err) { @@ -323,7 +317,7 @@ test('server error logging with String', function (t) { }); test('server error logging with Object', function (t) { - t.plan(6); + t.plan(5); var customError = { error: 'I forgot to turn this into an actual Error', @@ -334,10 +328,9 @@ test('server error logging with Object', function (t) { agent.captureError = function (err, opts) { server.stop(noop); - t.strictEqual(err, 'hapi server emitted a log event tagged error'); + t.strictEqual(err, 'hapi server emitted a "log" event tagged "error"'); t.ok(opts.custom); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); t.deepEqual(opts.custom.data, customError); }; @@ -349,7 +342,7 @@ test('server error logging with Object', function (t) { }); test('request error logging with Error', function (t) { - t.plan(13); + t.plan(12); var customError = new Error('custom error'); @@ -364,8 +357,7 @@ test('request error logging with Error', function (t) { t.ok(opts.custom); t.ok(opts.request); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(opts.custom.data instanceof Error); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -383,7 +375,7 @@ test('request error logging with Error', function (t) { runServer(server, function (err) { t.error(err, 'start error'); - http.get('http://localhost:' + server.info.port + '/error', function (res) { + http.get('http://127.0.0.1:' + server.info.port + '/error', function (res) { t.strictEqual(res.statusCode, 200); res.resume().on('end', function () { @@ -394,7 +386,7 @@ test('request error logging with Error', function (t) { }); test('request error logging with Error does not affect event tags', function (t) { - t.plan(15); + t.plan(14); var customError = new Error('custom error'); @@ -409,8 +401,7 @@ test('request error logging with Error does not affect event tags', function (t) t.ok(opts.custom); t.ok(opts.request); t.deepEqual(opts.custom.tags, ['elastic-apm', 'error']); - t.false(opts.custom.internals); - t.ok(opts.custom.data instanceof Error); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -439,7 +430,7 @@ test('request error logging with Error does not affect event tags', function (t) t.deepEqual(event.tags, ['elastic-apm', 'error']); }); - http.get('http://localhost:' + server.info.port + '/error', function (res) { + http.get('http://127.0.0.1:' + server.info.port + '/error', function (res) { t.strictEqual(res.statusCode, 200); res.resume().on('end', function () { @@ -450,7 +441,7 @@ test('request error logging with Error does not affect event tags', function (t) }); test('request error logging with String', function (t) { - t.plan(13); + t.plan(12); var customError = 'custom error'; @@ -465,8 +456,7 @@ test('request error logging with String', function (t) { t.ok(opts.custom); t.ok(opts.request); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); - t.ok(typeof opts.custom.data === 'string'); + t.strictEqual(opts.custom.data, undefined); }; var server = makeServer(); @@ -484,7 +474,7 @@ test('request error logging with String', function (t) { runServer(server, function (err) { t.error(err, 'start error'); - http.get('http://localhost:' + server.info.port + '/error', function (res) { + http.get('http://127.0.0.1:' + server.info.port + '/error', function (res) { t.strictEqual(res.statusCode, 200); res.resume().on('end', function () { @@ -495,7 +485,7 @@ test('request error logging with String', function (t) { }); test('request error logging with Object', function (t) { - t.plan(13); + t.plan(12); var customError = { error: 'I forgot to turn this into an actual Error', @@ -508,11 +498,10 @@ test('request error logging with Object', function (t) { }); agent.captureError = function (err, opts) { - t.strictEqual(err, 'hapi server emitted a request event tagged error'); + t.strictEqual(err, 'hapi server emitted a "request" event tagged "error"'); t.ok(opts.custom); t.ok(opts.request); t.deepEqual(opts.custom.tags, ['error']); - t.false(opts.custom.internals); t.deepEqual(opts.custom.data, customError); }; @@ -531,7 +520,7 @@ test('request error logging with Object', function (t) { runServer(server, function (err) { t.error(err, 'start error'); - http.get('http://localhost:' + server.info.port + '/error', function (res) { + http.get('http://127.0.0.1:' + server.info.port + '/error', function (res) { t.strictEqual(res.statusCode, 200); res.resume().on('end', function () { @@ -556,7 +545,7 @@ test('error handling', function (t) { var server = startServer(function (err, port) { t.error(err); - http.get('http://localhost:' + port + '/error', function (res) { + http.get('http://127.0.0.1:' + port + '/error', function (res) { t.strictEqual(res.statusCode, 500); res.on('data', function (chunk) { var data = JSON.parse(chunk.toString()); @@ -574,16 +563,14 @@ test('error handling', function (t) { }); function makeServer(opts) { - // Specify 'localhost' to avoid Hapi default of '0.0.0.0' which ties to - // IPv4. We want a later HTTP client request using 'localhost' to work. var server; if (semver.satisfies(pkg.version, '<17')) { server = new Hapi.Server(); opts = opts || {}; - opts.host = opts.host || 'localhost'; + opts.host = opts.host || '127.0.0.1'; server.connection(opts); } else { - server = new Hapi.Server({ host: 'localhost' }); + server = new Hapi.Server({ host: '127.0.0.1' }); } return server; } diff --git a/test/instrumentation/modules/http/_echo_server.js b/test/instrumentation/modules/http/_echo_server.js index 437206d1ab..3549533c31 100644 --- a/test/instrumentation/modules/http/_echo_server.js +++ b/test/instrumentation/modules/http/_echo_server.js @@ -6,16 +6,27 @@ 'use strict'; +const fs = require('fs'); var http = require('http'); var https = require('https'); +const path = require('path'); var zlib = require('zlib'); -var pem = require('https-pem'); +const tlsOpts = { + cert: fs.readFileSync( + path.resolve(__dirname, '../../../fixtures/certs/cert.pem'), + ), + key: fs.readFileSync( + path.resolve(__dirname, '../../../fixtures/certs/key.pem'), + ), +}; process.title = 'echo-server'; var server = - process.argv[2] === 'https' ? https.createServer(pem) : http.createServer(); + process.argv[2] === 'https' + ? https.createServer(tlsOpts) + : http.createServer(); server.on('request', function (req, res) { var acceptEncoding = req.headers['accept-encoding'] || ''; diff --git a/test/instrumentation/modules/http/disabling.test.js b/test/instrumentation/modules/http/disabling.test.js index 8873bf9cc6..6c9832a00b 100644 --- a/test/instrumentation/modules/http/disabling.test.js +++ b/test/instrumentation/modules/http/disabling.test.js @@ -157,9 +157,8 @@ if (cluster.isMaster) { ), ); - const express = require('express'); - - const app = express(); + const mockExpressApp = require('../../../_mock_express_app'); + const app = mockExpressApp(); app.get('/', (req, res) => { res.end('hello'); diff --git a/test/instrumentation/modules/http/request.test.js b/test/instrumentation/modules/http/request.test.js index f77967de2b..28c218e42f 100644 --- a/test/instrumentation/modules/http/request.test.js +++ b/test/instrumentation/modules/http/request.test.js @@ -19,10 +19,9 @@ const agent = require('../../../..').start({ var http = require('http'); var test = require('tape'); -var express = require('express'); -var request = require('request'); var mockClient = require('../../../_mock_http_client'); +var mockExpressApp = require('../../../_mock_express_app'); var findObjInArray = require('../../../_utils').findObjInArray; test('request', function (t) { @@ -38,24 +37,25 @@ test('request', function (t) { t.strictEqual(root.outcome, 'success'); const span = findObjInArray(data.spans, 'transaction_id', root.id); t.strictEqual(span.outcome, 'success'); - t.strictEqual(span.name, 'GET localhost:' + server.address().port); + t.strictEqual(span.name, 'GET localhost:' + app._server.address().port); - server.close(); + app._server.close(); t.end(); }); - var app = express(); - var server = http.createServer(app); + var app = mockExpressApp(); app.get('/test', (req, res) => { res.end('hello'); }); app.get('/', (req, res) => { - request(`http://localhost:${req.socket.localPort}/test`).pipe(res); + http.get(`http://localhost:${req.socket.localPort}/test`, (cres) => { + cres.pipe(res); + }); }); - sendRequest(server); + sendRequest(app._server); }); test('Outcome', function (t) { @@ -68,14 +68,13 @@ test('Outcome', function (t) { t.strictEqual(root.outcome, 'failure'); const span = findObjInArray(data.spans, 'transaction_id', root.id); t.strictEqual(span.outcome, 'failure'); - t.strictEqual(span.name, 'GET localhost:' + server.address().port); + t.strictEqual(span.name, 'GET localhost:' + app._server.address().port); - server.close(); + app._server.close(); t.end(); }); - var app = express(); - var server = http.createServer(app); + var app = mockExpressApp(); app.get('/test', (req, res) => { res.statusCode = 500; @@ -83,10 +82,13 @@ test('Outcome', function (t) { }); app.get('/', (req, res) => { - request(`http://localhost:${req.socket.localPort}/test`).pipe(res); + http.get(`http://localhost:${req.socket.localPort}/test`, (cres) => { + res.statusCode = cres.statusCode; + cres.pipe(res); + }); }); - sendRequest(server); + sendRequest(app._server); }); function resetAgent(cb) { diff --git a/test/instrumentation/modules/http2.test.js b/test/instrumentation/modules/http2.test.js index f9831683b8..f156721bba 100644 --- a/test/instrumentation/modules/http2.test.js +++ b/test/instrumentation/modules/http2.test.js @@ -18,9 +18,9 @@ var ins = agent._instrumentation; var fs = require('fs'); var https = require('https'); var http2 = require('http2'); +const path = require('path'); var semver = require('semver'); -var pem = require('https-pem'); var test = require('tape'); var mockClient = require('../../_mock_http_client'); @@ -31,6 +31,13 @@ if (semver.satisfies(process.version, '8.x')) { process.exit(); } +const tlsOpts = { + cert: fs.readFileSync( + path.resolve(__dirname, '../../fixtures/certs/cert.pem'), + ), + key: fs.readFileSync(path.resolve(__dirname, '../../fixtures/certs/key.pem')), +}; + var isSecure = [false, true]; isSecure.forEach((secure) => { var method = secure ? 'createSecureServer' : 'createServer'; @@ -60,7 +67,7 @@ isSecure.forEach((secure) => { var port; var server = secure - ? http2.createSecureServer(pem, onRequest) + ? http2.createSecureServer(tlsOpts, onRequest) : http2.createServer(onRequest); var onError = (err) => t.error(err); @@ -90,7 +97,9 @@ isSecure.forEach((secure) => { }); var port; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -131,7 +140,9 @@ isSecure.forEach((secure) => { }); var port; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -179,7 +190,9 @@ isSecure.forEach((secure) => { }); var port; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -227,7 +240,9 @@ isSecure.forEach((secure) => { }); var port; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -274,7 +289,9 @@ isSecure.forEach((secure) => { var port; var client; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -417,7 +434,9 @@ isSecure.forEach((secure) => { }); var port; - var server = secure ? http2.createSecureServer(pem) : http2.createServer(); + var server = secure + ? http2.createSecureServer(tlsOpts) + : http2.createServer(); var onError = (err) => t.error(err); server.on('error', onError); @@ -491,7 +510,7 @@ test('handling HTTP/1.1 request to http2.createSecureServer with allowHTTP1:true }); var port; - var serverOpts = Object.assign({ allowHTTP1: true }, pem); + var serverOpts = Object.assign({ allowHTTP1: true }, tlsOpts); var server = http2.createSecureServer(serverOpts); server.on('request', function onRequest(req, res) { var trans = ins.currTransaction(); diff --git a/test/instrumentation/modules/ioredis.test.js b/test/instrumentation/modules/ioredis.test.js index 8ea3722fad..473c132ae2 100644 --- a/test/instrumentation/modules/ioredis.test.js +++ b/test/instrumentation/modules/ioredis.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/kafkajs/kafkajs.test.js b/test/instrumentation/modules/kafkajs/kafkajs.test.js index c3f5fb12bc..42184c03ab 100644 --- a/test/instrumentation/modules/kafkajs/kafkajs.test.js +++ b/test/instrumentation/modules/kafkajs/kafkajs.test.js @@ -10,6 +10,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const test = require('tape'); diff --git a/test/instrumentation/modules/koa-router/new-name.test.js b/test/instrumentation/modules/koa-router/new-name.test.js index 52cace26a8..ed0a9a43b0 100644 --- a/test/instrumentation/modules/koa-router/new-name.test.js +++ b/test/instrumentation/modules/koa-router/new-name.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } require('./shared')('@koa/router'); diff --git a/test/instrumentation/modules/koa-router/old-name.test.js b/test/instrumentation/modules/koa-router/old-name.test.js index bc3cf13d76..aa55d55fb1 100644 --- a/test/instrumentation/modules/koa-router/old-name.test.js +++ b/test/instrumentation/modules/koa-router/old-name.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } require('./shared')('koa-router'); diff --git a/test/instrumentation/modules/koa-router/shared.js b/test/instrumentation/modules/koa-router/shared.js index 170397c385..425b74ed89 100644 --- a/test/instrumentation/modules/koa-router/shared.js +++ b/test/instrumentation/modules/koa-router/shared.js @@ -19,10 +19,15 @@ module.exports = (moduleName) => { const routerVersion = require(`${moduleName}/package`).version; // koa-router >=11 requires Node.js >=12. - if ( - semver.lt(process.version, '12.0.0') && - semver.gte(routerVersion, '11.0.0') - ) { + let skip = + semver.lt(process.version, '12.0.0') && semver.gte(routerVersion, '11.0.0'); + // koa-router >=13 requires Node.js >=18. + skip = + skip || + (semver.lt(process.version, '18.0.0') && + semver.gte(routerVersion, '13.0.0')); + + if (skip) { // Skip out of this test. console.log( `# SKIP cannot test ${moduleName}@${routerVersion} with node ${process.version}`, diff --git a/test/instrumentation/modules/memcached.test.js b/test/instrumentation/modules/memcached.test.js index 3ce93b15b1..8308963229 100644 --- a/test/instrumentation/modules/memcached.test.js +++ b/test/instrumentation/modules/memcached.test.js @@ -10,6 +10,9 @@ if (process.platform === 'win32') { console.log('# SKIP memcached does not support Windows'); process.exit(); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/mimic-response.test.js b/test/instrumentation/modules/mimic-response.test.js index 2735f913a6..147fdf4b4b 100644 --- a/test/instrumentation/modules/mimic-response.test.js +++ b/test/instrumentation/modules/mimic-response.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/mongodb-core.test.js b/test/instrumentation/modules/mongodb-core.test.js index 4b1c621940..ceeb1c5be9 100644 --- a/test/instrumentation/modules/mongodb-core.test.js +++ b/test/instrumentation/modules/mongodb-core.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../..').start({ diff --git a/test/instrumentation/modules/mongodb/mongodb.test.js b/test/instrumentation/modules/mongodb/mongodb.test.js index 672f9600de..f33cc32ce4 100644 --- a/test/instrumentation/modules/mongodb/mongodb.test.js +++ b/test/instrumentation/modules/mongodb/mongodb.test.js @@ -17,6 +17,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const isMongodbIncompat = require('../../../_is_mongodb_incompat')(); diff --git a/test/instrumentation/modules/mysql/mysql.test.js b/test/instrumentation/modules/mysql/mysql.test.js index b23d55f341..609384deef 100644 --- a/test/instrumentation/modules/mysql/mysql.test.js +++ b/test/instrumentation/modules/mysql/mysql.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/mysql/pool-release-1.test.js b/test/instrumentation/modules/mysql/pool-release-1.test.js index 96cefa09f6..61103685d1 100644 --- a/test/instrumentation/modules/mysql/pool-release-1.test.js +++ b/test/instrumentation/modules/mysql/pool-release-1.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../../..').start({ diff --git a/test/instrumentation/modules/mysql2/mysql.test.js b/test/instrumentation/modules/mysql2/mysql.test.js index 989fff92a8..70476e6c82 100644 --- a/test/instrumentation/modules/mysql2/mysql.test.js +++ b/test/instrumentation/modules/mysql2/mysql.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const semver = require('semver'); diff --git a/test/instrumentation/modules/mysql2/pool-release-1.test.js b/test/instrumentation/modules/mysql2/pool-release-1.test.js index 7475e995fa..6fbc0b97d8 100644 --- a/test/instrumentation/modules/mysql2/pool-release-1.test.js +++ b/test/instrumentation/modules/mysql2/pool-release-1.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const semver = require('semver'); diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-page-handler.js b/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-page-handler.js index d9c20343bb..65801df323 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-page-handler.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-page-handler.js @@ -16,7 +16,7 @@ export async function getServerSideProps() { function AThrowInPageHandler({ currTime }) { // If this is called from a browser-side click of a , e.g. as on the // index.js page, then this function is executed client-side. If called - // via separately visiting http://localhost:3000/a-throw-in-page-handler + // via separately visiting http://127.0.0.1:3000/a-throw-in-page-handler // or via `curl -i ...`, then this is executed server-side. Only in the // latter case will the Node.js APM agent capture an error, of course. throw new Error('throw in page handler'); diff --git a/test/instrumentation/modules/next/next.test.js b/test/instrumentation/modules/next/next.test.js index 8768db49e5..5918a4cdd7 100644 --- a/test/instrumentation/modules/next/next.test.js +++ b/test/instrumentation/modules/next/next.test.js @@ -557,7 +557,7 @@ function waitForServerReady(t, cb) { const pollForServerReady = () => { const req = http.get( - 'http://localhost:3000/api/an-api-endpoint', + 'http://127.0.0.1:3000/api/an-api-endpoint', { agent: false, timeout: 500, @@ -611,7 +611,7 @@ async function makeTestRequest(t, testReq, buildId) { if (typeof reqOpts === 'function') { reqOpts = reqOpts(buildId); } - const url = `http://localhost:3000${reqOpts.path}`; + const url = `http://127.0.0.1:3000${reqOpts.path}`; t.comment( `makeTestRequest: ${testReq.testName} (${reqOpts.method} ${url})`, ); @@ -862,9 +862,9 @@ tape.test('-- prod server tests --', (suite) => { // the actual server because the `npm` process is gone. nextServerProc = spawn( path.normalize('./node_modules/.bin/next'), - // Be explicit about "localhost" here, otherwise with node v18 we can + // Be explicit about "127.0.0.1" here, otherwise with node v18 we can // get the server listening on IPv6 and the client connecting on IPv4. - ['start', '-H', 'localhost'], + ['start', '-H', '127.0.0.1'], { shell: os.platform() === 'win32', cwd: testAppDir, @@ -962,7 +962,7 @@ tape.test('-- dev server tests --', (suite) => { // See the warning notes for `spawn()` above. The same apply here. nextServerProc = spawn( path.normalize('./node_modules/.bin/next'), - ['dev', '-H', 'localhost'], + ['dev', '-H', '127.0.0.1'], { shell: os.platform() === 'win32', cwd: testAppDir, diff --git a/test/instrumentation/modules/pg/knex-no-span-stack-traces.test.js b/test/instrumentation/modules/pg/knex-no-span-stack-traces.test.js index 5ccff10ab9..6db7888cb2 100644 --- a/test/instrumentation/modules/pg/knex-no-span-stack-traces.test.js +++ b/test/instrumentation/modules/pg/knex-no-span-stack-traces.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } require('../../../..').start({ diff --git a/test/instrumentation/modules/pg/knex.test.js b/test/instrumentation/modules/pg/knex.test.js index 2294d7099a..bc4fd7709a 100644 --- a/test/instrumentation/modules/pg/knex.test.js +++ b/test/instrumentation/modules/pg/knex.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } process.env.ELASTIC_APM_TEST = true; diff --git a/test/instrumentation/modules/pg/pg.test.js b/test/instrumentation/modules/pg/pg.test.js index 7fd1e3d2ce..1b39641230 100644 --- a/test/instrumentation/modules/pg/pg.test.js +++ b/test/instrumentation/modules/pg/pg.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var agent = require('../../../..').start({ @@ -20,9 +23,10 @@ var agent = require('../../../..').start({ spanCompressionEnabled: false, }); +const { safeGetPackageVersion } = require('../../../_utils'); var semver = require('semver'); var once = require('once'); -var pgVersion = require('pg/package.json').version; +var pgVersion = safeGetPackageVersion('pg'); var test = require('tape'); var pg = require('pg'); diff --git a/test/instrumentation/modules/pug.test.js b/test/instrumentation/modules/pug.test.js index 22e907f1b3..6543e5ec33 100644 --- a/test/instrumentation/modules/pug.test.js +++ b/test/instrumentation/modules/pug.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } process.env.ELASTIC_APM_TEST = true; diff --git a/test/instrumentation/modules/redis-2-3.test.js b/test/instrumentation/modules/redis-2-3.test.js index 3c6ba3ff51..c267355582 100644 --- a/test/instrumentation/modules/redis-2-3.test.js +++ b/test/instrumentation/modules/redis-2-3.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } var redisVersion = require('redis/package.json').version; diff --git a/test/instrumentation/modules/redis-disabled.test.js b/test/instrumentation/modules/redis-disabled.test.js index 58f7f51195..c22e6f2a7f 100644 --- a/test/instrumentation/modules/redis-disabled.test.js +++ b/test/instrumentation/modules/redis-disabled.test.js @@ -11,6 +11,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const redisVersion = require('redis/package.json').version; diff --git a/test/instrumentation/modules/redis.test.js b/test/instrumentation/modules/redis.test.js index 9e277c8a08..2e5a70d162 100644 --- a/test/instrumentation/modules/redis.test.js +++ b/test/instrumentation/modules/redis.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const redisVersion = require('redis/package.json').version; diff --git a/test/instrumentation/modules/redis4-legacy.test.js b/test/instrumentation/modules/redis4-legacy.test.js index 1f96809845..df4bff93c7 100644 --- a/test/instrumentation/modules/redis4-legacy.test.js +++ b/test/instrumentation/modules/redis4-legacy.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } // this test file is about testing `legacyMode` diff --git a/test/instrumentation/modules/restify/basic.test.js b/test/instrumentation/modules/restify/basic.test.js index 8233507099..c956e70b15 100644 --- a/test/instrumentation/modules/restify/basic.test.js +++ b/test/instrumentation/modules/restify/basic.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const isRestifyIncompat = require('../../../_is_restify_incompat')(); diff --git a/test/instrumentation/modules/restify/set-framework.test.js b/test/instrumentation/modules/restify/set-framework.test.js index 1a6f273b62..a8c6db3dc5 100644 --- a/test/instrumentation/modules/restify/set-framework.test.js +++ b/test/instrumentation/modules/restify/set-framework.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const isRestifyIncompat = require('../../../_is_restify_incompat')(); diff --git a/test/instrumentation/modules/tedious.test.js b/test/instrumentation/modules/tedious.test.js index 86fc1aba0d..f80d9e4c1c 100644 --- a/test/instrumentation/modules/tedious.test.js +++ b/test/instrumentation/modules/tedious.test.js @@ -9,6 +9,9 @@ if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { console.log('# SKIP: GH Actions do not support docker services on Windows'); process.exit(0); +} else if (process.env.TEST_WITHOUT_SERVICES === 'true') { + console.log('# SKIP: env.TEST_WITHOUT_SERVICES=true'); + process.exit(0); } const agent = require('../../../').start({ @@ -28,7 +31,9 @@ if ( // tedious@11 and later depend on @azure/identity v1 or v2. As of // @azure/core-rest-pipeline@1.15.0 (a dep of @azure/identity), support for // Node.js <16 has been broken. - (semver.gte(tediousVer, '11.0.0') && semver.lt(process.version, '16.0.0')) + (semver.gte(tediousVer, '11.0.0') && semver.lt(process.version, '16.0.0')) || + // tedious@19 drops support for Node.js =1.0.0 <1.9.0' + versions: '>=1.0.0 <1.10.0' node: '>=8.0.0' commands: - node OTelBridgeNonRecordingSpan.test.js diff --git a/test/opentelemetry-bridge/OTelBridgeNonRecordingSpan.test.js b/test/opentelemetry-bridge/OTelBridgeNonRecordingSpan.test.js index eaacad4ed0..e8edd46597 100644 --- a/test/opentelemetry-bridge/OTelBridgeNonRecordingSpan.test.js +++ b/test/opentelemetry-bridge/OTelBridgeNonRecordingSpan.test.js @@ -78,6 +78,13 @@ tape.test('OTelBridgeNonRecordingSpan', (suite) => { 'setStatus', ); t.equal(nrsOTelSpan.updateName('anotherName'), nrsOTelSpan, 'updateName'); + const linkContext = { + traceId: '8b46594050c89c3d87248476ed8e0c57', + spanId: 'ffe4cfa94865ee2a', + traceFlags: otel.TraceFlags.SAMPLED, + }; + t.equal(nrsOTelSpan.addLink(linkContext), nrsOTelSpan, 'addLink'); + t.equal(nrsOTelSpan.addLinks([linkContext]), nrsOTelSpan, 'addLinks'); t.equal(nrsOTelSpan.end(), undefined, 'end'); t.equal(nrsOTelSpan.isRecording(), false, 'isRecording'); t.equal( diff --git a/test/opentelemetry-bridge/fixtures.test.js b/test/opentelemetry-bridge/fixtures.test.js index e121884316..e70941062c 100644 --- a/test/opentelemetry-bridge/fixtures.test.js +++ b/test/opentelemetry-bridge/fixtures.test.js @@ -376,6 +376,7 @@ const cases = [ 'sSetStatusChildERROR.outcome', ); + // Span#updateName t.strictEqual( findObjInArray( events, @@ -386,6 +387,23 @@ const cases = [ 'sUpdateName', ); + // Span#addLink, Span#addLinks + t.deepEqual( + findObjInArray(events, 'transaction.name', 'sAddLinks').transaction + .links, + [ + { + trace_id: '8b46594050c89c3d87248476ed8e0c57', + span_id: 'ffe4cfa94865ee2a', + }, + { + trace_id: '8b46594050c89c3d87248476ed8e0c57', + span_id: 'ffe4cfa94865ee2a', + }, + ], + 'sAddLinks links', + ); + // Span#end function spanEndTimeIsApprox(transOrSpanName, t = Date.now()) { const foundTrans = findObjInArray( diff --git a/test/opentelemetry-bridge/fixtures/interface-span.js b/test/opentelemetry-bridge/fixtures/interface-span.js index 0fb136c4d6..3998358ef4 100644 --- a/test/opentelemetry-bridge/fixtures/interface-span.js +++ b/test/opentelemetry-bridge/fixtures/interface-span.js @@ -169,6 +169,19 @@ sUpdateName.updateName('three'); sUpdateName.end(); sUpdateName.updateName('four'); // updateName after end should *not* take +// Span#addLink, Span#addLinks +const sAddLinks = tracer.startSpan('sAddLinks'); +const linkContext = { + traceId: '8b46594050c89c3d87248476ed8e0c57', + spanId: 'ffe4cfa94865ee2a', + traceFlags: otel.TraceFlags.SAMPLED, +}; +rv = sAddLinks.addLink({ context: linkContext }); +assert.strictEqual(rv, sAddLinks, 'addLink return value is the span'); +rv = sAddLinks.addLinks([{ context: linkContext }]); +assert.strictEqual(rv, sAddLinks, 'addLinks return value is the span'); +sAddLinks.end(); + // Span#end // Specify approximately "now" in each of the supported TimeInput formats. // OTel HrTime is `[, ]`. diff --git a/test/opentelemetry-bridge/package-lock.json b/test/opentelemetry-bridge/package-lock.json index 0d40942cb4..2e4913de02 100644 --- a/test/opentelemetry-bridge/package-lock.json +++ b/test/opentelemetry-bridge/package-lock.json @@ -8,13 +8,13 @@ "name": "opentelemetry-bridge-tests", "version": "1.0.0", "dependencies": { - "@opentelemetry/api": "^1.7.0" + "@opentelemetry/api": "^1.9.0" } }, "node_modules/@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "engines": { "node": ">=8.0.0" } @@ -22,9 +22,9 @@ }, "dependencies": { "@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" } } } diff --git a/test/opentelemetry-bridge/package.json b/test/opentelemetry-bridge/package.json index 52089a0c9b..bbecdc6893 100644 --- a/test/opentelemetry-bridge/package.json +++ b/test/opentelemetry-bridge/package.json @@ -3,6 +3,6 @@ "version": "1.0.0", "private": true, "dependencies": { - "@opentelemetry/api": "^1.7.0" + "@opentelemetry/api": "^1.9.0" } } diff --git a/test/opentelemetry-metrics/fixtures.test.js b/test/opentelemetry-metrics/fixtures.test.js index 2267518a0c..852c287812 100644 --- a/test/opentelemetry-metrics/fixtures.test.js +++ b/test/opentelemetry-metrics/fixtures.test.js @@ -112,13 +112,13 @@ async function checkEventsHaveTestMetrics(t, events, extraMetricNames = []) { // A histogram that we expect to have the APM agent default buckets. m = event.metricset.samples.test_histogram_defbuckets; t.equal(m.type, 'histogram', 'test_histogram_defbuckets.type'); - t.equal(m.counts.length, 3, 'test_histogram_defbuckets.counts'); + t.equal(m.counts.length, 2, 'test_histogram_defbuckets.counts'); // The test file recorded values of 2, 3, and 4. The expected converted values // are the midpoints between the default bucket boundaries. For example, // 3 is between bucket boundaries (2.82843, 4], whose midpoint is 3.414215. t.deepEqual( m.values, - [2.414215, 3.414215, 4.828425], + [1.7071049999999999, 3.414215], 'test_histogram_defbuckets.values', ); } @@ -141,13 +141,13 @@ async function checkEventsHaveTestMetrics(t, events, extraMetricNames = []) { // buckets in `[0, 1, 2, 3, 4, 5]`. After conversion to APM server // intake format, the values are the midpoints of those buckets. t.equal(m.counts.length, 3, 'test_histogram_confbuckets.counts'); - t.deepEqual(m.values, [2.5, 3.5, 4.5], 'test_histogram_confbuckets.values'); + t.deepEqual(m.values, [1.5, 2.5, 3.5], 'test_histogram_confbuckets.values'); } } async function checkHasPrometheusMetrics(t) { const { statusCode, body } = await undici.request( - 'http://localhost:9464/metrics', + 'http://127.0.0.1:9464/metrics', ); t.equal(statusCode, 200, 'prometheus exporter is still working'); const text = await body.text(); diff --git a/test/opentelemetry-metrics/fixtures/.tav.yml b/test/opentelemetry-metrics/fixtures/.tav.yml index a138bc2416..ce1519300d 100644 --- a/test/opentelemetry-metrics/fixtures/.tav.yml +++ b/test/opentelemetry-metrics/fixtures/.tav.yml @@ -1,5 +1,5 @@ "@opentelemetry/api": - versions: '>=1.3.0 <1.9.0' + versions: '>=1.3.0 <1.10.0' node: '>=14.0.0' commands: - node ../fixtures.test.js diff --git a/test/opentelemetry-metrics/fixtures/package-lock.json b/test/opentelemetry-metrics/fixtures/package-lock.json index d0606b54cf..cef242197a 100644 --- a/test/opentelemetry-metrics/fixtures/package-lock.json +++ b/test/opentelemetry-metrics/fixtures/package-lock.json @@ -8,41 +8,42 @@ "name": "otel-metrics-fixtures", "version": "1.0.0", "dependencies": { - "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-prometheus": ">=0.41.2 <2", - "@opentelemetry/sdk-metrics": "^1.24.1" + "@opentelemetry/sdk-metrics": "^1.30.0" } }, "node_modules/@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "engines": { "node": ">=8.0.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.1.tgz", - "integrity": "sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.9.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.51.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.51.1.tgz", - "integrity": "sha512-c8TrTlLm9JJRIHW6MtFv6ESoZRgXBXD/YrTRYylWiyYBOVbYHo1c5Qaw/j/thXDhkmYOYAn4LAhJZpLl5gBFEQ==", + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.57.2.tgz", + "integrity": "sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ==", + "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "@opentelemetry/sdk-metrics": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" }, "engines": { "node": ">=14" @@ -52,102 +53,90 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.1.tgz", - "integrity": "sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dependencies": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.9.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.1.tgz", - "integrity": "sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", "dependencies": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.9.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.1.tgz", - "integrity": "sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==", + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "engines": { "node": ">=14" } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" } }, "dependencies": { "@opentelemetry/api": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.8.0.tgz", - "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, "@opentelemetry/core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.24.1.tgz", - "integrity": "sha512-wMSGfsdmibI88K9wB498zXY04yThPexo8jvwNNlm542HZB7XrrMRBbAyKJqG8qDRJwIBdBrPMi4V9ZPW/sqrcg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "requires": { - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/semantic-conventions": "1.28.0" } }, "@opentelemetry/exporter-prometheus": { - "version": "0.51.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.51.1.tgz", - "integrity": "sha512-c8TrTlLm9JJRIHW6MtFv6ESoZRgXBXD/YrTRYylWiyYBOVbYHo1c5Qaw/j/thXDhkmYOYAn4LAhJZpLl5gBFEQ==", + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.57.2.tgz", + "integrity": "sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ==", "requires": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "@opentelemetry/sdk-metrics": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/sdk-metrics": "1.30.1" } }, "@opentelemetry/resources": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.24.1.tgz", - "integrity": "sha512-cyv0MwAaPF7O86x5hk3NNgenMObeejZFLJJDVuSeSMIsknlsj3oOZzRv3qSzlwYomXsICfBeFFlxwHQte5mGXQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "requires": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/semantic-conventions": "1.24.1" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" } }, "@opentelemetry/sdk-metrics": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.24.1.tgz", - "integrity": "sha512-FrAqCbbGao9iKI+Mgh+OsC9+U2YMoXnlDHe06yH7dvavCKzE3S892dGtX54+WhSFVxHR/TMRVJiK/CV93GR0TQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", + "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", "requires": { - "@opentelemetry/core": "1.24.1", - "@opentelemetry/resources": "1.24.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1" } }, "@opentelemetry/semantic-conventions": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.24.1.tgz", - "integrity": "sha512-VkliWlS4/+GHLLW7J/rVBA00uXus1SWvwFvcUDxDwmFxYfg/2VI6ekwdXS28cjI8Qz2ky2BzG8OUHo+WeYIWqw==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==" } } } diff --git a/test/opentelemetry-metrics/fixtures/package.json b/test/opentelemetry-metrics/fixtures/package.json index 72eab99e85..8c10129770 100644 --- a/test/opentelemetry-metrics/fixtures/package.json +++ b/test/opentelemetry-metrics/fixtures/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@opentelemetry/api": "^1.3.0", + "@opentelemetry/api": "^1.9.0", "@opentelemetry/exporter-prometheus": ">=0.41.2 <2", - "@opentelemetry/sdk-metrics": "^1.24.1" + "@opentelemetry/sdk-metrics": "^1.30.0" } } diff --git a/test/opentelemetry-metrics/fixtures/use-just-otel-sdk.js b/test/opentelemetry-metrics/fixtures/use-just-otel-sdk.js index 5517003948..078c32f56e 100644 --- a/test/opentelemetry-metrics/fixtures/use-just-otel-sdk.js +++ b/test/opentelemetry-metrics/fixtures/use-just-otel-sdk.js @@ -8,7 +8,7 @@ // Run without the APM agent this script will export metrics via a Prometheus // endpoint: -// curl -i http://localhost:9464/metrics +// curl -i http://127.0.0.1:9464/metrics // // With the APM agent running we also expect periodic metricsets sent to APM // server, because the agent will add its MetricReader to the created @@ -21,7 +21,7 @@ const { } = require('@opentelemetry/sdk-metrics'); const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); -const exporter = new PrometheusExporter({ host: 'localhost' }); +const exporter = new PrometheusExporter({ host: '127.0.0.1' }); const meterProvider = new MeterProvider({ views: [ new View({ diff --git a/test/opentelemetry-metrics/fixtures/use-otel-api-with-registered-meter-provider.js b/test/opentelemetry-metrics/fixtures/use-otel-api-with-registered-meter-provider.js index 42c28d2a33..b0231d3e70 100644 --- a/test/opentelemetry-metrics/fixtures/use-otel-api-with-registered-meter-provider.js +++ b/test/opentelemetry-metrics/fixtures/use-otel-api-with-registered-meter-provider.js @@ -8,7 +8,7 @@ // Run without the APM agent this script will export metrics via a Prometheus // endpoint: -// curl -i http://localhost:9464/metrics +// curl -i http://127.0.0.1:9464/metrics // // With the APM agent running we also expect periodic metricsets sent to APM // server, because the agent will add its MetricReader to the created @@ -22,7 +22,7 @@ const otel = require('@opentelemetry/api'); const { MeterProvider } = require('@opentelemetry/sdk-metrics'); const { PrometheusExporter } = require('@opentelemetry/exporter-prometheus'); -const exporter = new PrometheusExporter({ host: 'localhost' }); +const exporter = new PrometheusExporter({ host: '127.0.0.1' }); const meterProvider = new MeterProvider(); meterProvider.addMetricReader(exporter); otel.metrics.setGlobalMeterProvider(meterProvider); diff --git a/test/sanitize-field-names/_shared.js b/test/sanitize-field-names/_shared.js index 21fde0c9bf..62ecf36759 100644 --- a/test/sanitize-field-names/_shared.js +++ b/test/sanitize-field-names/_shared.js @@ -5,6 +5,8 @@ */ 'use strict'; + +const http = require('http'); const querystring = require('querystring'); const mockClient = require('../_mock_http_client'); @@ -94,6 +96,7 @@ function createAgentConfig(values = {}) { metricsInterval: 0, centralConfig: false, captureBody: 'all', + apmServerVersion: '8.17.0', }; const agentConfig = Object.assign(values, defaultAgentConfig); @@ -114,9 +117,42 @@ function getBodyAsObject(string) { } } +/** + * Convenience function to make an form-encoded HTTP POST request and callback + * with the body, `cb(null, res, body)`. + */ +function requestPost(url, headers, form, cb) { + const u = new URL(url); + const req = http.request( + { + method: 'POST', + hostname: u.hostname, + port: u.port, + path: u.pathname + u.search, + headers: Object.assign( + { 'content-type': 'application/x-www-form-urlencoded' }, + headers, + ), + }, + (res) => { + const chunks = []; + res.on('data', (chunk) => { + chunks.push(chunk); + }); + res.on('end', () => { + const body = Buffer.concat(chunks).toString('utf8'); + cb(null, res, body); + }); + }, + ); + req.write(querystring.encode(form)); + req.end(); +} + module.exports = { createAgentConfig, getBodyAsObject, + requestPost, resetAgent, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, diff --git a/test/sanitize-field-names/express.test.js b/test/sanitize-field-names/express.test.js index d276963b32..7d75faf57e 100644 --- a/test/sanitize-field-names/express.test.js +++ b/test/sanitize-field-names/express.test.js @@ -5,9 +5,17 @@ */ 'use strict'; + +const isExpressIncompat = require('../_is_express_incompat')(); +if (isExpressIncompat) { + console.log(`# SKIP: ${isExpressIncompat}`); + process.exit(0); +} + const { createAgentConfig } = require('./_shared'); const agent = require('../..').start(createAgentConfig()); const { + requestPost, resetAgent, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, @@ -15,7 +23,6 @@ const { } = require('./_shared'); const test = require('tape'); -const request = require('request'); const express = require('express'); const bodyParser = require('body-parser'); const fixtures = require('./_fixtures'); @@ -52,21 +59,13 @@ function runTest( }); const server = app.listen(0, '0.0.0.0', () => { - const url = `http://${server.address().address}:${ - server.address().port - }/test`; - request.post( - url, - { - form: formFields, - headers: requestHeaders, - }, - function (error, response, body) { - t.error(error); - t.ok(body, 'received response'); - t.end(); - }, - ); + const addr = server.address(); + const url = `http://${addr.address}:${addr.port}/test`; + requestPost(url, requestHeaders, formFields, (err, _res, body) => { + t.error(err); + t.ok(body, 'received response'); + t.end(); + }); }); const done = () => { diff --git a/test/sanitize-field-names/fastify.test.js b/test/sanitize-field-names/fastify.test.js index f284704d2b..1136faef67 100644 --- a/test/sanitize-field-names/fastify.test.js +++ b/test/sanitize-field-names/fastify.test.js @@ -15,13 +15,13 @@ if (isFastifyIncompat) { } const { + requestPost, resetAgent, assertFormsWithFixture, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, } = require('./_shared'); const test = require('tape'); -const request = require('request'); const fastify = require('fastify'); const fastifyFormbody = require('@fastify/formbody'); const fixtures = require('./_fixtures'); @@ -64,20 +64,13 @@ function runTest( throw err; } const url = `${address}/test`; - request.post( - url, - { - form: formFields, - headers: requestHeaders, - }, - function (error, response, body) { - if (error) { - t.fail(error); - } - t.ok(body, 'received response'); - t.end(); - }, - ); + requestPost(url, requestHeaders, formFields, (err, _res, body) => { + if (err) { + t.fail(err); + } + t.ok(body, 'received response'); + t.end(); + }); }); const done = () => { diff --git a/test/sanitize-field-names/hapi.test.js b/test/sanitize-field-names/hapi.test.js index 937f5d4667..469da53ca8 100644 --- a/test/sanitize-field-names/hapi.test.js +++ b/test/sanitize-field-names/hapi.test.js @@ -7,6 +7,7 @@ 'use strict'; const { + requestPost, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, assertFormsWithFixture, @@ -22,7 +23,6 @@ if (isHapiIncompat()) { } const test = require('tape'); -const request = require('request'); const Hapi = require('@hapi/hapi'); const fixtures = require('./_fixtures'); @@ -64,7 +64,7 @@ async function runTest( agent._config(agentConfig); const server = Hapi.server({ port: 0, - host: 'localhost', + host: '127.0.0.1', }); // resets agent values for tests. Callback fires @@ -96,18 +96,11 @@ async function runTest( await server.start(); const url = server.info.uri + '/test'; - request.post( - url, - { - form: formFields, - headers: requestHeaders, - }, - function (error, response, body) { - if (error) { - t.fail(error); - } - t.ok(body, 'received response'); - t.end(); - }, - ); + requestPost(url, requestHeaders, formFields, (err, _res, body) => { + if (err) { + t.fail(err); + } + t.ok(body, 'received response'); + t.end(); + }); } diff --git a/test/sanitize-field-names/koa.test.js b/test/sanitize-field-names/koa.test.js index 0e7d2fb9b1..eba2bc54b1 100644 --- a/test/sanitize-field-names/koa.test.js +++ b/test/sanitize-field-names/koa.test.js @@ -8,12 +8,12 @@ const { createAgentConfig } = require('./_shared'); const agent = require('../..').start(createAgentConfig()); const { + requestPost, resetAgent, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, } = require('./_shared'); const test = require('tape'); -const request = require('request'); const Koa = require('koa'); const koaBodyparser = require('koa-bodyparser'); const fixtures = require('./_fixtures'); @@ -83,19 +83,12 @@ function runTest( const url = `http://${server.address().address}:${ server.address().port }/test`; - request.post( - url, - { - form: formFields, - headers: requestHeaders, - }, - function (error, response, body) { - if (error) { - t.fail(error); - } - t.ok(body, 'received response'); - t.end(); - }, - ); + requestPost(url, requestHeaders, formFields, (err, _res, body) => { + if (err) { + t.fail(err); + } + t.ok(body, 'received response'); + t.end(); + }); }); } diff --git a/test/sanitize-field-names/restify.test.js b/test/sanitize-field-names/restify.test.js index d9120f38b7..43191bd35e 100644 --- a/test/sanitize-field-names/restify.test.js +++ b/test/sanitize-field-names/restify.test.js @@ -15,13 +15,13 @@ if (isRestifyIncompat) { const { createAgentConfig } = require('./_shared'); const agent = require('../..').start(createAgentConfig()); const { + requestPost, resetAgent, assertRequestHeadersWithFixture, assertResponseHeadersWithFixture, assertFormsWithFixture, } = require('./_shared'); const test = require('tape'); -const request = require('request'); const restify = require('restify'); const fixtures = require('./_fixtures'); @@ -93,19 +93,12 @@ function runTest( server.listen(0, '0.0.0.0', () => { const url = `${server.url}/test`; - request.post( - url, - { - form: formFields, - headers: requestHeaders, - }, - function (error, response, body) { - if (error) { - t.fail(error); - } - t.ok(body, 'received response'); - t.end(); - }, - ); + requestPost(url, requestHeaders, formFields, (err, _res, body) => { + if (err) { + t.fail(err); + } + t.ok(body, 'received response'); + t.end(); + }); }); } diff --git a/test/script/docker/run_tests.sh b/test/script/docker/run_tests.sh index 6914f9ec09..754fdd8576 100755 --- a/test/script/docker/run_tests.sh +++ b/test/script/docker/run_tests.sh @@ -9,28 +9,20 @@ fi npm_cache="$HOME/.npm" docker_npm_cache="/home/node/.npm" -nyc_output=`pwd`"/.nyc_output" -docker_nyc_output="/app/.nyc_output" -test_output=`pwd`"/test_output" -docker_test_output="/app/test_output" NODE_VERSION=$1 if [[ ! -z $2 ]]; then TAV_MODULES=`echo "$2" | sed -e 's/\+/,/g'` CMD='npm run test:tav' -elif [[ -n $COVERAGE ]]; then - CMD='npm run coverage' else CMD='npm test' fi -NODE_VERSION=${1} docker-compose --no-ansi --log-level ERROR -f ./test/docker-compose.yml -f ./test/docker-compose.ci.yml run \ +NODE_VERSION=${1} docker compose --no-ansi --log-level ERROR -f ./test/docker-compose.yml -f ./test/docker-compose.ci.yml run \ -e NODE_VERSION=${NODE_VERSION} \ -e TAV=${TAV_MODULES} \ -e CI=true \ -v ${npm_cache}:${docker_npm_cache} \ - -v ${nyc_output}:${docker_nyc_output} \ - -v ${test_output}:${docker_test_output} \ -v "$(pwd)":/app \ -w /app \ --rm node_tests \ @@ -41,4 +33,4 @@ NODE_VERSION=${1} docker-compose --no-ansi --log-level ERROR -f ./test/docker-co npm --version ${CMD}" -NODE_VERSION=${1} docker-compose --no-ansi --log-level ERROR -f ./test/docker-compose.yml -f ./test/docker-compose.ci.yml down -v +NODE_VERSION=${1} docker compose --no-ansi --log-level ERROR -f ./test/docker-compose.yml -f ./test/docker-compose.ci.yml down -v diff --git a/test/script/run_tests.sh b/test/script/run_tests.sh index 6f1a4107da..494e248ee4 100755 --- a/test/script/run_tests.sh +++ b/test/script/run_tests.sh @@ -45,24 +45,7 @@ setup_env () { run_test_suite () { npm run test:deps - # If running in CI, then output .tap files and covert them to JUnit - # format for test reporting. - local testArgs="" - if [[ -n "$CI" ]]; then - rm -rf ./test_output - mkdir ./test_output - testArgs="-o ./test_output" - fi - - if [[ -n "$COVERAGE" ]]; then - nyc node test/test.js $testArgs - else - node test/test.js $testArgs - fi - - if [[ -n "$CI" ]]; then - ls test_output/*.tap | while read f; do cat $f | ./node_modules/.bin/tap-junit > $f.junit.xml; done - fi + node test/test.js if [[ $major_node_version -gt 14 ]] || [[ $major_node_version -eq 14 && $minor_node_version -ge 17 ]]; then npm run test:types # typescript@5.1.0 engines.node is >=14.17 @@ -107,7 +90,7 @@ then else # No arguments was given. Let's just assume that the user wants to # spin up all dependencies inside Docker and run the tests locally - services=$(docker-compose -f ./test/docker-compose.yml config --services) + services=$(docker compose -f ./test/docker-compose.yml config --services) fi service_arr=( $services ) @@ -123,11 +106,11 @@ then elif [[ $healthy -lt $expected_healthy || $containers -lt $expected_containers ]] then finish () { - docker-compose -f ./test/docker-compose.yml down + docker compose -f ./test/docker-compose.yml down } trap finish EXIT - docker-compose -f ./test/docker-compose.yml up -d $services + docker compose -f ./test/docker-compose.yml up -d $services wait_for_healthy fi diff --git a/test/spanStackTraceMinDuration.test.js b/test/spanStackTraceMinDuration.test.js index 1afa88dbce..dcaee70346 100644 --- a/test/spanStackTraceMinDuration.test.js +++ b/test/spanStackTraceMinDuration.test.js @@ -63,7 +63,7 @@ tape.test( t.ok(data.stacktrace, 'stacktrace set'); t.end(); }); - }, 101); + }, 200); }, ); diff --git a/test/start/file/elastic-apm-node.js b/test/start/file/elastic-apm-node.js index 0ca7eeb99c..a3ceb5e2bc 100644 --- a/test/start/file/elastic-apm-node.js +++ b/test/start/file/elastic-apm-node.js @@ -7,5 +7,6 @@ 'use strict' module.exports = { - serviceName: 'from-file' + serviceName: 'from-file', + active: false } diff --git a/test/start/file/test.test.js b/test/start/file/test.test.js index 925299ff12..0c2deed6bf 100644 --- a/test/start/file/test.test.js +++ b/test/start/file/test.test.js @@ -17,7 +17,17 @@ var agent = require('../../..').start({ const tape = require('tape'); -tape('from-file serviceName test', function (t) { - t.equals(agent._conf.serviceName, 'from-file'); +tape('from-file configuration test', function (t) { + t.equals( + agent._conf.serviceName, + 'from-file', + 'serviceName comes from config file', + ); + t.equals( + agent._conf.active, + false, + 'false values from config file override defaults', + ); + t.equals(agent._conf.captureBody, 'off', 'existing defaults are preserved'); t.end(); }); diff --git a/test/testconsts.js b/test/testconsts.js index 8209609b40..c670018011 100644 --- a/test/testconsts.js +++ b/test/testconsts.js @@ -22,6 +22,7 @@ const os = require('os'); const NODE_VER_RANGE_IITM = '^12.20.0 || ^14.13.1 || ^16.0.0 || ^18.1.0 || >=20.2.0'; const NODE_VER_RANGE_IITM_GE14 = '^14.13.1 || ^16.0.0 || ^18.1.0 || >=20.2.0'; // NODE_VER_RANGE_IITM minus node v12 +const NODE_VER_RANGE_IITM_GE18 = '^18.1.0 || >=20.2.0'; // NODE_VER_RANGE_IITM minus node v12, v14 & v16 // This can be passed as tape test options for tests that are timing sensitive, // to *skip* those tests on Windows CI. @@ -35,5 +36,6 @@ const TIMING_SENSITIVE_TEST_OPTS = { module.exports = { NODE_VER_RANGE_IITM, NODE_VER_RANGE_IITM_GE14, + NODE_VER_RANGE_IITM_GE18, TIMING_SENSITIVE_TEST_OPTS, }; diff --git a/test/types/index.ts b/test/types/index.ts index fbcd03cd5f..e71936eb2a 100644 --- a/test/types/index.ts +++ b/test/types/index.ts @@ -192,6 +192,11 @@ apm.logger.fatal('') trans.startSpan('foo', 'type', 'subtype', { exitSpan: true }) trans.startSpan('foo', { links: [{ context: '00-12345678901234567890123456789012-1234567890123456-01' }] }) + trans.addLink({ context: '00-12345678901234567890123456789012-1234567890123456-01' }) + trans.addLink({ context: { traceId: '12345678901234567890123456789012', spanId: '1234567890123456' }}) + trans.addLinks([{ context: '00-12345678901234567890123456789012-1234567890123456-01' }]) + trans.addLinks([{ context: { traceId: '12345678901234567890123456789012', spanId: '1234567890123456' }}]) + function ensureParentId (id: string) {} ensureParentId(trans.ensureParentId()) @@ -225,6 +230,11 @@ apm.logger.fatal('') span.setServiceTarget(null, null) span.setServiceTarget() + span.addLink({ context: '00-12345678901234567890123456789012-1234567890123456-01' }) + span.addLink({ context: { traceId: '12345678901234567890123456789012', spanId: '1234567890123456' }}) + span.addLinks([{ context: '00-12345678901234567890123456789012-1234567890123456-01' }]) + span.addLinks([{ context: { traceId: '12345678901234567890123456789012', spanId: '1234567890123456' }}]) + span.end() span.end(42) } diff --git a/updatecli-compose.yaml b/updatecli-compose.yaml new file mode 100644 index 0000000000..953f2917bc --- /dev/null +++ b/updatecli-compose.yaml @@ -0,0 +1,25 @@ +# Config file for `updatecli compose ...`. +# https://www.updatecli.io/docs/core/compose/ +policies: + - name: Handle apm-data server specs + policy: ghcr.io/elastic/oblt-updatecli-policies/apm/apm-data-spec:0.6.0@sha256:c0bbdec23541bed38df1342c95aeb601530a113db1ff11715c1c7616ed5e9e8b + values: + - .ci/updatecli/values.d/scm.yml + - .ci/updatecli/values.d/apm-data-spec.yml + + - name: Handle apm json specs + policy: ghcr.io/elastic/oblt-updatecli-policies/apm/apm-json-specs:0.6.0@sha256:e5a74c159ceed02fd20515ea76fa25ff81e3ccf977e74e636f9973db86aa52a5 + values: + - .ci/updatecli/values.d/scm.yml + - .ci/updatecli/values.d/apm-json-specs.yml + + - name: Update Updatecli policies + policy: ghcr.io/updatecli/policies/autodiscovery/updatecli:0.8.0@sha256:99e9e61b501575c2c176c39f2275998d198b590a3f6b1fe829f7315f8d457e7f + values: + - .ci/updatecli/values.d/scm.yml + - .ci/updatecli/values.d/update-compose.yml + + - name: Update Updatecli version + policy: ghcr.io/elastic/oblt-updatecli-policies/updatecli/version:0.2.0@sha256:013a37ddcdb627c46e7cba6fb9d1d7bc144584fa9063843ae7ee0f6ef26b4bea + values: + - .ci/updatecli/values.d/scm.yml \ No newline at end of file