@sentry/nuxt 11.0.0-beta.1 → 11.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/build/cjs/common/devMode.js +16 -0
  2. package/build/cjs/common/devMode.js.map +1 -1
  3. package/build/cjs/module.js +32 -48
  4. package/build/cjs/module.js.map +1 -1
  5. package/build/cjs/server/sdk.js +15 -0
  6. package/build/cjs/server/sdk.js.map +1 -1
  7. package/build/cjs/vite/addServerConfig.js +77 -30
  8. package/build/cjs/vite/addServerConfig.js.map +1 -1
  9. package/build/cjs/vite/middlewareConfig.js +7 -6
  10. package/build/cjs/vite/middlewareConfig.js.map +1 -1
  11. package/build/cjs/vite/orchestrion.js +2 -1
  12. package/build/cjs/vite/orchestrion.js.map +1 -1
  13. package/build/cjs/vite/utils.js +15 -9
  14. package/build/cjs/vite/utils.js.map +1 -1
  15. package/build/esm/common/devMode.js +12 -1
  16. package/build/esm/common/devMode.js.map +1 -1
  17. package/build/esm/module.js +34 -50
  18. package/build/esm/module.js.map +1 -1
  19. package/build/esm/package.json +1 -1
  20. package/build/esm/server/sdk.js +17 -2
  21. package/build/esm/server/sdk.js.map +1 -1
  22. package/build/esm/vite/addServerConfig.js +78 -31
  23. package/build/esm/vite/addServerConfig.js.map +1 -1
  24. package/build/esm/vite/middlewareConfig.js +7 -6
  25. package/build/esm/vite/middlewareConfig.js.map +1 -1
  26. package/build/esm/vite/orchestrion.js +2 -1
  27. package/build/esm/vite/orchestrion.js.map +1 -1
  28. package/build/esm/vite/utils.js +15 -9
  29. package/build/esm/vite/utils.js.map +1 -1
  30. package/build/module/common/devMode.d.ts +12 -2
  31. package/build/module/common/types.d.ts +7 -0
  32. package/build/module/module.json +1 -1
  33. package/build/module/module.mjs +129 -89
  34. package/build/module/runtime/utils/instrumentDatabase.js +3 -2
  35. package/build/module/vite/addServerConfig.d.ts +10 -8
  36. package/build/module/vite/middlewareConfig.d.ts +2 -1
  37. package/build/module/vite/utils.d.ts +11 -3
  38. package/build/types/common/devMode.d.ts +12 -2
  39. package/build/types/common/devMode.d.ts.map +1 -1
  40. package/build/types/common/types.d.ts +7 -0
  41. package/build/types/common/types.d.ts.map +1 -1
  42. package/build/types/module.d.ts.map +1 -1
  43. package/build/types/runtime/utils/instrumentDatabase.d.ts.map +1 -1
  44. package/build/types/server/sdk.d.ts.map +1 -1
  45. package/build/types/vite/addServerConfig.d.ts +10 -8
  46. package/build/types/vite/addServerConfig.d.ts.map +1 -1
  47. package/build/types/vite/middlewareConfig.d.ts +2 -1
  48. package/build/types/vite/middlewareConfig.d.ts.map +1 -1
  49. package/build/types/vite/orchestrion.d.ts.map +1 -1
  50. package/build/types/vite/utils.d.ts +11 -3
  51. package/build/types/vite/utils.d.ts.map +1 -1
  52. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"middlewareConfig.js","sources":["../../../src/vite/middlewareConfig.ts"],"sourcesContent":["import { addServerImports, createResolver } from '@nuxt/kit';\nimport type { Nitro } from 'nitropack/types';\nimport * as path from 'path';\nimport type { InputPluginOption } from 'rollup';\n\n/**\n * Adds a server import for the middleware instrumentation.\n */\nexport function addMiddlewareImports(): void {\n addServerImports([\n {\n name: 'wrapMiddlewareHandlerWithSentry',\n from: createResolver(import.meta.url).resolve('./runtime/hooks/wrapMiddlewareHandler'),\n },\n ]);\n}\n\n/**\n * Adds middleware instrumentation to the Nitro build.\n *\n * @param nitro Nitro instance\n */\nexport function addMiddlewareInstrumentation(nitro: Nitro): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (!rollupConfig.plugins) {\n rollupConfig.plugins = [];\n }\n\n if (!Array.isArray(rollupConfig.plugins)) {\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(middlewareInstrumentationPlugin(nitro));\n });\n}\n\n/**\n * Creates a rollup plugin for the middleware instrumentation by transforming the middleware code.\n *\n * @param nitro Nitro instance\n * @returns The rollup plugin for the middleware instrumentation.\n */\nfunction middlewareInstrumentationPlugin(nitro: Nitro): InputPluginOption {\n const middlewareFiles = new Set<string>();\n\n return {\n name: 'sentry-nuxt-middleware-instrumentation',\n buildStart() {\n // Collect middleware files during build start\n nitro.scannedHandlers?.forEach(({ middleware, handler }) => {\n if (middleware && handler) {\n middlewareFiles.add(handler);\n }\n });\n },\n transform(code: string, id: string) {\n // Only transform files we've identified as middleware\n if (middlewareFiles.has(id)) {\n const fileName = path.basename(id);\n return {\n code: wrapMiddlewareCode(code, fileName),\n map: null,\n };\n }\n return null;\n },\n };\n}\n\n/**\n * Wraps the middleware user code to instrument it.\n *\n * @param originalCode The original user code of the middleware.\n * @param fileName The name of the middleware file, used for the span name and logging.\n *\n * @returns The wrapped user code of the middleware.\n */\nfunction wrapMiddlewareCode(originalCode: string, fileName: string): string {\n // Remove common file extensions\n const cleanFileName = fileName.replace(/\\.(ts|js|mjs|mts|cts)$/, '');\n\n return `\nimport { wrapMiddlewareHandlerWithSentry } from '#imports';\n\nfunction defineInstrumentedEventHandler(handlerOrObject) {\n return defineEventHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\nfunction instrumentedEventHandler(handlerOrObject) {\n return eventHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\nfunction defineInstrumentedHandler(handlerOrObject) {\n return defineHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\n${originalCode\n .replace(/defineEventHandler\\(/g, 'defineInstrumentedEventHandler(')\n .replace(/eventHandler\\(/g, 'instrumentedEventHandler(')\n .replace(/defineHandler\\(/g, 'defineInstrumentedHandler(')}\n`;\n}\n"],"names":["addServerImports","createResolver","nitro"],"mappings":";;;;;;AAQO,SAAS,oBAAA,GAA6B;AAC3C,EAAAA,oBAAA,CAAiB;AAAA,IACf;AAAA,MACE,IAAA,EAAM,iCAAA;AAAA,MACN,MAAMC,kBAAA,CAAe,0QAAe,CAAA,CAAE,QAAQ,uCAAuC;AAAA;AACvF,GACD,CAAA;AACH;AAOO,SAAS,6BAA6B,KAAA,EAAoB;AAC/D,EAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,eAAA,EAAiB,CAACC,QAAO,YAAA,KAAiB;AACzD,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,UAAU,EAAC;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AACxC,MAAA,YAAA,CAAa,OAAA,GAAU,CAAC,YAAA,CAAa,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,+BAAA,CAAgCA,MAAK,CAAC,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAQA,SAAS,gCAAgC,KAAA,EAAiC;AACxE,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AAExC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,wCAAA;AAAA,IACN,UAAA,GAAa;AAEX,MAAA,KAAA,CAAM,iBAAiB,OAAA,CAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAAM;AAC1D,QAAA,IAAI,cAAc,OAAA,EAAS;AACzB,UAAA,eAAA,CAAgB,IAAI,OAAO,CAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAElC,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA,EAAG;AAC3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AACjC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA;AAAA,UACvC,GAAA,EAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AACF;AAUA,SAAS,kBAAA,CAAmB,cAAsB,QAAA,EAA0B;AAE1E,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AAEnE,EAAA,OAAO;AAAA;;AAAA;AAAA,8EAAA,EAIuE,aAAa,CAAA;AAAA;;AAAA;AAAA,wEAAA,EAInB,aAAa,CAAA;AAAA;;AAAA;AAAA,yEAAA,EAIZ,aAAa,CAAA;AAAA;;AAAA,EAGtF,YAAA,CACC,OAAA,CAAQ,uBAAA,EAAyB,iCAAiC,CAAA,CAClE,OAAA,CAAQ,iBAAA,EAAmB,2BAA2B,CAAA,CACtD,OAAA,CAAQ,kBAAA,EAAoB,4BAA4B,CAAC;AAAA,CAAA;AAE5D;;;;;"}
