@sentry/nuxt 10.53.1 → 10.55.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 (66) hide show
  1. package/build/cjs/client/piniaIntegration.js +7 -19
  2. package/build/cjs/client/piniaIntegration.js.map +1 -1
  3. package/build/cjs/client/sdk.js +2 -9
  4. package/build/cjs/client/sdk.js.map +1 -1
  5. package/build/cjs/client/vueIntegration.js +3 -10
  6. package/build/cjs/client/vueIntegration.js.map +1 -1
  7. package/build/cjs/common/debug-build.js +0 -5
  8. package/build/cjs/common/debug-build.js.map +1 -1
  9. package/build/cjs/module.js +52 -107
  10. package/build/cjs/module.js.map +1 -1
  11. package/build/cjs/server/sdk.js +20 -60
  12. package/build/cjs/server/sdk.js.map +1 -1
  13. package/build/cjs/vendor/server-template.js +0 -6
  14. package/build/cjs/vendor/server-template.js.map +1 -1
  15. package/build/cjs/vite/addServerConfig.js +45 -144
  16. package/build/cjs/vite/addServerConfig.js.map +1 -1
  17. package/build/cjs/vite/databaseConfig.js +10 -32
  18. package/build/cjs/vite/databaseConfig.js.map +1 -1
  19. package/build/cjs/vite/middlewareConfig.js +11 -46
  20. package/build/cjs/vite/middlewareConfig.js.map +1 -1
  21. package/build/cjs/vite/sentryVitePlugin.js +7 -24
  22. package/build/cjs/vite/sentryVitePlugin.js.map +1 -1
  23. package/build/cjs/vite/sourceMaps.js +89 -248
  24. package/build/cjs/vite/sourceMaps.js.map +1 -1
  25. package/build/cjs/vite/storageConfig.js +4 -10
  26. package/build/cjs/vite/storageConfig.js.map +1 -1
  27. package/build/cjs/vite/utils.js +51 -143
  28. package/build/cjs/vite/utils.js.map +1 -1
  29. package/build/esm/client/piniaIntegration.js +7 -19
  30. package/build/esm/client/piniaIntegration.js.map +1 -1
  31. package/build/esm/client/sdk.js +2 -9
  32. package/build/esm/client/sdk.js.map +1 -1
  33. package/build/esm/client/vueIntegration.js +3 -10
  34. package/build/esm/client/vueIntegration.js.map +1 -1
  35. package/build/esm/common/debug-build.js +0 -5
  36. package/build/esm/common/debug-build.js.map +1 -1
  37. package/build/esm/module.js +52 -107
  38. package/build/esm/module.js.map +1 -1
  39. package/build/esm/package.json +1 -1
  40. package/build/esm/server/sdk.js +20 -60
  41. package/build/esm/server/sdk.js.map +1 -1
  42. package/build/esm/vendor/server-template.js +0 -6
  43. package/build/esm/vendor/server-template.js.map +1 -1
  44. package/build/esm/vite/addServerConfig.js +45 -144
  45. package/build/esm/vite/addServerConfig.js.map +1 -1
  46. package/build/esm/vite/databaseConfig.js +10 -32
  47. package/build/esm/vite/databaseConfig.js.map +1 -1
  48. package/build/esm/vite/middlewareConfig.js +11 -46
  49. package/build/esm/vite/middlewareConfig.js.map +1 -1
  50. package/build/esm/vite/sentryVitePlugin.js +7 -24
  51. package/build/esm/vite/sentryVitePlugin.js.map +1 -1
  52. package/build/esm/vite/sourceMaps.js +89 -248
  53. package/build/esm/vite/sourceMaps.js.map +1 -1
  54. package/build/esm/vite/storageConfig.js +4 -10
  55. package/build/esm/vite/storageConfig.js.map +1 -1
  56. package/build/esm/vite/utils.js +51 -143
  57. package/build/esm/vite/utils.js.map +1 -1
  58. package/build/module/module.d.mts +17 -0
  59. package/build/module/module.d.ts +17 -0
  60. package/build/module/module.json +1 -1
  61. package/build/module/module.mjs +6 -6
  62. package/build/types/common/types.d.ts +17 -0
  63. package/build/types/common/types.d.ts.map +1 -1
  64. package/build/types/vite/utils.d.ts +2 -1
  65. package/build/types/vite/utils.d.ts.map +1 -1
  66. package/package.json +8 -8
