@sentry/nuxt 11.0.0-alpha.1 → 11.0.0-beta.0

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 (68) hide show
  1. package/README.md +5 -0
  2. package/build/cjs/common/devMode.js +12 -0
  3. package/build/cjs/common/devMode.js.map +1 -0
  4. package/build/cjs/module.js +9 -5
  5. package/build/cjs/module.js.map +1 -1
  6. package/build/cjs/server/sdk.js +2 -25
  7. package/build/cjs/server/sdk.js.map +1 -1
  8. package/build/cjs/vite/addServerConfig.js +33 -4
  9. package/build/cjs/vite/addServerConfig.js.map +1 -1
  10. package/build/cjs/vite/orchestrion.js +3 -0
  11. package/build/cjs/vite/orchestrion.js.map +1 -1
  12. package/build/cjs/vite/sourceMapDeletion.js +35 -0
  13. package/build/cjs/vite/sourceMapDeletion.js.map +1 -0
  14. package/build/cjs/vite/sourceMaps.js +13 -6
  15. package/build/cjs/vite/sourceMaps.js.map +1 -1
  16. package/build/cjs/vite/utils.js +7 -11
  17. package/build/cjs/vite/utils.js.map +1 -1
  18. package/build/esm/common/devMode.js +9 -0
  19. package/build/esm/common/devMode.js.map +1 -0
  20. package/build/esm/module.js +11 -7
  21. package/build/esm/module.js.map +1 -1
  22. package/build/esm/package.json +1 -1
  23. package/build/esm/server/sdk.js +6 -27
  24. package/build/esm/server/sdk.js.map +1 -1
  25. package/build/esm/vite/addServerConfig.js +31 -4
  26. package/build/esm/vite/addServerConfig.js.map +1 -1
  27. package/build/esm/vite/orchestrion.js +3 -0
  28. package/build/esm/vite/orchestrion.js.map +1 -1
  29. package/build/esm/vite/sourceMapDeletion.js +32 -0
  30. package/build/esm/vite/sourceMapDeletion.js.map +1 -0
  31. package/build/esm/vite/sourceMaps.js +13 -6
  32. package/build/esm/vite/sourceMaps.js.map +1 -1
  33. package/build/esm/vite/utils.js +6 -12
  34. package/build/esm/vite/utils.js.map +1 -1
  35. package/build/module/common/devMode.d.ts +4 -0
  36. package/build/module/common/types.d.ts +0 -9
  37. package/build/module/module.json +1 -1
  38. package/build/module/module.mjs +87 -25
  39. package/build/module/runtime/hooks/captureErrorHook.js +2 -1
  40. package/build/module/runtime/hooks/wrapMiddlewareHandler.js +6 -5
  41. package/build/module/runtime/utils/instrumentDatabase.js +26 -6
  42. package/build/module/runtime/utils/instrumentStorage.js +21 -15
  43. package/build/module/runtime/utils/patchEventHandler.js +2 -1
  44. package/build/module/vite/addServerConfig.d.ts +9 -0
  45. package/build/module/vite/sourceMapDeletion.d.ts +3 -0
  46. package/build/module/vite/utils.d.ts +3 -1
  47. package/build/types/common/devMode.d.ts +5 -0
  48. package/build/types/common/devMode.d.ts.map +1 -0
  49. package/build/types/common/types.d.ts +0 -9
  50. package/build/types/common/types.d.ts.map +1 -1
  51. package/build/types/index.types.d.ts +3 -1
  52. package/build/types/index.types.d.ts.map +1 -1
  53. package/build/types/module.d.ts.map +1 -1
  54. package/build/types/runtime/hooks/captureErrorHook.d.ts.map +1 -1
  55. package/build/types/runtime/hooks/wrapMiddlewareHandler.d.ts.map +1 -1
  56. package/build/types/runtime/utils/instrumentDatabase.d.ts.map +1 -1
  57. package/build/types/runtime/utils/instrumentStorage.d.ts.map +1 -1
  58. package/build/types/runtime/utils/patchEventHandler.d.ts.map +1 -1
  59. package/build/types/server/sdk.d.ts.map +1 -1
  60. package/build/types/vite/addServerConfig.d.ts +9 -0
  61. package/build/types/vite/addServerConfig.d.ts.map +1 -1
  62. package/build/types/vite/orchestrion.d.ts.map +1 -1
  63. package/build/types/vite/sourceMapDeletion.d.ts +4 -0
  64. package/build/types/vite/sourceMapDeletion.d.ts.map +1 -0
  65. package/build/types/vite/sourceMaps.d.ts.map +1 -1
  66. package/build/types/vite/utils.d.ts +3 -1
  67. package/build/types/vite/utils.d.ts.map +1 -1
  68. package/package.json +11 -9
