diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml
index 40a44df083d7..414cd48d9245 100644
--- a/.github/workflows/canary.yml
+++ b/.github/workflows/canary.yml
@@ -78,9 +78,6 @@ jobs:
- test-application: 'nextjs-app-dir'
build-command: 'test:build-15'
label: 'nextjs-app-dir (next@15)'
- - test-application: 'nextjs-13'
- build-command: 'test:build-latest'
- label: 'nextjs-13 (latest)'
- test-application: 'nextjs-14'
build-command: 'test:build-canary'
label: 'nextjs-14 (canary)'
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore b/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore
deleted file mode 100644
index 68d4c4a9cbf2..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore
+++ /dev/null
@@ -1,43 +0,0 @@
-# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
-
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# next.js
-/.next/
-/out/
-
-# production
-/build
-
-# misc
-.DS_Store
-*.pem
-
-# debug
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-.pnpm-debug.log*
-
-# local env files
-.env*.local
-
-# vercel
-.vercel
-
-# typescript
-*.tsbuildinfo
-next-env.d.ts
-
-!*.d.ts
-
-test-results
-event-dumps
-
-.vscode
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx
deleted file mode 100644
index c8f9cee0b787..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Layout({ children }: { children: React.ReactNode }) {
- return (
-
-
{children}
-
- );
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx
deleted file mode 100644
index b8109689f986..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function PageloadTransactionPage() {
- return Pageload Transaction Page
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx
deleted file mode 100644
index f34461c2bb07..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function ParameterizedPage() {
- return Dynamic page two
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx
deleted file mode 100644
index a7d9164c8c03..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function BeepPage() {
- return Beep
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx
deleted file mode 100644
index 9fa617a22381..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function ParameterizedPage() {
- return Dynamic page one
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx
deleted file mode 100644
index 16ef0482d53b..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function StaticPage() {
- return Static page
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx
deleted file mode 100644
index 9328f85142a8..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-export const dynamic = 'force-dynamic';
-
-export default async function Page() {
- throw new Error('RSC error');
- return Hello World
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts
deleted file mode 100644
index 109dbcd55648..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-interface Window {
- recordedTransactions?: string[];
- capturedExceptionId?: string;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts
deleted file mode 100644
index 57415e4094e2..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as Sentry from '@sentry/nextjs';
-
-Sentry.init({
- environment: 'qa', // dynamic sampling bias to keep transactions
- dsn: process.env.NEXT_PUBLIC_E2E_TEST_DSN,
- tunnel: `http://localhost:3031/`, // proxy server
- tracesSampleRate: 1.0,
- dataCollection: { userInfo: true },
-});
-
-export const onRouterTransitionStart = Sentry.captureRouterTransitionStart;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts
deleted file mode 100644
index 979e0f0abedb..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as Sentry from '@sentry/nextjs';
-
-export function register() {
- if (process.env.NEXT_RUNTIME === 'nodejs' || process.env.NEXT_RUNTIME === 'edge') {
- Sentry.init({
- environment: 'qa', // dynamic sampling bias to keep transactions
- dsn: process.env.NEXT_PUBLIC_E2E_TEST_DSN,
- tunnel: `http://localhost:3031/`, // proxy server
- tracesSampleRate: 1,
- dataCollection: { userInfo: true },
- transportOptions: {
- // We are doing a lot of events at once in this test app
- bufferSize: 1000,
- },
- });
- }
-}
-
-export const onRequestError = Sentry.captureRequestError;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts
deleted file mode 100644
index b2117419c10f..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { NextResponse } from 'next/server';
-
-export function middleware() {
- // Basic middleware to ensure that the build works with edge runtime
- return NextResponse.next();
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts
deleted file mode 100644
index fd36f9494e2c..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-///
-///
-///
-
-// NOTE: This file should not be edited
-// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js b/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js
deleted file mode 100644
index a08502723262..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const { withSentryConfig } = require('@sentry/nextjs');
-
-/** @type {import('next').NextConfig} */
-const moduleExports = {
- typescript: {
- ignoreBuildErrors: true, // TODO: Remove this
- },
- experimental: {
- appDir: true,
- },
- pageExtensions: ['jsx', 'js', 'tsx', 'ts', 'page.tsx'],
-};
-
-module.exports = withSentryConfig(moduleExports, {
- silent: true,
- excludeServerRoutes: ['/api/endpoint-excluded-with-string', /\/api\/endpoint-excluded-with-regex/],
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json
deleted file mode 100644
index f6137db6843c..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "create-next-app",
- "version": "0.1.0",
- "private": true,
- "scripts": {
- "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)",
- "clean": "npx rimraf node_modules pnpm-lock.yaml .next",
- "test:prod": "TEST_ENV=production playwright test",
- "test:dev": "TEST_ENV=development playwright test",
- "test:build": "pnpm install && pnpm build",
- "test:build-latest": "pnpm install && pnpm add next@next-13 && pnpm build",
- "test:assert": "pnpm test:prod && pnpm test:dev"
- },
- "dependencies": {
- "@sentry/nextjs": "file:../../packed/sentry-nextjs-packed.tgz",
- "@types/node": "^18.19.1",
- "@types/react": "18.0.26",
- "@types/react-dom": "18.0.9",
- "next": "13.5.9",
- "react": "18.2.0",
- "react-dom": "18.2.0",
- "typescript": "~5.0.0"
- },
- "devDependencies": {
- "@playwright/test": "~1.56.0",
- "@sentry-internal/test-utils": "link:../../../test-utils"
- },
- "volta": {
- "extends": "../../package.json"
- },
- "sentryTest": {
- "optionalVariants": [
- {
- "build-command": "pnpm test:build-latest",
- "label": "nextjs-13 (latest)"
- }
- ]
- }
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx
deleted file mode 100644
index c0b3dc70edec..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-export default function ClickErrorPage() {
- return (
- {
- throw new Error('click error');
- }}
- >
- click to throw error
-
- );
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx
deleted file mode 100644
index 5f25223a9b4d..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-export default function BasicPage() {
- return (
-
- This page simply exists to test the compatibility of Next.js' `pageExtensions` option with our auto wrapping
- process. This file should be turned into a page by Next.js and our webpack loader should process it.
-
- );
-}
-
-export async function getServerSideProps() {
- throw new Error('custom page extension error');
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx
deleted file mode 100644
index 9bc737cf7a7d..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function WithServerSidePropsPage({ data }: { data: string }) {
- return WithServerSidePropsPage {data} ;
-}
-
-export async function getServerSideProps() {
- throw new Error('getServerSideProps Error');
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx
deleted file mode 100644
index 4a344176db31..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import Link from 'next/link';
-
-export default function Page() {
- return (
-
- Navigate
-
- );
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx
deleted file mode 100644
index c49ff17fd490..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Page() {
- return arrived
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx
deleted file mode 100644
index 5b0847bb89fa..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Page() {
- return pageload test page
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx
deleted file mode 100644
index 01b557bdd09f..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-const WithInitialPropsPage = ({ data }: { data: string }) => WithInitialPropsPage {data} ;
-
-WithInitialPropsPage.getInitialProps = () => {
- return { data: '[some getInitialProps data]' };
-};
-
-export default WithInitialPropsPage;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx
deleted file mode 100644
index 0379cc202436..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function WithServerSidePropsPage({ data }: { data: string }) {
- return WithServerSidePropsPage {data} ;
-}
-
-export async function getServerSideProps() {
- return { props: { data: '[some getServerSideProps data]' } };
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx
deleted file mode 100644
index d6dfa41828d1..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import App, { AppContext, AppProps } from 'next/app';
-
-const MyApp = ({ Component, pageProps }: AppProps) => {
- // @ts-ignore I don't know why TS complains here
- return ;
-};
-
-MyApp.getInitialProps = async (appContext: AppContext) => {
- // This simulates user misconfiguration. Users should always call `App.getInitialProps(appContext)`, but they don't,
- // so we have a test for this so we don't break their apps.
- if (appContext.ctx.pathname === '/misconfigured-_app-getInitialProps') {
- return {};
- }
-
- const appProps = await App.getInitialProps(appContext);
- return { ...appProps };
-};
-
-export default MyApp;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts
deleted file mode 100644
index 8a0d5f537aa6..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse) => {
- throw new Error('api route error');
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts
deleted file mode 100644
index faa9a571ca10..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse) => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts
deleted file mode 100644
index faa9a571ca10..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse) => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts
deleted file mode 100644
index 63a5176101ce..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-if (process.env.NEXT_PUBLIC_SOME_FALSE_ENV_VAR === 'enabled') {
- require('../../tests/server/utils/throw'); // Should not throw unless the hoisting in the wrapping loader is messed up!
-}
-
-const handler = async (_req: NextApiRequest, res: NextApiResponse): Promise => {
- require('@sentry/nextjs').captureException; // Should not throw unless the wrapping loader messes up cjs imports
- // @ts-expect-error
- require.context('.'); // This is a webpack utility call. Should not throw unless the wrapping loader messes it up by mangling.
- res.status(200).json({ success: true });
-};
-
-module.exports = handler;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts
deleted file mode 100644
index 6ae521fa5cb4..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-const handler = async (_req: NextApiRequest, res: NextApiResponse): Promise => {
- res.status(200).json({ success: true });
-};
-
-module.exports = handler;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts
deleted file mode 100644
index 5bb9ddca1270..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse): Promise => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts
deleted file mode 100644
index 5bb9ddca1270..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse): Promise => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts
deleted file mode 100644
index faa9a571ca10..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse) => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts
deleted file mode 100644
index faa9a571ca10..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-export default async (_req: NextApiRequest, res: NextApiResponse) => {
- res.status(200).json({ success: true });
-};
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx
deleted file mode 100644
index ddfdc73680db..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-export default function CrashedPage() {
- // Magic to naively trigger onerror to make session crashed and allow for SSR
- try {
- if (typeof window !== 'undefined' && typeof window.onerror === 'function') {
- // Lovely oldschool browsers syntax with 5 arguments <3
- // @ts-expect-error
- window.onerror(null, null, null, null, new Error('Crashed'));
- }
- } catch {
- // no-empty
- }
- return Crashed ;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx
deleted file mode 100644
index 763c27228193..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { useEffect } from 'react';
-
-export default function FetchPage() {
- useEffect(() => {
- // test that a span is created in the pageload transaction for this fetch request
- fetch('https://example.com').catch(() => {
- // no-empty
- });
- }, []);
-
- return Hello world!
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx
deleted file mode 100644
index 6a30e4f8b3a8..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function Page() {
- return healthy page
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx
deleted file mode 100644
index 3627c5088af8..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx
+++ /dev/null
@@ -1,5 +0,0 @@
-// See _app.tsx for more information why this file exists.
-
-export default function Page() {
- return faulty _app getInitialProps
;
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx
deleted file mode 100644
index a8e097c769a9..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { captureException, showReportDialog } from '@sentry/nextjs';
-
-export default function ReportDialogPage() {
- return (
- {
- const eventId = captureException(new Error('show-report-dialog-error'));
- showReportDialog({ eventId });
- }}
- >
- Open Report Dialog
-
- );
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension
deleted file mode 100644
index e8d58e47f18e..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension
+++ /dev/null
@@ -1,3 +0,0 @@
-This page simply exists to test the compatibility of Next.js' `pageExtensions` option with our auto wrapping
-process. This file should not be turned into a page by Next.js and our webpack loader also shouldn't process it.
-This page should not contain valid JavaScript.
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts
deleted file mode 100644
index 8448829443d6..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { getPlaywrightConfig } from '@sentry-internal/test-utils';
-const testEnv = process.env.TEST_ENV;
-
-if (!testEnv) {
- throw new Error('No test env defined');
-}
-
-const config = getPlaywrightConfig(
- {
- startCommand: testEnv === 'development' ? 'pnpm next dev -p 3030' : 'pnpm next start -p 3030',
- port: 3030,
- },
- {
- // This comes with the risk of tests leaking into each other but the tests run quite slow so we should parallelize
- workers: '100%',
- },
-);
-
-export default config;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs
deleted file mode 100644
index b45472a5484f..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as fs from 'fs';
-import * as path from 'path';
-import { startEventProxyServer } from '@sentry-internal/test-utils';
-
-const packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json')));
-
-startEventProxyServer({
- port: 3031,
- proxyServerName: 'nextjs-13',
- envelopeDumpPath: path.join(
- process.cwd(),
- `event-dumps/next-13-v${packageJson.dependencies.next}-${process.env.TEST_ENV}.dump`,
- ),
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts
deleted file mode 100644
index 6a8080a47aa4..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should create a pageload transaction when the `app` directory is used', async ({ page }) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/pageload-transaction' && transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/pageload-transaction`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- breadcrumbs: expect.arrayContaining([
- {
- category: 'navigation',
- data: { from: '/pageload-transaction', to: '/pageload-transaction' },
- timestamp: expect.any(Number),
- },
- ]),
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation',
- 'sentry.source': 'url',
- 'url.path': '/pageload-transaction',
- 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/pageload-transaction$/),
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.app_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/pageload-transaction$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/pageload-transaction',
- transaction_info: { source: 'url' },
- type: 'transaction',
- });
-
- expect(transaction.contexts?.trace?.data).not.toHaveProperty('url.template');
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts
deleted file mode 100644
index 082c46c467a7..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForError } from '@sentry-internal/test-utils';
-
-test('should send error for faulty click handlers', async ({ page }) => {
- const errorPromise = waitForError('nextjs-13', async errorEvent => {
- return errorEvent.exception?.values?.[0].value === 'click error';
- });
-
- await page.goto('/42/click-error');
- await page.click('#error-button');
-
- const errorEvent = await errorPromise;
-
- expect(errorEvent).toBeDefined();
-
- const exception = errorEvent?.exception?.values?.[0];
-
- expect(exception?.mechanism).toEqual({
- type: 'auto.browser.browserapierrors.addEventListener',
- handled: false,
- data: {
- handler: expect.any(String), // the handler name varies in CI and locally
- target: 'EventTarget',
- },
- });
-
- const frames = exception?.stacktrace?.frames;
- await test.step('error should have a non-url-encoded top frame in route with parameter', () => {
- if (process.env.TEST_ENV === 'development') {
- // In dev mode we want to check local source mapping
- expect(frames?.[frames.length - 1].filename).toMatch(/\/\[param\]\/click-error.tsx$/);
- } else {
- expect(frames?.[frames.length - 1].filename).toMatch(/\/\[param\]\/click-error-[a-f0-9]+\.js$/);
- }
- });
-
- await test.step('error should have `in_app`: false for nextjs internal frames', () => {
- if (process.env.TEST_ENV !== 'development') {
- expect(frames).toContainEqual(
- expect.objectContaining({
- filename: expect.stringMatching(
- /^app:\/\/\/_next\/static\/chunks\/(main-|main-app-|polyfills-|webpack-|framework-|framework\.)[0-9a-f]+\.js(:\d+)*$/,
- ),
- in_app: false,
- }),
- );
-
- expect(frames).not.toContainEqual(
- expect.objectContaining({
- filename: expect.stringMatching(
- /^app:\/\/\/_next\/static\/chunks\/(main-|main-app-|polyfills-|webpack-|framework-|framework\.)[0-9a-f]+\.js(:\d+)*$/,
- ),
- in_app: true,
- }),
- );
- }
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts
deleted file mode 100644
index 68336c3e5c4e..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-// This test verifies that a faulty configuration of `getInitialProps` in `_app` will not cause our
-// auto - wrapping / instrumentation to throw an error.
-// See `_app.tsx` for more information.
-
-test('should not fail auto-wrapping when `getInitialProps` configuration is faulty.', async ({ page }) => {
- await page.goto('/misconfigured-_app-getInitialProps');
-
- const serverErrorText = await page.$('//*[contains(text(), "Internal Server Error")]');
-
- expect(serverErrorText).toBeFalsy();
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts
deleted file mode 100644
index 56ec40117fad..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should correctly instrument `fetch` for performance tracing', async ({ page }) => {
- await page.route(/^https:\/\/example\.com\//, route => {
- return route.fulfill({
- status: 200,
- body: JSON.stringify({
- foo: 'bar',
- }),
- });
- });
-
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return transactionEvent.transaction === '/fetch' && transactionEvent.contexts?.trace?.op === 'pageload';
- });
-
- await page.goto(`/fetch`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- transaction: '/fetch',
- type: 'transaction',
- contexts: {
- trace: {
- op: 'pageload',
- },
- },
- });
-
- expect(transaction.spans).toEqual(
- expect.arrayContaining([
- expect.objectContaining({
- data: {
- 'http.method': 'GET',
- url: 'https://example.com',
- 'http.url': 'https://example.com/',
- 'url.full': 'https://example.com/',
- 'server.address': 'example.com',
- type: 'fetch',
- 'http.response_content_length': expect.any(Number),
- 'http.response.status_code': 200,
- 'sentry.op': 'http.client',
- 'sentry.origin': 'auto.http.browser',
- },
- description: 'GET https://example.com/',
- op: 'http.client',
- parent_span_id: expect.stringMatching(/[a-f0-9]{16}/),
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- status: expect.any(String),
- origin: 'auto.http.browser',
- }),
- ]),
- );
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts
deleted file mode 100644
index 2198d11da56c..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should report a navigation transaction for pages router navigations', async ({ page }) => {
- test.skip(process.env.TEST_ENV === 'development', 'Test is flakey in dev mode');
- const navigationTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/[param]/navigation-target-page' &&
- transactionEvent.contexts?.trace?.op === 'navigation'
- );
- });
-
- await page.goto('/foo/navigation-start-page');
- await page.click('#navigation-link');
-
- expect(await navigationTransactionPromise).toMatchObject({
- breadcrumbs: expect.arrayContaining([
- {
- category: 'navigation',
- data: { from: '/foo/navigation-start-page', to: '/foo/navigation-start-page' },
- timestamp: expect.any(Number),
- },
- { category: 'ui.click', message: 'body > div#__next > a#navigation-link', timestamp: expect.any(Number) },
- {
- category: 'navigation',
- data: { from: '/foo/navigation-start-page', to: '/foo/navigation-target-page' },
- timestamp: expect.any(Number),
- },
- ]),
- contexts: {
- trace: {
- data: {
- 'sentry.idle_span_finish_reason': 'idleTimeout',
- 'sentry.op': 'navigation',
- 'sentry.origin': 'auto.navigation.nextjs.pages_router_instrumentation',
- 'sentry.source': 'route',
- 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/foo\/navigation-target-page$/),
- 'url.path': '/foo/navigation-target-page',
- 'url.template': '/[param]/navigation-target-page',
- },
- op: 'navigation',
- origin: 'auto.navigation.nextjs.pages_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- platform: 'javascript',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/foo\/navigation-target-page$/),
- },
- spans: expect.arrayContaining([]),
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/[param]/navigation-target-page',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts
deleted file mode 100644
index 13d13094beac..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should create a pageload transaction when the `pages` directory is used', async ({ page }) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/[param]/pages-pageload' && transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/foo/pages-pageload`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- breadcrumbs: expect.arrayContaining([
- {
- category: 'navigation',
- data: { from: '/foo/pages-pageload', to: '/foo/pages-pageload' },
- timestamp: expect.any(Number),
- },
- ]),
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.pages_router_instrumentation',
- 'sentry.source': 'route',
- 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/foo\/pages-pageload$/),
- 'url.path': '/foo/pages-pageload',
- 'url.template': '/[param]/pages-pageload',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.pages_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/foo\/pages-pageload$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/[param]/pages-pageload',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('should create a pageload transaction with correct name when an error occurs in getServerSideProps', async ({
- page,
-}) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/[param]/error-getServerSideProps' &&
- transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- // This page returns an error status code, so we need to catch the navigation error
- await page.goto(`/something/error-getServerSideProps`, { waitUntil: 'networkidle' }).catch(() => {
- // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions
- });
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.pages_router_instrumentation',
- 'sentry.source': 'route',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.pages_router_instrumentation',
- },
- },
- transaction: '/[param]/error-getServerSideProps',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-
- // Ensure the transaction name is not '/_error'
- expect(transaction.transaction).not.toBe('/_error');
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts
deleted file mode 100644
index ba446f2e7c4e..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should create a parameterized transaction when the `app` directory is used', async ({ page }) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/parameterized/:one' && transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/parameterized/cappuccino`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation',
- 'sentry.source': 'route',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.app_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/parameterized\/cappuccino$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/parameterized/:one',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('should create a static transaction when the `app` directory is used and the route is not parameterized', async ({
- page,
-}) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/parameterized/static' && transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/parameterized/static`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation',
- 'sentry.source': 'url',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.app_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/parameterized\/static$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/parameterized/static',
- transaction_info: { source: 'url' },
- type: 'transaction',
- });
-});
-
-test('should create a partially parameterized transaction when the `app` directory is used', async ({ page }) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/parameterized/:one/beep' && transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/parameterized/cappuccino/beep`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation',
- 'sentry.source': 'route',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.app_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/parameterized\/cappuccino\/beep$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/parameterized/:one/beep',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('should create a nested parameterized transaction when the `app` directory is used', async ({ page }) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/parameterized/:one/beep/:two' &&
- transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- await page.goto(`/parameterized/cappuccino/beep/espresso`);
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- react: { version: expect.any(String) },
- trace: {
- data: {
- 'sentry.op': 'pageload',
- 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation',
- 'sentry.source': 'route',
- },
- op: 'pageload',
- origin: 'auto.pageload.nextjs.app_router_instrumentation',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- request: {
- headers: expect.any(Object),
- url: expect.stringMatching(/\/parameterized\/cappuccino\/beep\/espresso$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: '/parameterized/:one/beep/:two',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts
deleted file mode 100644
index 386d228ebf0c..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { expect, test } from '@playwright/test';
-
-test('should show a dialog', async ({ page }) => {
- // *= means "containing"
- const dialogScriptSelector = 'head > script[src*="/api/embed/error-page"]';
-
- await page.goto('/reportDialog');
-
- expect(await page.locator(dialogScriptSelector).count()).toEqual(0);
-
- await page.click('#open-report-dialog');
-
- const dialogScript = await page.waitForSelector(dialogScriptSelector, { state: 'attached' });
- const dialogScriptSrc = await (await dialogScript.getProperty('src')).jsonValue();
-
- expect(dialogScriptSrc).toMatch(/^http.*\/api\/embed\/error-page\/\?.*/);
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts
deleted file mode 100644
index 8fbe8ac8b7b5..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForSession } from '@sentry-internal/test-utils';
-
-test('should report healthy sessions', async ({ page }) => {
- test.skip(process.env.TEST_ENV === 'development', 'test is flakey in dev mode');
-
- const sessionPromise = waitForSession('nextjs-13', session => {
- return session.init === true && session.status === 'ok' && session.errors === 0;
- });
-
- await page.goto('/healthy-session-page');
-
- expect(await sessionPromise).toBeDefined();
-});
-
-test('should report crashed sessions', async ({ page }) => {
- test.skip(process.env.TEST_ENV === 'development', 'test is flakey in dev mode');
-
- const sessionPromise = waitForSession('nextjs-13', session => {
- return session.init === false && session.status === 'crashed' && session.errors === 1;
- });
-
- await page.goto('/crashed-session-page');
-
- expect(await sessionPromise).toBeDefined();
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts
deleted file mode 100644
index 570b19b3271d..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should propagate serverside `getInitialProps` trace to client', async ({ page }) => {
- const pageloadTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/[param]/withInitialProps' &&
- transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- const serverTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /[param]/withInitialProps' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- await page.goto(`/42/withInitialProps`);
-
- const pageloadTransaction = await pageloadTransactionPromise;
-
- expect(pageloadTransaction).toBeDefined();
-
- await test.step('should propagate tracing data from server to client', async () => {
- const nextDataTag = await page.waitForSelector('#__NEXT_DATA__', { state: 'attached' });
- const nextDataTagValue = JSON.parse(await nextDataTag.evaluate(tag => (tag as HTMLElement).innerText));
-
- const traceId = pageloadTransaction?.contexts?.trace?.trace_id;
-
- expect(traceId).toBeDefined();
-
- expect(nextDataTagValue.props.pageProps.data).toBe('[some getInitialProps data]');
- expect(nextDataTagValue.props.pageProps._sentryTraceData).toBeTruthy();
- expect(nextDataTagValue.props.pageProps._sentryBaggage).toBeTruthy();
-
- expect(nextDataTagValue.props.pageProps._sentryTraceData.split('-')[0]).toBe(traceId);
-
- expect(nextDataTagValue.props.pageProps._sentryBaggage.match(/sentry-trace_id=([a-f0-9]*),/)[1]).toBe(traceId);
- });
-
- await test.step('should record serverside performance', async () => {
- expect(await serverTransactionPromise).toMatchObject({
- contexts: {
- trace: {
- op: 'http.server',
- status: 'ok',
- },
- },
- transaction: 'GET /[param]/withInitialProps',
- transaction_info: {
- source: 'route',
- },
- type: 'transaction',
- request: {
- url: expect.stringMatching(/http.*\/42\/withInitialProps$/),
- },
- });
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts
deleted file mode 100644
index 765864dbf4a1..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('Should record performance for getServerSideProps', async ({ page }) => {
- const pageloadTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === '/[param]/withServerSideProps' &&
- transactionEvent.contexts?.trace?.op === 'pageload'
- );
- });
-
- const serverTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /[param]/withServerSideProps' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- await page.goto(`/1337/withServerSideProps`);
-
- const pageloadTransaction = await pageloadTransactionPromise;
-
- expect(pageloadTransaction).toBeDefined();
-
- await test.step('should propagate tracing data from server to client', async () => {
- const nextDataTag = await page.waitForSelector('#__NEXT_DATA__', { state: 'attached' });
- const nextDataTagValue = JSON.parse(await nextDataTag.evaluate(tag => (tag as HTMLElement).innerText));
-
- const traceId = pageloadTransaction?.contexts?.trace?.trace_id;
-
- expect(traceId).toBeDefined();
-
- expect(nextDataTagValue.props.pageProps.data).toBe('[some getServerSideProps data]');
- expect(nextDataTagValue.props.pageProps._sentryTraceData).toBeTruthy();
- expect(nextDataTagValue.props.pageProps._sentryBaggage).toBeTruthy();
-
- expect(nextDataTagValue.props.pageProps._sentryTraceData.split('-')[0]).toBe(traceId);
-
- expect(nextDataTagValue.props.pageProps._sentryBaggage.match(/sentry-trace_id=([a-f0-9]*),/)[1]).toBe(traceId);
- });
-
- await test.step('should record serverside performance', async () => {
- expect(await serverTransactionPromise).toMatchObject({
- contexts: {
- trace: {
- op: 'http.server',
- status: 'ok',
- },
- },
- transaction: 'GET /[param]/withServerSideProps',
- transaction_info: {
- source: 'route',
- },
- type: 'transaction',
- request: {
- url: expect.stringMatching(/http.*\/1337\/withServerSideProps$/),
- },
- });
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts
deleted file mode 100644
index 4c09bce36b4a..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should create a transaction for a CJS pages router API endpoint', async ({ page }) => {
- let received404Transaction = false;
- waitForTransaction('nextjs-13', async transactionEvent => {
- return transactionEvent.transaction === 'GET /404' || transactionEvent.transaction === 'GET /_not-found';
- }).then(() => {
- received404Transaction = true;
- });
-
- await page.goto('/page-that-doesnt-exist');
-
- await new Promise((resolve, reject) => {
- setTimeout(() => {
- if (received404Transaction) {
- reject(new Error('received 404 transaction'));
- } else {
- resolve();
- }
- }, 5_000);
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts
deleted file mode 100644
index 28cc91e9b879..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts
+++ /dev/null
@@ -1,132 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-const packageJson = require('../../package.json');
-const nextjsVersion = packageJson.dependencies.next;
-const nextjsMajor = Number(nextjsVersion.split('.')[0]);
-
-test('should create a transaction for a CJS pages router API endpoint', async ({ request }) => {
- test.skip(nextjsMajor > 13, 'Next.js does not like CJS routes after a certain point.');
-
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/cjs-api-endpoint' &&
- transactionEvent.contexts?.trace?.op === 'http.server' &&
- transactionEvent.transaction_info?.source === 'route'
- );
- });
-
- const result = (await request.get(`/api/cjs-api-endpoint`)).json();
-
- expect(await result).toMatchObject({ success: true });
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- otel: {
- resource: {
- 'service.name': 'node',
- 'service.namespace': 'sentry',
- 'service.version': expect.any(String),
- 'telemetry.sdk.language': 'nodejs',
- 'telemetry.sdk.name': 'opentelemetry',
- 'telemetry.sdk.version': expect.any(String),
- },
- },
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 200,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto.http.nextjs',
- 'sentry.sample_rate': 1,
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto.http.nextjs',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'ok',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- event_id: expect.any(String),
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/api\/cjs-api-endpoint$/),
- },
- spans: expect.arrayContaining([]),
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /api/cjs-api-endpoint',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('should not mess up require statements in CJS API endpoints', async ({ request }) => {
- test.skip(nextjsMajor > 13, 'Next.js does not like CJS routes after a certain point.');
-
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/cjs-api-endpoint-with-require' &&
- transactionEvent.contexts?.trace?.op === 'http.server' &&
- transactionEvent.transaction_info?.source === 'route'
- );
- });
-
- const result = (await request.get(`/api/cjs-api-endpoint-with-require`)).json();
-
- expect(await result).toMatchObject({ success: true });
-
- const transaction = await transactionPromise;
-
- expect(transaction).toMatchObject({
- contexts: {
- otel: {
- resource: {
- 'service.name': 'node',
- 'service.namespace': 'sentry',
- 'service.version': expect.any(String),
- 'telemetry.sdk.language': 'nodejs',
- 'telemetry.sdk.name': 'opentelemetry',
- 'telemetry.sdk.version': expect.any(String),
- },
- },
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 200,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto.http.nextjs',
- 'sentry.sample_rate': 1,
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto.http.nextjs',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'ok',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- environment: 'qa',
- event_id: expect.any(String),
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/api\/cjs-api-endpoint-with-require$/),
- },
- spans: expect.arrayContaining([]),
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /api/cjs-api-endpoint-with-require',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts
deleted file mode 100644
index 2d3854e2a2a4..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('should not apply build-time instrumentation for routes that were excluded from auto wrapping (string)', async ({
- request,
-}) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/endpoint-excluded-with-string' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- expect(await (await request.get(`/api/endpoint-excluded-with-string`)).text()).toBe('{"success":true}');
-
- const transaction = await transactionPromise;
-
- expect(transaction.contexts?.trace?.data?.['sentry.origin']).toBeDefined();
- expect(transaction.contexts?.trace?.data?.['sentry.origin']).not.toBe('auto.http.nextjs'); // This is the origin set by the build time instrumentation
-});
-
-test('should not apply build-time instrumentation for routes that were excluded from auto wrapping (regex)', async ({
- request,
-}) => {
- const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/endpoint-excluded-with-regex' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- expect(await (await request.get(`/api/endpoint-excluded-with-regex`)).text()).toBe('{"success":true}');
-
- const transaction = await transactionPromise;
-
- expect(transaction.contexts?.trace?.data?.['sentry.origin']).toBeDefined();
- expect(transaction.contexts?.trace?.data?.['sentry.origin']).not.toBe('auto.http.nextjs'); // This is the origin set by the build time instrumentation
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts
deleted file mode 100644
index bc7138e5c602..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts
+++ /dev/null
@@ -1,180 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForError, waitForTransaction } from '@sentry-internal/test-utils';
-
-test('Should report an error event for errors thrown in getServerSideProps', async ({ page }) => {
- const errorEventPromise = waitForError('nextjs-13', errorEvent => {
- return errorEvent.exception?.values?.[0].value === 'getServerSideProps Error';
- });
-
- const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /[param]/error-getServerSideProps' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- // This page returns an error status code, so we need to catch the navigation error
- await page.goto('/dogsaregreat/error-getServerSideProps').catch(() => {
- // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions
- });
-
- expect(await errorEventPromise).toMatchObject({
- contexts: {
- trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) },
- },
- event_id: expect.any(String),
- exception: {
- values: [
- {
- mechanism: { handled: false, type: 'auto.function.nextjs.wrapped' },
- type: 'Error',
- value: 'getServerSideProps Error',
- stacktrace: {
- frames: expect.arrayContaining([]),
- },
- },
- ],
- },
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/error-getServerSideProps/),
- },
- timestamp: expect.any(Number),
- transaction: 'getServerSideProps (/[param]/error-getServerSideProps)',
- });
-
- expect(await transactionEventPromise).toMatchObject({
- contexts: {
- otel: {
- resource: {
- 'service.name': 'node',
- 'service.namespace': 'sentry',
- 'service.version': expect.any(String),
- 'telemetry.sdk.language': 'nodejs',
- 'telemetry.sdk.name': 'opentelemetry',
- 'telemetry.sdk.version': expect.any(String),
- },
- },
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 500,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto',
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'internal_error',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- event_id: expect.any(String),
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/error-getServerSideProps/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /[param]/error-getServerSideProps',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('Should report an error event for errors thrown in getServerSideProps in pages with custom page extensions', async ({
- page,
-}) => {
- const errorEventPromise = waitForError('nextjs-13', errorEvent => {
- return errorEvent.exception?.values?.[0].value === 'custom page extension error';
- });
-
- const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /[param]/customPageExtension' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- // This page returns an error status code, so we need to catch the navigation error
- await page.goto('/123/customPageExtension').catch(() => {
- // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions
- });
-
- expect(await errorEventPromise).toMatchObject({
- contexts: {
- trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) },
- },
- event_id: expect.any(String),
- exception: {
- values: [
- {
- mechanism: { handled: false, type: 'auto.function.nextjs.wrapped' },
- type: 'Error',
- value: 'custom page extension error',
- stacktrace: {
- frames: expect.arrayContaining([]),
- },
- },
- ],
- },
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/customPageExtension/),
- },
- timestamp: expect.any(Number),
- transaction: 'getServerSideProps (/[param]/customPageExtension)',
- });
-
- expect(await transactionEventPromise).toMatchObject({
- contexts: {
- otel: {
- resource: {
- 'service.name': 'node',
- 'service.namespace': 'sentry',
- 'service.version': expect.any(String),
- 'telemetry.sdk.language': 'nodejs',
- 'telemetry.sdk.name': 'opentelemetry',
- 'telemetry.sdk.version': expect.any(String),
- },
- },
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 500,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto',
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'internal_error',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- event_id: expect.any(String),
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/customPageExtension/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /[param]/customPageExtension',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts
deleted file mode 100644
index 9f5ff5db8434..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForError, waitForTransaction } from '@sentry-internal/test-utils';
-
-test('Should report an error event for errors thrown in pages router api routes', async ({ request }) => {
- const errorEventPromise = waitForError('nextjs-13', errorEvent => {
- return errorEvent.exception?.values?.[0].value === 'api route error';
- });
-
- const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/[param]/failure-api-route' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- request.get('/api/foo/failure-api-route').catch(e => {
- // expected to crash
- });
-
- expect(await errorEventPromise).toMatchObject({
- contexts: {
- runtime: { name: 'node', version: expect.any(String) },
- trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) },
- },
- exception: {
- values: [
- {
- mechanism: {
- data: {
- function: 'withSentry',
- },
- handled: false,
- type: 'auto.http.nextjs.api_handler',
- },
- stacktrace: { frames: expect.arrayContaining([]) },
- type: 'Error',
- value: 'api route error',
- },
- ],
- },
- platform: 'node',
- request: {
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/api\/foo\/failure-api-route$/),
- },
- timestamp: expect.any(Number),
- transaction: 'GET /api/[param]/failure-api-route',
- });
-
- expect(await transactionEventPromise).toMatchObject({
- contexts: {
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 500,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto.http.nextjs',
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto.http.nextjs',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'internal_error',
- trace_id: (await errorEventPromise).contexts?.trace?.trace_id,
- },
- },
- platform: 'node',
- request: {
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/api\/foo\/failure-api-route$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /api/[param]/failure-api-route',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
-
-test('Should report a transaction event for a successful pages router api route', async ({ request }) => {
- const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent.transaction === 'GET /api/[param]/success-api-route' &&
- transactionEvent.contexts?.trace?.op === 'http.server'
- );
- });
-
- request.get('/api/foo/success-api-route').catch(e => {
- // we don't care about crashes
- });
-
- expect(await transactionEventPromise).toMatchObject({
- contexts: {
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- data: {
- 'http.response.status_code': 200,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto.http.nextjs',
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto.http.nextjs',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'ok',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- platform: 'node',
- request: {
- headers: expect.any(Object),
- method: 'GET',
- url: expect.stringMatching(/^http.*\/api\/foo\/success-api-route$/),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: 'GET /api/[param]/success-api-route',
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts
deleted file mode 100644
index 5412cc000694..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForError } from '@sentry-internal/test-utils';
-
-test('Should capture an error thrown in a server component', async ({ page }) => {
- const errorEventPromise = waitForError('nextjs-13', errorEvent => {
- return errorEvent.exception?.values?.[0].value === 'RSC error';
- });
-
- // This page returns an error status code, so we need to catch the navigation error
- await page.goto('/rsc-error').catch(() => {
- // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions
- });
-
- expect(await errorEventPromise).toMatchObject({
- contexts: {
- runtime: { name: 'node', version: expect.any(String) },
- trace: {
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- event_id: expect.any(String),
- exception: {
- values: [
- {
- mechanism: { handled: false, type: 'auto.function.nextjs.server_component' },
- type: 'Error',
- value: 'RSC error',
- },
- ],
- },
- platform: 'node',
- request: {
- cookies: expect.any(Object),
- headers: expect.any(Object),
- },
- timestamp: expect.any(Number),
- transaction: 'Page Server Component (/rsc-error)',
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts
deleted file mode 100644
index c9e3a6ff588c..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-test('Sends a transaction for a request to app router with URL', async ({ page }) => {
- const serverComponentTransactionPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent?.transaction === 'GET /parameterized/[one]/beep/[two]' &&
- transactionEvent.contexts?.trace?.data?.['http.target']?.startsWith('/parameterized/1337/beep/42')
- );
- });
-
- await page.goto('/parameterized/1337/beep/42');
-
- const transactionEvent = await serverComponentTransactionPromise;
-
- expect(transactionEvent.contexts?.trace).toEqual({
- data: expect.objectContaining({
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto',
- 'sentry.sample_rate': 1,
- 'sentry.source': 'route',
- 'http.method': 'GET',
- 'http.response.status_code': 200,
- 'http.route': '/parameterized/[one]/beep/[two]',
- 'http.status_code': 200,
- 'http.target': '/parameterized/1337/beep/42',
- 'otel.kind': 'SERVER',
- 'next.route': '/parameterized/[one]/beep/[two]',
- }),
- op: 'http.server',
- origin: 'auto',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'ok',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- });
-
- expect(transactionEvent.request).toMatchObject({
- url: expect.stringContaining('/parameterized/1337/beep/42'),
- });
-
- // The transaction should not contain any spans with the same name as the transaction
- // e.g. "GET /parameterized/[one]/beep/[two]"
- expect(
- transactionEvent.spans?.filter(span => {
- return span.description === transactionEvent.transaction;
- }),
- ).toHaveLength(0);
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js
deleted file mode 100644
index 0e37a4135be4..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js
+++ /dev/null
@@ -1 +0,0 @@
-throw new Error('I am throwing');
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts
deleted file mode 100644
index 798ea3409089..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { expect, test } from '@playwright/test';
-import { waitForTransaction } from '@sentry-internal/test-utils';
-
-const cases = [
- {
- name: 'wrappedNoParamURL',
- url: `/api/no-params`,
- transactionName: 'GET /api/no-params',
- },
- {
- name: 'wrappedDynamicURL',
- url: `/api/dog`,
- transactionName: 'GET /api/[param]',
- },
- {
- name: 'wrappedCatchAllURL',
- url: `/api/params/dog/bug`,
- transactionName: 'GET /api/params/[...pathParts]',
- },
-];
-
-cases.forEach(({ name, url, transactionName }) => {
- test(`Should capture transactions for routes with various shapes (${name})`, async ({ request }) => {
- const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => {
- return (
- transactionEvent.transaction === transactionName &&
- transactionEvent.contexts?.trace?.op === 'http.server' &&
- transactionEvent.transaction_info?.source === 'route'
- );
- });
-
- request.get(url).catch(() => {
- // we don't care about crashes
- });
-
- expect(await transactionEventPromise).toMatchObject({
- contexts: {
- trace: {
- data: {
- 'http.response.status_code': 200,
- 'sentry.op': 'http.server',
- 'sentry.origin': 'auto.http.nextjs',
- 'sentry.source': 'route',
- },
- op: 'http.server',
- origin: 'auto.http.nextjs',
- span_id: expect.stringMatching(/[a-f0-9]{16}/),
- status: 'ok',
- trace_id: expect.stringMatching(/[a-f0-9]{32}/),
- },
- },
- platform: 'node',
- request: {
- url: expect.stringContaining(url),
- },
- start_timestamp: expect.any(Number),
- timestamp: expect.any(Number),
- transaction: transactionName,
- transaction_info: { source: 'route' },
- type: 'transaction',
- });
- });
-});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json b/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json
deleted file mode 100644
index ef9e351d7a7b..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "compilerOptions": {
- "target": "es2018",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "strict": true,
- "forceConsistentCasingInFileNames": true,
- "noEmit": true,
- "esModuleInterop": true,
- "module": "esnext",
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "jsx": "preserve",
- "plugins": [
- {
- "name": "next"
- }
- ],
- "incremental": true
- },
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "next.config.js", ".next/types/**/*.ts"],
- "exclude": ["node_modules", "playwright.config.ts"]
-}
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json
index cb7927e9b0d8..e6cd86b8b143 100644
--- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json
+++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json
@@ -10,7 +10,6 @@
"test:build": "pnpm install && pnpm build",
"test:test-build": "pnpm ts-node --script-mode assert-build.ts",
"test:build-15": "pnpm install && pnpm add next@15 && pnpm add react@latest && pnpm add react-dom@latest && pnpm build",
- "test:build-13": "pnpm install && pnpm add next@13.5.11 && pnpm build",
"test:assert": "pnpm test:test-build && pnpm test:prod && pnpm test:dev"
},
"dependencies": {
@@ -34,10 +33,6 @@
},
"sentryTest": {
"variants": [
- {
- "build-command": "pnpm test:build-13",
- "label": "nextjs-app-dir (next@13)"
- },
{
"build-command": "pnpm test:build-15",
"label": "nextjs-app-dir (next@15)"
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts
index 8616aafadba8..7e56da7e0c86 100644
--- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts
+++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts
@@ -1,6 +1,5 @@
import { expect, test } from '@playwright/test';
import { waitForTransaction } from '@sentry-internal/test-utils';
-import { isNext13 } from './nextjsVersion';
test('Will create a transaction with spans for every server component and metadata generation functions when visiting a page', async ({
page,
@@ -18,16 +17,13 @@ test('Will create a transaction with spans for every server component and metada
expect(spanDescriptions).toContainEqual('render route (app) /nested-layout');
expect(spanDescriptions).toContainEqual('generateMetadata /(nested-layout)/nested-layout/page');
- // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following spans
- if (!isNext13) {
- expect(spanDescriptions).toContainEqual('resolve page components');
- expect(spanDescriptions).toContainEqual('build component tree');
- expect(spanDescriptions).toContainEqual('resolve root layout server component');
- expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"');
- expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"');
- expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout"');
- expect(spanDescriptions).toContainEqual('start response');
- }
+ expect(spanDescriptions).toContainEqual('resolve page components');
+ expect(spanDescriptions).toContainEqual('build component tree');
+ expect(spanDescriptions).toContainEqual('resolve root layout server component');
+ expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"');
+ expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"');
+ expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout"');
+ expect(spanDescriptions).toContainEqual('start response');
});
test('Will create a transaction with spans for every server component and metadata generation functions when visiting a dynamic page', async ({
@@ -46,15 +42,12 @@ test('Will create a transaction with spans for every server component and metada
expect(spanDescriptions).toContainEqual('render route (app) /nested-layout/[dynamic]');
expect(spanDescriptions).toContainEqual('generateMetadata /(nested-layout)/nested-layout/[dynamic]/page');
- // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following spans
- if (!isNext13) {
- expect(spanDescriptions).toContainEqual('resolve page components');
- expect(spanDescriptions).toContainEqual('build component tree');
- expect(spanDescriptions).toContainEqual('resolve root layout server component');
- expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"');
- expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"');
- expect(spanDescriptions).toContainEqual('resolve layout server component "[dynamic]"');
- expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout/[dynamic]"');
- expect(spanDescriptions).toContainEqual('start response');
- }
+ expect(spanDescriptions).toContainEqual('resolve page components');
+ expect(spanDescriptions).toContainEqual('build component tree');
+ expect(spanDescriptions).toContainEqual('resolve root layout server component');
+ expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"');
+ expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"');
+ expect(spanDescriptions).toContainEqual('resolve layout server component "[dynamic]"');
+ expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout/[dynamic]"');
+ expect(spanDescriptions).toContainEqual('start response');
});
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts
deleted file mode 100644
index 1ca2c43302e4..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-const packageJson = require('../package.json');
-const nextjsVersion = packageJson.dependencies.next;
-const nextjsMajor = Number(nextjsVersion.split('.')[0]);
-
-export const isNext13 = !isNaN(nextjsMajor) && nextjsMajor === 13;
-export const nextjsMajorVersion = nextjsMajor;
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts
index 3386324d650c..5aca8a0b1688 100644
--- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts
+++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts
@@ -1,6 +1,5 @@
import { expect, test } from '@playwright/test';
import { waitForError, waitForTransaction } from '@sentry-internal/test-utils';
-import { isNext13 } from './nextjsVersion';
test('Sends a transaction for a request to app router', async ({ page }) => {
const serverComponentTransactionPromise = waitForTransaction('nextjs-app-dir', transactionEvent => {
@@ -80,20 +79,17 @@ test('Should set a "not_found" status on a server component span when notFound()
}),
);
- // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following span
- if (!isNext13) {
- // Page server component span should have the right name and attributes
- expect(transactionEvent.spans).toContainEqual(
- expect.objectContaining({
- description: 'resolve page server component "/server-component/not-found"',
- op: 'function.nextjs',
- data: expect.objectContaining({
- 'sentry.nextjs.ssr.function.type': 'Page',
- 'sentry.nextjs.ssr.function.route': '/server-component/not-found',
- }),
+ // Page server component span should have the right name and attributes
+ expect(transactionEvent.spans).toContainEqual(
+ expect.objectContaining({
+ description: 'resolve page server component "/server-component/not-found"',
+ op: 'function.nextjs',
+ data: expect.objectContaining({
+ 'sentry.nextjs.ssr.function.type': 'Page',
+ 'sentry.nextjs.ssr.function.route': '/server-component/not-found',
}),
- );
- }
+ }),
+ );
});
test('Should capture an error and transaction for a app router page', async ({ page }) => {
@@ -122,20 +118,17 @@ test('Should capture an error and transaction for a app router page', async ({ p
}),
);
- // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following span
- if (!isNext13) {
- // The page server component span should have the right name and attributes
- expect(transactionEvent.spans).toContainEqual(
- expect.objectContaining({
- description: 'resolve page server component "/server-component/faulty"',
- op: 'function.nextjs',
- data: expect.objectContaining({
- 'sentry.nextjs.ssr.function.type': 'Page',
- 'sentry.nextjs.ssr.function.route': '/server-component/faulty',
- }),
+ // The page server component span should have the right name and attributes
+ expect(transactionEvent.spans).toContainEqual(
+ expect.objectContaining({
+ description: 'resolve page server component "/server-component/faulty"',
+ op: 'function.nextjs',
+ data: expect.objectContaining({
+ 'sentry.nextjs.ssr.function.type': 'Page',
+ 'sentry.nextjs.ssr.function.route': '/server-component/faulty',
}),
- );
- }
+ }),
+ );
expect(errorEvent.tags?.['my-isolated-tag']).toBe(true);
expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined();
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json
index f677e02dd954..897d8cfe20d1 100644
--- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json
+++ b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json
@@ -11,7 +11,6 @@
"test:build": "pnpm install && pnpm build",
"test:test-build": "pnpm ts-node --script-mode assert-build.ts",
"test:build-15": "pnpm install && pnpm add next@15 && pnpm add react@latest && pnpm add react-dom@latest && pnpm build",
- "test:build-13": "pnpm install && pnpm add next@13.5.11 && pnpm build",
"test:assert": "pnpm test:test-build && pnpm test:prod && pnpm test:dev"
},
"dependencies": {
@@ -35,10 +34,6 @@
},
"sentryTest": {
"variants": [
- {
- "build-command": "pnpm test:build-13",
- "label": "nextjs-pages-dir (next@13)"
- },
{
"build-command": "pnpm test:build-15",
"label": "nextjs-pages-dir (next@15)"
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts
index 224fbc075488..39e8f8703e88 100644
--- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts
+++ b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts
@@ -1,11 +1,9 @@
import { expect, test } from '@playwright/test';
import { waitForError } from '@sentry-internal/test-utils';
import { isDevMode } from './isDevMode';
-import { isNext13 } from './nextjsVersion';
test('lastEventId() should return the event ID after captureUnderscoreErrorException', async ({ page }) => {
test.skip(isDevMode, 'should be skipped for non-dev mode');
- test.skip(isNext13, 'should be skipped for Next.js 13');
const errorEventPromise = waitForError('nextjs-pages-dir', errorEvent => {
return errorEvent?.exception?.values?.[0]?.value === 'Test error to trigger _error.tsx page';
@@ -39,7 +37,6 @@ test('lastEventId() should return the event ID after captureUnderscoreErrorExcep
test('lastEventId() should return the event ID for component render errors', async ({ page }) => {
test.skip(isDevMode, 'should be skipped for non-dev mode');
- test.skip(isNext13, 'should be skipped for Next.js 13');
const errorEventPromise = waitForError('nextjs-pages-dir', errorEvent => {
return errorEvent?.exception?.values?.[0]?.value === 'Test render error to trigger _error.tsx page';
diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts
deleted file mode 100644
index 6d38e00ee50e..000000000000
--- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-const packageJson = require('../package.json');
-const nextjsVersion = packageJson.dependencies.next;
-const nextjsMajor = Number(nextjsVersion.split('.')[0]);
-
-export const isNext13 = !isNaN(nextjsMajor) && nextjsMajor === 13;