@@ -10,40 +10,34 @@ import { findDefaultSdkInitFile, getNitroMajorVersion, addOTelCommonJSImportAlia
10
10
 
11
11
  const module$1 = defineNuxtModule({
12
12
  meta: {
13
- name: '@sentry/nuxt/module',
14
- configKey: 'sentry',
13
+ name: "@sentry/nuxt/module",
14
+ configKey: "sentry",
15
15
  compatibility: {
16
- nuxt: '>=3.7.0',
17
- },
16
+ nuxt: ">=3.7.0"
17
+ }
18
18
  },
19
19
  defaults: {},
20
20
  async setup(moduleOptionsParam, nuxt) {
21
21
  if (moduleOptionsParam?.enabled === false) {
22
22
  return;
23
23
  }
24
-
25
24
  const moduleOptions = {
26
25
  ...moduleOptionsParam,
27
26
  autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,
28
27
  experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [
29
- 'default',
30
- 'handler',
31
- 'server',
32
- ],
28
+ "default",
29
+ "handler",
30
+ "server"
31
+ ]
33
32
  };
34
-
35
33
  const moduleDirResolver = createResolver(import.meta.url);
36
34
  const buildDirResolver = createResolver(nuxt.options.buildDir);
37
-
38
- const clientConfigFile = findDefaultSdkInitFile('client', nuxt);
39
-
35
+ const clientConfigFile = await findDefaultSdkInitFile("client", nuxt, moduleOptions);
40
36
  if (clientConfigFile) {
41
- // Inject the client-side Sentry config file with a side effect import
42
37
  addPluginTemplate({
43
- mode: 'client',
44
- filename: 'sentry-client-config.mjs',
38
+ mode: "client",
39
+ filename: "sentry-client-config.mjs",
45
40
  order: 0,
46
-
47
41
  // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)
48
42
  // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file
49
43
  getContents: () => `
@@ -54,91 +48,64 @@ const module$1 = defineNuxtModule({
54
48
  async setup() {
55
49
  await import("${buildDirResolver.resolve(`/${clientConfigFile}`)}")
56
50
  }
57
- });`,
51
+ });`
58
52
  });
59
-
60
- // Add the plugin which loads client integrations etc. -
61
- // this must run after the sentry-client-config plugin has run, and the client is initialized!
62
53
  addPlugin({
63
- src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),
64
- mode: 'client',
65
- order: 1,
54
+ src: moduleDirResolver.resolve("./runtime/plugins/sentry.client"),
55
+ mode: "client",
56
+ order: 1
66
57
  });
67
58
  }
68
-
69
- const serverConfigFile = findDefaultSdkInitFile('server', nuxt);
70
- const isNitroV3 = (await getNitroMajorVersion()) >= 3;
71
- const nuxtMajor = parseInt((nuxt )._version?.split('.')[0] ?? '3', 10);
59
+ const serverConfigFile = await findDefaultSdkInitFile("server", nuxt, moduleOptions);
60
+ const isNitroV3 = await getNitroMajorVersion() >= 3;
61
+ const nuxtMajor = parseInt(nuxt._version?.split(".")[0] ?? "3", 10);
72
62
  const isMinNuxtV4 = nuxtMajor >= 4;
73
-
74
63
  if (serverConfigFile) {
75
64
  if (isNitroV3) {
76
- addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));
77
- addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));
65
+ addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/handler.server"));
66
+ addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/update-route-name.server"));
78
67
  } else {
79
- addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));
80
- addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));
68
+ addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/handler-legacy.server"));
69
+ addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/update-route-name-legacy.server"));
81
70
  }
82
-
83
- addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));
84
-
71
+ addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/sentry.server"));
85
72
  if (isMinNuxtV4) {
86
- addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });
73
+ addPlugin({ src: moduleDirResolver.resolve("./runtime/plugins/route-detector.server"), mode: "server" });
87
74
  } else {
88
- addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });
75
+ addPlugin({ src: moduleDirResolver.resolve("./runtime/plugins/route-detector-legacy.server"), mode: "server" });
89
76
  }
90
-
91
- // Preps the middleware instrumentation module.
92
77
  addMiddlewareImports();
93
78
  addStorageInstrumentation(nuxt, !isNitroV3);
94
79
  addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);
95
80
  }
96
-
97
81
  if (clientConfigFile || serverConfigFile) {
98
82
  setupSourceMaps(moduleOptions, nuxt, addVitePlugin);
99
83
  }
100
-
101
84
  addOTelCommonJSImportAlias(nuxt, isNitroV3);
102
-
103
85
  let pagesData = [];
104
-
105
- nuxt.hooks.hook('pages:extend', pages => {
106
- pagesData = pages
107
- .map(page => ({ file: page.file, path: page.path }))
108
- .filter(page => {
109
- // Check for dynamic parameter (e.g., :userId or [userId])
110
- return page.path.includes(':') || page?.file?.includes('[');
111
- });
86
+ nuxt.hooks.hook("pages:extend", (pages) => {
87
+ pagesData = pages.map((page) => ({ file: page.file, path: page.path })).filter((page) => {
88
+ return page.path.includes(":") || page?.file?.includes("[");
89
+ });
112
90
  });
113
-
114
91
  if (isMinNuxtV4) {
115
- const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';
116
-
117
- // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)
92
+ const pagesDataVirtualModuleId = "#sentry/nuxt-pages-data.mjs";
118
93
  addVitePlugin({
119
- name: 'sentry-nuxt-pages-data-virtual',
120
- resolveId: id => (id === pagesDataVirtualModuleId ? `\0${pagesDataVirtualModuleId}` : null),
121
- load: id =>
122
- id === `\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,
94
+ name: "sentry-nuxt-pages-data-virtual",
95
+ resolveId: (id) => id === pagesDataVirtualModuleId ? `\0${pagesDataVirtualModuleId}` : null,
96
+ load: (id) => id === `\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : void 0
123
97
  });
124
98
  } else {
125
- // Nuxt v3: register as a build template (accessible via #build/)
126
99
  addTemplate({
127
- filename: 'sentry--nuxt-pages-data.mjs',
128
- getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,
100
+ filename: "sentry--nuxt-pages-data.mjs",
101
+ getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`
129
102
  });
130
103
  }