1
+ {"version":3,"file":"middlewareConfig.js","sources":["../../../src/vite/middlewareConfig.ts"],"sourcesContent":["import { addServerImports, createResolver } from '@nuxt/kit';\nimport type { Nitro } from 'nitropack/types';\nimport * as path from 'path';\nimport type { InputPluginOption } from 'rollup';\n\n/**\n * Adds a server import for the middleware instrumentation.\n */\nexport function addMiddlewareImports(): void {\n addServerImports([\n {\n name: 'wrapMiddlewareHandlerWithSentry',\n from: createResolver(import.meta.url).resolve('./runtime/hooks/wrapMiddlewareHandler'),\n },\n ]);\n}\n\n/**\n * Adds middleware instrumentation to the Nitro build.\n *\n * @param nitro Nitro instance\n * @param isNitroV3 Whether the app builds with Nitro v3 (Nuxt 5)\n */\nexport function addMiddlewareInstrumentation(nitro: Nitro, isNitroV3: boolean): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (!rollupConfig.plugins) {\n rollupConfig.plugins = [];\n }\n\n if (!Array.isArray(rollupConfig.plugins)) {\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(middlewareInstrumentationPlugin(nitro, isNitroV3));\n });\n}\n\n/**\n * Creates a rollup plugin for the middleware instrumentation by transforming the middleware code.\n *\n * @param nitro Nitro instance\n * @param isNitroV3 Whether the app builds with Nitro v3 (Nuxt 5)\n * @returns The rollup plugin for the middleware instrumentation.\n */\nfunction middlewareInstrumentationPlugin(nitro: Nitro, isNitroV3: boolean): InputPluginOption {\n const middlewareFiles = new Set<string>();\n const wrapperModule = isNitroV3 ? '#imports/server' : '#imports';\n\n return {\n name: 'sentry-nuxt-middleware-instrumentation',\n buildStart() {\n // Collect middleware files during build start\n nitro.scannedHandlers?.forEach(({ middleware, handler }) => {\n if (middleware && handler) {\n middlewareFiles.add(handler);\n }\n });\n },\n transform(code: string, id: string) {\n // Only transform files we've identified as middleware\n if (middlewareFiles.has(id)) {\n const fileName = path.basename(id);\n return {\n code: wrapMiddlewareCode(code, fileName, wrapperModule),\n map: null,\n };\n }\n return null;\n },\n };\n}\n\n/**\n * Wraps the middleware user code to instrument it.\n *\n * @param originalCode The original user code of the middleware.\n * @param fileName The name of the middleware file, used for the span name and logging.\n * @param wrapperModule Import specifier resolving to `wrapMiddlewareHandlerWithSentry`.\n *\n * @returns The wrapped user code of the middleware.\n */\nfunction wrapMiddlewareCode(originalCode: string, fileName: string, wrapperModule: string): string {\n // Remove common file extensions\n const cleanFileName = fileName.replace(/\\.(ts|js|mjs|mts|cts)$/, '');\n\n return `\nimport { wrapMiddlewareHandlerWithSentry } from '${wrapperModule}';\n\nfunction defineInstrumentedEventHandler(handlerOrObject) {\n return defineEventHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\nfunction instrumentedEventHandler(handlerOrObject) {\n return eventHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\nfunction defineInstrumentedHandler(handlerOrObject) {\n return defineHandler(wrapMiddlewareHandlerWithSentry(handlerOrObject, '${cleanFileName}'));\n}\n\n${originalCode\n .replace(/defineEventHandler\\(/g, 'defineInstrumentedEventHandler(')\n .replace(/eventHandler\\(/g, 'instrumentedEventHandler(')\n .replace(/defineHandler\\(/g, 'defineInstrumentedHandler(')}\n`;\n}\n"],"names":["addServerImports","createResolver","nitro"],"mappings":";;;;;;AAQO,SAAS,oBAAA,GAA6B;AAC3C,EAAAA,oBAAA,CAAiB;AAAA,IACf;AAAA,MACE,IAAA,EAAM,iCAAA;AAAA,MACN,MAAMC,kBAAA,CAAe,0QAAe,CAAA,CAAE,QAAQ,uCAAuC;AAAA;AACvF,GACD,CAAA;AACH;AAQO,SAAS,4BAAA,CAA6B,OAAc,SAAA,EAA0B;AACnF,EAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,eAAA,EAAiB,CAACC,QAAO,YAAA,KAAiB;AACzD,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,UAAU,EAAC;AAAA,IAC1B;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG;AACxC,MAAA,YAAA,CAAa,OAAA,GAAU,CAAC,YAAA,CAAa,OAAO,CAAA;AAAA,IAC9C;AAEA,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,+BAAA,CAAgCA,MAAAA,EAAO,SAAS,CAAC,CAAA;AAAA,EAC7E,CAAC,CAAA;AACH;AASA,SAAS,+BAAA,CAAgC,OAAc,SAAA,EAAuC;AAC5F,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,EAAA,MAAM,aAAA,GAAgB,YAAY,iBAAA,GAAoB,UAAA;AAEtD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,wCAAA;AAAA,IACN,UAAA,GAAa;AAEX,MAAA,KAAA,CAAM,iBAAiB,OAAA,CAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAAM;AAC1D,QAAA,IAAI,cAAc,OAAA,EAAS;AACzB,UAAA,eAAA,CAAgB,IAAI,OAAO,CAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,SAAA,CAAU,MAAc,EAAA,EAAY;AAElC,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA,EAAG;AAC3B,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AACjC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,QAAA,EAAU,aAAa,CAAA;AAAA,UACtD,GAAA,EAAK;AAAA,SACP;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AACF;AAWA,SAAS,kBAAA,CAAmB,YAAA,EAAsB,QAAA,EAAkB,aAAA,EAA+B;AAEjG,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AAEnE,EAAA,OAAO;AAAA,iDAAA,EAC0C,aAAa,CAAA;;AAAA;AAAA,8EAAA,EAGgB,aAAa,CAAA;AAAA;;AAAA;AAAA,wEAAA,EAInB,aAAa,CAAA;AAAA;;AAAA;AAAA,yEAAA,EAIZ,aAAa,CAAA;AAAA;;AAAA,EAGtF,YAAA,CACC,OAAA,CAAQ,uBAAA,EAAyB,iCAAiC,CAAA,CAClE,OAAA,CAAQ,iBAAA,EAAmB,2BAA2B,CAAA,CACtD,OAAA,CAAQ,kBAAA,EAAoB,4BAA4B,CAAC;AAAA,CAAA;AAE5D;;;;;"}
@@ -2,6 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
3
  const config = require('@sentry/server-utils/orchestrion/config');
4
4
  const rollup = require('@sentry/server-utils/orchestrion/rollup');
5
+ const utils = require('./utils.js');
5
6
 
6
7
  const IORedisDependencies = ["standard-as-callback"];
