diff --git a/.ci/docker/docker-compose-all.yml b/.ci/docker/docker-compose-all.yml index 57bbdbf5001..1799c7f5427 100644 --- a/.ci/docker/docker-compose-all.yml +++ b/.ci/docker/docker-compose-all.yml @@ -84,3 +84,5 @@ volumes: driver: local nodekafkadata: driver: local + nodezookeeperdata: + driver: local diff --git a/.ci/docker/docker-compose-edge.yml b/.ci/docker/docker-compose-edge.yml index c53de517b92..baa6ab01359 100644 --- a/.ci/docker/docker-compose-edge.yml +++ b/.ci/docker/docker-compose-edge.yml @@ -41,6 +41,10 @@ services: extends: file: docker-compose.yml service: kafka + zookeeper: + extends: + file: docker-compose.yml + service: zookeeper node_tests: extends: file: docker-compose-node-edge-test.yml @@ -84,3 +88,5 @@ volumes: driver: local nodekafkadata: driver: local + nodezookeeperdata: + driver: local diff --git a/.ci/docker/docker-compose-kafka.yml b/.ci/docker/docker-compose-kafka.yml index 3ae3e159f20..0709d8e0412 100644 --- a/.ci/docker/docker-compose-kafka.yml +++ b/.ci/docker/docker-compose-kafka.yml @@ -16,10 +16,8 @@ services: file: docker-compose-node-test.yml service: node_tests depends_on: - - kafka - # TODO: uncomment this if health_check is necessary - # kafka: - # condition: service_healthy + kafka: + condition: service_healthy volumes: nodekafkadata: diff --git a/.ci/docker/docker-compose.yml b/.ci/docker/docker-compose.yml index e14c125b092..cf1e6555b07 100644 --- a/.ci/docker/docker-compose.yml +++ b/.ci/docker/docker-compose.yml @@ -32,6 +32,7 @@ services: mssql: image: mcr.microsoft.com/mssql/server + platform: linux/amd64 environment: - ACCEPT_EULA=Y - SA_PASSWORD=Very(!)Secure @@ -149,6 +150,13 @@ services: - nodezookeeperdata:/bitnami environment: - ALLOW_ANONYMOUS_LOGIN=yes + healthcheck: + # 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 kafka: # https://hub.docker.com/r/bitnami/kafka/tags @@ -168,14 +176,12 @@ services: - KAFKA_CFG_DELETE_TOPIC_ENABLE=true depends_on: - zookeeper - # TODO: maybe not necessary but figure out how to do this healthcheck: - # use netcat to check tcp connection available - # test: nc -z localhost 9093 || exit -1 - # start_period: 15s - # interval: 5s - # timeout: 10s - # retries: 5 + # 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 + timeout: 10s + retries: 5 volumes: nodepgdata: diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 80cdb0a27f7..00000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,111 +0,0 @@ -// `npx eslint --print-config index.js` to print calculated config. -{ - "root": true, - "parserOptions": { - "ecmaVersion": 2022, // Top-level await, etc. - "sourceType": "module", - "ecmaFeatures": { - } - }, - "env": { - "node": true, - "es2022": true // Defines `Promise`, etc. - }, - "extends": [ - "eslint:recommended", - "plugin:prettier/recommended" - ], - "plugins": [ - "import", - "license-header", - "prettier", - "promise", - "n" - ], - "rules": { - "license-header/header": ["error", "./dev-utils/license-header.js"], - - // Retoring some config from standardjs that we want to maintain at least - // for now -- to assist with transition to prettier. - "no-unused-vars": [ // See taav for possible better 'no-unused-vars' rule. - "error", - { - "args": "none", - "caughtErrors": "none", - "ignoreRestSiblings": true, - "vars": "all" - } - ], - "no-empty": [ - "error", - { - "allowEmptyCatch": true - } - ], - "no-constant-condition": [ - "error", - { - "checkLoops": false - } - ], - "n/handle-callback-err": [ - "error", - "^(err|error)$" - ], - "n/no-callback-literal": [ - "error" - ], - "n/no-deprecated-api": [ - "error" - ], - "n/no-exports-assign": [ - "error" - ], - "n/no-new-require": [ - "error" - ], - "n/no-path-concat": [ - "error" - ], - "n/process-exit-as-throw": [ - "error" - ], - "promise/param-names": [ - "error" - ], - - // Undo this config from eslint:recommended for now (standardjs didn't have it.) - "require-yield": [ "off" ], - - "import/export": "error", - "import/first": "error", - "import/no-absolute-path": ["error", { "esmodule": true, "commonjs": true, "amd": false }], - "import/no-duplicates": "error", - "import/no-named-default": "error", - "import/no-webpack-loader-syntax": "error" - }, - "ignorePatterns": [ - "/*.example.js", // a pattern for uncommited local dev files to avoid linting - "/*.example.mjs", // a pattern for uncommited local dev files to avoid linting - "/.nyc_output", - "/build", - "node_modules", - "elastic-apm-node.js", - "/examples/esbuild/dist", - "/examples/typescript/dist", - "/examples/nextjs", - "/examples/an-azure-function-app", - "/lib/opentelemetry-bridge/opentelemetry-core-mini", - "/test/babel/out.js", - "/test/lambda/fixtures/esbuild-bundled-handler/hello.js", - "/test/instrumentation/modules/next/a-nextjs-app/pages", - "/test/instrumentation/modules/next/a-nextjs-app/components", - "/test/sourcemaps/fixtures/lib", - "/test/sourcemaps/fixtures/src", - "/test/stacktraces/fixtures/dist", - "/test/types/transpile/index.js", - "/test/types/transpile-default/index.js", - "/test_output", - "tmp" - ] -} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 57484c534b1..6bb9af68949 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -5,36 +5,30 @@ on: pull_request_target: types: [opened] -# 'issues: write' for https://docs.github.com/en/rest/issues/labels?apiVersion=2022-11-28#add-labels-to-an-issue +# '*: write' permissions for https://docs.github.com/en/rest/issues/labels?apiVersion=2022-11-28#add-labels-to-an-issue permissions: contents: read issues: write + pull-requests: write jobs: triage: runs-on: ubuntu-latest steps: - - name: Add agent-nodejs label - uses: actions-ecosystem/action-add-labels@v1 - with: - labels: agent-nodejs - - - name: Check team membership for user - uses: elastic/get-user-teams-membership@1.1.0 - id: checkUserMember + - id: is_elastic_member + uses: elastic/apm-pipeline-library/.github/actions/is-member-elastic-org@current with: username: ${{ github.actor }} - team: 'apm' - usernamesToExclude: | - apmmachine - dependabot - dependabot[bot] - GITHUB_TOKEN: ${{ secrets.APM_TECH_USER_TOKEN }} + token: ${{ secrets.APM_TECH_USER_TOKEN }} - name: Add community and triage labels - if: steps.checkUserMember.outputs.isTeamMember != 'true' && steps.checkUserMember.outputs.isExcluded != 'true' - uses: actions-ecosystem/action-add-labels@v1 + if: contains(steps.is_elastic_member.outputs.result, 'false') && github.actor != 'dependabot[bot]' + uses: actions/github-script@v7 with: - labels: | - community - triage + script: | + github.rest.issues.addLabels({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ["community", "triage"] + }) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b19cea64336..68ebf8c11f5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,7 +37,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 16 + node-version: 18 - run: npm ci - run: npm run lint diff --git a/.tav.yml b/.tav.yml index 0866f228599..c27cccd0501 100644 --- a/.tav.yml +++ b/.tav.yml @@ -318,24 +318,28 @@ pug: - node test/instrumentation/modules/hapi/set-framework.test.js tedious: - # latest majors subset of '>=1.9.0 <4.0.0 || >4.0.1 <11' - - versions: '1.9.0 || 1.15.0 || 2.7.1 || 3.0.1 || 4.2.0 || 5.0.3 || 6.7.1 || 7.0.0 || 8.3.1 || 9.2.3 || 10.0.0' + - versions: + include: '>=1 <11' + mode: latest-majors node: '>=6' commands: node test/instrumentation/modules/tedious.test.js - - versions: '11.0.0 || 11.8.0' # first and last subset of '11.x' + - versions: + include: '>=11 <12' + mode: latest-majors node: '>=10.17.0' commands: node test/instrumentation/modules/tedious.test.js - # first and last majors subset of '12.x || 13.x || 14.x' - - versions: '12.0.0 || 12.3.0 || 13.0.0 || 13.2.0 || 14.0.0 || 14.7.0 || >14.7.0 <15' - node: '>=12.3.0' - commands: node test/instrumentation/modules/tedious.test.js - - versions: '15.0.0 || 15.1.3 || >15.1.3 <16' # first and last majors subset of '15.x' - node: '>=14' - commands: node test/instrumentation/modules/tedious.test.js - - versions: '16.0.0 || 16.1.0 || >16.1.0 <17' # first and last majors subset of '16.x' + # Tedious v12,v13,v14 advertise a min-supported Node.js version of 12.3.0. + # Tedious v15 advertises a min-supported Node.js version of 14. + # However, as of @azure/core-rest-pipeline@1.15.0 they effectively have a + # min-working Node.js of >=16 (possibly >=18). + - versions: + include: '>=12 <17' + mode: latest-majors node: '>=16' commands: node test/instrumentation/modules/tedious.test.js - - versions: '>=17.0.0 <19' # first and last majors subset of '17.x' (as for now there is only v17.0.0) + - versions: + include: '>=17 <19' + mode: latest-majors node: '18.x || >=20' commands: node test/instrumentation/modules/tedious.test.js diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index ec3d2c20d42..cdaa870f17d 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -33,6 +33,23 @@ Notes: See the <> guide. +[[release-notes-4.5.1]] +==== 4.5.1 - 2024/04/11 + +[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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 11a06d9bacd..9ac34b577e7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -209,9 +209,10 @@ A release involves the following published artifacts: (The GitHub Actions CI "release" workflow will handle all the release 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 the for the latest major (currently `4.x`), then reset the latest - major branch to point to the current main, e.g.: - `git branch -f 4.x main && git push origin 4.x` +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". + **Open a PR to rebase all commits from main on to the "4.x" branch, + get it approved, merge with the rebase strategy.** (The periodic [docs CI job](https://elasticsearch-ci.elastic.co/view/Docs/job/elastic+docs+master+build/) uses this branch to update the [published docs](https://www.elastic.co/guide/en/apm/agent/nodejs/current/release-notes-4.x.html).) diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000000..95e9566fcd6 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,124 @@ +/* + * 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 globals = require('globals'); +const eslintJs = require('@eslint/js'); +const prettierConfig = require('eslint-config-prettier'); +const licenseHeaderPlugin = require('eslint-plugin-license-header'); +const nPlugin = require('eslint-plugin-n'); +const promisePlugin = require('eslint-plugin-promise'); +const importPlugin = require('eslint-plugin-import'); +const prettierPlugin = require('eslint-plugin-prettier'); + +module.exports = [ + { + // This block should *only* have the "ignores" property. + // https://eslint.org/docs/latest/use/configure/configuration-files#globally-ignoring-files-with-ignores + ignores: [ + '*.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/**', + 'node_modules/**', + '**/elastic-apm-node.js', + '**/.next/**', + + 'examples/esbuild/dist/**', + 'examples/typescript/dist/**', + 'examples/an-azure-function-app/**', + 'lib/opentelemetry-bridge/opentelemetry-core-mini/**', + 'test/babel/out.js', + 'test/lambda/fixtures/esbuild-bundled-handler/hello.js', + 'test/sourcemaps/fixtures/lib/**', + 'test/sourcemaps/fixtures/src/**', + 'test/stacktraces/fixtures/dist/**', + 'test/types/transpile/index.js', + 'test/types/transpile-default/index.js', + ], + }, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.node, + fetch: false, // not present in node globals (readonly) + }, + parserOptions: { + ecmaFeatures: { + jsx: true, // to parse nextjs files + }, + }, + }, + plugins: { + 'license-header': licenseHeaderPlugin, + n: nPlugin, + promise: promisePlugin, + import: importPlugin, + prettier: prettierPlugin, + }, + rules: { + ...eslintJs.configs.recommended.rules, + ...prettierConfig.rules, + 'prettier/prettier': ['error'], + 'license-header/header': ['error', './dev-utils/license-header.js'], + + // Restoring some config from standardjs that we want to maintain at least + // for now -- to assist with transition to prettier. + 'no-unused-vars': [ + // See taav for possible better 'no-unused-vars' rule. + 'error', + { + args: 'none', + caughtErrors: 'none', + ignoreRestSiblings: true, + vars: 'all', + }, + ], + 'no-empty': [ + 'error', + { + allowEmptyCatch: true, + }, + ], + 'no-constant-condition': [ + 'error', + { + checkLoops: false, + }, + ], + 'n/handle-callback-err': ['error', '^(err|error)$'], + 'n/no-callback-literal': ['error'], + 'n/no-deprecated-api': ['error'], + 'n/no-exports-assign': ['error'], + 'n/no-new-require': ['error'], + 'n/no-path-concat': ['error'], + 'n/process-exit-as-throw': ['error'], + 'promise/param-names': ['error'], + // Undo this config from eslint:recommended for now (standardjs didn't have it.) + 'require-yield': ['off'], + 'import/export': 'error', + 'import/first': 'error', + 'import/no-absolute-path': [ + 'error', + { esmodule: true, commonjs: true, amd: false }, + ], + 'import/no-duplicates': 'error', + 'import/no-named-default': 'error', + 'import/no-webpack-loader-syntax': 'error', + // Some defaults have changed in v9 + 'dot-notation': ['error'], + 'new-cap': ['error', { capIsNew: false }], + 'no-eval': ['error', { allowIndirect: true }], + 'no-new': ['error'], + yoda: ['error'], + 'valid-typeof': ['error'], + }, + }, +]; diff --git a/examples/nextjs/next.config.js b/examples/nextjs/next.config.js index ae887958d3c..ac4178eb9f1 100644 --- a/examples/nextjs/next.config.js +++ b/examples/nextjs/next.config.js @@ -1,7 +1,13 @@ +/* + * 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. + */ + /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, swcMinify: true, -} +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/examples/nextjs/pages/_app.js b/examples/nextjs/pages/_app.js index 1e1cec92425..cae85ab3ffd 100644 --- a/examples/nextjs/pages/_app.js +++ b/examples/nextjs/pages/_app.js @@ -1,7 +1,13 @@ -import '../styles/globals.css' +/* + * 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. + */ + +import '../styles/globals.css'; function MyApp({ Component, pageProps }) { - return + return ; } -export default MyApp +export default MyApp; diff --git a/examples/nextjs/pages/api/hello.js b/examples/nextjs/pages/api/hello.js index df63de88fa6..91217f24cd9 100644 --- a/examples/nextjs/pages/api/hello.js +++ b/examples/nextjs/pages/api/hello.js @@ -1,5 +1,11 @@ +/* + * 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. + */ + // Next.js API route support: https://nextjs.org/docs/api-routes/introduction export default function handler(req, res) { - res.status(200).json({ name: 'John Doe' }) + res.status(200).json({ name: 'John Doe' }); } diff --git a/examples/nextjs/pages/index.js b/examples/nextjs/pages/index.js index dc4b6403521..d9f91a167ea 100644 --- a/examples/nextjs/pages/index.js +++ b/examples/nextjs/pages/index.js @@ -1,6 +1,13 @@ -import Head from 'next/head' -import Image from 'next/image' -import styles from '../styles/Home.module.css' +/* + * 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. + */ + +/* eslint-disable no-unused-vars */ +import Head from 'next/head'; +import Image from 'next/image'; +import styles from '../styles/Home.module.css'; export default function Home() { return ( @@ -65,5 +72,5 @@ export default function Home() { - ) + ); } diff --git a/lib/instrumentation/express-utils.js b/lib/instrumentation/express-utils.js index 0a2edb65208..fb82e47c35d 100644 --- a/lib/instrumentation/express-utils.js +++ b/lib/instrumentation/express-utils.js @@ -63,10 +63,23 @@ function getPathFromRequest(req, useBase, usePathAsTransactionName) { // // Assuming 'http://' for the `base` URL is fine, because we don't use the // protocol. - const base = 'http://' + (req.headers && req.headers.host); + let base; + try { + // Host header may contain invalid characters therefore the URL + // parsing will fail and break the app. This try block is to avoid it + // Ref: https://github.com/elastic/apm-agent-nodejs/issues/3874 + const url = new url.URL('http://' + (req.headers && req.headers.host)); + base = 'http://' + url.hostname; + } catch (err) { + base = 'http://undefined'; + } + + // We may receive invalid chars in the path also but the URL + // constructor escapes them without throwing. const parsed = req.url.startsWith('/') ? new url.URL(base + req.url) : new url.URL(req.url, base); + return parsed && parsed.pathname; } } diff --git a/lib/instrumentation/modules/mongodb.js b/lib/instrumentation/modules/mongodb.js index 2ee283a93d8..e2159c0a760 100644 --- a/lib/instrumentation/modules/mongodb.js +++ b/lib/instrumentation/modules/mongodb.js @@ -222,6 +222,37 @@ module.exports = (mongodb, agent, { version, enabled }) => { } function collectionFor(event) { + // `getMore` command is a special case where the collection name is + // placed in a property named `collection`. The types exported + // do not ensure the property is there so we are defensive on its + // retrieval. + // + // Example of `getMore` payload: + // { + // event: CommandStartedEvent { + // name: 'commandStarted', + // address: '172.20.0.2:27017', + // connectionId: 12, + // requestId: 686, + // databaseName: 'mydatabase', + // commandName: 'getMore', + // command: { + // getMore: new Long('1769182660590360229'), + // collection: 'Interaction', + // ... + // } + // }, + // commandName: 'getMore', + // collection: new Long('1769182660590360229') + // } + // ref: https://github.com/elastic/apm-agent-nodejs/issues/3834 + if ( + event.commandName === 'getMore' && + typeof event.command.collection === 'string' + ) { + return event.command.collection; + } + const collection = event.command[event.commandName]; return typeof collection === 'string' ? collection : '$cmd'; } diff --git a/lib/instrumentation/modules/undici.js b/lib/instrumentation/modules/undici.js index 955bce1c5b6..4996f4c2379 100644 --- a/lib/instrumentation/modules/undici.js +++ b/lib/instrumentation/modules/undici.js @@ -44,6 +44,9 @@ try { const semver = require('semver'); +// Search an undici@5 request.headers string for a 'traceparent' header. +const headersStrHasTraceparentRe = /^traceparent:/im; + let isInstrumented = false; let spanFromReq = null; let chans = null; @@ -130,12 +133,37 @@ function instrumentUndici(agent) { const propSpan = span || parentRunContext.currSpan() || parentRunContext.currTransaction(); if (propSpan) { - propSpan.propagateTraceContextHeaders( - request, - function (req, name, value) { - req.addHeader(name, value); - }, - ); + // Guard against adding a duplicate 'traceparent' header, because that + // breaks ES. https://github.com/elastic/apm-agent-nodejs/issues/3964 + // Dev Note: This cheats a little and assumes the header names to add + // will include 'traceparent'. + let alreadyHasTp = false; + if (Array.isArray(request.headers)) { + // undici@6 + for (let i = 0; i < request.headers.length; i += 2) { + if (request.headers[i].toLowerCase() === 'traceparent') { + alreadyHasTp = true; + break; + } + } + } else if (typeof request.headers === 'string') { + // undici@5 + alreadyHasTp = headersStrHasTraceparentRe.test(request.headers); + } + + if (!alreadyHasTp) { + propSpan.propagateTraceContextHeaders( + request, + function (req, name, value) { + if (typeof request.addHeader === 'function') { + req.addHeader(name, value); + } else if (Array.isArray(request.headers)) { + // undici@6.11.0 accidentally, briefly removed `request.addHeader()`. + req.headers.push(name, value); + } + }, + ); + } } if (span) { diff --git a/lib/instrumentation/run-context/AbstractRunContextManager.js b/lib/instrumentation/run-context/AbstractRunContextManager.js index fd421fe526a..304f9f0ecda 100644 --- a/lib/instrumentation/run-context/AbstractRunContextManager.js +++ b/lib/instrumentation/run-context/AbstractRunContextManager.js @@ -32,7 +32,8 @@ class AbstractRunContextManager { constructor(log, runContextClass = RunContext) { this._log = log; this._kListeners = Symbol('ElasticListeners'); - this._root = new runContextClass(); // eslint-disable-line new-cap + // eslint-disable-next-line new-cap + this._root = new runContextClass(); } // Get the root run context. This is always empty (no current trans or span). diff --git a/lib/opentelemetry-bridge/OTelSpan.js b/lib/opentelemetry-bridge/OTelSpan.js index c27d622a0d4..7ea1139ca2f 100644 --- a/lib/opentelemetry-bridge/OTelSpan.js +++ b/lib/opentelemetry-bridge/OTelSpan.js @@ -49,7 +49,6 @@ function isHomogeneousArrayOfStrNumBool(arr) { return false; } } else if (typeof elem !== elemType) { - // eslint-disable-line valid-typeof return false; } } diff --git a/package-lock.json b/package-lock.json index 6ce7960ae9a..fb4ecdcc7bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "elastic-apm-node", - "version": "4.5.0", + "version": "4.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "elastic-apm-node", - "version": "4.5.0", + "version": "4.5.1", "license": "BSD-2-Clause", "dependencies": { "@elastic/ecs-pino-format": "^1.5.0", @@ -58,7 +58,6 @@ "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", "@elastic/elasticsearch": "^8.6.0", - "@elastic/elasticsearch-canary": "^8.8.0-canary.2", "@fastify/formbody": "^7.0.1", "@hapi/hapi": "^21.0.0", "@koa/router": "^12.0.0", @@ -77,7 +76,7 @@ "dependency-check": "^4.1.0", "diagnostics_channel": "^1.1.0", "elasticsearch": "^16.7.3", - "eslint": "^8.42.0", + "eslint": "^9.0.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-license-header": "^0.6.0", @@ -138,6 +137,15 @@ "node": ">=14.17.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -193,9 +201,9 @@ "dev": true }, "node_modules/@apollo/server": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.1.tgz", - "integrity": "sha512-XGMOgTyzV4EBHQq0xQVKFry9hZF7AA/6nxxGLamqdxodhdSdGbU9jrlb5/XDveeGuXP3+5JDdrB2HcziVLJcMA==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.2.tgz", + "integrity": "sha512-qlTZE4XyzMPprtkxFjmPxMwc2KC4nvNQrKXk2PMotEACKcaLXVZFIgstxbSqBCNl2KgzbsgU1g6vvbV6Xcfikw==", "dev": true, "dependencies": { "@apollo/cache-control-types": "^1.0.3", @@ -2407,12 +2415,12 @@ } }, "node_modules/@babel/cli": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.0.tgz", - "integrity": "sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", + "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "commander": "^4.0.1", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", @@ -4235,31 +4243,18 @@ } }, "node_modules/@elastic/elasticsearch": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.12.2.tgz", - "integrity": "sha512-04NvH3LIgcv1Uwguorfw2WwzC9Lhfsqs9f0L6uq6MrCw0lqe/HOQ6E8vJ6EkHAA15iEfbhtxOtenbZVVcE+mAQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.13.0.tgz", + "integrity": "sha512-OAYgzqArPqgDaIJ1yT0RX31YCgr1lleo53zL+36i23PFjHu08CA6Uq+BmBzEV05yEidl+ILPdeSfF3G8hPG/JQ==", "dev": true, "dependencies": { - "@elastic/transport": "^8.4.1", + "@elastic/transport": "^8.4.0", "tslib": "^2.4.0" }, "engines": { "node": ">=18" } }, - "node_modules/@elastic/elasticsearch-canary": { - "version": "8.8.0-canary.2", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.8.0-canary.2.tgz", - "integrity": "sha512-UxH8YUxcsqHXGh4t2PjuL0q03XunF9vCLHPAs9r+fQcaPXpNbEuv9jbNGXv/9TLyeAKYEgcq9Xm0p0Nk/Mh0lQ==", - "dev": true, - "dependencies": { - "@elastic/transport": "^8.3.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/@elastic/transport": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.4.1.tgz", @@ -4293,9 +4288,9 @@ "dev": true }, "node_modules/@elastic/transport/node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "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" @@ -4341,15 +4336,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -4357,7 +4352,7 @@ "strip-json-comments": "^3.1.1" }, "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" @@ -4380,15 +4375,12 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4400,25 +4392,13 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", + "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fastify/ajv-compiler": { @@ -4735,9 +4715,9 @@ "dev": true }, "node_modules/@hapi/hapi": { - "version": "21.3.3", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.3.tgz", - "integrity": "sha512-6pgwWVl/aSKSNVn86n+mWa06jRqCAKi2adZp/Hti19A0u5x3/6eiKz8UTBPMzfrdGf9WcrYbFBYzWr/qd2s28g==", + "version": "21.3.8", + "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.8.tgz", + "integrity": "sha512-2YGNQZTnWKAWiexoLxvsSFFpJvFBJKhtRzARNxR6G1dHbDfL1WPQBXF00rmMRJLdo+oi7d+Ntgdno6V+z+js7w==", "dev": true, "dependencies": { "@hapi/accept": "^6.0.1", @@ -5041,13 +5021,13 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.12.3.tgz", + "integrity": "sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -5068,9 +5048,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "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/@ioredis/commands": { @@ -5355,9 +5335,9 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", "dev": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -5482,11 +5462,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", - "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -5496,12 +5476,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", - "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -5511,12 +5491,12 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", - "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", "lodash.merge": "^4.6.2" }, "engines": { @@ -5527,9 +5507,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", - "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", "engines": { "node": ">=14" } @@ -6557,12 +6537,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -6597,9 +6571,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", + "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -6716,9 +6690,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -7853,15 +7827,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -8320,19 +8285,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8983,18 +8935,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -9386,56 +9326,51 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.0.0.tgz", + "integrity": "sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.0.0", + "@humanwhocodes/config-array": "^0.12.3", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "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.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "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" @@ -9593,9 +9528,9 @@ } }, "node_modules/eslint-plugin-license-header": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.0.tgz", - "integrity": "sha512-IEywStBWaDBDMkogYoKUAdaOuomZ+YaQmdoSD2vHmXobekM+XuP6SWLlvwUUhIbdocn3MTlb5CUJ8E4VHz1c/w==", + "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==", "dev": true, "dependencies": { "requireindex": "^1.2.0" @@ -9699,16 +9634,28 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.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" + } + }, + "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==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9779,18 +9726,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/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==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9819,21 +9754,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -9906,18 +9826,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -9928,29 +9836,17 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/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==", - "dev": true, - "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" @@ -10103,9 +9999,9 @@ } }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "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", @@ -10113,7 +10009,7 @@ "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -10185,15 +10081,6 @@ "node": ">=6" } }, - "node_modules/express/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/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -10484,15 +10371,15 @@ "dev": true }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -10618,57 +10505,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "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" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/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": ">=16" } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/fn.name": { @@ -10678,9 +10530,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -12801,12 +12653,11 @@ } }, "node_modules/keyv": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", - "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -12880,9 +12731,9 @@ } }, "node_modules/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.2.tgz", + "integrity": "sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==", "dev": true, "dependencies": { "accepts": "^1.3.5", @@ -13577,12 +13428,12 @@ "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" }, "node_modules/mongodb": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.4.0.tgz", - "integrity": "sha512-MdFHsyb1a/Ee0H3NmzWTSLqchacDV/APF0H6BNQvraWrOiIocys2EmTFZPgHxWhcfO94c1F34I9MACU7x0hHKA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", + "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", "dev": true, "dependencies": { - "@mongodb-js/saslprep": "^1.1.0", + "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.4.0", "mongodb-connection-string-url": "^3.0.0" }, @@ -14505,17 +14356,17 @@ "integrity": "sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==" }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -14589,12 +14440,6 @@ "node": ">=8" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "dev": true - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14704,16 +14549,14 @@ "dev": true }, "node_modules/pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "version": "8.11.5", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", + "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", "dev": true, "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -14755,18 +14598,18 @@ } }, "node_modules/pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "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==", "dev": true, "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", "dev": true }, "node_modules/pg-types": { @@ -14785,6 +14628,12 @@ "node": ">=4" } }, + "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 + }, "node_modules/pgpass": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", @@ -15763,9 +15612,9 @@ } }, "node_modules/require-in-the-middle": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", - "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "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==", "dependencies": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -17607,9 +17456,9 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17656,9 +17505,9 @@ } }, "node_modules/undici": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", - "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", + "integrity": "sha512-KyhzaLJnV1qa3BSHdj4AZ2ndqI0QWPxYzaIOio0WzcEJB9gvuysprJSLtpvc2D9mhR9jPDUk7xlJlZbH2KR5iw==", "dev": true, "engines": { "node": ">=18.0" @@ -18083,15 +17932,6 @@ "node": ">= 10.0.0" } }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -18296,6 +18136,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -18342,9 +18188,9 @@ } }, "@apollo/server": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.1.tgz", - "integrity": "sha512-XGMOgTyzV4EBHQq0xQVKFry9hZF7AA/6nxxGLamqdxodhdSdGbU9jrlb5/XDveeGuXP3+5JDdrB2HcziVLJcMA==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.10.2.tgz", + "integrity": "sha512-qlTZE4XyzMPprtkxFjmPxMwc2KC4nvNQrKXk2PMotEACKcaLXVZFIgstxbSqBCNl2KgzbsgU1g6vvbV6Xcfikw==", "dev": true, "requires": { "@apollo/cache-control-types": "^1.0.3", @@ -20187,12 +20033,12 @@ } }, "@babel/cli": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.0.tgz", - "integrity": "sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.24.1.tgz", + "integrity": "sha512-HbmrtxyFUr34LwAlV9jS+sSIjUp4FpdtIMGwgufY3AsxrIfsh/HxlMTywsONAZsU0RMYbZtbZFpUCrSGs7o0EA==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", @@ -21467,22 +21313,12 @@ } }, "@elastic/elasticsearch": { - "version": "8.12.2", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.12.2.tgz", - "integrity": "sha512-04NvH3LIgcv1Uwguorfw2WwzC9Lhfsqs9f0L6uq6MrCw0lqe/HOQ6E8vJ6EkHAA15iEfbhtxOtenbZVVcE+mAQ==", - "dev": true, - "requires": { - "@elastic/transport": "^8.4.1", - "tslib": "^2.4.0" - } - }, - "@elastic/elasticsearch-canary": { - "version": "8.8.0-canary.2", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.8.0-canary.2.tgz", - "integrity": "sha512-UxH8YUxcsqHXGh4t2PjuL0q03XunF9vCLHPAs9r+fQcaPXpNbEuv9jbNGXv/9TLyeAKYEgcq9Xm0p0Nk/Mh0lQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.13.0.tgz", + "integrity": "sha512-OAYgzqArPqgDaIJ1yT0RX31YCgr1lleo53zL+36i23PFjHu08CA6Uq+BmBzEV05yEidl+ILPdeSfF3G8hPG/JQ==", "dev": true, "requires": { - "@elastic/transport": "^8.3.1", + "@elastic/transport": "^8.4.0", "tslib": "^2.4.0" } }, @@ -21513,9 +21349,9 @@ "dev": true }, "undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "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" @@ -21547,15 +21383,15 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -21576,32 +21412,23 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true }, "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 - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", + "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", "dev": true }, "@fastify/ajv-compiler": { @@ -21923,9 +21750,9 @@ "dev": true }, "@hapi/hapi": { - "version": "21.3.3", - "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.3.tgz", - "integrity": "sha512-6pgwWVl/aSKSNVn86n+mWa06jRqCAKi2adZp/Hti19A0u5x3/6eiKz8UTBPMzfrdGf9WcrYbFBYzWr/qd2s28g==", + "version": "21.3.8", + "resolved": "https://registry.npmjs.org/@hapi/hapi/-/hapi-21.3.8.tgz", + "integrity": "sha512-2YGNQZTnWKAWiexoLxvsSFFpJvFBJKhtRzARNxR6G1dHbDfL1WPQBXF00rmMRJLdo+oi7d+Ntgdno6V+z+js7w==", "dev": true, "requires": { "@hapi/accept": "^6.0.1", @@ -22248,13 +22075,13 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.12.3.tgz", + "integrity": "sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -22265,9 +22092,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "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 }, "@ioredis/commands": { @@ -22486,9 +22313,9 @@ } }, "@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.5.tgz", + "integrity": "sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==", "dev": true, "requires": { "sparse-bitfield": "^3.0.3" @@ -22588,36 +22415,36 @@ "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" }, "@opentelemetry/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", - "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", "requires": { - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/semantic-conventions": "1.23.0" } }, "@opentelemetry/resources": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", - "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", "requires": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" } }, "@opentelemetry/sdk-metrics": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", - "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", "requires": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", "lodash.merge": "^4.6.2" } }, "@opentelemetry/semantic-conventions": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", - "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==" }, "@pkgjs/parseargs": { "version": "0.11.0", @@ -23472,12 +23299,6 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -23512,9 +23333,9 @@ "dev": true }, "@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", + "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -23624,9 +23445,9 @@ } }, "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-import-assertions": { "version": "1.9.0", @@ -24479,12 +24300,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "dev": true - }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -24831,16 +24646,6 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -25337,15 +25142,6 @@ "path-type": "^4.0.0" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -25664,49 +25460,44 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.0.0.tgz", + "integrity": "sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.0.0", + "@humanwhocodes/config-array": "^0.12.3", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "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.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -25756,12 +25547,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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==", - "dev": true - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -25781,15 +25566,6 @@ "is-glob": "^4.0.3" } }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25837,12 +25613,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, @@ -25963,9 +25733,9 @@ } }, "eslint-plugin-license-header": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-license-header/-/eslint-plugin-license-header-0.6.0.tgz", - "integrity": "sha512-IEywStBWaDBDMkogYoKUAdaOuomZ+YaQmdoSD2vHmXobekM+XuP6SWLlvwUUhIbdocn3MTlb5CUJ8E4VHz1c/w==", + "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==", "dev": true, "requires": { "requireindex": "^1.2.0" @@ -26024,15 +25794,21 @@ "dev": true }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, + "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==", + "dev": true + }, "esm": { "version": "3.2.25", "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", @@ -26040,22 +25816,14 @@ "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "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==", - "dev": true - } + "eslint-visitor-keys": "^4.0.0" } }, "esprima": { @@ -26158,9 +25926,9 @@ } }, "express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "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", @@ -26168,7 +25936,7 @@ "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -26196,12 +25964,6 @@ "vary": "~1.1.2" }, "dependencies": { - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -26475,12 +26237,12 @@ "dev": true }, "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "requires": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" } }, "fill-range": { @@ -26580,44 +26342,19 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "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" - } - }, - "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" - } - } + "flatted": "^3.2.9", + "keyv": "^4.5.4" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "fn.name": { @@ -26627,9 +26364,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "for-each": { @@ -28179,12 +27916,11 @@ } }, "keyv": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz", - "integrity": "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { - "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -28225,9 +27961,9 @@ } }, "koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-KEL/vU1knsoUvfP4MC4/GthpQrY/p6dzwaaGI6Rt4NQuFqkw3qrvsdYF5pz3wOfi7IGTvMPHC9aZIcUKYFNxsw==", + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.2.tgz", + "integrity": "sha512-MXTeZH3M6AJ8ukW2QZ8wqO3Dcdfh2WRRmjCBkEP+NhKNCiqlO5RDqHmSnsyNrbRJrdjyvIGSJho4vQiWgQJSVA==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -28787,12 +28523,12 @@ "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" }, "mongodb": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.4.0.tgz", - "integrity": "sha512-MdFHsyb1a/Ee0H3NmzWTSLqchacDV/APF0H6BNQvraWrOiIocys2EmTFZPgHxWhcfO94c1F34I9MACU7x0hHKA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", + "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", "dev": true, "requires": { - "@mongodb-js/saslprep": "^1.1.0", + "@mongodb-js/saslprep": "^1.1.5", "bson": "^6.4.0", "mongodb-connection-string-url": "^3.0.0" } @@ -29504,17 +29240,17 @@ "integrity": "sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==" }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "original-url": { @@ -29567,12 +29303,6 @@ "release-zalgo": "^1.0.0" } }, - "packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", - "dev": true - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -29654,19 +29384,25 @@ "dev": true }, "pg": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", - "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "version": "8.11.5", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.5.tgz", + "integrity": "sha512-jqgNHSKL5cbDjFlHyYsCXmQDrfIX/3RsNwYqpd4N0Kt8niLuNoRNH+aazv6cOd43gPh9Y4DjQCtb+X0MH0Hvnw==", "dev": true, "requires": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", "pg-cloudflare": "^1.1.1", - "pg-connection-string": "^2.6.2", - "pg-pool": "^3.6.1", - "pg-protocol": "^1.6.0", + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", "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==", + "dev": true + } } }, "pg-cloudflare": { @@ -29689,15 +29425,15 @@ "dev": true }, "pg-pool": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", - "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "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==", "dev": true }, "pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", "dev": true }, "pg-types": { @@ -30470,9 +30206,9 @@ "dev": true }, "require-in-the-middle": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz", - "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==", + "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==", "requires": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -31916,9 +31652,9 @@ } }, "typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true }, "uglify-js": { @@ -31946,9 +31682,9 @@ "dev": true }, "undici": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", - "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", + "integrity": "sha512-KyhzaLJnV1qa3BSHdj4AZ2ndqI0QWPxYzaIOio0WzcEJB9gvuysprJSLtpvc2D9mhR9jPDUk7xlJlZbH2KR5iw==", "dev": true }, "undici-types": { @@ -32279,12 +32015,6 @@ "babel-walk": "3.0.0-canary-5" } }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 91d179482db..6d15777c309 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "elastic-apm-node", - "version": "4.5.0", + "version": "4.5.1", "description": "The official Elastic APM agent for Node.js", "type": "commonjs", "main": "index.js", @@ -9,9 +9,9 @@ "docs:open": "PREVIEW=1 npm run docs:build", "docs:build": "./docs/scripts/build_docs.sh apm-agent-nodejs ./docs ./build", "lint": "npm run lint:eslint && npm run lint:license-files && npm run lint:yaml-files && npm run lint:tav", - "lint:eslint": "eslint --ext=js,mjs,cjs . # requires node >=16.0.0", - "lint:eslint-nostyle": "eslint --ext=js,mjs,cjs --rule 'prettier/prettier: off' . # lint without checking style, not normally used; requires node>=16", - "lint:fix": "eslint --ext=js,mjs,cjs --fix . # requires node >=16.0.0", + "lint:eslint": "eslint # requires node >=18.18.0", + "lint:eslint-nostyle": "eslint --rule 'prettier/prettier: off' . # lint without checking style, not normally used; requires node>=18.18.0", + "lint:fix": "eslint --fix . # requires node >=18.18.0", "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", @@ -81,6 +81,9 @@ "distributed-tracing" ], "author": "Thomas Watson Steen (https://twitter.com/wa7son)", + "contributors": [ + "Elastic Observability " + ], "license": "BSD-2-Clause", "bugs": { "url": "https://github.com/elastic/apm-agent-nodejs/issues" @@ -136,7 +139,6 @@ "@babel/core": "^7.8.4", "@babel/preset-env": "^7.8.4", "@elastic/elasticsearch": "^8.6.0", - "@elastic/elasticsearch-canary": "^8.8.0-canary.2", "@fastify/formbody": "^7.0.1", "@hapi/hapi": "^21.0.0", "@koa/router": "^12.0.0", @@ -155,7 +157,7 @@ "dependency-check": "^4.1.0", "diagnostics_channel": "^1.1.0", "elasticsearch": "^16.7.3", - "eslint": "^8.42.0", + "eslint": "^9.0.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-import": "^2.28.0", "eslint-plugin-license-header": "^0.6.0", diff --git a/test/apm-client/http-apm-client/config.test.js b/test/apm-client/http-apm-client/config.test.js index b5d8b43b17c..04898c2e3e3 100644 --- a/test/apm-client/http-apm-client/config.test.js +++ b/test/apm-client/http-apm-client/config.test.js @@ -103,9 +103,9 @@ test('should work without new', function (t) { test("null value config options shouldn't throw", function (t) { t.doesNotThrow(function () { + // eslint-disable-next-line no-new new HttpApmClient( validOpts({ - // eslint-disable-line no-new size: null, time: null, serverTimeout: null, @@ -195,9 +195,9 @@ test('custom headers', function (t) { test('serverUrl is invalid', function (t) { t.throws(function () { + // eslint-disable-next-line no-new new HttpApmClient( validOpts({ - // eslint-disable-line no-new serverUrl: 'invalid', apmServerVersion: '8.0.0', }), diff --git a/test/config/config.test.js b/test/config/config.test.js index 4ecfc2161de..b924d559902 100644 --- a/test/config/config.test.js +++ b/test/config/config.test.js @@ -219,7 +219,7 @@ const testFixtures = [ }); // Add the manual values Object.assign(startOpts, startOptsManual); - envVars['TEST_APM_START_OPTIONS'] = JSON.stringify(startOpts); + envVars.TEST_APM_START_OPTIONS = JSON.stringify(startOpts); return envVars; })(), checkScriptResult: (t, err, stdout) => { diff --git a/test/docker-compose.yml b/test/docker-compose.yml index 8252071fc18..a87e4435c31 100644 --- a/test/docker-compose.yml +++ b/test/docker-compose.yml @@ -32,6 +32,7 @@ services: mssql: image: mcr.microsoft.com/mssql/server + platform: linux/amd64 environment: - ACCEPT_EULA=Y - SA_PASSWORD=Very(!)Secure @@ -141,6 +142,13 @@ services: - nodezookeeperdata:/var/lib/zookeeper/data environment: - ALLOW_ANONYMOUS_LOGIN=yes + healthcheck: + # 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 kafka: # https://hub.docker.com/r/bitnami/kafka/tags @@ -162,10 +170,9 @@ services: depends_on: - zookeeper healthcheck: - # use netcat to check tcp connection available - test: nc -z localhost 9093 || exit -1 - start_period: 15s - interval: 5s + # 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 timeout: 10s retries: 5 diff --git a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json b/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json index 68851cc2338..3ab535213bd 100644 --- a/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json +++ b/test/instrumentation/azure-functions/fixtures/AJsAzureFnApp/package-lock.json @@ -11,9 +11,9 @@ } }, "node_modules/azure-functions-core-tools": { - "version": "4.0.5530", - "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5530.tgz", - "integrity": "sha512-XcJAmnnqWJ/LcVJXLJZaXNL/VUTJcl+nnxKtqdLiIiaEqVwKaVzn8AaSa6bw/1oAoHWlB58b4+oK6Q9aZga2ZA==", + "version": "4.0.5611", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5611.tgz", + "integrity": "sha512-Uf+qywuGvPgOdbHqpe+SbtKg3sy8fBHaYtsnqXVWWJJKQ+HyDTTirRSkvgHZGc7R6ZZYmRPJb82REQrF3jzPAA==", "dev": true, "hasInstallScript": true, "hasShrinkwrap": true, @@ -382,9 +382,9 @@ }, "dependencies": { "azure-functions-core-tools": { - "version": "4.0.5530", - "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5530.tgz", - "integrity": "sha512-XcJAmnnqWJ/LcVJXLJZaXNL/VUTJcl+nnxKtqdLiIiaEqVwKaVzn8AaSa6bw/1oAoHWlB58b4+oK6Q9aZga2ZA==", + "version": "4.0.5611", + "resolved": "https://registry.npmjs.org/azure-functions-core-tools/-/azure-functions-core-tools-4.0.5611.tgz", + "integrity": "sha512-Uf+qywuGvPgOdbHqpe+SbtKg3sy8fBHaYtsnqXVWWJJKQ+HyDTTirRSkvgHZGc7R6ZZYmRPJb82REQrF3jzPAA==", "dev": true, "requires": { "chalk": "3.0.0", diff --git a/test/instrumentation/express-utils.test.js b/test/instrumentation/express-utils.test.js index 3917d132845..50e563e6e8a 100644 --- a/test/instrumentation/express-utils.test.js +++ b/test/instrumentation/express-utils.test.js @@ -26,6 +26,16 @@ test('#getPathFromRequest', function (t) { t.equals(path, '/foo/bar'); t.end(); }); + + t.test('should return path for an invalid host header', function (t) { + const req = createRequest( + 'https://test.com/foo/bar?query=value#hash', + 'invalid[hostname', + ); + const path = getPathFromRequest(req, false, true); + t.equals(path, '/foo/bar'); + t.end(); + }); }); function createRequest(url, host = 'example.com') { diff --git a/test/instrumentation/modules/@elastic/elasticsearch-canary.test.js b/test/instrumentation/modules/@elastic/elasticsearch-canary.test.js deleted file mode 100644 index a7659d71db6..00000000000 --- a/test/instrumentation/modules/@elastic/elasticsearch-canary.test.js +++ /dev/null @@ -1,16 +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'; - -if (process.env.GITHUB_ACTIONS === 'true' && process.platform === 'win32') { - console.log('# SKIP: GH Actions do not support docker services on Windows'); - process.exit(0); -} - -process.env.ELASTIC_APM_TEST_ESCLIENT_PACKAGE_NAME = - '@elastic/elasticsearch-canary'; -require('./elasticsearch.test.js'); diff --git a/test/instrumentation/modules/mongodb/fixtures/use-mongodb-async-context.js b/test/instrumentation/modules/mongodb/fixtures/use-mongodb-async-context.js index 1e8664623ea..06b1fbb4d15 100644 --- a/test/instrumentation/modules/mongodb/fixtures/use-mongodb-async-context.js +++ b/test/instrumentation/modules/mongodb/fixtures/use-mongodb-async-context.js @@ -20,6 +20,12 @@ const http = require('http'); const MongoClient = require('mongodb').MongoClient; // ---- support functions +async function makeRequest(url) { + return new Promise((resolve, reject) => { + http.request(url).on('response', resolve).on('error', reject).end(); + }); +} + /** * * @param {import('mongodb').MongoClient} mongodbClient @@ -29,15 +35,18 @@ async function useMongodbAsyncContext(options) { const { port } = options; const serverUrl = `http://localhost:${port}`; - const reqs = new Array(50).fill(serverUrl).map((url) => { - return new Promise((resolve, reject) => { - http.request(url).on('response', resolve).on('error', reject).end(); - }); - }); + // 1st fill with some data + await makeRequest(`${serverUrl}/insert`); - // Wait for all request to finish and make sure APM Server - // receives all spans + const reqs = new Array(50).fill(`${serverUrl}/find`).map(makeRequest); + + // Wait for all request to finish await Promise.all(reqs); + + // Clear the data + await makeRequest(`${serverUrl}/delete`); + + // Make sure APM Server receives all spans await apm.flush(); } @@ -54,20 +63,58 @@ async function main() { const server = http.createServer(function (req, res) { req.resume(); req.on('end', function () { - mongodbClient - .db(db) - .collection(col) - .find() - .toArray() - .then(JSON.stringify) - .then(function (body) { - res.writeHead(200, { - server: 'trace-mongodb-cats-server', - 'content-type': 'text/plain', - 'content-length': Buffer.byteLength(body), + const successBody = JSON.stringify({ success: true }); + const failureBody = JSON.stringify({ success: true }); + if (req.url === '/insert') { + const items = new Array(500).fill({}).map((_, num) => ({ num })); + mongodbClient + .db(db) + .collection(col) + .insertMany(items) + .then(function () { + res.writeHead(200, { + server: 'trace-mongodb-cats-server', + 'content-type': 'text/plain', + 'content-length': Buffer.byteLength(successBody), + }); + res.end(successBody); + }); + } else if (req.url === '/find') { + mongodbClient + .db(db) + .collection(col) + .find() + .toArray() + .then(JSON.stringify) + .then(function (body) { + res.writeHead(200, { + server: 'trace-mongodb-cats-server', + 'content-type': 'text/plain', + 'content-length': Buffer.byteLength(body), + }); + res.end(body); + }); + } else if (req.url === '/delete') { + mongodbClient + .db(db) + .collection(col) + .deleteMany({}) + .then(function (body) { + res.writeHead(200, { + server: 'trace-mongodb-cats-server', + 'content-type': 'text/plain', + 'content-length': Buffer.byteLength(successBody), + }); + res.end(successBody); }); - res.end(body); + } else { + res.writeHead(200, { + server: 'trace-mongodb-cats-server', + 'content-type': 'text/plain', + 'content-length': Buffer.byteLength(failureBody), }); + res.end(failureBody); + } }); }); server.listen(); diff --git a/test/instrumentation/modules/mongodb/mongodb.test.js b/test/instrumentation/modules/mongodb/mongodb.test.js index 2a50380e087..672f9600ded 100644 --- a/test/instrumentation/modules/mongodb/mongodb.test.js +++ b/test/instrumentation/modules/mongodb/mongodb.test.js @@ -64,7 +64,7 @@ const testFixtures = [ TEST_COLLECTION, TEST_USE_CALLBACKS: String(TEST_USE_CALLBACKS), }, - verbose: true, + verbose: false, checkApmServer: (t, apmServer) => { t.ok(apmServer.events[0].metadata, 'metadata'); const events = sortApmEvents(apmServer.events); @@ -414,7 +414,7 @@ const testFixtures = [ TEST_COLLECTION, TEST_USE_CALLBACKS: String(TEST_USE_CALLBACKS), }, - verbose: true, + verbose: false, checkApmServer: (t, apmServer) => { t.ok(apmServer.events[0].metadata, 'metadata'); const events = sortApmEvents(apmServer.events); @@ -501,6 +501,15 @@ const testFixtures = [ TEST_DB, TEST_COLLECTION, }, + // The `getMore` command seems to be queued outside the connection pool + // for versions <4.11.0 and as a result the `find` command is properly + // linked to the parent transaction but not the `getMore` commands from + // the cursor. Since v4.11.0 was published in 2022-09-19 there was a decision + // to skip this test for earlier version + // Ref: https://github.com/elastic/apm-agent-nodejs/pull/3919#issuecomment-2005283132 + versionRanges: { + mongodb: '>=4.11.0', + }, verbose: false, checkApmServer: (t, apmServer) => { t.ok(apmServer.events[0].metadata, 'metadata'); @@ -514,17 +523,52 @@ const testFixtures = [ .filter((e) => e.span && e.span.type !== 'external') .map((e) => e.span); - while (transactions.length) { - const tx = transactions.shift(); - const idx = spans.findIndex((s) => s.parent_id === tx.id); + const extractSpans = (tx) => { + const result = []; + let i = 0; + + while (i < spans.length) { + if (spans[i].parent_id === tx.id) { + result.push(...spans.splice(i, 1)); + } else { + i++; + } + } + + return result; + }; + + let tx = transactions.shift(); + let txSpans = extractSpans(tx); + + // Assertions for insert transaction + t.ok(tx, 'insert transaction'); + t.ok(txSpans.length === 1, 'insert spans length'); + t.equal(txSpans[0].name, 'elasticapm.test.insert', 'span.name'); - t.ok(idx !== -1, 'transaction has a child span'); + // Assertions for all find transactions + while (transactions.length - 1) { + tx = transactions.shift(); + txSpans = extractSpans(tx); - const [span] = spans.splice(idx, 1); + t.ok(txSpans.length > 0, 'transaction has child spans'); - t.equal(span.name, 'elasticapm.test.find', 'span.name'); + txSpans.forEach((s, idx) => { + if (idx === 0) { + t.equal(s.name, 'elasticapm.test.find', 'span.name'); + } else { + t.equal(s.name, 'elasticapm.test.getMore', 'span.name'); + } + }); } + // Assertions for delete transaction + tx = transactions.shift(); + txSpans = extractSpans(tx); + + t.ok(txSpans.length === 1, 'delete spans length'); + t.equal(txSpans[0].name, 'elasticapm.test.delete', 'span.name'); + t.equal(spans.length, 0, 'all spans accounted for'); }, }, diff --git a/test/instrumentation/modules/next/a-nextjs-app/components/Header.js b/test/instrumentation/modules/next/a-nextjs-app/components/Header.js index 5236d499618..a6882650914 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/components/Header.js +++ b/test/instrumentation/modules/next/a-nextjs-app/components/Header.js @@ -4,10 +4,11 @@ * compliance with the BSD 2-Clause License. */ -import Head from 'next/head' -import Link from 'next/link' +/* eslint-disable no-unused-vars */ +import Head from 'next/head'; +import Link from 'next/link'; -function Header () { +function Header() { return ( <> @@ -25,7 +26,7 @@ function Header () { - ) + ); } -export default Header +export default Header; diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/a-dynamic-page/[num].js b/test/instrumentation/modules/next/a-nextjs-app/pages/a-dynamic-page/[num].js index f6a6bb7f32f..de7b0b0003f 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/a-dynamic-page/[num].js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/a-dynamic-page/[num].js @@ -4,42 +4,45 @@ * compliance with the BSD 2-Clause License. */ -import { useRouter } from 'next/router' -import Header from '../../components/Header' +/* eslint-disable no-unused-vars */ +import { useRouter } from 'next/router'; +import Header from '../../components/Header'; // Run at build time to determine a set of dynamic paths to prerender at build time. // https://nextjs.org/docs/basic-features/data-fetching/get-static-paths -export async function getStaticPaths () { +export async function getStaticPaths() { return { paths: [ { params: { num: '41' } }, { params: { num: '42' } }, - { params: { num: '43' } } + { params: { num: '43' } }, ], - fallback: true // false, true, or 'blocking' - } + fallback: true, // false, true, or 'blocking' + }; } -export async function getStaticProps ({ params }) { +export async function getStaticProps({ params }) { return { props: { - doubleThat: Number(params.num) * 2 - } - } + doubleThat: Number(params.num) * 2, + }, + }; } const ADynamicPage = ({ doubleThat }) => { - const router = useRouter() - const { num } = router.query + const router = useRouter(); + const { num } = router.query; return ( <> -
+
-
This is ADynamicPage {num} - doubleThat is {doubleThat}
+
+ This is ADynamicPage {num} - doubleThat is {doubleThat} +
- ) -} + ); +}; -export default ADynamicPage +export default ADynamicPage; diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/a-page.js b/test/instrumentation/modules/next/a-nextjs-app/pages/a-page.js index b7999ac53ab..50a4d901e51 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/a-page.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/a-page.js @@ -6,30 +6,31 @@ // A static page. -import Image from 'next/image' -import Header from '../components/Header' +/* eslint-disable no-unused-vars */ +import Image from 'next/image'; +import Header from '../components/Header'; -import img from '../public/elastic-logo.png' +import img from '../public/elastic-logo.png'; // Runs at build time. -export async function getStaticProps () { +export async function getStaticProps() { return { props: { - buildTime: Date.now() - } - } + buildTime: Date.now(), + }, + }; } -function APage ({ buildTime }) { +function APage({ buildTime }) { return ( <> -
+
This is APage (built at {new Date(buildTime).toISOString()})
Elastic logo
- ) + ); } -export default APage +export default APage; diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-getServerSideProps.js b/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-getServerSideProps.js index bc360406d3f..1ed382d2ee9 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-getServerSideProps.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/a-throw-in-getServerSideProps.js @@ -7,22 +7,23 @@ // A page that throws in `getServerSideProps`. // https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props#does-getserversideprops-render-an-error-page -import Header from '../components/Header' +/* eslint-disable no-unused-vars */ +import Header from '../components/Header'; // Gets called on every request. -export async function getServerSideProps () { - throw new Error('thrown error in getServerSideProps') +export async function getServerSideProps() { + throw new Error('thrown error in getServerSideProps'); } -function AThrowInGetServerSideProps () { +function AThrowInGetServerSideProps() { return ( <> -
+
This is AThrowInGetServerSideProps.
- ) + ); } -export default AThrowInGetServerSideProps +export default AThrowInGetServerSideProps; 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 cf51456cf73..d9c20343bb4 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 @@ -5,21 +5,21 @@ */ // Gets called on every request. -export async function getServerSideProps () { +export async function getServerSideProps() { return { props: { - currTime: Date.now() - } - } + currTime: Date.now(), + }, + }; } -function AThrowInPageHandler ({ currTime }) { +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 // 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') + throw new Error('throw in page handler'); } -export default AThrowInPageHandler +export default AThrowInPageHandler; diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/an-ssr-page.js b/test/instrumentation/modules/next/a-nextjs-app/pages/an-ssr-page.js index ffdf2ed410d..030172d96f8 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/an-ssr-page.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/an-ssr-page.js @@ -6,26 +6,29 @@ // A server-side rendered page. -import Header from '../components/Header' +/* eslint-disable no-unused-vars */ +import Header from '../components/Header'; // Gets called on every request. -export async function getServerSideProps () { +export async function getServerSideProps() { return { props: { - currTime: Date.now() - } - } + currTime: Date.now(), + }, + }; } -function AnSSRPage ({ currTime }) { +function AnSSRPage({ currTime }) { return ( <> -
+
-
This is AnSSRPage (currTime is {new Date(currTime).toISOString()})
+
+ This is AnSSRPage (currTime is {new Date(currTime).toISOString()}) +
- ) + ); } -export default AnSSRPage +export default AnSSRPage; diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/api/a-dynamic-api-endpoint/[num].js b/test/instrumentation/modules/next/a-nextjs-app/pages/api/a-dynamic-api-endpoint/[num].js index 2884ae9104d..27ccf9f8c04 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/api/a-dynamic-api-endpoint/[num].js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/api/a-dynamic-api-endpoint/[num].js @@ -7,20 +7,20 @@ // A dynamic API endpoint. // Always executed server-side. -export default function aDynamicApiEndpoint (req, res) { - const { num } = req.query - const n = Number(num) +export default function aDynamicApiEndpoint(req, res) { + const { num } = req.query; + const n = Number(num); if (isNaN(n)) { res.status(400).json({ num, - error: 'num is not a Number' - }) + error: 'num is not a Number', + }); } else { res.status(200).json({ num, n, double: n * 2, - floor: Math.floor(n) - }) + floor: Math.floor(n), + }); } } diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint-that-throws.js b/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint-that-throws.js index 96403cc64f6..5e1a0cbbf8e 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint-that-throws.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint-that-throws.js @@ -7,6 +7,6 @@ // An API endpoint whose handler throws, to test error handling. // Always executed server-side. -export default function anApiEndpointThatThrows (req, res) { - throw new Error('An error thrown in anApiEndpointThatThrows handler') +export default function anApiEndpointThatThrows(req, res) { + throw new Error('An error thrown in anApiEndpointThatThrows handler'); } diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint.js b/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint.js index 1d655ed59a3..8c65230f11d 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/api/an-api-endpoint.js @@ -7,6 +7,6 @@ // An API endpoint. // Always executed server-side. -export default function anApiEndpoint (req, res) { - res.status(200).json({ ping: 'pong' }) +export default function anApiEndpoint(req, res) { + res.status(200).json({ ping: 'pong' }); } diff --git a/test/instrumentation/modules/next/a-nextjs-app/pages/index.js b/test/instrumentation/modules/next/a-nextjs-app/pages/index.js index 3db50aaf52c..9c0cd832718 100644 --- a/test/instrumentation/modules/next/a-nextjs-app/pages/index.js +++ b/test/instrumentation/modules/next/a-nextjs-app/pages/index.js @@ -4,29 +4,33 @@ * compliance with the BSD 2-Clause License. */ -import Link from 'next/link' -import Header from '../components/Header' +/* eslint-disable no-unused-vars */ +import Link from 'next/link'; +import Header from '../components/Header'; -function IndexPage () { +function IndexPage() { return ( <> -
+
Welcome to A-Next.js-App! This is IndexPage.
  • - Go to APage (it is static in a prod build because it only implements getStaticProps) + Go to APage (it is static in a prod build because it only + implements getStaticProps)
  • - Go to AnSSRPage (its getServerSideProps is called on the server every time) + Go to AnSSRPage (its getServerSideProps is called on the server + every time)
  • - Go to ADynamicPage/42 (it supports other numbers; 41, 42, and 43 are pre-generated) + Go to ADynamicPage/42 (it supports other numbers; 41, 42, and 43 + are pre-generated)
  • @@ -42,9 +46,7 @@ function IndexPage () {
  • - - Go to AnApiEndpoint - + Go to AnApiEndpoint
  • @@ -70,7 +72,7 @@ function IndexPage () {
- ) + ); } -export default IndexPage +export default IndexPage; diff --git a/test/instrumentation/modules/tedious.test.js b/test/instrumentation/modules/tedious.test.js index 5a342339e32..86fc1aba0de 100644 --- a/test/instrumentation/modules/tedious.test.js +++ b/test/instrumentation/modules/tedious.test.js @@ -25,10 +25,10 @@ const tediousVer = const semver = require('semver'); if ( (semver.gte(tediousVer, '17.0.0') && semver.lt(process.version, '18.0.0')) || - (semver.gte(tediousVer, '16.0.0') && semver.lt(process.version, '16.0.0')) || - (semver.gte(tediousVer, '15.0.0') && semver.lt(process.version, '14.0.0')) || - (semver.gte(tediousVer, '12.0.0') && semver.lt(process.version, '12.3.0')) || - (semver.gte(tediousVer, '11.0.0') && semver.lt(process.version, '10.17.0')) + // 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')) ) { console.log( `# SKIP tedious@${tediousVer} does not support node ${process.version}`, diff --git a/test/instrumentation/modules/undici/undici.test.js b/test/instrumentation/modules/undici/undici.test.js index 941fffb586f..e4cf13d6a31 100644 --- a/test/instrumentation/modules/undici/undici.test.js +++ b/test/instrumentation/modules/undici/undici.test.js @@ -274,6 +274,45 @@ if (global.AbortController) { }); } +test('undici no duplicate headers', async (t) => { + apm._apmClient.clear(); + const aTrans = apm.startTransaction('aTransName'); + + const url = origin + '/ping'; + const { statusCode, body } = await undici.request(url, { + headers: { + traceparent: 'this-value-is-not-from-elastic-apm-node', + }, + }); + t.equal(statusCode, 200, 'statusCode'); + await consumeResponseBody(body); + + aTrans.end(); + t.error(await promisyApmFlush(), 'no apm.flush() error'); + + t.equal(apm._apmClient.spans.length, 1); + const span = apm._apmClient.spans[0]; + assertUndiciSpan(t, span, url); + + // If there is already a 'traceparent' header in the way, the APM agent + // should at least *not* result in duplicate headers, even if that means + // breaking distributed tracing. + let numTraceparentHeaders = 0; + let numTracestateHeaders = 0; + for (let i = 0; i < lastServerReq.rawHeaders.length; i += 2) { + const k = lastServerReq.rawHeaders[i].toLowerCase(); + if (k === 'traceparent') { + numTraceparentHeaders++; + } else if (k === 'tracestate') { + numTracestateHeaders++; + } + } + t.equal(numTraceparentHeaders, 1, 'just one traceparent header'); + t.equal(numTracestateHeaders, 0, 'tracestate header was skipped'); + + t.end(); +}); + test('teardown', (t) => { undici.getGlobalDispatcher().close(); // Close kept-alive sockets. server.close(); diff --git a/test/opentelemetry-metrics/fixtures/package-lock.json b/test/opentelemetry-metrics/fixtures/package-lock.json index be821a55e10..81bc94681de 100644 --- a/test/opentelemetry-metrics/fixtures/package-lock.json +++ b/test/opentelemetry-metrics/fixtures/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@opentelemetry/api": "^1.3.0", "@opentelemetry/exporter-prometheus": ">=0.41.2 <2", - "@opentelemetry/sdk-metrics": "^1.21.0" + "@opentelemetry/sdk-metrics": "^1.23.0" } }, "node_modules/@opentelemetry/api": { @@ -22,11 +22,11 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", - "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -36,13 +36,13 @@ } }, "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.49.1.tgz", - "integrity": "sha512-FgzGl6OH22f+Wb1dh/TnoQSnZE2SCADhHx06nMqxivSqRJ9t3AhUdMsEOFt2IMjZClE705pcsLHk10BCJ79vsA==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.50.0.tgz", + "integrity": "sha512-6jBrGqzpU1b2gCPUWTSSW+G3ejbZRx9SYhhFg0MO6v8R51mcln9KH6oIdTDrA+3Ie3L18bpygKrIWA9VPWEifg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-metrics": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-metrics": "1.23.0" }, "engines": { "node": ">=14" @@ -52,12 +52,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", - "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" }, "engines": { "node": ">=14" @@ -67,12 +67,12 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", - "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", "dependencies": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", "lodash.merge": "^4.6.2" }, "engines": { @@ -83,9 +83,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", - "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==", "engines": { "node": ">=14" } @@ -103,46 +103,46 @@ "integrity": "sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==" }, "@opentelemetry/core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.22.0.tgz", - "integrity": "sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.23.0.tgz", + "integrity": "sha512-hdQ/a9TMzMQF/BO8Cz1juA43/L5YGtCSiKoOHmrTEf7VMDAZgy8ucpWx3eQTnQ3gBloRcWtzvcrMZABC3PTSKQ==", "requires": { - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/semantic-conventions": "1.23.0" } }, "@opentelemetry/exporter-prometheus": { - "version": "0.49.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.49.1.tgz", - "integrity": "sha512-FgzGl6OH22f+Wb1dh/TnoQSnZE2SCADhHx06nMqxivSqRJ9t3AhUdMsEOFt2IMjZClE705pcsLHk10BCJ79vsA==", + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.50.0.tgz", + "integrity": "sha512-6jBrGqzpU1b2gCPUWTSSW+G3ejbZRx9SYhhFg0MO6v8R51mcln9KH6oIdTDrA+3Ie3L18bpygKrIWA9VPWEifg==", "requires": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", - "@opentelemetry/sdk-metrics": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", + "@opentelemetry/sdk-metrics": "1.23.0" } }, "@opentelemetry/resources": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.22.0.tgz", - "integrity": "sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.23.0.tgz", + "integrity": "sha512-iPRLfVfcEQynYGo7e4Di+ti+YQTAY0h5mQEUJcHlU9JOqpb4x965O6PZ+wMcwYVY63G96KtdS86YCM1BF1vQZg==", "requires": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/semantic-conventions": "1.22.0" + "@opentelemetry/core": "1.23.0", + "@opentelemetry/semantic-conventions": "1.23.0" } }, "@opentelemetry/sdk-metrics": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.22.0.tgz", - "integrity": "sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.23.0.tgz", + "integrity": "sha512-4OkvW6+wST4h6LFG23rXSTf6nmTf201h9dzq7bE0z5R9ESEVLERZz6WXwE7PSgg1gdjlaznm1jLJf8GttypFDg==", "requires": { - "@opentelemetry/core": "1.22.0", - "@opentelemetry/resources": "1.22.0", + "@opentelemetry/core": "1.23.0", + "@opentelemetry/resources": "1.23.0", "lodash.merge": "^4.6.2" } }, "@opentelemetry/semantic-conventions": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.22.0.tgz", - "integrity": "sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.23.0.tgz", + "integrity": "sha512-MiqFvfOzfR31t8cc74CTP1OZfz7MbqpAnLCra8NqQoaHJX6ncIRTdYOQYBDQ2uFISDq0WY8Y9dDTWvsgzzBYRg==" }, "lodash.merge": { "version": "4.6.2", diff --git a/test/opentelemetry-metrics/fixtures/package.json b/test/opentelemetry-metrics/fixtures/package.json index 38c6b006691..cf354c777af 100644 --- a/test/opentelemetry-metrics/fixtures/package.json +++ b/test/opentelemetry-metrics/fixtures/package.json @@ -5,6 +5,6 @@ "dependencies": { "@opentelemetry/api": "^1.3.0", "@opentelemetry/exporter-prometheus": ">=0.41.2 <2", - "@opentelemetry/sdk-metrics": "^1.21.0" + "@opentelemetry/sdk-metrics": "^1.23.0" } }