diff --git a/dev-packages/rollup-utils/npmHelpers.mjs b/dev-packages/rollup-utils/npmHelpers.mjs index 6085a502200f..89921fa7ffc4 100644 --- a/dev-packages/rollup-utils/npmHelpers.mjs +++ b/dev-packages/rollup-utils/npmHelpers.mjs @@ -17,6 +17,7 @@ import { makeSetSDKSourcePlugin, makeSucrasePlugin, } from './plugins/index.mjs'; +import { makePackageNodeEsm } from './plugins/make-esm-plugin.mjs'; import { mergePlugins } from './utils.mjs'; const packageDotJSON = JSON.parse(fs.readFileSync(path.resolve(process.cwd(), './package.json'), { encoding: 'utf8' })); @@ -120,7 +121,7 @@ export function makeBaseNPMConfig(options = {}) { export function makeNPMConfigVariants(baseConfig) { const variantSpecificConfigs = [ { output: { format: 'cjs', dir: path.join(baseConfig.output.dir, 'cjs') } }, - { output: { format: 'esm', dir: path.join(baseConfig.output.dir, 'esm') } }, + { output: { format: 'esm', dir: path.join(baseConfig.output.dir, 'esm'), plugins: [makePackageNodeEsm()] } }, ]; return variantSpecificConfigs.map(variant => deepMerge(baseConfig, variant)); diff --git a/dev-packages/rollup-utils/plugins/make-esm-plugin.mjs b/dev-packages/rollup-utils/plugins/make-esm-plugin.mjs new file mode 100644 index 000000000000..aa3f272ba2e0 --- /dev/null +++ b/dev-packages/rollup-utils/plugins/make-esm-plugin.mjs @@ -0,0 +1,16 @@ +/** + * Outputs a package.json file with {type: module} in the root of the output directory so that Node + * treats .js files as ESM. + */ +export function makePackageNodeEsm() { + return { + name: 'make-package-node-esm', + generateBundle() { + this.emitFile({ + type: 'asset', + fileName: 'package.json', + source: '{ "type": "module" }', + }); + }, + }; +} diff --git a/packages/node-experimental/src/integrations/tracing/prisma.ts b/packages/node-experimental/src/integrations/tracing/prisma.ts index 1f78262b9a3c..608865fb1de9 100644 --- a/packages/node-experimental/src/integrations/tracing/prisma.ts +++ b/packages/node-experimental/src/integrations/tracing/prisma.ts @@ -1,5 +1,6 @@ import { registerInstrumentations } from '@opentelemetry/instrumentation'; -import { PrismaInstrumentation } from '@prisma/instrumentation'; +// When importing CommonJs modules into an ESM module, we import the named exports directly. +import * as prismaInstrumentation from '@prisma/instrumentation'; import { defineIntegration } from '@sentry/core'; import type { IntegrationFn } from '@sentry/types'; @@ -10,7 +11,7 @@ const _prismaIntegration = (() => { registerInstrumentations({ instrumentations: [ // does not have a hook to adjust spans & add origin - new PrismaInstrumentation({}), + new prismaInstrumentation.PrismaInstrumentation({}), ], }); }, diff --git a/packages/node-experimental/src/sdk/init.ts b/packages/node-experimental/src/sdk/init.ts index 5e62a01de6cd..712e27d35963 100644 --- a/packages/node-experimental/src/sdk/init.ts +++ b/packages/node-experimental/src/sdk/init.ts @@ -39,6 +39,10 @@ import { defaultStackParser, getSentryRelease } from './api'; import { NodeClient } from './client'; import { initOtel } from './initOtel'; +function getCjsOnlyIntegrations(isCjs = typeof require !== 'undefined'): Integration[] { + return isCjs ? [nativeNodeFetchIntegration(), modulesIntegration()] : []; +} + /** Get the default integrations for the Node Experimental SDK. */ export function getDefaultIntegrations(options: Options): Integration[] { // TODO @@ -51,7 +55,6 @@ export function getDefaultIntegrations(options: Options): Integration[] { // Native Wrappers consoleIntegration(), httpIntegration(), - nativeNodeFetchIntegration(), // Global Handlers onUncaughtExceptionIntegration(), onUnhandledRejectionIntegration(), @@ -59,9 +62,8 @@ export function getDefaultIntegrations(options: Options): Integration[] { contextLinesIntegration(), localVariablesIntegration(), nodeContextIntegration(), - modulesIntegration(), httpIntegration(), - nativeNodeFetchIntegration(), + ...getCjsOnlyIntegrations(), ...(hasTracingEnabled(options) ? getAutoPerformanceIntegrations() : []), ]; }