From 8c0631a59da1eadcb97b8ce8baab74bd7f7ec7ab Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Thu, 4 Jul 2024 13:46:49 +0200 Subject: [PATCH 1/2] test(e2e): Do not require DSN to run E2E tests (#12743) First, this means it is easier to run this locally. Secondly, we do not even need to send data to Sentry anymore, so we can adjust the proxy server to stop doing this. Lastly, this means that we can also safely run E2E tests for external contributors. Closes https://github.com/getsentry/sentry-javascript/issues/11910 --- .github/workflows/build.yml | 38 ++++++++++--------- .github/workflows/canary.yml | 12 +++--- dev-packages/e2e-tests/README.md | 3 +- dev-packages/e2e-tests/lib/validate.ts | 33 ---------------- dev-packages/e2e-tests/prepare.ts | 5 --- dev-packages/e2e-tests/run.ts | 23 +++++++---- .../start-event-proxy.mjs | 1 - .../create-remix-app-legacy/package.json | 6 ++- .../create-remix-app/package.json | 6 ++- .../test-applications/react-19/src/index.tsx | 4 +- .../test-utils/src/event-proxy-server.ts | 12 ++++-- 11 files changed, 62 insertions(+), 81 deletions(-) delete mode 100644 dev-packages/e2e-tests/lib/validate.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bee434e40dc2..779e221b093c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -971,22 +971,19 @@ jobs: job_e2e_tests: name: E2E ${{ matrix.label || matrix.test-application }} Test - # We only run E2E tests for non-fork PRs because the E2E tests require secrets to work and they can't be accessed from forks # 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' && - (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) + if: always() && needs.job_e2e_prepare.result == 'success' needs: [job_get_metadata, job_build, job_e2e_prepare] runs-on: ubuntu-20.04 timeout-minutes: 10 env: - E2E_TEST_AUTH_TOKEN: ${{ secrets.E2E_TEST_AUTH_TOKEN }} - E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} + # We just use a dummy DSN here, only send to the tunnel anyhow + E2E_TEST_DSN: 'https://username@domain/123' # Needed because some apps expect a certain prefix - NEXT_PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - REACT_APP_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} + NEXT_PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + REACT_APP_E2E_TEST_DSN: 'https://username@domain/123' E2E_TEST_SENTRY_ORG_SLUG: 'sentry-javascript-sdks' E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: @@ -1072,7 +1069,7 @@ jobs: ref: ${{ env.HEAD_COMMIT }} - uses: pnpm/action-setup@v4 with: - version: 8.3.1 + version: 9.4.0 - name: Set up Node uses: actions/setup-node@v4 with: @@ -1109,12 +1106,12 @@ jobs: - name: Build E2E app working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }} timeout-minutes: 5 - run: yarn ${{ matrix.build-command || 'test:build' }} + run: pnpm ${{ matrix.build-command || 'test:build' }} - name: Run E2E test working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }} timeout-minutes: 5 - run: yarn test:assert + run: pnpm test:assert - name: Deploy Astro to Cloudflare uses: cloudflare/pages-action@v1 @@ -1149,8 +1146,6 @@ jobs: strategy: fail-fast: false matrix: - is_dependabot: - - ${{ github.actor == 'dependabot[bot]' }} test-application: [ 'react-send-to-sentry', @@ -1159,8 +1154,17 @@ jobs: ] 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)' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -1169,7 +1173,7 @@ jobs: ref: ${{ env.HEAD_COMMIT }} - uses: pnpm/action-setup@v4 with: - version: 8.3.1 + version: 9.4.0 - name: Set up Node uses: actions/setup-node@v4 with: @@ -1203,12 +1207,12 @@ jobs: - name: Build E2E app working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }} timeout-minutes: 5 - run: yarn ${{ matrix.build-command || 'test:build' }} + run: pnpm ${{ matrix.build-command || 'test:build' }} - name: Run E2E test working-directory: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }} timeout-minutes: 5 - run: yarn test:assert + run: pnpm ${{ matrix.assert-command || 'test:assert' }} job_profiling_e2e_tests: name: E2E ${{ matrix.label || matrix.test-application }} Test diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index f861f4b4ae3b..65e691e2ff0b 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -56,12 +56,12 @@ jobs: runs-on: ubuntu-20.04 timeout-minutes: 20 env: - E2E_TEST_AUTH_TOKEN: ${{ secrets.E2E_TEST_AUTH_TOKEN }} - E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - # Needed because certain apps expect a certain prefix - NEXT_PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - PUBLIC_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} - REACT_APP_E2E_TEST_DSN: ${{ secrets.E2E_TEST_DSN }} + # We just use a dummy DSN here, only send to the tunnel anyhow + E2E_TEST_DSN: 'https://username@domain/123' + # Needed because some apps expect a certain prefix + NEXT_PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + PUBLIC_E2E_TEST_DSN: 'https://username@domain/123' + REACT_APP_E2E_TEST_DSN: 'https://username@domain/123' E2E_TEST_SENTRY_ORG_SLUG: 'sentry-javascript-sdks' E2E_TEST_SENTRY_PROJECT: 'sentry-javascript-e2e-tests' strategy: diff --git a/dev-packages/e2e-tests/README.md b/dev-packages/e2e-tests/README.md index 77d327ba1015..c82b0765e68a 100644 --- a/dev-packages/e2e-tests/README.md +++ b/dev-packages/e2e-tests/README.md @@ -8,7 +8,8 @@ current state. Prerequisites: Docker - Copy `.env.example` to `.env` -- Fill in auth information in `.env` for an example Sentry project +- OPTIONAL: Fill in auth information in `.env` for an example Sentry project - you only need this to run E2E tests that + send data to Sentry. - Run `yarn build:tarball` in the root of the repository To finally run all of the tests: diff --git a/dev-packages/e2e-tests/lib/validate.ts b/dev-packages/e2e-tests/lib/validate.ts deleted file mode 100644 index 7476067939de..000000000000 --- a/dev-packages/e2e-tests/lib/validate.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* eslint-disable no-console */ - -export function validate(): boolean { - let missingEnvVar = false; - - if (!process.env.E2E_TEST_AUTH_TOKEN) { - console.log( - "No auth token configured! Please configure the E2E_TEST_AUTH_TOKEN environment variable with an auth token that has the scope 'project:read'!", - ); - missingEnvVar = true; - } - - if (!process.env.E2E_TEST_DSN) { - console.log('No DSN configured! Please configure the E2E_TEST_DSN environment variable with a DSN!'); - missingEnvVar = true; - } - - if (!process.env.E2E_TEST_SENTRY_ORG_SLUG) { - console.log( - 'No Sentry organization slug configured! Please configure the E2E_TEST_SENTRY_ORG_SLUG environment variable with a Sentry organization slug!', - ); - missingEnvVar = true; - } - - if (!process.env.E2E_TEST_SENTRY_PROJECT) { - console.log( - 'No Sentry project configured! Please configure the `E2E_TEST_SENTRY_PROJECT` environment variable with a Sentry project slug!', - ); - missingEnvVar = true; - } - - return !missingEnvVar; -} diff --git a/dev-packages/e2e-tests/prepare.ts b/dev-packages/e2e-tests/prepare.ts index 3a230723d9a7..5981d1165164 100644 --- a/dev-packages/e2e-tests/prepare.ts +++ b/dev-packages/e2e-tests/prepare.ts @@ -1,17 +1,12 @@ /* eslint-disable no-console */ import * as dotenv from 'dotenv'; -import { validate } from './lib/validate'; import { registrySetup } from './registrySetup'; async function run(): Promise { // Load environment variables from .env file locally dotenv.config(); - if (!validate()) { - process.exit(1); - } - try { registrySetup(); } catch (error) { diff --git a/dev-packages/e2e-tests/run.ts b/dev-packages/e2e-tests/run.ts index c7c2618492cb..f8aafa5eaa01 100644 --- a/dev-packages/e2e-tests/run.ts +++ b/dev-packages/e2e-tests/run.ts @@ -4,9 +4,12 @@ import { resolve } from 'path'; import * as dotenv from 'dotenv'; import { sync as globSync } from 'glob'; -import { validate } from './lib/validate'; import { registrySetup } from './registrySetup'; +const DEFAULT_DSN = 'https://username@domain/123'; +const DEFAULT_SENTRY_ORG_SLUG = 'sentry-javascript-sdks'; +const DEFAULT_SENTRY_PROJECT = 'sentry-javascript-e2e-tests'; + function asyncExec(command: string, options: { env: Record; cwd: string }): Promise { return new Promise((resolve, reject) => { const process = spawn(command, { ...options, shell: true }); @@ -39,17 +42,21 @@ async function run(): Promise { // Allow to run a single app only via `yarn test:run ` const appName = process.argv[2]; - if (!validate()) { - process.exit(1); - } + const dsn = process.env.E2E_TEST_DSN || DEFAULT_DSN; const envVarsToInject = { - NEXT_PUBLIC_E2E_TEST_DSN: process.env.E2E_TEST_DSN, - PUBLIC_E2E_TEST_DSN: process.env.E2E_TEST_DSN, - REACT_APP_E2E_TEST_DSN: process.env.E2E_TEST_DSN, + E2E_TEST_DSN: dsn, + NEXT_PUBLIC_E2E_TEST_DSN: dsn, + PUBLIC_E2E_TEST_DSN: dsn, + REACT_APP_E2E_TEST_DSN: dsn, + E2E_TEST_SENTRY_ORG_SLUG: process.env.E2E_TEST_SENTRY_ORG_SLUG || DEFAULT_SENTRY_ORG_SLUG, + E2E_TEST_SENTRY_PROJECT: process.env.E2E_TEST_SENTRY_PROJECT || DEFAULT_SENTRY_PROJECT, }; - const env = { ...process.env, ...envVarsToInject }; + const env = { + ...process.env, + ...envVarsToInject, + }; try { console.log('Cleaning test-applications...'); diff --git a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/start-event-proxy.mjs index abc7ea7b0ab2..fc4ac82aa7c6 100644 --- a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/start-event-proxy.mjs +++ b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/start-event-proxy.mjs @@ -3,5 +3,4 @@ import { startEventProxyServer } from '@sentry-internal/test-utils'; startEventProxyServer({ port: 3031, proxyServerName: 'aws-serverless-lambda-layer-cjs', - forwardToSentry: false, }); 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 d70c8f824dbc..4b7c2c162b86 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 @@ -2,13 +2,15 @@ "private": true, "sideEffects": false, "scripts": { - "build": "remix build --sourcemap && ./upload-sourcemaps.sh", + "build": "remix build --sourcemap", + "upload-sourcemaps": "./upload-sourcemaps.sh", "dev": "remix dev", "start": "remix-serve build", "typecheck": "tsc", "clean": "npx rimraf node_modules pnpm-lock.yaml", "test:build": "pnpm install && npx playwright install && pnpm build", - "test:assert": "pnpm playwright test" + "test:assert": "pnpm playwright test", + "test:assert-sourcemaps": "pnpm upload-sourcemaps" }, "dependencies": { "@sentry/remix": "latest || *", 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 1db0d3858918..db5c5b474ef0 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 @@ -2,13 +2,15 @@ "private": true, "sideEffects": false, "scripts": { - "build": "remix build --sourcemap && ./upload-sourcemaps.sh", + "build": "remix build --sourcemap", + "upload-sourcemaps": "./upload-sourcemaps.sh", "dev": "remix dev", "start": "NODE_OPTIONS='--require=./instrument.server.cjs' remix-serve build", "typecheck": "tsc", "clean": "npx rimraf node_modules pnpm-lock.yaml", "test:build": "pnpm install && npx playwright install && pnpm build", - "test:assert": "pnpm playwright test" + "test:assert": "pnpm playwright test", + "test:assert-sourcemaps": "pnpm upload-sourcemaps" }, "dependencies": { "@sentry/remix": "latest || *", diff --git a/dev-packages/e2e-tests/test-applications/react-19/src/index.tsx b/dev-packages/e2e-tests/test-applications/react-19/src/index.tsx index 6f6bb0640e73..6b721b0161f0 100644 --- a/dev-packages/e2e-tests/test-applications/react-19/src/index.tsx +++ b/dev-packages/e2e-tests/test-applications/react-19/src/index.tsx @@ -6,9 +6,7 @@ import Index from './pages/Index'; Sentry.init({ environment: 'qa', // dynamic sampling bias to keep transactions - dsn: - process.env.REACT_APP_E2E_TEST_DSN || - 'https://3b6c388182fb435097f41d181be2b2ba@o4504321058471936.ingest.sentry.io/4504321066008576', + dsn: process.env.REACT_APP_E2E_TEST_DSN, release: 'e2e-test', tunnel: 'http://localhost:3031/', // proxy server }); diff --git a/dev-packages/test-utils/src/event-proxy-server.ts b/dev-packages/test-utils/src/event-proxy-server.ts index e4eb48f03076..a6f0822da0fa 100644 --- a/dev-packages/test-utils/src/event-proxy-server.ts +++ b/dev-packages/test-utils/src/event-proxy-server.ts @@ -19,7 +19,7 @@ interface EventProxyServerOptions { /** The name for the proxy server used for referencing it with listener functions */ proxyServerName: string; /** - * Whether or not to forward the event to sentry. @default `true` + * Whether or not to forward the event to sentry. @default `false` * This is helpful when you can't register a tunnel in the SDK setup (e.g. lambda layer without Sentry.init call) */ forwardToSentry?: boolean; @@ -172,7 +172,7 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P await startProxyServer(options, async (eventCallbackListeners, proxyRequest, proxyRequestBody, eventBuffer) => { const envelopeHeader: EnvelopeItem[0] = JSON.parse(proxyRequestBody.split('\n')[0] as string); - const shouldForwardEventToSentry = options.forwardToSentry != null ? options.forwardToSentry : true; + const shouldForwardEventToSentry = options.forwardToSentry || false; if (!envelopeHeader.dsn && shouldForwardEventToSentry) { // eslint-disable-next-line no-console @@ -195,7 +195,13 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P listener(Buffer.from(JSON.stringify(data)).toString('base64')); }); - return [200, '{}', {}]; + return [ + 200, + '{}', + { + 'Access-Control-Allow-Origin': '*', + }, + ]; } const { origin, pathname, host } = new URL(envelopeHeader.dsn as string); From 4018f80851c4c9b7cf822279e1b054bc667bf3f5 Mon Sep 17 00:00:00 2001 From: Sigrid Huemer <32902192+s1gr1d@users.noreply.github.com> Date: Thu, 4 Jul 2024 14:16:43 +0200 Subject: [PATCH 2/2] fix(hapi): Specify error channel to filter boom errors (#12725) If errors are handled with Boom inside `onPreResponse`, the error should not be reported to Sentry. fixes https://github.com/getsentry/sentry-javascript/issues/12702 --- .../test-applications/node-hapi/package.json | 3 +- .../test-applications/node-hapi/src/app.js | 50 +++ .../node-hapi/tests/errors.test.ts | 94 ++++ .../node-hapi/tests/transactions.test.ts | 19 + .../node-integration-tests/package.json | 2 +- .../src/integrations/tracing/hapi/index.ts | 2 +- yarn.lock | 420 +++++++++--------- 7 files changed, 371 insertions(+), 219 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/node-hapi/package.json b/dev-packages/e2e-tests/test-applications/node-hapi/package.json index a6092edbc5ce..47db96a4a666 100644 --- a/dev-packages/e2e-tests/test-applications/node-hapi/package.json +++ b/dev-packages/e2e-tests/test-applications/node-hapi/package.json @@ -11,7 +11,8 @@ "test:assert": "pnpm test" }, "dependencies": { - "@hapi/hapi": "21.3.2", + "@hapi/boom": "10.0.1", + "@hapi/hapi": "21.3.10", "@sentry/node": "latest || *", "@sentry/types": "latest || *" }, diff --git a/dev-packages/e2e-tests/test-applications/node-hapi/src/app.js b/dev-packages/e2e-tests/test-applications/node-hapi/src/app.js index 273cb2f09471..ae803aa3edf7 100644 --- a/dev-packages/e2e-tests/test-applications/node-hapi/src/app.js +++ b/dev-packages/e2e-tests/test-applications/node-hapi/src/app.js @@ -10,6 +10,7 @@ Sentry.init({ }); const Hapi = require('@hapi/hapi'); +const Boom = require('@hapi/boom'); const server = Hapi.server({ port: 3030, @@ -63,6 +64,55 @@ const init = async () => { throw new Error('This is an error'); }, }); + + server.route({ + method: 'GET', + path: '/test-failure-boom-4xx', + handler: async function (request, h) { + throw new Error('This is a JS error (boom in onPreResponse)'); + }, + }); + + server.route({ + method: 'GET', + path: '/test-failure-boom-5xx', + handler: async function (request, h) { + throw new Error('This is an error (boom in onPreResponse)'); + }, + }); + + server.route({ + method: 'GET', + path: '/test-failure-JS-error-onPreResponse', + handler: async function (request, h) { + throw new Error('This is an error (another JS error in onPreResponse)'); + }, + }); + + server.route({ + method: 'GET', + path: '/test-failure-2xx-override-onPreResponse', + handler: async function (request, h) { + throw new Error('This is a JS error (2xx override in onPreResponse)'); + }, + }); + + // This runs after the route handler + server.ext('onPreResponse', (request, h) => { + const path = request.route.path; + + if (path.includes('boom-4xx')) { + throw Boom.notFound('4xx not found (onPreResponse)'); + } else if (path.includes('boom-5xx')) { + throw Boom.gatewayTimeout('5xx not implemented (onPreResponse)'); + } else if (path.includes('JS-error-onPreResponse')) { + throw new Error('JS error (onPreResponse)'); + } else if (path.includes('2xx-override-onPreResponse')) { + return h.response('2xx override').code(200); + } else { + return h.continue; + } + }); }; (async () => { diff --git a/dev-packages/e2e-tests/test-applications/node-hapi/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/node-hapi/tests/errors.test.ts index 4fb76c1df687..f28250f26f3c 100644 --- a/dev-packages/e2e-tests/test-applications/node-hapi/tests/errors.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-hapi/tests/errors.test.ts @@ -53,3 +53,97 @@ test('sends error with parameterized transaction name', async ({ baseURL }) => { expect(errorEvent?.transaction).toBe('GET /test-error/{id}'); }); + +test('Does not send errors to Sentry if boom throws in "onPreResponse" after JS error in route handler', async ({ + baseURL, +}) => { + let errorEventOccurred = false; + + waitForError('node-hapi', event => { + if (event.exception?.values?.[0]?.value?.includes('This is a JS error (boom in onPreResponse)')) { + errorEventOccurred = true; + } + return false; // expects to return a boolean (but not relevant here) + }); + + const transactionEventPromise4xx = waitForTransaction('node-hapi', transactionEvent => { + return transactionEvent?.transaction === 'GET /test-failure-boom-4xx'; + }); + + const transactionEventPromise5xx = waitForTransaction('node-hapi', transactionEvent => { + return transactionEvent?.transaction === 'GET /test-failure-boom-5xx'; + }); + + const response4xx = await fetch(`${baseURL}/test-failure-boom-4xx`); + const response5xx = await fetch(`${baseURL}/test-failure-boom-5xx`); + + expect(response4xx.status).toBe(404); + expect(response5xx.status).toBe(504); + + const transactionEvent4xx = await transactionEventPromise4xx; + const transactionEvent5xx = await transactionEventPromise5xx; + + expect(errorEventOccurred).toBe(false); + expect(transactionEvent4xx.transaction).toBe('GET /test-failure-boom-4xx'); + expect(transactionEvent5xx.transaction).toBe('GET /test-failure-boom-5xx'); +}); + +test('Does not send error to Sentry if error response is overwritten with 2xx in "onPreResponse"', async ({ + baseURL, +}) => { + let errorEventOccurred = false; + + waitForError('node-hapi', event => { + if (event.exception?.values?.[0]?.value?.includes('This is a JS error (2xx override in onPreResponse)')) { + errorEventOccurred = true; + } + return false; // expects to return a boolean (but not relevant here) + }); + + const transactionEventPromise = waitForTransaction('node-hapi', transactionEvent => { + return transactionEvent?.transaction === 'GET /test-failure-2xx-override-onPreResponse'; + }); + + const response = await fetch(`${baseURL}/test-failure-2xx-override-onPreResponse`); + + const transactionEvent = await transactionEventPromise; + + expect(response.status).toBe(200); + expect(errorEventOccurred).toBe(false); + expect(transactionEvent.transaction).toBe('GET /test-failure-2xx-override-onPreResponse'); +}); + +test('Only sends onPreResponse error to Sentry if JS error is thrown in route handler AND onPreResponse', async ({ + baseURL, +}) => { + const errorEventPromise = waitForError('node-hapi', errorEvent => { + return errorEvent?.exception?.values?.[0]?.value?.includes('JS error (onPreResponse)') || false; + }); + + let routeHandlerErrorOccurred = false; + + waitForError('node-hapi', event => { + if ( + !event.type && + event.exception?.values?.[0]?.value?.includes('This is an error (another JS error in onPreResponse)') + ) { + routeHandlerErrorOccurred = true; + } + return false; // expects to return a boolean (but not relevant here) + }); + + const transactionEventPromise = waitForTransaction('node-hapi', transactionEvent => { + return transactionEvent?.transaction === 'GET /test-failure-JS-error-onPreResponse'; + }); + + const response = await fetch(`${baseURL}/test-failure-JS-error-onPreResponse`); + + expect(response.status).toBe(500); + + const errorEvent = await errorEventPromise; + const transactionEvent = await transactionEventPromise; + + expect(routeHandlerErrorOccurred).toBe(false); + expect(transactionEvent.transaction).toBe('GET /test-failure-JS-error-onPreResponse'); + expect(errorEvent.transaction).toEqual('GET /test-failure-JS-error-onPreResponse'); +}); diff --git a/dev-packages/e2e-tests/test-applications/node-hapi/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/node-hapi/tests/transactions.test.ts index 64e98f8e75d8..4fd0c72ffd54 100644 --- a/dev-packages/e2e-tests/test-applications/node-hapi/tests/transactions.test.ts +++ b/dev-packages/e2e-tests/test-applications/node-hapi/tests/transactions.test.ts @@ -77,6 +77,25 @@ test('Sends successful transaction', async ({ baseURL }) => { timestamp: expect.any(Number), trace_id: expect.any(String), }, + { + // this comes from "onPreResponse" + data: { + 'hapi.type': 'server.ext', + 'otel.kind': 'INTERNAL', + 'sentry.op': 'server.ext.hapi', + 'sentry.origin': 'auto.http.otel.hapi', + 'server.ext.type': 'onPreResponse', + }, + description: 'ext - onPreResponse', + op: 'server.ext.hapi', + origin: 'auto.http.otel.hapi', + parent_span_id: expect.any(String), + span_id: expect.any(String), + start_timestamp: expect.any(Number), + status: 'ok', + timestamp: expect.any(Number), + trace_id: expect.any(String), + }, ]); }); diff --git a/dev-packages/node-integration-tests/package.json b/dev-packages/node-integration-tests/package.json index 2db716ce5586..6bb7db47474e 100644 --- a/dev-packages/node-integration-tests/package.json +++ b/dev-packages/node-integration-tests/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.552.0", - "@hapi/hapi": "^20.3.0", + "@hapi/hapi": "^21.3.10", "@nestjs/common": "^10.3.7", "@nestjs/core": "^10.3.3", "@nestjs/platform-express": "^10.3.3", diff --git a/packages/node/src/integrations/tracing/hapi/index.ts b/packages/node/src/integrations/tracing/hapi/index.ts index 1303464c5374..be452636bef8 100644 --- a/packages/node/src/integrations/tracing/hapi/index.ts +++ b/packages/node/src/integrations/tracing/hapi/index.ts @@ -61,7 +61,7 @@ export const hapiErrorPlugin = { register: async function (serverArg: Record) { const server = serverArg as unknown as Server; - server.events.on('request', (request: Request, event: RequestEvent) => { + server.events.on({ name: 'request', channels: ['error'] }, (request: Request, event: RequestEvent) => { if (getIsolationScope() !== getDefaultIsolationScope()) { const route = request.route; if (route && route.path) { diff --git a/yarn.lock b/yarn.lock index 035d666481bb..676d0b52bbf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5156,267 +5156,255 @@ resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" integrity sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA== -"@hapi/accept@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" - integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - -"@hapi/ammo@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-5.0.1.tgz#9d34560f5c214eda563d838c01297387efaab490" - integrity sha512-FbCNwcTbnQP4VYYhLNGZmA76xb2aHg9AMPiy18NZyWMG310P5KdFGyA9v2rm5ujrIny77dEEIkMOwl0Xv+fSSA== +"@hapi/accept@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-6.0.3.tgz#eef0800a4f89cd969da8e5d0311dc877c37279ab" + integrity sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/b64@5.x.x": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-5.0.0.tgz#b8210cbd72f4774985e78569b77e97498d24277d" - integrity sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw== +"@hapi/ammo@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/ammo/-/ammo-6.0.1.tgz#1bc9f7102724ff288ca03b721854fc5393ad123a" + integrity sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/boom@9.x.x": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.2.tgz#48bd41d67437164a2d636e3b5bc954f8c8dc5e38" - integrity sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q== +"@hapi/b64@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/b64/-/b64-6.0.1.tgz#786b47dc070e14465af49e2428c1025bd06ed3df" + integrity sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/boom@^9.1.0": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" - integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== +"@hapi/boom@^10.0.0", "@hapi/boom@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-10.0.1.tgz#ebb14688275ae150aa6af788dbe482e6a6062685" + integrity sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/bounce@2.x.x", "@hapi/bounce@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-2.0.0.tgz#e6ef56991c366b1e2738b2cd83b01354d938cf3d" - integrity sha512-JesW92uyzOOyuzJKjoLHM1ThiOvHPOLDHw01YV8yh5nCso7sDwJho1h0Ad2N+E62bZyz46TG3xhAi/78Gsct6A== +"@hapi/bounce@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@hapi/bounce/-/bounce-3.0.1.tgz#25a51bf95733749c557c6bf948048bffa66435e4" + integrity sha512-G+/Pp9c1Ha4FDP+3Sy/Xwg2O4Ahaw3lIZFSX+BL4uWi64CmiETuZPxhKDUD4xBMOUZbBlzvO8HjiK8ePnhBadA== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/bourne@2.x.x": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.1.0.tgz#66aff77094dc3080bd5df44ec63881f2676eb020" - integrity sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q== +"@hapi/bourne@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-3.0.0.tgz#f11fdf7dda62fe8e336fa7c6642d9041f30356d7" + integrity sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w== -"@hapi/call@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@hapi/call/-/call-8.0.1.tgz#9e64cd8ba6128eb5be6e432caaa572b1ed8cd7c0" - integrity sha512-bOff6GTdOnoe5b8oXRV3lwkQSb/LAWylvDMae6RgEWWntd0SHtkYbQukDHKlfaYtVnSAgIavJ0kqszF/AIBb6g== +"@hapi/call@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@hapi/call/-/call-9.0.1.tgz#569b87d5b67abf0e58fb82a3894a61aaed3ca92e" + integrity sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/catbox-memory@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-5.0.1.tgz#cb63fca0ded01d445a2573b38eb2688df67f70ac" - integrity sha512-QWw9nOYJq5PlvChLWV8i6hQHJYfvdqiXdvTupJFh0eqLZ64Xir7mKNi96d5/ZMUAqXPursfNDIDxjFgoEDUqeQ== +"@hapi/catbox-memory@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz#399fa83e85134d45a548eee978e4c3c1523e1a70" + integrity sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/catbox@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-11.1.1.tgz#d277e2d5023fd69cddb33d05b224ea03065fec0c" - integrity sha512-u/8HvB7dD/6X8hsZIpskSDo4yMKpHxFd7NluoylhGrL6cUfYxdQPnvUp9YU2C6F9hsyBVLGulBd9vBN1ebfXOQ== +"@hapi/catbox@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@hapi/catbox/-/catbox-12.1.1.tgz#9339dca0a5b18b3ca0a825ac5dfc916dbc5bab83" + integrity sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/podium" "4.x.x" - "@hapi/validate" "1.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/podium" "^5.0.0" + "@hapi/validate" "^2.0.1" -"@hapi/content@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@hapi/content/-/content-5.0.2.tgz#ae57954761de570392763e64cdd75f074176a804" - integrity sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw== +"@hapi/content@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/content/-/content-6.0.0.tgz#2427af3bac8a2f743512fce2a70cbdc365af29df" + integrity sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA== dependencies: - "@hapi/boom" "9.x.x" + "@hapi/boom" "^10.0.0" -"@hapi/cryptiles@5.x.x": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-5.1.0.tgz#655de4cbbc052c947f696148c83b187fc2be8f43" - integrity sha512-fo9+d1Ba5/FIoMySfMqPBR/7Pa29J2RsiPrl7bkwo5W5o+AN1dAYQRi4SPrPwwVxVGKjgLOEWrsvt1BonJSfLA== +"@hapi/cryptiles@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/cryptiles/-/cryptiles-6.0.1.tgz#7868a9d4233567ed66f0a9caf85fdcc56e980621" + integrity sha512-9GM9ECEHfR8lk5ASOKG4+4ZsEzFqLfhiryIJ2ISePVB92OHLp/yne4m+zn7z9dgvM98TLpiFebjDFQ0UHcqxXQ== dependencies: - "@hapi/boom" "9.x.x" + "@hapi/boom" "^10.0.1" -"@hapi/file@2.x.x": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@hapi/file/-/file-2.0.0.tgz#2ecda37d1ae9d3078a67c13b7da86e8c3237dfb9" - integrity sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ== - -"@hapi/hapi@^20.3.0": - version "20.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-20.3.0.tgz#1d620005afeebcb2c8170352286a4664b0107c15" - integrity sha512-zvPSRvaQyF3S6Nev9aiAzko2/hIFZmNSJNcs07qdVaVAvj8dGJSV4fVUuQSnufYJAGiSau+U5LxMLhx79se5WA== - dependencies: - "@hapi/accept" "^5.0.1" - "@hapi/ammo" "^5.0.1" - "@hapi/boom" "^9.1.0" - "@hapi/bounce" "^2.0.0" - "@hapi/call" "^8.0.0" - "@hapi/catbox" "^11.1.1" - "@hapi/catbox-memory" "^5.0.0" - "@hapi/heavy" "^7.0.1" - "@hapi/hoek" "^9.0.4" - "@hapi/mimos" "^6.0.0" - "@hapi/podium" "^4.1.1" - "@hapi/shot" "^5.0.5" - "@hapi/somever" "^3.0.0" - "@hapi/statehood" "^7.0.3" - "@hapi/subtext" "^7.1.0" - "@hapi/teamwork" "^5.1.0" - "@hapi/topo" "^5.0.0" - "@hapi/validate" "^1.1.1" - -"@hapi/heavy@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-7.0.1.tgz#73315ae33b6e7682a0906b7a11e8ca70e3045874" - integrity sha512-vJ/vzRQ13MtRzz6Qd4zRHWS3FaUc/5uivV2TIuExGTM9Qk+7Zzqj0e2G7EpE6KztO9SalTbiIkTh7qFKj/33cA== +"@hapi/file@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@hapi/file/-/file-3.0.0.tgz#f1fd824493ac89a6fceaf89c824afc5ae2121c09" + integrity sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q== + +"@hapi/hapi@^21.3.10": + version "21.3.10" + resolved "https://registry.yarnpkg.com/@hapi/hapi/-/hapi-21.3.10.tgz#0357db7ca49415e50e5df80ba50ad3964f2a62f3" + integrity sha512-CmEcmTREW394MaGGKvWpoOK4rG8tKlpZLs30tbaBzhCrhiL2Ti/HARek9w+8Ya4nMBGcd+kDAzvU44OX8Ms0Jg== + dependencies: + "@hapi/accept" "^6.0.1" + "@hapi/ammo" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/call" "^9.0.1" + "@hapi/catbox" "^12.1.1" + "@hapi/catbox-memory" "^6.0.2" + "@hapi/heavy" "^8.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/mimos" "^7.0.1" + "@hapi/podium" "^5.0.1" + "@hapi/shot" "^6.0.1" + "@hapi/somever" "^4.1.1" + "@hapi/statehood" "^8.1.1" + "@hapi/subtext" "^8.1.0" + "@hapi/teamwork" "^6.0.0" + "@hapi/topo" "^6.0.1" + "@hapi/validate" "^2.0.1" + +"@hapi/heavy@^8.0.1": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@hapi/heavy/-/heavy-8.0.1.tgz#e2be4a6a249005b5a587f7604aafa8ed02461fb6" + integrity sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" -"@hapi/hoek@9.x.x": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== +"@hapi/hoek@^11.0.2": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-11.0.4.tgz#42a7f244fd3dd777792bfb74b8c6340ae9182f37" + integrity sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ== -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.0.4": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/iron@6.x.x": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-6.0.0.tgz#ca3f9136cda655bdd6028de0045da0de3d14436f" - integrity sha512-zvGvWDufiTGpTJPG1Y/McN8UqWBu0k/xs/7l++HVU535NLHXsHhy54cfEMdW7EjwKfbBfM9Xy25FmTiobb7Hvw== +"@hapi/iron@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/iron/-/iron-7.0.1.tgz#f74bace8dad9340c7c012c27c078504f070f14b5" + integrity sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ== dependencies: - "@hapi/b64" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/cryptiles" "5.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/mimos@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-6.0.0.tgz#daa523d9c07222c7e8860cb7c9c5501fd6506484" - integrity sha512-Op/67tr1I+JafN3R3XN5DucVSxKRT/Tc+tUszDwENoNpolxeXkhrJ2Czt6B6AAqrespHoivhgZBWYSuANN9QXg== +"@hapi/mimos@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@hapi/mimos/-/mimos-7.0.1.tgz#5b65c76bb9da28ba34b0092215891f2c72bc899d" + integrity sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew== dependencies: - "@hapi/hoek" "9.x.x" - mime-db "1.x.x" + "@hapi/hoek" "^11.0.2" + mime-db "^1.52.0" -"@hapi/nigel@4.x.x": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-4.0.2.tgz#8f84ef4bca4fb03b2376463578f253b0b8e863c4" - integrity sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw== +"@hapi/nigel@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/nigel/-/nigel-5.0.1.tgz#a6dfe357e9d48d944e2ffc552bd95cb701d79ee9" + integrity sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw== dependencies: - "@hapi/hoek" "^9.0.4" - "@hapi/vise" "^4.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/vise" "^5.0.1" -"@hapi/pez@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-5.1.0.tgz#c03a5e01f8be01cfabc4c0017631e619586321c1" - integrity sha512-YfB0btnkLB3lb6Ry/1KifnMPBm5ZPfaAHWFskzOMAgDgXgcBgA+zjpIynyEiBfWEz22DBT8o1e2tAaBdlt8zbw== +"@hapi/pez@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@hapi/pez/-/pez-6.1.0.tgz#64d9f95580fc7d8f1d13437ee4a8676709954fda" + integrity sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg== dependencies: - "@hapi/b64" "5.x.x" - "@hapi/boom" "9.x.x" - "@hapi/content" "^5.0.2" - "@hapi/hoek" "9.x.x" - "@hapi/nigel" "4.x.x" + "@hapi/b64" "^6.0.1" + "@hapi/boom" "^10.0.1" + "@hapi/content" "^6.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/nigel" "^5.0.1" -"@hapi/podium@4.x.x", "@hapi/podium@^4.1.1": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-4.1.3.tgz#91e20838fc2b5437f511d664aabebbb393578a26" - integrity sha512-ljsKGQzLkFqnQxE7qeanvgGj4dejnciErYd30dbrYzUOF/FyS/DOF97qcrT3bhoVwCYmxa6PEMhxfCPlnUcD2g== +"@hapi/podium@^5.0.0", "@hapi/podium@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/podium/-/podium-5.0.1.tgz#f292b4c0ca3118747394a102c6c3340bda96662f" + integrity sha512-eznFTw6rdBhAijXFIlBOMJJd+lXTvqbrBIS4Iu80r2KTVIo4g+7fLy4NKp/8+UnSt5Ox6mJtAlKBU/Sf5080TQ== dependencies: - "@hapi/hoek" "9.x.x" - "@hapi/teamwork" "5.x.x" - "@hapi/validate" "1.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/teamwork" "^6.0.0" + "@hapi/validate" "^2.0.1" -"@hapi/shot@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-5.0.5.tgz#a25c23d18973bec93c7969c51bf9579632a5bebd" - integrity sha512-x5AMSZ5+j+Paa8KdfCoKh+klB78otxF+vcJR/IoN91Vo2e5ulXIW6HUsFTCU+4W6P/Etaip9nmdAx2zWDimB2A== +"@hapi/shot@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@hapi/shot/-/shot-6.0.1.tgz#ea84d1810b7c8599d5517c23b4ec55a529d7dc16" + integrity sha512-s5ynMKZXYoDd3dqPw5YTvOR/vjHvMTxc388+0qL0jZZP1+uwXuUD32o9DuuuLsmTlyXCWi02BJl1pBpwRuUrNA== dependencies: - "@hapi/hoek" "9.x.x" - "@hapi/validate" "1.x.x" + "@hapi/hoek" "^11.0.2" + "@hapi/validate" "^2.0.1" -"@hapi/somever@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-3.0.1.tgz#9961cd5bdbeb5bb1edc0b2acdd0bb424066aadcc" - integrity sha512-4ZTSN3YAHtgpY/M4GOtHUXgi6uZtG9nEZfNI6QrArhK0XN/RDVgijlb9kOmXwCR5VclDSkBul9FBvhSuKXx9+w== +"@hapi/somever@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@hapi/somever/-/somever-4.1.1.tgz#b492c78408303c72cd1a39c5060f35d18a404b27" + integrity sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg== dependencies: - "@hapi/bounce" "2.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/bounce" "^3.0.1" + "@hapi/hoek" "^11.0.2" -"@hapi/statehood@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-7.0.4.tgz#6acb9d0817b5c657089356f7d9fd60af0bce4f41" - integrity sha512-Fia6atroOVmc5+2bNOxF6Zv9vpbNAjEXNcUbWXavDqhnJDlchwUUwKS5LCi5mGtCTxRhUKKHwuxuBZJkmLZ7fw== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bounce" "2.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/cryptiles" "5.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/iron" "6.x.x" - "@hapi/validate" "1.x.x" - -"@hapi/subtext@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-7.1.0.tgz#b4d1ea2aeab1923ac130a24e75921e38fab5b15b" - integrity sha512-n94cU6hlvsNRIpXaROzBNEJGwxC+HA69q769pChzej84On8vsU14guHDub7Pphr/pqn5b93zV3IkMPDU5AUiXA== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/content" "^5.0.2" - "@hapi/file" "2.x.x" - "@hapi/hoek" "9.x.x" - "@hapi/pez" "^5.1.0" - "@hapi/wreck" "17.x.x" - -"@hapi/teamwork@5.x.x", "@hapi/teamwork@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-5.1.1.tgz#4d2ba3cac19118a36c44bf49a3a47674de52e4e4" - integrity sha512-1oPx9AE5TIv+V6Ih54RP9lTZBso3rP8j4Xhb6iSVwPXtAM+sDopl5TFMv5Paw73UnpZJ9gjcrTE1BXrWt9eQrg== +"@hapi/statehood@^8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@hapi/statehood/-/statehood-8.1.1.tgz#db4bd14c90810a1389763cb0b0b8f221aa4179c1" + integrity sha512-YbK7PSVUA59NArAW5Np0tKRoIZ5VNYUicOk7uJmWZF6XyH5gGL+k62w77SIJb0AoAJ0QdGQMCQ/WOGL1S3Ydow== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bounce" "^3.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/cryptiles" "^6.0.1" + "@hapi/hoek" "^11.0.2" + "@hapi/iron" "^7.0.1" + "@hapi/validate" "^2.0.1" + +"@hapi/subtext@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@hapi/subtext/-/subtext-8.1.0.tgz#58733020a6655bc4d978df9e2f75e31696ff3f91" + integrity sha512-PyaN4oSMtqPjjVxLny1k0iYg4+fwGusIhaom9B2StinBclHs7v46mIW706Y+Wo21lcgulGyXbQrmT/w4dus6ww== + dependencies: + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/content" "^6.0.0" + "@hapi/file" "^3.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/pez" "^6.1.0" + "@hapi/wreck" "^18.0.1" + +"@hapi/teamwork@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@hapi/teamwork/-/teamwork-6.0.0.tgz#b3a173cf811ba59fc6ee22318a1b51f4561f06e0" + integrity sha512-05HumSy3LWfXpmJ9cr6HzwhAavrHkJ1ZRCmNE2qJMihdM5YcWreWPfyN0yKT2ZjCM92au3ZkuodjBxOibxM67A== -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== +"@hapi/topo@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-6.0.2.tgz#f219c1c60da8430228af4c1f2e40c32a0d84bbb4" + integrity sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg== dependencies: - "@hapi/hoek" "^9.0.0" + "@hapi/hoek" "^11.0.2" -"@hapi/validate@1.x.x", "@hapi/validate@^1.1.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-1.1.3.tgz#f750a07283929e09b51aa16be34affb44e1931ad" - integrity sha512-/XMR0N0wjw0Twzq2pQOzPBZlDzkekGcoCtzO314BpIEsbXdYGthQUbxgkGDf4nhk1+IPDAsXqWjMohRQYO06UA== +"@hapi/validate@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@hapi/validate/-/validate-2.0.1.tgz#45cf228c4c8cfc61ba2da7e0a5ba93ff3b9afff1" + integrity sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA== dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" + "@hapi/hoek" "^11.0.2" + "@hapi/topo" "^6.0.1" -"@hapi/vise@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-4.0.0.tgz#c6a94fe121b94a53bf99e7489f7fcc74c104db02" - integrity sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg== +"@hapi/vise@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@hapi/vise/-/vise-5.0.1.tgz#5c9f16bcf1c039ddd4b6cad5f32d71eeb6bb7dac" + integrity sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A== dependencies: - "@hapi/hoek" "9.x.x" + "@hapi/hoek" "^11.0.2" -"@hapi/wreck@17.x.x": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-17.2.0.tgz#a5b69b724fa8fa25550fb02f55c649becfc59f63" - integrity sha512-pJ5kjYoRPYDv+eIuiLQqhGon341fr2bNIYZjuotuPJG/3Ilzr/XtI+JAp0A86E2bYfsS3zBPABuS2ICkaXFT8g== +"@hapi/wreck@^18.0.1": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@hapi/wreck/-/wreck-18.1.0.tgz#68e631fc7568ebefc6252d5b86cb804466c8dbe6" + integrity sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w== dependencies: - "@hapi/boom" "9.x.x" - "@hapi/bourne" "2.x.x" - "@hapi/hoek" "9.x.x" + "@hapi/boom" "^10.0.1" + "@hapi/bourne" "^3.0.0" + "@hapi/hoek" "^11.0.2" "@humanwhocodes/config-array@^0.5.0": version "0.5.0" @@ -24677,7 +24665,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.52.0, mime-db@1.x.x, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==