@@ -1 +1 @@
1
- {"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createResolver } from '@nuxt/kit';\nimport { debug } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport type { InputPluginOption } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application.\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.rootDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, isDebug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (isDebug) {\n debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":["nitro","debug"],"mappings":"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"}
1
+ {"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { pathToFileURL } from 'node:url';\nimport { addTemplate, createResolver } from '@nuxt/kit';\nimport type { Nuxt } from '@nuxt/schema';\nimport { debug } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport * as path from 'path';\nimport type { InputPluginOption } from 'rollup';\nimport { NUXT_DEV_MODE_FLAG } from '../common/devMode';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n SERVER_CONFIG_FILENAME,\n toImportSpecifier,\n} from './utils';\n\n/** Path of the generated dev-mode config file, relative to the Nuxt build directory. */\nexport const DEV_SERVER_CONFIG_PATH = `dev/${SERVER_CONFIG_FILENAME}.mjs`;\n\n/**\n * Writes the file users preload with `node --import` to enable Sentry in `nuxt dev` (for Nuxt 5 with Nitro 3).\n *\n * In dev-mode, Nitro v3 has no server bundle to emit into, so Node loads the server config file as it is written.\n */\nexport function addDevServerConfigFile(nuxt: Nuxt, serverConfigFile: string): void {\n const configPath = createResolver(nuxt.options.rootDir).resolve(`/${serverConfigFile}`);\n const importSpecifier = toImportSpecifier(\n nuxt.options.rootDir,\n path.join(nuxt.options.buildDir, DEV_SERVER_CONFIG_PATH),\n );\n\n const failureMessage =\n `[Sentry] Could not load \\`${path.basename(configPath)}\\`, so Sentry is disabled during development. ` +\n 'Node loads this file without a build step, so it supports neither path aliases (like #import) nor non-erasable TypeScript syntax (like enums).';\n\n addTemplate({\n filename: DEV_SERVER_CONFIG_PATH,\n write: true,\n getContents: () =>\n [\n '// Generated by @sentry/nuxt. Preload it to enable Sentry during development:',\n `// NODE_OPTIONS='--import ${importSpecifier}' nuxt dev`,\n // A static import would hoist above this assignment, and would make a broken config crash the dev server.\n `globalThis.${NUXT_DEV_MODE_FLAG} = true;`,\n 'try {',\n ` await import(${JSON.stringify(pathToFileURL(configPath).href)});`,\n '} catch (error) {',\n ` console.warn(${JSON.stringify(failureMessage)}, error);`,\n '}',\n '',\n ].join('\\n'),\n });\n}\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application.\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.rootDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, isDebug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (isDebug) {\n debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":["nitro","debug"],"mappings":"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"}
@@ -10,6 +10,9 @@ function setupOrchestrion(nuxt, hasServerConfig, buildTimeInstrumentation) {
10
10
  if (nuxt.options?._prepare) {
11
11
  return;
12
12
  }
13
+ if (nuxt.options?.dev) {
14
+ return;
15
+ }
13
16
  const isCloudflare = !!nitroConfig.preset?.replace(/-/g, "_").startsWith("cloudflare");
14
17
  if (!hasServerConfig && !isCloudflare) {
15
18
  return;
@@ -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 // 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":[],"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;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,CAAK,uBAAA,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,GAAG,yBAAA,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';\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":[],"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,CAAK,uBAAA,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,GAAG,yBAAA,EAA2B,GAAG,mBAAmB,CAAC,CAAC,CAAA;AAAA,EAC3G,CAAC,CAAA;AACH;;;;"}
@@ -0,0 +1,32 @@
1
+ import { createSentryBuildPluginManager } from '@sentry/bundler-plugins/core';
2
+
3
+ function withoutSourceMapDeletion(options) {
4
+ return {
5
+ ...options,
6
+ sourcemaps: {
7
+ ...options.sourcemaps,
8
+ filesToDeleteAfterUpload: void 0
9
+ }
10
+ };
11
+ }
12
+ async function deleteSourceMapsAfterBuild(options) {
13
+ const filesToDeleteAfterUpload = await options.sourcemaps?.filesToDeleteAfterUpload;
14
+ if (filesToDeleteAfterUpload === void 0) {
15
+ return;
16
+ }
17
+ const deletionOptions = {
18
+ ...options,
19
+ sourcemaps: {
20
+ ...options.sourcemaps,
21
+ filesToDeleteAfterUpload
22
+ }
23
+ };
24
+ const sentryBuildPluginManager = createSentryBuildPluginManager(deletionOptions, {
25
+ buildTool: "nuxt",
26
+ loggerPrefix: "[Sentry Nuxt]"
27
+ });
28
+ await sentryBuildPluginManager.deleteArtifacts();
29
+ }
30
+
31
+ export { deleteSourceMapsAfterBuild, withoutSourceMapDeletion };
32
+ //# sourceMappingURL=sourceMapDeletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceMapDeletion.js","sources":["../../../src/vite/sourceMapDeletion.ts"],"sourcesContent":["import { createSentryBuildPluginManager, type Options } from '@sentry/bundler-plugins/core';\n\nexport function withoutSourceMapDeletion(options: Options): Options {\n return {\n ...options,\n sourcemaps: {\n ...options.sourcemaps,\n filesToDeleteAfterUpload: undefined,\n },\n };\n}\n\nexport async function deleteSourceMapsAfterBuild(options: Options): Promise<void> {\n const filesToDeleteAfterUpload = await options.sourcemaps?.filesToDeleteAfterUpload;\n\n if (filesToDeleteAfterUpload === undefined) {\n return;\n }\n\n const deletionOptions: Options = {\n ...options,\n sourcemaps: {\n ...options.sourcemaps,\n filesToDeleteAfterUpload,\n },\n };\n\n const sentryBuildPluginManager = createSentryBuildPluginManager(deletionOptions, {\n buildTool: 'nuxt',\n loggerPrefix: '[Sentry Nuxt]',\n });\n\n await sentryBuildPluginManager.deleteArtifacts();\n}\n"],"names":[],"mappings":";;AAEO,SAAS,yBAAyB,OAAA,EAA2B;AAClE,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,GAAG,OAAA,CAAQ,UAAA;AAAA,MACX,wBAAA,EAA0B;AAAA;AAC5B,GACF;AACF;AAEA,eAAsB,2BAA2B,OAAA,EAAiC;AAChF,EAAA,MAAM,wBAAA,GAA2B,MAAM,OAAA,CAAQ,UAAA,EAAY,wBAAA;AAE3D,EAAA,IAAI,6BAA6B,MAAA,EAAW;AAC1C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAA2B;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV,GAAG,OAAA,CAAQ,UAAA;AAAA,MACX;AAAA;AACF,GACF;AAEA,EAAA,MAAM,wBAAA,GAA2B,+BAA+B,eAAA,EAAiB;AAAA,IAC/E,SAAA,EAAW,MAAA;AAAA,IACX,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,MAAM,yBAAyB,eAAA,EAAgB;AACjD;;;;"}
@@ -1,8 +1,11 @@
1
1
  import { sentryRollupPlugin } from '@sentry/bundler-plugins/rollup';
2
2
  import { sentryVitePlugin } from '@sentry/bundler-plugins/vite';
3
+ import { warnOnRemovedBuildOptions } from '@sentry/core';
4
+ import { withoutSourceMapDeletion, deleteSourceMapsAfterBuild } from './sourceMapDeletion.js';
3
5
  import { validateSourceMapsOptionsPlugin } from './sentryVitePlugin.js';
4
6
 
5
7
  function setupSourceMaps(moduleOptions, nuxt, addVitePlugin) {
8
+ warnOnRemovedBuildOptions(moduleOptions, ["unstable_sentryBundlerPluginOptions"]);
6
9
  const isDebug = moduleOptions.debug;
7
10
  const sourceMapsEnabled = moduleOptions.sourcemaps?.disable !== true;
8
11
  const shouldDeleteFilesFallback = { client: true, server: true };
@@ -30,7 +33,7 @@ function setupSourceMaps(moduleOptions, nuxt, addVitePlugin) {
30
33
  [
31
34
  validateSourceMapsOptionsPlugin({ nuxt, moduleOptions, sourceMapsEnabled }),
32
35
  // Vite plugin is added on the client and server side (plugin runs for both builds)
33
- ...sentryVitePlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback))
36
+ ...sentryVitePlugin(withoutSourceMapDeletion(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)))
34
37
  ],
35
38
  { dev: false, build: true }
36
39
  // Only add source map plugin during build
@@ -49,10 +52,15 @@ function setupSourceMaps(moduleOptions, nuxt, addVitePlugin) {
49
52
  console.log("[Sentry] Adding Sentry Rollup plugin to the server runtime.");
50
53
  }
51
54
  nitroConfig.rollupConfig.plugins.push(
52
- sentryRollupPlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback))
55
+ sentryRollupPlugin(withoutSourceMapDeletion(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)))
53
56
  );
