diff --git a/.craft.yml b/.craft.yml index 4a6534af681a..d69334cd3f94 100644 --- a/.craft.yml +++ b/.craft.yml @@ -129,20 +129,19 @@ targets: includeNames: /^sentry-internal-eslint-config-sdk-\d.*\.tgz$/ # AWS Lambda Layer target - # TODO(v9): Once stable, re-add this target to publish the AWS Lambda layer - # - name: aws-lambda-layer - # includeNames: /^sentry-node-serverless-\d+.\d+.\d+(-(beta|alpha|rc)\.\d+)?\.zip$/ - # layerName: SentryNodeServerlessSDKv9 - # compatibleRuntimes: - # - name: node - # versions: - # - nodejs10.x - # - nodejs12.x - # - nodejs14.x - # - nodejs16.x - # - nodejs18.x - # - nodejs20.x - # license: MIT + - name: aws-lambda-layer + includeNames: /^sentry-node-serverless-\d+.\d+.\d+(-(beta|alpha|rc)\.\d+)?\.zip$/ + layerName: SentryNodeServerlessSDKv9 + compatibleRuntimes: + - name: node + versions: + - nodejs10.x + - nodejs12.x + - nodejs14.x + - nodejs16.x + - nodejs18.x + - nodejs20.x + license: MIT # CDN Bundle Target - name: gcs diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bbcdf58d03..a0116544b2de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ > [!IMPORTANT] -> If you are upgrading to the `8.x` versions of the SDK from `7.x` or below, make sure you follow our +> If you are upgrading to the `9.x` versions of the SDK from `8.x` or below, make sure you follow our > [migration guide](https://docs.sentry.io/platforms/javascript/migration/) first. @@ -10,7 +10,171 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott -Work in this release was contributed by @tjhiggins, @chris-basebone, @GrizliK1988, @davidturissini, @nwalters512, @aloisklink, @arturovt, @benjick, @maximepvrt, @mstrokin, @kunal-511, @jahands, @jrandolf, @tannerlinsley, @Zen-cronic, @maxmaxme and @nathankleyn. Thank you for your contributions! +## 9.0.0 + +Version `9.0.0` marks a release of the Sentry JavaScript SDKs that contains breaking changes. +The goal of this release is to trim down on unused and potentially confusing APIs, prepare the SDKs for future framework versions to build deeper instrumentation, and remove old polyfills to reduce the packages' size. + +### How To Upgrade + +Please carefully read through the migration guide in the Sentry docs on how to upgrade from version 8 to version 9. +Make sure to select your specific platform/framework in the top left corner: https://docs.sentry.io/platforms/javascript/migration/v8-to-v9/ + +A comprehensive migration guide outlining all changes for all the frameworks can be found within the Sentry JavaScript SDK Repository: https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md + +### Breaking Changes + +- doc(deno)!: Make Deno v2 the minimum supported version (#15085) +- feat!: Bump typescript to `~5.0.0` (#14758) +- feat!: Drop `nitro-utils` package (#14998) +- feat!: Only collect ip addresses with `sendDefaultPii: true` (#15084) +- feat!: Remove `autoSessionTracking` option (#14802) +- feat!: Remove `enableTracing` (#15078) +- feat!: Remove `getCurrentHub()`, `Hub`, and `getCurrentHubShim()` (#15122) +- feat!: Remove `spanId` from propagation context (#14733) +- feat!: Remove deprecated and unused code (#15077) +- feat!: Remove metrics API from the JS SDK (#14745) +- feat!: Require Node `>=18` as minimum supported version (#14749) +- feat(astro)!: Respect user-specified source map setting (#14941) +- feat(browser)!: Remove `captureUserFeedback` method (#14820) +- feat(build)!: Drop pre-ES2020 polyfills (#14882) +- feat(core)!: Add `normalizedRequest` to `samplingContext` (#14902) +- feat(core)!: Always use session from isolation scope (#14860) +- feat(core)!: Pass root spans to `beforeSendSpan` and disallow returning `null` (#14831) +- feat(core)!: Remove `BAGGAGE_HEADER_NAME` export (#14785) +- feat(core)!: Remove `TransactionNamingScheme` type (#14865) +- feat(core)!: Remove `addOpenTelemetryInstrumentation` method (#14792) +- feat(core)!: Remove `arrayify` method (#14782) +- feat(core)!: Remove `debugIntegration` and `sessionTimingIntegration` (#14747) +- feat(core)!: Remove `flatten` method (#14784) +- feat(core)!: Remove `getDomElement` method (#14797) +- feat(core)!: Remove `makeFifoCache` method (#14786) +- feat(core)!: Remove `memoBuilder` export & `WeakSet` fallback (#14859) +- feat(core)!: Remove `transactionContext` from `samplingContext` (#14904) +- feat(core)!: Remove `urlEncode` method (#14783) +- feat(core)!: Remove deprecated `Request` type (#14858) +- feat(core)!: Remove deprecated request data methods (#14896) +- feat(core)!: Remove standalone `Client` interface & deprecate `BaseClient` (#14800) +- feat(core)!: Remove validSeverityLevels export (#14765) +- feat(core)!: Stop accepting `event` as argument for `recordDroppedEvent` (#14999) +- feat(core)!: Stop setting user in `requestDataIntegration` (#14898) +- feat(core)!: Type sdkProcessingMetadata more strictly (#14855) +- feat(core)!: Update `hasTracingEnabled` to consider empty trace config (#14857) +- feat(core)!: Update `requestDataIntegration` handling (#14806) +- feat(deno)!: Remove deno prepack (#14829) +- feat(ember)!: Officially drop support for ember `<=3.x` (#15032) +- feat(nestjs)!: Move `nestIntegration` into nest sdk and remove `setupNestErrorHandler` (#14751) +- feat(nestjs)!: Remove `@WithSentry` decorator (#14762) +- feat(nestjs)!: Remove `SentryService` (#14759) +- feat(nextjs)!: Don't rely on Next.js Build ID for release names (#14939) +- feat(nextjs)!: Remove `experimental_captureRequestError` (#14607) +- feat(nextjs)!: Respect user-provided source map generation settings (#14956) +- feat(node)!: Add support for Prisma v6 and drop v5 support (#15120) +- feat(node)!: Avoid http spans by default for custom OTEL setups (#14678) +- feat(node)!: Collect request sessions via HTTP instrumentation (#14658) +- feat(node)!: Remove `processThreadBreadcrumbIntegration` (#14666) +- feat(node)!: Remove fine grained `registerEsmLoaderHooks` (#15002) +- feat(opentelemetry)!: Exclusively pass root spans through sampling pipeline (#14951) +- feat(pinia)!: Include state of all stores in breadcrumb (#15312) +- feat(react)!: Raise minimum supported TanStack Router version to `1.63.0` (#15030) +- feat(react)!: Remove deprecated `getNumberOfUrlSegments` method (#14744) +- feat(react)!: Remove deprecated react router methods (#14743) +- feat(react)!: Update `ErrorBoundary` `componentStack` type (#14742) +- feat(remix)!: Drop support for Remix v1 (#14988) +- feat(remix)!: Remove `autoInstrumentRemix` option (#15074) +- feat(solidstart)!: Default to `--import` setup and add `autoInjectServerSentry` (#14862) +- feat(solidstart)!: No longer export `sentrySolidStartVite` (#15143) +- feat(solidstart)!: Respect user-provided source map setting (#14979) +- feat(svelte)!: Disable component update tracking by default (#15265) +- feat(sveltekit)!: Drop support for SvelteKit @1.x (#15037) +- feat(sveltekit)!: Remove `fetchProxyScriptNonce` option (#15123) +- feat(sveltekit)!: Respect user-provided source map generation settings (#14886) +- feat(utils)!: Remove `@sentry/utils` package (#14830) +- feat(vue)!: Remove configuring Vue tracing options anywhere else other than through the `vueIntegration`'s `tracingOptions` option (#14856) +- feat(vue/nuxt)!: No longer create `"update"` spans for component tracking by default (#14602) +- fix(node)!: Fix name of `vercelAIIntegration` to `VercelAI` (#15298) +- fix(vue)!: Remove `logError` from `vueIntegration` (#14958) +- ref!: Don't polyfill optional chaining and nullish coalescing (#14603) +- ref(core)!: Cleanup internal types, including `ReportDialogOptions` (#14861) +- ref(core)!: Mark exceptions from `captureConsoleIntegration` as `handled: true` by default (#14734) +- ref(core)!: Move `shutdownTimeout` option type from core to node (#15217) +- ref(core)!: Remove `Scope` type interface in favor of using `Scope` class (#14721) +- ref(core)!: Remove backwards compatible SentryCarrier type (#14697) + +### Other Changes + +- chore(browser): Export ipAddress helpers for use in other SDKs (#15079) +- deps(node): Bump `import-in-the-middle` to `1.12.0` (#14796) +- feat(aws): Rename AWS lambda layer name to `SentryNodeServerlessSDKv9` (#14927) +- feat(aws-serverless): Upgrade OTEL deps (#15091) +- feat(browser): Set `user.ip_address` explicitly to `{{auto}}` (#15008) +- feat(core): Add `inheritOrSampleWith` helper to `traceSampler` (#15277) +- feat(core): Emit client reports for unsampled root spans on span start (#14936) +- feat(core): Rename `hasTracingEnabled` to `hasSpansEnabled` (#15309) +- feat(core): Streamline `SpanJSON` type (#14693) +- feat(deno): Don't bundle `@sentry/deno` (#15014) +- feat(deno): Don't publish to `deno.land` (#15016) +- feat(deno): Stop inlining types from core (#14729) +- feat(deps): Bump @opentelemetry/instrumentation-amqplib from 0.45.0 to 0.46.0 (#14835) +- feat(deps): Bump @opentelemetry/instrumentation-aws-lambda from 0.49.0 to 0.50.0 (#14833) +- feat(deps): Bump @opentelemetry/instrumentation-express from 0.46.0 to 0.47.0 (#14834) +- feat(deps): Bump @opentelemetry/instrumentation-mysql2 from 0.44.0 to 0.45.0 (#14836) +- feat(deps): Bump @opentelemetry/propagation-utils from 0.30.14 to 0.30.15 (#14832) +- feat(deps): bump @opentelemetry/context-async-hooks from 1.29.0 to 1.30.0 (#14869) +- feat(deps): bump @opentelemetry/instrumentation-generic-pool from 0.42.0 to 0.43.0 (#14870) +- feat(deps): bump @opentelemetry/instrumentation-knex from 0.43.0 to 0.44.0 (#14872) +- feat(deps): bump @opentelemetry/instrumentation-mongodb from 0.50.0 to 0.51.0 (#14871) +- feat(deps): bump @opentelemetry/instrumentation-tedious from 0.17.0 to 0.18.0 (#14868) +- feat(deps): bump @sentry/cli from 2.39.1 to 2.41.1 (#15173) +- feat(flags): Add Statsig browser integration (#15319) +- feat(gatsby): Preserve user-provided source map settings (#15006) +- feat(nestjs): Remove `SentryTracingInterceptor`, `SentryGlobalGraphQLFilter`, `SentryGlobalGenericFilter` (#14761) +- feat(nextjs): Directly forward `sourcemaps.disable` to webpack plugin (#15109) +- feat(node): Add `processSessionIntegration` (#15081) +- feat(node): Add missing `vercelAIIntegration` export (#15318) +- feat(node): Capture exceptions from `worker_threads` (#15105) +- feat(nuxt): Add enabled to disable Sentry module (#15337) +- feat(nuxt): add `silent`, `errorHandler`, `release` to `SourceMapsOptions` (#15246) +- feat(profiling-node): Use `@sentry-internal/node-cpu-profiler` (#15208) +- feat(replay): Update fflate to 0.8.2 (#14867) +- feat(solidstart): Add `autoInjectServerSentry: 'experimental_dynamic-import` (#14863) +- feat(sveltekit): Only inject fetch proxy script for SvelteKit < 2.16.0 (#15126) +- feat(user feedback): Adds draw tool for UF screenshot annotations (#15062) +- feat(user feedback): Adds toolbar for cropping and annotating (#15282) +- feat: Avoid class fields all-together (#14887) +- feat: Only emit `__esModule` properties in CJS modules when there is a default export (#15018) +- feat: Pass `parentSampleRate` to `tracesSampler` (#15024) +- feat: Propagate and use a sampling random (#14989) +- fix(browser): Remove `browserPerformanceTimeOrigin` side-effects (#14025) +- fix(core): Ensure debugIds are applied to all exceptions in an event (#14881) +- fix(core): Fork scope if custom scope is passed to `startSpanManual` (#14901) +- fix(core): Fork scope if custom scope is passed to `startSpan` (#14900) +- fix(core): Only fall back to `sendDefaultPii` for IP collection in `requestDataIntegration` (#15125) +- fix(nextjs): Flush with `waitUntil` in `captureRequestError` (#15146) +- fix(nextjs): Use batched devserver symbolication endpoint (#15335) +- fix(node): Don't leak `__span` property into breadcrumbs (#14798) +- fix(node): Ensure `httpIntegration` propagates traces (#15233) +- fix(node): Fix sample rand propagation for negative sampling decisions (#15045) +- fix(node): Missing `release` from ANR sessions (#15138) +- fix(node): Set the correct fallback URL fields for outgoing https requests if they are not defined (#15316) +- fix(nuxt): Detect Azure Function runtime for flushing with timeout (#15288) +- fix(react): From location can be undefined in Tanstack Router Instrumentation (#15235) +- fix(react): Import default for hoistNonReactStatics (#15238) +- fix(react): Support lazy-loaded routes and components. (#15039) +- fix(solidstart): Do not copy release-injection map file (#15302) +- ref(browser): Improve active span handling for `browserTracingIntegration` (#14959) +- ref(browser): Improve setting of propagation scope for navigation spans (#15108) +- ref(browser): Skip browser extension warning in non-debug builds (#15310) +- ref(browser): Update `supportsHistory` check & history usage (#14696) +- ref(core): Ensure non-recording root spans have frozen DSC (#14964) +- ref(core): Log debug message when capturing error events (#14701) +- ref(core): Move log message about invalid sample rate (#15215) +- ref(node): Streamline check for adding performance integrations (#15021) +- ref(react): Adapt tanstack router type (#15241) +- ref(svelte): Remove SvelteKit detection (#15313) +- ref(sveltekit): Clean up sub-request check (#15251) + +Work in this release was contributed by @aloisklink, @arturovt, @aryanvdesh, @benjick, @chris-basebone, @davidturissini, @GrizliK1988, @jahands, @jrandolf, @kunal-511, @maximepvrt, @maxmaxme, @mstrokin, @nathankleyn, @nwalters512, @tannerlinsley, @tjhiggins, and @Zen-cronic. Thank you for your contributions! ## 9.0.0-alpha.2 @@ -36,6 +200,192 @@ This release does not yet entail a comprehensive changelog as version 9 is not y For this release's iteration of the migration guide, see the [Migration Guide as per `9.0.0-alpha.0`](https://github.com/getsentry/sentry-javascript/blob/6e4b593adcc4ce951afa8ae0cda0605ecd226cda/docs/migration/v8-to-v9.md). Please note that the migration guide is work in progress and subject to change. +## 8.54.0 + +- feat(v8/deps): Upgrade all OpenTelemetry dependencies ([#15098](https://github.com/getsentry/sentry-javascript/pull/15098)) +- fix(node/v8): Add compatibility layer for Prisma v5 ([#15210](https://github.com/getsentry/sentry-javascript/pull/15210)) + +Work in this release was contributed by @nwalters512. Thank you for your contribution! + +## 8.53.0 + +- feat(v8/nuxt): Add `url` to `SourcemapsUploadOptions` (#15202) +- fix(v8/react): `fromLocation` can be undefined in Tanstack Router Instrumentation (#15237) + +Work in this release was contributed by @tannerlinsley. Thank you for your contribution! + +## 8.52.1 + +- fix(v8/nextjs): Fix nextjs build warning (#15226) +- ref(v8/browser): Add protocol attributes to resource spans #15224 +- ref(v8/core): Don't set `this.name` to `new.target.prototype.constructor.name` (#15222) + +Work in this release was contributed by @Zen-cronic. Thank you for your contribution! + +## 8.52.0 + +### Important Changes + +- **feat(solidstart): Add `withSentry` wrapper for SolidStart config ([#15135](https://github.com/getsentry/sentry-javascript/pull/15135))** + +To enable the SolidStart SDK, wrap your SolidStart Config with `withSentry`. The `sentrySolidStartVite` plugin is now automatically +added by `withSentry` and you can pass the Sentry build-time options like this: + +```js +import { defineConfig } from '@solidjs/start/config'; +import { withSentry } from '@sentry/solidstart'; + +export default defineConfig( + withSentry( + { + /* Your SolidStart config options... */ + }, + { + // Options for setting up source maps + org: process.env.SENTRY_ORG, + project: process.env.SENTRY_PROJECT, + authToken: process.env.SENTRY_AUTH_TOKEN, + }, + ), +); +``` + +With the `withSentry` wrapper, the Sentry server config should not be added to the `public` directory anymore. +Add the Sentry server config in `src/instrument.server.ts`. Then, the server config will be placed inside the server build output as `instrument.server.mjs`. + +Now, there are two options to set up the SDK: + +1. **(recommended)** Provide an `--import` CLI flag to the start command like this (path depends on your server setup): + `node --import ./.output/server/instrument.server.mjs .output/server/index.mjs` +2. Add `autoInjectServerSentry: 'top-level-import'` and the Sentry config will be imported at the top of the server entry (comes with tracing limitations) + ```js + withSentry( + { + /* Your SolidStart config options... */ + }, + { + // Optional: Install Sentry with a top-level import + autoInjectServerSentry: 'top-level-import', + }, + ); + ``` + +### Other Changes + +- feat(v8/core): Add client outcomes for breadcrumbs buffer ([#15149](https://github.com/getsentry/sentry-javascript/pull/15149)) +- feat(v8/core): Improve error formatting in ZodErrors integration ([#15155](https://github.com/getsentry/sentry-javascript/pull/15155)) +- fix(v8/bun): Ensure instrumentation of `Bun.serve` survives a server reload ([#15157](https://github.com/getsentry/sentry-javascript/pull/15157)) +- fix(v8/core): Pass `module` into `loadModule` ([#15139](https://github.com/getsentry/sentry-javascript/pull/15139)) (#15166) + +Work in this release was contributed by @jahands, @jrandolf, and @nathankleyn. Thank you for your contributions! + +## 8.51.0 + +### Important Changes + +- **feat(v8/node): Add `prismaInstrumentation` option to Prisma integration as escape hatch for all Prisma versions ([#15128](https://github.com/getsentry/sentry-javascript/pull/15128))** + + This release adds a compatibility API to add support for Prisma version 6. + To capture performance data for Prisma version 6: + + 1. Install the `@prisma/instrumentation` package on version 6. + 1. Pass a `new PrismaInstrumentation()` instance as exported from `@prisma/instrumentation` to the `prismaInstrumentation` option: + + ```js + import { PrismaInstrumentation } from '@prisma/instrumentation'; + + Sentry.init({ + integrations: [ + prismaIntegration({ + // Override the default instrumentation that Sentry uses + prismaInstrumentation: new PrismaInstrumentation(), + }), + ], + }); + ``` + + The passed instrumentation instance will override the default instrumentation instance the integration would use, while the `prismaIntegration` will still ensure data compatibility for the various Prisma versions. + + 1. Remove the `previewFeatures = ["tracing"]` option from the client generator block of your Prisma schema. + +### Other Changes + +- feat(v8/browser): Add `multiplexedtransport.js` CDN bundle ([#15046](https://github.com/getsentry/sentry-javascript/pull/15046)) +- feat(v8/browser): Add Unleash integration ([#14948](https://github.com/getsentry/sentry-javascript/pull/14948)) +- feat(v8/deno): Deprecate Deno SDK as published on deno.land ([#15121](https://github.com/getsentry/sentry-javascript/pull/15121)) +- feat(v8/sveltekit): Deprecate `fetchProxyScriptNonce` option ([#15011](https://github.com/getsentry/sentry-javascript/pull/15011)) +- fix(v8/aws-lambda): Avoid overwriting root span name ([#15054](https://github.com/getsentry/sentry-javascript/pull/15054)) +- fix(v8/core): `fatal` events should set session as crashed ([#15073](https://github.com/getsentry/sentry-javascript/pull/15073)) +- fix(v8/node/nestjs): Use method on current fastify request ([#15104](https://github.com/getsentry/sentry-javascript/pull/15104)) + +Work in this release was contributed by @tjhiggins, and @nwalters512. Thank you for your contributions! + +## 8.50.0 + +- feat(v8/react): Add support for React Router `createMemoryRouter` ([#14985](https://github.com/getsentry/sentry-javascript/pull/14985)) + +## 8.49.0 + +- feat(v8/browser): Flush offline queue on flush and browser online event ([#14969](https://github.com/getsentry/sentry-javascript/pull/14969)) +- feat(v8/react): Add a `handled` prop to ErrorBoundary ([#14978](https://github.com/getsentry/sentry-javascript/pull/14978)) +- fix(profiling/v8): Don't put `require`, `__filename` and `__dirname` on global object ([#14952](https://github.com/getsentry/sentry-javascript/pull/14952)) +- fix(v8/node): Enforce that ContextLines integration does not leave open file handles ([#14997](https://github.com/getsentry/sentry-javascript/pull/14997)) +- fix(v8/replay): Disable mousemove sampling in rrweb for iOS browsers ([#14944](https://github.com/getsentry/sentry-javascript/pull/14944)) +- fix(v8/sveltekit): Ensure source maps deletion is called after source ma… ([#14963](https://github.com/getsentry/sentry-javascript/pull/14963)) +- fix(v8/vue): Re-throw error when no errorHandler exists ([#14943](https://github.com/getsentry/sentry-javascript/pull/14943)) + +Work in this release was contributed by @HHK1 and @mstrokin. Thank you for your contributions! + +## 8.48.0 + +### Deprecations + +- **feat(v8/core): Deprecate `getDomElement` method ([#14799](https://github.com/getsentry/sentry-javascript/pull/14799))** + + Deprecates `getDomElement`. There is no replacement. + +### Other changes + +- fix(nestjs/v8): Use correct main/module path in package.json ([#14791](https://github.com/getsentry/sentry-javascript/pull/14791)) +- fix(v8/core): Use consistent `continueTrace` implementation in core ([#14819](https://github.com/getsentry/sentry-javascript/pull/14819)) +- fix(v8/node): Correctly resolve debug IDs for ANR events with custom appRoot ([#14823](https://github.com/getsentry/sentry-javascript/pull/14823)) +- fix(v8/node): Ensure `NODE_OPTIONS` is not passed to worker threads ([#14825](https://github.com/getsentry/sentry-javascript/pull/14825)) +- fix(v8/angular): Fall back to element `tagName` when name is not provided to `TraceDirective` ([#14828](https://github.com/getsentry/sentry-javascript/pull/14828)) +- fix(aws-lambda): Remove version suffix from lambda layer ([#14843](https://github.com/getsentry/sentry-javascript/pull/14843)) +- fix(v8/node): Ensure express requests are properly handled ([#14851](https://github.com/getsentry/sentry-javascript/pull/14851)) +- feat(v8/node): Add `openTelemetrySpanProcessors` option ([#14853](https://github.com/getsentry/sentry-javascript/pull/14853)) +- fix(v8/react): Use `Set` as the `allRoutes` container. ([#14878](https://github.com/getsentry/sentry-javascript/pull/14878)) (#14884) +- fix(v8/react): Improve handling of routes nested under path="/" ([#14897](https://github.com/getsentry/sentry-javascript/pull/14897)) +- feat(v8/core): Add `normalizedRequest` to `samplingContext` ([#14903](https://github.com/getsentry/sentry-javascript/pull/14903)) +- fix(v8/feedback): Avoid lazy loading code for `syncFeedbackIntegration` ([#14918](https://github.com/getsentry/sentry-javascript/pull/14918)) + +Work in this release was contributed by @arturovt. Thank you for your contribution! + +## 8.47.0 + +- feat(v8/core): Add `updateSpanName` helper function (#14736) +- feat(v8/node): Do not overwrite prisma `db.system` in newer Prisma versions (#14772) +- feat(v8/node/deps): Bump @prisma/instrumentation from 5.19.1 to 5.22.0 (#14755) +- feat(v8/replay): Mask srcdoc iframe contents per default (#14779) +- ref(v8/nextjs): Fix typo in source maps deletion warning (#14776) + +Work in this release was contributed by @aloisklink and @benjick. Thank you for your contributions! + +## 8.46.0 + +- feat: Allow capture of more than 1 ANR event [v8] ([#14713](https://github.com/getsentry/sentry-javascript/pull/14713)) +- feat(node): Detect Railway release name [v8] ([#14714](https://github.com/getsentry/sentry-javascript/pull/14714)) +- fix: Normalise ANR debug image file paths if appRoot was supplied [v8] ([#14709](https://github.com/getsentry/sentry-javascript/pull/14709)) +- fix(nuxt): Remove build config from tsconfig ([#14737](https://github.com/getsentry/sentry-javascript/pull/14737)) + +Work in this release was contributed by @conor-ob. Thank you for your contribution! + +## 8.45.1 + +- fix(feedback): Return when the `sendFeedback` promise resolves ([#14683](https://github.com/getsentry/sentry-javascript/pull/14683)) + +Work in this release was contributed by @antonis. Thank you for your contribution! + ## 8.45.0 - feat(core): Add `handled` option to `captureConsoleIntegration` ([#14664](https://github.com/getsentry/sentry-javascript/pull/14664)) diff --git a/MIGRATION.md b/MIGRATION.md index e13e0d1148c0..cbd2a282db99 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -9,10 +9,10 @@ These docs walk through how to migrate our JavaScript SDKs through different maj # Upgrading from 8.x to 9.x -Version 9 of the Sentry JavaScript SDK concerns API cleanup and version support changes. -This update contains behavioral changes that will not be caught by type checkers, linters or tests, so we recommend carefully reading through the entire migration guide instead of purely relying on automatic tooling. +Version 9 of the Sentry JavaScript SDK primarily introduces API cleanup and version support changes. +This update contains behavioral changes that will not be caught by type checkers, linters, or tests, so we recommend carefully reading through the entire migration guide instead of relying on automatic tooling. -`v9` of the SDK is compatible with Sentry self-hosted versions 24.4.2 or higher (unchanged from v8). +Version 9 of the SDK is compatible with Sentry self-hosted versions 24.4.2 or higher (unchanged from v8). Lower versions may continue to work, but may not support all features. ## 1. Version Support Changes: @@ -27,16 +27,16 @@ This includes features like Nullish Coalescing (`??`), Optional Chaining (`?.`), If you observe failures due to syntax or features listed above, it may indicate that your current runtime does not support ES2020. If your runtime does not support ES2020, we recommend transpiling the SDK using Babel or similar tooling. -**Node.js:** The minimum supported Node.js version is **18.0.0**, except for ESM-only SDKs (`@sentry/astro`, `@sentry/nuxt`, `@sentry/sveltekit`) which require Node.js version **18.19.1** or higher. +**Node.js:** The minimum supported Node.js version is **18.0.0** (Released Apr 19, 2022), except for ESM-only SDKs (`@sentry/astro`, `@sentry/nuxt`, `@sentry/sveltekit`) which require Node.js version **18.19.1** (Released Feb 14, 2024) or higher. **Browsers:** Due to SDK code now including ES2020 features, the minimum supported browser list now looks as follows: -- Chrome 80 -- Edge 80 -- Safari 14, iOS Safari 14.4 -- Firefox 74 -- Opera 67 -- Samsung Internet 13.0 +- Chrome 80 (Released Feb 5, 2020) +- Edge 80 (Released Feb 7, 2020) +- Safari 14, iOS Safari 14.4 (Released Sep 16, 2020) +- Firefox 74 (Released Mar 10, 2020) +- Opera 67 (Released Mar 12, 2020) +- Samsung Internet 13.0 (Released Nov 20, 2020) If you need to support older browsers, we recommend transpiling your code using SWC, Babel or similar tooling. @@ -54,11 +54,21 @@ Support for the following frameworks and library versions are dropped: ### TypeScript Version Policy -In preparation for v2 of the OpenTelemetry SDK, which will raise the minimum required TypeScript version, the minimum required TypeScript version is increased to version `5.0.4`. +In preparation for v2 of the OpenTelemetry SDK, the minimum required TypeScript version is increased to version `5.0.4`. Additionally, like the OpenTelemetry SDK, the Sentry JavaScript SDK will follow [DefinitelyType's version support policy](https://github.com/DefinitelyTyped/DefinitelyTyped#support-window) which has a support time frame of 2 years for any released version of TypeScript. -Older Typescript versions _may_ continue to be compatible, but no guarantees apply. +Older TypeScript versions _may_ continue to be compatible, but no guarantees apply. + +### AWS Lambda Layer Changes + +A new AWS Lambda Layer for version 9 will be published as `SentryNodeServerlessSDKv9`. +The ARN will be published in the [Sentry docs](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/install/cjs-layer/) once available. + +The previous `SentryNodeServerlessSDK` layer will not receive new updates anymore. + +Updates and fixes for version 8 will be published as `SentryNodeServerlessSDKv8`. +The ARN will be published in the [Sentry docs](https://docs.sentry.io/platforms/javascript/guides/aws-lambda/install/cjs-layer/) once available. ## 2. Behavior Changes @@ -80,7 +90,7 @@ Older Typescript versions _may_ continue to be compatible, but no guarantees app While in v8, the passed scope was set active directly on the passed scope, in v9, the scope is cloned. This behavior change does not apply to `@sentry/node` where the scope was already cloned. This change was made to ensure that the span only remains active within the callback and to align behavior between `@sentry/node` and all other SDKs. As a result of the change, span hierarchy should be more accurate. - However, modifying the scope (e.g. set tags) within the `startSpan` callback behaves a bit differently now. + However, modifying the scope (for example, setting tags) within the `startSpan` callback behaves a bit differently now. ```js startSpan({ name: 'example', scope: customScope }, () => { @@ -91,12 +101,12 @@ Older Typescript versions _may_ continue to be compatible, but no guarantees app ``` - Passing `undefined` as a `tracesSampleRate` option value will now be treated the same as if the attribute was not defined at all. - In previous versions, it was checked whether the `tracesSampleRate` property existed in the SDK options to determine whether to propagate trace data for distributed tracing. + In previous versions, it was checked whether the `tracesSampleRate` property existed in the SDK options to decide if trace data should be propagated for tracing. Consequentially, this sometimes caused the SDK to propagate negative sampling decisions when `tracesSampleRate: undefined` was passed. This is no longer the case and sampling decisions will be deferred to downstream SDKs for distributed tracing. This is more of a bugfix rather than a breaking change, however, depending on the setup of your SDKs, an increase in sampled traces may be observed. -- If you use the optional `captureConsoleIntegration` and set `attachStackTrace: true` in your `Sentry.init` call, console messages will no longer be marked as unhandled (i.e. `handled: false`) but as handled (i.e. `handled: true`). +- If you use the optional `captureConsoleIntegration` and set `attachStackTrace: true` in your `Sentry.init` call, console messages will no longer be marked as unhandled (`handled: false`) but as handled (`handled: true`). If you want to keep sending them as unhandled, configure the `handled` option when adding the integration: ```js diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/constants.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/constants.ts new file mode 100644 index 000000000000..680105d242e5 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/constants.ts @@ -0,0 +1 @@ +export const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/featureFlags/basic/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/featureFlags/basic/test.ts index ed909b19d1fa..5cf63a4914ed 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/featureFlags/basic/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/featureFlags/basic/test.ts @@ -4,7 +4,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; -const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. +import { FLAG_BUFFER_SIZE } from '../../constants'; sentryTest('Basic test with eviction, update, and no async tasks', async ({ getLocalTestUrl, page }) => { if (shouldSkipFeatureFlagsTest()) { diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/launchdarkly/basic/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/launchdarkly/basic/test.ts index e97cb70761ba..d0adafc3d101 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/launchdarkly/basic/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/launchdarkly/basic/test.ts @@ -4,7 +4,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; -const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. +import { FLAG_BUFFER_SIZE } from '../../constants'; sentryTest('Basic test with eviction, update, and no async tasks', async ({ getLocalTestUrl, page }) => { if (shouldSkipFeatureFlagsTest()) { diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/basic/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/basic/test.ts index a3de589677ea..21db2c0b7d85 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/basic/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/basic/test.ts @@ -4,7 +4,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; -const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. +import { FLAG_BUFFER_SIZE } from '../../constants'; sentryTest('Basic test with eviction, update, and no async tasks', async ({ getLocalTestUrl, page }) => { if (shouldSkipFeatureFlagsTest()) { diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/errorHook/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/errorHook/test.ts index 719782d0b0ab..bae111a5e6f5 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/errorHook/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/openfeature/errorHook/test.ts @@ -4,7 +4,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; -const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. +import { FLAG_BUFFER_SIZE } from '../../constants'; sentryTest('Flag evaluation error hook', async ({ getLocalTestUrl, page }) => { if (shouldSkipFeatureFlagsTest()) { diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/basic/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/basic/test.ts new file mode 100644 index 000000000000..5b484b91ba22 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/basic/test.ts @@ -0,0 +1,51 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../../../utils/fixtures'; + +import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; + +import { FLAG_BUFFER_SIZE } from '../../constants'; + +sentryTest('Basic test with eviction, update, and no async tasks', async ({ getLocalTestUrl, page }) => { + if (shouldSkipFeatureFlagsTest()) { + sentryTest.skip(); + } + + await page.route('https://dsn.ingest.sentry.io/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ id: 'test-id' }), + }); + }); + + const url = await getLocalTestUrl({ testDir: __dirname, skipDsnRouteHandler: true }); + await page.goto(url); + + await page.evaluate(bufferSize => { + const client = (window as any).statsigClient; + for (let i = 1; i <= bufferSize; i++) { + client.checkGate(`feat${i}`); // values default to false + } + + client.setMockGateValue(`feat${bufferSize + 1}`, true); + client.checkGate(`feat${bufferSize + 1}`); // eviction + + client.setMockGateValue('feat3', true); + client.checkGate('feat3'); // update + }, FLAG_BUFFER_SIZE); + + const reqPromise = waitForErrorRequest(page); + await page.locator('#error').click(); + const req = await reqPromise; + const event = envelopeRequestParser(req); + + const expectedFlags = [{ flag: 'feat2', result: false }]; + for (let i = 4; i <= FLAG_BUFFER_SIZE; i++) { + expectedFlags.push({ flag: `feat${i}`, result: false }); + } + expectedFlags.push({ flag: `feat${FLAG_BUFFER_SIZE + 1}`, result: true }); + expectedFlags.push({ flag: 'feat3', result: true }); + + expect(event.contexts?.flags?.values).toEqual(expectedFlags); +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/init.js b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/init.js new file mode 100644 index 000000000000..61d00587f4c6 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/init.js @@ -0,0 +1,35 @@ +import * as Sentry from '@sentry/browser'; + +class MockStatsigClient { + constructor() { + this._gateEvaluationListeners = []; + this._mockGateValues = {}; + } + + on(event, listener) { + this._gateEvaluationListeners.push(listener); + } + + checkGate(name) { + const value = this._mockGateValues[name] || false; // unknown features default to false. + this._gateEvaluationListeners.forEach(listener => { + listener({ gate: { name, value } }); + }); + return value; + } + + setMockGateValue(name, value) { + this._mockGateValues[name] = value; + } +} + +window.statsigClient = new MockStatsigClient(); + +window.Sentry = Sentry; +window.sentryStatsigIntegration = Sentry.statsigIntegration({ featureFlagClient: window.statsigClient }); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + sampleRate: 1.0, + integrations: [window.sentryStatsigIntegration], +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/subject.js b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/subject.js new file mode 100644 index 000000000000..e6697408128c --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/subject.js @@ -0,0 +1,3 @@ +document.getElementById('error').addEventListener('click', () => { + throw new Error('Button triggered error'); +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/template.html b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/template.html new file mode 100644 index 000000000000..9330c6c679f4 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/template.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/withScope/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/withScope/test.ts new file mode 100644 index 000000000000..cf41767036b6 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/statsig/withScope/test.ts @@ -0,0 +1,69 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../../../utils/fixtures'; + +import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; + +import type { Scope } from '@sentry/browser'; + +sentryTest('Flag evaluations in forked scopes are stored separately.', async ({ getLocalTestUrl, page }) => { + if (shouldSkipFeatureFlagsTest()) { + sentryTest.skip(); + } + + await page.route('https://dsn.ingest.sentry.io/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ id: 'test-id' }), + }); + }); + + const url = await getLocalTestUrl({ testDir: __dirname, skipDsnRouteHandler: true }); + await page.goto(url); + + const forkedReqPromise = waitForErrorRequest(page, event => !!event.tags?.isForked === true); + const mainReqPromise = waitForErrorRequest(page, event => !!event.tags?.isForked === false); + + await page.evaluate(() => { + const Sentry = (window as any).Sentry; + const errorButton = document.querySelector('#error') as HTMLButtonElement; + const client = (window as any).statsigClient; + + client.setMockGateValue('shared', true); + client.setMockGateValue('main', true); + + client.checkGate('shared'); + + Sentry.withScope((scope: Scope) => { + client.setMockGateValue('forked', true); + client.setMockGateValue('shared', false); // override the value in the parent scope. + + client.checkGate('forked'); + client.checkGate('shared'); + scope.setTag('isForked', true); + errorButton.click(); + }); + + client.checkGate('main'); + Sentry.getCurrentScope().setTag('isForked', false); + errorButton.click(); + return true; + }); + + const forkedReq = await forkedReqPromise; + const forkedEvent = envelopeRequestParser(forkedReq); + + const mainReq = await mainReqPromise; + const mainEvent = envelopeRequestParser(mainReq); + + expect(forkedEvent.contexts?.flags?.values).toEqual([ + { flag: 'forked', result: true }, + { flag: 'shared', result: false }, + ]); + + expect(mainEvent.contexts?.flags?.values).toEqual([ + { flag: 'shared', result: true }, + { flag: 'main', result: true }, + ]); +}); diff --git a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/basic/test.ts b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/basic/test.ts index 5bb72caddd24..7e8065dc6172 100644 --- a/dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/basic/test.ts +++ b/dev-packages/browser-integration-tests/suites/integrations/featureFlags/unleash/basic/test.ts @@ -4,7 +4,7 @@ import { sentryTest } from '../../../../../utils/fixtures'; import { envelopeRequestParser, shouldSkipFeatureFlagsTest, waitForErrorRequest } from '../../../../../utils/helpers'; -const FLAG_BUFFER_SIZE = 100; // Corresponds to constant in featureFlags.ts, in browser utils. +import { FLAG_BUFFER_SIZE } from '../../constants'; sentryTest('Basic test with eviction, update, and no async tasks', async ({ getLocalTestUrl, page }) => { if (shouldSkipFeatureFlagsTest()) { diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/subject.js b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/subject.js index a51740976b6a..db9f6cb4616a 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/subject.js +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/subject.js @@ -1,6 +1,6 @@ window.calls = {}; const xhr = new XMLHttpRequest(); -xhr.open('GET', 'http://example.com'); +xhr.open('GET', 'http://sentry-test-site.example'); xhr.onreadystatechange = function wat() { window.calls[xhr.readyState] = window.calls[xhr.readyState] ? window.calls[xhr.readyState] + 1 : 1; }; diff --git a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/test.ts b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/test.ts index f9b1816c6f2d..5b693af2f9d4 100644 --- a/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/test.ts +++ b/dev-packages/browser-integration-tests/suites/public-api/instrumentation/xhr/onreadystatechange/test.ts @@ -7,7 +7,7 @@ sentryTest( async ({ getLocalTestUrl, page }) => { const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/', route => { + await page.route('http://sentry-test-site.example/', route => { return route.fulfill({ status: 200, contentType: 'application/json', diff --git a/dev-packages/browser-integration-tests/suites/replay/requests/subject.js b/dev-packages/browser-integration-tests/suites/replay/requests/subject.js index a58f304fc687..e3e775227709 100644 --- a/dev-packages/browser-integration-tests/suites/replay/requests/subject.js +++ b/dev-packages/browser-integration-tests/suites/replay/requests/subject.js @@ -6,11 +6,11 @@ document.getElementById('go-background').addEventListener('click', () => { }); document.getElementById('fetch').addEventListener('click', () => { - fetch('https://example.com', { method: 'POST', body: 'foo' }); + fetch('https://sentry-test-site.example', { method: 'POST', body: 'foo' }); }); document.getElementById('xhr').addEventListener('click', () => { const xhr = new XMLHttpRequest(); - xhr.open('GET', 'https://example.com'); + xhr.open('GET', 'https://sentry-test-site.example'); xhr.send(); }); diff --git a/dev-packages/browser-integration-tests/suites/replay/requests/test.ts b/dev-packages/browser-integration-tests/suites/replay/requests/test.ts index efb344382b69..fc7693bf1003 100644 --- a/dev-packages/browser-integration-tests/suites/replay/requests/test.ts +++ b/dev-packages/browser-integration-tests/suites/replay/requests/test.ts @@ -10,7 +10,7 @@ sentryTest('replay recording should contain fetch request span', async ({ getLoc sentryTest.skip(); } - await page.route('https://example.com', route => { + await page.route('https://sentry-test-site.example', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -27,7 +27,7 @@ sentryTest('replay recording should contain fetch request span', async ({ getLoc const { performanceSpans: spans0 } = getReplayRecordingContent(req0); - await Promise.all([page.waitForResponse('https://example.com'), page.locator('#fetch').click()]); + await Promise.all([page.waitForResponse('https://sentry-test-site.example'), page.locator('#fetch').click()]); const { performanceSpans: spans1 } = getReplayRecordingContent(await reqPromise1); @@ -40,7 +40,7 @@ sentryTest('replay recording should contain XHR request span', async ({ getLocal sentryTest.skip(); } - await page.route('https://example.com', route => { + await page.route('https://sentry-test-site.example', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -57,7 +57,7 @@ sentryTest('replay recording should contain XHR request span', async ({ getLocal const { performanceSpans: spans0 } = getReplayRecordingContent(req0); - await Promise.all([page.waitForResponse('https://example.com'), page.locator('#xhr').click()]); + await Promise.all([page.waitForResponse('https://sentry-test-site.example'), page.locator('#xhr').click()]); const { performanceSpans: spans1 } = getReplayRecordingContent(await reqPromise1); diff --git a/dev-packages/browser-integration-tests/suites/replay/slowClick/template.html b/dev-packages/browser-integration-tests/suites/replay/slowClick/template.html index a3f5d9d54882..d83848c1b70d 100644 --- a/dev-packages/browser-integration-tests/suites/replay/slowClick/template.html +++ b/dev-packages/browser-integration-tests/suites/replay/slowClick/template.html @@ -76,7 +76,7 @@

