@sentry/nuxt 11.0.0-beta.0 → 11.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/common/devMode.js +16 -0
- package/build/cjs/common/devMode.js.map +1 -1
- package/build/cjs/module.js +32 -48
- package/build/cjs/module.js.map +1 -1
- package/build/cjs/server/sdk.js +15 -0
- package/build/cjs/server/sdk.js.map +1 -1
- package/build/cjs/vite/addServerConfig.js +106 -37
- package/build/cjs/vite/addServerConfig.js.map +1 -1
- package/build/cjs/vite/middlewareConfig.js +7 -6
- package/build/cjs/vite/middlewareConfig.js.map +1 -1
- package/build/cjs/vite/orchestrion.js +2 -1
- package/build/cjs/vite/orchestrion.js.map +1 -1
- package/build/cjs/vite/utils.js +34 -9
- package/build/cjs/vite/utils.js.map +1 -1
- package/build/esm/common/devMode.js +12 -1
- package/build/esm/common/devMode.js.map +1 -1
- package/build/esm/module.js +34 -50
- package/build/esm/module.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/sdk.js +17 -2
- package/build/esm/server/sdk.js.map +1 -1
- package/build/esm/vite/addServerConfig.js +108 -40
- package/build/esm/vite/addServerConfig.js.map +1 -1
- package/build/esm/vite/middlewareConfig.js +7 -6
- package/build/esm/vite/middlewareConfig.js.map +1 -1
- package/build/esm/vite/orchestrion.js +2 -1
- package/build/esm/vite/orchestrion.js.map +1 -1
- package/build/esm/vite/utils.js +33 -9
- package/build/esm/vite/utils.js.map +1 -1
- package/build/module/common/devMode.d.ts +12 -2
- package/build/module/common/types.d.ts +7 -0
- package/build/module/module.json +1 -1
- package/build/module/module.mjs +177 -99
- package/build/module/runtime/utils/instrumentDatabase.js +3 -2
- package/build/module/vite/addServerConfig.d.ts +23 -8
- package/build/module/vite/middlewareConfig.d.ts +2 -1
- package/build/module/vite/utils.d.ts +22 -3
- package/build/types/common/devMode.d.ts +12 -2
- package/build/types/common/devMode.d.ts.map +1 -1
- package/build/types/common/types.d.ts +7 -0
- package/build/types/common/types.d.ts.map +1 -1
- package/build/types/module.d.ts.map +1 -1
- package/build/types/runtime/utils/instrumentDatabase.d.ts.map +1 -1
- package/build/types/server/sdk.d.ts.map +1 -1
- package/build/types/vite/addServerConfig.d.ts +23 -8
- package/build/types/vite/addServerConfig.d.ts.map +1 -1
- package/build/types/vite/middlewareConfig.d.ts +2 -1
- package/build/types/vite/middlewareConfig.d.ts.map +1 -1
- package/build/types/vite/orchestrion.d.ts.map +1 -1
- package/build/types/vite/utils.d.ts +22 -3
- package/build/types/vite/utils.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -3,10 +3,26 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
3
3
|
const core = require('@sentry/core');
|
|
4
4
|
|
|
5
5
|
const NUXT_DEV_MODE_FLAG = "__SENTRY_NUXT_DEV_MODE__";
|
|
6
|
+
const NUXT_PRERENDER_FLAG = "__SENTRY_NUXT_PRERENDER__";
|
|
7
|
+
const NUXT_SERVER_INITIALIZED_FLAG = "__SENTRY_NUXT_SERVER_INITIALIZED__";
|
|
6
8
|
function isNuxtDevRuntime() {
|
|
7
9
|
return NUXT_DEV_MODE_FLAG in core.GLOBAL_OBJ && core.GLOBAL_OBJ[NUXT_DEV_MODE_FLAG] === true;
|
|
8
10
|
}
|
|
11
|
+
function isNuxtPrerenderRuntime() {
|
|
12
|
+
return NUXT_PRERENDER_FLAG in core.GLOBAL_OBJ && core.GLOBAL_OBJ[NUXT_PRERENDER_FLAG] === true;
|
|
13
|
+
}
|
|
14
|
+
function isNuxtServerInitialized() {
|
|
15
|
+
return NUXT_SERVER_INITIALIZED_FLAG in core.GLOBAL_OBJ && core.GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] === true;
|
|
16
|
+
}
|
|
17
|
+
function markNuxtServerInitialized() {
|
|
18
|
+
core.GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] = true;
|
|
19
|
+
}
|
|
9
20
|
|
|
10
21
|
exports.NUXT_DEV_MODE_FLAG = NUXT_DEV_MODE_FLAG;
|
|
22
|
+
exports.NUXT_PRERENDER_FLAG = NUXT_PRERENDER_FLAG;
|
|
23
|
+
exports.NUXT_SERVER_INITIALIZED_FLAG = NUXT_SERVER_INITIALIZED_FLAG;
|
|
11
24
|
exports.isNuxtDevRuntime = isNuxtDevRuntime;
|
|
25
|
+
exports.isNuxtPrerenderRuntime = isNuxtPrerenderRuntime;
|
|
26
|
+
exports.isNuxtServerInitialized = isNuxtServerInitialized;
|
|
27
|
+
exports.markNuxtServerInitialized = markNuxtServerInitialized;
|
|
12
28
|
//# sourceMappingURL=devMode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devMode.js","sources":["../../../src/common/devMode.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/** Global flag set by the generated
|
|
1
|
+
{"version":3,"file":"devMode.js","sources":["../../../src/common/devMode.ts"],"sourcesContent":["import { GLOBAL_OBJ } from '@sentry/core';\n\n/** Global flag set by the generated runtime-flags module before the Sentry server config evaluates. */\nexport const NUXT_DEV_MODE_FLAG = '__SENTRY_NUXT_DEV_MODE__';\n\n/** Global flag set by the generated runtime-flags module during a prerender build. */\nexport const NUXT_PRERENDER_FLAG = '__SENTRY_NUXT_PRERENDER__';\n\n/** Global flag set by the Nuxt server SDK after a successful `init`, to guard against a second init. */\nexport const NUXT_SERVER_INITIALIZED_FLAG = '__SENTRY_NUXT_SERVER_INITIALIZED__';\n\n/** Whether the server runs in `nuxt dev`. */\nexport function isNuxtDevRuntime(): boolean {\n return NUXT_DEV_MODE_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_DEV_MODE_FLAG] === true;\n}\n\n/** Whether the server bundle is executed by the Nitro prerenderer at build time. */\nexport function isNuxtPrerenderRuntime(): boolean {\n return NUXT_PRERENDER_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_PRERENDER_FLAG] === true;\n}\n\n/** Whether a Nuxt server SDK `init` already ran in this process. */\nexport function isNuxtServerInitialized(): boolean {\n return NUXT_SERVER_INITIALIZED_FLAG in GLOBAL_OBJ && GLOBAL_OBJ[NUXT_SERVER_INITIALIZED_FLAG] === true;\n}\n\n/** Records that the Nuxt server SDK initialized in this process. */\nexport function markNuxtServerInitialized(): void {\n (GLOBAL_OBJ as typeof GLOBAL_OBJ & { [NUXT_SERVER_INITIALIZED_FLAG]?: boolean })[NUXT_SERVER_INITIALIZED_FLAG] = true;\n}\n"],"names":["GLOBAL_OBJ"],"mappings":";;;;AAGO,MAAM,kBAAA,GAAqB;AAG3B,MAAM,mBAAA,GAAsB;AAG5B,MAAM,4BAAA,GAA+B;AAGrC,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,kBAAA,IAAsBA,eAAA,IAAcA,eAAA,CAAW,kBAAkB,CAAA,KAAM,IAAA;AAChF;AAGO,SAAS,sBAAA,GAAkC;AAChD,EAAA,OAAO,mBAAA,IAAuBA,eAAA,IAAcA,eAAA,CAAW,mBAAmB,CAAA,KAAM,IAAA;AAClF;AAGO,SAAS,uBAAA,GAAmC;AACjD,EAAA,OAAO,4BAAA,IAAgCA,eAAA,IAAcA,eAAA,CAAW,4BAA4B,CAAA,KAAM,IAAA;AACpG;AAGO,SAAS,yBAAA,GAAkC;AAChD,EAACA,eAAA,CAAgF,4BAA4B,CAAA,GAAI,IAAA;AACnH;;;;;;;;;;"}
|
package/build/cjs/module.js
CHANGED
|
@@ -25,7 +25,9 @@ const module$1 = kit.defineNuxtModule({
|
|
|
25
25
|
}
|
|
26
26
|
const moduleOptions = {
|
|
27
27
|
...moduleOptionsParam,
|
|
28
|
+
// oxlint-disable-next-line typescript/no-deprecated -- supported until removal
|
|
28
29
|
autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,
|
|
30
|
+
// oxlint-disable-next-line typescript/no-deprecated -- supported until removal
|
|
29
31
|
experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [
|
|
30
32
|
"default",
|
|
31
33
|
"handler",
|
|
@@ -59,11 +61,15 @@ const module$1 = kit.defineNuxtModule({
|
|
|
59
61
|
});
|
|
60
62
|
}
|
|
61
63
|
const serverConfigFile = await utils.findDefaultSdkInitFile("server", nuxt, moduleOptions);
|
|
62
|
-
const isNitroV3 = await utils.getNitroMajorVersion() >= 3;
|
|
64
|
+
const isNitroV3 = await utils.getNitroMajorVersion(nuxt.options.rootDir) >= 3;
|
|
63
65
|
const nuxtMajor = parseInt(nuxt._version?.split(".")[0] ?? "3", 10);
|
|
64
66
|
const isMinNuxtV4 = nuxtMajor >= 4;
|
|
65
67
|
orchestrion.setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);
|
|
68
|
+
const usesDeprecatedInjectMode = moduleOptions.autoInjectServerSentry === "top-level-import" || moduleOptions.autoInjectServerSentry === "experimental_dynamic-import";
|
|
66
69
|
if (serverConfigFile) {
|
|
70
|
+
if (!usesDeprecatedInjectMode) {
|
|
71
|
+
addServerConfig.addServerConfigPlugin(nuxt, serverConfigFile);
|
|
72
|
+
}
|
|
67
73
|
if (isNitroV3) {
|
|
68
74
|
kit.addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/handler.server"));
|
|
69
75
|
kit.addServerPlugin(moduleDirResolver.resolve("./runtime/plugins/update-route-name.server"));
|
|
@@ -80,9 +86,6 @@ const module$1 = kit.defineNuxtModule({
|
|
|
80
86
|
middlewareConfig.addMiddlewareImports();
|
|
81
87
|
storageConfig.addStorageInstrumentation(nuxt, !isNitroV3);
|
|
82
88
|
databaseConfig.addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);
|
|
83
|
-
if (isNitroV3) {
|
|
84
|
-
addServerConfig.addDevServerConfigFile(nuxt, serverConfigFile);
|
|
85
|
-
}
|
|
86
89
|
}
|
|
87
90
|
if (clientConfigFile || serverConfigFile) {
|
|
88
91
|
sourceMaps.setupSourceMaps(moduleOptions, nuxt, kit.addVitePlugin);
|
|
@@ -126,56 +129,37 @@ const module$1 = kit.defineNuxtModule({
|
|
|
126
129
|
return;
|
|
127
130
|
}
|
|
128
131
|
if (serverConfigFile) {
|
|
129
|
-
middlewareConfig.addMiddlewareInstrumentation(nitro);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (serverDir.includes(".netlify") || !!process.env.NETLIFY) {
|
|
133
|
-
console.warn(
|
|
134
|
-
"[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/"
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
if (serverDir.includes(".vercel") || !!process.env.VERCEL) {
|
|
138
|
-
console.warn(
|
|
139
|
-
"[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/"
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
if (moduleOptions.autoInjectServerSentry !== "experimental_dynamic-import") {
|
|
144
|
-
if (!(isNitroV3 && nitro.options.dev)) {
|
|
145
|
-
addServerConfig.addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);
|
|
146
|
-
}
|
|
132
|
+
middlewareConfig.addMiddlewareInstrumentation(nitro, isNitroV3);
|
|
133
|
+
if (!usesDeprecatedInjectMode) {
|
|
134
|
+
addServerConfig.addServerConfigShimWithWarning(nitro);
|
|
147
135
|
if (moduleOptions.debug) {
|
|
148
|
-
const serverDirResolver = kit.createResolver(nitro.options.output.serverDir);
|
|
149
|
-
const serverConfigPath = serverDirResolver.resolve("sentry.server.config.mjs");
|
|
150
|
-
const serverConfigRelativePath = utils.toImportSpecifier(nitro.options.rootDir, serverConfigPath);
|
|
151
|
-
const devConfigRelativePath = isNitroV3 ? utils.toImportSpecifier(nuxt.options.rootDir, path.join(nuxt.options.buildDir, addServerConfig.DEV_SERVER_CONFIG_PATH)) : serverConfigRelativePath;
|
|
152
136
|
core.consoleSandbox(() => {
|
|
153
137
|
console.log(
|
|
154
|
-
`[Sentry]
|
|
138
|
+
`[Sentry] Bundled \`${serverConfigFile}\` into the Nitro server build. The SDK initializes itself at server startup \u2014 no \`node --import\` preload needed.`
|
|
155
139
|
);
|
|
156
|
-
if (nitro.options.dev) {
|
|
157
|
-
console.log(
|
|
158
|
-
`[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \`NODE_OPTIONS='--import ${devConfigRelativePath}' nuxt dev\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \`nuxt prepare\` to regenerate it.`
|
|
159
|
-
);
|
|
160
|
-
} else {
|
|
161
|
-
console.log(
|
|
162
|
-
`[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 [...]\`).`
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
140
|
});
|
|
166
141
|
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (moduleOptions.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
142
|
+
} else {
|
|
143
|
+
core.consoleSandbox(() => {
|
|
144
|
+
console.warn(
|
|
145
|
+
`[Sentry] \`autoInjectServerSentry: '${moduleOptions.autoInjectServerSentry}'\` is deprecated and will be removed in a future major version. The Sentry server config is bundled into the Nitro server build by default now. Remove the option to use the default behavior.`
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
if (moduleOptions.autoInjectServerSentry === "top-level-import") {
|
|
149
|
+
if (!(isNitroV3 && nitro.options.dev)) {
|
|
150
|
+
addServerConfig.addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);
|
|
151
|
+
}
|
|
152
|
+
addServerConfig.addSentryTopImport(moduleOptions, nitro);
|
|
153
|
+
}
|
|
154
|
+
if (moduleOptions.autoInjectServerSentry === "experimental_dynamic-import") {
|
|
155
|
+
addServerConfig.addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);
|
|
156
|
+
if (moduleOptions.debug) {
|
|
157
|
+
core.consoleSandbox(() => {
|
|
158
|
+
console.log(
|
|
159
|
+
"[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes."
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
179
163
|
}
|
|
180
164
|
}
|
|
181
165
|
}
|
package/build/cjs/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\n// Needed to make TS evaluate the augmentation of Nitro types (https://github.com/nuxt/nuxt/pull/34039)\nimport type {} from '@nuxt/nitro-server';\n\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport {\n addDevServerConfigFile,\n addDynamicImportEntryFileWrapper,\n addSentryTopImport,\n addServerConfigToBuild,\n DEV_SERVER_CONFIG_PATH,\n} from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupOrchestrion } from './vite/orchestrion';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport {\n addOTelCommonJSImportAlias,\n findDefaultSdkInitFile,\n getNitroMajorVersion,\n toImportSpecifier,\n} from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = await findDefaultSdkInitFile('client', nuxt, moduleOptions);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = await findDefaultSdkInitFile('server', nuxt, moduleOptions);\n const isNitroV3 = (await getNitroMajorVersion()) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n // Orchestrion runs on both the Node path (gated on a server config file) and the Cloudflare path\n // (which has no server config file — the SDK is set up via `sentryCloudflareNitroPlugin`). The\n // Cloudflare detection happens inside, keyed off the resolved Nitro preset.\n setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);\n\n if (serverConfigFile) {\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n\n // Outside `nitro:init` so that `nuxt prepare` writes the file before the first `nuxt dev`.\n if (isNitroV3) {\n addDevServerConfigFile(nuxt, serverConfigFile);\n }\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro);\n\n consoleSandbox(() => {\n const serverDir = nitro.options.output.serverDir;\n\n // Netlify env: https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n if (serverDir.includes('.netlify') || !!process.env.NETLIFY) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Netlify build. Server-side support for the Sentry Nuxt SDK on Netlify is currently unreliable due to technical limitations of serverless functions. Traces are not collected, and errors may occasionally not be reported. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n\n // Vercel env: https://vercel.com/docs/projects/environment-variables/system-environment-variables#VERCEL\n if (serverDir.includes('.vercel') || !!process.env.VERCEL) {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Warning: The Sentry SDK detected a Vercel build. The Sentry Nuxt SDK currently does not support tracing on Vercel. For more information on setting up Sentry on the Nuxt server-side, please refer to the documentation: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/',\n );\n }\n });\n\n if (moduleOptions.autoInjectServerSentry !== 'experimental_dynamic-import') {\n // Nitro 3 (in Nuxt 5) is not bundled in dev mode. See `addDevServerConfigFile` for how we add the file now.\n if (!(isNitroV3 && nitro.options.dev)) {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n }\n\n if (moduleOptions.debug) {\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const serverConfigPath = serverDirResolver.resolve('sentry.server.config.mjs');\n\n // For the default nitro node-preset build output this relative path would be: ./.output/server/sentry.server.config.mjs\n const serverConfigRelativePath = toImportSpecifier(nitro.options.rootDir, serverConfigPath);\n const devConfigRelativePath = isNitroV3\n ? toImportSpecifier(nuxt.options.rootDir, path.join(nuxt.options.buildDir, DEV_SERVER_CONFIG_PATH))\n : serverConfigRelativePath;\n\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Using \\`${serverConfigFile}\\` for server-side Sentry configuration. To activate Sentry on the Nuxt server-side, this file must be preloaded when starting your application. Make sure to add this where you deploy and/or run your application. Read more here: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/.`,\n );\n\n if (nitro.options.dev) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] During development, preload Sentry with the NODE_OPTIONS environment variable: \\`NODE_OPTIONS='--import ${devConfigRelativePath}' nuxt dev\\`. The file is generated in the build directory (usually '.nuxt'). If you delete the build directory, run \\`nuxt prepare\\` to regenerate it.`,\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] When running your built application, preload Sentry via a command-line flag (\\`node --import ${serverConfigRelativePath} [...]\\`) or via an environment variable (\\`NODE_OPTIONS='--import ${serverConfigRelativePath}' node [...]\\`).`,\n );\n }\n });\n }\n }\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n });\n },\n});\n"],"names":["defineNuxtModule","createResolver","findDefaultSdkInitFile","addPluginTemplate","addPlugin","getNitroMajorVersion","setupOrchestrion","addServerPlugin","addMiddlewareImports","addStorageInstrumentation","addDatabaseInstrumentation","addDevServerConfigFile","setupSourceMaps","addVitePlugin","addOTelCommonJSImportAlias","addTemplate","addMiddlewareInstrumentation","consoleSandbox","addServerConfigToBuild","toImportSpecifier","DEV_SERVER_CONFIG_PATH","addSentryTopImport","addDynamicImportEntryFileWrapper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.js","sources":["../../src/module.ts"],"sourcesContent":["import {\n addPlugin,\n addPluginTemplate,\n addServerPlugin,\n addTemplate,\n addVitePlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit';\n// Needed to make TS evaluate the augmentation of Nitro types (https://github.com/nuxt/nuxt/pull/34039)\nimport type {} from '@nuxt/nitro-server';\n\nimport { consoleSandbox } from '@sentry/core';\nimport * as path from 'path';\nimport type { SentryNuxtModuleOptions } from './common/types';\nimport {\n addDynamicImportEntryFileWrapper,\n addServerConfigShimWithWarning,\n addSentryTopImport,\n addServerConfigPlugin,\n addServerConfigToBuild,\n} from './vite/addServerConfig';\nimport { addDatabaseInstrumentation } from './vite/databaseConfig';\nimport { addMiddlewareImports, addMiddlewareInstrumentation } from './vite/middlewareConfig';\nimport { setupOrchestrion } from './vite/orchestrion';\nimport { setupSourceMaps } from './vite/sourceMaps';\nimport { addStorageInstrumentation } from './vite/storageConfig';\nimport { addOTelCommonJSImportAlias, findDefaultSdkInitFile, getNitroMajorVersion } from './vite/utils';\n\nexport type ModuleOptions = SentryNuxtModuleOptions;\ntype NuxtPageSubset = { file?: string; path: string };\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@sentry/nuxt/module',\n configKey: 'sentry',\n compatibility: {\n nuxt: '>=3.7.0',\n },\n },\n defaults: {},\n async setup(moduleOptionsParam, nuxt) {\n if (moduleOptionsParam?.enabled === false) {\n return;\n }\n\n const moduleOptions = {\n ...moduleOptionsParam,\n // oxlint-disable-next-line typescript/no-deprecated -- supported until removal\n autoInjectServerSentry: moduleOptionsParam.autoInjectServerSentry,\n // oxlint-disable-next-line typescript/no-deprecated -- supported until removal\n experimental_entrypointWrappedFunctions: moduleOptionsParam.experimental_entrypointWrappedFunctions || [\n 'default',\n 'handler',\n 'server',\n ],\n };\n\n const moduleDirResolver = createResolver(import.meta.url);\n const buildDirResolver = createResolver(nuxt.options.buildDir);\n\n const clientConfigFile = await findDefaultSdkInitFile('client', nuxt, moduleOptions);\n\n if (clientConfigFile) {\n // Inject the client-side Sentry config file with a side effect import\n addPluginTemplate({\n mode: 'client',\n filename: 'sentry-client-config.mjs',\n order: 0,\n\n // Dynamic import of config file to wrap it within a Nuxt context (here: defineNuxtPlugin)\n // Makes it possible to call useRuntimeConfig() in the user-defined sentry config file\n getContents: () => `\n import { defineNuxtPlugin } from \"#imports\";\n\n export default defineNuxtPlugin({\n name: 'sentry-client-config',\n async setup() {\n await import(\"${buildDirResolver.resolve(`/${clientConfigFile}`)}\")\n }\n });`,\n });\n\n // Add the plugin which loads client integrations etc. -\n // this must run after the sentry-client-config plugin has run, and the client is initialized!\n addPlugin({\n src: moduleDirResolver.resolve('./runtime/plugins/sentry.client'),\n mode: 'client',\n order: 1,\n });\n }\n\n const serverConfigFile = await findDefaultSdkInitFile('server', nuxt, moduleOptions);\n const isNitroV3 = (await getNitroMajorVersion(nuxt.options.rootDir)) >= 3;\n const nuxtMajor = parseInt((nuxt as unknown as { _version: string })._version?.split('.')[0] ?? '3', 10);\n const isMinNuxtV4 = nuxtMajor >= 4;\n\n // Orchestrion runs on both the Node path (gated on a server config file) and the Cloudflare path\n // (which has no server config file — the SDK is set up via `sentryCloudflareNitroPlugin`). The\n // Cloudflare detection happens inside, keyed off the resolved Nitro preset.\n setupOrchestrion(nuxt, !!serverConfigFile, moduleOptions.buildTimeInstrumentation);\n\n // The deprecated inject modes replace the default in-bundle initialization until their removal\n const usesDeprecatedInjectMode =\n moduleOptions.autoInjectServerSentry === 'top-level-import' ||\n moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import';\n\n if (serverConfigFile) {\n if (!usesDeprecatedInjectMode) {\n addServerConfigPlugin(nuxt, serverConfigFile);\n }\n\n if (isNitroV3) {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name.server'));\n } else {\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/handler-legacy.server'));\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/update-route-name-legacy.server'));\n }\n\n addServerPlugin(moduleDirResolver.resolve('./runtime/plugins/sentry.server'));\n\n if (isMinNuxtV4) {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector.server'), mode: 'server' });\n } else {\n addPlugin({ src: moduleDirResolver.resolve('./runtime/plugins/route-detector-legacy.server'), mode: 'server' });\n }\n\n // Preps the middleware instrumentation module.\n addMiddlewareImports();\n addStorageInstrumentation(nuxt, !isNitroV3);\n addDatabaseInstrumentation(nuxt.options.nitro, !isNitroV3, moduleOptions);\n }\n\n if (clientConfigFile || serverConfigFile) {\n setupSourceMaps(moduleOptions, nuxt, addVitePlugin);\n }\n\n addOTelCommonJSImportAlias(nuxt, isNitroV3);\n\n let pagesData: NuxtPageSubset[] = [];\n\n nuxt.hooks.hook('pages:extend', pages => {\n pagesData = pages\n .map(page => ({ file: page.file, path: page.path }))\n .filter(page => {\n // Check for dynamic parameter (e.g., :userId or [userId])\n return page.path.includes(':') || page?.file?.includes('[');\n });\n });\n\n if (isMinNuxtV4) {\n const pagesDataVirtualModuleId = '#sentry/nuxt-pages-data.mjs';\n\n // Vite virtual plugin (for the Vite SSR build, where addPlugin mode:'server' plugins are bundled)\n addVitePlugin({\n name: 'sentry-nuxt-pages-data-virtual',\n resolveId: id => (id === pagesDataVirtualModuleId ? `\\0${pagesDataVirtualModuleId}` : null),\n load: id =>\n id === `\\0${pagesDataVirtualModuleId}` ? `export default ${JSON.stringify(pagesData, null, 2)};` : undefined,\n });\n } else {\n // Nuxt v3: register as a build template (accessible via #build/)\n addTemplate({\n filename: 'sentry--nuxt-pages-data.mjs',\n getContents: () => `export default ${JSON.stringify(pagesData, null, 2)};`,\n });\n }\n\n // Add the sentry config file to the include array\n nuxt.hook('prepare:types', options => {\n const tsConfig = options.tsConfig as { include?: string[] };\n\n if (!tsConfig.include) {\n tsConfig.include = [];\n }\n\n // Add type references for useRuntimeConfig in root files for nuxt v4\n // Should be relative to `root/.nuxt`\n if (clientConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, clientConfigFile);\n tsConfig.include.push(relativePath);\n }\n if (serverConfigFile) {\n const relativePath = path.relative(nuxt.options.buildDir, serverConfigFile);\n tsConfig.include.push(relativePath);\n }\n });\n\n nuxt.hooks.hook('nitro:init', nitro => {\n if (nuxt.options?._prepare) {\n return;\n }\n\n if (serverConfigFile) {\n addMiddlewareInstrumentation(nitro, isNitroV3);\n\n if (!usesDeprecatedInjectMode) {\n addServerConfigShimWithWarning(nitro);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Bundled \\`${serverConfigFile}\\` into the Nitro server build. The SDK initializes itself at server startup — no \\`node --import\\` preload needed.`,\n );\n });\n }\n } else {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] \\`autoInjectServerSentry: '${moduleOptions.autoInjectServerSentry}'\\` is deprecated and will be removed in a future major version. The Sentry server config is bundled into the Nitro server build by default now. Remove the option to use the default behavior.`,\n );\n });\n\n if (moduleOptions.autoInjectServerSentry === 'top-level-import') {\n // Nitro 3 (in Nuxt 5) is not bundled in dev mode, so there is no build to emit into.\n if (!(isNitroV3 && nitro.options.dev)) {\n addServerConfigToBuild(moduleOptions, nitro, serverConfigFile);\n }\n addSentryTopImport(moduleOptions, nitro);\n }\n\n if (moduleOptions.autoInjectServerSentry === 'experimental_dynamic-import') {\n addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions);\n\n if (moduleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Wrapping the server entry file with a dynamic `import()`, so Sentry can be preloaded before the server initializes.',\n );\n });\n }\n }\n }\n }\n });\n },\n});\n"],"names":["defineNuxtModule","createResolver","findDefaultSdkInitFile","addPluginTemplate","addPlugin","getNitroMajorVersion","setupOrchestrion","addServerConfigPlugin","addServerPlugin","addMiddlewareImports","addStorageInstrumentation","addDatabaseInstrumentation","setupSourceMaps","addVitePlugin","addOTelCommonJSImportAlias","addTemplate","addMiddlewareInstrumentation","addServerConfigShimWithWarning","consoleSandbox","addServerConfigToBuild","addSentryTopImport","addDynamicImportEntryFileWrapper"],"mappings":"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"}
|
package/build/cjs/server/sdk.js
CHANGED
|
@@ -7,6 +7,18 @@ const debugBuild = require('../common/debug-build.js');
|
|
|
7
7
|
const devMode = require('../common/devMode.js');
|
|
8
8
|
|
|
9
9
|
function init(options) {
|
|
10
|
+
if (devMode.isNuxtPrerenderRuntime()) {
|
|
11
|
+
debugBuild.DEBUG_BUILD && core.debug.log("Detected a Nitro prerender build. Skipping Sentry server initialization.");
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
if (devMode.isNuxtServerInitialized()) {
|
|
15
|
+
core.consoleSandbox(() => {
|
|
16
|
+
console.log(
|
|
17
|
+
"[Sentry] The Sentry server SDK is already initialized, skipping a second initialization. The Sentry server config is bundled into the Nitro server build, so a `node --import` preload of the config file is no longer needed and can be removed."
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
return core.getClient();
|
|
21
|
+
}
|
|
10
22
|
const envFallback = devMode.isNuxtDevRuntime() ? core.DEV_ENVIRONMENT : core.DEFAULT_ENVIRONMENT;
|
|
11
23
|
const sentryOptions = {
|
|
12
24
|
environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,
|
|
@@ -14,6 +26,9 @@ function init(options) {
|
|
|
14
26
|
};
|
|
15
27
|
core.applySdkMetadata(sentryOptions, "nuxt", ["nuxt", "node"]);
|
|
16
28
|
const client = node.init(sentryOptions);
|
|
29
|
+
if (client) {
|
|
30
|
+
devMode.markNuxtServerInitialized();
|
|
31
|
+
}
|
|
17
32
|
core.getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));
|
|
18
33
|
core.getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));
|
|
19
34
|
return client;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor } from '@sentry/core';\nimport {
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, Event, EventProcessor } from '@sentry/core';\nimport {\n applySdkMetadata,\n consoleSandbox,\n debug,\n DEFAULT_ENVIRONMENT,\n DEV_ENVIRONMENT,\n getClient,\n getGlobalScope,\n} from '@sentry/core';\nimport { init as initNode } from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport {\n isNuxtDevRuntime,\n isNuxtPrerenderRuntime,\n isNuxtServerInitialized,\n markNuxtServerInitialized,\n} from '../common/devMode';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n // The prerenderer executes the server bundle (including nitro plugins) at build time (pollutes release health and adds build-time traces)\n if (isNuxtPrerenderRuntime()) {\n // potential follow-up: configurable with `capturePrerenderErrors`\n DEBUG_BUILD && debug.log('Detected a Nitro prerender build. Skipping Sentry server initialization.');\n return undefined;\n }\n\n // Since the server config is bundled into the Nitro build, a `node --import` preload of a config\n // file initializes the SDK a second time. The first init wins so a preload keeps its semantics.\n if (isNuxtServerInitialized()) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] The Sentry server SDK is already initialized, skipping a second initialization. The Sentry server config is bundled into the Nitro server build, so a `node --import` preload of the config file is no longer needed and can be removed.',\n );\n });\n return getClient();\n }\n\n let isDevBuild = false;\n /*! rollup-include-esm-only */\n isDevBuild = !!import.meta.dev;\n /*! rollup-include-esm-only-end */\n\n // `import.meta.dev` is only substituted when this file itself is bundled; the generated\n // runtime-flags module sets the global flag for the (usual) externalized case.\n const envFallback = isDevBuild || isNuxtDevRuntime() ? DEV_ENVIRONMENT : DEFAULT_ENVIRONMENT;\n\n const sentryOptions = {\n environment: options.environment ?? process.env.SENTRY_ENVIRONMENT ?? envFallback,\n ...options,\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n if (client) {\n markNuxtServerInitialized();\n }\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction || isCacheEvent(event)) {\n return event;\n }\n\n // Check if this looks like a parametrized route (contains :param or :param() patterns)\n const hasRouteParameters = /\\/:[^(/\\s]*(\\([^)]*\\))?[^/\\s]*/.test(event.transaction);\n\n if (hasRouteParameters) {\n return event;\n }\n\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\n/**\n * Checks if the event is a cache event.\n */\nfunction isCacheEvent(e: Event): boolean {\n return e.contexts?.trace?.origin === 'auto.cache.nuxt';\n}\n"],"names":["isNuxtPrerenderRuntime","DEBUG_BUILD","debug","isNuxtServerInitialized","consoleSandbox","getClient","isNuxtDevRuntime","DEV_ENVIRONMENT","DEFAULT_ENVIRONMENT","applySdkMetadata","initNode","markNuxtServerInitialized","getGlobalScope"],"mappings":";;;;;;;;AA0BO,SAAS,KAAK,OAAA,EAAsD;AAEzE,EAAA,IAAIA,gCAAuB,EAAG;AAE5B,IAAAC,sBAAA,IAAeC,UAAA,CAAM,IAAI,0EAA0E,CAAA;AACnG,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,IAAIC,iCAAwB,EAAG;AAC7B,IAAAC,mBAAA,CAAe,MAAM;AAEnB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAOC,cAAA,EAAU;AAAA,EACnB;AAEiB,EACjB,MAAA,WAAA,GAAAC,wBAAA,EAAA,GAAAC,oBAAA,GAAAC,wBAAA;AACA,EAAA,MAAA,aAAe,GAAA;AAAY,IAC3B,WAAA,EAAA,OAAA,CAAA,WAAA,IAAA,OAAA,CAAA,GAAA,CAAA,kBAAA,IAAA,WAAA;AAIA,IAAA,GAAA;AAEA,GAAA;AAAsB,EAAAC,qBACP,CAAA,aAAQ,EAAA,MAAe,EAAA,CAAA,cAAY,CAAA,CAAA;AAAsB,EAAA,MACnE,MAAA,GAAAC,SAAA,CAAA,aAAA,CAAA;AAAA,EACL,IAAA,MAAA,EAAA;AAEA,IAAAC,iCAAiB,EAAA;AAEjB,EAAA;AAEA,EAAAC,mBAAY,EAAA,CAAA,iBAAA,CAAA,4BAAA,CAAA,OAAA,CAAA,CAAA;AACV,EAAAA,mBAAA,EAAA,CAAA,iBAA0B,CAAA,0BAAA,CAAA,OAAA,CAAA,CAAA;AAAA,EAC5B,OAAA,MAAA;AAEA;AACA,SAAA,4BAAmC,CAAA,OAAA,EAAA;AAEnC,EAAA,OAAO,MAAA,CAAA,MAAA;AACT,KAAA,CAAA,KAAA,KAAA;AAQO,MAAA,IAAA,KAAA,CAAS,gCAA6B,CAAA,WAAkD,IAAA,YAAA,CAAA,KAAA,CAAA,EAAA;AAC7F,QAAA,OAAO,KAAO;AAAA,MACX;AACC,MAAA,MAAI,kBAAe,GAAA,gCAAuC,CAAA,IAAA,CAAA,KAAA,CAAa,WAAQ,CAAA;AAC7E,MAAA,IAAA,kBAAO,EAAA;AAAA,QACT,OAAA,KAAA;AAGA,MAAA;AAEA,MAAA,IAAI,IAAA,CAAA,OAAA,CAAA,KAAA,CAAA,WAAoB,CAAA,EAAA;AACtB,QAAA,OAAO,CAAA,KAAA,IAAAX,sBAAA,IAAAC,UAAA,CAAA,GAAA,CAAA,yDAAA,EAAA,KAAA,CAAA,WAAA,CAAA;AAAA,QACT,OAAA,IAAA;AAIA,MAAA;AACE,MAAA,OAAA;AAGA,IAAA,CAAA;AAAO,IAAA,EACT,EAAA,EAAA,kCAAA;AACA,GAAA;AAAO;SAEH,0BAAA,CAAA,OAAmC,EAAA;AAAA,EAC3C,OAAA,MAAA,CAAA,MAAA;AACF,KAAA,CAAA,KAAA,KAAA;AAOO,MAAA,MAAA,kCAAoC,GAAA,CAAA,CAAA,EAAkD,KAAA;AAC3F,MAAA,IAAO,QAAO,EAAA,KAAA,CAAA,mEAAA,CAAA,EAAA;AAAA,QACX,OAAA,CAAS,KAAA,IAAAD,sBAAA,IAAAC,UAAA,CAAA,GAAA,CAAA,iDAAA,EAAA,QAAA,CAAA;AACR,QAAA,OAAM,IAAA;AACN,MAAA;AACE,MAAA,OAAA,KAAQ;AACR,IAAA,CAAA;AAAO,IAAA,EACT,EAAA,EAAA,gCAAA;AACA,GAAA;AAAO;AACT,qBACM,CAAA,CAAA,EAAA;AAAiC,EACzC,OAAA,CAAA,CAAA,QAAA,EAAA,KAAA,EAAA,MAAA,KAAA,iBAAA;AACF;;;;;;"}
|
|
@@ -1,38 +1,21 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
3
|
const node_fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
4
5
|
const node_url = require('node:url');
|
|
5
6
|
const kit = require('@nuxt/kit');
|
|
6
7
|
const core = require('@sentry/core');
|
|
7
8
|
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
9
|
const devMode = require('../common/devMode.js');
|
|
10
10
|
const utils = require('./utils.js');
|
|
11
11
|
|
|
12
|
-
const
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
);
|
|
19
|
-
const failureMessage = `[Sentry] Could not load \`${path.basename(configPath)}\`, so Sentry is disabled during development. Node loads this file without a build step, so it supports neither path aliases (like #import) nor non-erasable TypeScript syntax (like enums).`;
|
|
20
|
-
kit.addTemplate({
|
|
21
|
-
filename: DEV_SERVER_CONFIG_PATH,
|
|
22
|
-
write: true,
|
|
23
|
-
getContents: () => [
|
|
24
|
-
"// Generated by @sentry/nuxt. Preload it to enable Sentry during development:",
|
|
25
|
-
`// NODE_OPTIONS='--import ${importSpecifier}' nuxt dev`,
|
|
26
|
-
// A static import would hoist above this assignment, and would make a broken config crash the dev server.
|
|
27
|
-
`globalThis.${devMode.NUXT_DEV_MODE_FLAG} = true;`,
|
|
28
|
-
"try {",
|
|
29
|
-
` await import(${JSON.stringify(node_url.pathToFileURL(configPath).href)});`,
|
|
30
|
-
"} catch (error) {",
|
|
31
|
-
` console.warn(${JSON.stringify(failureMessage)}, error);`,
|
|
32
|
-
"}",
|
|
33
|
-
""
|
|
34
|
-
].join("\n")
|
|
35
|
-
});
|
|
12
|
+
const CONFIG_EXTENSIONS = [".ts", ".js", ".mjs", ".cjs", ".mts", ".cts"];
|
|
13
|
+
function isServerConfigFile(sourcePath, resolvedPath) {
|
|
14
|
+
if (sourcePath === resolvedPath) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
const name = path.basename(sourcePath);
|
|
18
|
+
return name === utils.SERVER_CONFIG_FILENAME || CONFIG_EXTENSIONS.some((ext) => name === `${utils.SERVER_CONFIG_FILENAME}${ext}`);
|
|
36
19
|
}
|
|
37
20
|
function addServerConfigToBuild(moduleOptions, nitro, serverConfigFile) {
|
|
38
21
|
nitro.hooks.hook("rollup:before", (nitro2, rollupConfig) => {
|
|
@@ -73,6 +56,78 @@ ${data}`;
|
|
|
73
56
|
}
|
|
74
57
|
});
|
|
75
58
|
}
|
|
59
|
+
function addServerConfigPlugin(nuxt, serverConfigFile) {
|
|
60
|
+
const configPath = kit.createResolver(nuxt.options.rootDir).resolve(serverConfigFile);
|
|
61
|
+
const runtimeFlagsTemplate = kit.addTemplate({
|
|
62
|
+
filename: "sentry-runtime-flags.mjs",
|
|
63
|
+
write: true,
|
|
64
|
+
getContents: () => [
|
|
65
|
+
"// Generated by @sentry/nuxt. Sets runtime flags before the Sentry server config evaluates.",
|
|
66
|
+
`globalThis.${devMode.NUXT_DEV_MODE_FLAG} = import.meta.dev === true;`,
|
|
67
|
+
`globalThis.${devMode.NUXT_PRERENDER_FLAG} = import.meta.prerender === true;`,
|
|
68
|
+
""
|
|
69
|
+
].join("\n")
|
|
70
|
+
});
|
|
71
|
+
const configPluginTemplate = kit.addTemplate({
|
|
72
|
+
filename: "sentry-server-config-plugin.mjs",
|
|
73
|
+
write: true,
|
|
74
|
+
getContents: () => `import ${JSON.stringify(runtimeFlagsTemplate.dst)};
|
|
75
|
+
import ${JSON.stringify(configPath)};
|
|
76
|
+
export default () => {};
|
|
77
|
+
`
|
|
78
|
+
});
|
|
79
|
+
kit.addServerPlugin(configPluginTemplate.dst);
|
|
80
|
+
nuxt.options.nitro.moduleSideEffects = [
|
|
81
|
+
...nuxt.options.nitro.moduleSideEffects ?? [],
|
|
82
|
+
configPath,
|
|
83
|
+
runtimeFlagsTemplate.dst
|
|
84
|
+
];
|
|
85
|
+
nuxt.hook("nitro:config", (nitroConfig) => {
|
|
86
|
+
if (utils.isCloudflarePreset(nitroConfig.preset)) {
|
|
87
|
+
nitroConfig.plugins = (nitroConfig.plugins ?? []).filter((plugin) => plugin !== configPluginTemplate.dst);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const plugins = nitroConfig.plugins ?? [];
|
|
91
|
+
nitroConfig.plugins = [configPluginTemplate.dst, ...plugins.filter((plugin) => plugin !== configPluginTemplate.dst)];
|
|
92
|
+
const externals = nitroConfig.externals ?? (nitroConfig.externals = {});
|
|
93
|
+
const inline = externals.inline;
|
|
94
|
+
const existingInline = Array.isArray(inline) ? inline : inline ? [inline] : [];
|
|
95
|
+
externals.inline = [...existingInline, configPath, configPluginTemplate.dst, runtimeFlagsTemplate.dst];
|
|
96
|
+
});
|
|
97
|
+
nuxt.hook("nitro:init", (nitro) => {
|
|
98
|
+
if (nuxt.options._prepare || !utils.isCloudflarePreset(nitro.options.preset)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
nitro.options.plugins = (nitro.options.plugins ?? []).filter((plugin) => plugin !== configPluginTemplate.dst);
|
|
102
|
+
core.consoleSandbox(() => {
|
|
103
|
+
console.warn(
|
|
104
|
+
`[Sentry] Found \`${path.basename(configPath)}\`, but the Nitro preset targets Cloudflare, where this file is not used. Set up the SDK with \`sentryCloudflareNitroPlugin\` instead: https://docs.sentry.io/platforms/javascript/guides/nuxt/install/cloudflare-workers/`
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function addServerConfigShimWithWarning(nitro) {
|
|
110
|
+
nitro.hooks.hook("close", async () => {
|
|
111
|
+
if (nitro.options.dev || nitro.options.preset === "nitro-prerender" || utils.isCloudflarePreset(nitro.options.preset)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const shimPath = kit.createResolver(nitro.options.output.serverDir).resolve(`${utils.SERVER_CONFIG_FILENAME}.mjs`);
|
|
115
|
+
const contents = [
|
|
116
|
+
"// Generated by @sentry/nuxt.",
|
|
117
|
+
"// The Sentry server config is bundled into the server build and initializes automatically.",
|
|
118
|
+
"// This file only keeps existing `node --import ./.output/server/sentry.server.config.mjs` commands working.",
|
|
119
|
+
"console.warn('[Sentry] The `--import` flag for the Sentry server config is no longer needed and should be removed.');",
|
|
120
|
+
""
|
|
121
|
+
].join("\n");
|
|
122
|
+
try {
|
|
123
|
+
await fs.promises.writeFile(shimPath, contents, "utf8");
|
|
124
|
+
} catch (error) {
|
|
125
|
+
core.consoleSandbox(() => {
|
|
126
|
+
console.warn(`[Sentry] Could not write the \`--import\` compatibility shim to ${shimPath}`, error);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
76
131
|
function addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions) {
|
|
77
132
|
if (!nitro.options.rollupConfig) {
|
|
78
133
|
nitro.options.rollupConfig = { output: {} };
|
|
@@ -84,7 +139,8 @@ function addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions
|
|
|
84
139
|
}
|
|
85
140
|
nitro.options.rollupConfig.plugins.push(
|
|
86
141
|
wrapEntryWithDynamicImport({
|
|
87
|
-
resolvedSentryConfigPath: kit.createResolver(nitro.options.rootDir).resolve(
|
|
142
|
+
resolvedSentryConfigPath: kit.createResolver(nitro.options.rootDir).resolve(serverConfigFile),
|
|
143
|
+
// oxlint-disable-next-line typescript/no-deprecated -- supported until removal
|
|
88
144
|
experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions
|
|
89
145
|
})
|
|
90
146
|
);
|
|
@@ -94,7 +150,7 @@ function injectServerConfigPlugin(nitro, serverConfigFile, isDebug) {
|
|
|
94
150
|
return {
|
|
95
151
|
name: "rollup-plugin-inject-sentry-server-config",
|
|
96
152
|
buildStart() {
|
|
97
|
-
const configPath = kit.createResolver(nitro.options.rootDir).resolve(
|
|
153
|
+
const configPath = kit.createResolver(nitro.options.rootDir).resolve(serverConfigFile);
|
|
98
154
|
if (!node_fs.existsSync(configPath)) {
|
|
99
155
|
if (isDebug) {
|
|
100
156
|
core.debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);
|
|
@@ -110,7 +166,7 @@ function injectServerConfigPlugin(nitro, serverConfigFile, isDebug) {
|
|
|
110
166
|
resolveId(source) {
|
|
111
167
|
if (source.startsWith(filePrefix)) {
|
|
112
168
|
const originalFilePath = source.replace(filePrefix, "");
|
|
113
|
-
const configPath = kit.createResolver(nitro.options.rootDir).resolve(
|
|
169
|
+
const configPath = kit.createResolver(nitro.options.rootDir).resolve(originalFilePath);
|
|
114
170
|
return { id: configPath };
|
|
115
171
|
}
|
|
116
172
|
return null;
|
|
@@ -126,11 +182,16 @@ function wrapEntryWithDynamicImport({
|
|
|
126
182
|
return {
|
|
127
183
|
name: "sentry-wrap-entry-with-dynamic-import",
|
|
128
184
|
async resolveId(source, importer, options) {
|
|
129
|
-
|
|
130
|
-
|
|
185
|
+
const resolvable = utils.toResolvablePath(source);
|
|
186
|
+
if (!resolvable) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const { path: normalizedSource, wasFileUrl } = resolvable;
|
|
190
|
+
if (isServerConfigFile(normalizedSource, resolvedSentryConfigPath)) {
|
|
191
|
+
return { id: normalizedSource, moduleSideEffects: true };
|
|
131
192
|
}
|
|
132
|
-
if (options.isEntry &&
|
|
133
|
-
const resolution = await this.resolve(
|
|
193
|
+
if (options.isEntry && normalizedSource.includes(".mjs") && !normalizedSource.includes(`.mjs${utils.SENTRY_WRAPPED_ENTRY}`)) {
|
|
194
|
+
const resolution = await this.resolve(normalizedSource, importer, options);
|
|
134
195
|
if (!resolution || resolution?.external) return resolution;
|
|
135
196
|
const moduleInfo = await this.load(resolution);
|
|
136
197
|
moduleInfo.moduleSideEffects = true;
|
|
@@ -142,16 +203,23 @@ function wrapEntryWithDynamicImport({
|
|
|
142
203
|
)
|
|
143
204
|
).concat(utils.QUERY_END_INDICATOR)}`;
|
|
144
205
|
}
|
|
206
|
+
if (wasFileUrl) {
|
|
207
|
+
const resolved = await this.resolve(normalizedSource, importer, { ...options, isEntry: false });
|
|
208
|
+
if (resolved) return resolved;
|
|
209
|
+
return { id: normalizedSource };
|
|
210
|
+
}
|
|
145
211
|
return null;
|
|
146
212
|
},
|
|
147
213
|
load(id) {
|
|
148
214
|
if (id.includes(`.mjs${utils.SENTRY_WRAPPED_ENTRY}`)) {
|
|
149
215
|
const entryId = utils.removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);
|
|
150
|
-
const
|
|
216
|
+
const entryIdUrl = node_url.pathToFileURL(entryId).href;
|
|
217
|
+
const configUrl = node_url.pathToFileURL(resolvedSentryConfigPath).href;
|
|
218
|
+
const reExportedFunctions = id.includes(utils.SENTRY_WRAPPED_FUNCTIONS) || id.includes(utils.SENTRY_REEXPORTED_FUNCTIONS) ? utils.constructFunctionReExport(id, entryIdUrl) : "";
|
|
151
219
|
return (
|
|
152
220
|
// Regular `import` of the Sentry config
|
|
153
|
-
`import ${JSON.stringify(
|
|
154
|
-
import(${JSON.stringify(
|
|
221
|
+
`import ${JSON.stringify(configUrl)};
|
|
222
|
+
import(${JSON.stringify(entryIdUrl)});
|
|
155
223
|
${reExportedFunctions}
|
|
156
224
|
`
|
|
157
225
|
);
|
|
@@ -161,9 +229,10 @@ ${reExportedFunctions}
|
|
|
161
229
|
};
|
|
162
230
|
}
|
|
163
231
|
|
|
164
|
-
exports.DEV_SERVER_CONFIG_PATH = DEV_SERVER_CONFIG_PATH;
|
|
165
|
-
exports.addDevServerConfigFile = addDevServerConfigFile;
|
|
166
232
|
exports.addDynamicImportEntryFileWrapper = addDynamicImportEntryFileWrapper;
|
|
167
233
|
exports.addSentryTopImport = addSentryTopImport;
|
|
234
|
+
exports.addServerConfigPlugin = addServerConfigPlugin;
|
|
235
|
+
exports.addServerConfigShimWithWarning = addServerConfigShimWithWarning;
|
|
168
236
|
exports.addServerConfigToBuild = addServerConfigToBuild;
|
|
237
|
+
exports.wrapEntryWithDynamicImport = wrapEntryWithDynamicImport;
|
|
169
238
|
//# sourceMappingURL=addServerConfig.js.map
|