diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e80e2e869905..72d572c01e5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -801,7 +801,15 @@ jobs: needs: [job_get_metadata, job_build, job_compile_bindings_profiling_node] runs-on: ubuntu-20.04-large-js timeout-minutes: 15 + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} + matrix-optional: ${{ steps.matrix-optional.outputs.matrix }} steps: + - name: Check out base commit (${{ github.event.pull_request.base.sha }}) + uses: actions/checkout@v4 + if: github.event_name == 'pull_request' + with: + ref: ${{ github.event.pull_request.base.sha }} - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v4 with: @@ -851,11 +859,21 @@ jobs: path: ${{ github.workspace }}/packages/*/*.tgz key: ${{ env.BUILD_CACHE_TARBALL_KEY }} + - name: Determine which E2E test applications should be run + id: matrix + run: yarn --silent ci:build-matrix --base=${{ (github.event_name == 'pull_request' && github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + + - name: Determine which optional E2E test applications should be run + id: matrix-optional + run: yarn --silent ci:build-matrix-optional --base=${{ (github.event_name == 'pull_request' && github.event.pull_request.base.sha) || '' }} >> $GITHUB_OUTPUT + working-directory: dev-packages/e2e-tests + job_e2e_tests: name: E2E ${{ matrix.label || matrix.test-application }} Test # We need to add the `always()` check here because the previous step has this as well :( # See: https://github.com/actions/runner/issues/2205 - if: always() && needs.job_e2e_prepare.result == 'success' + if: always() && needs.job_e2e_prepare.result == 'success' && needs.job_e2e_prepare.outputs.matrix != '{"include":[]}' needs: [job_get_metadata, job_build, job_e2e_prepare] runs-on: ubuntu-20.04 timeout-minutes: 15 @@ -870,105 +888,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: - is_dependabot: - - ${{ github.actor == 'dependabot[bot]' }} - test-application: - [ - 'angular-17', - 'angular-18', - 'astro-4', - 'aws-lambda-layer-cjs', - 'aws-serverless-esm', - 'node-express', - 'create-react-app', - 'create-next-app', - 'create-remix-app', - 'create-remix-app-legacy', - 'create-remix-app-v2', - 'create-remix-app-v2-legacy', - 'create-remix-app-express', - 'create-remix-app-express-legacy', - 'create-remix-app-express-vite-dev', - 'default-browser', - 'node-express-esm-loader', - 'node-express-esm-preload', - 'node-express-esm-without-loader', - 'node-express-cjs-preload', - 'node-otel-sdk-node', - 'node-otel-custom-sampler', - 'node-otel-without-tracing', - 'ember-classic', - 'ember-embroider', - 'nextjs-app-dir', - 'nextjs-13', - 'nextjs-14', - 'nextjs-15', - 'nextjs-turbo', - 'nextjs-t3', - 'react-17', - 'react-19', - 'react-create-hash-router', - 'react-router-6-use-routes', - 'react-router-5', - 'react-router-6', - 'solid', - 'solidstart', - 'solidstart-spa', - 'svelte-5', - 'sveltekit', - 'sveltekit-2', - 'sveltekit-2-svelte-5', - 'sveltekit-2-twp', - 'tanstack-router', - 'generic-ts3.8', - 'node-fastify', - 'node-fastify-5', - 'node-hapi', - 'node-nestjs-basic', - 'node-nestjs-distributed-tracing', - 'nestjs-basic', - 'nestjs-8', - 'nestjs-distributed-tracing', - 'nestjs-with-submodules', - 'nestjs-with-submodules-decorator', - 'nestjs-basic-with-graphql', - 'nestjs-graphql', - 'node-exports-test-app', - 'node-koa', - 'node-connect', - 'nuxt-3', - 'nuxt-3-min', - 'nuxt-4', - 'vue-3', - 'webpack-4', - 'webpack-5' - ] - build-command: - - false - label: - - false - # Add any variations of a test app here - # You should provide an alternate build-command as well as a matching label - include: - - test-application: 'create-react-app' - build-command: 'test:build-ts3.8' - label: 'create-react-app (TS 3.8)' - - test-application: 'react-router-6' - build-command: 'test:build-ts3.8' - label: 'react-router-6 (TS 3.8)' - - test-application: 'create-next-app' - build-command: 'test:build-13' - label: 'create-next-app (next@13)' - - test-application: 'nextjs-app-dir' - build-command: 'test:build-13' - label: 'nextjs-app-dir (next@13)' - exclude: - - is_dependabot: true - test-application: 'cloudflare-astro' - - is_dependabot: true - test-application: 'cloudflare-workers' - + matrix: ${{ fromJson(needs.job_e2e_prepare.outputs.matrix) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v4 @@ -1069,6 +989,7 @@ jobs: # See: https://github.com/actions/runner/issues/2205 if: always() && needs.job_e2e_prepare.result == 'success' && + needs.job_e2e_prepare.outputs.matrix-optional != '{"include":[]}' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && github.actor != 'dependabot[bot]' needs: [job_get_metadata, job_build, job_e2e_prepare] @@ -1085,58 +1006,7 @@ jobs: E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: fail-fast: false - matrix: - test-application: - [ - 'cloudflare-astro', - 'cloudflare-workers', - 'react-send-to-sentry', - 'node-express-send-to-sentry', - 'debug-id-sourcemaps', - ] - build-command: - - false - assert-command: - - false - label: - - false - include: - - test-application: 'create-remix-app' - assert-command: 'test:assert-sourcemaps' - label: 'create-remix-app (sourcemaps)' - - test-application: 'create-remix-app-legacy' - assert-command: 'test:assert-sourcemaps' - label: 'create-remix-app-legacy (sourcemaps)' - - test-application: 'nextjs-app-dir' - build-command: 'test:build-canary' - label: 'nextjs-app-dir (canary)' - - test-application: 'nextjs-app-dir' - build-command: 'test:build-latest' - label: 'nextjs-app-dir (latest)' - - test-application: 'nextjs-13' - build-command: 'test:build-canary' - label: 'nextjs-13 (canary)' - - test-application: 'nextjs-13' - build-command: 'test:build-latest' - label: 'nextjs-13 (latest)' - - test-application: 'nextjs-14' - build-command: 'test:build-canary' - label: 'nextjs-14 (canary)' - - test-application: 'nextjs-14' - build-command: 'test:build-latest' - label: 'nextjs-14 (latest)' - - test-application: 'nextjs-15' - build-command: 'test:build-canary' - label: 'nextjs-15 (canary)' - - test-application: 'nextjs-15' - build-command: 'test:build-latest' - label: 'nextjs-15 (latest)' - - test-application: 'nextjs-turbo' - build-command: 'test:build-canary' - label: 'nextjs-turbo (canary)' - - test-application: 'nextjs-turbo' - build-command: 'test:build-latest' - label: 'nextjs-turbo (latest)' + matrix: ${{ fromJson(needs.job_e2e_prepare.outputs.matrix-optional) }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) diff --git a/dev-packages/e2e-tests/lib/getTestMatrix.ts b/dev-packages/e2e-tests/lib/getTestMatrix.ts new file mode 100644 index 000000000000..342f20cf9820 --- /dev/null +++ b/dev-packages/e2e-tests/lib/getTestMatrix.ts @@ -0,0 +1,155 @@ +import { execSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import { dirname } from 'path'; +import { parseArgs } from 'util'; +import { sync as globSync } from 'glob'; + +interface MatrixInclude { + /** The test application (directory) name. */ + 'test-application': string; + /** Optional override for the build command to run. */ + 'build-command'?: string; + /** Optional override for the assert command to run. */ + 'assert-command'?: string; + /** Optional label for the test run. If not set, defaults to value of `test-application`. */ + label?: string; +} + +interface PackageJsonSentryTestConfig { + /** If this is true, the test app is optional. */ + optional?: boolean; + /** Variant configs that should be run in non-optional test runs. */ + variants?: Partial[]; + /** Variant configs that should be run in optional test runs. */ + optionalVariants?: Partial[]; + /** Skip this test app for matrix generation. */ + skip?: boolean; +} + +/** + * This methods generates a matrix for the GitHub Actions workflow to run the E2E tests. + * It checks which test applications are affected by the current changes in the PR and then generates a matrix + * including all test apps that have at least one dependency that was changed in the PR. + * If no `--base=xxx` is provided, it will output all test applications. + * + * If `--optional=true` is set, it will generate a matrix of optional test applications only. + * Otherwise, these will be skipped. + */ +function run(): void { + const { values } = parseArgs({ + args: process.argv.slice(2), + options: { + base: { type: 'string' }, + head: { type: 'string' }, + optional: { type: 'string', default: 'false' }, + }, + }); + + const { base, head, optional } = values; + + const testApplications = globSync('*/package.json', { + cwd: `${__dirname}/../test-applications`, + }).map(filePath => dirname(filePath)); + + // If `--base=xxx` is defined, we only want to get test applications changed since that base + // Else, we take all test applications (e.g. on push) + const includedTestApplications = base + ? getAffectedTestApplications(testApplications, { base, head }) + : testApplications; + + const optionalMode = optional === 'true'; + const includes: MatrixInclude[] = []; + + includedTestApplications.forEach(testApp => { + addIncludesForTestApp(testApp, includes, { optionalMode }); + }); + + // We print this to the output, so the GHA can use it for the matrix + // eslint-disable-next-line no-console + console.log(`matrix=${JSON.stringify({ include: includes })}`); +} + +function addIncludesForTestApp( + testApp: string, + includes: MatrixInclude[], + { optionalMode }: { optionalMode: boolean }, +): void { + const packageJson = getPackageJson(testApp); + + const shouldSkip = packageJson.sentryTest?.skip || false; + const isOptional = packageJson.sentryTest?.optional || false; + const variants = (optionalMode ? packageJson.sentryTest?.optionalVariants : packageJson.sentryTest?.variants) || []; + + if (shouldSkip) { + return; + } + + // Add the basic test-application itself, if it is in the current mode + if (optionalMode === isOptional) { + includes.push({ + 'test-application': testApp, + }); + } + + variants.forEach(variant => { + includes.push({ + 'test-application': testApp, + ...variant, + }); + }); +} + +function getSentryDependencies(appName: string): string[] { + const packageJson = getPackageJson(appName) || {}; + + const dependencies = { + ...packageJson.devDependencies, + ...packageJson.dependencies, + }; + + return Object.keys(dependencies).filter(key => key.startsWith('@sentry')); +} + +function getPackageJson(appName: string): { + dependencies?: { [key: string]: string }; + devDependencies?: { [key: string]: string }; + sentryTest?: PackageJsonSentryTestConfig; +} { + const fullPath = path.resolve(__dirname, '..', 'test-applications', appName, 'package.json'); + + if (!fs.existsSync(fullPath)) { + throw new Error(`Could not find package.json for ${appName}`); + } + + return JSON.parse(fs.readFileSync(fullPath, 'utf8')); +} + +run(); + +function getAffectedTestApplications( + testApplications: string[], + { base = 'develop', head }: { base?: string; head?: string }, +): string[] { + const additionalArgs = [`--base=${base}`]; + + if (head) { + additionalArgs.push(`--head=${head}`); + } + + const affectedProjects = execSync(`yarn --silent nx show projects --affected ${additionalArgs.join(' ')}`) + .toString() + .split('\n') + .map(line => line.trim()) + .filter(Boolean); + + // If something in e2e tests themselves are changed, just run everything + if (affectedProjects.includes('@sentry-internal/e2e-tests')) { + return testApplications; + } + + return testApplications.filter(testApp => { + const sentryDependencies = getSentryDependencies(testApp); + return sentryDependencies.some(dep => affectedProjects.includes(dep)); + }); +} diff --git a/dev-packages/e2e-tests/package.json b/dev-packages/e2e-tests/package.json index fdb5958462ee..ccf59ef38f9d 100644 --- a/dev-packages/e2e-tests/package.json +++ b/dev-packages/e2e-tests/package.json @@ -14,11 +14,13 @@ "test:prepare": "ts-node prepare.ts", "test:validate": "run-s test:validate-configuration test:validate-test-app-setups", "clean": "rimraf tmp node_modules pnpm-lock.yaml && yarn clean:test-applications", + "ci:build-matrix": "ts-node ./lib/getTestMatrix.ts", + "ci:build-matrix-optional": "ts-node ./lib/getTestMatrix.ts --optional=true", "clean:test-applications": "rimraf --glob test-applications/**/{node_modules,dist,build,.next,.sveltekit,pnpm-lock.yaml} .last-run.json && pnpm store prune" }, "devDependencies": { "@types/glob": "8.0.0", - "@types/node": "^14.18.0", + "@types/node": "^18.0.0", "dotenv": "16.0.3", "esbuild": "0.20.0", "glob": "8.0.3", diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-astro/package.json b/dev-packages/e2e-tests/test-applications/cloudflare-astro/package.json index fd636122d590..d2fc66736b4f 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-astro/package.json +++ b/dev-packages/e2e-tests/test-applications/cloudflare-astro/package.json @@ -26,5 +26,8 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optional": true } } diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-workers/package.json b/dev-packages/e2e-tests/test-applications/cloudflare-workers/package.json index bb01c0b8a8ad..f7fd08df85f9 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-workers/package.json +++ b/dev-packages/e2e-tests/test-applications/cloudflare-workers/package.json @@ -24,5 +24,8 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optional": true } } diff --git a/dev-packages/e2e-tests/test-applications/create-next-app/package.json b/dev-packages/e2e-tests/test-applications/create-next-app/package.json index 9c240942b3b7..316fb561cdf3 100644 --- a/dev-packages/e2e-tests/test-applications/create-next-app/package.json +++ b/dev-packages/e2e-tests/test-applications/create-next-app/package.json @@ -27,5 +27,13 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "variants": [ + { + "build-command": "test:build-13", + "label": "create-next-app (next@13)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/create-react-app/package.json b/dev-packages/e2e-tests/test-applications/create-react-app/package.json index ce3471d2a7d1..916a17260a2a 100644 --- a/dev-packages/e2e-tests/test-applications/create-react-app/package.json +++ b/dev-packages/e2e-tests/test-applications/create-react-app/package.json @@ -43,5 +43,13 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "variants": [ + { + "build-command": "test:build-ts3.8", + "label": "create-react-app (TS 3.8)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/create-remix-app-legacy/package.json b/dev-packages/e2e-tests/test-applications/create-remix-app-legacy/package.json index 4b7c2c162b86..6b50ddc96b4a 100644 --- a/dev-packages/e2e-tests/test-applications/create-remix-app-legacy/package.json +++ b/dev-packages/e2e-tests/test-applications/create-remix-app-legacy/package.json @@ -36,5 +36,13 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "assert-command": "test:assert-sourcemaps", + "label": "create-remix-app-legacy (sourcemaps)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/create-remix-app/package.json b/dev-packages/e2e-tests/test-applications/create-remix-app/package.json index db5c5b474ef0..4850fedf1e5d 100644 --- a/dev-packages/e2e-tests/test-applications/create-remix-app/package.json +++ b/dev-packages/e2e-tests/test-applications/create-remix-app/package.json @@ -36,5 +36,13 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "assert-command": "test:assert-sourcemaps", + "label": "create-remix-app (sourcemaps)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/debug-id-sourcemaps/package.json b/dev-packages/e2e-tests/test-applications/debug-id-sourcemaps/package.json index 9295b7997ee6..6451610ffe86 100644 --- a/dev-packages/e2e-tests/test-applications/debug-id-sourcemaps/package.json +++ b/dev-packages/e2e-tests/test-applications/debug-id-sourcemaps/package.json @@ -19,5 +19,8 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optional": true } } diff --git a/dev-packages/e2e-tests/test-applications/generic-ts3.8/package.json b/dev-packages/e2e-tests/test-applications/generic-ts3.8/package.json index d13bf86e7c64..80875e5a2d0f 100644 --- a/dev-packages/e2e-tests/test-applications/generic-ts3.8/package.json +++ b/dev-packages/e2e-tests/test-applications/generic-ts3.8/package.json @@ -10,7 +10,8 @@ "test:assert": "pnpm -v" }, "devDependencies": { - "typescript": "3.8.3" + "typescript": "3.8.3", + "@types/node": "^14.18.0" }, "dependencies": { "@sentry/browser": "latest || *", diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json index 3e7a0ac88266..c56d7c6ed204 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json @@ -41,5 +41,17 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "build-command": "test:build-canary", + "label": "nextjs-13 (canary)" + }, + { + "build-command": "test:build-latest", + "label": "nextjs-13 (latest)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/nextjs-14/package.json b/dev-packages/e2e-tests/test-applications/nextjs-14/package.json index bbda1b0144cc..c8fcba03410d 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-14/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-14/package.json @@ -41,5 +41,17 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "build-command": "test:build-canary", + "label": "nextjs-14 (canary)" + }, + { + "build-command": "test:build-latest", + "label": "nextjs-14 (latest)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/nextjs-15/package.json b/dev-packages/e2e-tests/test-applications/nextjs-15/package.json index 04033e0362b2..1c5754bd66da 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-15/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-15/package.json @@ -42,5 +42,17 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "build-command": "test:build-canary", + "label": "nextjs-15 (canary)" + }, + { + "build-command": "test:build-latest", + "label": "nextjs-15 (latest)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json index 8ccad25e6ab4..b0bc898d9bd1 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json @@ -44,5 +44,23 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "variants": [ + { + "build-command": "test:build-13", + "label": "nextjs-app-dir (next@13)" + } + ], + "optionalVariants": [ + { + "build-command": "test:build-canary", + "label": "nextjs-app-dir (canary)" + }, + { + "build-command": "test:build-latest", + "label": "nextjs-app-dir (latest)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json b/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json index 900e0b5b2efc..9cf05720fc28 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json @@ -45,5 +45,17 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optionalVariants": [ + { + "build-command": "test:build-canary", + "label": "nextjs-turbo (canary)" + }, + { + "build-command": "test:build-latest", + "label": "nextjs-turbo (latest)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/package.json b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/package.json index 96f61837c597..5a1b9b7d8300 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/package.json +++ b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/package.json @@ -24,5 +24,8 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optional": true } } diff --git a/dev-packages/e2e-tests/test-applications/node-profiling/package.json b/dev-packages/e2e-tests/test-applications/node-profiling/package.json index cfe4e136b1c1..8aede827a1f3 100644 --- a/dev-packages/e2e-tests/test-applications/node-profiling/package.json +++ b/dev-packages/e2e-tests/test-applications/node-profiling/package.json @@ -22,5 +22,8 @@ "devDependencies": {}, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "skip": true } } diff --git a/dev-packages/e2e-tests/test-applications/react-router-6/package.json b/dev-packages/e2e-tests/test-applications/react-router-6/package.json index 5171a89eadb3..b3ef37f6bc4a 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-6/package.json +++ b/dev-packages/e2e-tests/test-applications/react-router-6/package.json @@ -51,5 +51,13 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "variants": [ + { + "build-command": "test:build-ts3.8", + "label": "react-router-6 (TS 3.8)" + } + ] } } diff --git a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/package.json b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/package.json index 95b9c3bd78b4..a6ba509bc09a 100644 --- a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/package.json +++ b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/package.json @@ -47,5 +47,8 @@ }, "volta": { "extends": "../../package.json" + }, + "sentryTest": { + "optional": true } } diff --git a/yarn.lock b/yarn.lock index ee2e6542a2e0..ab60214fdc7a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10061,10 +10061,12 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "17.0.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.38.tgz#f8bb07c371ccb1903f3752872c89f44006132947" - integrity sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g== +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18": + version "22.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365" + integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== + dependencies: + undici-types "~6.19.8" "@types/node@16.18.70": version "16.18.70" @@ -10076,13 +10078,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== -"@types/node@>=18": - version "22.7.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.4.tgz#e35d6f48dca3255ce44256ddc05dee1c23353fcc" - integrity sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg== - dependencies: - undici-types "~6.19.2" - "@types/node@^10.1.0": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" @@ -10093,6 +10088,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== +"@types/node@^18.0.0": + version "18.19.64" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.64.tgz#122897fb79f2a9ec9c979bded01c11461b2b1478" + integrity sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -12922,25 +12924,7 @@ bluebird@^3.4.6, bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.3, body-parser@^1.18.3, body-parser@^1.19.0: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^1.20.3: +body-parser@1.20.3, body-parser@^1.18.3, body-parser@^1.19.0, body-parser@^1.20.3: version "1.20.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== @@ -28321,13 +28305,6 @@ qs@^6.4.0: dependencies: side-channel "^1.0.4" -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - query-string@^4.2.2: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -32419,7 +32396,12 @@ underscore@>=1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== -undici-types@~6.19.2: +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.19.8: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==