131
-
132
- // Add the sentry config file to the include array
133
- nuxt.hook('prepare:types', options => {
134
- const tsConfig = options.tsConfig ;
135
-
104
+ nuxt.hook("prepare:types", (options) => {
105
+ const tsConfig = options.tsConfig;
136
106
  if (!tsConfig.include) {
137
107
  tsConfig.include = [];
138
108
  }
139
-
140
- // Add type references for useRuntimeConfig in root files for nuxt v4
141
- // Should be relative to `root/.nuxt`
142
109
  if (clientConfigFile) {
143
110
  const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);
144
111
  tsConfig.include.push(relativePath);
@@ -148,87 +115,65 @@ const module$1 = defineNuxtModule({
148
115
  tsConfig.include.push(relativePath);
149
116
  }
150
117
  });
151
-
152
- nuxt.hooks.hook('nitro:init', nitro => {
118
+ nuxt.hooks.hook("nitro:init", (nitro) => {
153
119
  if (nuxt.options?._prepare) {
154
120
  return;
155
121
  }
156
-
157
122
  if (serverConfigFile) {
158
123
  addMiddlewareInstrumentation(nitro);
159
124
  }
160
-
161
- if (serverConfigFile?.includes('.server.config')) {
125
+ if (serverConfigFile?.includes(".server.config")) {
162
126
  consoleSandbox(() => {
163
127
  const serverDir = nitro.options.output.serverDir;
164
-
165
- // Netlify env: https://docs.netlify.com/configure-builds/environment-variables/#build-metadata
166
- if (serverDir.includes('.netlify') || !!process.env.NETLIFY) {
167
- // eslint-disable-next-line no-console
128
+ if (serverDir.includes(".netlify") || !!process.env.NETLIFY) {
168
129
  console.warn(
169
- '[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',
130
+ "[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/"
170
131
  );
171
132
  }
172
-
173
- // Vercel env: https://vercel.com/docs/projects/environment-variables/system-environment-variables#VERCEL
174
- if (serverDir.includes('.vercel') || !!process.env.VERCEL) {
175
- // eslint-disable-next-line no-console
133
+ if (serverDir.includes(".vercel") || !!process.env.VERCEL) {
176
134
  console.warn(
177
- '[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',
135
+ "[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/"
178
136
  );
179
137
  }
180
138
  });
181
-
182
- if (moduleOptions.autoInjectServerSentry !== 'experimental_dynamic-import') {
139
+ if (moduleOptions.autoInjectServerSentry !== "experimental_dynamic-import") {
183
140
  addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);
184
-
185
141
  if (moduleOptions.debug) {
186
142
  const serverDirResolver = createResolver(nitro.options.output.serverDir);
187
- const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs');
188
-
189
- // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs
143
+ const serverConfigPath = serverDirResolver.resolve("sentry.server.config.mjs");
190
144
  const serverConfigRelativePath = `.${path.sep}${path.relative(nitro.options.rootDir, serverConfigPath)}`;
191
-
192
145
  consoleSandbox(() => {
193
- // eslint-disable-next-line no-console
194
146
  console.log(
195
- `[Sentry] Using \`${serverConfigFile}\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`,
147
+ `[Sentry] Using \`${serverConfigFile}\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`
196
148
  );
197
-
198
149
  if (nitro.options.dev) {
199
- // eslint-disable-next-line no-console
200
150
  console.log(
201
- `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \`NODE_OPTIONS='--import ${serverConfigRelativePath}' nuxt dev\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \`nuxt dev\` to regenerate it.`,
151
+ `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \`NODE_OPTIONS='--import ${serverConfigRelativePath}' nuxt dev\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \`nuxt dev\` to regenerate it.`
202
152
  );
203
153
  } else {
204
- // eslint-disable-next-line no-console
205
154
  console.log(
206
- `[Sentry] When running your built application, preload Sentry via a command-line flag (\`node --import ${serverConfigRelativePath} [...]\`) or via an environment variable (\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\`).`,
155
+ `[Sentry] When running your built application, preload Sentry via a command-line flag (\`node --import ${serverConfigRelativePath} [...]\`) or via an environment variable (\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\`).`
207
156
  );
208
157
  }
209
158
  });
210
159
  }
211
160
  }
212
-
213
- if (moduleOptions.autoInjectServerSentry === 'top-level-import') {
161
+ if (moduleOptions.autoInjectServerSentry === "top-level-import") {
214
162
  addSentryTopImport(moduleOptions, nitro);
215
163
  }
216
-
217
- if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {
164
+ if (moduleOptions.autoInjectServerSentry === "experimental_dynamic-import") {
218
165
  addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);
219
-
220
166
  if (moduleOptions.debug) {
221
167
  consoleSandbox(() => {
222
- // eslint-disable-next-line no-console
223
168
  console.log(
224
- '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',
169
+ "[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes."
225
170
  );
226
171
  });
227
172
  }
228
173
  }
229
174
  }
230
175
  });
231
- },
176
+ }
232
177
  });
233
178
 
234
179
  export { module$1 as default };
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport { addDynamicImportEntryFileWrapper, addSentryTopImport, addServerConfigToBuild } from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport { addOTelCommonJSImportAlias, findDefaultSdkInitFile, getNitroMajorVersion } from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = findDefaultSdkInitFile('client', nuxt);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = findDefaultSdkInitFile('server', nuxt);\n const isNitroV3 = (await getNitroMajorVersion()) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n if (serverConfigFile) {\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro);\n }\n\n if (serverConfigFile?.includes('.server.config')) {\n consoleSandbox(() => {\n const serverDir = nitro.options.output.serverDir;\n\n // Netlify env: https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n if (serverDir.includes('.netlify') || !!process.env.NETLIFY) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n\n // Vercel env: https://vercel.com/docs/projects/environment-variables/system-environment-variables#VERCEL\n if (serverDir.includes('.vercel') || !!process.env.VERCEL) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n });\n\n if (moduleOptions.autoInjectServerSentry !== 'experimental_dynamic-import') {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n\n if (moduleOptions.debug) {\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs');\n\n // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs\n const serverConfigRelativePath = `.${path.sep}${path.relative(nitro.options.rootDir, serverConfigPath)}`;\n\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Using \\`${serverConfigFile}\\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`,\n );\n\n if (nitro.options.dev) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \\`NODE_OPTIONS='--import ${serverConfigRelativePath}' nuxt dev\\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \\`nuxt dev\\` to regenerate it.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] When running your built application, preload Sentry via a command-line flag (\\`node --import ${serverConfigRelativePath} [...]\\`) or via an environment variable (\\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\\`).`,\n );\n }\n });\n }\n }\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n });\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport { addDynamicImportEntryFileWrapper, addSentryTopImport, addServerConfigToBuild } from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport { addOTelCommonJSImportAlias, findDefaultSdkInitFile, getNitroMajorVersion } from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = await findDefaultSdkInitFile('client', nuxt, moduleOptions);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = await findDefaultSdkInitFile('server', nuxt, moduleOptions);\n const isNitroV3 = (await getNitroMajorVersion()) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n if (serverConfigFile) {\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro);\n }\n\n if (serverConfigFile?.includes('.server.config')) {\n consoleSandbox(() => {\n const serverDir = nitro.options.output.serverDir;\n\n // Netlify env: https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n if (serverDir.includes('.netlify') || !!process.env.NETLIFY) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n\n // Vercel env: https://vercel.com/docs/projects/environment-variables/system-environment-variables#VERCEL\n if (serverDir.includes('.vercel') || !!process.env.VERCEL) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n });\n\n if (moduleOptions.autoInjectServerSentry !== 'experimental_dynamic-import') {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n\n if (moduleOptions.debug) {\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs');\n\n // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs\n const serverConfigRelativePath = `.${path.sep}${path.relative(nitro.options.rootDir, serverConfigPath)}`;\n\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Using \\`${serverConfigFile}\\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`,\n );\n\n if (nitro.options.dev) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \\`NODE_OPTIONS='--import ${serverConfigRelativePath}' nuxt dev\\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \\`nuxt dev\\` to regenerate it.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] When running your built application, preload Sentry via a command-line flag (\\`node --import ${serverConfigRelativePath} [...]\\`) or via an environment variable (\\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\\`).`,\n );\n }\n });\n }\n }\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n });\n },\n});\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"type":"module","version":"10.53.1"}
1
+ {"type":"module","version":"10.55.0"}
@@ -4,115 +4,75 @@ import { init as init$1, getDefaultIntegrations, httpIntegration } from '@sentry
4
4
  import { isCjs } from '@sentry/node-core';
5
5
  import { DEBUG_BUILD } from '../common/debug-build.js';
6
6
 
7
- /**
8
- * Initializes the server-side of the Nuxt SDK
9
- *
10
- * @param options Configuration options for the SDK.
11
- */
12
7
  function init(options) {
13
8
  const envFallback = !isCjs() && import.meta.dev ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;
14
9
  const sentryOptions = {
15
10
  environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,
16
11
  defaultIntegrations: getNuxtDefaultIntegrations(options),
17
- ...options,
12
+ ...options
18
13
  };
19
-
20
- applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);
21
-
14
+ applySdkMetadata(sentryOptions, "nuxt", ["nuxt", "node"]);
22
15
  const client = init$1(sentryOptions);
23
-
24
16
  getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));
25
17
  getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));
26
-
27
18
  return client;
28
19
  }
29
-
30
- /**
31
- * Filter out transactions for resource requests which we don't want to send to Sentry
32
- * for quota reasons.
33
- *
34
- * Only exported for testing
35
- */
36
20
  function lowQualityTransactionsFilter(options) {
37
21
  return Object.assign(
38
- (event => {
39
- if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {
22
+ ((event) => {
23
+ if (event.type !== "transaction" || !event.transaction || isCacheEvent(event)) {
40
24
  return event;
41
25
  }
42
-
43
- // Check if this looks like a parametrized route (contains :param or :param() patterns)
44
26
  const hasRouteParameters = /\/:[^(/\s]*(\([^)]*\))?[^/\s]*/.test(event.transaction);
45
-
46
27
  if (hasRouteParameters) {
47
28
  return event;
48
29
  }
49
-
50
- // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out
51
- // path.extname will return an empty string for normal page requests
52
30
  if (path.extname(event.transaction)) {
53
- options.debug &&
54
- DEBUG_BUILD &&
55
- debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);
31
+ options.debug && DEBUG_BUILD && debug.log("NuxtLowQualityTransactionsFilter filtered transaction: ", event.transaction);
56
32
  return null;
57
33
  }
58
34
  return event;
59
- }) ,
60
- { id: 'NuxtLowQualityTransactionsFilter' },
35
+ }),
36
+ { id: "NuxtLowQualityTransactionsFilter" }
61
37
  );
62
38
  }
63
-
64
- /**
65
- * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).
66
- *
67
- * Only exported for testing
68
- */
69
39
  function clientSourceMapErrorFilter(options) {
70
40
  return Object.assign(
71
- (event => {
41
+ ((event) => {
72
42
  const errorMsg = event.exception?.values?.[0]?.value;
73
43
  if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\/_nuxt\/.*\.js\.map'/)) {
74
- options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);
44
+ options.debug && DEBUG_BUILD && debug.log("NuxtClientSourceMapErrorFilter filtered error: ", errorMsg);
75
45
  return null;
76
46
  }
77
47
  return event;
78
- }) ,
79
- { id: 'NuxtClientSourceMapErrorFilter' },
48
+ }),
49
+ { id: "NuxtClientSourceMapErrorFilter" }
80
50
  );
81
51
  }