7
8
  function setupOrchestrion(nuxt, hasServerConfig, buildTimeInstrumentation) {
@@ -15,7 +16,7 @@ function setupOrchestrion(nuxt, hasServerConfig, buildTimeInstrumentation) {
15
16
  if (nuxt.options?.dev) {
16
17
  return;
17
18
  }
18
- const isCloudflare = !!nitroConfig.preset?.replace(/-/g, "_").startsWith("cloudflare");
19
+ const isCloudflare = utils.isCloudflarePreset(nitroConfig.preset);
19
20
  if (!hasServerConfig && !isCloudflare) {
20
21
  return;
21
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrion.js","sources":["../../../src/vite/orchestrion.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { INSTRUMENTED_MODULE_NAMES } from '@sentry/server-utils/orchestrion/config';\nimport { sentryOrchestrionPlugin } from '@sentry/server-utils/orchestrion/rollup';\nimport type { NitroConfig } from 'nitropack';\n\n// ioredis requires this CommonJS helper to be bundled with it. Leaving it\n// external makes Nitro resolve the default export as a namespace object.\nconst IORedisDependencies = ['standard-as-callback'];\n\n/**\n * Configures Nitro to bundle and transform dependencies that publish tracing\n * events through diagnostics channels.\n *\n * `hasServerConfig` reflects whether a `sentry.server.config` file was found. On Node the SDK is\n * initialized from that file, so orchestrion only makes sense when it exists. On Cloudflare the SDK\n * is initialized through `sentryCloudflareNitroPlugin` instead (no server config file), so the\n * transform must still run there — detected via the Nitro preset.\n */\nexport function setupOrchestrion(nuxt: Nuxt, hasServerConfig: boolean, buildTimeInstrumentation?: boolean): void {\n if (buildTimeInstrumentation === false) {\n return;\n }\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n // `nuxt dev` has no bundle to transform, and inlining the CommonJS drivers into Nitro's dev\n // server breaks them (`ioredis` throws `(0, lodash_1.defaults) is not a function`).\n if (nuxt.options?.dev) {\n return;\n }\n\n // On Cloudflare (workerd) the SDK is initialized through `sentryCloudflareNitroPlugin` (no\n // server config file), so the transform must still run there — detected via the Nitro preset.\n // Nitro normalizes preset names, so match any `cloudflare*` spelling.\n const isCloudflare = !!nitroConfig.preset?.replace(/-/g, '_').startsWith('cloudflare');\n\n if (!hasServerConfig && !isCloudflare) {\n return;\n }\n\n nitroConfig.rollupConfig ??= {};\n\n if (nitroConfig.rollupConfig.plugins === null || nitroConfig.rollupConfig.plugins === undefined) {\n nitroConfig.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitroConfig.rollupConfig.plugins)) {\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n nitroConfig.rollupConfig.plugins.push(sentryOrchestrionPlugin({}));\n\n const externals = (nitroConfig.externals ||= {});\n const inline = externals.inline;\n const existingInline = Array.isArray(inline) ? inline : inline ? [inline] : [];\n externals.inline = [...new Set([...existingInline, ...INSTRUMENTED_MODULE_NAMES, ...IORedisDependencies])];\n });\n}\n"],"names":["sentryOrchestrionPlugin","INSTRUMENTED_MODULE_NAMES"],"mappings":";;;;;AAOA,MAAM,mBAAA,GAAsB,CAAC,sBAAsB,CAAA;AAW5C,SAAS,gBAAA,CAAiB,IAAA,EAAY,eAAA,EAA0B,wBAAA,EAA0C;AAC/G,EAAA,IAAI,6BAA6B,KAAA,EAAO;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,CAAC,WAAA,KAA6B;AACtD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA;AAAA,IACF;AAKA,IAAA,MAAM,YAAA,GAAe,CAAC,CAAC,WAAA,CAAY,MAAA,EAAQ,QAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,YAAY,CAAA;AAErF,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,YAAA,EAAc;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,YAAA,KAAZ,WAAA,CAAY,YAAA,GAAiB,EAAC,CAAA;AAE9B,IAAA,IAAI,YAAY,YAAA,CAAa,OAAA,KAAY,QAAQ,WAAA,CAAY,YAAA,CAAa,YAAY,MAAA,EAAW;AAC/F,MAAA,WAAA,CAAY,YAAA,CAAa,UAAU,EAAC;AAAA,IACtC,WAAW,CAAC,KAAA,CAAM,QAAQ,WAAA,CAAY,YAAA,CAAa,OAAO,CAAA,EAAG;AAC3D,MAAA,WAAA,CAAY,YAAA,CAAa,OAAA,GAAU,CAAC,WAAA,CAAY,aAAa,OAAO,CAAA;AAAA,IACtE;AAEA,IAAA,WAAA,CAAY,aAAa,OAAA,CAAQ,IAAA,CAAKA,8BAAA,CAAwB,EAAE,CAAC,CAAA;AAEjE,IAAA,MAAM,SAAA,GAAa,WAAA,CAAY,SAAA,KAAZ,WAAA,CAAY,YAAc,EAAC,CAAA;AAC9C,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAC7E,IAAA,SAAA,CAAU,MAAA,GAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,cAAA,EAAgB,GAAGC,gCAAA,EAA2B,GAAG,mBAAmB,CAAC,CAAC,CAAA;AAAA,EAC3G,CAAC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"orchestrion.js","sources":["../../../src/vite/orchestrion.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { INSTRUMENTED_MODULE_NAMES } from '@sentry/server-utils/orchestrion/config';\nimport { sentryOrchestrionPlugin } from '@sentry/server-utils/orchestrion/rollup';\nimport type { NitroConfig } from 'nitropack';\nimport { isCloudflarePreset } from './utils';\n\n// ioredis requires this CommonJS helper to be bundled with it. Leaving it\n// external makes Nitro resolve the default export as a namespace object.\nconst IORedisDependencies = ['standard-as-callback'];\n\n/**\n * Configures Nitro to bundle and transform dependencies that publish tracing\n * events through diagnostics channels.\n *\n * `hasServerConfig` reflects whether a `sentry.server.config` file was found. On Node the SDK is\n * initialized from that file, so orchestrion only makes sense when it exists. On Cloudflare the SDK\n * is initialized through `sentryCloudflareNitroPlugin` instead (no server config file), so the\n * transform must still run there — detected via the Nitro preset.\n */\nexport function setupOrchestrion(nuxt: Nuxt, hasServerConfig: boolean, buildTimeInstrumentation?: boolean): void {\n if (buildTimeInstrumentation === false) {\n return;\n }\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n // `nuxt dev` has no bundle to transform, and inlining the CommonJS drivers into Nitro's dev\n // server breaks them (`ioredis` throws `(0, lodash_1.defaults) is not a function`).\n if (nuxt.options?.dev) {\n return;\n }\n\n // On Cloudflare (workerd) the SDK is initialized through `sentryCloudflareNitroPlugin` (no\n // server config file), so the transform must still run there — detected via the Nitro preset.\n const isCloudflare = isCloudflarePreset(nitroConfig.preset);\n\n if (!hasServerConfig && !isCloudflare) {\n return;\n }\n\n nitroConfig.rollupConfig ??= {};\n\n if (nitroConfig.rollupConfig.plugins === null || nitroConfig.rollupConfig.plugins === undefined) {\n nitroConfig.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitroConfig.rollupConfig.plugins)) {\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n nitroConfig.rollupConfig.plugins.push(sentryOrchestrionPlugin({}));\n\n const externals = (nitroConfig.externals ||= {});\n const inline = externals.inline;\n const existingInline = Array.isArray(inline) ? inline : inline ? [inline] : [];\n externals.inline = [...new Set([...existingInline, ...INSTRUMENTED_MODULE_NAMES, ...IORedisDependencies])];\n });\n}\n"],"names":["isCloudflarePreset","sentryOrchestrionPlugin","INSTRUMENTED_MODULE_NAMES"],"mappings":";;;;;;AAQA,MAAM,mBAAA,GAAsB,CAAC,sBAAsB,CAAA;AAW5C,SAAS,gBAAA,CAAiB,IAAA,EAAY,eAAA,EAA0B,wBAAA,EAA0C;AAC/G,EAAA,IAAI,6BAA6B,KAAA,EAAO;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,CAAC,WAAA,KAA6B;AACtD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,YAAA,GAAeA,wBAAA,CAAmB,WAAA,CAAY,MAAM,CAAA;AAE1D,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,YAAA,EAAc;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,YAAA,KAAZ,WAAA,CAAY,YAAA,GAAiB,EAAC,CAAA;AAE9B,IAAA,IAAI,YAAY,YAAA,CAAa,OAAA,KAAY,QAAQ,WAAA,CAAY,YAAA,CAAa,YAAY,MAAA,EAAW;AAC/F,MAAA,WAAA,CAAY,YAAA,CAAa,UAAU,EAAC;AAAA,IACtC,WAAW,CAAC,KAAA,CAAM,QAAQ,WAAA,CAAY,YAAA,CAAa,OAAO,CAAA,EAAG;AAC3D,MAAA,WAAA,CAAY,YAAA,CAAa,OAAA,GAAU,CAAC,WAAA,CAAY,aAAa,OAAO,CAAA;AAAA,IACtE;AAEA,IAAA,WAAA,CAAY,aAAa,OAAA,CAAQ,IAAA,CAAKC,8BAAA,CAAwB,EAAE,CAAC,CAAA;AAEjE,IAAA,MAAM,SAAA,GAAa,WAAA,CAAY,SAAA,KAAZ,WAAA,CAAY,YAAc,EAAC,CAAA;AAC9C,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,SAAS,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAC7E,IAAA,SAAA,CAAU,MAAA,GAAS,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,cAAA,EAAgB,GAAGC,gCAAA,EAA2B,GAAG,mBAAmB,CAAC,CAAC,CAAA;AAAA,EAC3G,CAAC,CAAA;AACH;;;;"}
@@ -6,17 +6,23 @@ const path = require('path');
6
6
  const node_url = require('node:url');
7
7
  const kit = require('@nuxt/kit');
8
8
 
9
- async function getNitroMajorVersion() {
9
+ async function getNitroMajorVersion(rootDir) {
10
10
  try {
11
11
  const { getPackageInfo } = await import('local-pkg');
12
- const info = await getPackageInfo("nitro");
13
- if (info?.version) {
14
- const major = parseInt(info.version.split(".")[0] ?? "2", 10);
15
- return isNaN(major) ? 2 : major;
12
+ const fromPackage = (dir) => ({ paths: [path.join(dir, "package.json")] });
13
+ let provider = await getPackageInfo("nuxt", fromPackage(rootDir));
14
+ if (provider?.packageJson.dependencies?.["@nuxt/nitro-server"]) {
15
+ provider = await getPackageInfo("@nuxt/nitro-server", fromPackage(provider.rootPath)) ?? provider;
16
16
  }
17
+ if (!provider?.packageJson.dependencies?.nitro) {
18
+ return 2;
19
+ }
20
+ const info = await getPackageInfo("nitro", fromPackage(provider.rootPath));
21
+ const major = parseInt(info?.version?.split(".")[0] ?? "", 10);
22
+ return isNaN(major) ? 3 : major;
17
23
  } catch {
24
+ return 2;
18
25
  }
19
- return 2;
20
26
  }
21
27
  async function findDefaultSdkInitFile(type, nuxt, options) {
22
28
  const possibleFileExtensions = ["ts", "js", "mjs", "cjs", "mts", "cts"];
@@ -40,8 +46,8 @@ async function findDefaultSdkInitFile(type, nuxt, options) {
40
46
  return void 0;
41
47
  }
42
48
  const SERVER_CONFIG_FILENAME = "sentry.server.config";
43
- function toImportSpecifier(fromDir, filePath) {
44
- return `./${path.relative(fromDir, filePath).split(/[\\/]/).join("/")}`;
49
+ function isCloudflarePreset(preset) {
50
+ return !!preset?.replace(/-/g, "_").startsWith("cloudflare");
45
51
  }
46
52
  function getFilenameFromNodeStartCommand(nodeCommand) {
47
53
  const regex = /[^/\\]+\.[^/\\]+$/;
@@ -155,7 +161,7 @@ exports.extractFunctionReexportQueryParameters = extractFunctionReexportQueryPar
155
161
  exports.findDefaultSdkInitFile = findDefaultSdkInitFile;
156
162
  exports.getFilenameFromNodeStartCommand = getFilenameFromNodeStartCommand;
157
163
  exports.getNitroMajorVersion = getNitroMajorVersion;
164
+ exports.isCloudflarePreset = isCloudflarePreset;
158
165
  exports.removeSentryQueryFromPath = removeSentryQueryFromPath;
159
- exports.toImportSpecifier = toImportSpecifier;
160
166
  exports.toResolvablePath = toResolvablePath;
161
167
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/vite/utils.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { consoleSandbox } from '@sentry/core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'node:url';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport { resolvePath } from '@nuxt/kit';\n\n/**\n * Gets the major version of the installed nitro package.\n * Returns 2 as the default if nitro is not found or the version cannot be determined.\n */\nexport async function getNitroMajorVersion(): Promise<number> {\n try {\n const { getPackageInfo } = await import('local-pkg');\n const info = await getPackageInfo('nitro');\n if (info?.version) {\n const major = parseInt(info.version.split('.')[0] ?? '2', 10);\n return isNaN(major) ? 2 : major;\n }\n } catch {\n // If local-pkg is unavailable or nitro is not found, default to v2\n }\n return 2;\n}\n\n/**\n * Find the default SDK init file for the given type (client or server).\n */\nexport async function findDefaultSdkInitFile(\n type: 'server' | 'client',\n nuxt?: Nuxt,\n options?: SentryNuxtModuleOptions,\n): Promise<string | undefined> {\n const possibleFileExtensions = ['ts', 'js', 'mjs', 'cjs', 'mts', 'cts'];\n const relativePaths = possibleFileExtensions.map(ext => `sentry.${type}.config.${ext}`);\n\n // Get layers from highest priority to lowest\n const layers = [...(nuxt?.options._layers ?? [])].reverse();\n\n for (const layer of layers) {\n for (const relativePath of relativePaths) {\n const fullPath = path.resolve(layer.cwd, relativePath);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n\n // As a fallback, also check CWD (left for pure compatibility)\n const rootDir = options?.configDir ? await resolvePath(options.configDir, { type: 'dir' }) : process.cwd();\n for (const relativePath of relativePaths) {\n const fullPath = path.resolve(rootDir, relativePath);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n return undefined;\n}\n\nexport const SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/** Builds the value for `node --import`. Node reads it as a URL, so it needs forward slashes on Windows too. */\nexport function toImportSpecifier(fromDir: string, filePath: string): string {\n return `./${path.relative(fromDir, filePath).split(/[\\\\/]/).join('/')}`;\n}\n\n/**\n * Extracts the filename from a node command with a path.\n */\nexport function getFilenameFromNodeStartCommand(nodeCommand: string): string | null {\n const regex = /[^/\\\\]+\\.[^/\\\\]+$/;\n const match = nodeCommand.match(regex);\n return match ? match[0] : null;\n}\n\nexport const SENTRY_WRAPPED_ENTRY = '?sentry-query-wrapped-entry';\nexport const SENTRY_WRAPPED_FUNCTIONS = '?sentry-query-wrapped-functions=';\nexport const SENTRY_REEXPORTED_FUNCTIONS = '?sentry-query-reexported-functions=';\nexport const QUERY_END_INDICATOR = 'SENTRY-QUERY-END';\n\n/**\n * Strips the Sentry query part from a path.\n * Example: example/path?sentry-query-wrapped-entry?sentry-query-functions-reexport=foo,SENTRY-QUERY-END -> /example/path\n *\n * Only exported for testing.\n */\nexport function removeSentryQueryFromPath(url: string): string {\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const regex = new RegExp(`\\\\${SENTRY_WRAPPED_ENTRY}.*?\\\\${QUERY_END_INDICATOR}`);\n return url.replace(regex, '');\n}\n\n/**\n * Extracts and sanitizes function re-export and function wrap query parameters from a query string.\n * If it is a default export, it is not considered for re-exporting.\n *\n * Only exported for testing.\n */\nexport function extractFunctionReexportQueryParameters(query: string): { wrap: string[]; reexport: string[] } {\n // Regex matches the comma-separated params between the functions query\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const wrapRegex = new RegExp(\n `\\\\${SENTRY_WRAPPED_FUNCTIONS}(.*?)(\\\\${QUERY_END_INDICATOR}|\\\\${SENTRY_REEXPORTED_FUNCTIONS})`,\n );\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const reexportRegex = new RegExp(`\\\\${SENTRY_REEXPORTED_FUNCTIONS}(.*?)(\\\\${QUERY_END_INDICATOR})`);\n\n const wrapMatch = query.match(wrapRegex);\n const reexportMatch = query.match(reexportRegex);\n\n const wrap =\n wrapMatch?.[1]\n ?.split(',')\n .filter(param => param !== '')\n // Sanitize, as code could be injected with another rollup plugin\n .map((str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) || [];\n\n const reexport =\n reexportMatch?.[1]\n ?.split(',')\n .filter(param => param !== '' && param !== 'default')\n // Sanitize, as code could be injected with another rollup plugin\n .map((str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) || [];\n\n return { wrap, reexport };\n}\n\n/**\n * Constructs a comma-separated string with all functions that need to be re-exported later from the server entry.\n * It uses Rollup's `exportedBindings` to determine the functions to re-export. Functions which should be wrapped\n * (e.g. serverless handlers) are wrapped by Sentry.\n */\nexport function constructWrappedFunctionExportQuery(\n exportedBindings: Record<string, string[]> | null,\n entrypointWrappedFunctions: string[],\n debug?: boolean,\n): string {\n const functionsToExport: { wrap: string[]; reexport: string[] } = {\n wrap: [],\n reexport: [],\n };\n\n // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }`\n // The key `.` refers to exports within the current file, while other keys show from where exports were imported first.\n Object.values(exportedBindings || {}).forEach(functions =>\n functions.forEach(fn => {\n if (entrypointWrappedFunctions.includes(fn)) {\n functionsToExport.wrap.push(fn);\n } else {\n functionsToExport.reexport.push(fn);\n }\n }),\n );\n\n if (debug && functionsToExport.wrap.length === 0) {\n consoleSandbox(() =>\n // eslint-disable-next-line no-console\n console.warn(\n \"[Sentry] No functions found to wrap. In case the server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.experimental_entrypointWrappedFunctions` in `nuxt.config.ts`.\",\n ),\n );\n }\n\n const wrapQuery = functionsToExport.wrap.length\n ? `${SENTRY_WRAPPED_FUNCTIONS}${functionsToExport.wrap.join(',')}`\n : '';\n const reexportQuery = functionsToExport.reexport.length\n ? `${SENTRY_REEXPORTED_FUNCTIONS}${functionsToExport.reexport.join(',')}`\n : '';\n\n return [wrapQuery, reexportQuery].join('');\n}\n\n/**\n * Constructs a code snippet with function reexports (can be used in Rollup plugins as a return value for `load()`)\n */\nexport function constructFunctionReExport(pathWithQuery: string, entryId: string): string {\n const { wrap: wrapFunctions, reexport: reexportFunctions } = extractFunctionReexportQueryParameters(pathWithQuery);\n\n return wrapFunctions\n .reduce(\n (functionsCode, currFunctionName) =>\n functionsCode.concat(\n `async function ${currFunctionName}_sentryWrapped(...args) {\\n` +\n ` const res = await import(${JSON.stringify(entryId)});\\n` +\n ` return res.${currFunctionName}.call(this, ...args);\\n` +\n '}\\n' +\n `export { ${currFunctionName}_sentryWrapped as ${currFunctionName} };\\n`,\n ),\n '',\n )\n .concat(\n reexportFunctions.reduce(\n (functionsCode, currFunctionName) =>\n functionsCode.concat(`export { ${currFunctionName} } from ${JSON.stringify(entryId)};`),\n '',\n ),\n );\n}\n\n/**\n * `load()` emits `file://` specifiers because Node's ESM loader rejects bare Windows\n * paths (`ERR_UNSUPPORTED_ESM_URL_SCHEME`), but Rollup's resolver only understands\n * filesystem paths. Returns `undefined` for a malformed `file://` URL.\n *\n * Only exported for testing.\n */\nexport function toResolvablePath(source: string): { path: string; wasFileUrl: boolean } | undefined {\n if (!source.startsWith('file://')) {\n return { path: source, wasFileUrl: false };\n }\n if (source === 'file://' || source === 'file:///') {\n return undefined;\n }\n try {\n const filePath = fileURLToPath(source);\n if (!filePath || filePath === '/' || filePath === '\\\\') {\n return undefined;\n }\n return { path: filePath, wasFileUrl: true };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Sets up alias to work around OpenTelemetry's incomplete ESM imports.\n * https://github.com/getsentry/sentry-javascript/issues/15204\n *\n * OpenTelemetry's @opentelemetry/resources package has incomplete imports missing\n * the .js file extensions (like execAsync for machine-id detection). This causes module resolution\n * errors in certain Nuxt configurations, particularly when local Nuxt modules in Nuxt 4 are present.\n *\n * @see https://nuxt.com/docs/guide/concepts/esm#aliasing-libraries\n */\nexport function addOTelCommonJSImportAlias(nuxt: Nuxt, isNitroV3 = false): void {\n if (!nuxt.options.dev || isNitroV3) {\n return;\n }\n\n if (!nuxt.options.alias) {\n nuxt.options.alias = {};\n }\n\n if (!nuxt.options.alias['@opentelemetry/resources']) {\n nuxt.options.alias['@opentelemetry/resources'] = '@opentelemetry/resources/build/src/index.js';\n }\n}\n"],"names":["resolvePath","consoleSandbox","fileURLToPath"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/vite/utils.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { consoleSandbox } from '@sentry/core';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { fileURLToPath } from 'node:url';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport { resolvePath } from '@nuxt/kit';\n\n/**\n * Gets the major version of the Nitro package used by the app's Nuxt installation.\n * Returns 2 as the default if the version cannot be determined.\n *\n * Nitro v2 is published as `nitropack`, v3 as `nitro`. Resolving `nitro` directly is\n * unreliable: module resolution walks up the directory tree, so in a monorepo an\n * unrelated `nitro` v3 above the app wins even when the app's Nuxt uses `nitropack` v2.\n * Instead, follow the dependency chain Nuxt itself imports Nitro through:\n * `nuxt` -> (`@nuxt/nitro-server` ->) `nitro` | `nitropack`.\n */\nexport async function getNitroMajorVersion(rootDir: string): Promise<number> {\n try {\n const { getPackageInfo } = await import('local-pkg');\n\n // `paths` entries must point at a file: for a bare directory, resolution starts at the\n // directory's parent and skips the directory's own `node_modules`, so a hoisted copy higher\n // up the tree (e.g. a monorepo root) wins over the app's actual dependency.\n const fromPackage = (dir: string): { paths: string[] } => ({ paths: [path.join(dir, 'package.json')] });\n\n // The package that declares the Nitro dependency: `nuxt` itself, or `@nuxt/nitro-server` (Nuxt >= 3.21) when nuxt delegates to it\n let provider = await getPackageInfo('nuxt', fromPackage(rootDir));\n if (provider?.packageJson.dependencies?.['@nuxt/nitro-server']) {\n provider = (await getPackageInfo('@nuxt/nitro-server', fromPackage(provider.rootPath))) ?? provider;\n }\n\n if (!provider?.packageJson.dependencies?.nitro) {\n return 2;\n }\n\n const info = await getPackageInfo('nitro', fromPackage(provider.rootPath));\n const major = parseInt(info?.version?.split('.')[0] ?? '', 10);\n // The provider imports `nitro` (not `nitropack`), so it is at least v3 even if the version is unreadable\n return isNaN(major) ? 3 : major;\n } catch {\n // If local-pkg is unavailable or resolution fails, default to v2\n return 2;\n }\n}\n\n/**\n * Find the default SDK init file for the given type (client or server).\n */\nexport async function findDefaultSdkInitFile(\n type: 'server' | 'client',\n nuxt?: Nuxt,\n options?: SentryNuxtModuleOptions,\n): Promise<string | undefined> {\n const possibleFileExtensions = ['ts', 'js', 'mjs', 'cjs', 'mts', 'cts'];\n const relativePaths = possibleFileExtensions.map(ext => `sentry.${type}.config.${ext}`);\n\n // Get layers from highest priority to lowest\n const layers = [...(nuxt?.options._layers ?? [])].reverse();\n\n for (const layer of layers) {\n for (const relativePath of relativePaths) {\n const fullPath = path.resolve(layer.cwd, relativePath);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n\n // As a fallback, also check CWD (left for pure compatibility)\n const rootDir = options?.configDir ? await resolvePath(options.configDir, { type: 'dir' }) : process.cwd();\n for (const relativePath of relativePaths) {\n const fullPath = path.resolve(rootDir, relativePath);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n return undefined;\n}\n\nexport const SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/** Whether a resolved Nitro preset targets Cloudflare (workerd). Nitro normalizes preset names, so any `cloudflare*` spelling matches. */\nexport function isCloudflarePreset(preset: string | undefined): boolean {\n return !!preset?.replace(/-/g, '_').startsWith('cloudflare');\n}\n\n/** Builds the value for `node --import`. Node reads it as a URL, so it needs forward slashes on Windows too. */\nexport function toImportSpecifier(fromDir: string, filePath: string): string {\n return `./${path.relative(fromDir, filePath).split(/[\\\\/]/).join('/')}`;\n}\n\n/**\n * Extracts the filename from a node command with a path.\n */\nexport function getFilenameFromNodeStartCommand(nodeCommand: string): string | null {\n const regex = /[^/\\\\]+\\.[^/\\\\]+$/;\n const match = nodeCommand.match(regex);\n return match ? match[0] : null;\n}\n\nexport const SENTRY_WRAPPED_ENTRY = '?sentry-query-wrapped-entry';\nexport const SENTRY_WRAPPED_FUNCTIONS = '?sentry-query-wrapped-functions=';\nexport const SENTRY_REEXPORTED_FUNCTIONS = '?sentry-query-reexported-functions=';\nexport const QUERY_END_INDICATOR = 'SENTRY-QUERY-END';\n\n/**\n * Strips the Sentry query part from a path.\n * Example: example/path?sentry-query-wrapped-entry?sentry-query-functions-reexport=foo,SENTRY-QUERY-END -> /example/path\n *\n * Only exported for testing.\n */\nexport function removeSentryQueryFromPath(url: string): string {\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const regex = new RegExp(`\\\\${SENTRY_WRAPPED_ENTRY}.*?\\\\${QUERY_END_INDICATOR}`);\n return url.replace(regex, '');\n}\n\n/**\n * Extracts and sanitizes function re-export and function wrap query parameters from a query string.\n * If it is a default export, it is not considered for re-exporting.\n *\n * Only exported for testing.\n */\nexport function extractFunctionReexportQueryParameters(query: string): { wrap: string[]; reexport: string[] } {\n // Regex matches the comma-separated params between the functions query\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const wrapRegex = new RegExp(\n `\\\\${SENTRY_WRAPPED_FUNCTIONS}(.*?)(\\\\${QUERY_END_INDICATOR}|\\\\${SENTRY_REEXPORTED_FUNCTIONS})`,\n );\n // oxlint-disable-next-line sdk/no-regexp-constructor\n const reexportRegex = new RegExp(`\\\\${SENTRY_REEXPORTED_FUNCTIONS}(.*?)(\\\\${QUERY_END_INDICATOR})`);\n\n const wrapMatch = query.match(wrapRegex);\n const reexportMatch = query.match(reexportRegex);\n\n const wrap =\n wrapMatch?.[1]\n ?.split(',')\n .filter(param => param !== '')\n // Sanitize, as code could be injected with another rollup plugin\n .map((str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) || [];\n\n const reexport =\n reexportMatch?.[1]\n ?.split(',')\n .filter(param => param !== '' && param !== 'default')\n // Sanitize, as code could be injected with another rollup plugin\n .map((str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')) || [];\n\n return { wrap, reexport };\n}\n\n/**\n * Constructs a comma-separated string with all functions that need to be re-exported later from the server entry.\n * It uses Rollup's `exportedBindings` to determine the functions to re-export. Functions which should be wrapped\n * (e.g. serverless handlers) are wrapped by Sentry.\n */\nexport function constructWrappedFunctionExportQuery(\n exportedBindings: Record<string, string[]> | null,\n entrypointWrappedFunctions: string[],\n debug?: boolean,\n): string {\n const functionsToExport: { wrap: string[]; reexport: string[] } = {\n wrap: [],\n reexport: [],\n };\n\n // `exportedBindings` can look like this: `{ '.': [ 'handler' ] }` or `{ '.': [], './firebase-gen-1.mjs': [ 'server' ] }`\n // The key `.` refers to exports within the current file, while other keys show from where exports were imported first.\n Object.values(exportedBindings || {}).forEach(functions =>\n functions.forEach(fn => {\n if (entrypointWrappedFunctions.includes(fn)) {\n functionsToExport.wrap.push(fn);\n } else {\n functionsToExport.reexport.push(fn);\n }\n }),\n );\n\n if (debug && functionsToExport.wrap.length === 0) {\n consoleSandbox(() =>\n // eslint-disable-next-line no-console\n console.warn(\n \"[Sentry] No functions found to wrap. In case the server needs to export async functions other than `handler` or `server`, consider adding the name(s) to Sentry's build options `sentry.experimental_entrypointWrappedFunctions` in `nuxt.config.ts`.\",\n ),\n );\n }\n\n const wrapQuery = functionsToExport.wrap.length\n ? `${SENTRY_WRAPPED_FUNCTIONS}${functionsToExport.wrap.join(',')}`\n : '';\n const reexportQuery = functionsToExport.reexport.length\n ? `${SENTRY_REEXPORTED_FUNCTIONS}${functionsToExport.reexport.join(',')}`\n : '';\n\n return [wrapQuery, reexportQuery].join('');\n}\n\n/**\n * Constructs a code snippet with function reexports (can be used in Rollup plugins as a return value for `load()`)\n */\nexport function constructFunctionReExport(pathWithQuery: string, entryId: string): string {\n const { wrap: wrapFunctions, reexport: reexportFunctions } = extractFunctionReexportQueryParameters(pathWithQuery);\n\n return wrapFunctions\n .reduce(\n (functionsCode, currFunctionName) =>\n functionsCode.concat(\n `async function ${currFunctionName}_sentryWrapped(...args) {\\n` +\n ` const res = await import(${JSON.stringify(entryId)});\\n` +\n ` return res.${currFunctionName}.call(this, ...args);\\n` +\n '}\\n' +\n `export { ${currFunctionName}_sentryWrapped as ${currFunctionName} };\\n`,\n ),\n '',\n )\n .concat(\n reexportFunctions.reduce(\n (functionsCode, currFunctionName) =>\n functionsCode.concat(`export { ${currFunctionName} } from ${JSON.stringify(entryId)};`),\n '',\n ),\n );\n}\n\n/**\n * `load()` emits `file://` specifiers because Node's ESM loader rejects bare Windows\n * paths (`ERR_UNSUPPORTED_ESM_URL_SCHEME`), but Rollup's resolver only understands\n * filesystem paths. Returns `undefined` for a malformed `file://` URL.\n *\n * Only exported for testing.\n */\nexport function toResolvablePath(source: string): { path: string; wasFileUrl: boolean } | undefined {\n if (!source.startsWith('file://')) {\n return { path: source, wasFileUrl: false };\n }\n if (source === 'file://' || source === 'file:///') {\n return undefined;\n }\n try {\n const filePath = fileURLToPath(source);\n if (!filePath || filePath === '/' || filePath === '\\\\') {\n return undefined;\n }\n return { path: filePath, wasFileUrl: true };\n } catch {\n return undefined;\n }\n}\n\n/**\n * Sets up alias to work around OpenTelemetry's incomplete ESM imports.\n * https://github.com/getsentry/sentry-javascript/issues/15204\n *\n * OpenTelemetry's @opentelemetry/resources package has incomplete imports missing\n * the .js file extensions (like execAsync for machine-id detection). This causes module resolution\n * errors in certain Nuxt configurations, particularly when local Nuxt modules in Nuxt 4 are present.\n *\n * @see https://nuxt.com/docs/guide/concepts/esm#aliasing-libraries\n */\nexport function addOTelCommonJSImportAlias(nuxt: Nuxt, isNitroV3 = false): void {\n if (!nuxt.options.dev || isNitroV3) {\n return;\n }\n\n if (!nuxt.options.alias) {\n nuxt.options.alias = {};\n }\n\n if (!nuxt.options.alias['@opentelemetry/resources']) {\n nuxt.options.alias['@opentelemetry/resources'] = '@opentelemetry/resources/build/src/index.js';\n }\n}\n"],"names":["resolvePath","consoleSandbox","fileURLToPath"],"mappings":"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"}
@@ -1,9 +1,20 @@
1
1
  import { GLOBAL_OBJ } from '@sentry/core';
2
2
 
3
3
  const NUXT_DEV_MODE_FLAG = "__SENTRY_NUXT_DEV_MODE__";
4
+ const NUXT_PRERENDER_FLAG = "__SENTRY_NUXT_PRERENDER__";
5
+ const NUXT_SERVER_INITIALIZED_FLAG = "__SENTRY_NUXT_SERVER_INITIALIZED__";
4
6
  function isNuxtDevRuntime() {
5
7
  return NUXT_DEV_MODE_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_DEV_MODE_FLAG] === true;
6
8
  }
9
+ function isNuxtPrerenderRuntime() {
10
+ return NUXT_PRERENDER_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_PRERENDER_FLAG] === true;
11
+ }
12
+ function isNuxtServerInitialized() {
13
+ return NUXT_SERVER_INITIALIZED_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] === true;
14
+ }
15
+ function markNuxtServerInitialized() {
16
+ GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] = true;
17
+ }
7
18
 
8
- export { NUXT_DEV_MODE_FLAG, isNuxtDevRuntime };
19
+ export { NUXT_DEV_MODE_FLAG, NUXT_PRERENDER_FLAG, NUXT_SERVER_INITIALIZED_FLAG, isNuxtDevRuntime, isNuxtPrerenderRuntime, isNuxtServerInitialized, markNuxtServerInitialized };
9
20
  //# sourceMappingURL=devMode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devMode.js","sources":["../../../src/common/devMode.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/** Global flag set by the generated `<buildDir>/dev/sentry.server.config.mjs`. */\nexport const NUXT_DEV_MODE_FLAG = '__SENTRY_NUXT_DEV_MODE__';\n\n/** Whether the SDK was preloaded by the generated `nuxt dev` server config file. */\nexport function isNuxtDevRuntime(): boolean {\n return NUXT_DEV_MODE_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_DEV_MODE_FLAG] === true;\n}\n"],"names":[],"mappings":";;AAGO,MAAM,kBAAA,GAAqB;AAG3B,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,kBAAA,IAAsB,UAAA,IAAc,UAAA,CAAW,kBAAkB,CAAA,KAAM,IAAA;AAChF;;;;"}
1
+ {"version":3,"file":"devMode.js","sources":["../../../src/common/devMode.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/** Global flag set by the generated runtime-flags module before the Sentry server config evaluates. */\nexport const NUXT_DEV_MODE_FLAG = '__SENTRY_NUXT_DEV_MODE__';\n\n/** Global flag set by the generated runtime-flags module during a prerender build. */\nexport const NUXT_PRERENDER_FLAG = '__SENTRY_NUXT_PRERENDER__';\n\n/** Global flag set by the Nuxt server SDK after a successful `init`, to guard against a second init. */\nexport const NUXT_SERVER_INITIALIZED_FLAG = '__SENTRY_NUXT_SERVER_INITIALIZED__';\n\n/** Whether the server runs in `nuxt dev`. */\nexport function isNuxtDevRuntime(): boolean {\n return NUXT_DEV_MODE_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_DEV_MODE_FLAG] === true;\n}\n\n/** Whether the server bundle is executed by the Nitro prerenderer at build time. */\nexport function isNuxtPrerenderRuntime(): boolean {\n return NUXT_PRERENDER_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_PRERENDER_FLAG] === true;\n}\n\n/** Whether a Nuxt server SDK `init` already ran in this process. */\nexport function isNuxtServerInitialized(): boolean {\n return NUXT_SERVER_INITIALIZED_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] === true;\n}\n\n/** Records that the Nuxt server SDK initialized in this process. */\nexport function markNuxtServerInitialized(): void {\n (GLOBAL_OBJ as typeof GLOBAL_OBJ & { [NUXT_SERVER_INITIALIZED_FLAG]?: boolean })[NUXT_SERVER_INITIALIZED_FLAG] = true;\n}\n"],"names":[],"mappings":";;AAGO,MAAM,kBAAA,GAAqB;AAG3B,MAAM,mBAAA,GAAsB;AAG5B,MAAM,4BAAA,GAA+B;AAGrC,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,kBAAA,IAAsB,UAAA,IAAc,UAAA,CAAW,kBAAkB,CAAA,KAAM,IAAA;AAChF;AAGO,SAAS,sBAAA,GAAkC;AAChD,EAAA,OAAO,mBAAA,IAAuB,UAAA,IAAc,UAAA,CAAW,mBAAmB,CAAA,KAAM,IAAA;AAClF;AAGO,SAAS,uBAAA,GAAmC;AACjD,EAAA,OAAO,4BAAA,IAAgC,UAAA,IAAc,UAAA,CAAW,4BAA4B,CAAA,KAAM,IAAA;AACpG;AAGO,SAAS,yBAAA,GAAkC;AAChD,EAAC,UAAA,CAAgF,4BAA4B,CAAA,GAAI,IAAA;AACnH;;;;"}
@@ -1,13 +1,13 @@
1
1
  import { defineNuxtModule, createResolver, addPluginTemplate, addPlugin, addServerPlugin, addVitePlugin, addTemplate } from '@nuxt/kit';
2
2
  import { consoleSandbox } from '@sentry/core';
3
3
  import * as path from 'path';
4
- import { addDevServerConfigFile, addServerConfigToBuild, DEV_SERVER_CONFIG_PATH, addSentryTopImport, addDynamicImportEntryFileWrapper } from './vite/addServerConfig.js';
4
+ import { addServerConfigPlugin, addServerConfigShimWithWarning, addServerConfigToBuild, addSentryTopImport, addDynamicImportEntryFileWrapper } from './vite/addServerConfig.js';
5
5
  import { addDatabaseInstrumentation } from './vite/databaseConfig.js';
6
6
  import { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig.js';
7
7
  import { setupOrchestrion } from './vite/orchestrion.js';
8
8
  import { setupSourceMaps } from './vite/sourceMaps.js';
9
9
  import { addStorageInstrumentation } from './vite/storageConfig.js';
10
- import { findDefaultSdkInitFile, getNitroMajorVersion, addOTelCommonJSImportAlias, toImportSpecifier } from './vite/utils.js';
10
+ import { findDefaultSdkInitFile, getNitroMajorVersion, addOTelCommonJSImportAlias } from './vite/utils.js';
11
11
 
12
12
  const module$1 = defineNuxtModule({
13
13
  meta: {
@@ -24,7 +24,9 @@ const module$1 = defineNuxtModule({
24
24
  }
25
25
  const moduleOptions = {
26
26
  ...moduleOptionsParam,
27
+ // oxlint-disable-next-line typescript/no-deprecated -- supported until removal
27
28
  autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,
29
+ // oxlint-disable-next-line typescript/no-deprecated -- supported until removal
28
30
  experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [
29
31
  "default",
30
32
  "handler",
@@ -58,11 +60,15 @@ const module$1 = defineNuxtModule({
58
60
  });
59
61
  }
60
62
  const serverConfigFile = await findDefaultSdkInitFile("server", nuxt, moduleOptions);
61
- const isNitroV3 = await getNitroMajorVersion() >= 3;
63
+ const isNitroV3 = await getNitroMajorVersion(nuxt.options.rootDir) >= 3;
62
64
  const nuxtMajor = parseInt(nuxt._version?.split(".")[0] ?? "3", 10);
63
65
  const isMinNuxtV4 = nuxtMajor >= 4;
64
66
  setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);
67
+ const usesDeprecatedInjectMode = moduleOptions.autoInjectServerSentry === "top-level-import" || moduleOptions.autoInjectServerSentry === "experimental_dynamic-import";
65
68
  if (serverConfigFile) {
69
+ if (!usesDeprecatedInjectMode) {
70
+ addServerConfigPlugin(nuxt, serverConfigFile);
71
+ }
66
72
  if (isNitroV3) {
67
73
  addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/handler.server"));
68
74
  addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/update-route-name.server"));
@@ -79,9 +85,6 @@ const module$1 = defineNuxtModule({
79
85
  addMiddlewareImports();
80
86
  addStorageInstrumentation(nuxt, !isNitroV3);
81
87
  addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);
82
- if (isNitroV3) {
83
- addDevServerConfigFile(nuxt, serverConfigFile);
84
- }
85
88
  }
86
89
  if (clientConfigFile || serverConfigFile) {
87
90
  setupSourceMaps(moduleOptions, nuxt, addVitePlugin);
@@ -125,56 +128,37 @@ const module$1 = defineNuxtModule({
125
128
  return;
126
129
  }
127
130
  if (serverConfigFile) {
128
- addMiddlewareInstrumentation(nitro);
129
- consoleSandbox(() => {
130
- const serverDir = nitro.options.output.serverDir;
131
- if (serverDir.includes(".netlify") || !!process.env.NETLIFY) {
132
- console.warn(
133
- "[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/"
134
- );
135
- }
136
- if (serverDir.includes(".vercel") || !!process.env.VERCEL) {
137
- console.warn(
138
- "[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/"
139
- );
140
- }
141
- });
142
- if (moduleOptions.autoInjectServerSentry !== "experimental_dynamic-import") {
143
- if (!(isNitroV3 && nitro.options.dev)) {
144
- addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);
145
- }
131
+ addMiddlewareInstrumentation(nitro, isNitroV3);
132
+ if (!usesDeprecatedInjectMode) {
133
+ addServerConfigShimWithWarning(nitro);
146
134
  if (moduleOptions.debug) {
147
- const serverDirResolver = createResolver(nitro.options.output.serverDir);
148
- const serverConfigPath = serverDirResolver.resolve("sentry.server.config.mjs");
149
- const serverConfigRelativePath = toImportSpecifier(nitro.options.rootDir, serverConfigPath);
150
- const devConfigRelativePath = isNitroV3 ? toImportSpecifier(nuxt.options.rootDir, path.join(nuxt.options.buildDir, DEV_SERVER_CONFIG_PATH)) : serverConfigRelativePath;
151
135
  consoleSandbox(() => {
152
136
  console.log(
153
- `[Sentry] Using \`${serverConfigFile}\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`
137
+ `[Sentry] Bundled \`${serverConfigFile}\` into the Nitro server build. The SDK initializes itself at server startup \u2014 no \`node --import\` preload needed.`
154
138
  );
155
- if (nitro.options.dev) {
156
- console.log(
157
- `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \`NODE_OPTIONS='--import ${devConfigRelativePath}' nuxt dev\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \`nuxt prepare\` to regenerate it.`
158
- );
159
- } else {
160
- console.log(
161
- `[Sentry] When running your built application, preload Sentry via a command-line flag (\`node --import ${serverConfigRelativePath} [...]\`) or via an environment variable (\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\`).`
162
- );
163
- }
164
139
  });
165
140
  }
166
- }
167
- if (moduleOptions.autoInjectServerSentry === "top-level-import") {
168
- addSentryTopImport(moduleOptions, nitro);
169
- }
170
- if (moduleOptions.autoInjectServerSentry === "experimental_dynamic-import") {
171
- addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);
172
- if (moduleOptions.debug) {
173
- consoleSandbox(() => {
174
- console.log(
175
- "[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes."
176
- );
177
- });
141
+ } else {
142
+ consoleSandbox(() => {
143
+ console.warn(
144
+ `[Sentry] \`autoInjectServerSentry: '${moduleOptions.autoInjectServerSentry}'\` is deprecated and will be removed in a future major version. The Sentry server config is bundled into the Nitro server build by default now. Remove the option to use the default behavior.`
145
+ );
146
+ });
147
+ if (moduleOptions.autoInjectServerSentry === "top-level-import") {
148
+ if (!(isNitroV3 && nitro.options.dev)) {
149
+ addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);
150
+ }
151
+ addSentryTopImport(moduleOptions, nitro);
152
+ }
153
+ if (moduleOptions.autoInjectServerSentry === "experimental_dynamic-import") {
154
+ addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);
155
+ if (moduleOptions.debug) {
156
+ consoleSandbox(() => {
157
+ console.log(
158
+ "[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes."
159
+ );
160
+ });
161
+ }
178
162
  }
179
163
  }
180
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\n// Needed to make TS evaluate the augmentation of Nitro types (https://github.com/nuxt/nuxt/pull/34039)\nimport type {} from '@nuxt/nitro-server';\n\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport {\n addDevServerConfigFile,\n addDynamicImportEntryFileWrapper,\n addSentryTopImport,\n addServerConfigToBuild,\n DEV_SERVER_CONFIG_PATH,\n} from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupOrchestrion } from './vite/orchestrion';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport {\n addOTelCommonJSImportAlias,\n findDefaultSdkInitFile,\n getNitroMajorVersion,\n toImportSpecifier,\n} from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = await findDefaultSdkInitFile('client', nuxt, moduleOptions);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = await findDefaultSdkInitFile('server', nuxt, moduleOptions);\n const isNitroV3 = (await getNitroMajorVersion()) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n // Orchestrion runs on both the Node path (gated on a server config file) and the Cloudflare path\n // (which has no server config file — the SDK is set up via `sentryCloudflareNitroPlugin`). The\n // Cloudflare detection happens inside, keyed off the resolved Nitro preset.\n setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);\n\n if (serverConfigFile) {\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n\n // Outside `nitro:init` so that `nuxt prepare` writes the file before the first `nuxt dev`.\n if (isNitroV3) {\n addDevServerConfigFile(nuxt, serverConfigFile);\n }\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro);\n\n consoleSandbox(() => {\n const serverDir = nitro.options.output.serverDir;\n\n // Netlify env: https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n if (serverDir.includes('.netlify') || !!process.env.NETLIFY) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n\n // Vercel env: https://vercel.com/docs/projects/environment-variables/system-environment-variables#VERCEL\n if (serverDir.includes('.vercel') || !!process.env.VERCEL) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n });\n\n if (moduleOptions.autoInjectServerSentry !== 'experimental_dynamic-import') {\n // Nitro 3 (in Nuxt 5) is not bundled in dev mode. See `addDevServerConfigFile` for how we add the file now.\n if (!(isNitroV3 && nitro.options.dev)) {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n }\n\n if (moduleOptions.debug) {\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs');\n\n // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs\n const serverConfigRelativePath = toImportSpecifier(nitro.options.rootDir, serverConfigPath);\n const devConfigRelativePath = isNitroV3\n ? toImportSpecifier(nuxt.options.rootDir, path.join(nuxt.options.buildDir, DEV_SERVER_CONFIG_PATH))\n : serverConfigRelativePath;\n\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Using \\`${serverConfigFile}\\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`,\n );\n\n if (nitro.options.dev) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \\`NODE_OPTIONS='--import ${devConfigRelativePath}' nuxt dev\\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \\`nuxt prepare\\` to regenerate it.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] When running your built application, preload Sentry via a command-line flag (\\`node --import ${serverConfigRelativePath} [...]\\`) or via an environment variable (\\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\\`).`,\n );\n }\n });\n }\n }\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n });\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\n// Needed to make TS evaluate the augmentation of Nitro types (https://github.com/nuxt/nuxt/pull/34039)\nimport type {} from '@nuxt/nitro-server';\n\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport {\n addDynamicImportEntryFileWrapper,\n addServerConfigShimWithWarning,\n addSentryTopImport,\n addServerConfigPlugin,\n addServerConfigToBuild,\n} from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupOrchestrion } from './vite/orchestrion';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport { addOTelCommonJSImportAlias, findDefaultSdkInitFile, getNitroMajorVersion } from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n // oxlint-disable-next-line typescript/no-deprecated -- supported until removal\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n // oxlint-disable-next-line typescript/no-deprecated -- supported until removal\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = await findDefaultSdkInitFile('client', nuxt, moduleOptions);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = await findDefaultSdkInitFile('server', nuxt, moduleOptions);\n const isNitroV3 = (await getNitroMajorVersion(nuxt.options.rootDir)) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n // Orchestrion runs on both the Node path (gated on a server config file) and the Cloudflare path\n // (which has no server config file — the SDK is set up via `sentryCloudflareNitroPlugin`). The\n // Cloudflare detection happens inside, keyed off the resolved Nitro preset.\n setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);\n\n // The deprecated inject modes replace the default in-bundle initialization until their removal\n const usesDeprecatedInjectMode =\n moduleOptions.autoInjectServerSentry === 'top-level-import' ||\n moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import';\n\n if (serverConfigFile) {\n if (!usesDeprecatedInjectMode) {\n addServerConfigPlugin(nuxt, serverConfigFile);\n }\n\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro, isNitroV3);\n\n if (!usesDeprecatedInjectMode) {\n addServerConfigShimWithWarning(nitro);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Bundled \\`${serverConfigFile}\\` into the Nitro server build. The SDK initializes itself at server startup — no \\`node --import\\` preload needed.`,\n );\n });\n }\n } else {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] \\`autoInjectServerSentry: '${moduleOptions.autoInjectServerSentry}'\\` is deprecated and will be removed in a future major version. The Sentry server config is bundled into the Nitro server build by default now. Remove the option to use the default behavior.`,\n );\n });\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n // Nitro 3 (in Nuxt 5) is not bundled in dev mode, so there is no build to emit into.\n if (!(isNitroV3 && nitro.options.dev)) {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n }\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n }\n });\n },\n});\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"type":"module","version":"11.0.0-beta.1"}
1
+ {"type":"module","version":"11.0.0-beta.2"}
@@ -1,10 +1,22 @@
1
1
  import * as path from 'node:path';
2
- import { DEV_ENVIRONMENT, DEFAULT_ENVIRONMENT, applySdkMetadata, getGlobalScope, debug } from '@sentry/core';
2
+ import { debug, consoleSandbox, getClient, DEV_ENVIRONMENT, DEFAULT_ENVIRONMENT, applySdkMetadata, getGlobalScope } from '@sentry/core';
3
3
  import { init as init$1 } from '@sentry/node';
4
4
  import { DEBUG_BUILD } from '../common/debug-build.js';
5
- import { isNuxtDevRuntime } from '../common/devMode.js';
5
+ import { isNuxtPrerenderRuntime, isNuxtServerInitialized, isNuxtDevRuntime, markNuxtServerInitialized } from '../common/devMode.js';
6
6
 
7
7
  function init(options) {
8
+ if (isNuxtPrerenderRuntime()) {
9
+ DEBUG_BUILD && debug.log("Detected a Nitro prerender build. Skipping Sentry server initialization.");
10
+ return void 0;
11
+ }
12
+ if (isNuxtServerInitialized()) {
13
+ consoleSandbox(() => {
14
+ console.log(
15
+ "[Sentry] The Sentry server SDK is already initialized, skipping a second initialization. The Sentry server config is bundled into the Nitro server build, so a `node --import` preload of the config file is no longer needed and can be removed."
16
+ );
17
+ });
18
+ return getClient();
19
+ }
8
20
  let isDevBuild = false;
9
21
  isDevBuild = !!import.meta.dev;
10
22
  const envFallback = isDevBuild || isNuxtDevRuntime() ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;
@@ -14,6 +26,9 @@ function init(options) {
14
26
  };
15
27
  applySdkMetadata(sentryOptions, "nuxt", ["nuxt", "node"]);
16
28
  const client = init$1(sentryOptions);
29
+ if (client) {
30
+ markNuxtServerInitialized();
31
+ }
17
32
  getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));
18
33
  getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));
19
34
  return client;
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor } from '@sentry/core';\nimport { applySdkMetadata, debug, DEFAULT_ENVIRONMENT, DEV_ENVIRONMENT, getGlobalScope } from '@sentry/core';\nimport { init as initNode } from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport { isNuxtDevRuntime } from '../common/devMode';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n let isDevBuild = false;\n /*! rollup-include-esm-only */\n isDevBuild = !!import.meta.dev;\n /*! rollup-include-esm-only-end */\n\n // Nitro v3 does not bundle the Sentry server config file, so `import.meta.dev` stays undefined there\n const envFallback = isDevBuild || isNuxtDevRuntime() ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;\n\n const sentryOptions = {\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,\n ...options,\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {\n return event;\n }\n\n // Check if this looks like a parametrized route (contains :param or :param() patterns)\n const hasRouteParameters = /\\/:[^(/\\s]*(\\([^)]*\\))?[^/\\s]*/.test(event.transaction);\n\n if (hasRouteParameters) {\n return event;\n }\n\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\n/**\n * Checks if the event is a cache event.\n */\nfunction isCacheEvent(e: Event): boolean {\n return e.contexts?.trace?.origin === 'auto.cache.nuxt';\n}\n"],"names":["initNode"],"mappings":";;;;;;AAaO,SAAS,KAAK,OAAA,EAAsD;AACzE,EAAA,IAAI,UAAA,GAAa,KAAA;AAAA,EACjB,UAAA,GAAA,CAAA,CAAA,MAAA,CAAA,IAAA,CAAA,GAAA;AACA,EAAA,MAAA,WAAe,GAAA,UAAY,IAAA,gBAAA,EAAA,GAAA,eAAA,GAAA,mBAAA;AAAA,EAC3B,MAAA,aAAA,GAAA;AAGA,IAAA,WAAM,EAAA,OAAc,CAAA,WAAc,IAAA,OAAA,CAAA,GAAA,CAAA,kBAAqB,IAAA,WAAkB;AAEzE,IAAA,GAAA;AAAsB,GAAA;AACkD,EAAA,gBACnE,CAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA;AAAA,EACL,MAAA,MAAA,GAAAA,MAAA,CAAA,aAAA,CAAA;AAEA,EAAA,cAAA,EAAA,CAAiB,iBAAe,CAAA,4BAAwB,CAAA,OAAA,CAAA,CAAA;AAExD,EAAA,cAAM,oBAAkB,CAAA,0BAAa,CAAA,OAAA,CAAA,CAAA;AAErC,EAAA,OAAA,MAAA;AACA;AAEA,SAAO,4BAAA,CAAA,OAAA,EAAA;AACT,EAAA,OAAA,MAAA,CAAA,MAAA;AAQO,KAAA,CAAA,KAAA,KAAS;AACd,MAAA,IAAO,KAAA,CAAO,IAAA,KAAA,aAAA,IAAA,CAAA,KAAA,CAAA,WAAA,IAAA,YAAA,CAAA,KAAA,CAAA,EAAA;AAAA,QACX,OAAA,KAAS;AACR,MAAA;AACE,MAAA,MAAA,kBAAO,GAAA,gCAAA,CAAA,IAAA,CAAA,KAAA,CAAA,WAAA,CAAA;AAAA,MACT,IAAA,kBAAA,EAAA;AAGA,QAAA,OAAM,KAAA;AAEN,MAAA;AACE,MAAA,IAAA,IAAA,CAAO,OAAA,CAAA,KAAA,CAAA,WAAA,CAAA,EAAA;AAAA,QACT,OAAA,CAAA,KAAA,IAAA,WAAA,IAAA,KAAA,CAAA,GAAA,CAAA,yDAAA,EAAA,KAAA,CAAA,WAAA,CAAA;AAIA,QAAA,OAAS,IAAA;AACP,MAAA;AAGA,MAAA,OAAA,KAAO;AAAA,IAAA,CAAA;AAET,IAAA,EAAA,EAAA,EAAA,kCAAO;AAAA,GAAA;AACT;AAEF,SAAA,0BAAA,CAAA,OAAA,EAAA;AACF,EAAA,OAAA,MAAA,CAAA,MAAA;AAOO,KAAA,CAAA,KAAA,KAAS;AACd,MAAA,MAAO,QAAO,GAAA,KAAA,CAAA,SAAA,EAAA,MAAA,GAAA,CAAA,CAAA,EAAA,KAAA;AAAA,MACX,IAAA,QAAS,EAAA,KAAA,CAAA,mEAAA,CAAA,EAAA;AACR,QAAA,OAAM,CAAA,KAAA,IAAW,WAAM,IAAW,KAAA,CAAA,GAAS,CAAC,iDAAG,EAAA,QAAA,CAAA;AAC/C,QAAA,OAAI,IAAA;AACF,MAAA;AACA,MAAA,OAAA,KAAO;AAAA,IAAA,CAAA;AAET,IAAA,EAAA,EAAA,EAAA,gCAAO;AAAA,GAAA;AACT;AACuC,SACzC,YAAA,CAAA,CAAA,EAAA;AACF,EAAA,OAAA,CAAA,CAAA,QAAA,EAAA,KAAA,EAAA,MAAA,KAAA,iBAAA;AAKA;;;;"}
1
+ {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n debug,\n DEFAULT_ENVIRONMENT,\n DEV_ENVIRONMENT,\n getClient,\n getGlobalScope,\n} from '@sentry/core';\nimport { init as initNode } from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport {\n isNuxtDevRuntime,\n isNuxtPrerenderRuntime,\n isNuxtServerInitialized,\n markNuxtServerInitialized,\n} from '../common/devMode';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n // The prerenderer executes the server bundle (including nitro plugins) at build time (pollutes release health and adds build-time traces)\n if (isNuxtPrerenderRuntime()) {\n // potential follow-up: configurable with `capturePrerenderErrors`\n DEBUG_BUILD && debug.log('Detected a Nitro prerender build. Skipping Sentry server initialization.');\n return undefined;\n }\n\n // Since the server config is bundled into the Nitro build, a `node --import` preload of a config\n // file initializes the SDK a second time. The first init wins so a preload keeps its semantics.\n if (isNuxtServerInitialized()) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] The Sentry server SDK is already initialized, skipping a second initialization. The Sentry server config is bundled into the Nitro server build, so a `node --import` preload of the config file is no longer needed and can be removed.',\n );\n });\n return getClient();\n }\n\n let isDevBuild = false;\n /*! rollup-include-esm-only */\n isDevBuild = !!import.meta.dev;\n /*! rollup-include-esm-only-end */\n\n // `import.meta.dev` is only substituted when this file itself is bundled; the generated\n // runtime-flags module sets the global flag for the (usual) externalized case.\n const envFallback = isDevBuild || isNuxtDevRuntime() ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;\n\n const sentryOptions = {\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,\n ...options,\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n if (client) {\n markNuxtServerInitialized();\n }\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {\n return event;\n }\n\n // Check if this looks like a parametrized route (contains :param or :param() patterns)\n const hasRouteParameters = /\\/:[^(/\\s]*(\\([^)]*\\))?[^/\\s]*/.test(event.transaction);\n\n if (hasRouteParameters) {\n return event;\n }\n\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\n/**\n * Checks if the event is a cache event.\n */\nfunction isCacheEvent(e: Event): boolean {\n return e.contexts?.trace?.origin === 'auto.cache.nuxt';\n}\n"],"names":["initNode"],"mappings":"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"}