Bottom

document.getElementById('out').innerHTML += 'mutationButton clicked
'; }); document.getElementById('windowOpenButton').addEventListener('click', () => { - window.open('https://example.com/', '_blank'); + window.open('https://github.com/', '_blank'); }); // Do nothing on these elements diff --git a/dev-packages/browser-integration-tests/suites/replay/slowClick/windowOpen/test.ts b/dev-packages/browser-integration-tests/suites/replay/slowClick/windowOpen/test.ts index 3a5187b0fc85..b784ad570e8d 100644 --- a/dev-packages/browser-integration-tests/suites/replay/slowClick/windowOpen/test.ts +++ b/dev-packages/browser-integration-tests/suites/replay/slowClick/windowOpen/test.ts @@ -8,14 +8,6 @@ sentryTest('window.open() is considered for slow click', async ({ getLocalTestUr sentryTest.skip(); } - await page.route('http://example.com/', route => { - return route.fulfill({ - status: 200, - contentType: 'application/json', - body: JSON.stringify({}), - }); - }); - const url = await getLocalTestUrl({ testDir: __dirname }); await Promise.all([waitForReplayRequest(page, 0), page.goto(url)]); @@ -63,5 +55,5 @@ sentryTest('window.open() is considered for slow click', async ({ getLocalTestUr const pages = context.pages(); expect(pages.length).toBe(2); - expect(pages[1].url()).toBe('https://example.com/'); + expect(pages[1].url()).toBe('https://github.com/'); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/subject.js index f62499b1e9c5..e19cc07e28f5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/subject.js @@ -1 +1,3 @@ -fetch('http://example.com/0').then(fetch('http://example.com/1').then(fetch('http://example.com/2'))); +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1').then(fetch('http://sentry-test-site.example/2')), +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/test.ts index e23ba53e3817..9df2acd4245a 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/http-timings/test.ts @@ -10,7 +10,7 @@ sentryTest('should create fetch spans with http timing @firefox', async ({ brows if (shouldSkipTracingTest() || !supportedBrowsers.includes(browserName)) { sentryTest.skip(); } - await page.route('http://example.com/*', async route => { + await page.route('http://sentry-test-site.example/*', async route => { const request = route.request(); const postData = await request.postDataJSON(); @@ -33,7 +33,7 @@ sentryTest('should create fetch spans with http timing @firefox', async ({ brows await page.pause(); requestSpans?.forEach((span, index) => expect(span).toMatchObject({ - description: `GET http://example.com/${index}`, + description: `GET http://sentry-test-site.example/${index}`, parent_span_id: tracingEvent.contexts?.trace?.span_id, span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/template.html index 4cd015b16f51..a9a1212191ad 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-disabled/template.html @@ -5,6 +5,6 @@
Rendered Before Long Animation Frame
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/template.html index ed02d1117097..0d722318c40a 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/template.html @@ -8,6 +8,6 @@ - + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/test.ts index ca46bc078e90..542fbb1a7845 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-enabled/test.ts @@ -33,7 +33,7 @@ sentryTest( expect(uiSpans?.length).toBeGreaterThanOrEqual(1); const topLevelUISpan = (uiSpans || []).find( - span => span.data?.['browser.script.invoker'] === 'https://example.com/path/to/script.js', + span => span.data?.['browser.script.invoker'] === 'https://sentry-test-site.example/path/to/script.js', )!; expect(topLevelUISpan).toEqual( expect.objectContaining({ @@ -41,9 +41,9 @@ sentryTest( description: 'Main UI thread blocked', parent_span_id: eventData.contexts?.trace?.span_id, data: { - 'code.filepath': 'https://example.com/path/to/script.js', + 'code.filepath': 'https://sentry-test-site.example/path/to/script.js', 'browser.script.source_char_position': 0, - 'browser.script.invoker': 'https://example.com/path/to/script.js', + 'browser.script.invoker': 'https://sentry-test-site.example/path/to/script.js', 'browser.script.invoker_type': 'classic-script', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.long-animation-frame', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics', @@ -98,7 +98,7 @@ sentryTest( data: { 'browser.script.invoker': 'BUTTON#clickme.onclick', 'browser.script.invoker_type': 'event-listener', - 'code.filepath': 'https://example.com/path/to/script.js', + 'code.filepath': 'https://sentry-test-site.example/path/to/script.js', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.long-animation-frame', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics', }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/template.html index 5c3a14114991..c217c673954d 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-animation-frame-non-chromium/template.html @@ -5,6 +5,6 @@
Rendered Before Long Task
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/template.html index ed02d1117097..0d722318c40a 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/template.html @@ -8,6 +8,6 @@ - + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/test.ts index b43e383be985..12ad3cb8a834 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-and-animation-frame-enabled/test.ts @@ -35,7 +35,7 @@ sentryTest( expect(uiSpans?.length).toBeGreaterThanOrEqual(1); const topLevelUISpan = (uiSpans || []).find( - span => span.data?.['browser.script.invoker'] === 'https://example.com/path/to/script.js', + span => span.data?.['browser.script.invoker'] === 'https://sentry-test-site.example/path/to/script.js', )!; expect(topLevelUISpan).toEqual( expect.objectContaining({ @@ -43,9 +43,9 @@ sentryTest( description: 'Main UI thread blocked', parent_span_id: eventData.contexts?.trace?.span_id, data: { - 'code.filepath': 'https://example.com/path/to/script.js', + 'code.filepath': 'https://sentry-test-site.example/path/to/script.js', 'browser.script.source_char_position': 0, - 'browser.script.invoker': 'https://example.com/path/to/script.js', + 'browser.script.invoker': 'https://sentry-test-site.example/path/to/script.js', 'browser.script.invoker_type': 'classic-script', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.long-animation-frame', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics', @@ -100,7 +100,7 @@ sentryTest( data: { 'browser.script.invoker': 'BUTTON#clickme.onclick', 'browser.script.invoker_type': 'event-listener', - 'code.filepath': 'https://example.com/path/to/script.js', + 'code.filepath': 'https://sentry-test-site.example/path/to/script.js', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.long-animation-frame', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics', }, diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html index 1c6430a388b2..9e6ca42f0be0 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/template.html @@ -5,7 +5,6 @@
Rendered Before Long Task
-

Heading

diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts index 2250fa234faf..3261c99d981b 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-before-navigation/test.ts @@ -13,6 +13,8 @@ sentryTest( } const url = await getLocalTestUrl({ testDir: __dirname }); + await page.route('**/path/to/script.js', route => route.fulfill({ path: `${__dirname}/assets/script.js` })); + await page.goto(url); const navigationTransactionEventPromise = getFirstSentryEnvelopeRequest(page); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/template.html index 5c3a14114991..c217c673954d 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-disabled/template.html @@ -5,6 +5,6 @@
Rendered Before Long Task
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/template.html index 5c3a14114991..c217c673954d 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-enabled/template.html @@ -5,6 +5,6 @@
Rendered Before Long Task
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/template.html b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/template.html index 5c3a14114991..c217c673954d 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/long-tasks-no-animation-frame/template.html @@ -5,6 +5,6 @@
Rendered Before Long Task
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/init.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/init.js index 7cd076a052e5..b2280b70e307 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 1, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/subject.js index f62499b1e9c5..e19cc07e28f5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/subject.js @@ -1 +1,3 @@ -fetch('http://example.com/0').then(fetch('http://example.com/1').then(fetch('http://example.com/2'))); +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1').then(fetch('http://sentry-test-site.example/2')), +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/test.ts index 499b81e966d1..ca53812a17e4 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/customTargets/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/subject.js b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/subject.js index f62499b1e9c5..e19cc07e28f5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/subject.js @@ -1 +1,3 @@ -fetch('http://example.com/0').then(fetch('http://example.com/1').then(fetch('http://example.com/2'))); +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1').then(fetch('http://sentry-test-site.example/2')), +); diff --git a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/test.ts b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/test.ts index a56c99ece38b..375d0f61ff8a 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/tracePropagationTargets/defaultTargetsNoMatch/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/init.js b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/init.js index 9c7cdb7e11b6..b6c2bad12033 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/init.js @@ -6,6 +6,6 @@ Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration({ instrumentNavigation: false, instrumentPageLoad: false })], tracesSampleRate: 1, - tracePropagationTargets: ['example.com'], + tracePropagationTargets: ['sentry-test-site.example'], release: '1.1.1', }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/subject.js b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/subject.js index 163082710a13..5d353d6bd1e5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/subject.js @@ -26,7 +26,7 @@ btnUpdateName.addEventListener('click', () => { }); btnMakeRequest.addEventListener('click', () => { - fetch('https://example.com/api'); + fetch('https://sentry-test-site.example/api'); }); btnCaptureError.addEventListener('click', () => { diff --git a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/test.ts b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/test.ts index 829d75924ac8..e8e799191d29 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/dsc-txn-name-update/test.ts @@ -16,6 +16,14 @@ sentryTest('updates the DSC when the txn name is updated and high-quality', asyn const url = await getLocalTestUrl({ testDir: __dirname }); + await page.route('http://sentry-test-site.example/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({}), + }); + }); + await page.goto(url); /* @@ -168,7 +176,7 @@ sentryTest('updates the DSC when the txn name is updated and high-quality', asyn }); async function makeRequestAndGetBaggageItems(page: Page): Promise { - const requestPromise = page.waitForRequest('https://example.com/*'); + const requestPromise = page.waitForRequest('https://sentry-test-site.example/*'); await page.locator('#btnMakeRequest').click(); const request = await requestPromise; diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/handlers-lcp/template.html b/dev-packages/browser-integration-tests/suites/tracing/metrics/handlers-lcp/template.html index caf4b8f2deab..311465d24627 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/handlers-lcp/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/handlers-lcp/template.html @@ -5,7 +5,7 @@
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/template.html b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/template.html index 0d16f2a27a19..8a5d6e665f64 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/template.html @@ -4,9 +4,9 @@ - - - + + + Rendered diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts index 9478b8f833f7..f30083295665 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/pageload-resource-spans/test.ts @@ -13,7 +13,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca const isWebkitRun = browserName === 'webkit'; // Intercepting asset requests to avoid network-related flakiness and random retries (on Firefox). - await page.route('https://example.com/path/to/image.svg', (route: Route) => + await page.route('https://sentry-test-site.example/path/to/image.svg', (route: Route) => route.fulfill({ path: `${__dirname}/assets/image.svg`, headers: { @@ -22,7 +22,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca }, }), ); - await page.route('https://example.com/path/to/script.js', (route: Route) => + await page.route('https://sentry-test-site.example/path/to/script.js', (route: Route) => route.fulfill({ path: `${__dirname}/assets/script.js`, headers: { @@ -31,7 +31,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca }, }), ); - await page.route('https://example.com/path/to/style.css', (route: Route) => + await page.route('https://sentry-test-site.example/path/to/style.css', (route: Route) => route.fulfill({ path: `${__dirname}/assets/style.css`, headers: { @@ -58,7 +58,11 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca const hasCdnBundle = (process.env.PW_BUNDLE || '').startsWith('bundle'); - const expectedScripts = ['/init.bundle.js', '/subject.bundle.js', 'https://example.com/path/to/script.js']; + const expectedScripts = [ + '/init.bundle.js', + '/subject.bundle.js', + 'https://sentry-test-site.example/path/to/script.js', + ]; if (hasCdnBundle) { expectedScripts.unshift('/cdn.bundle.js'); } @@ -67,7 +71,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca expect(scriptSpans?.map(({ parent_span_id }) => parent_span_id)).toEqual(expectedScripts.map(() => spanId)); const customScriptSpan = scriptSpans?.find( - ({ description }) => description === 'https://example.com/path/to/script.js', + ({ description }) => description === 'https://sentry-test-site.example/path/to/script.js', ); expect(imgSpan).toEqual({ @@ -79,7 +83,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'network.protocol.version': 'unknown', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'resource.img', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics', - 'server.address': 'example.com', + 'server.address': 'sentry-test-site.example', 'url.same_origin': false, 'url.scheme': 'https', ...(!isWebkitRun && { @@ -87,7 +91,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'http.response_delivery_type': '', }), }, - description: 'https://example.com/path/to/image.svg', + description: 'https://sentry-test-site.example/path/to/image.svg', op: 'resource.img', origin: 'auto.resource.browser.metrics', parent_span_id: spanId, @@ -106,7 +110,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'network.protocol.version': 'unknown', [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'resource.link', [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics', - 'server.address': 'example.com', + 'server.address': 'sentry-test-site.example', 'url.same_origin': false, 'url.scheme': 'https', ...(!isWebkitRun && { @@ -114,7 +118,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'http.response_delivery_type': '', }), }, - description: 'https://example.com/path/to/style.css', + description: 'https://sentry-test-site.example/path/to/style.css', op: 'resource.link', origin: 'auto.resource.browser.metrics', parent_span_id: spanId, @@ -133,7 +137,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'network.protocol.version': 'unknown', 'sentry.op': 'resource.script', 'sentry.origin': 'auto.resource.browser.metrics', - 'server.address': 'example.com', + 'server.address': 'sentry-test-site.example', 'url.same_origin': false, 'url.scheme': 'https', ...(!isWebkitRun && { @@ -141,7 +145,7 @@ sentryTest('should add resource spans to pageload transaction', async ({ getLoca 'http.response_delivery_type': '', }), }, - description: 'https://example.com/path/to/script.js', + description: 'https://sentry-test-site.example/path/to/script.js', op: 'resource.script', origin: 'auto.resource.browser.metrics', parent_span_id: spanId, diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/template.html b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/template.html index bf7617ea8709..ef5d3bac0018 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/template.html @@ -5,6 +5,6 @@
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals/template.html b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals/template.html index d4c01b121bf7..75131e14a681 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals/template.html +++ b/dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals/template.html @@ -5,7 +5,7 @@
- + diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/init.js index 5cfae0864821..3cbcaa4fe152 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/init.js @@ -4,5 +4,5 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/subject.js index eef6d917a2d8..482a738009c2 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/subject.js @@ -1,5 +1,5 @@ -fetch('http://example.com/0').then( - fetch('http://example.com/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( - fetch('http://example.com/2'), +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( + fetch('http://sentry-test-site.example/2'), ), ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/test.ts index 56bdc97f7f66..5f209ccfb876 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-no-tracing/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/init.js index 203a32557f21..5e9c86105ae7 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 0, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/subject.js index eef6d917a2d8..482a738009c2 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/subject.js @@ -1,5 +1,5 @@ -fetch('http://example.com/0').then( - fetch('http://example.com/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( - fetch('http://example.com/2'), +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( + fetch('http://sentry-test-site.example/2'), ), ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/test.ts index 113c1d107454..db14ab1faa11 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-unsampled/test.ts @@ -13,7 +13,7 @@ sentryTest('should attach `sentry-trace` header to unsampled fetch requests', as const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/init.js index 89854ab72450..69d4c5781782 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], // no tracesSampleRate defined means TWP mode }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/subject.js index eef6d917a2d8..482a738009c2 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/subject.js @@ -1,5 +1,5 @@ -fetch('http://example.com/0').then( - fetch('http://example.com/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( - fetch('http://example.com/2'), +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( + fetch('http://sentry-test-site.example/2'), ), ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/test.ts index bbbed3acb92d..c86595cfbf94 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-tracing-without-performance/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js index 7cd076a052e5..b2280b70e307 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 1, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js index 70a1992e9f8b..3f664d11c688 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/subject.js @@ -1,4 +1,4 @@ -const request = new Request('http://example.com/api/test/', { +const request = new Request('http://sentry-test-site.example/api/test/', { headers: { foo: '11' }, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts index 9219aae27f6c..26cf5f6e6f33 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch-with-request/test.ts @@ -10,7 +10,7 @@ sentryTest( sentryTest.skip(); } - const requestPromise = page.waitForRequest('http://example.com/api/test/'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/api/test/'); const url = await getLocalTestUrl({ testDir: __dirname }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/subject.js index eef6d917a2d8..482a738009c2 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/subject.js @@ -1,5 +1,5 @@ -fetch('http://example.com/0').then( - fetch('http://example.com/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( - fetch('http://example.com/2'), +fetch('http://sentry-test-site.example/0').then( + fetch('http://sentry-test-site.example/1', { headers: { 'X-Test-Header': 'existing-header' } }).then( + fetch('http://sentry-test-site.example/2'), ), ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts index a295a69a1cf1..9e2a2dc9bd8b 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/fetch/test.ts @@ -11,7 +11,7 @@ sentryTest('should create spans for fetch requests', async ({ getLocalTestUrl, p sentryTest.skip(); } - await page.route('http://example.com/*', route => route.fulfill({ body: 'ok' })); + await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' })); const url = await getLocalTestUrl({ testDir: __dirname }); @@ -24,7 +24,7 @@ sentryTest('should create spans for fetch requests', async ({ getLocalTestUrl, p requestSpans?.forEach((span, index) => expect(span).toMatchObject({ - description: `GET http://example.com/${index}`, + description: `GET http://sentry-test-site.example/${index}`, parent_span_id: tracingEvent.contexts?.trace?.span_id, span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), @@ -32,9 +32,9 @@ sentryTest('should create spans for fetch requests', async ({ getLocalTestUrl, p trace_id: tracingEvent.contexts?.trace?.trace_id, data: { 'http.method': 'GET', - 'http.url': `http://example.com/${index}`, - url: `http://example.com/${index}`, - 'server.address': 'example.com', + 'http.url': `http://sentry-test-site.example/${index}`, + url: `http://sentry-test-site.example/${index}`, + 'server.address': 'sentry-test-site.example', type: 'fetch', }, }), @@ -46,14 +46,14 @@ sentryTest('should attach `sentry-trace` header to fetch requests', async ({ get sentryTest.skip(); } - await page.route('http://example.com/*', route => route.fulfill({ body: 'ok' })); + await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' })); const url = await getLocalTestUrl({ testDir: __dirname }); const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/init.js index 092c43f75eac..439f60ae6dc4 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/init.js @@ -5,7 +5,7 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 1, autoSessionTracking: false, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/init.js index 5cfae0864821..3cbcaa4fe152 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/init.js @@ -4,5 +4,5 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/subject.js index cb5f05dad5c1..9c584bf743cb 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/subject.js @@ -1,12 +1,12 @@ const xhr_1 = new XMLHttpRequest(); -xhr_1.open('GET', 'http://example.com/0'); +xhr_1.open('GET', 'http://sentry-test-site.example/0'); xhr_1.send(); const xhr_2 = new XMLHttpRequest(); -xhr_2.open('GET', 'http://example.com/1'); +xhr_2.open('GET', 'http://sentry-test-site.example/1'); xhr_2.setRequestHeader('X-Test-Header', 'existing-header'); xhr_2.send(); const xhr_3 = new XMLHttpRequest(); -xhr_3.open('GET', 'http://example.com/2'); +xhr_3.open('GET', 'http://sentry-test-site.example/2'); xhr_3.send(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/test.ts index 56bdc97f7f66..5f209ccfb876 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-no-tracing/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/init.js index 203a32557f21..5e9c86105ae7 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 0, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/subject.js index cb5f05dad5c1..9c584bf743cb 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/subject.js @@ -1,12 +1,12 @@ const xhr_1 = new XMLHttpRequest(); -xhr_1.open('GET', 'http://example.com/0'); +xhr_1.open('GET', 'http://sentry-test-site.example/0'); xhr_1.send(); const xhr_2 = new XMLHttpRequest(); -xhr_2.open('GET', 'http://example.com/1'); +xhr_2.open('GET', 'http://sentry-test-site.example/1'); xhr_2.setRequestHeader('X-Test-Header', 'existing-header'); xhr_2.send(); const xhr_3 = new XMLHttpRequest(); -xhr_3.open('GET', 'http://example.com/2'); +xhr_3.open('GET', 'http://sentry-test-site.example/2'); xhr_3.send(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/test.ts index cb4149ba27ed..53254dae0fa9 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-unsampled/test.ts @@ -13,7 +13,7 @@ sentryTest('should attach `sentry-trace` header to unsampled xhr requests', asyn const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/init.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/init.js index e7db5efdc388..11f91541bb18 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/init.js @@ -5,5 +5,5 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/subject.js index cb5f05dad5c1..9c584bf743cb 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/subject.js @@ -1,12 +1,12 @@ const xhr_1 = new XMLHttpRequest(); -xhr_1.open('GET', 'http://example.com/0'); +xhr_1.open('GET', 'http://sentry-test-site.example/0'); xhr_1.send(); const xhr_2 = new XMLHttpRequest(); -xhr_2.open('GET', 'http://example.com/1'); +xhr_2.open('GET', 'http://sentry-test-site.example/1'); xhr_2.setRequestHeader('X-Test-Header', 'existing-header'); xhr_2.send(); const xhr_3 = new XMLHttpRequest(); -xhr_3.open('GET', 'http://example.com/2'); +xhr_3.open('GET', 'http://sentry-test-site.example/2'); xhr_3.send(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/test.ts index f593223d520f..3337fc988723 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr-tracing-without-performance/test.ts @@ -15,7 +15,7 @@ sentryTest( const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/subject.js b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/subject.js index cb5f05dad5c1..9c584bf743cb 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/subject.js @@ -1,12 +1,12 @@ const xhr_1 = new XMLHttpRequest(); -xhr_1.open('GET', 'http://example.com/0'); +xhr_1.open('GET', 'http://sentry-test-site.example/0'); xhr_1.send(); const xhr_2 = new XMLHttpRequest(); -xhr_2.open('GET', 'http://example.com/1'); +xhr_2.open('GET', 'http://sentry-test-site.example/1'); xhr_2.setRequestHeader('X-Test-Header', 'existing-header'); xhr_2.send(); const xhr_3 = new XMLHttpRequest(); -xhr_3.open('GET', 'http://example.com/2'); +xhr_3.open('GET', 'http://sentry-test-site.example/2'); xhr_3.send(); diff --git a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts index c01797376b64..7ad30a83b54c 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/request/xhr/test.ts @@ -9,7 +9,7 @@ sentryTest('should create spans for XHR requests', async ({ getLocalTestUrl, pag sentryTest.skip(); } - await page.route('http://example.com/*', route => route.fulfill({ body: 'ok' })); + await page.route('http://sentry-test-site.example/*', route => route.fulfill({ body: 'ok' })); const url = await getLocalTestUrl({ testDir: __dirname }); @@ -20,7 +20,7 @@ sentryTest('should create spans for XHR requests', async ({ getLocalTestUrl, pag requestSpans?.forEach((span, index) => expect(span).toMatchObject({ - description: `GET http://example.com/${index}`, + description: `GET http://sentry-test-site.example/${index}`, parent_span_id: eventData.contexts?.trace?.span_id, span_id: expect.stringMatching(/[a-f0-9]{16}/), start_timestamp: expect.any(Number), @@ -28,9 +28,9 @@ sentryTest('should create spans for XHR requests', async ({ getLocalTestUrl, pag trace_id: eventData.contexts?.trace?.trace_id, data: { 'http.method': 'GET', - 'http.url': `http://example.com/${index}`, - url: `http://example.com/${index}`, - 'server.address': 'example.com', + 'http.url': `http://sentry-test-site.example/${index}`, + url: `http://sentry-test-site.example/${index}`, + 'server.address': 'sentry-test-site.example', type: 'xhr', }, }), @@ -47,7 +47,7 @@ sentryTest('should attach `sentry-trace` header to XHR requests', async ({ getLo const requests = ( await Promise.all([ page.goto(url), - Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://example.com/${idx}`))), + Promise.all([0, 1, 2].map(idx => page.waitForRequest(`http://sentry-test-site.example/${idx}`))), ]) )[1]; diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/init.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/init.js index 3104d71ca659..30317eda63ef 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/init.js @@ -7,6 +7,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration(), feedbackIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 1, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/navigation/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/navigation/test.ts index ca6e9723ce65..2c3749550eab 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/navigation/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/navigation/test.ts @@ -201,7 +201,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -217,7 +217,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(`${url}#foo`); await page.locator('#fetchBtn').click(); const [[navigationEvent, navigationTraceHeader], request] = await Promise.all([ @@ -264,7 +264,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -280,7 +280,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(`${url}#foo`); await page.locator('#xhrBtn').click(); const [[navigationEvent, navigationTraceHeader], request] = await Promise.all([ diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/subject.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/subject.js index 9528f861a723..bfaa54db4d01 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/subject.js @@ -5,12 +5,12 @@ errorBtn.addEventListener('click', () => { const fetchBtn = document.getElementById('fetchBtn'); fetchBtn.addEventListener('click', async () => { - await fetch('http://example.com'); + await fetch('http://sentry-test-site.example'); }); const xhrBtn = document.getElementById('xhrBtn'); xhrBtn.addEventListener('click', () => { const xhr = new XMLHttpRequest(); - xhr.open('GET', 'http://example.com'); + xhr.open('GET', 'http://sentry-test-site.example'); xhr.send(); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/test.ts index d087dd0b32af..18acb6d9af75 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload-meta/test.ts @@ -207,7 +207,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -220,7 +220,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(url); await page.locator('#fetchBtn').click(); const [[pageloadEvent, pageloadTraceHeader], request] = await Promise.all([pageloadEventPromise, requestPromise]); @@ -259,7 +259,7 @@ sentryTest( sentryTest.skip(); } - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -274,7 +274,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(url); await page.locator('#xhrBtn').click(); const [[pageloadEvent, pageloadTraceHeader], request] = await Promise.all([pageloadEventPromise, requestPromise]); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload/test.ts index 4af462e26aca..d7ada2cce6d8 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/pageload/test.ts @@ -197,7 +197,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -210,7 +210,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(url); await page.locator('#fetchBtn').click(); const [[pageloadEvent, pageloadTraceHeader], request] = await Promise.all([pageloadEventPromise, requestPromise]); @@ -254,7 +254,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -267,7 +267,7 @@ sentryTest( undefined, eventAndTraceHeaderRequestParser, ); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.goto(url); await page.locator('#xhrBtn').click(); const [[pageloadEvent, pageloadTraceHeader], request] = await Promise.all([pageloadEventPromise, requestPromise]); @@ -311,7 +311,7 @@ sentryTest( // const url = await getLocalTestUrl({ testDir: __dirname }); -// await page.route('http://example.com/**', route => { +// await page.route('http://sentry-test-site.example/**', route => { // return route.fulfill({ // status: 200, // contentType: 'application/json', @@ -346,7 +346,7 @@ sentryTest( // trace_id: pageloadTraceId, // }); -// const requestPromise = page.waitForRequest('http://example.com/*'); +// const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); // await page.locator('#xhrBtn').click(); // const request = await requestPromise; @@ -369,7 +369,7 @@ sentryTest( // const url = await getLocalTestUrl({ testDir: __dirname }); -// await page.route('http://example.com/**', route => { +// await page.route('http://sentry-test-site.example/**', route => { // return route.fulfill({ // status: 200, // contentType: 'application/json', @@ -406,7 +406,7 @@ sentryTest( // trace_id: pageloadTraceId, // }); -// const requestPromise = page.waitForRequest('http://example.com/**'); +// const requestPromise = page.waitForRequest('http://sentry-test-site.example/**'); // const customTransactionEventPromise = getFirstSentryEnvelopeRequest( // page, // undefined, diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/subject.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/subject.js index 5b28df9da5e8..3bb1e489ccb6 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/subject.js @@ -2,7 +2,7 @@ const newTraceBtn = document.getElementById('newTrace'); newTraceBtn.addEventListener('click', async () => { Sentry.startNewTrace(() => { Sentry.startSpan({ op: 'ui.interaction.click', name: 'new-trace' }, async () => { - await fetch('http://example.com'); + await fetch('http://sentry-test-site.example'); }); }); }); @@ -10,6 +10,6 @@ newTraceBtn.addEventListener('click', async () => { const oldTraceBtn = document.getElementById('oldTrace'); oldTraceBtn.addEventListener('click', async () => { Sentry.startSpan({ op: 'ui.interaction.click', name: 'old-trace' }, async () => { - await fetch('http://example.com'); + await fetch('http://sentry-test-site.example'); }); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/test.ts index a785327a0031..6f5ede5eccf8 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/startNewTrace/test.ts @@ -17,7 +17,7 @@ sentryTest( const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/subject.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/subject.js index a2f6271463ce..eead800a75a5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/subject.js @@ -5,19 +5,19 @@ errorBtn.addEventListener('click', () => { const fetchBtn = document.getElementById('fetchBtn'); fetchBtn.addEventListener('click', async () => { - await fetch('http://example.com'); + await fetch('http://sentry-test-site.example'); }); const xhrBtn = document.getElementById('xhrBtn'); xhrBtn.addEventListener('click', () => { const xhr = new XMLHttpRequest(); - xhr.open('GET', 'http://example.com'); + xhr.open('GET', 'http://sentry-test-site.example'); xhr.send(); }); const spanAndFetchBtn = document.getElementById('spanAndFetchBtn'); spanAndFetchBtn.addEventListener('click', () => { Sentry.startSpan({ name: 'custom-root-span' }, async () => { - await fetch('http://example.com'); + await fetch('http://sentry-test-site.example'); }); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/init.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/init.js index 7cd076a052e5..b2280b70e307 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/init.js @@ -5,6 +5,6 @@ window.Sentry = Sentry; Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], tracesSampleRate: 1, }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/subject.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/subject.js index 5951d6d33411..d128ec943af5 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/subject.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/subject.js @@ -8,10 +8,12 @@ fetchPojo.addEventListener('click', () => { // Make two fetch requests that reuse the same fetch object Sentry.startSpan({ name: 'does-not-matter-1' }, () => - fetch('http://example.com/fetch-pojo', fetchOptions) + fetch('http://sentry-test-site.example/fetch-pojo', fetchOptions) .then(res => res.text()) .then(() => - Sentry.startSpan({ name: 'does-not-matter-2' }, () => fetch('http://example.com/fetch-pojo', fetchOptions)), + Sentry.startSpan({ name: 'does-not-matter-2' }, () => + fetch('http://sentry-test-site.example/fetch-pojo', fetchOptions), + ), ), ); }); @@ -26,10 +28,12 @@ fetchArray.addEventListener('click', () => { // Make two fetch requests that reuse the same fetch object Sentry.startSpan({ name: 'does-not-matter-1' }, () => - fetch('http://example.com/fetch-array', fetchOptions) + fetch('http://sentry-test-site.example/fetch-array', fetchOptions) .then(res => res.text()) .then(() => - Sentry.startSpan({ name: 'does-not-matter-2' }, () => fetch('http://example.com/fetch-array', fetchOptions)), + Sentry.startSpan({ name: 'does-not-matter-2' }, () => + fetch('http://sentry-test-site.example/fetch-array', fetchOptions), + ), ), ); }); @@ -44,10 +48,12 @@ fetchHeaders.addEventListener('click', () => { // Make two fetch requests that reuse the same fetch object Sentry.startSpan({ name: 'does-not-matter-1' }, () => - fetch('http://example.com/fetch-headers', fetchOptions) + fetch('http://sentry-test-site.example/fetch-headers', fetchOptions) .then(res => res.text()) .then(() => - Sentry.startSpan({ name: 'does-not-matter-2' }, () => fetch('http://example.com/fetch-headers', fetchOptions)), + Sentry.startSpan({ name: 'does-not-matter-2' }, () => + fetch('http://sentry-test-site.example/fetch-headers', fetchOptions), + ), ), ); }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/test.ts index 5ae2f83924d0..8280f443bc3f 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/trace-header-merging/test.ts @@ -50,15 +50,27 @@ sentryTest( await page.goto(url); await sentryTest.step('fetch with POJO', () => - assertRequests({ page, buttonSelector: '#fetchPojo', requestMatcher: 'http://example.com/fetch-pojo' }), + assertRequests({ + page, + buttonSelector: '#fetchPojo', + requestMatcher: 'http://sentry-test-site.example/fetch-pojo', + }), ); await sentryTest.step('fetch with array', () => - assertRequests({ page, buttonSelector: '#fetchArray', requestMatcher: 'http://example.com/fetch-array' }), + assertRequests({ + page, + buttonSelector: '#fetchArray', + requestMatcher: 'http://sentry-test-site.example/fetch-array', + }), ); await sentryTest.step('fetch with Headers instance', () => - assertRequests({ page, buttonSelector: '#fetchHeaders', requestMatcher: 'http://example.com/fetch-headers' }), + assertRequests({ + page, + buttonSelector: '#fetchHeaders', + requestMatcher: 'http://sentry-test-site.example/fetch-headers', + }), ); }, ); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/init.js b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/init.js index c273986e1a94..94222159056c 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/init.js +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/init.js @@ -6,5 +6,5 @@ Sentry.init({ // in browser TwP means not setting tracesSampleRate but adding browserTracingIntegration, dsn: 'https://public@dsn.ingest.sentry.io/1337', integrations: [Sentry.browserTracingIntegration()], - tracePropagationTargets: ['http://example.com'], + tracePropagationTargets: ['http://sentry-test-site.example'], }); diff --git a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/test.ts b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/test.ts index bea3c10cbde5..686f65227aa7 100644 --- a/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/test.ts +++ b/dev-packages/browser-integration-tests/suites/tracing/trace-lifetime/tracing-without-performance/test.ts @@ -105,7 +105,7 @@ sentryTest('outgoing fetch requests have new traceId after navigation', async ({ const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -115,7 +115,7 @@ sentryTest('outgoing fetch requests have new traceId after navigation', async ({ await page.goto(url); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.locator('#fetchBtn').click(); const request = await requestPromise; const headers = request.headers(); @@ -126,7 +126,7 @@ sentryTest('outgoing fetch requests have new traceId after navigation', async ({ await page.goto(`${url}#navigation`); - const requestPromise2 = page.waitForRequest('http://example.com/*'); + const requestPromise2 = page.waitForRequest('http://sentry-test-site.example/*'); await page.locator('#fetchBtn').click(); const request2 = await requestPromise2; const headers2 = request2.headers(); @@ -147,7 +147,7 @@ sentryTest('outgoing XHR requests have new traceId after navigation', async ({ g const url = await getLocalTestUrl({ testDir: __dirname }); - await page.route('http://example.com/**', route => { + await page.route('http://sentry-test-site.example/**', route => { return route.fulfill({ status: 200, contentType: 'application/json', @@ -157,7 +157,7 @@ sentryTest('outgoing XHR requests have new traceId after navigation', async ({ g await page.goto(url); - const requestPromise = page.waitForRequest('http://example.com/*'); + const requestPromise = page.waitForRequest('http://sentry-test-site.example/*'); await page.locator('#xhrBtn').click(); const request = await requestPromise; const headers = request.headers(); @@ -168,7 +168,7 @@ sentryTest('outgoing XHR requests have new traceId after navigation', async ({ g await page.goto(`${url}#navigation`); - const requestPromise2 = page.waitForRequest('http://example.com/*'); + const requestPromise2 = page.waitForRequest('http://sentry-test-site.example/*'); await page.locator('#xhrBtn').click(); const request2 = await requestPromise2; const headers2 = request2.headers(); diff --git a/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts b/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts index 52dbbca1c086..56ff33f878fa 100644 --- a/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts +++ b/dev-packages/browser-integration-tests/utils/replayEventTemplates.ts @@ -190,7 +190,7 @@ export const expectedFPPerformanceSpan = { export const expectedFetchPerformanceSpan = { op: 'resource.fetch', - description: 'https://example.com', + description: 'https://sentry-test-site.example', startTimestamp: expect.any(Number), endTimestamp: expect.any(Number), data: { @@ -215,7 +215,7 @@ export const expectedFetchPerformanceSpan = { export const expectedXHRPerformanceSpan = { op: 'resource.xhr', - description: 'https://example.com', + description: 'https://sentry-test-site.example', startTimestamp: expect.any(Number), endTimestamp: expect.any(Number), data: { diff --git a/dev-packages/e2e-tests/verdaccio-config/config.yaml b/dev-packages/e2e-tests/verdaccio-config/config.yaml index ee65c5218d4a..cbb73201eebf 100644 --- a/dev-packages/e2e-tests/verdaccio-config/config.yaml +++ b/dev-packages/e2e-tests/verdaccio-config/config.yaml @@ -122,6 +122,12 @@ packages: unpublish: $all # proxy: npmjs # Don't proxy for E2E tests! + '@sentry/react-router': + access: $all + publish: $all + unpublish: $all + # proxy: npmjs # Don't proxy for E2E tests! + '@sentry/remix': access: $all publish: $all diff --git a/dev-packages/node-integration-tests/suites/tracing/httpIntegration/server-ignoreOutgoingRequests.js b/dev-packages/node-integration-tests/suites/tracing/httpIntegration/server-ignoreOutgoingRequests.js index 8c5c1472dcfa..a754f1e5c32a 100644 --- a/dev-packages/node-integration-tests/suites/tracing/httpIntegration/server-ignoreOutgoingRequests.js +++ b/dev-packages/node-integration-tests/suites/tracing/httpIntegration/server-ignoreOutgoingRequests.js @@ -1,6 +1,8 @@ const { loggingTransport } = require('@sentry-internal/node-integration-tests'); const Sentry = require('@sentry/node'); +const url = process.env.SERVER_URL; + Sentry.init({ dsn: 'https://public@dsn.ingest.sentry.io/1337', release: '1.0', @@ -10,11 +12,11 @@ Sentry.init({ integrations: [ Sentry.httpIntegration({ ignoreOutgoingRequests: (url, request) => { - if (url === 'https://example.com/blockUrl') { + if (url.endsWith('/blockUrl')) { return true; } - if (request.hostname === 'example.com' && request.path === '/blockRequest') { + if (request.path === '/blockRequest') { return true; } return false; @@ -23,7 +25,7 @@ Sentry.init({ ], }); -const https = require('https'); +const http = require('http'); // express must be required after Sentry is initialized const express = require('express'); @@ -35,16 +37,16 @@ const app = express(); app.use(cors()); app.get('/testUrl', (_req, response) => { - makeHttpRequest('https://example.com/blockUrl').then(() => { - makeHttpRequest('https://example.com/pass').then(() => { + makeHttpRequest(`${url}/blockUrl`).then(() => { + makeHttpRequest(`${url}/pass`).then(() => { response.send({ response: 'done' }); }); }); }); app.get('/testRequest', (_req, response) => { - makeHttpRequest('https://example.com/blockRequest').then(() => { - makeHttpRequest('https://example.com/pass').then(() => { + makeHttpRequest(`${url}/blockRequest`).then(() => { + makeHttpRequest(`${url}/pass`).then(() => { response.send({ response: 'done' }); }); }); @@ -56,7 +58,7 @@ startExpressServerAndSendPortToRunner(app); function makeHttpRequest(url) { return new Promise((resolve, reject) => { - https + http .get(url, res => { res.on('data', () => {}); res.on('end', () => { diff --git a/dev-packages/node-integration-tests/suites/tracing/httpIntegration/test.ts b/dev-packages/node-integration-tests/suites/tracing/httpIntegration/test.ts index c3d72d4708c9..83f36fd7a9ef 100644 --- a/dev-packages/node-integration-tests/suites/tracing/httpIntegration/test.ts +++ b/dev-packages/node-integration-tests/suites/tracing/httpIntegration/test.ts @@ -1,4 +1,5 @@ import { cleanupChildProcesses, createRunner } from '../../../utils/runner'; +import { createTestServer } from '../../../utils/server'; describe('httpIntegration', () => { afterAll(() => { @@ -130,43 +131,55 @@ describe('httpIntegration', () => { describe("doesn't create child spans or breadcrumbs for outgoing requests ignored via `ignoreOutgoingRequests`", () => { test('via the url param', done => { - const runner = createRunner(__dirname, 'server-ignoreOutgoingRequests.js') - .expect({ - transaction: event => { - expect(event.transaction).toBe('GET /testUrl'); - - const requestSpans = event.spans?.filter(span => span.op === 'http.client'); - expect(requestSpans).toHaveLength(1); - expect(requestSpans![0]?.description).toBe('GET https://example.com/pass'); - - const breadcrumbs = event.breadcrumbs?.filter(b => b.category === 'http'); - expect(breadcrumbs).toHaveLength(1); - expect(breadcrumbs![0]?.data?.url).toEqual('https://example.com/pass'); - }, - }) - .start(done); - - runner.makeRequest('get', '/testUrl'); + createTestServer(done) + .get('/blockUrl', () => {}, 200) + .get('/pass', () => {}, 200) + .start() + .then(([SERVER_URL, closeTestServer]) => { + createRunner(__dirname, 'server-ignoreOutgoingRequests.js') + .withEnv({ SERVER_URL }) + .expect({ + transaction: event => { + expect(event.transaction).toBe('GET /testUrl'); + + const requestSpans = event.spans?.filter(span => span.op === 'http.client'); + expect(requestSpans).toHaveLength(1); + expect(requestSpans![0]?.description).toBe(`GET ${SERVER_URL}/pass`); + + const breadcrumbs = event.breadcrumbs?.filter(b => b.category === 'http'); + expect(breadcrumbs).toHaveLength(1); + expect(breadcrumbs![0]?.data?.url).toEqual(`${SERVER_URL}/pass`); + }, + }) + .start(closeTestServer) + .makeRequest('get', '/testUrl'); + }); }); test('via the request param', done => { - const runner = createRunner(__dirname, 'server-ignoreOutgoingRequests.js') - .expect({ - transaction: event => { - expect(event.transaction).toBe('GET /testRequest'); - - const requestSpans = event.spans?.filter(span => span.op === 'http.client'); - expect(requestSpans).toHaveLength(1); - expect(requestSpans![0]?.description).toBe('GET https://example.com/pass'); - - const breadcrumbs = event.breadcrumbs?.filter(b => b.category === 'http'); - expect(breadcrumbs).toHaveLength(1); - expect(breadcrumbs![0]?.data?.url).toEqual('https://example.com/pass'); - }, - }) - .start(done); - - runner.makeRequest('get', '/testRequest'); + createTestServer(done) + .get('/blockUrl', () => {}, 200) + .get('/pass', () => {}, 200) + .start() + .then(([SERVER_URL, closeTestServer]) => { + createRunner(__dirname, 'server-ignoreOutgoingRequests.js') + .withEnv({ SERVER_URL }) + .expect({ + transaction: event => { + expect(event.transaction).toBe('GET /testRequest'); + + const requestSpans = event.spans?.filter(span => span.op === 'http.client'); + expect(requestSpans).toHaveLength(1); + expect(requestSpans![0]?.description).toBe(`GET ${SERVER_URL}/pass`); + + const breadcrumbs = event.breadcrumbs?.filter(b => b.category === 'http'); + expect(breadcrumbs).toHaveLength(1); + expect(breadcrumbs![0]?.data?.url).toEqual(`${SERVER_URL}/pass`); + }, + }) + .start(closeTestServer) + .makeRequest('get', '/testRequest'); + }); }); }); }); diff --git a/package.json b/package.json index 73ae7f18495d..a57893dde86c 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "yalc:publish": "lerna run yalc:publish" }, "volta": { - "node": "18.20.5", + "node": "20.18.2", "yarn": "1.22.22", "pnpm": "9.15.0" }, @@ -73,6 +73,7 @@ "packages/opentelemetry", "packages/profiling-node", "packages/react", + "packages/react-router", "packages/remix", "packages/replay-internal", "packages/replay-canvas", diff --git a/packages/astro/src/index.server.ts b/packages/astro/src/index.server.ts index 57abd7efede3..c7b997c2cb92 100644 --- a/packages/astro/src/index.server.ts +++ b/packages/astro/src/index.server.ts @@ -118,6 +118,7 @@ export { tediousIntegration, trpcMiddleware, updateSpanName, + vercelAIIntegration, withActiveSpan, withIsolationScope, withMonitor, diff --git a/packages/aws-serverless/src/index.ts b/packages/aws-serverless/src/index.ts index 60747de09dd5..2cd5ee5661ec 100644 --- a/packages/aws-serverless/src/index.ts +++ b/packages/aws-serverless/src/index.ts @@ -110,6 +110,7 @@ export { zodErrorsIntegration, profiler, amqplibIntegration, + vercelAIIntegration, } from '@sentry/node'; export { diff --git a/packages/browser/src/eventbuilder.ts b/packages/browser/src/eventbuilder.ts index acec653c5ee6..fc2654d2b4d7 100644 --- a/packages/browser/src/eventbuilder.ts +++ b/packages/browser/src/eventbuilder.ts @@ -199,6 +199,14 @@ export function extractType(ex: Error & { message: { error?: Error } }): string export function extractMessage(ex: Error & { message: { error?: Error } }): string { const message = ex?.message; + if (isWebAssemblyException(ex)) { + // For Node 18, Emscripten sets array[type, message] to the "message" property on the WebAssembly.Exception object + if (Array.isArray(ex.message) && ex.message.length == 2) { + return ex.message[1]; + } + return 'wasm exception'; + } + if (!message) { return 'No error message'; } @@ -207,11 +215,6 @@ export function extractMessage(ex: Error & { message: { error?: Error } }): stri return message.error.message; } - // Emscripten sets array[type, message] to the "message" property on the WebAssembly.Exception object - if (isWebAssemblyException(ex) && Array.isArray(ex.message) && ex.message.length == 2) { - return ex.message[1]; - } - return message; } diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index 42c388d73547..2abe7beb55fb 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -68,3 +68,4 @@ export { export { launchDarklyIntegration, buildLaunchDarklyFlagUsedHandler } from './integrations/featureFlags/launchdarkly'; export { openFeatureIntegration, OpenFeatureIntegrationHook } from './integrations/featureFlags/openfeature'; export { unleashIntegration } from './integrations/featureFlags/unleash'; +export { statsigIntegration } from './integrations/featureFlags/statsig'; diff --git a/packages/browser/src/integrations/featureFlags/statsig/index.ts b/packages/browser/src/integrations/featureFlags/statsig/index.ts new file mode 100644 index 000000000000..a208e4c7dc0e --- /dev/null +++ b/packages/browser/src/integrations/featureFlags/statsig/index.ts @@ -0,0 +1 @@ +export { statsigIntegration } from './integration'; diff --git a/packages/browser/src/integrations/featureFlags/statsig/integration.ts b/packages/browser/src/integrations/featureFlags/statsig/integration.ts new file mode 100644 index 000000000000..7870f1250032 --- /dev/null +++ b/packages/browser/src/integrations/featureFlags/statsig/integration.ts @@ -0,0 +1,46 @@ +import type { Client, Event, EventHint, IntegrationFn } from '@sentry/core'; + +import { defineIntegration } from '@sentry/core'; +import { copyFlagsFromScopeToEvent, insertFlagToScope } from '../../../utils/featureFlags'; +import type { FeatureGate, StatsigClient } from './types'; + +/** + * Sentry integration for capturing feature flag evaluations from the Statsig js-client SDK. + * + * See the [feature flag documentation](https://develop.sentry.dev/sdk/expected-features/#feature-flags) for more information. + * + * @example + * ``` + * import { StatsigClient } from '@statsig/js-client'; + * import * as Sentry from '@sentry/browser'; + * + * const statsigClient = new StatsigClient(); + * + * Sentry.init({ + * dsn: '___PUBLIC_DSN___', + * integrations: [Sentry.statsigIntegration({featureFlagClient: statsigClient})], + * }); + * + * await statsigClient.initializeAsync(); // or statsigClient.initializeSync(); + * + * const result = statsigClient.checkGate('my-feature-gate'); + * Sentry.captureException(new Error('something went wrong')); + * ``` + */ +export const statsigIntegration = defineIntegration( + ({ featureFlagClient: statsigClient }: { featureFlagClient: StatsigClient }) => { + return { + name: 'Statsig', + + processEvent(event: Event, _hint: EventHint, _client: Client): Event { + return copyFlagsFromScopeToEvent(event); + }, + + setup() { + statsigClient.on('gate_evaluation', (event: { gate: FeatureGate }) => { + insertFlagToScope(event.gate.name, event.gate.value); + }); + }, + }; + }, +) satisfies IntegrationFn; diff --git a/packages/browser/src/integrations/featureFlags/statsig/types.ts b/packages/browser/src/integrations/featureFlags/statsig/types.ts new file mode 100644 index 000000000000..ff0ea820d31f --- /dev/null +++ b/packages/browser/src/integrations/featureFlags/statsig/types.ts @@ -0,0 +1,15 @@ +export type FeatureGate = { + readonly name: string; + readonly value: boolean; +}; + +type EventNameToEventDataMap = { + gate_evaluation: { gate: FeatureGate }; +}; + +export interface StatsigClient { + on( + event: keyof EventNameToEventDataMap, + callback: (data: EventNameToEventDataMap[keyof EventNameToEventDataMap]) => void, + ): void; +} diff --git a/packages/bun/src/index.ts b/packages/bun/src/index.ts index 8617030f12d9..770cf2eb2ebe 100644 --- a/packages/bun/src/index.ts +++ b/packages/bun/src/index.ts @@ -129,6 +129,7 @@ export { zodErrorsIntegration, profiler, amqplibIntegration, + vercelAIIntegration, } from '@sentry/node'; export { diff --git a/packages/google-cloud-serverless/src/index.ts b/packages/google-cloud-serverless/src/index.ts index dd7558351911..4d7c23ecf87e 100644 --- a/packages/google-cloud-serverless/src/index.ts +++ b/packages/google-cloud-serverless/src/index.ts @@ -110,6 +110,7 @@ export { profiler, amqplibIntegration, childProcessIntegration, + vercelAIIntegration, } from '@sentry/node'; export { diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 1f4983f6abc3..89bafe860cd6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -85,7 +85,7 @@ "@sentry/opentelemetry": "9.0.0-alpha.2", "@sentry/react": "9.0.0-alpha.2", "@sentry/vercel-edge": "9.0.0-alpha.2", - "@sentry/webpack-plugin": "2.22.7", + "@sentry/webpack-plugin": "3.1.2", "chalk": "3.0.0", "resolve": "1.22.8", "rollup": "3.29.5", diff --git a/packages/nextjs/src/common/devErrorSymbolicationEventProcessor.ts b/packages/nextjs/src/common/devErrorSymbolicationEventProcessor.ts index b6851f18f3fa..a065e1f07eb5 100644 --- a/packages/nextjs/src/common/devErrorSymbolicationEventProcessor.ts +++ b/packages/nextjs/src/common/devErrorSymbolicationEventProcessor.ts @@ -1,7 +1,10 @@ import type { Event, EventHint } from '@sentry/core'; +import { parseSemver } from '@sentry/core'; import { GLOBAL_OBJ, suppressTracing } from '@sentry/core'; +import { logger } from '@sentry/core'; import type { StackFrame } from 'stacktrace-parser'; import * as stackTraceParser from 'stacktrace-parser'; +import { DEBUG_BUILD } from './debug-build'; type OriginalStackFrameResponse = { originalStackFrame: StackFrame; @@ -11,8 +14,92 @@ type OriginalStackFrameResponse = { const globalWithInjectedValues = GLOBAL_OBJ as typeof GLOBAL_OBJ & { _sentryBasePath?: string; + next?: { + version?: string; + }; }; +/** + * Event processor that will symbolicate errors by using the webpack/nextjs dev server that is used to show stack traces + * in the dev overlay. + */ +export async function devErrorSymbolicationEventProcessor(event: Event, hint: EventHint): Promise { + // Filter out spans for requests resolving source maps for stack frames in dev mode + if (event.type === 'transaction') { + event.spans = event.spans?.filter(span => { + const httpUrlAttribute: unknown = span.data?.['http.url']; + if (typeof httpUrlAttribute === 'string') { + return !httpUrlAttribute.includes('__nextjs_original-stack-frame'); // could also be __nextjs_original-stack-frames (plural) + } + + return true; + }); + } + + // Due to changes across Next.js versions, there are a million things that can go wrong here so we just try-catch the + // entire event processor. Symbolicated stack traces are just a nice to have. + try { + if (hint.originalException && hint.originalException instanceof Error && hint.originalException.stack) { + const frames = stackTraceParser.parse(hint.originalException.stack); + + const nextjsVersion = globalWithInjectedValues.next?.version || '0.0.0'; + const parsedNextjsVersion = nextjsVersion ? parseSemver(nextjsVersion) : {}; + + let resolvedFrames: ({ + originalCodeFrame: string | null; + originalStackFrame: StackFrame | null; + } | null)[]; + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + if (parsedNextjsVersion.major! > 15 || (parsedNextjsVersion.major === 15 && parsedNextjsVersion.minor! >= 2)) { + const r = await resolveStackFrames(frames); + if (r === null) { + return event; + } + resolvedFrames = r; + } else { + resolvedFrames = await Promise.all( + frames.map(frame => resolveStackFrame(frame, hint.originalException as Error)), + ); + } + + if (event.exception?.values?.[0]?.stacktrace?.frames) { + event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames.map( + (frame, i, frames) => { + const resolvedFrame = resolvedFrames[frames.length - 1 - i]; + if (!resolvedFrame?.originalStackFrame || !resolvedFrame.originalCodeFrame) { + return { + ...frame, + platform: frame.filename?.startsWith('node:internal') ? 'nodejs' : undefined, // simple hack that will prevent a source mapping error from showing up + in_app: false, + }; + } + + const { contextLine, preContextLines, postContextLines } = parseOriginalCodeFrame( + resolvedFrame.originalCodeFrame, + ); + + return { + ...frame, + pre_context: preContextLines, + context_line: contextLine, + post_context: postContextLines, + function: resolvedFrame.originalStackFrame.methodName, + filename: resolvedFrame.originalStackFrame.file || undefined, + lineno: resolvedFrame.originalStackFrame.lineNumber || undefined, + colno: resolvedFrame.originalStackFrame.column || undefined, + }; + }, + ); + } + } + } catch (e) { + return event; + } + + return event; +} + async function resolveStackFrame( frame: StackFrame, error: Error, @@ -65,6 +152,79 @@ async function resolveStackFrame( originalStackFrame: body.originalStackFrame, }; } catch (e) { + DEBUG_BUILD && logger.error('Failed to symbolicate event with Next.js dev server', e); + return null; + } +} + +async function resolveStackFrames( + frames: StackFrame[], +): Promise<{ originalCodeFrame: string | null; originalStackFrame: StackFrame | null }[] | null> { + try { + const postBody = { + frames: frames + .filter(frame => { + return !!frame.file; + }) + .map(frame => { + // https://github.com/vercel/next.js/blob/df0573a478baa8b55478a7963c473dddd59a5e40/packages/next/src/client/components/react-dev-overlay/server/middleware-turbopack.ts#L129 + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + frame.file = frame.file!.replace(/^rsc:\/\/React\/[^/]+\//, '').replace(/\?\d+$/, ''); + + return { + file: frame.file, + methodName: frame.methodName ?? '', + arguments: [], + lineNumber: frame.lineNumber ?? 0, + column: frame.column ?? 0, + }; + }), + isServer: false, + isEdgeServer: false, + isAppDirectory: true, + }; + + let basePath = process.env._sentryBasePath ?? globalWithInjectedValues._sentryBasePath ?? ''; + + // Prefix the basepath with a slash if it doesn't have one + if (basePath !== '' && !basePath.match(/^\//)) { + basePath = `/${basePath}`; + } + + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), 3000); + + const res = await fetch( + `${ + // eslint-disable-next-line no-restricted-globals + typeof window === 'undefined' ? 'http://localhost:3000' : '' // TODO: handle the case where users define a different port + }${basePath}/__nextjs_original-stack-frames`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + signal: controller.signal, + body: JSON.stringify(postBody), + }, + ).finally(() => { + clearTimeout(timer); + }); + + if (!res.ok || res.status === 204) { + return null; + } + + const body: { value: OriginalStackFrameResponse }[] = await res.json(); + + return body.map(frame => { + return { + originalCodeFrame: frame.value.originalCodeFrame, + originalStackFrame: frame.value.originalStackFrame, + }; + }); + } catch (e) { + DEBUG_BUILD && logger.error('Failed to symbolicate event with Next.js dev server', e); return null; } } @@ -118,66 +278,3 @@ function parseOriginalCodeFrame(codeFrame: string): { postContextLines, }; } - -/** - * Event processor that will symbolicate errors by using the webpack/nextjs dev server that is used to show stack traces - * in the dev overlay. - */ -export async function devErrorSymbolicationEventProcessor(event: Event, hint: EventHint): Promise { - // Filter out spans for requests resolving source maps for stack frames in dev mode - if (event.type === 'transaction') { - event.spans = event.spans?.filter(span => { - const httpUrlAttribute: unknown = span.data?.['http.url']; - if (typeof httpUrlAttribute === 'string') { - return !httpUrlAttribute.includes('__nextjs_original-stack-frame'); - } - - return true; - }); - } - - // Due to changes across Next.js versions, there are a million things that can go wrong here so we just try-catch the // entire event processor.Symbolicated stack traces are just a nice to have. - try { - if (hint.originalException && hint.originalException instanceof Error && hint.originalException.stack) { - const frames = stackTraceParser.parse(hint.originalException.stack); - - const resolvedFrames = await Promise.all( - frames.map(frame => resolveStackFrame(frame, hint.originalException as Error)), - ); - - if (event.exception?.values?.[0]?.stacktrace?.frames) { - event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames.map( - (frame, i, frames) => { - const resolvedFrame = resolvedFrames[frames.length - 1 - i]; - if (!resolvedFrame?.originalStackFrame || !resolvedFrame.originalCodeFrame) { - return { - ...frame, - platform: frame.filename?.startsWith('node:internal') ? 'nodejs' : undefined, // simple hack that will prevent a source mapping error from showing up - in_app: false, - }; - } - - const { contextLine, preContextLines, postContextLines } = parseOriginalCodeFrame( - resolvedFrame.originalCodeFrame, - ); - - return { - ...frame, - pre_context: preContextLines, - context_line: contextLine, - post_context: postContextLines, - function: resolvedFrame.originalStackFrame.methodName, - filename: resolvedFrame.originalStackFrame.file || undefined, - lineno: resolvedFrame.originalStackFrame.lineNumber || undefined, - colno: resolvedFrame.originalStackFrame.column || undefined, - }; - }, - ); - } - } - } catch (e) { - return event; - } - - return event; -} diff --git a/packages/nextjs/src/config/types.ts b/packages/nextjs/src/config/types.ts index 0a188341ce58..a747684cc753 100644 --- a/packages/nextjs/src/config/types.ts +++ b/packages/nextjs/src/config/types.ts @@ -363,6 +363,11 @@ export type SentryBuildOptions = { * Whether the component name annotate plugin should be enabled or not. */ enabled?: boolean; + + /** + * A list of strings representing the names of components to ignore. The plugin will not apply `data-sentry` annotations on the DOM element for these components. + */ + ignoredComponents?: string[]; }; /** diff --git a/packages/nextjs/test/config/webpack/webpackPluginOptions.test.ts b/packages/nextjs/test/config/webpack/webpackPluginOptions.test.ts index c987cda267e4..55f394fd268f 100644 --- a/packages/nextjs/test/config/webpack/webpackPluginOptions.test.ts +++ b/packages/nextjs/test/config/webpack/webpackPluginOptions.test.ts @@ -34,6 +34,7 @@ describe('getWebpackPluginOptions()', () => { telemetry: false, reactComponentAnnotation: { enabled: true, + ignoredComponents: ['myComponent'], }, silent: false, debug: true, @@ -65,6 +66,7 @@ describe('getWebpackPluginOptions()', () => { expect(generatedPluginOptions.org).toBe('my-org'); expect(generatedPluginOptions.project).toBe('my-project'); expect(generatedPluginOptions.reactComponentAnnotation?.enabled).toBe(true); + expect(generatedPluginOptions.reactComponentAnnotation?.ignoredComponents).toStrictEqual(['myComponent']); expect(generatedPluginOptions.release?.create).toBe(false); expect(generatedPluginOptions.release?.deploy?.env).toBe('my-env'); expect(generatedPluginOptions.release?.dist).toBe('my-dist'); @@ -88,6 +90,7 @@ describe('getWebpackPluginOptions()', () => { project: 'my-project', reactComponentAnnotation: { enabled: true, + ignoredComponents: ['myComponent'], }, release: { create: false, diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 6493e0280b3b..2ebb7445a817 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -32,6 +32,7 @@ export { tediousIntegration } from './integrations/tracing/tedious'; export { genericPoolIntegration } from './integrations/tracing/genericPool'; export { dataloaderIntegration } from './integrations/tracing/dataloader'; export { amqplibIntegration } from './integrations/tracing/amqplib'; +export { vercelAIIntegration } from './integrations/tracing/vercelai'; export { childProcessIntegration } from './integrations/childProcess'; export { SentryContextManager } from './otel/contextManager'; diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index d6f6108b7130..dbb92a4eac9f 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -47,7 +47,7 @@ "@sentry/core": "9.0.0-alpha.2", "@sentry/node": "9.0.0-alpha.2", "@sentry/opentelemetry": "9.0.0-alpha.2", - "@sentry/rollup-plugin": "2.22.7", + "@sentry/rollup-plugin": "3.1.2", "@sentry/vite-plugin": "2.22.6", "@sentry/vue": "9.0.0-alpha.2" }, diff --git a/packages/nuxt/src/common/types.ts b/packages/nuxt/src/common/types.ts index b646ca9a25e2..62496001273b 100644 --- a/packages/nuxt/src/common/types.ts +++ b/packages/nuxt/src/common/types.ts @@ -139,6 +139,13 @@ type SourceMapsOptions = { * Build options for the Sentry module. These options are used during build-time by the Sentry SDK. */ export type SentryNuxtModuleOptions = { + /** + * Enable the Sentry Nuxt Module. + * + * @default true + */ + enabled?: boolean; + /** * Options for the Sentry Vite plugin to customize the source maps upload process. * diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index c4386d537ff0..4f0abce6a8ef 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -18,6 +18,10 @@ export default defineNuxtModule({ }, defaults: {}, setup(moduleOptionsParam, nuxt) { + if (moduleOptionsParam?.enabled === false) { + return; + } + const moduleOptions = { ...moduleOptionsParam, autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry, diff --git a/packages/react-router/.eslintrc.js b/packages/react-router/.eslintrc.js new file mode 100644 index 000000000000..a22f9710cf6b --- /dev/null +++ b/packages/react-router/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + env: { + browser: true, + node: true, + }, + overrides: [ + { + files: ['vite.config.ts'], + parserOptions: { + project: ['tsconfig.test.json'], + }, + }, + ], + extends: ['../../.eslintrc.js'], +}; diff --git a/packages/react-router/LICENSE b/packages/react-router/LICENSE new file mode 100644 index 000000000000..5251db3eaaca --- /dev/null +++ b/packages/react-router/LICENSE @@ -0,0 +1,16 @@ +MIT License + +Copyright (c) 2025 Functional Software, Inc. dba Sentry + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/react-router/README.md b/packages/react-router/README.md new file mode 100644 index 000000000000..368f3ee4b717 --- /dev/null +++ b/packages/react-router/README.md @@ -0,0 +1,146 @@ +

+ + Sentry + +

+ +# Official Sentry SDK for React Router (Framework) (EXPERIMENTAL) + +[![npm version](https://img.shields.io/npm/v/@sentry/react-router.svg)](https://www.npmjs.com/package/@sentry/react-router) +[![npm dm](https://img.shields.io/npm/dm/@sentry/react-router.svg)](https://www.npmjs.com/package/@sentry/react-router) +[![npm dt](https://img.shields.io/npm/dt/@sentry/react-router.svg)](https://www.npmjs.com/package/@sentry/react-router) + +> [!WARNING] +> This SDK is considered ⚠️ **experimental and in an alpha state**. It may experience breaking changes. Please reach out +> on [GitHub](https://github.com/getsentry/sentry-javascript/issues/) if you have any feedback or concerns. This +> SDK is for [React Router (framework)](https://reactrouter.com/start/framework/installation). If you're using [React Router (library)](https://reactrouter.com/start/library/installation) see our +> [React SDK here](https://docs.sentry.io/platforms/javascript/guides/react/features/react-router/v7/). + +## Links + +- [Official SDK Docs](https://docs.sentry.io/platforms/javascript/guides/react-router/) + +## General + +This package is a wrapper around `@sentry/node` for the server and `@sentry/browser` for the client side. + +## Manual Setup + +### Expose Hooks + +React Router exposes two hooks in your `app` folder (`entry.client.tsx` and `entry.server.tsx`). +If you do not see these two files, expose them with the following command: + +```bash +npx react-router reveal +``` + +### Client-Side Setup + +Initialize the SDK in your `entry.client.tsx` file: + +```tsx +import * as Sentry from '@sentry/react-router'; +import { startTransition, StrictMode } from 'react'; +import { hydrateRoot } from 'react-dom/client'; +import { HydratedRouter } from 'react-router/dom'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.browserTracingIntegration()], + + tracesSampleRate: 1.0, // Capture 100% of the transactions + + // Set `tracePropagationTargets` to declare which URL(s) should have trace propagation enabled + tracePropagationTargets: [/^\//, /^https:\/\/yourserver\.io\/api/], +}); + +startTransition(() => { + hydrateRoot( + document, + + + , + ); +}); +``` + +Now, update your `app/root.tsx` file to report any unhandled errors from your global error boundary: + +```tsx +import * as Sentry from '@sentry/react-router'; + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!'; + let details = 'An unexpected error occurred.'; + let stack: string | undefined; + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error'; + details = error.status === 404 ? 'The requested page could not be found.' : error.statusText || details; + } else if (error && error instanceof Error) { + // you only want to capture non 404-errors that reach the boundary + Sentry.captureException(error); + if (import.meta.env.DEV) { + details = error.message; + stack = error.stack; + } + } + + return ( +
+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ); +} +// ... +``` + +### Server-Side Setup + +Create an `instrument.server.mjs` file in the root of your app: + +```js +import * as Sentry from '@sentry/node'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + tracesSampleRate: 1.0, // Capture 100% of the transactions +}); +``` + +In your `entry.server.tsx` file, export the `handleError` function: + +```tsx +import * as Sentry from '@sentry/node'; +import { type HandleErrorFunction } from 'react-router'; + +export const handleError: HandleErrorFunction = (error, { request }) => { + // React Router may abort some interrupted requests, report those + if (!request.signal.aborted) { + Sentry.captureException(error); + + // make sure to still log the error so you can see it + console.error(error); + } +}; +// ... rest of your server entry +``` + +### Update Scripts + +Since React Router is running in ESM mode, you need to use the `--import` command line options to load our server-side instrumentation module before the application starts. +Update the `start` and `dev` script to include the instrumentation file: + +```json +"scripts": { + "dev": "NODE_OPTIONS='--import ./instrument.server.mjs' react-router dev", + "start": "NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js", +} +``` diff --git a/packages/react-router/package.json b/packages/react-router/package.json new file mode 100644 index 000000000000..8db3107ecffb --- /dev/null +++ b/packages/react-router/package.json @@ -0,0 +1,73 @@ +{ + "name": "@sentry/react-router", + "version": "9.0.0-alpha.2", + "description": "Official Sentry SDK for React Router (Framework)", + "repository": "git://github.com/getsentry/sentry-javascript.git", + "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/react-router", + "author": "Sentry", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "files": [ + "/build" + ], + "main": "build/cjs/index.server.js", + "module": "build/esm/index.server.js", + "browser": "build/esm/index.client.js", + "types": "build/types/index.types.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./build/types/index.types.d.ts", + "browser": { + "import": "./build/esm/index.client.js", + "require": "./build/cjs/index.client.js" + }, + "node": { + "import": "./build/esm/index.server.js", + "require": "./build/cjs/index.server.js" + } + } + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@sentry/core": "9.0.0-alpha.2", + "@sentry/browser": "9.0.0-alpha.2", + "@sentry/node": "9.0.0-alpha.2" + }, + "devDependencies": { + "@react-router/node": "^7.1.5", + "react-router": "^7.1.5" + }, + "peerDependencies": { + "@react-router/node": "7.x", + "react-router": "7.x", + "react": ">=18" + }, + "scripts": { + "build": "run-p build:transpile build:types", + "build:dev": "yarn build", + "build:transpile": "rollup -c rollup.npm.config.mjs", + "build:types": "run-s build:types:core", + "build:types:core": "tsc -p tsconfig.types.json", + "build:watch": "run-p build:transpile:watch build:types:watch", + "build:dev:watch": "yarn build:watch", + "build:transpile:watch": "rollup -c rollup.npm.config.mjs --watch", + "build:types:watch": "tsc -p tsconfig.types.json --watch", + "build:tarball": "npm pack", + "circularDepCheck": "madge --circular src/index.client.ts && madge --circular src/index.server.ts && madge --circular src/index.types.ts", + "clean": "rimraf build coverage sentry-react-router-*.tgz", + "fix": "eslint . --format stylish --fix", + "lint": "eslint . --format stylish", + "test": "yarn test:unit", + "test:unit": "vitest run", + "test:watch": "vitest --watch", + "yalc:publish": "yalc publish --push --sig" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/react-router/rollup.npm.config.mjs b/packages/react-router/rollup.npm.config.mjs new file mode 100644 index 000000000000..65e6b0a0dd9a --- /dev/null +++ b/packages/react-router/rollup.npm.config.mjs @@ -0,0 +1,22 @@ +import { makeBaseNPMConfig, makeNPMConfigVariants } from '@sentry-internal/rollup-utils'; + +export default [ + ...makeNPMConfigVariants( + makeBaseNPMConfig({ + entrypoints: ['src/index.server.ts', 'src/index.client.ts'], + packageSpecificConfig: { + external: ['react-router', 'react-router-dom', 'react', 'react/jsx-runtime'], + output: { + // make it so Rollup calms down about the fact that we're combining default and named exports + exports: 'named', + }, + }, + sucrase: { + // React 19 emits a warning if we don't use the newer jsx transform: https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html + // but this breaks react 17, so we keep it at `classic` for now + jsxRuntime: 'classic', + production: true, // This is needed so that sucrase uses the production jsx runtime (ie `import { jsx } from 'react/jsx-runtime'` instead of `import { jsxDEV as _jsxDEV } from 'react/jsx-dev-runtime'`) + }, + }), + ), +]; diff --git a/packages/react-router/src/client/index.ts b/packages/react-router/src/client/index.ts new file mode 100644 index 000000000000..8e25b84c4a0c --- /dev/null +++ b/packages/react-router/src/client/index.ts @@ -0,0 +1,3 @@ +export * from '@sentry/browser'; + +export { init } from './sdk'; diff --git a/packages/react-router/src/client/sdk.ts b/packages/react-router/src/client/sdk.ts new file mode 100644 index 000000000000..688a8ba460f1 --- /dev/null +++ b/packages/react-router/src/client/sdk.ts @@ -0,0 +1,21 @@ +import type { BrowserOptions } from '@sentry/browser'; +import { init as browserInit } from '@sentry/browser'; +import type { Client } from '@sentry/core'; +import { applySdkMetadata, setTag } from '@sentry/core'; + +/** + * Initializes the client side of the React Router SDK. + */ +export function init(options: BrowserOptions): Client | undefined { + const opts = { + ...options, + }; + + applySdkMetadata(opts, 'react-router', ['react-router', 'browser']); + + const client = browserInit(opts); + + setTag('runtime', 'browser'); + + return client; +} diff --git a/packages/react-router/src/common/debug-build.ts b/packages/react-router/src/common/debug-build.ts new file mode 100644 index 000000000000..60aa50940582 --- /dev/null +++ b/packages/react-router/src/common/debug-build.ts @@ -0,0 +1,8 @@ +declare const __DEBUG_BUILD__: boolean; + +/** + * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code. + * + * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking. + */ +export const DEBUG_BUILD = __DEBUG_BUILD__; diff --git a/packages/react-router/src/index.client.ts b/packages/react-router/src/index.client.ts new file mode 100644 index 000000000000..4f1cce44fa36 --- /dev/null +++ b/packages/react-router/src/index.client.ts @@ -0,0 +1 @@ +export * from './client'; diff --git a/packages/react-router/src/index.server.ts b/packages/react-router/src/index.server.ts new file mode 100644 index 000000000000..0ce5251aa327 --- /dev/null +++ b/packages/react-router/src/index.server.ts @@ -0,0 +1 @@ +export * from './server'; diff --git a/packages/react-router/src/index.types.ts b/packages/react-router/src/index.types.ts new file mode 100644 index 000000000000..8d246451eb7d --- /dev/null +++ b/packages/react-router/src/index.types.ts @@ -0,0 +1,16 @@ +// re-define colliding type exports below + +export * from './client'; +export * from './server'; + +import type { Integration, Options, StackParser } from '@sentry/core'; +import type * as clientSdk from './client'; +import type * as serverSdk from './server'; + +/** Initializes Sentry React Router SDK */ +export declare function init(options: Options | clientSdk.BrowserOptions | serverSdk.NodeOptions): void; + +export declare const contextLinesIntegration: typeof clientSdk.contextLinesIntegration; +export declare const linkedErrorsIntegration: typeof clientSdk.linkedErrorsIntegration; +export declare const defaultStackParser: StackParser; +export declare const getDefaultIntegrations: (options: Options) => Integration[]; diff --git a/packages/react-router/src/server/index.ts b/packages/react-router/src/server/index.ts new file mode 100644 index 000000000000..6ac8d97b4241 --- /dev/null +++ b/packages/react-router/src/server/index.ts @@ -0,0 +1,3 @@ +export * from '@sentry/node'; + +export { init } from './sdk'; diff --git a/packages/react-router/src/server/sdk.ts b/packages/react-router/src/server/sdk.ts new file mode 100644 index 000000000000..bae99dee4983 --- /dev/null +++ b/packages/react-router/src/server/sdk.ts @@ -0,0 +1,20 @@ +import { applySdkMetadata, setTag } from '@sentry/core'; +import type { NodeClient, NodeOptions } from '@sentry/node'; +import { init as initNodeSdk } from '@sentry/node'; + +/** + * Initializes the server side of the React Router SDK + */ +export function init(options: NodeOptions): NodeClient | undefined { + const opts = { + ...options, + }; + + applySdkMetadata(opts, 'react-router', ['react-router', 'node']); + + const client = initNodeSdk(opts); + + setTag('runtime', 'node'); + + return client; +} diff --git a/packages/react-router/test/client/sdk.test.ts b/packages/react-router/test/client/sdk.test.ts new file mode 100644 index 000000000000..e63fe0cf51cf --- /dev/null +++ b/packages/react-router/test/client/sdk.test.ts @@ -0,0 +1,47 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import * as SentryBrowser from '@sentry/browser'; +import { SDK_VERSION, getCurrentScope, getGlobalScope, getIsolationScope } from '@sentry/browser'; + +import { init as reactRouterInit } from '../../src/client'; + +const browserInit = vi.spyOn(SentryBrowser, 'init'); + +describe('React Router client SDK', () => { + describe('init', () => { + afterEach(() => { + vi.clearAllMocks(); + + getGlobalScope().clear(); + getIsolationScope().clear(); + getCurrentScope().clear(); + getCurrentScope().setClient(undefined); + }); + + it('adds React Router metadata to the SDK options', () => { + expect(browserInit).not.toHaveBeenCalled(); + + reactRouterInit({}); + + const expectedMetadata = { + _metadata: { + sdk: { + name: 'sentry.javascript.react-router', + version: SDK_VERSION, + packages: [ + { name: 'npm:@sentry/react-router', version: SDK_VERSION }, + { name: 'npm:@sentry/browser', version: SDK_VERSION }, + ], + }, + }, + }; + + expect(browserInit).toHaveBeenCalledTimes(1); + expect(browserInit).toHaveBeenCalledWith(expect.objectContaining(expectedMetadata)); + }); + + it('returns client from init', () => { + expect(reactRouterInit({})).not.toBeUndefined(); + }); + }); +}); diff --git a/packages/react-router/test/server/sdk.test.ts b/packages/react-router/test/server/sdk.test.ts new file mode 100644 index 000000000000..06ff871d07f9 --- /dev/null +++ b/packages/react-router/test/server/sdk.test.ts @@ -0,0 +1,48 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import * as SentryNode from '@sentry/node'; + +import { SDK_VERSION } from '@sentry/node'; + +import { init as reactRouterInit } from '../../src/server/sdk'; + +const nodeInit = vi.spyOn(SentryNode, 'init'); + +describe('React Router server SDK', () => { + describe('init', () => { + afterEach(() => { + vi.clearAllMocks(); + + SentryNode.getGlobalScope().clear(); + SentryNode.getIsolationScope().clear(); + SentryNode.getCurrentScope().clear(); + SentryNode.getCurrentScope().setClient(undefined); + }); + + it('adds React Router metadata to the SDK options', () => { + expect(nodeInit).not.toHaveBeenCalled(); + + reactRouterInit({}); + + expect(nodeInit).toHaveBeenCalledTimes(1); + expect(nodeInit).toHaveBeenCalledWith( + expect.objectContaining({ + _metadata: { + sdk: { + name: 'sentry.javascript.react-router', + version: SDK_VERSION, + packages: [ + { name: 'npm:@sentry/react-router', version: SDK_VERSION }, + { name: 'npm:@sentry/node', version: SDK_VERSION }, + ], + }, + }, + }), + ); + }); + + it('returns client from init', () => { + expect(reactRouterInit({})).not.toBeUndefined(); + }); + }); +}); diff --git a/packages/react-router/test/tsconfig.json b/packages/react-router/test/tsconfig.json new file mode 100644 index 000000000000..120c3aff3716 --- /dev/null +++ b/packages/react-router/test/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.test.json", +} diff --git a/packages/react-router/tsconfig.json b/packages/react-router/tsconfig.json new file mode 100644 index 000000000000..b0eb9ecb6476 --- /dev/null +++ b/packages/react-router/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + + "include": ["src/**/*"], + + "compilerOptions": {} +} diff --git a/packages/react-router/tsconfig.test.json b/packages/react-router/tsconfig.test.json new file mode 100644 index 000000000000..b3625cd0bd3f --- /dev/null +++ b/packages/react-router/tsconfig.test.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + + "include": ["test/**/*", "vite.config.ts"], + + "compilerOptions": { + "types": ["node", "vitest/globals"], + } +} diff --git a/packages/react-router/tsconfig.types.json b/packages/react-router/tsconfig.types.json new file mode 100644 index 000000000000..65455f66bd75 --- /dev/null +++ b/packages/react-router/tsconfig.types.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "build/types" + } +} diff --git a/packages/react-router/vite.config.ts b/packages/react-router/vite.config.ts new file mode 100644 index 000000000000..1094fe0d79da --- /dev/null +++ b/packages/react-router/vite.config.ts @@ -0,0 +1,9 @@ +import baseConfig from '../../vite/vite.config'; + +export default { + ...baseConfig, + test: { + ...baseConfig.test, + environment: 'jsdom', + }, +}; diff --git a/scripts/ci-unit-tests.ts b/scripts/ci-unit-tests.ts index 13cbc6957d5c..cd53df2dfd68 100644 --- a/scripts/ci-unit-tests.ts +++ b/scripts/ci-unit-tests.ts @@ -4,6 +4,7 @@ import * as path from 'path'; const UNIT_TEST_ENV = process.env.UNIT_TEST_ENV as 'node' | 'browser' | undefined; const RUN_AFFECTED = process.argv.includes('--affected'); +const NODE_VERSION = process.env.NODE_VERSION as '18' | '20' | '22'; // These packages are tested separately in CI, so no need to run them here const DEFAULT_SKIP_PACKAGES = ['@sentry/bun', '@sentry/deno']; @@ -25,6 +26,9 @@ const BROWSER_TEST_PACKAGES = [ '@sentry/wasm', ]; +// Packages that cannot run in Node 18 +const SKIP_NODE_18_PACKAGES = ['@sentry/react-router']; + function getAllPackages(): string[] { const { workspaces }: { workspaces: string[] } = JSON.parse( fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'), @@ -55,6 +59,10 @@ function runTests(): void { }); } else if (UNIT_TEST_ENV === 'node') { BROWSER_TEST_PACKAGES.forEach(pkg => ignores.add(pkg)); + + if (NODE_VERSION === '18') { + SKIP_NODE_18_PACKAGES.forEach(pkg => ignores.add(pkg)); + } } if (RUN_AFFECTED) { diff --git a/yarn.lock b/yarn.lock index 83ff270a83f9..f1e8c2068fdb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4759,6 +4759,11 @@ semver "^7.3.5" tar "^6.1.11" +"@mjackson/node-fetch-server@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz#577c0c25d8aae9f69a97738b7b0d03d1471cdc49" + integrity sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng== + "@nestjs/common@10.4.6": version "10.4.6" resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-10.4.6.tgz#952e8fd0ceafeffcc4eaf47effd67fb395844ae0" @@ -6162,6 +6167,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@react-router/node@^7.1.5": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@react-router/node/-/node-7.1.5.tgz#fe4bdb708bb574cbf21b359d1263f6accde737bd" + integrity sha512-Ga8xFHxO2yt5TpGwV5xYx4LC3eUDmhT6jYfTbMFb6F7hBA9sLdHxNfYZCe2WEfVZ4/BM7I8989Qzq6BWilV2LA== + dependencies: + "@mjackson/node-fetch-server" "^0.2.0" + source-map-support "^0.5.21" + stream-slice "^0.1.2" + undici "^6.19.2" + "@redis/bloom@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" @@ -6582,6 +6597,11 @@ resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.22.7.tgz#604c7e33d48528a13477e7af597c4d5fca51b8bd" integrity sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ== +"@sentry/babel-plugin-component-annotate@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.1.2.tgz#5497ca5adbe775955e96c566511a0bed3ab0a3ce" + integrity sha512-5h2WXRJ6swKA0TwxHHryC8M2QyOfS9QhTAL6ElPfkEYe9HhJieXmxsDpyspbqAa26ccnCUcmwE5vL34jAjt4sQ== + "@sentry/bundler-plugin-core@2.22.6": version "2.22.6" resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.22.6.tgz#a1ea1fd43700a3ece9e7db016997e79a2782b87d" @@ -6610,6 +6630,20 @@ magic-string "0.30.8" unplugin "1.0.1" +"@sentry/bundler-plugin-core@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.1.2.tgz#29e4e686c5893b41a0d98a1bef6f0315a610bd59" + integrity sha512-lqOCvmOPzKiQenIMhmm5/mwCntwFy0dPZbVD28Dnr3MXpT1rIBg1HXjfnqQWFlMRbL9haSsWiY/TQyR/6b30YA== + dependencies: + "@babel/core" "^7.18.5" + "@sentry/babel-plugin-component-annotate" "3.1.2" + "@sentry/cli" "2.41.1" + dotenv "^16.3.1" + find-up "^5.0.0" + glob "^9.3.2" + magic-string "0.30.8" + unplugin "1.0.1" + "@sentry/cli-darwin@2.39.1": version "2.39.1" resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.39.1.tgz#75c338a53834b4cf72f57599f4c72ffb36cf0781" @@ -6699,7 +6733,7 @@ "@sentry/cli-win32-i686" "2.39.1" "@sentry/cli-win32-x64" "2.39.1" -"@sentry/cli@^2.36.1", "@sentry/cli@^2.41.1": +"@sentry/cli@2.41.1", "@sentry/cli@^2.36.1", "@sentry/cli@^2.41.1": version "2.41.1" resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.41.1.tgz#a9467ca3ff4acfcdedec1565c9ff726b93758d29" integrity sha512-0GVmDiTV7R1492wkVY4bGcfC0fSmRmQjuxaaPI8CIV9B2VP9pBVCUizi1mevXaaE4I3fM60LI+XYrKFEneuVog== @@ -6718,12 +6752,12 @@ "@sentry/cli-win32-i686" "2.41.1" "@sentry/cli-win32-x64" "2.41.1" -"@sentry/rollup-plugin@2.22.7": - version "2.22.7" - resolved "https://registry.yarnpkg.com/@sentry/rollup-plugin/-/rollup-plugin-2.22.7.tgz#994bb859437eb1e5fd34c485aaa79ba14354778f" - integrity sha512-7rgIsne8Ghb/CrfFJG5DMLcHyMqrUaw4yifq7sgYCdDyUBQ5Ox0eWVQ/autK/NYLDxDsT2r8FNttpM2hpEsUxg== +"@sentry/rollup-plugin@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sentry/rollup-plugin/-/rollup-plugin-3.1.2.tgz#d1ed4eeb558e10260bf0e7f292f9ad6baf22a98c" + integrity sha512-CVUsfQkL8REOGuyaPX7BzccZoq+wce05gQW3dG4PcXNPQeKTPRpC89NLcCDJijJa08yvC0DF0wsWRhlFWM89kQ== dependencies: - "@sentry/bundler-plugin-core" "2.22.7" + "@sentry/bundler-plugin-core" "3.1.2" unplugin "1.0.1" "@sentry/vite-plugin@2.22.6", "@sentry/vite-plugin@^2.22.6": @@ -6743,6 +6777,15 @@ unplugin "1.0.1" uuid "^9.0.0" +"@sentry/webpack-plugin@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-3.1.2.tgz#e7cf2b10b6d2fb2d6106e692469d02b6ab684bba" + integrity sha512-BTG1m+5c3PcuzjUphB7vQESo91VdT8FT+Ngzbf58OOTtiMDEJ35FtJX1ww36QE7G6vlSpdT/NyZKsY6t+mgJfg== + dependencies: + "@sentry/bundler-plugin-core" "3.1.2" + unplugin "1.0.1" + uuid "^9.0.0" + "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" @@ -12576,6 +12619,11 @@ cookie@^0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + cookie@~0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" @@ -25215,6 +25263,16 @@ react-router@6.28.1: dependencies: "@remix-run/router" "1.21.0" +react-router@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.1.5.tgz#c9e19d329d9ce2215fdae844ab6b023b911094db" + integrity sha512-8BUF+hZEU4/z/JD201yK6S+UYhsf58bzYIDq2NS1iGpwxSXDu7F+DeGSkIXMFBuHZB21FSiCzEcUb18cQNdRkA== + dependencies: + "@types/cookie" "^0.6.0" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" + turbo-stream "2.4.0" + react@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" @@ -27746,6 +27804,7 @@ stylus@0.59.0, stylus@^0.59.0: sucrase@^3.27.0, sucrase@^3.35.0, sucrase@getsentry/sucrase#es2020-polyfills: version "3.36.0" + uid fd682f6129e507c00bb4e6319cc5d6b767e36061 resolved "https://codeload.github.com/getsentry/sucrase/tar.gz/fd682f6129e507c00bb4e6319cc5d6b767e36061" dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -28879,6 +28938,11 @@ undici@^6.11.1: resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.0.tgz#4b3d3afaef984e07b48e7620c34ed8a285ed4cd4" integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== +undici@^6.19.2: + version "6.21.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" + integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== + unenv@^1.10.0, unenv@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.10.0.tgz#c3394a6c6e4cfe68d699f87af456fe3f0db39571"