82
-
83
52
  function getNuxtDefaultIntegrations(options) {
84
53
  return [
85
- ...getDefaultIntegrations(options).filter(integration => integration.name !== 'Http'),
54
+ ...getDefaultIntegrations(options).filter((integration) => integration.name !== "Http"),
86
55
  // The httpIntegration is added as defaultIntegration, so users can still overwrite it
87
56
  httpIntegration({
88
57
  instrumentation: {
89
58
  responseHook: () => {
90
- // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)
91
59
  vercelWaitUntil(flushSafelyWithTimeout());
92
- },
93
- },
94
- }),
60
+ }
61
+ }
62
+ })
95
63
  ];
96
64
  }
97
-
98
- /**
99
- * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.
100
- */
101
65
  async function flushSafelyWithTimeout() {
102
66
  try {
103
- DEBUG_BUILD && debug.log('Flushing events...');
104
- await flush(2000);
105
- DEBUG_BUILD && debug.log('Done flushing events');
67
+ DEBUG_BUILD && debug.log("Flushing events...");
68
+ await flush(2e3);
69
+ DEBUG_BUILD && debug.log("Done flushing events");
106
70
  } catch (e) {
107
- DEBUG_BUILD && debug.log('Error while flushing events:\n', e);
71
+ DEBUG_BUILD && debug.log("Error while flushing events:\n", e);
108
72
  }
109
73
  }
