diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f8cd2ac44ac..5ee7211b5a71 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1016,6 +1016,7 @@ jobs: 'node-exports-test-app', 'node-koa', 'node-connect', + 'nuxt-3', 'vue-3', 'webpack-4', 'webpack-5' diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore b/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore new file mode 100644 index 000000000000..4a7f73a2ed0d --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc b/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc new file mode 100644 index 000000000000..070f80f05092 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/.npmrc @@ -0,0 +1,2 @@ +@sentry:registry=http://127.0.0.1:4873 +@sentry-internal:registry=http://127.0.0.1:4873 diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue new file mode 100644 index 000000000000..06f3020220dd --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/app.vue @@ -0,0 +1,13 @@ + + diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue new file mode 100644 index 000000000000..84d8a7ac05ef --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/components/ErrorButton.vue @@ -0,0 +1,9 @@ + + + diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts new file mode 100644 index 000000000000..87cff074ccd9 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/nuxt.config.ts @@ -0,0 +1,4 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + modules: ['@sentry/nuxt/module'], +}); diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/package.json b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json new file mode 100644 index 000000000000..72acea9f33b6 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/package.json @@ -0,0 +1,24 @@ +{ + "name": "nuxt-3", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "clean": "npx nuxi cleanup", + "test": "playwright test", + "test:build": "pnpm install && npx playwright install && pnpm build", + "test:assert": "pnpm test" + }, + "dependencies": { + "@sentry/nuxt": "latest || *", + "nuxt": "3.11.2" + }, + "devDependencies": { + "@nuxt/test-utils": "^3.13.1", + "@playwright/test": "^1.44.1", + "@sentry-internal/test-utils": "link:../../../test-utils" + } +} diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue new file mode 100644 index 000000000000..d4054f7e8bee --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/client-error.vue @@ -0,0 +1,10 @@ + + + + + + diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue new file mode 100644 index 000000000000..74513c5697f3 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/pages/index.vue @@ -0,0 +1,3 @@ + diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts new file mode 100644 index 000000000000..f270a5ad9b48 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/playwright.config.ts @@ -0,0 +1,16 @@ +import { fileURLToPath } from 'node:url'; +import type { ConfigOptions } from '@nuxt/test-utils/playwright'; +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; + +const nuxtConfigOptions: ConfigOptions = { + nuxt: { + rootDir: fileURLToPath(new URL('.', import.meta.url)), + }, +}; + +const config = getPlaywrightConfig({ + startCommand: `pnpm preview`, + use: { ...nuxtConfigOptions }, +}); + +export default config; diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico b/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico new file mode 100644 index 000000000000..18993ad91cfd Binary files /dev/null and b/dev-packages/e2e-tests/test-applications/nuxt-3/public/favicon.ico differ diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts new file mode 100644 index 000000000000..755a0f43e919 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/sentry.client.config.ts @@ -0,0 +1,9 @@ +import * as Sentry from '@sentry/nuxt'; + +Sentry.init({ + environment: 'qa', // dynamic sampling bias to keep transactions + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tunnel: `http://localhost:3031/`, // proxy server + tracesSampleRate: 1.0, + integrations: [Sentry.browserTracingIntegration()], +}); diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs new file mode 100644 index 000000000000..acf5943b0168 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/start-event-proxy.mjs @@ -0,0 +1,6 @@ +import { startEventProxyServer } from '@sentry-internal/test-utils'; + +startEventProxyServer({ + port: 3031, + proxyServerName: 'nuxt-3', +}); diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts new file mode 100644 index 000000000000..cd0ae9051f71 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tests/errors.client.test.ts @@ -0,0 +1,30 @@ +import { expect, test } from '@nuxt/test-utils/playwright'; +import { waitForError } from '@sentry-internal/test-utils'; + +test.describe('client-side errors', async () => { + test('captures error thrown on click', async ({ page }) => { + const errorPromise = waitForError('nuxt-3', async errorEvent => { + return errorEvent?.exception?.values?.[0]?.value === 'Error thrown from Nuxt-3 E2E test app'; + }); + + await page.goto(`/client-error`); + await page.locator('#errorBtn').click(); + + const error = await errorPromise; + + expect(error).toMatchObject({ + exception: { + values: [ + { + type: 'Error', + value: 'Error thrown from Nuxt-3 E2E test app', + mechanism: { + handled: false, + }, + }, + ], + }, + }); + expect(error.transaction).toEqual('/client-error'); + }); +}); diff --git a/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json b/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json new file mode 100644 index 000000000000..a746f2a70c28 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nuxt-3/tsconfig.json @@ -0,0 +1,4 @@ +{ + // https://nuxt.com/docs/guide/concepts/typescript + "extends": "./.nuxt/tsconfig.json" +}