From e8374ad421f820c142af40bddf1d845afc6a8f72 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 19 Oct 2026 16:44:01 +0100 Subject: [PATCH 1/4] feat: Export the Node bundler plugins from SDKs that wrap @sentry/node --- packages/aws-serverless/package.json | 40 +++++++++++++++++++ packages/aws-serverless/rollup.npm.config.mjs | 9 ++++- .../src/bundler-plugin/esbuild.ts | 2 + .../src/bundler-plugin/rollup.ts | 2 + .../aws-serverless/src/bundler-plugin/vite.ts | 2 + .../src/bundler-plugin/webpack.ts | 2 + .../test/bundler-plugin.test.ts | 18 +++++++++ packages/effect/package.json | 40 +++++++++++++++++++ packages/effect/rollup.npm.config.mjs | 9 ++++- packages/effect/src/bundler-plugin/esbuild.ts | 2 + packages/effect/src/bundler-plugin/rollup.ts | 2 + packages/effect/src/bundler-plugin/vite.ts | 2 + packages/effect/src/bundler-plugin/webpack.ts | 2 + packages/effect/test/bundler-plugin.test.ts | 18 +++++++++ packages/google-cloud-serverless/package.json | 40 +++++++++++++++++++ .../rollup.npm.config.mjs | 15 ++++++- .../src/bundler-plugin/esbuild.ts | 2 + .../src/bundler-plugin/rollup.ts | 2 + .../src/bundler-plugin/vite.ts | 2 + .../src/bundler-plugin/webpack.ts | 2 + .../test/bundler-plugin.test.ts | 18 +++++++++ packages/hono/package.json | 40 +++++++++++++++++++ packages/hono/rollup.npm.config.mjs | 4 ++ .../hono/src/node/bundler-plugin/esbuild.ts | 2 + .../hono/src/node/bundler-plugin/rollup.ts | 2 + packages/hono/src/node/bundler-plugin/vite.ts | 2 + .../hono/src/node/bundler-plugin/webpack.ts | 2 + .../hono/test/node/bundler-plugin.test.ts | 18 +++++++++ packages/nestjs/package.json | 40 +++++++++++++++++++ packages/nestjs/rollup.npm.config.mjs | 9 ++++- packages/nestjs/src/bundler-plugin/esbuild.ts | 2 + packages/nestjs/src/bundler-plugin/rollup.ts | 2 + packages/nestjs/src/bundler-plugin/vite.ts | 2 + packages/nestjs/src/bundler-plugin/webpack.ts | 2 + packages/nestjs/test/bundler-plugin.test.ts | 18 +++++++++ 35 files changed, 372 insertions(+), 4 deletions(-) create mode 100644 packages/aws-serverless/src/bundler-plugin/esbuild.ts create mode 100644 packages/aws-serverless/src/bundler-plugin/rollup.ts create mode 100644 packages/aws-serverless/src/bundler-plugin/vite.ts create mode 100644 packages/aws-serverless/src/bundler-plugin/webpack.ts create mode 100644 packages/aws-serverless/test/bundler-plugin.test.ts create mode 100644 packages/effect/src/bundler-plugin/esbuild.ts create mode 100644 packages/effect/src/bundler-plugin/rollup.ts create mode 100644 packages/effect/src/bundler-plugin/vite.ts create mode 100644 packages/effect/src/bundler-plugin/webpack.ts create mode 100644 packages/effect/test/bundler-plugin.test.ts create mode 100644 packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts create mode 100644 packages/google-cloud-serverless/src/bundler-plugin/rollup.ts create mode 100644 packages/google-cloud-serverless/src/bundler-plugin/vite.ts create mode 100644 packages/google-cloud-serverless/src/bundler-plugin/webpack.ts create mode 100644 packages/google-cloud-serverless/test/bundler-plugin.test.ts create mode 100644 packages/hono/src/node/bundler-plugin/esbuild.ts create mode 100644 packages/hono/src/node/bundler-plugin/rollup.ts create mode 100644 packages/hono/src/node/bundler-plugin/vite.ts create mode 100644 packages/hono/src/node/bundler-plugin/webpack.ts create mode 100644 packages/hono/test/node/bundler-plugin.test.ts create mode 100644 packages/nestjs/src/bundler-plugin/esbuild.ts create mode 100644 packages/nestjs/src/bundler-plugin/rollup.ts create mode 100644 packages/nestjs/src/bundler-plugin/vite.ts create mode 100644 packages/nestjs/src/bundler-plugin/webpack.ts create mode 100644 packages/nestjs/test/bundler-plugin.test.ts diff --git a/packages/aws-serverless/package.json b/packages/aws-serverless/package.json index 7779dc1cc698..a2e4c50db690 100644 --- a/packages/aws-serverless/package.json +++ b/packages/aws-serverless/package.json @@ -50,6 +50,46 @@ "require": { "default": "./build/npm/cjs/awslambda-auto.js" } + }, + "./vite": { + "import": { + "types": "./build/npm/types/bundler-plugin/vite.d.ts", + "default": "./build/npm/esm/bundler-plugin/vite.js" + }, + "require": { + "types": "./build/npm/types/bundler-plugin/vite.d.ts", + "default": "./build/npm/cjs/bundler-plugin/vite.js" + } + }, + "./rollup": { + "import": { + "types": "./build/npm/types/bundler-plugin/rollup.d.ts", + "default": "./build/npm/esm/bundler-plugin/rollup.js" + }, + "require": { + "types": "./build/npm/types/bundler-plugin/rollup.d.ts", + "default": "./build/npm/cjs/bundler-plugin/rollup.js" + } + }, + "./webpack": { + "import": { + "types": "./build/npm/types/bundler-plugin/webpack.d.ts", + "default": "./build/npm/esm/bundler-plugin/webpack.js" + }, + "require": { + "types": "./build/npm/types/bundler-plugin/webpack.d.ts", + "default": "./build/npm/cjs/bundler-plugin/webpack.js" + } + }, + "./esbuild": { + "import": { + "types": "./build/npm/types/bundler-plugin/esbuild.d.ts", + "default": "./build/npm/esm/bundler-plugin/esbuild.js" + }, + "require": { + "types": "./build/npm/types/bundler-plugin/esbuild.d.ts", + "default": "./build/npm/cjs/bundler-plugin/esbuild.js" + } } }, "publishConfig": { diff --git a/packages/aws-serverless/rollup.npm.config.mjs b/packages/aws-serverless/rollup.npm.config.mjs index ff398be22729..8478b6cad8ae 100644 --- a/packages/aws-serverless/rollup.npm.config.mjs +++ b/packages/aws-serverless/rollup.npm.config.mjs @@ -31,7 +31,14 @@ export default [ // TODO: `awslambda-auto.ts` is a file which the lambda layer uses to automatically init the SDK. Does it need to be // in the npm package? Is it possible that some people are using it themselves in the same way the layer uses it (in // which case removing it would be a breaking change)? Should it stay here or not? - entrypoints: ['src/index.ts', 'src/awslambda-auto.ts'], + entrypoints: [ + 'src/index.ts', + 'src/awslambda-auto.ts', + 'src/bundler-plugin/vite.ts', + 'src/bundler-plugin/rollup.ts', + 'src/bundler-plugin/webpack.ts', + 'src/bundler-plugin/esbuild.ts', + ], // packages with bundles have a different build directory structure hasBundles: true, packageSpecificConfig: { diff --git a/packages/aws-serverless/src/bundler-plugin/esbuild.ts b/packages/aws-serverless/src/bundler-plugin/esbuild.ts new file mode 100644 index 000000000000..0177c7dfd2b2 --- /dev/null +++ b/packages/aws-serverless/src/bundler-plugin/esbuild.ts @@ -0,0 +1,2 @@ +export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; +export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/aws-serverless/src/bundler-plugin/rollup.ts b/packages/aws-serverless/src/bundler-plugin/rollup.ts new file mode 100644 index 000000000000..c6ebf1e3377f --- /dev/null +++ b/packages/aws-serverless/src/bundler-plugin/rollup.ts @@ -0,0 +1,2 @@ +export { sentryRollupPlugin } from '@sentry/node/rollup'; +export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/aws-serverless/src/bundler-plugin/vite.ts b/packages/aws-serverless/src/bundler-plugin/vite.ts new file mode 100644 index 000000000000..0c926a007d6c --- /dev/null +++ b/packages/aws-serverless/src/bundler-plugin/vite.ts @@ -0,0 +1,2 @@ +export { sentryVitePlugin } from '@sentry/node/vite'; +export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/aws-serverless/src/bundler-plugin/webpack.ts b/packages/aws-serverless/src/bundler-plugin/webpack.ts new file mode 100644 index 000000000000..1bbc9a1233ea --- /dev/null +++ b/packages/aws-serverless/src/bundler-plugin/webpack.ts @@ -0,0 +1,2 @@ +export { sentryWebpackPlugin } from '@sentry/node/webpack'; +export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/aws-serverless/test/bundler-plugin.test.ts b/packages/aws-serverless/test/bundler-plugin.test.ts new file mode 100644 index 000000000000..c542208793c9 --- /dev/null +++ b/packages/aws-serverless/test/bundler-plugin.test.ts @@ -0,0 +1,18 @@ +import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; +import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; +import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; +import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; +import { describe, expect, it } from 'vitest'; +import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; +import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; +import { sentryVitePlugin } from '../src/bundler-plugin/vite'; +import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; + +describe('@sentry/aws-serverless bundler plugins', () => { + it('re-exports the @sentry/node plugins', () => { + expect(sentryVitePlugin).toBe(nodeVitePlugin); + expect(sentryRollupPlugin).toBe(nodeRollupPlugin); + expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); + expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); + }); +}); diff --git a/packages/effect/package.json b/packages/effect/package.json index 6997a2cdd1cc..a3a167787bac 100644 --- a/packages/effect/package.json +++ b/packages/effect/package.json @@ -38,6 +38,46 @@ "types": "./build/types/index.client.d.ts", "import": "./build/esm/index.client.js", "require": "./build/cjs/index.client.js" + }, + "./vite": { + "import": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/esm/bundler-plugin/vite.js" + }, + "require": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/cjs/bundler-plugin/vite.js" + } + }, + "./rollup": { + "import": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/esm/bundler-plugin/rollup.js" + }, + "require": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/cjs/bundler-plugin/rollup.js" + } + }, + "./webpack": { + "import": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/esm/bundler-plugin/webpack.js" + }, + "require": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/cjs/bundler-plugin/webpack.js" + } + }, + "./esbuild": { + "import": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/esm/bundler-plugin/esbuild.js" + }, + "require": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/cjs/bundler-plugin/esbuild.js" + } } }, "publishConfig": { diff --git a/packages/effect/rollup.npm.config.mjs b/packages/effect/rollup.npm.config.mjs index dde3327a2501..1644718dc698 100644 --- a/packages/effect/rollup.npm.config.mjs +++ b/packages/effect/rollup.npm.config.mjs @@ -1,7 +1,14 @@ import { makeBaseNPMConfig, makeNPMConfigVariants } from '@sentry-internal/rollup-utils'; const baseConfig = makeBaseNPMConfig({ - entrypoints: ['src/index.server.ts', 'src/index.client.ts'], + entrypoints: [ + 'src/index.server.ts', + 'src/index.client.ts', + 'src/bundler-plugin/vite.ts', + 'src/bundler-plugin/rollup.ts', + 'src/bundler-plugin/webpack.ts', + 'src/bundler-plugin/esbuild.ts', + ], packageSpecificConfig: { output: { preserveModulesRoot: 'src', diff --git a/packages/effect/src/bundler-plugin/esbuild.ts b/packages/effect/src/bundler-plugin/esbuild.ts new file mode 100644 index 000000000000..0177c7dfd2b2 --- /dev/null +++ b/packages/effect/src/bundler-plugin/esbuild.ts @@ -0,0 +1,2 @@ +export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; +export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/effect/src/bundler-plugin/rollup.ts b/packages/effect/src/bundler-plugin/rollup.ts new file mode 100644 index 000000000000..c6ebf1e3377f --- /dev/null +++ b/packages/effect/src/bundler-plugin/rollup.ts @@ -0,0 +1,2 @@ +export { sentryRollupPlugin } from '@sentry/node/rollup'; +export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/effect/src/bundler-plugin/vite.ts b/packages/effect/src/bundler-plugin/vite.ts new file mode 100644 index 000000000000..0c926a007d6c --- /dev/null +++ b/packages/effect/src/bundler-plugin/vite.ts @@ -0,0 +1,2 @@ +export { sentryVitePlugin } from '@sentry/node/vite'; +export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/effect/src/bundler-plugin/webpack.ts b/packages/effect/src/bundler-plugin/webpack.ts new file mode 100644 index 000000000000..1bbc9a1233ea --- /dev/null +++ b/packages/effect/src/bundler-plugin/webpack.ts @@ -0,0 +1,2 @@ +export { sentryWebpackPlugin } from '@sentry/node/webpack'; +export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/effect/test/bundler-plugin.test.ts b/packages/effect/test/bundler-plugin.test.ts new file mode 100644 index 000000000000..43473874a479 --- /dev/null +++ b/packages/effect/test/bundler-plugin.test.ts @@ -0,0 +1,18 @@ +import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; +import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; +import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; +import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; +import { describe, expect, it } from 'vitest'; +import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; +import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; +import { sentryVitePlugin } from '../src/bundler-plugin/vite'; +import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; + +describe('@sentry/effect bundler plugins', () => { + it('re-exports the @sentry/node plugins', () => { + expect(sentryVitePlugin).toBe(nodeVitePlugin); + expect(sentryRollupPlugin).toBe(nodeRollupPlugin); + expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); + expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); + }); +}); diff --git a/packages/google-cloud-serverless/package.json b/packages/google-cloud-serverless/package.json index 9372b4874209..bcec33e0bdc2 100644 --- a/packages/google-cloud-serverless/package.json +++ b/packages/google-cloud-serverless/package.json @@ -30,6 +30,46 @@ "import": { "default": "./build/import-hook.mjs" } + }, + "./vite": { + "import": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/esm/bundler-plugin/vite.js" + }, + "require": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/cjs/bundler-plugin/vite.js" + } + }, + "./rollup": { + "import": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/esm/bundler-plugin/rollup.js" + }, + "require": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/cjs/bundler-plugin/rollup.js" + } + }, + "./webpack": { + "import": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/esm/bundler-plugin/webpack.js" + }, + "require": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/cjs/bundler-plugin/webpack.js" + } + }, + "./esbuild": { + "import": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/esm/bundler-plugin/esbuild.js" + }, + "require": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/cjs/bundler-plugin/esbuild.js" + } } }, "publishConfig": { diff --git a/packages/google-cloud-serverless/rollup.npm.config.mjs b/packages/google-cloud-serverless/rollup.npm.config.mjs index 9ffe2dab5427..d48490bc729f 100644 --- a/packages/google-cloud-serverless/rollup.npm.config.mjs +++ b/packages/google-cloud-serverless/rollup.npm.config.mjs @@ -1,3 +1,16 @@ import { makeBaseNPMConfig, makeNPMConfigVariants, makeOrchestrionLoader } from '@sentry-internal/rollup-utils'; -export default [...makeNPMConfigVariants(makeBaseNPMConfig()), ...makeOrchestrionLoader('./build')]; +export default [ + ...makeNPMConfigVariants( + makeBaseNPMConfig({ + entrypoints: [ + 'src/index.ts', + 'src/bundler-plugin/vite.ts', + 'src/bundler-plugin/rollup.ts', + 'src/bundler-plugin/webpack.ts', + 'src/bundler-plugin/esbuild.ts', + ], + }), + ), + ...makeOrchestrionLoader('./build'), +]; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts b/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts new file mode 100644 index 000000000000..0177c7dfd2b2 --- /dev/null +++ b/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts @@ -0,0 +1,2 @@ +export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; +export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts b/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts new file mode 100644 index 000000000000..c6ebf1e3377f --- /dev/null +++ b/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts @@ -0,0 +1,2 @@ +export { sentryRollupPlugin } from '@sentry/node/rollup'; +export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/vite.ts b/packages/google-cloud-serverless/src/bundler-plugin/vite.ts new file mode 100644 index 000000000000..0c926a007d6c --- /dev/null +++ b/packages/google-cloud-serverless/src/bundler-plugin/vite.ts @@ -0,0 +1,2 @@ +export { sentryVitePlugin } from '@sentry/node/vite'; +export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts b/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts new file mode 100644 index 000000000000..1bbc9a1233ea --- /dev/null +++ b/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts @@ -0,0 +1,2 @@ +export { sentryWebpackPlugin } from '@sentry/node/webpack'; +export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/google-cloud-serverless/test/bundler-plugin.test.ts b/packages/google-cloud-serverless/test/bundler-plugin.test.ts new file mode 100644 index 000000000000..8149bdb428ea --- /dev/null +++ b/packages/google-cloud-serverless/test/bundler-plugin.test.ts @@ -0,0 +1,18 @@ +import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; +import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; +import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; +import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; +import { describe, expect, it } from 'vitest'; +import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; +import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; +import { sentryVitePlugin } from '../src/bundler-plugin/vite'; +import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; + +describe('@sentry/google-cloud-serverless bundler plugins', () => { + it('re-exports the @sentry/node plugins', () => { + expect(sentryVitePlugin).toBe(nodeVitePlugin); + expect(sentryRollupPlugin).toBe(nodeRollupPlugin); + expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); + expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); + }); +}); diff --git a/packages/hono/package.json b/packages/hono/package.json index ce561d1101ac..cb2b59432acc 100644 --- a/packages/hono/package.json +++ b/packages/hono/package.json @@ -66,6 +66,46 @@ "types": "./build/types/index.deno.d.ts", "default": "./build/cjs/index.deno.js" } + }, + "./node/vite": { + "import": { + "types": "./build/types/node/bundler-plugin/vite.d.ts", + "default": "./build/esm/node/bundler-plugin/vite.js" + }, + "require": { + "types": "./build/types/node/bundler-plugin/vite.d.ts", + "default": "./build/cjs/node/bundler-plugin/vite.js" + } + }, + "./node/rollup": { + "import": { + "types": "./build/types/node/bundler-plugin/rollup.d.ts", + "default": "./build/esm/node/bundler-plugin/rollup.js" + }, + "require": { + "types": "./build/types/node/bundler-plugin/rollup.d.ts", + "default": "./build/cjs/node/bundler-plugin/rollup.js" + } + }, + "./node/webpack": { + "import": { + "types": "./build/types/node/bundler-plugin/webpack.d.ts", + "default": "./build/esm/node/bundler-plugin/webpack.js" + }, + "require": { + "types": "./build/types/node/bundler-plugin/webpack.d.ts", + "default": "./build/cjs/node/bundler-plugin/webpack.js" + } + }, + "./node/esbuild": { + "import": { + "types": "./build/types/node/bundler-plugin/esbuild.d.ts", + "default": "./build/esm/node/bundler-plugin/esbuild.js" + }, + "require": { + "types": "./build/types/node/bundler-plugin/esbuild.d.ts", + "default": "./build/cjs/node/bundler-plugin/esbuild.js" + } } }, "publishConfig": { diff --git a/packages/hono/rollup.npm.config.mjs b/packages/hono/rollup.npm.config.mjs index ef795cc688db..9b4fca034811 100644 --- a/packages/hono/rollup.npm.config.mjs +++ b/packages/hono/rollup.npm.config.mjs @@ -7,6 +7,10 @@ const baseConfig = makeBaseNPMConfig({ 'src/index.node.ts', 'src/index.bun.ts', 'src/index.deno.ts', + 'src/node/bundler-plugin/vite.ts', + 'src/node/bundler-plugin/rollup.ts', + 'src/node/bundler-plugin/webpack.ts', + 'src/node/bundler-plugin/esbuild.ts', ], packageSpecificConfig: { output: { diff --git a/packages/hono/src/node/bundler-plugin/esbuild.ts b/packages/hono/src/node/bundler-plugin/esbuild.ts new file mode 100644 index 000000000000..0177c7dfd2b2 --- /dev/null +++ b/packages/hono/src/node/bundler-plugin/esbuild.ts @@ -0,0 +1,2 @@ +export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; +export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/hono/src/node/bundler-plugin/rollup.ts b/packages/hono/src/node/bundler-plugin/rollup.ts new file mode 100644 index 000000000000..c6ebf1e3377f --- /dev/null +++ b/packages/hono/src/node/bundler-plugin/rollup.ts @@ -0,0 +1,2 @@ +export { sentryRollupPlugin } from '@sentry/node/rollup'; +export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/hono/src/node/bundler-plugin/vite.ts b/packages/hono/src/node/bundler-plugin/vite.ts new file mode 100644 index 000000000000..0c926a007d6c --- /dev/null +++ b/packages/hono/src/node/bundler-plugin/vite.ts @@ -0,0 +1,2 @@ +export { sentryVitePlugin } from '@sentry/node/vite'; +export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/hono/src/node/bundler-plugin/webpack.ts b/packages/hono/src/node/bundler-plugin/webpack.ts new file mode 100644 index 000000000000..1bbc9a1233ea --- /dev/null +++ b/packages/hono/src/node/bundler-plugin/webpack.ts @@ -0,0 +1,2 @@ +export { sentryWebpackPlugin } from '@sentry/node/webpack'; +export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/hono/test/node/bundler-plugin.test.ts b/packages/hono/test/node/bundler-plugin.test.ts new file mode 100644 index 000000000000..ccf2a7fe56b3 --- /dev/null +++ b/packages/hono/test/node/bundler-plugin.test.ts @@ -0,0 +1,18 @@ +import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; +import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; +import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; +import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; +import { describe, expect, it } from 'vitest'; +import { sentryEsbuildPlugin } from '../../src/node/bundler-plugin/esbuild'; +import { sentryRollupPlugin } from '../../src/node/bundler-plugin/rollup'; +import { sentryVitePlugin } from '../../src/node/bundler-plugin/vite'; +import { sentryWebpackPlugin } from '../../src/node/bundler-plugin/webpack'; + +describe('@sentry/hono/node bundler plugins', () => { + it('re-exports the @sentry/node plugins', () => { + expect(sentryVitePlugin).toBe(nodeVitePlugin); + expect(sentryRollupPlugin).toBe(nodeRollupPlugin); + expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); + expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); + }); +}); diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index a1904cd78987..a11a7388a376 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -38,6 +38,46 @@ "types": "./setup.d.ts", "default": "./build/cjs/setup.js" } + }, + "./vite": { + "import": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/esm/bundler-plugin/vite.js" + }, + "require": { + "types": "./build/types/bundler-plugin/vite.d.ts", + "default": "./build/cjs/bundler-plugin/vite.js" + } + }, + "./rollup": { + "import": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/esm/bundler-plugin/rollup.js" + }, + "require": { + "types": "./build/types/bundler-plugin/rollup.d.ts", + "default": "./build/cjs/bundler-plugin/rollup.js" + } + }, + "./webpack": { + "import": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/esm/bundler-plugin/webpack.js" + }, + "require": { + "types": "./build/types/bundler-plugin/webpack.d.ts", + "default": "./build/cjs/bundler-plugin/webpack.js" + } + }, + "./esbuild": { + "import": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/esm/bundler-plugin/esbuild.js" + }, + "require": { + "types": "./build/types/bundler-plugin/esbuild.d.ts", + "default": "./build/cjs/bundler-plugin/esbuild.js" + } } }, "publishConfig": { diff --git a/packages/nestjs/rollup.npm.config.mjs b/packages/nestjs/rollup.npm.config.mjs index 0ce71546935c..9bfcc64fd23a 100644 --- a/packages/nestjs/rollup.npm.config.mjs +++ b/packages/nestjs/rollup.npm.config.mjs @@ -2,6 +2,13 @@ import { makeBaseNPMConfig, makeNPMConfigVariants } from '@sentry-internal/rollu export default makeNPMConfigVariants( makeBaseNPMConfig({ - entrypoints: ['src/index.ts', 'src/setup.ts'], + entrypoints: [ + 'src/index.ts', + 'src/setup.ts', + 'src/bundler-plugin/vite.ts', + 'src/bundler-plugin/rollup.ts', + 'src/bundler-plugin/webpack.ts', + 'src/bundler-plugin/esbuild.ts', + ], }), ); diff --git a/packages/nestjs/src/bundler-plugin/esbuild.ts b/packages/nestjs/src/bundler-plugin/esbuild.ts new file mode 100644 index 000000000000..0177c7dfd2b2 --- /dev/null +++ b/packages/nestjs/src/bundler-plugin/esbuild.ts @@ -0,0 +1,2 @@ +export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; +export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/nestjs/src/bundler-plugin/rollup.ts b/packages/nestjs/src/bundler-plugin/rollup.ts new file mode 100644 index 000000000000..c6ebf1e3377f --- /dev/null +++ b/packages/nestjs/src/bundler-plugin/rollup.ts @@ -0,0 +1,2 @@ +export { sentryRollupPlugin } from '@sentry/node/rollup'; +export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/nestjs/src/bundler-plugin/vite.ts b/packages/nestjs/src/bundler-plugin/vite.ts new file mode 100644 index 000000000000..0c926a007d6c --- /dev/null +++ b/packages/nestjs/src/bundler-plugin/vite.ts @@ -0,0 +1,2 @@ +export { sentryVitePlugin } from '@sentry/node/vite'; +export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/nestjs/src/bundler-plugin/webpack.ts b/packages/nestjs/src/bundler-plugin/webpack.ts new file mode 100644 index 000000000000..1bbc9a1233ea --- /dev/null +++ b/packages/nestjs/src/bundler-plugin/webpack.ts @@ -0,0 +1,2 @@ +export { sentryWebpackPlugin } from '@sentry/node/webpack'; +export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/nestjs/test/bundler-plugin.test.ts b/packages/nestjs/test/bundler-plugin.test.ts new file mode 100644 index 000000000000..ac55d538cfe1 --- /dev/null +++ b/packages/nestjs/test/bundler-plugin.test.ts @@ -0,0 +1,18 @@ +import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; +import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; +import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; +import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; +import { describe, expect, it } from 'vitest'; +import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; +import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; +import { sentryVitePlugin } from '../src/bundler-plugin/vite'; +import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; + +describe('@sentry/nestjs bundler plugins', () => { + it('re-exports the @sentry/node plugins', () => { + expect(sentryVitePlugin).toBe(nodeVitePlugin); + expect(sentryRollupPlugin).toBe(nodeRollupPlugin); + expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); + expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); + }); +}); From 026a80abfb50c6fc8e3f37529304cd8f59799b28 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Mon, 19 Oct 2026 17:00:38 +0100 Subject: [PATCH 2/4] Drop the @sentry/effect entry points --- packages/effect/package.json | 40 ------------------- packages/effect/rollup.npm.config.mjs | 9 +---- packages/effect/src/bundler-plugin/esbuild.ts | 2 - packages/effect/src/bundler-plugin/rollup.ts | 2 - packages/effect/src/bundler-plugin/vite.ts | 2 - packages/effect/src/bundler-plugin/webpack.ts | 2 - packages/effect/test/bundler-plugin.test.ts | 18 --------- 7 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 packages/effect/src/bundler-plugin/esbuild.ts delete mode 100644 packages/effect/src/bundler-plugin/rollup.ts delete mode 100644 packages/effect/src/bundler-plugin/vite.ts delete mode 100644 packages/effect/src/bundler-plugin/webpack.ts delete mode 100644 packages/effect/test/bundler-plugin.test.ts diff --git a/packages/effect/package.json b/packages/effect/package.json index a3a167787bac..6997a2cdd1cc 100644 --- a/packages/effect/package.json +++ b/packages/effect/package.json @@ -38,46 +38,6 @@ "types": "./build/types/index.client.d.ts", "import": "./build/esm/index.client.js", "require": "./build/cjs/index.client.js" - }, - "./vite": { - "import": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/esm/bundler-plugin/vite.js" - }, - "require": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/cjs/bundler-plugin/vite.js" - } - }, - "./rollup": { - "import": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/esm/bundler-plugin/rollup.js" - }, - "require": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/cjs/bundler-plugin/rollup.js" - } - }, - "./webpack": { - "import": { - "types": "./build/types/bundler-plugin/webpack.d.ts", - "default": "./build/esm/bundler-plugin/webpack.js" - }, - "require": { - "types": "./build/types/bundler-plugin/webpack.d.ts", - "default": "./build/cjs/bundler-plugin/webpack.js" - } - }, - "./esbuild": { - "import": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/esm/bundler-plugin/esbuild.js" - }, - "require": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/cjs/bundler-plugin/esbuild.js" - } } }, "publishConfig": { diff --git a/packages/effect/rollup.npm.config.mjs b/packages/effect/rollup.npm.config.mjs index 1644718dc698..dde3327a2501 100644 --- a/packages/effect/rollup.npm.config.mjs +++ b/packages/effect/rollup.npm.config.mjs @@ -1,14 +1,7 @@ import { makeBaseNPMConfig, makeNPMConfigVariants } from '@sentry-internal/rollup-utils'; const baseConfig = makeBaseNPMConfig({ - entrypoints: [ - 'src/index.server.ts', - 'src/index.client.ts', - 'src/bundler-plugin/vite.ts', - 'src/bundler-plugin/rollup.ts', - 'src/bundler-plugin/webpack.ts', - 'src/bundler-plugin/esbuild.ts', - ], + entrypoints: ['src/index.server.ts', 'src/index.client.ts'], packageSpecificConfig: { output: { preserveModulesRoot: 'src', diff --git a/packages/effect/src/bundler-plugin/esbuild.ts b/packages/effect/src/bundler-plugin/esbuild.ts deleted file mode 100644 index 0177c7dfd2b2..000000000000 --- a/packages/effect/src/bundler-plugin/esbuild.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; -export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/effect/src/bundler-plugin/rollup.ts b/packages/effect/src/bundler-plugin/rollup.ts deleted file mode 100644 index c6ebf1e3377f..000000000000 --- a/packages/effect/src/bundler-plugin/rollup.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryRollupPlugin } from '@sentry/node/rollup'; -export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/effect/src/bundler-plugin/vite.ts b/packages/effect/src/bundler-plugin/vite.ts deleted file mode 100644 index 0c926a007d6c..000000000000 --- a/packages/effect/src/bundler-plugin/vite.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryVitePlugin } from '@sentry/node/vite'; -export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/effect/src/bundler-plugin/webpack.ts b/packages/effect/src/bundler-plugin/webpack.ts deleted file mode 100644 index 1bbc9a1233ea..000000000000 --- a/packages/effect/src/bundler-plugin/webpack.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryWebpackPlugin } from '@sentry/node/webpack'; -export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/effect/test/bundler-plugin.test.ts b/packages/effect/test/bundler-plugin.test.ts deleted file mode 100644 index 43473874a479..000000000000 --- a/packages/effect/test/bundler-plugin.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; -import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; -import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; -import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; -import { describe, expect, it } from 'vitest'; -import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; -import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; -import { sentryVitePlugin } from '../src/bundler-plugin/vite'; -import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; - -describe('@sentry/effect bundler plugins', () => { - it('re-exports the @sentry/node plugins', () => { - expect(sentryVitePlugin).toBe(nodeVitePlugin); - expect(sentryRollupPlugin).toBe(nodeRollupPlugin); - expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); - expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); - }); -}); From 797974d53691eb594ee3b9515310176ca0aa48fd Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 21 Oct 2026 11:46:16 +0100 Subject: [PATCH 3/4] Keep only nestjs/webpack and aws-serverless/esbuild --- packages/aws-serverless/package.json | 30 -------------- packages/aws-serverless/rollup.npm.config.mjs | 9 +---- .../src/bundler-plugin/rollup.ts | 2 - .../aws-serverless/src/bundler-plugin/vite.ts | 2 - .../src/bundler-plugin/webpack.ts | 2 - .../test/bundler-plugin.test.ts | 13 +----- packages/google-cloud-serverless/package.json | 40 ------------------- .../rollup.npm.config.mjs | 15 +------ .../src/bundler-plugin/esbuild.ts | 2 - .../src/bundler-plugin/rollup.ts | 2 - .../src/bundler-plugin/vite.ts | 2 - .../src/bundler-plugin/webpack.ts | 2 - .../test/bundler-plugin.test.ts | 18 --------- packages/hono/package.json | 40 ------------------- packages/hono/rollup.npm.config.mjs | 4 -- .../hono/src/node/bundler-plugin/esbuild.ts | 2 - .../hono/src/node/bundler-plugin/rollup.ts | 2 - packages/hono/src/node/bundler-plugin/vite.ts | 2 - .../hono/src/node/bundler-plugin/webpack.ts | 2 - .../hono/test/node/bundler-plugin.test.ts | 18 --------- packages/nestjs/package.json | 30 -------------- packages/nestjs/rollup.npm.config.mjs | 9 +---- packages/nestjs/src/bundler-plugin/esbuild.ts | 2 - packages/nestjs/src/bundler-plugin/rollup.ts | 2 - packages/nestjs/src/bundler-plugin/vite.ts | 2 - packages/nestjs/test/bundler-plugin.test.ts | 13 +----- 26 files changed, 7 insertions(+), 260 deletions(-) delete mode 100644 packages/aws-serverless/src/bundler-plugin/rollup.ts delete mode 100644 packages/aws-serverless/src/bundler-plugin/vite.ts delete mode 100644 packages/aws-serverless/src/bundler-plugin/webpack.ts delete mode 100644 packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts delete mode 100644 packages/google-cloud-serverless/src/bundler-plugin/rollup.ts delete mode 100644 packages/google-cloud-serverless/src/bundler-plugin/vite.ts delete mode 100644 packages/google-cloud-serverless/src/bundler-plugin/webpack.ts delete mode 100644 packages/google-cloud-serverless/test/bundler-plugin.test.ts delete mode 100644 packages/hono/src/node/bundler-plugin/esbuild.ts delete mode 100644 packages/hono/src/node/bundler-plugin/rollup.ts delete mode 100644 packages/hono/src/node/bundler-plugin/vite.ts delete mode 100644 packages/hono/src/node/bundler-plugin/webpack.ts delete mode 100644 packages/hono/test/node/bundler-plugin.test.ts delete mode 100644 packages/nestjs/src/bundler-plugin/esbuild.ts delete mode 100644 packages/nestjs/src/bundler-plugin/rollup.ts delete mode 100644 packages/nestjs/src/bundler-plugin/vite.ts diff --git a/packages/aws-serverless/package.json b/packages/aws-serverless/package.json index a2e4c50db690..a42b517c25b5 100644 --- a/packages/aws-serverless/package.json +++ b/packages/aws-serverless/package.json @@ -51,36 +51,6 @@ "default": "./build/npm/cjs/awslambda-auto.js" } }, - "./vite": { - "import": { - "types": "./build/npm/types/bundler-plugin/vite.d.ts", - "default": "./build/npm/esm/bundler-plugin/vite.js" - }, - "require": { - "types": "./build/npm/types/bundler-plugin/vite.d.ts", - "default": "./build/npm/cjs/bundler-plugin/vite.js" - } - }, - "./rollup": { - "import": { - "types": "./build/npm/types/bundler-plugin/rollup.d.ts", - "default": "./build/npm/esm/bundler-plugin/rollup.js" - }, - "require": { - "types": "./build/npm/types/bundler-plugin/rollup.d.ts", - "default": "./build/npm/cjs/bundler-plugin/rollup.js" - } - }, - "./webpack": { - "import": { - "types": "./build/npm/types/bundler-plugin/webpack.d.ts", - "default": "./build/npm/esm/bundler-plugin/webpack.js" - }, - "require": { - "types": "./build/npm/types/bundler-plugin/webpack.d.ts", - "default": "./build/npm/cjs/bundler-plugin/webpack.js" - } - }, "./esbuild": { "import": { "types": "./build/npm/types/bundler-plugin/esbuild.d.ts", diff --git a/packages/aws-serverless/rollup.npm.config.mjs b/packages/aws-serverless/rollup.npm.config.mjs index 8478b6cad8ae..9c89af481558 100644 --- a/packages/aws-serverless/rollup.npm.config.mjs +++ b/packages/aws-serverless/rollup.npm.config.mjs @@ -31,14 +31,7 @@ export default [ // TODO: `awslambda-auto.ts` is a file which the lambda layer uses to automatically init the SDK. Does it need to be // in the npm package? Is it possible that some people are using it themselves in the same way the layer uses it (in // which case removing it would be a breaking change)? Should it stay here or not? - entrypoints: [ - 'src/index.ts', - 'src/awslambda-auto.ts', - 'src/bundler-plugin/vite.ts', - 'src/bundler-plugin/rollup.ts', - 'src/bundler-plugin/webpack.ts', - 'src/bundler-plugin/esbuild.ts', - ], + entrypoints: ['src/index.ts', 'src/awslambda-auto.ts', 'src/bundler-plugin/esbuild.ts'], // packages with bundles have a different build directory structure hasBundles: true, packageSpecificConfig: { diff --git a/packages/aws-serverless/src/bundler-plugin/rollup.ts b/packages/aws-serverless/src/bundler-plugin/rollup.ts deleted file mode 100644 index c6ebf1e3377f..000000000000 --- a/packages/aws-serverless/src/bundler-plugin/rollup.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryRollupPlugin } from '@sentry/node/rollup'; -export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/aws-serverless/src/bundler-plugin/vite.ts b/packages/aws-serverless/src/bundler-plugin/vite.ts deleted file mode 100644 index 0c926a007d6c..000000000000 --- a/packages/aws-serverless/src/bundler-plugin/vite.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryVitePlugin } from '@sentry/node/vite'; -export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/aws-serverless/src/bundler-plugin/webpack.ts b/packages/aws-serverless/src/bundler-plugin/webpack.ts deleted file mode 100644 index 1bbc9a1233ea..000000000000 --- a/packages/aws-serverless/src/bundler-plugin/webpack.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryWebpackPlugin } from '@sentry/node/webpack'; -export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/aws-serverless/test/bundler-plugin.test.ts b/packages/aws-serverless/test/bundler-plugin.test.ts index c542208793c9..9a190740a7ef 100644 --- a/packages/aws-serverless/test/bundler-plugin.test.ts +++ b/packages/aws-serverless/test/bundler-plugin.test.ts @@ -1,18 +1,9 @@ import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; -import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; -import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; -import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; import { describe, expect, it } from 'vitest'; import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; -import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; -import { sentryVitePlugin } from '../src/bundler-plugin/vite'; -import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; -describe('@sentry/aws-serverless bundler plugins', () => { - it('re-exports the @sentry/node plugins', () => { - expect(sentryVitePlugin).toBe(nodeVitePlugin); - expect(sentryRollupPlugin).toBe(nodeRollupPlugin); - expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); +describe('@sentry/aws-serverless bundler plugin', () => { + it('re-exports the @sentry/node esbuild plugin', () => { expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); }); }); diff --git a/packages/google-cloud-serverless/package.json b/packages/google-cloud-serverless/package.json index bcec33e0bdc2..9372b4874209 100644 --- a/packages/google-cloud-serverless/package.json +++ b/packages/google-cloud-serverless/package.json @@ -30,46 +30,6 @@ "import": { "default": "./build/import-hook.mjs" } - }, - "./vite": { - "import": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/esm/bundler-plugin/vite.js" - }, - "require": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/cjs/bundler-plugin/vite.js" - } - }, - "./rollup": { - "import": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/esm/bundler-plugin/rollup.js" - }, - "require": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/cjs/bundler-plugin/rollup.js" - } - }, - "./webpack": { - "import": { - "types": "./build/types/bundler-plugin/webpack.d.ts", - "default": "./build/esm/bundler-plugin/webpack.js" - }, - "require": { - "types": "./build/types/bundler-plugin/webpack.d.ts", - "default": "./build/cjs/bundler-plugin/webpack.js" - } - }, - "./esbuild": { - "import": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/esm/bundler-plugin/esbuild.js" - }, - "require": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/cjs/bundler-plugin/esbuild.js" - } } }, "publishConfig": { diff --git a/packages/google-cloud-serverless/rollup.npm.config.mjs b/packages/google-cloud-serverless/rollup.npm.config.mjs index d48490bc729f..9ffe2dab5427 100644 --- a/packages/google-cloud-serverless/rollup.npm.config.mjs +++ b/packages/google-cloud-serverless/rollup.npm.config.mjs @@ -1,16 +1,3 @@ import { makeBaseNPMConfig, makeNPMConfigVariants, makeOrchestrionLoader } from '@sentry-internal/rollup-utils'; -export default [ - ...makeNPMConfigVariants( - makeBaseNPMConfig({ - entrypoints: [ - 'src/index.ts', - 'src/bundler-plugin/vite.ts', - 'src/bundler-plugin/rollup.ts', - 'src/bundler-plugin/webpack.ts', - 'src/bundler-plugin/esbuild.ts', - ], - }), - ), - ...makeOrchestrionLoader('./build'), -]; +export default [...makeNPMConfigVariants(makeBaseNPMConfig()), ...makeOrchestrionLoader('./build')]; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts b/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts deleted file mode 100644 index 0177c7dfd2b2..000000000000 --- a/packages/google-cloud-serverless/src/bundler-plugin/esbuild.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; -export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts b/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts deleted file mode 100644 index c6ebf1e3377f..000000000000 --- a/packages/google-cloud-serverless/src/bundler-plugin/rollup.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryRollupPlugin } from '@sentry/node/rollup'; -export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/vite.ts b/packages/google-cloud-serverless/src/bundler-plugin/vite.ts deleted file mode 100644 index 0c926a007d6c..000000000000 --- a/packages/google-cloud-serverless/src/bundler-plugin/vite.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryVitePlugin } from '@sentry/node/vite'; -export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts b/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts deleted file mode 100644 index 1bbc9a1233ea..000000000000 --- a/packages/google-cloud-serverless/src/bundler-plugin/webpack.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryWebpackPlugin } from '@sentry/node/webpack'; -export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/google-cloud-serverless/test/bundler-plugin.test.ts b/packages/google-cloud-serverless/test/bundler-plugin.test.ts deleted file mode 100644 index 8149bdb428ea..000000000000 --- a/packages/google-cloud-serverless/test/bundler-plugin.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; -import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; -import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; -import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; -import { describe, expect, it } from 'vitest'; -import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; -import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; -import { sentryVitePlugin } from '../src/bundler-plugin/vite'; -import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; - -describe('@sentry/google-cloud-serverless bundler plugins', () => { - it('re-exports the @sentry/node plugins', () => { - expect(sentryVitePlugin).toBe(nodeVitePlugin); - expect(sentryRollupPlugin).toBe(nodeRollupPlugin); - expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); - expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); - }); -}); diff --git a/packages/hono/package.json b/packages/hono/package.json index cb2b59432acc..ce561d1101ac 100644 --- a/packages/hono/package.json +++ b/packages/hono/package.json @@ -66,46 +66,6 @@ "types": "./build/types/index.deno.d.ts", "default": "./build/cjs/index.deno.js" } - }, - "./node/vite": { - "import": { - "types": "./build/types/node/bundler-plugin/vite.d.ts", - "default": "./build/esm/node/bundler-plugin/vite.js" - }, - "require": { - "types": "./build/types/node/bundler-plugin/vite.d.ts", - "default": "./build/cjs/node/bundler-plugin/vite.js" - } - }, - "./node/rollup": { - "import": { - "types": "./build/types/node/bundler-plugin/rollup.d.ts", - "default": "./build/esm/node/bundler-plugin/rollup.js" - }, - "require": { - "types": "./build/types/node/bundler-plugin/rollup.d.ts", - "default": "./build/cjs/node/bundler-plugin/rollup.js" - } - }, - "./node/webpack": { - "import": { - "types": "./build/types/node/bundler-plugin/webpack.d.ts", - "default": "./build/esm/node/bundler-plugin/webpack.js" - }, - "require": { - "types": "./build/types/node/bundler-plugin/webpack.d.ts", - "default": "./build/cjs/node/bundler-plugin/webpack.js" - } - }, - "./node/esbuild": { - "import": { - "types": "./build/types/node/bundler-plugin/esbuild.d.ts", - "default": "./build/esm/node/bundler-plugin/esbuild.js" - }, - "require": { - "types": "./build/types/node/bundler-plugin/esbuild.d.ts", - "default": "./build/cjs/node/bundler-plugin/esbuild.js" - } } }, "publishConfig": { diff --git a/packages/hono/rollup.npm.config.mjs b/packages/hono/rollup.npm.config.mjs index 9b4fca034811..ef795cc688db 100644 --- a/packages/hono/rollup.npm.config.mjs +++ b/packages/hono/rollup.npm.config.mjs @@ -7,10 +7,6 @@ const baseConfig = makeBaseNPMConfig({ 'src/index.node.ts', 'src/index.bun.ts', 'src/index.deno.ts', - 'src/node/bundler-plugin/vite.ts', - 'src/node/bundler-plugin/rollup.ts', - 'src/node/bundler-plugin/webpack.ts', - 'src/node/bundler-plugin/esbuild.ts', ], packageSpecificConfig: { output: { diff --git a/packages/hono/src/node/bundler-plugin/esbuild.ts b/packages/hono/src/node/bundler-plugin/esbuild.ts deleted file mode 100644 index 0177c7dfd2b2..000000000000 --- a/packages/hono/src/node/bundler-plugin/esbuild.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; -export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/hono/src/node/bundler-plugin/rollup.ts b/packages/hono/src/node/bundler-plugin/rollup.ts deleted file mode 100644 index c6ebf1e3377f..000000000000 --- a/packages/hono/src/node/bundler-plugin/rollup.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryRollupPlugin } from '@sentry/node/rollup'; -export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/hono/src/node/bundler-plugin/vite.ts b/packages/hono/src/node/bundler-plugin/vite.ts deleted file mode 100644 index 0c926a007d6c..000000000000 --- a/packages/hono/src/node/bundler-plugin/vite.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryVitePlugin } from '@sentry/node/vite'; -export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/hono/src/node/bundler-plugin/webpack.ts b/packages/hono/src/node/bundler-plugin/webpack.ts deleted file mode 100644 index 1bbc9a1233ea..000000000000 --- a/packages/hono/src/node/bundler-plugin/webpack.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryWebpackPlugin } from '@sentry/node/webpack'; -export type { SentryWebpackPluginOptions } from '@sentry/node/webpack'; diff --git a/packages/hono/test/node/bundler-plugin.test.ts b/packages/hono/test/node/bundler-plugin.test.ts deleted file mode 100644 index ccf2a7fe56b3..000000000000 --- a/packages/hono/test/node/bundler-plugin.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; -import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; -import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; -import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; -import { describe, expect, it } from 'vitest'; -import { sentryEsbuildPlugin } from '../../src/node/bundler-plugin/esbuild'; -import { sentryRollupPlugin } from '../../src/node/bundler-plugin/rollup'; -import { sentryVitePlugin } from '../../src/node/bundler-plugin/vite'; -import { sentryWebpackPlugin } from '../../src/node/bundler-plugin/webpack'; - -describe('@sentry/hono/node bundler plugins', () => { - it('re-exports the @sentry/node plugins', () => { - expect(sentryVitePlugin).toBe(nodeVitePlugin); - expect(sentryRollupPlugin).toBe(nodeRollupPlugin); - expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); - expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); - }); -}); diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index a11a7388a376..5fc09bb65293 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -39,26 +39,6 @@ "default": "./build/cjs/setup.js" } }, - "./vite": { - "import": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/esm/bundler-plugin/vite.js" - }, - "require": { - "types": "./build/types/bundler-plugin/vite.d.ts", - "default": "./build/cjs/bundler-plugin/vite.js" - } - }, - "./rollup": { - "import": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/esm/bundler-plugin/rollup.js" - }, - "require": { - "types": "./build/types/bundler-plugin/rollup.d.ts", - "default": "./build/cjs/bundler-plugin/rollup.js" - } - }, "./webpack": { "import": { "types": "./build/types/bundler-plugin/webpack.d.ts", @@ -68,16 +48,6 @@ "types": "./build/types/bundler-plugin/webpack.d.ts", "default": "./build/cjs/bundler-plugin/webpack.js" } - }, - "./esbuild": { - "import": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/esm/bundler-plugin/esbuild.js" - }, - "require": { - "types": "./build/types/bundler-plugin/esbuild.d.ts", - "default": "./build/cjs/bundler-plugin/esbuild.js" - } } }, "publishConfig": { diff --git a/packages/nestjs/rollup.npm.config.mjs b/packages/nestjs/rollup.npm.config.mjs index 9bfcc64fd23a..d9bf9afbc29c 100644 --- a/packages/nestjs/rollup.npm.config.mjs +++ b/packages/nestjs/rollup.npm.config.mjs @@ -2,13 +2,6 @@ import { makeBaseNPMConfig, makeNPMConfigVariants } from '@sentry-internal/rollu export default makeNPMConfigVariants( makeBaseNPMConfig({ - entrypoints: [ - 'src/index.ts', - 'src/setup.ts', - 'src/bundler-plugin/vite.ts', - 'src/bundler-plugin/rollup.ts', - 'src/bundler-plugin/webpack.ts', - 'src/bundler-plugin/esbuild.ts', - ], + entrypoints: ['src/index.ts', 'src/setup.ts', 'src/bundler-plugin/webpack.ts'], }), ); diff --git a/packages/nestjs/src/bundler-plugin/esbuild.ts b/packages/nestjs/src/bundler-plugin/esbuild.ts deleted file mode 100644 index 0177c7dfd2b2..000000000000 --- a/packages/nestjs/src/bundler-plugin/esbuild.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryEsbuildPlugin } from '@sentry/node/esbuild'; -export type { SentryEsbuildPluginOptions } from '@sentry/node/esbuild'; diff --git a/packages/nestjs/src/bundler-plugin/rollup.ts b/packages/nestjs/src/bundler-plugin/rollup.ts deleted file mode 100644 index c6ebf1e3377f..000000000000 --- a/packages/nestjs/src/bundler-plugin/rollup.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryRollupPlugin } from '@sentry/node/rollup'; -export type { SentryRollupPluginOptions } from '@sentry/node/rollup'; diff --git a/packages/nestjs/src/bundler-plugin/vite.ts b/packages/nestjs/src/bundler-plugin/vite.ts deleted file mode 100644 index 0c926a007d6c..000000000000 --- a/packages/nestjs/src/bundler-plugin/vite.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { sentryVitePlugin } from '@sentry/node/vite'; -export type { SentryVitePluginOptions } from '@sentry/node/vite'; diff --git a/packages/nestjs/test/bundler-plugin.test.ts b/packages/nestjs/test/bundler-plugin.test.ts index ac55d538cfe1..9930558ee3b2 100644 --- a/packages/nestjs/test/bundler-plugin.test.ts +++ b/packages/nestjs/test/bundler-plugin.test.ts @@ -1,18 +1,9 @@ -import { sentryEsbuildPlugin as nodeEsbuildPlugin } from '@sentry/node/esbuild'; -import { sentryRollupPlugin as nodeRollupPlugin } from '@sentry/node/rollup'; -import { sentryVitePlugin as nodeVitePlugin } from '@sentry/node/vite'; import { sentryWebpackPlugin as nodeWebpackPlugin } from '@sentry/node/webpack'; import { describe, expect, it } from 'vitest'; -import { sentryEsbuildPlugin } from '../src/bundler-plugin/esbuild'; -import { sentryRollupPlugin } from '../src/bundler-plugin/rollup'; -import { sentryVitePlugin } from '../src/bundler-plugin/vite'; import { sentryWebpackPlugin } from '../src/bundler-plugin/webpack'; -describe('@sentry/nestjs bundler plugins', () => { - it('re-exports the @sentry/node plugins', () => { - expect(sentryVitePlugin).toBe(nodeVitePlugin); - expect(sentryRollupPlugin).toBe(nodeRollupPlugin); +describe('@sentry/nestjs bundler plugin', () => { + it('re-exports the @sentry/node webpack plugin', () => { expect(sentryWebpackPlugin).toBe(nodeWebpackPlugin); - expect(sentryEsbuildPlugin).toBe(nodeEsbuildPlugin); }); }); From 3d6c4eae02175cb7f7517f59f46a4bb83673615d Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 21 Oct 2026 11:57:20 +0100 Subject: [PATCH 4/4] test(e2e): Cover nestjs/webpack and aws-serverless/esbuild entry points --- .../aws-serverless-esbuild/assert.mjs | 6 +++ .../aws-serverless-esbuild/build.mjs | 42 +++++++++++++++++ .../aws-serverless-esbuild/package.json | 23 ++++++++++ .../pnpm-workspace.yaml | 3 ++ .../aws-serverless-esbuild/src/app.mjs | 9 ++++ .../aws-serverless-esbuild/src/entry.mjs | 45 +++++++++++++++++++ .../nestjs-webpack/nest-cli.json | 10 +++++ .../nestjs-webpack/package.json | 36 +++++++++++++++ .../nestjs-webpack/playwright.config.mjs | 7 +++ .../nestjs-webpack/pnpm-workspace.yaml | 3 ++ .../nestjs-webpack/src/app.controller.ts | 23 ++++++++++ .../nestjs-webpack/src/app.module.ts | 18 ++++++++ .../nestjs-webpack/src/app.service.ts | 15 +++++++ .../nestjs-webpack/src/instrument.ts | 8 ++++ .../nestjs-webpack/src/main.ts | 15 +++++++ .../nestjs-webpack/start-event-proxy.mjs | 6 +++ .../nestjs-webpack/tests/errors.test.ts | 24 ++++++++++ .../nestjs-webpack/tests/transactions.test.ts | 27 +++++++++++ .../nestjs-webpack/tsconfig.build.json | 4 ++ .../nestjs-webpack/tsconfig.json | 22 +++++++++ .../nestjs-webpack/webpack.config.js | 18 ++++++++ .../test-utils/src/bundler-instrumentation.ts | 6 ++- 22 files changed, 368 insertions(+), 2 deletions(-) create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/assert.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/build.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/package.json create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/pnpm-workspace.yaml create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/app.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/entry.mjs create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/nest-cli.json create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/package.json create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/playwright.config.mjs create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/pnpm-workspace.yaml create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.controller.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.module.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.service.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/src/instrument.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/src/main.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/start-event-proxy.mjs create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/errors.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/transactions.test.ts create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.build.json create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.json create mode 100644 dev-packages/e2e-tests/test-applications/nestjs-webpack/webpack.config.js diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/assert.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/assert.mjs new file mode 100644 index 000000000000..db243c44e199 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/assert.mjs @@ -0,0 +1,6 @@ +import { assertBundlerInstrumentation } from '@sentry-internal/test-utils'; + +// Drives the four built bundles (plain / plugin / plain-external / plugin-external) across the +// build-time and runtime instrumentation paths. The external variants preload the runtime hook +// of `@sentry/aws-serverless` rather than `@sentry/node`, since that is the one a Lambda user has. +assertBundlerInstrumentation('graphql', { importHook: '@sentry/aws-serverless/import' }); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/build.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/build.mjs new file mode 100644 index 000000000000..2f9176797576 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/build.mjs @@ -0,0 +1,42 @@ +// Same four-way esbuild matrix as the `node-esbuild` app, but with the plugin imported from +// `@sentry/aws-serverless/esbuild`, which is how a Lambda project that bundles with esbuild (CDK, +// SAM, Serverless Framework) would use it. See `node-esbuild/build.mjs` for the variant layout. +import { rmSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { build } from 'esbuild'; +import { sentryEsbuildPlugin } from '@sentry/aws-serverless/esbuild'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +rmSync(join(__dirname, 'dist'), { recursive: true, force: true }); + +// No auth/release/telemetry — we only care about the build-time transforms and defines. +const makeSentryPlugin = () => + sentryEsbuildPlugin({ + telemetry: false, + sourcemaps: { disable: true }, + release: { create: false, finalize: false, inject: false }, + }); + +function run(name, { external, plugins }) { + return build({ + entryPoints: [join(__dirname, 'src', 'entry.mjs')], + outfile: join(__dirname, 'dist', name, 'main.cjs'), + bundle: true, + platform: 'node', + format: 'cjs', + external: external ? ['graphql'] : [], + minify: false, + logLevel: 'silent', + plugins, + }); +} + +await run('plain', { external: false, plugins: [] }); +await run('plugin', { external: false, plugins: [makeSentryPlugin()] }); +await run('plain-external', { external: true, plugins: [] }); +await run('plugin-external', { external: true, plugins: [makeSentryPlugin()] }); + +// eslint-disable-next-line no-console +console.log('built plain + plugin (inlined) and plain-external + plugin-external with esbuild'); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/package.json b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/package.json new file mode 100644 index 000000000000..fae771717d24 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/package.json @@ -0,0 +1,23 @@ +{ + "name": "aws-serverless-esbuild", + "description": "ensure the esbuild plugin from @sentry/aws-serverless/esbuild build-time instruments a bundled graphql at runtime", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "clean": "npx rimraf node_modules dist pnpm-lock.yaml", + "test:build": "pnpm install && node ./build.mjs", + "test:assert": "node ./assert.mjs" + }, + "dependencies": { + "@sentry/aws-serverless": "file:../../packed/sentry-aws-serverless-packed.tgz" + }, + "devDependencies": { + "@sentry-internal/test-utils": "file:../../packed/sentry-internal-test-utils-packed.tgz", + "graphql": "16.9.0", + "esbuild": "0.28.2" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/pnpm-workspace.yaml b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/pnpm-workspace.yaml new file mode 100644 index 000000000000..3cdf2ff22992 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + esbuild: true +minimumReleaseAge: 0 diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/app.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/app.mjs new file mode 100644 index 000000000000..df51731aa1d2 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/app.mjs @@ -0,0 +1,9 @@ +// The workload the bundle instruments: a `graphql` query. Whether `graphql` is inlined into the +// bundle or kept external is decided per-variant by `build.mjs`. +import { buildSchema, graphql } from 'graphql'; + +const schema = buildSchema('type Query { hello: String }'); + +export async function runWorkload() { + return graphql({ schema, source: '{ hello }', rootValue: { hello: () => 'world' } }); +} diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/entry.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/entry.mjs new file mode 100644 index 000000000000..4cfbc3022a7f --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esbuild/src/entry.mjs @@ -0,0 +1,45 @@ +// Bundled entrypoint, run directly with `node` (no `--import` runtime hook). `Sentry.init` runs +// first so the instrumentation's channel subscriber is ready, then the workload is imported and run. +// Spans are collected via the `spanEnd` hook and written to the file named by +// `SENTRY_E2E_RESULT_FILE` for `assert.mjs` to read back. See `node-esbuild/src/entry.mjs`. +import { writeFileSync } from 'node:fs'; +import * as Sentry from '@sentry/aws-serverless'; + +async function main() { + Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + tracesSampleRate: 1, + // `@sentry/aws-serverless` leaves the performance integrations out by default, so the one + // that subscribes to the graphql channel has to be added for the spans to show up. + integrations: [Sentry.graphqlIntegration()], + // Isolate the build-time path: with the runtime hook off, the bundler plugin is the only possible + // injector, so a `plain` (no-plugin) build is a true negative. + enableRuntimeChannelInjection: false, + // Hermetic — never hit the network. + transport: () => ({ send: () => Promise.resolve({}), flush: () => Promise.resolve(true) }), + }); + + const spans = []; + Sentry.getClient()?.on('spanEnd', span => { + const json = Sentry.spanToJSON(span); + spans.push({ name: json.name, origin: json.attributes?.['sentry.origin'] }); + }); + + const { runWorkload } = await import('./app.mjs'); + + let result; + await Sentry.startSpan({ name: 'workload' }, async () => { + result = await runWorkload(); + }); + + await Sentry.flush(2000); + + const resultFile = process.env.SENTRY_E2E_RESULT_FILE; + if (!resultFile) { + throw new Error('SENTRY_E2E_RESULT_FILE is required (assertBundlerInstrumentation sets it).'); + } + writeFileSync(resultFile, JSON.stringify({ result, spans })); + process.exit(0); +} + +void main(); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/nest-cli.json b/dev-packages/e2e-tests/test-applications/nestjs-webpack/nest-cli.json new file mode 100644 index 000000000000..c6e6d9356b5d --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/nest-cli.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true, + "webpack": true, + "webpackConfigPath": "webpack.config.js" + } +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/package.json b/dev-packages/e2e-tests/test-applications/nestjs-webpack/package.json new file mode 100644 index 000000000000..e61a30b99e56 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/package.json @@ -0,0 +1,36 @@ +{ + "name": "nestjs-webpack", + "description": "ensure @sentry/nestjs/webpack works with the Nest CLI webpack builder", + "version": "0.0.1", + "private": true, + "scripts": { + "build": "nest build", + "start": "node dist/main", + "clean": "npx rimraf node_modules dist pnpm-lock.yaml", + "test": "playwright test", + "test:build": "pnpm install && pnpm build", + "test:assert": "pnpm test" + }, + "dependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@sentry/nestjs": "file:../../packed/sentry-nestjs-packed.tgz", + "reflect-metadata": "^0.2.0", + "rxjs": "^7.8.1" + }, + "devDependencies": { + "@playwright/test": "1.64.1", + "@sentry-internal/test-utils": "file:../../packed/sentry-internal-test-utils-packed.tgz", + "@nestjs/cli": "^11.0.0", + "@nestjs/schematics": "^11.0.0", + "@types/express": "^4.17.17", + "@types/node": "^18.19.1", + "ts-loader": "^9.4.3", + "tsconfig-paths": "^4.2.0", + "typescript": "~5.0.0" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/nestjs-webpack/playwright.config.mjs new file mode 100644 index 000000000000..31f2b913b58b --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/playwright.config.mjs @@ -0,0 +1,7 @@ +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; + +const config = getPlaywrightConfig({ + startCommand: `pnpm start`, +}); + +export default config; diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/pnpm-workspace.yaml b/dev-packages/e2e-tests/test-applications/nestjs-webpack/pnpm-workspace.yaml new file mode 100644 index 000000000000..50ece95aba3b --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +minimumReleaseAge: 0 +overrides: + 'minimatch': '10.0.1' diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.controller.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.controller.ts new file mode 100644 index 000000000000..122b769162cf --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.controller.ts @@ -0,0 +1,23 @@ +import { Controller, Get, Param } from '@nestjs/common'; +import { flush } from '@sentry/nestjs'; +import { AppService } from './app.service'; + +@Controller() +export class AppController { + constructor(private readonly appService: AppService) {} + + @Get('test-transaction') + testTransaction() { + return this.appService.testTransaction(); + } + + @Get('test-exception/:id') + async testException(@Param('id') id: string) { + return this.appService.testException(id); + } + + @Get('flush') + async flush() { + await flush(); + } +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.module.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.module.ts new file mode 100644 index 000000000000..059d719456fb --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.module.ts @@ -0,0 +1,18 @@ +import { Module } from '@nestjs/common'; +import { APP_FILTER } from '@nestjs/core'; +import { SentryGlobalFilter, SentryModule } from '@sentry/nestjs/setup'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; + +@Module({ + imports: [SentryModule.forRoot()], + controllers: [AppController], + providers: [ + AppService, + { + provide: APP_FILTER, + useClass: SentryGlobalFilter, + }, + ], +}) +export class AppModule {} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.service.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.service.ts new file mode 100644 index 000000000000..715eaf8bdac1 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/app.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@nestjs/common'; +import * as Sentry from '@sentry/nestjs'; + +@Injectable() +export class AppService { + testTransaction() { + Sentry.startSpan({ name: 'test-span' }, () => { + Sentry.startSpan({ name: 'child-span' }, () => {}); + }); + } + + testException(id: string) { + throw new Error(`This is an exception with id ${id}`); + } +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/instrument.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/instrument.ts new file mode 100644 index 000000000000..f1f4de865435 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/instrument.ts @@ -0,0 +1,8 @@ +import * as Sentry from '@sentry/nestjs'; + +Sentry.init({ + environment: 'qa', // dynamic sampling bias to keep transactions + dsn: process.env.E2E_TEST_DSN, + tunnel: `http://localhost:3031/`, // proxy server + tracesSampleRate: 1, +}); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/main.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/main.ts new file mode 100644 index 000000000000..71ce685f4d61 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/src/main.ts @@ -0,0 +1,15 @@ +// Import this first +import './instrument'; + +// Import other modules +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './app.module'; + +const PORT = 3030; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + await app.listen(PORT); +} + +bootstrap(); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/nestjs-webpack/start-event-proxy.mjs new file mode 100644 index 000000000000..6d02c6d5e3fe --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/start-event-proxy.mjs @@ -0,0 +1,6 @@ +import { startEventProxyServer } from '@sentry-internal/test-utils'; + +startEventProxyServer({ + port: 3031, + proxyServerName: 'nestjs-webpack', +}); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/errors.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/errors.test.ts new file mode 100644 index 000000000000..cd5d05c3c2bf --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/errors.test.ts @@ -0,0 +1,24 @@ +import { expect, test } from '@playwright/test'; +import { waitForError } from '@sentry-internal/test-utils'; + +const APP_NAME = 'nestjs-webpack'; + +test('Sends an exception with the release injected by the webpack plugin', async ({ baseURL }) => { + const errorEventPromise = waitForError(APP_NAME, event => { + return !event.type && event.exception?.values?.[0]?.value === 'This is an exception with id 123'; + }); + + const response = await fetch(`${baseURL}/test-exception/123`); + expect(response.status).toBe(500); + + const errorEvent = await errorEventPromise; + + expect(errorEvent.exception?.values?.[0]?.mechanism).toEqual({ + handled: false, + type: 'auto.http.nestjs.global_filter', + }); + expect(errorEvent.transaction).toEqual('GET /test-exception/:id'); + + // Set by the release injection of `sentryWebpackPlugin` from `@sentry/nestjs/webpack`. + expect(errorEvent.release).toBe('nestjs-webpack-e2e'); +}); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/transactions.test.ts b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/transactions.test.ts new file mode 100644 index 000000000000..6eb0e0b03480 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tests/transactions.test.ts @@ -0,0 +1,27 @@ +import { expect, test } from '@playwright/test'; +import { collectStreamedSpansUntilSegment } from '@sentry-internal/test-utils'; + +const APP_NAME = 'nestjs-webpack'; + +test('Sends streamed spans for an API route', async ({ baseURL }) => { + const spansPromise = collectStreamedSpansUntilSegment(APP_NAME, 'GET /test-transaction'); + + await fetch(`${baseURL}/test-transaction`); + + const spans = await spansPromise; + const segmentSpan = spans.find(span => span.is_segment)!; + + expect(segmentSpan).toMatchObject({ + name: 'GET /test-transaction', + is_segment: true, + status: 'ok', + attributes: expect.objectContaining({ + 'sentry.op': { type: 'string', value: 'http.server' }, + 'http.route': { type: 'string', value: '/test-transaction' }, + 'http.response.status_code': { type: 'integer', value: 200 }, + }), + }); + + expect(spans.find(span => span.name === 'test-span')).toMatchObject({ is_segment: false }); + expect(spans.find(span => span.name === 'child-span')).toMatchObject({ is_segment: false }); +}); diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.build.json b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.build.json new file mode 100644 index 000000000000..26c30d4eddf2 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist"] +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.json b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.json new file mode 100644 index 000000000000..cf79f029c781 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": false, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false, + "moduleResolution": "Node16" + } +} diff --git a/dev-packages/e2e-tests/test-applications/nestjs-webpack/webpack.config.js b/dev-packages/e2e-tests/test-applications/nestjs-webpack/webpack.config.js new file mode 100644 index 000000000000..f1a87303328f --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/nestjs-webpack/webpack.config.js @@ -0,0 +1,18 @@ +// Extends the Nest CLI's own webpack config (`nest build` with `"webpack": true` in nest-cli.json) +// with the Sentry plugin from `@sentry/nestjs/webpack`. The injected release name shows up on +// every event, which is how the tests know the plugin ran. No auth, upload or telemetry. +const { sentryWebpackPlugin } = require('@sentry/nestjs/webpack'); + +module.exports = function (options) { + return { + ...options, + plugins: [ + ...options.plugins, + sentryWebpackPlugin({ + telemetry: false, + sourcemaps: { disable: true }, + release: { name: 'nestjs-webpack-e2e', create: false, finalize: false }, + }), + ], + }; +}; diff --git a/dev-packages/test-utils/src/bundler-instrumentation.ts b/dev-packages/test-utils/src/bundler-instrumentation.ts index 3e14a4084f74..10ae6c813564 100644 --- a/dev-packages/test-utils/src/bundler-instrumentation.ts +++ b/dev-packages/test-utils/src/bundler-instrumentation.ts @@ -69,10 +69,12 @@ interface BundleRun { * * @param fixtureOrName A built-in fixture name (e.g. `'graphql'`) or an {@link InstrumentationFixture}. * @param options.appDir The test app directory holding `dist//main.*`. Defaults to `cwd`. + * @param options.importHook The `--import` entry that registers the runtime hook for the external + * variants. Defaults to `@sentry/node/import`; SDKs that wrap `@sentry/node` ship their own. */ export function assertBundlerInstrumentation( fixtureOrName: string | InstrumentationFixture, - { appDir = process.cwd() }: { appDir?: string } = {}, + { appDir = process.cwd(), importHook = '@sentry/node/import' }: { appDir?: string; importHook?: string } = {}, ): void { const fixture = typeof fixtureOrName === 'string' ? FIXTURES[fixtureOrName] : fixtureOrName; if (!fixture) { @@ -98,7 +100,7 @@ export function assertBundlerInstrumentation( // result to a file (not stdout) so a piped, buffered write can't be truncated by the child's exit. const runBundle = (name: string, withImport: boolean): BundleRun => { const resultFile = join(tmpdir(), `sentry-bundler-e2e-${name}-${randomUUID()}.json`); - const args = withImport ? ['--import', '@sentry/node/import', entryPath(name)] : [entryPath(name)]; + const args = withImport ? ['--import', importHook, entryPath(name)] : [entryPath(name)]; const label = `${name}${withImport ? ' (--import)' : ''}`; let stdout: string; try {