110
-
111
- /**
112
- * Checks if the event is a cache event.
113
- */
114
74
  function isCacheEvent(e) {
115
- return e.contexts?.trace?.origin === 'auto.cache.nuxt';
75
+ return e.contexts?.trace?.origin === "auto.cache.nuxt";
116
76
  }
117
77
 
118
78
  export { clientSourceMapErrorFilter, init, lowQualityTransactionsFilter };
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor, Integration } from '@sentry/core';\nimport {\n applySdkMetadata,\n debug,\n DEFAULT_ENVIRONMENT,\n DEV_ENVIRONMENT,\n flush,\n getGlobalScope,\n vercelWaitUntil,\n} from '@sentry/core';\nimport {\n getDefaultIntegrations as getDefaultNodeIntegrations,\n httpIntegration,\n init as initNode,\n type NodeOptions,\n} from '@sentry/node';\nimport { isCjs } from '@sentry/node-core';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n const envFallback = !isCjs() && import.meta.dev ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;\n const sentryOptions = {\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,\n defaultIntegrations: getNuxtDefaultIntegrations(options),\n ...options,\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {\n return event;\n }\n\n // Check if this looks like a parametrized route (contains :param or :param() patterns)\n const hasRouteParameters = /\\/:[^(/\\s]*(\\([^)]*\\))?[^/\\s]*/.test(event.transaction);\n\n if (hasRouteParameters) {\n return event;\n }\n\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\nfunction getNuxtDefaultIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getDefaultNodeIntegrations(options).filter(integration => integration.name !== 'Http'),\n // The httpIntegration is added as defaultIntegration, so users can still overwrite it\n httpIntegration({\n instrumentation: {\n responseHook: () => {\n // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)\n vercelWaitUntil(flushSafelyWithTimeout());\n },\n },\n }),\n ];\n}\n\n/**\n * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.\n */\nasync function flushSafelyWithTimeout(): Promise<void> {\n try {\n DEBUG_BUILD && debug.log('Flushing events...');\n await flush(2000);\n DEBUG_BUILD && debug.log('Done flushing events');\n } catch (e) {\n DEBUG_BUILD && debug.log('Error while flushing events:\\n', e);\n }\n}\n\n/**\n * Checks if the event is a cache event.\n */\nfunction isCacheEvent(e: Event): boolean {\n return e.contexts?.trace?.origin === 'auto.cache.nuxt';\n}\n"],"names":["initNode","getDefaultNodeIntegrations"],"mappings":";;;;;;AAqBA;AACA;AACA;AACA;AACA;AACO,SAAS,IAAI,CAAC,OAAO,EAA+C;AAC3E,EAAE,MAAM,WAAA,GAAc,CAAC,KAAK,EAAC,IAAK,MAAM,CAAC,IAAI,CAAC,GAAA,GAAM,eAAA,GAAkB,mBAAmB;AACzF,EAAE,MAAM,gBAAgB;AACxB,IAAI,WAAW,EAAE,OAAO,CAAC,WAAA,IAAe,OAAO,CAAC,GAAG,CAAC,kBAAA,IAAsB,WAAW;AACrF,IAAI,mBAAmB,EAAE,0BAA0B,CAAC,OAAO,CAAC;AAC5D,IAAI,GAAG,OAAO;AACd,GAAG;;AAEH,EAAE,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;AAE3D,EAAE,MAAM,MAAA,GAASA,MAAQ,CAAC,aAAa,CAAC;;AAExC,EAAE,cAAc,EAAE,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAC3E,EAAE,cAAc,EAAE,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;;AAEzE,EAAE,OAAO,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,4BAA4B,CAAC,OAAO,EAA2C;AAC/F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,IAAI,KAAK,CAAC,IAAA,KAAS,aAAA,IAAiB,CAAC,KAAK,CAAC,WAAA,IAAe,YAAY,CAAC,KAAK,CAAC,EAAE;AACrF,QAAQ,OAAO,KAAK;AACpB,MAAM;;AAEN;AACA,MAAM,MAAM,kBAAA,GAAqB,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;;AAEzF,MAAM,IAAI,kBAAkB,EAAE;AAC9B,QAAQ,OAAO,KAAK;AACpB,MAAM;;AAEN;AACA;AACA,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;AAC3C,QAAQ,OAAO,CAAC,KAAA;AAChB,UAAU,WAAA;AACV,UAAU,KAAK,CAAC,GAAG,CAAC,yDAAyD,EAAE,KAAK,CAAC,WAAW,CAAC;AACjG,QAAQ,OAAO,IAAI;AACnB,MAAM;AACN,MAAM,OAAO,KAAK;AAClB,IAAI,CAAC;AACL,IAAI,EAAE,EAAE,EAAE,kCAAA,EAAoC;AAC9C,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,0BAA0B,CAAC,OAAO,EAA2C;AAC7F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,MAAM,QAAA,GAAW,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK;AAC1D,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC,mEAAmE,CAAC,EAAE;AAChG,QAAQ,OAAO,CAAC,KAAA,IAAS,WAAA,IAAe,KAAK,CAAC,GAAG,CAAC,iDAAiD,EAAE,QAAQ,CAAC;AAC9G,QAAQ,OAAO,IAAI;AACnB,MAAM;AACN,MAAM,OAAO,KAAK;AAClB,IAAI,CAAC;AACL,IAAI,EAAE,EAAE,EAAE,gCAAA,EAAkC;AAC5C,GAAG;AACH;;AAEA,SAAS,0BAA0B,CAAC,OAAO,EAA8B;AACzE,EAAE,OAAO;AACT,IAAI,GAAGC,sBAA0B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAA,IAAe,WAAW,CAAC,IAAA,KAAS,MAAM,CAAC;AAC7F;AACA,IAAI,eAAe,CAAC;AACpB,MAAM,eAAe,EAAE;AACvB,QAAQ,YAAY,EAAE,MAAM;AAC5B;AACA,UAAU,eAAe,CAAC,sBAAsB,EAAE,CAAC;AACnD,QAAQ,CAAC;AACT,OAAO;AACP,KAAK,CAAC;AACN,GAAG;AACH;;AAEA;AACA;AACA;AACA,eAAe,sBAAsB,GAAkB;AACvD,EAAE,IAAI;AACN,IAAI,eAAe,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAClD,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC;AACrB,IAAI,eAAe,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACpD,EAAE,CAAA,CAAE,OAAO,CAAC,EAAE;AACd,IAAI,WAAA,IAAe,KAAK,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC,CAAC;AACjE,EAAE;AACF;;AAEA;AACA;AACA;AACA,SAAS,YAAY,CAAC,CAAC,EAAkB;AACzC,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAA,KAAW,iBAAiB;AACxD;;;;"}
1
+ {"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor, Integration } from '@sentry/core';\nimport {\n applySdkMetadata,\n debug,\n DEFAULT_ENVIRONMENT,\n DEV_ENVIRONMENT,\n flush,\n getGlobalScope,\n vercelWaitUntil,\n} from '@sentry/core';\nimport {\n getDefaultIntegrations as getDefaultNodeIntegrations,\n httpIntegration,\n init as initNode,\n type NodeOptions,\n} from '@sentry/node';\nimport { isCjs } from '@sentry/node-core';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n const envFallback = !isCjs() && import.meta.dev ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;\n const sentryOptions = {\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,\n defaultIntegrations: getNuxtDefaultIntegrations(options),\n ...options,\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {\n return event;\n }\n\n // Check if this looks like a parametrized route (contains :param or :param() patterns)\n const hasRouteParameters = /\\/:[^(/\\s]*(\\([^)]*\\))?[^/\\s]*/.test(event.transaction);\n\n if (hasRouteParameters) {\n return event;\n }\n\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\nfunction getNuxtDefaultIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getDefaultNodeIntegrations(options).filter(integration => integration.name !== 'Http'),\n // The httpIntegration is added as defaultIntegration, so users can still overwrite it\n httpIntegration({\n instrumentation: {\n responseHook: () => {\n // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)\n vercelWaitUntil(flushSafelyWithTimeout());\n },\n },\n }),\n ];\n}\n\n/**\n * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.\n */\nasync function flushSafelyWithTimeout(): Promise<void> {\n try {\n DEBUG_BUILD && debug.log('Flushing events...');\n await flush(2000);\n DEBUG_BUILD && debug.log('Done flushing events');\n } catch (e) {\n DEBUG_BUILD && debug.log('Error while flushing events:\\n', e);\n }\n}\n\n/**\n * Checks if the event is a cache event.\n */\nfunction isCacheEvent(e: Event): boolean {\n return e.contexts?.trace?.origin === 'auto.cache.nuxt';\n}\n"],"names":["initNode","getDefaultNodeIntegrations"],"mappings":"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"}
@@ -1,17 +1,11 @@
1
1
  import { useNuxt } from '@nuxt/kit';