54
57
  }
55
58
  });
59
+ nuxt.hook("close", async () => {
60
+ if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {
61
+ await deleteSourceMapsAfterBuild(getPluginOptions(moduleOptions, shouldDeleteFilesFallback));
62
+ }
63
+ });
56
64
  }
57
65
  function normalizePath(path) {
58
66
  return path.replace(/^(\.\.\/)+/, "./");
@@ -76,15 +84,14 @@ function getPluginOptions(moduleOptions, shouldDeleteFilesFallback) {
76
84
  release: {
77
85
  name: moduleOptions.release?.name,
78
86
  // Support all release options from BuildTimeOptionsBase
79
- ...moduleOptions.release,
80
- ...moduleOptions?.unstable_sentryBundlerPluginOptions?.release
87
+ ...moduleOptions.release
81
88
  },
89
+ moduleMetadata: moduleOptions.moduleMetadata,
82
90
  _metaOptions: {
83
91
  telemetry: {
84
92
  metaFramework: "nuxt"
85
93
  }
86
94
  },
87
- ...moduleOptions?.unstable_sentryBundlerPluginOptions,
88
95
  sourcemaps: {
89
96
  disable: moduleOptions.sourcemaps?.disable,
90
97
  // The server/client files are in different places depending on the nitro preset (e.g. '.output/server' or '.netlify/functions-internal/server')
@@ -94,7 +101,7 @@ function getPluginOptions(moduleOptions, shouldDeleteFilesFallback) {
94
101
  ignore: sourcemapsOptions.ignore ?? void 0,
95
102
  filesToDeleteAfterUpload,
96
103
  rewriteSources: sourcemapsOptions.rewriteSources ?? normalizePath,
97
- ...moduleOptions?.unstable_sentryBundlerPluginOptions?.sourcemaps
104
+ resolveSourceMap: sourcemapsOptions.resolveSourceMap
98
105
  }
99
106
  };
100
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { sentryRollupPlugin, type SentryRollupPluginOptions } from '@sentry/bundler-plugins/rollup';\nimport { sentryVitePlugin, type SentryVitePluginOptions } from '@sentry/bundler-plugins/vite';\nimport type { NitroConfig } from 'nitropack';\nimport type { Plugin } from 'vite';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport { validateSourceMapsOptionsPlugin } from './sentryVitePlugin';\n\n/**\n * Whether the user enabled (true, 'hidden', 'inline') or disabled (false) source maps\n */\nexport type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;\n\n/** A valid source map setting */\nexport type SourceMapSetting = boolean | 'hidden' | 'inline';\n\n/**\n * Setup source maps for Sentry inside the Nuxt module during build time (in Vite for Nuxt and Rollup for Nitro).\n */\nexport function setupSourceMaps(\n moduleOptions: SentryNuxtModuleOptions,\n nuxt: Nuxt,\n addVitePlugin: (plugin: Plugin[], options?: { dev?: boolean; build?: boolean }) => void,\n): void {\n const isDebug = moduleOptions.debug;\n\n const sourceMapsEnabled = moduleOptions.sourcemaps?.disable !== true;\n\n // In case we overwrite the source map settings, we default to deleting the files\n const shouldDeleteFilesFallback = { client: true, server: true };\n\n nuxt.hook('modules:done', () => {\n if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {\n // Changing this setting will propagate:\n // - for client to viteConfig.build.sourceMap\n // - for server to viteConfig.build.sourceMap and nitro.sourceMap\n // On server, nitro.rollupConfig.output.sourcemap remains unaffected from this change.\n\n // ONLY THIS nuxt.sourcemap.(server/client) setting is the one Sentry will overwrite with 'hidden', if needed.\n const previousSourceMapSettings = changeNuxtSourceMapSettings(nuxt, moduleOptions);\n\n // Mutate in place so the Vite plugin (which captured this object at registration time) sees the updated values\n shouldDeleteFilesFallback.client = previousSourceMapSettings.client === 'unset';\n shouldDeleteFilesFallback.server = previousSourceMapSettings.server === 'unset';\n\n if (isDebug && (shouldDeleteFilesFallback.client || shouldDeleteFilesFallback.server)) {\n const enabledDeleteFallbacks =\n shouldDeleteFilesFallback.client && shouldDeleteFilesFallback.server\n ? 'client-side and server-side'\n : shouldDeleteFilesFallback.server\n ? 'server-side'\n : 'client-side';\n\n if (!moduleOptions.sourcemaps?.filesToDeleteAfterUpload) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We enabled \\`'hidden'\\` source maps for your ${enabledDeleteFallbacks} build. Source map files will be automatically deleted after uploading them to Sentry.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We enabled \\`'hidden'\\` source maps for your ${enabledDeleteFallbacks} build. Source map files will be deleted according to your \\`sourcemaps.filesToDeleteAfterUpload\\` configuration. To use automatic deletion instead, leave \\`filesToDeleteAfterUpload\\` empty.`,\n );\n }\n }\n }\n });\n\n if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {\n addVitePlugin(\n [\n validateSourceMapsOptionsPlugin({ nuxt, moduleOptions, sourceMapsEnabled }),\n // Vite plugin is added on the client and server side (plugin runs for both builds)\n ...sentryVitePlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)),\n ],\n { dev: false, build: true }, // Only add source map plugin during build\n );\n }\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (sourceMapsEnabled && !nitroConfig.dev && !nuxt.options?._prepare) {\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 // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n validateNitroSourceMapSettings(nuxt, nitroConfig, moduleOptions);\n\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.log('[Sentry] Adding Sentry Rollup plugin to the server runtime.');\n }\n\n // Add Sentry plugin\n // Runs only on server-side (Nitro)\n nitroConfig.rollupConfig.plugins.push(\n sentryRollupPlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)),\n );\n }\n });\n}\n\n/**\n * Normalizes the beginning of a path from e.g. ../../../ to ./\n */\nfunction normalizePath(path: string): string {\n return path.replace(/^(\\.\\.\\/)+/, './');\n}\n\n/**\n * Generates source maps upload options for the Sentry Vite and Rollup plugin.\n *\n * Only exported for Testing purposes.\n */\nexport function getPluginOptions(\n moduleOptions: SentryNuxtModuleOptions,\n shouldDeleteFilesFallback?: { client: boolean; server: boolean },\n): SentryVitePluginOptions | SentryRollupPluginOptions {\n const sourcemapsOptions = moduleOptions.sourcemaps || {};\n const filesToDeleteAfterUpload = resolveFilesToDeleteAfterUpload(moduleOptions, shouldDeleteFilesFallback);\n\n return {\n applicationKey: moduleOptions.applicationKey,\n org: moduleOptions.org ?? process.env.SENTRY_ORG,\n project: moduleOptions.project ?? process.env.SENTRY_PROJECT,\n authToken: moduleOptions.authToken ?? process.env.SENTRY_AUTH_TOKEN,\n telemetry: moduleOptions.telemetry ?? true,\n url: moduleOptions.sentryUrl ?? process.env.SENTRY_URL,\n headers: moduleOptions.headers,\n debug: moduleOptions.debug ?? false,\n silent: moduleOptions.silent ?? false,\n errorHandler: moduleOptions.errorHandler,\n bundleSizeOptimizations: moduleOptions.bundleSizeOptimizations, // todo: test if this can be overridden by the user\n release: {\n name: moduleOptions.release?.name,\n // Support all release options from BuildTimeOptionsBase\n ...moduleOptions.release,\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.release,\n },\n _metaOptions: {\n telemetry: {\n metaFramework: 'nuxt',\n },\n },\n ...moduleOptions?.unstable_sentryBundlerPluginOptions,\n\n sourcemaps: {\n disable: moduleOptions.sourcemaps?.disable,\n // The server/client files are in different places depending on the nitro preset (e.g. '.output/server' or '.netlify/functions-internal/server')\n // We cannot determine automatically how the build folder looks like (depends on the preset), so we have to accept that source maps are uploaded multiple times (with the vitePlugin for Nuxt and the rollupPlugin for Nitro).\n // If we could know where the server/client assets are located, we could do something like this (based on the Nitro preset): isNitro ? ['./.output/server/**/*'] : ['./.output/public/**/*'],\n assets: sourcemapsOptions.assets ?? undefined,\n ignore: sourcemapsOptions.ignore ?? undefined,\n filesToDeleteAfterUpload,\n rewriteSources: sourcemapsOptions.rewriteSources ?? normalizePath,\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.sourcemaps,\n },\n };\n}\n\n/**\n * Determines which files to delete after upload. If the user set `filesToDeleteAfterUpload`, we use\n * that. Otherwise we only delete the source maps Sentry generated itself — i.e. the sides\n * (client/server) whose `sourcemap` setting resolved to `undefined`, where Sentry stepped in and\n * enabled `'hidden'`. Given Nuxt's default of `{ server: true, client: false }`, this isn't the\n * default case: it only kicks in when a side is left `undefined` (whole config or a single sub-key).\n * @see https://nuxt.com/docs/4.x/api/nuxt-config#sourcemap\n */\nfunction resolveFilesToDeleteAfterUpload(\n moduleOptions: SentryNuxtModuleOptions,\n shouldDeleteFilesFallback?: { client: boolean; server: boolean },\n): string | Array<string> | undefined {\n const shouldDeleteFilesAfterUpload = shouldDeleteFilesFallback?.client || shouldDeleteFilesFallback?.server;\n const fallbackFilesToDelete = [\n ...(shouldDeleteFilesFallback?.client ? ['.*/**/public/**/*.map'] : []),\n ...(shouldDeleteFilesFallback?.server\n ? ['.*/**/server/**/*.map', '.*/**/output/**/*.map', '.*/**/function/**/*.map']\n : []),\n ];\n\n const filesToDeleteAfterUpload = moduleOptions.sourcemaps?.filesToDeleteAfterUpload;\n\n if (typeof filesToDeleteAfterUpload === 'undefined' && shouldDeleteFilesAfterUpload && moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Setting \\`sentry.sourcemaps.filesToDeleteAfterUpload: [${fallbackFilesToDelete\n // Logging it as strings in the array\n .map(path => `\"${path}\"`)\n .join(', ')}]\\` to delete generated source maps after they were uploaded to Sentry.`,\n );\n }\n\n return filesToDeleteAfterUpload\n ? filesToDeleteAfterUpload\n : shouldDeleteFilesAfterUpload\n ? fallbackFilesToDelete\n : undefined;\n}\n\n/* There are multiple ways to set up source maps (https://github.com/getsentry/sentry-javascript/issues/13993 and https://github.com/getsentry/sentry-javascript/pull/15859)\n 1. User explicitly disabled source maps\n - keep this setting (emit a warning that errors won't be unminified in Sentry)\n - We will not upload anything\n 2. users enabled source map generation (true, hidden, inline).\n - keep this setting (don't do anything - like deletion - besides uploading)\n 3. users did not set source maps generation\n - we enable 'hidden' source maps generation\n - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n\n Users only have to explicitly enable client source maps. Sentry only overwrites the base Nuxt source map settings as they propagate.\n */\n\n/** only exported for tests */\nexport function extractNuxtSourceMapSetting(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting; client?: SourceMapSetting } } },\n runtime: 'client' | 'server' | undefined,\n): SourceMapSetting | undefined {\n if (!runtime) {\n return undefined;\n } else {\n return typeof nuxt.options?.sourcemap === 'boolean' || typeof nuxt.options?.sourcemap === 'string'\n ? nuxt.options.sourcemap\n : nuxt.options?.sourcemap?.[runtime];\n }\n}\n\n/** only exported for testing */\nexport function changeNuxtSourceMapSettings(\n nuxt: Nuxt,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): { client: UserSourceMapSetting; server: UserSourceMapSetting } {\n nuxt.options.sourcemap = nuxt.options.sourcemap ?? { server: undefined, client: undefined };\n\n let previousUserSourceMapSetting: { client: UserSourceMapSetting; server: UserSourceMapSetting } = {\n client: undefined,\n server: undefined,\n };\n\n const nuxtSourceMap = nuxt.options.sourcemap;\n const isDebug = sentryModuleOptions.debug;\n\n if (typeof nuxtSourceMap === 'string' || typeof nuxtSourceMap === 'boolean' || typeof nuxtSourceMap === 'undefined') {\n switch (nuxtSourceMap) {\n case false:\n warnExplicitlyDisabledSourceMap('sourcemap', isDebug);\n previousUserSourceMapSetting = { client: 'disabled', server: 'disabled' };\n break;\n\n case 'hidden':\n case true:\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap', (nuxtSourceMap as true).toString());\n previousUserSourceMapSetting = { client: 'enabled', server: 'enabled' };\n break;\n case undefined:\n nuxt.options.sourcemap = { server: 'hidden', client: 'hidden' };\n isDebug && logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n isDebug && logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting = { client: 'unset', server: 'unset' };\n break;\n }\n } else {\n if (nuxtSourceMap.client === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.client', isDebug);\n previousUserSourceMapSetting.client = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.client)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.client', nuxtSourceMap.client.toString());\n previousUserSourceMapSetting.client = 'enabled';\n } else {\n nuxt.options.sourcemap.client = 'hidden';\n isDebug && logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n previousUserSourceMapSetting.client = 'unset';\n }\n\n if (nuxtSourceMap.server === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.server', isDebug);\n previousUserSourceMapSetting.server = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.server)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.server', nuxtSourceMap.server.toString());\n previousUserSourceMapSetting.server = 'enabled';\n } else {\n nuxt.options.sourcemap.server = 'hidden';\n isDebug && logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting.server = 'unset';\n }\n }\n\n return previousUserSourceMapSetting;\n}\n\n/** Logs warnings about potentially conflicting source map settings.\n * Configures `sourcemapExcludeSources` in Nitro to make source maps usable in Sentry.\n *\n * only exported for testing\n */\nexport function validateNitroSourceMapSettings(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting } } },\n nitroConfig: NitroConfig,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): void {\n const isDebug = sentryModuleOptions.debug;\n const nuxtSourceMap = extractNuxtSourceMapSetting(nuxt, 'server');\n\n // NITRO CONFIG ---\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: 'nitro.sourceMap',\n otherSettingValue: nitroConfig.sourceMap,\n });\n\n // ROLLUP CONFIG ---\n\n nitroConfig.rollupConfig = nitroConfig.rollupConfig || {};\n nitroConfig.rollupConfig.output = nitroConfig.rollupConfig.output || { sourcemap: undefined };\n const nitroRollupSourceMap = nitroConfig.rollupConfig.output.sourcemap;\n\n // We don't override nitro.rollupConfig.output.sourcemap (undefined by default, but overrides all other server-side source map settings)\n if (typeof nitroRollupSourceMap !== 'undefined' && ['hidden', 'inline', true, false].includes(nitroRollupSourceMap)) {\n const settingKey = 'nitro.rollupConfig.output.sourcemap';\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: settingKey,\n otherSettingValue: nitroRollupSourceMap,\n });\n }\n\n nitroConfig.rollupConfig.output.sourcemapExcludeSources = false;\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Set `sourcemapExcludeSources: false` in the Nuxt config (`nitro.rollupConfig.output`). Source maps will now include the actual code to be able to un-minify code snippets in Sentry.',\n );\n }\n}\n\n/**\n * Validates that source map settings are consistent between Nuxt and Vite/Nitro configurations.\n * Logs a warning if conflicting settings are detected.\n *\n * @internal Only exported for testing.\n */\nexport function validateDifferentSourceMapSettings({\n nuxtSettingKey,\n nuxtSettingValue,\n otherSettingKey,\n otherSettingValue,\n}: {\n nuxtSettingKey: string;\n nuxtSettingValue?: SourceMapSetting;\n otherSettingKey: string;\n otherSettingValue?: SourceMapSetting;\n}): void {\n if (nuxtSettingValue !== otherSettingValue) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation settings are conflicting. Sentry uses \\`${nuxtSettingKey}: ${nuxtSettingValue}\\`. However, a conflicting setting was discovered (\\`${otherSettingKey}: ${otherSettingValue}\\`). This setting was probably explicitly set in your configuration. Sentry won't override this setting but it may affect source maps generation and upload. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n }\n}\n\nfunction logKeepEnabledSourceMapSetting(\n sentryNuxtModuleOptions: SentryNuxtModuleOptions,\n settingKey: string,\n settingValue: string,\n): void {\n if (sentryNuxtModuleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] \\`${settingKey}\\` is enabled with \\`${settingValue}\\`. This will correctly un-minify the code snippet on the Sentry Issue Details page.`,\n );\n }\n}\n\nfunction warnExplicitlyDisabledSourceMap(settingKey: string, isDebug: boolean | undefined): void {\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your Vite configuration (\\`${settingKey}: false \\`). This setting is either a default setting or was explicitly set in your configuration. Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified. To show unminified code, enable source maps in \\`${settingKey}\\` (e.g. by setting them to \\`hidden\\`).`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] Source map generation (\\`${settingKey}\\`) is disabled in your Vite configuration.`);\n }\n}\n\nfunction logSentryEnablesSourceMap(settingKey: string, settingValue: string): void {\n // eslint-disable-next-line no-console\n console.log(`[Sentry] Enabled source map generation in the build options with \\`${settingKey}: ${settingValue}\\`.`);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { sentryRollupPlugin, type SentryRollupPluginOptions } from '@sentry/bundler-plugins/rollup';\nimport { sentryVitePlugin, type SentryVitePluginOptions } from '@sentry/bundler-plugins/vite';\nimport { warnOnRemovedBuildOptions } from '@sentry/core';\nimport type { NitroConfig } from 'nitropack';\nimport type { Plugin } from 'vite';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport { deleteSourceMapsAfterBuild, withoutSourceMapDeletion } from './sourceMapDeletion';\nimport { validateSourceMapsOptionsPlugin } from './sentryVitePlugin';\n\n/**\n * Whether the user enabled (true, 'hidden', 'inline') or disabled (false) source maps\n */\nexport type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;\n\n/** A valid source map setting */\nexport type SourceMapSetting = boolean | 'hidden' | 'inline';\n\n/**\n * Setup source maps for Sentry inside the Nuxt module during build time (in Vite for Nuxt and Rollup for Nitro).\n */\nexport function setupSourceMaps(\n moduleOptions: SentryNuxtModuleOptions,\n nuxt: Nuxt,\n addVitePlugin: (plugin: Plugin[], options?: { dev?: boolean; build?: boolean }) => void,\n): void {\n // Warn here rather than in `getPluginOptions`, which runs once per bundler (Vite and Nitro's\n // Rollup) and would emit the same warning twice.\n warnOnRemovedBuildOptions(moduleOptions, ['unstable_sentryBundlerPluginOptions']);\n\n const isDebug = moduleOptions.debug;\n\n const sourceMapsEnabled = moduleOptions.sourcemaps?.disable !== true;\n\n // In case we overwrite the source map settings, we default to deleting the files\n const shouldDeleteFilesFallback = { client: true, server: true };\n\n nuxt.hook('modules:done', () => {\n if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {\n // Changing this setting will propagate:\n // - for client to viteConfig.build.sourceMap\n // - for server to viteConfig.build.sourceMap and nitro.sourceMap\n // On server, nitro.rollupConfig.output.sourcemap remains unaffected from this change.\n\n // ONLY THIS nuxt.sourcemap.(server/client) setting is the one Sentry will overwrite with 'hidden', if needed.\n const previousSourceMapSettings = changeNuxtSourceMapSettings(nuxt, moduleOptions);\n\n // Mutate in place so the Vite plugin (which captured this object at registration time) sees the updated values\n shouldDeleteFilesFallback.client = previousSourceMapSettings.client === 'unset';\n shouldDeleteFilesFallback.server = previousSourceMapSettings.server === 'unset';\n\n if (isDebug && (shouldDeleteFilesFallback.client || shouldDeleteFilesFallback.server)) {\n const enabledDeleteFallbacks =\n shouldDeleteFilesFallback.client && shouldDeleteFilesFallback.server\n ? 'client-side and server-side'\n : shouldDeleteFilesFallback.server\n ? 'server-side'\n : 'client-side';\n\n if (!moduleOptions.sourcemaps?.filesToDeleteAfterUpload) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We enabled \\`'hidden'\\` source maps for your ${enabledDeleteFallbacks} build. Source map files will be automatically deleted after uploading them to Sentry.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We enabled \\`'hidden'\\` source maps for your ${enabledDeleteFallbacks} build. Source map files will be deleted according to your \\`sourcemaps.filesToDeleteAfterUpload\\` configuration. To use automatic deletion instead, leave \\`filesToDeleteAfterUpload\\` empty.`,\n );\n }\n }\n }\n });\n\n if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {\n addVitePlugin(\n [\n validateSourceMapsOptionsPlugin({ nuxt, moduleOptions, sourceMapsEnabled }),\n // Vite plugin is added on the client and server side (plugin runs for both builds)\n ...sentryVitePlugin(withoutSourceMapDeletion(getPluginOptions(moduleOptions, shouldDeleteFilesFallback))),\n ],\n { dev: false, build: true }, // Only add source map plugin during build\n );\n }\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (sourceMapsEnabled && !nitroConfig.dev && !nuxt.options?._prepare) {\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 // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n validateNitroSourceMapSettings(nuxt, nitroConfig, moduleOptions);\n\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.log('[Sentry] Adding Sentry Rollup plugin to the server runtime.');\n }\n\n // Add Sentry plugin\n // Runs only on server-side (Nitro)\n nitroConfig.rollupConfig.plugins.push(\n sentryRollupPlugin(withoutSourceMapDeletion(getPluginOptions(moduleOptions, shouldDeleteFilesFallback))),\n );\n }\n });\n\n nuxt.hook('close', async () => {\n if (sourceMapsEnabled && !nuxt.options.dev && !nuxt.options?._prepare) {\n await deleteSourceMapsAfterBuild(getPluginOptions(moduleOptions, shouldDeleteFilesFallback));\n }\n });\n}\n\n/**\n * Normalizes the beginning of a path from e.g. ../../../ to ./\n */\nfunction normalizePath(path: string): string {\n return path.replace(/^(\\.\\.\\/)+/, './');\n}\n\n/**\n * Generates source maps upload options for the Sentry Vite and Rollup plugin.\n *\n * Only exported for Testing purposes.\n */\nexport function getPluginOptions(\n moduleOptions: SentryNuxtModuleOptions,\n shouldDeleteFilesFallback?: { client: boolean; server: boolean },\n): SentryVitePluginOptions | SentryRollupPluginOptions {\n const sourcemapsOptions = moduleOptions.sourcemaps || {};\n const filesToDeleteAfterUpload = resolveFilesToDeleteAfterUpload(moduleOptions, shouldDeleteFilesFallback);\n\n return {\n applicationKey: moduleOptions.applicationKey,\n org: moduleOptions.org ?? process.env.SENTRY_ORG,\n project: moduleOptions.project ?? process.env.SENTRY_PROJECT,\n authToken: moduleOptions.authToken ?? process.env.SENTRY_AUTH_TOKEN,\n telemetry: moduleOptions.telemetry ?? true,\n url: moduleOptions.sentryUrl ?? process.env.SENTRY_URL,\n headers: moduleOptions.headers,\n debug: moduleOptions.debug ?? false,\n silent: moduleOptions.silent ?? false,\n errorHandler: moduleOptions.errorHandler,\n bundleSizeOptimizations: moduleOptions.bundleSizeOptimizations, // todo: test if this can be overridden by the user\n release: {\n name: moduleOptions.release?.name,\n // Support all release options from BuildTimeOptionsBase\n ...moduleOptions.release,\n },\n moduleMetadata: moduleOptions.moduleMetadata,\n _metaOptions: {\n telemetry: {\n metaFramework: 'nuxt',\n },\n },\n\n sourcemaps: {\n disable: moduleOptions.sourcemaps?.disable,\n // The server/client files are in different places depending on the nitro preset (e.g. '.output/server' or '.netlify/functions-internal/server')\n // We cannot determine automatically how the build folder looks like (depends on the preset), so we have to accept that source maps are uploaded multiple times (with the vitePlugin for Nuxt and the rollupPlugin for Nitro).\n // If we could know where the server/client assets are located, we could do something like this (based on the Nitro preset): isNitro ? ['./.output/server/**/*'] : ['./.output/public/**/*'],\n assets: sourcemapsOptions.assets ?? undefined,\n ignore: sourcemapsOptions.ignore ?? undefined,\n filesToDeleteAfterUpload,\n rewriteSources: sourcemapsOptions.rewriteSources ?? normalizePath,\n resolveSourceMap: sourcemapsOptions.resolveSourceMap,\n },\n };\n}\n\n/**\n * Determines which files to delete after upload. If the user set `filesToDeleteAfterUpload`, we use\n * that. Otherwise we only delete the source maps Sentry generated itself — i.e. the sides\n * (client/server) whose `sourcemap` setting resolved to `undefined`, where Sentry stepped in and\n * enabled `'hidden'`. Given Nuxt's default of `{ server: true, client: false }`, this isn't the\n * default case: it only kicks in when a side is left `undefined` (whole config or a single sub-key).\n * @see https://nuxt.com/docs/4.x/api/nuxt-config#sourcemap\n */\nfunction resolveFilesToDeleteAfterUpload(\n moduleOptions: SentryNuxtModuleOptions,\n shouldDeleteFilesFallback?: { client: boolean; server: boolean },\n): string | Array<string> | undefined {\n const shouldDeleteFilesAfterUpload = shouldDeleteFilesFallback?.client || shouldDeleteFilesFallback?.server;\n const fallbackFilesToDelete = [\n ...(shouldDeleteFilesFallback?.client ? ['.*/**/public/**/*.map'] : []),\n ...(shouldDeleteFilesFallback?.server\n ? ['.*/**/server/**/*.map', '.*/**/output/**/*.map', '.*/**/function/**/*.map']\n : []),\n ];\n\n const filesToDeleteAfterUpload = moduleOptions.sourcemaps?.filesToDeleteAfterUpload;\n\n if (typeof filesToDeleteAfterUpload === 'undefined' && shouldDeleteFilesAfterUpload && moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Setting \\`sentry.sourcemaps.filesToDeleteAfterUpload: [${fallbackFilesToDelete\n // Logging it as strings in the array\n .map(path => `\"${path}\"`)\n .join(', ')}]\\` to delete generated source maps after they were uploaded to Sentry.`,\n );\n }\n\n return filesToDeleteAfterUpload\n ? filesToDeleteAfterUpload\n : shouldDeleteFilesAfterUpload\n ? fallbackFilesToDelete\n : undefined;\n}\n\n/* There are multiple ways to set up source maps (https://github.com/getsentry/sentry-javascript/issues/13993 and https://github.com/getsentry/sentry-javascript/pull/15859)\n 1. User explicitly disabled source maps\n - keep this setting (emit a warning that errors won't be unminified in Sentry)\n - We will not upload anything\n 2. users enabled source map generation (true, hidden, inline).\n - keep this setting (don't do anything - like deletion - besides uploading)\n 3. users did not set source maps generation\n - we enable 'hidden' source maps generation\n - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n\n Users only have to explicitly enable client source maps. Sentry only overwrites the base Nuxt source map settings as they propagate.\n */\n\n/** only exported for tests */\nexport function extractNuxtSourceMapSetting(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting; client?: SourceMapSetting } } },\n runtime: 'client' | 'server' | undefined,\n): SourceMapSetting | undefined {\n if (!runtime) {\n return undefined;\n } else {\n return typeof nuxt.options?.sourcemap === 'boolean' || typeof nuxt.options?.sourcemap === 'string'\n ? nuxt.options.sourcemap\n : nuxt.options?.sourcemap?.[runtime];\n }\n}\n\n/** only exported for testing */\nexport function changeNuxtSourceMapSettings(\n nuxt: Nuxt,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): { client: UserSourceMapSetting; server: UserSourceMapSetting } {\n nuxt.options.sourcemap = nuxt.options.sourcemap ?? { server: undefined, client: undefined };\n\n let previousUserSourceMapSetting: { client: UserSourceMapSetting; server: UserSourceMapSetting } = {\n client: undefined,\n server: undefined,\n };\n\n const nuxtSourceMap = nuxt.options.sourcemap;\n const isDebug = sentryModuleOptions.debug;\n\n if (typeof nuxtSourceMap === 'string' || typeof nuxtSourceMap === 'boolean' || typeof nuxtSourceMap === 'undefined') {\n switch (nuxtSourceMap) {\n case false:\n warnExplicitlyDisabledSourceMap('sourcemap', isDebug);\n previousUserSourceMapSetting = { client: 'disabled', server: 'disabled' };\n break;\n\n case 'hidden':\n case true:\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap', (nuxtSourceMap as true).toString());\n previousUserSourceMapSetting = { client: 'enabled', server: 'enabled' };\n break;\n case undefined:\n nuxt.options.sourcemap = { server: 'hidden', client: 'hidden' };\n isDebug && logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n isDebug && logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting = { client: 'unset', server: 'unset' };\n break;\n }\n } else {\n if (nuxtSourceMap.client === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.client', isDebug);\n previousUserSourceMapSetting.client = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.client)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.client', nuxtSourceMap.client.toString());\n previousUserSourceMapSetting.client = 'enabled';\n } else {\n nuxt.options.sourcemap.client = 'hidden';\n isDebug && logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n previousUserSourceMapSetting.client = 'unset';\n }\n\n if (nuxtSourceMap.server === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.server', isDebug);\n previousUserSourceMapSetting.server = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.server)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.server', nuxtSourceMap.server.toString());\n previousUserSourceMapSetting.server = 'enabled';\n } else {\n nuxt.options.sourcemap.server = 'hidden';\n isDebug && logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting.server = 'unset';\n }\n }\n\n return previousUserSourceMapSetting;\n}\n\n/** Logs warnings about potentially conflicting source map settings.\n * Configures `sourcemapExcludeSources` in Nitro to make source maps usable in Sentry.\n *\n * only exported for testing\n */\nexport function validateNitroSourceMapSettings(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting } } },\n nitroConfig: NitroConfig,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): void {\n const isDebug = sentryModuleOptions.debug;\n const nuxtSourceMap = extractNuxtSourceMapSetting(nuxt, 'server');\n\n // NITRO CONFIG ---\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: 'nitro.sourceMap',\n otherSettingValue: nitroConfig.sourceMap,\n });\n\n // ROLLUP CONFIG ---\n\n nitroConfig.rollupConfig = nitroConfig.rollupConfig || {};\n nitroConfig.rollupConfig.output = nitroConfig.rollupConfig.output || { sourcemap: undefined };\n const nitroRollupSourceMap = nitroConfig.rollupConfig.output.sourcemap;\n\n // We don't override nitro.rollupConfig.output.sourcemap (undefined by default, but overrides all other server-side source map settings)\n if (typeof nitroRollupSourceMap !== 'undefined' && ['hidden', 'inline', true, false].includes(nitroRollupSourceMap)) {\n const settingKey = 'nitro.rollupConfig.output.sourcemap';\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: settingKey,\n otherSettingValue: nitroRollupSourceMap,\n });\n }\n\n nitroConfig.rollupConfig.output.sourcemapExcludeSources = false;\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Set `sourcemapExcludeSources: false` in the Nuxt config (`nitro.rollupConfig.output`). Source maps will now include the actual code to be able to un-minify code snippets in Sentry.',\n );\n }\n}\n\n/**\n * Validates that source map settings are consistent between Nuxt and Vite/Nitro configurations.\n * Logs a warning if conflicting settings are detected.\n *\n * @internal Only exported for testing.\n */\nexport function validateDifferentSourceMapSettings({\n nuxtSettingKey,\n nuxtSettingValue,\n otherSettingKey,\n otherSettingValue,\n}: {\n nuxtSettingKey: string;\n nuxtSettingValue?: SourceMapSetting;\n otherSettingKey: string;\n otherSettingValue?: SourceMapSetting;\n}): void {\n if (nuxtSettingValue !== otherSettingValue) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation settings are conflicting. Sentry uses \\`${nuxtSettingKey}: ${nuxtSettingValue}\\`. However, a conflicting setting was discovered (\\`${otherSettingKey}: ${otherSettingValue}\\`). This setting was probably explicitly set in your configuration. Sentry won't override this setting but it may affect source maps generation and upload. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n }\n}\n\nfunction logKeepEnabledSourceMapSetting(\n sentryNuxtModuleOptions: SentryNuxtModuleOptions,\n settingKey: string,\n settingValue: string,\n): void {\n if (sentryNuxtModuleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] \\`${settingKey}\\` is enabled with \\`${settingValue}\\`. This will correctly un-minify the code snippet on the Sentry Issue Details page.`,\n );\n }\n}\n\nfunction warnExplicitlyDisabledSourceMap(settingKey: string, isDebug: boolean | undefined): void {\n if (isDebug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation is currently disabled in your Vite configuration (\\`${settingKey}: false \\`). This setting is either a default setting or was explicitly set in your configuration. Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified. To show unminified code, enable source maps in \\`${settingKey}\\` (e.g. by setting them to \\`hidden\\`).`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.warn(`[Sentry] Source map generation (\\`${settingKey}\\`) is disabled in your Vite configuration.`);\n }\n}\n\nfunction logSentryEnablesSourceMap(settingKey: string, settingValue: string): void {\n // eslint-disable-next-line no-console\n console.log(`[Sentry] Enabled source map generation in the build options with \\`${settingKey}: ${settingValue}\\`.`);\n}\n"],"names":[],"mappings":"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"}
@@ -17,17 +17,7 @@ async function getNitroMajorVersion() {
17
17
  }
18
18
  async function findDefaultSdkInitFile(type, nuxt, options) {
19
19
  const possibleFileExtensions = ["ts", "js", "mjs", "cjs", "mts", "cts"];
20
- const relativePaths = [];
21
- if (type === "server") {
22
- for (const ext of possibleFileExtensions) {
23
- relativePaths.push(`sentry.${type}.config.${ext}`);
24
- relativePaths.push(path.join("public", `instrument.${type}.${ext}`));
25
- }
26
- } else {
27
- for (const ext of possibleFileExtensions) {
28
- relativePaths.push(`sentry.${type}.config.${ext}`);
29
- }
30
- }
20
+ const relativePaths = possibleFileExtensions.map((ext) => `sentry.${type}.config.${ext}`);
31
21
  const layers = [...nuxt?.options._layers ?? []].reverse();
32
22
  for (const layer of layers) {
33
23
  for (const relativePath of relativePaths) {
@@ -46,6 +36,10 @@ async function findDefaultSdkInitFile(type, nuxt, options) {
46
36
  }
47
37
  return void 0;
48
38
  }
39
+ const SERVER_CONFIG_FILENAME = "sentry.server.config";
40
+ function toImportSpecifier(fromDir, filePath) {
41
+ return `./${path.relative(fromDir, filePath).split(/[\\/]/).join("/")}`;
42
+ }
49
43
  function getFilenameFromNodeStartCommand(nodeCommand) {
50
44
  const regex = /[^/\\]+\.[^/\\]+$/;
51
45
  const match = nodeCommand.match(regex);
@@ -129,5 +123,5 @@ function addOTelCommonJSImportAlias(nuxt, isNitroV3 = false) {
129
123
  }
130
124
  }
131
125
 
132
- export { QUERY_END_INDICATOR, SENTRY_REEXPORTED_FUNCTIONS, SENTRY_WRAPPED_ENTRY, SENTRY_WRAPPED_FUNCTIONS, addOTelCommonJSImportAlias, constructFunctionReExport, constructWrappedFunctionExportQuery, extractFunctionReexportQueryParameters, findDefaultSdkInitFile, getFilenameFromNodeStartCommand, getNitroMajorVersion, removeSentryQueryFromPath };
126
+ export { QUERY_END_INDICATOR, SENTRY_REEXPORTED_FUNCTIONS, SENTRY_WRAPPED_ENTRY, SENTRY_WRAPPED_FUNCTIONS, SERVER_CONFIG_FILENAME, addOTelCommonJSImportAlias, constructFunctionReExport, constructWrappedFunctionExportQuery, extractFunctionReexportQueryParameters, findDefaultSdkInitFile, getFilenameFromNodeStartCommand, getNitroMajorVersion, removeSentryQueryFromPath, toImportSpecifier };
133
127
  //# 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 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 * The sentry.server.config file is prioritized over the instrument.server file.\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: string[] = [];\n\n if (type === 'server') {\n for (const ext of possibleFileExtensions) {\n relativePaths.push(`sentry.${type}.config.${ext}`);\n relativePaths.push(path.join('public', `instrument.${type}.${ext}`));\n }\n } else {\n for (const ext of possibleFileExtensions) {\n relativePaths.push(`sentry.${type}.config.${ext}`);\n }\n }\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\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 * 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":[],"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 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 * 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":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Global flag set by the generated `<buildDir>/dev/sentry.server.config.mjs`. */
2
+ export declare const NUXT_DEV_MODE_FLAG = "__SENTRY_NUXT_DEV_MODE__";
3
+ /** Whether the SDK was preloaded by the generated `nuxt dev` server config file. */
4
+ export declare function isNuxtDevRuntime(): boolean;
@@ -1,7 +1,5 @@
1
1
  import type { BuildTimeOptionsBase } from '@sentry/core';
2
2
  import type { init as initNode } from '@sentry/node';
3
- import type { SentryRollupPluginOptions } from '@sentry/bundler-plugins/rollup';
4
- import type { SentryVitePluginOptions } from '@sentry/bundler-plugins/vite';
5
3
  import type { init as initVue } from '@sentry/vue';
6
4
  export type SentryNuxtClientOptions = Omit<Parameters<typeof initVue>[0] & object, 'app'>;
7
5
  export type SentryNuxtServerOptions = Parameters<typeof initNode>[0] & {
@@ -84,11 +82,4 @@ export type SentryNuxtModuleOptions = BuildTimeOptionsBase & {
84
82
  * @default ['default', 'handler', 'server']
85
83
  */
86
84
  experimental_entrypointWrappedFunctions?: string[];
87
- /**
88
- * Options to be passed directly to the Sentry Rollup Plugin (`@sentry/bundler-plugins/rollup`) and Sentry Vite Plugin (`@sentry/bundler-plugins/vite`) that ship with the Sentry Nuxt SDK.
89
- * You can use this option to override any options the SDK passes to the Vite (for Nuxt) and Rollup (for Nitro) plugin.
90
- *
91
- * Please note that this option is unstable and may change in a breaking way in any release.
92
- */
93
- unstable_sentryBundlerPluginOptions?: SentryRollupPluginOptions & SentryVitePluginOptions;
94
85
  };
@@ -4,5 +4,5 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.7.0"
6
6
  },
7
- "version": "11.0.0-alpha.1"
7
+ "version": "11.0.0-beta.0"
8
8
  }