2
2
 
3
- /**
4
- * Adds a virtual file that can be used within the Nuxt Nitro server build.
5
- * Available in NuxtKit v4, so we are porting it here.
6
- * https://github.com/nuxt/nuxt/blob/d6df732eec1a3bd442bdb325b0335beb7e10cd64/packages/kit/src/template.ts#L55-L62
7
- */
8
3
  function addServerTemplate(template) {
9
4
  const nuxt = useNuxt();
10
5
  if (template.filename) {
11
6
  nuxt.options.nitro.virtual = nuxt.options.nitro.virtual || {};
12
7
  nuxt.options.nitro.virtual[template.filename] = template.getContents;
13
8
  }
14
-
15
9
  return template;
16
10
  }
17
11
 
@@ -1 +1 @@
1
- {"version":3,"file":"server-template.js","sources":["../../../src/vendor/server-template.ts"],"sourcesContent":["import { useNuxt } from '@nuxt/kit';\nimport type { NuxtTemplate } from '@nuxt/schema';\n\n/**\n * Adds a virtual file that can be used within the Nuxt Nitro server build.\n * Available in NuxtKit v4, so we are porting it here.\n * https://github.com/nuxt/nuxt/blob/d6df732eec1a3bd442bdb325b0335beb7e10cd64/packages/kit/src/template.ts#L55-L62\n */\nexport function addServerTemplate(template: NuxtTemplate): NuxtTemplate {\n const nuxt = useNuxt();\n if (template.filename) {\n nuxt.options.nitro.virtual = nuxt.options.nitro.virtual || {};\n nuxt.options.nitro.virtual[template.filename] = template.getContents;\n }\n\n return template;\n}\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,QAAQ,EAA8B;AACxE,EAAE,MAAM,IAAA,GAAO,OAAO,EAAE;AACxB,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACzB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAA,GAAU,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAA,IAAW,EAAE;AACjE,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAA,GAAI,QAAQ,CAAC,WAAW;AACxE,EAAE;;AAEF,EAAE,OAAO,QAAQ;AACjB;;;;"}
1
+ {"version":3,"file":"server-template.js","sources":["../../../src/vendor/server-template.ts"],"sourcesContent":["import { useNuxt } from '@nuxt/kit';\nimport type { NuxtTemplate } from '@nuxt/schema';\n\n/**\n * Adds a virtual file that can be used within the Nuxt Nitro server build.\n * Available in NuxtKit v4, so we are porting it here.\n * https://github.com/nuxt/nuxt/blob/d6df732eec1a3bd442bdb325b0335beb7e10cd64/packages/kit/src/template.ts#L55-L62\n */\nexport function addServerTemplate(template: NuxtTemplate): NuxtTemplate {\n const nuxt = useNuxt();\n if (template.filename) {\n nuxt.options.nitro.virtual = nuxt.options.nitro.virtual || {};\n nuxt.options.nitro.virtual[template.filename] = template.getContents;\n }\n\n return template;\n}\n"],"names":[],"mappings":";;AAQO,SAAS,kBAAkB,QAAA,EAAsC;AACtE,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,KAAA,CAAM,WAAW,EAAC;AAC5D,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,IAAI,QAAA,CAAS,WAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,QAAA;AACT;;;;"}