@sentry/nuxt 9.10.0 → 9.11.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.
- package/build/cjs/vite/sourceMaps.js +169 -74
- package/build/cjs/vite/sourceMaps.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/vite/sourceMaps.js +168 -73
- package/build/esm/vite/sourceMaps.js.map +1 -1
- package/build/module/module.json +1 -1
- package/build/module/module.mjs +106 -54
- package/build/types/vite/sourceMaps.d.ts +27 -16
- package/build/types/vite/sourceMaps.d.ts.map +1 -1
- package/package.json +9 -8
|
@@ -10,24 +10,77 @@ import { sentryVitePlugin } from '@sentry/vite-plugin';
|
|
|
10
10
|
* Setup source maps for Sentry inside the Nuxt module during build time (in Vite for Nuxt and Rollup for Nitro).
|
|
11
11
|
*/
|
|
12
12
|
function setupSourceMaps(moduleOptions, nuxt) {
|
|
13
|
+
const isDebug = moduleOptions.debug;
|
|
14
|
+
|
|
13
15
|
const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};
|
|
14
16
|
const sourceMapsEnabled = sourceMapsUploadOptions.enabled ?? true;
|
|
15
17
|
|
|
18
|
+
// In case we overwrite the source map settings, we default to deleting the files
|
|
19
|
+
let shouldDeleteFilesFallback = { client: true, server: true };
|
|
20
|
+
|
|
16
21
|
nuxt.hook('modules:done', () => {
|
|
17
22
|
if (sourceMapsEnabled && !nuxt.options.dev) {
|
|
18
|
-
|
|
23
|
+
// Changing this setting will propagate:
|
|
24
|
+
// - for client to viteConfig.build.sourceMap
|
|
25
|
+
// - for server to viteConfig.build.sourceMap and nitro.sourceMap
|
|
26
|
+
// On server, nitro.rollupConfig.output.sourcemap remains unaffected from this change.
|
|
27
|
+
|
|
28
|
+
// ONLY THIS nuxt.sourcemap.(server/client) setting is the one Sentry will eventually overwrite with 'hidden'
|
|
29
|
+
const previousSourceMapSettings = changeNuxtSourceMapSettings(nuxt, moduleOptions);
|
|
30
|
+
|
|
31
|
+
shouldDeleteFilesFallback = {
|
|
32
|
+
client: previousSourceMapSettings.client === 'unset',
|
|
33
|
+
server: previousSourceMapSettings.server === 'unset',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
if (
|
|
37
|
+
isDebug &&
|
|
38
|
+
!sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload &&
|
|
39
|
+
(shouldDeleteFilesFallback.client || shouldDeleteFilesFallback.server)
|
|
40
|
+
) {
|
|
41
|
+
consoleSandbox(() =>
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.log(
|
|
44
|
+
"[Sentry] As Sentry enabled `'hidden'` source maps, source maps will be automatically deleted after uploading them to Sentry.",
|
|
45
|
+
),
|
|
46
|
+
);
|
|
47
|
+
}
|
|
19
48
|
}
|
|
20
49
|
});
|
|
21
50
|
|
|
22
|
-
nuxt.hook('vite:extendConfig', async (viteConfig,
|
|
51
|
+
nuxt.hook('vite:extendConfig', async (viteConfig, env) => {
|
|
23
52
|
if (sourceMapsEnabled && viteConfig.mode !== 'development') {
|
|
24
|
-
const
|
|
53
|
+
const runtime = env.isServer ? 'server' : env.isClient ? 'client' : undefined;
|
|
54
|
+
const nuxtSourceMapSetting = extractNuxtSourceMapSetting(nuxt, runtime);
|
|
55
|
+
|
|
56
|
+
viteConfig.build = viteConfig.build || {};
|
|
57
|
+
const viteSourceMap = viteConfig.build.sourcemap;
|
|
58
|
+
|
|
59
|
+
// Vite source map options are the same as the Nuxt source map config options (unless overwritten)
|
|
60
|
+
validateDifferentSourceMapSettings({
|
|
61
|
+
nuxtSettingKey: `sourcemap.${runtime}`,
|
|
62
|
+
nuxtSettingValue: nuxtSourceMapSetting,
|
|
63
|
+
otherSettingKey: 'viteConfig.build.sourcemap',
|
|
64
|
+
otherSettingValue: viteSourceMap,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
if (isDebug) {
|
|
68
|
+
consoleSandbox(() => {
|
|
69
|
+
if (!runtime) {
|
|
70
|
+
// eslint-disable-next-line no-console
|
|
71
|
+
console.log("[Sentry] Cannot detect runtime (client/server) inside hook 'vite:extendConfig'.");
|
|
72
|
+
} else {
|
|
73
|
+
// eslint-disable-next-line no-console
|
|
74
|
+
console.log(`[Sentry] Adding Sentry Vite plugin to the ${runtime} runtime.`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
25
78
|
|
|
26
|
-
//
|
|
79
|
+
// Add Sentry plugin
|
|
80
|
+
// Vite plugin is added on the client and server side (hook runs twice)
|
|
81
|
+
// Nuxt client source map is 'false' by default. Warning about this will be shown already in an earlier step, and it's also documented that `nuxt.sourcemap.client` needs to be enabled.
|
|
27
82
|
viteConfig.plugins = viteConfig.plugins || [];
|
|
28
|
-
viteConfig.plugins.push(
|
|
29
|
-
sentryVitePlugin(getPluginOptions(moduleOptions, previousUserSourceMapSetting === 'unset')),
|
|
30
|
-
);
|
|
83
|
+
viteConfig.plugins.push(sentryVitePlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)));
|
|
31
84
|
}
|
|
32
85
|
});
|
|
33
86
|
|
|
@@ -44,11 +97,19 @@ function setupSourceMaps(moduleOptions, nuxt) {
|
|
|
44
97
|
nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];
|
|
45
98
|
}
|
|
46
99
|
|
|
47
|
-
|
|
100
|
+
validateNitroSourceMapSettings(nuxt, nitroConfig, moduleOptions);
|
|
101
|
+
|
|
102
|
+
if (isDebug) {
|
|
103
|
+
consoleSandbox(() => {
|
|
104
|
+
// eslint-disable-next-line no-console
|
|
105
|
+
console.log('[Sentry] Adding Sentry Rollup plugin to the server runtime.');
|
|
106
|
+
});
|
|
107
|
+
}
|
|
48
108
|
|
|
49
109
|
// Add Sentry plugin
|
|
110
|
+
// Runs only on server-side (Nitro)
|
|
50
111
|
nitroConfig.rollupConfig.plugins.push(
|
|
51
|
-
sentryRollupPlugin(getPluginOptions(moduleOptions,
|
|
112
|
+
sentryRollupPlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)),
|
|
52
113
|
);
|
|
53
114
|
}
|
|
54
115
|
});
|
|
@@ -68,15 +129,29 @@ function normalizePath(path) {
|
|
|
68
129
|
*/
|
|
69
130
|
function getPluginOptions(
|
|
70
131
|
moduleOptions,
|
|
71
|
-
|
|
132
|
+
shouldDeleteFilesFallback,
|
|
72
133
|
) {
|
|
73
134
|
const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};
|
|
74
135
|
|
|
75
|
-
|
|
136
|
+
const shouldDeleteFilesAfterUpload = shouldDeleteFilesFallback?.client || shouldDeleteFilesFallback?.server;
|
|
137
|
+
const fallbackFilesToDelete = [
|
|
138
|
+
...(shouldDeleteFilesFallback?.client ? ['.*/**/public/**/*.map'] : []),
|
|
139
|
+
...(shouldDeleteFilesFallback?.server
|
|
140
|
+
? ['.*/**/server/**/*.map', '.*/**/output/**/*.map', '.*/**/function/**/*.map']
|
|
141
|
+
: []),
|
|
142
|
+
];
|
|
143
|
+
|
|
144
|
+
if (
|
|
145
|
+
typeof sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload === 'undefined' &&
|
|
146
|
+
shouldDeleteFilesAfterUpload
|
|
147
|
+
) {
|
|
76
148
|
consoleSandbox(() => {
|
|
77
149
|
// eslint-disable-next-line no-console
|
|
78
150
|
console.log(
|
|
79
|
-
|
|
151
|
+
`[Sentry] Setting \`sentry.sourceMapsUploadOptions.sourcemaps.filesToDeleteAfterUpload: [${fallbackFilesToDelete
|
|
152
|
+
// Logging it as strings in the array
|
|
153
|
+
.map(path => `"${path}"`)
|
|
154
|
+
.join(', ')}]\` to delete generated source maps after they were uploaded to Sentry.`,
|
|
80
155
|
);
|
|
81
156
|
});
|
|
82
157
|
}
|
|
@@ -109,8 +184,8 @@ function getPluginOptions(
|
|
|
109
184
|
ignore: sourceMapsUploadOptions.sourcemaps?.ignore ?? undefined,
|
|
110
185
|
filesToDeleteAfterUpload: sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload
|
|
111
186
|
? sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload
|
|
112
|
-
:
|
|
113
|
-
?
|
|
187
|
+
: shouldDeleteFilesFallback?.server || shouldDeleteFilesFallback?.client
|
|
188
|
+
? fallbackFilesToDelete
|
|
114
189
|
: undefined,
|
|
115
190
|
rewriteSources: (source) => normalizePath(source),
|
|
116
191
|
...moduleOptions?.unstable_sentryBundlerPluginOptions?.sourcemaps,
|
|
@@ -118,7 +193,7 @@ function getPluginOptions(
|
|
|
118
193
|
};
|
|
119
194
|
}
|
|
120
195
|
|
|
121
|
-
/* There are
|
|
196
|
+
/* There are multiple ways to set up source maps (https://github.com/getsentry/sentry-javascript/issues/13993 and https://github.com/getsentry/sentry-javascript/pull/15859)
|
|
122
197
|
1. User explicitly disabled source maps
|
|
123
198
|
- keep this setting (emit a warning that errors won't be unminified in Sentry)
|
|
124
199
|
- We will not upload anything
|
|
@@ -128,11 +203,24 @@ function getPluginOptions(
|
|
|
128
203
|
- we enable 'hidden' source maps generation
|
|
129
204
|
- configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)
|
|
130
205
|
|
|
131
|
-
|
|
132
|
-
Ideally, all 3 are enabled to get all source maps.
|
|
206
|
+
Users only have to explicitly enable client source maps. Sentry only overwrites the base Nuxt source map settings as they propagate.
|
|
133
207
|
*/
|
|
134
208
|
|
|
135
|
-
/** only exported for
|
|
209
|
+
/** only exported for tests */
|
|
210
|
+
function extractNuxtSourceMapSetting(
|
|
211
|
+
nuxt,
|
|
212
|
+
runtime,
|
|
213
|
+
) {
|
|
214
|
+
if (!runtime) {
|
|
215
|
+
return undefined;
|
|
216
|
+
} else {
|
|
217
|
+
return typeof nuxt.options?.sourcemap === 'boolean' || typeof nuxt.options?.sourcemap === 'string'
|
|
218
|
+
? nuxt.options.sourcemap
|
|
219
|
+
: nuxt.options?.sourcemap?.[runtime];
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** only exported for testing */
|
|
136
224
|
function changeNuxtSourceMapSettings(
|
|
137
225
|
nuxt,
|
|
138
226
|
sentryModuleOptions,
|
|
@@ -155,7 +243,7 @@ function changeNuxtSourceMapSettings(
|
|
|
155
243
|
|
|
156
244
|
case 'hidden':
|
|
157
245
|
case true:
|
|
158
|
-
|
|
246
|
+
logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap', (nuxtSourceMap ).toString());
|
|
159
247
|
previousUserSourceMapSetting = { client: 'enabled', server: 'enabled' };
|
|
160
248
|
break;
|
|
161
249
|
case undefined:
|
|
@@ -170,7 +258,7 @@ function changeNuxtSourceMapSettings(
|
|
|
170
258
|
warnExplicitlyDisabledSourceMap('sourcemap.client');
|
|
171
259
|
previousUserSourceMapSetting.client = 'disabled';
|
|
172
260
|
} else if (['hidden', true].includes(nuxtSourceMap.client)) {
|
|
173
|
-
|
|
261
|
+
logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.client', nuxtSourceMap.client.toString());
|
|
174
262
|
previousUserSourceMapSetting.client = 'enabled';
|
|
175
263
|
} else {
|
|
176
264
|
nuxt.options.sourcemap.client = 'hidden';
|
|
@@ -182,7 +270,7 @@ function changeNuxtSourceMapSettings(
|
|
|
182
270
|
warnExplicitlyDisabledSourceMap('sourcemap.server');
|
|
183
271
|
previousUserSourceMapSetting.server = 'disabled';
|
|
184
272
|
} else if (['hidden', true].includes(nuxtSourceMap.server)) {
|
|
185
|
-
|
|
273
|
+
logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.server', nuxtSourceMap.server.toString());
|
|
186
274
|
previousUserSourceMapSetting.server = 'enabled';
|
|
187
275
|
} else {
|
|
188
276
|
nuxt.options.sourcemap.server = 'hidden';
|
|
@@ -194,69 +282,76 @@ function changeNuxtSourceMapSettings(
|
|
|
194
282
|
return previousUserSourceMapSetting;
|
|
195
283
|
}
|
|
196
284
|
|
|
197
|
-
/**
|
|
198
|
-
|
|
199
|
-
|
|
285
|
+
/** Logs warnings about potentially conflicting source map settings.
|
|
286
|
+
* Configures `sourcemapExcludeSources` in Nitro to make source maps usable in Sentry.
|
|
287
|
+
*
|
|
288
|
+
* only exported for testing
|
|
289
|
+
*/
|
|
290
|
+
function validateNitroSourceMapSettings(
|
|
291
|
+
nuxt,
|
|
292
|
+
nitroConfig,
|
|
200
293
|
sentryModuleOptions,
|
|
201
294
|
) {
|
|
202
|
-
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
let previousUserSourceMapSetting;
|
|
295
|
+
const isDebug = sentryModuleOptions.debug;
|
|
296
|
+
const nuxtSourceMap = extractNuxtSourceMapSetting(nuxt, 'server');
|
|
206
297
|
|
|
207
|
-
|
|
208
|
-
warnExplicitlyDisabledSourceMap('vite.build.sourcemap');
|
|
209
|
-
previousUserSourceMapSetting = 'disabled';
|
|
210
|
-
} else if (viteSourceMap && ['hidden', 'inline', true].includes(viteSourceMap)) {
|
|
211
|
-
logKeepSourceMapSetting(sentryModuleOptions, 'vite.build.sourcemap', viteSourceMap.toString());
|
|
212
|
-
previousUserSourceMapSetting = 'enabled';
|
|
213
|
-
} else {
|
|
214
|
-
viteConfig.build.sourcemap = 'hidden';
|
|
215
|
-
logSentryEnablesSourceMap('vite.build.sourcemap', 'hidden');
|
|
216
|
-
previousUserSourceMapSetting = 'unset';
|
|
217
|
-
}
|
|
298
|
+
// NITRO CONFIG ---
|
|
218
299
|
|
|
219
|
-
|
|
220
|
-
|
|
300
|
+
validateDifferentSourceMapSettings({
|
|
301
|
+
nuxtSettingKey: 'sourcemap.server',
|
|
302
|
+
nuxtSettingValue: nuxtSourceMap,
|
|
303
|
+
otherSettingKey: 'nitro.sourceMap',
|
|
304
|
+
otherSettingValue: nitroConfig.sourceMap,
|
|
305
|
+
});
|
|
221
306
|
|
|
222
|
-
|
|
223
|
-
function changeRollupSourceMapSettings(
|
|
224
|
-
nitroConfig
|
|
307
|
+
// ROLLUP CONFIG ---
|
|
225
308
|
|
|
226
|
-
,
|
|
227
|
-
sentryModuleOptions,
|
|
228
|
-
) {
|
|
229
309
|
nitroConfig.rollupConfig = nitroConfig.rollupConfig || {};
|
|
230
310
|
nitroConfig.rollupConfig.output = nitroConfig.rollupConfig.output || { sourcemap: undefined };
|
|
311
|
+
const nitroRollupSourceMap = nitroConfig.rollupConfig.output.sourcemap;
|
|
231
312
|
|
|
232
|
-
|
|
313
|
+
// We don't override nitro.rollupConfig.output.sourcemap (undefined by default, but overrides all other server-side source map settings)
|
|
314
|
+
if (typeof nitroRollupSourceMap !== 'undefined' && ['hidden', 'inline', true, false].includes(nitroRollupSourceMap)) {
|
|
315
|
+
const settingKey = 'nitro.rollupConfig.output.sourcemap';
|
|
233
316
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
logKeepSourceMapSetting(sentryModuleOptions, 'nitro.rollupConfig.output.sourcemap', nitroSourceMap.toString());
|
|
241
|
-
previousUserSourceMapSetting = 'enabled';
|
|
242
|
-
} else {
|
|
243
|
-
nitroConfig.rollupConfig.output.sourcemap = 'hidden';
|
|
244
|
-
logSentryEnablesSourceMap('nitro.rollupConfig.output.sourcemap', 'hidden');
|
|
245
|
-
previousUserSourceMapSetting = 'unset';
|
|
317
|
+
validateDifferentSourceMapSettings({
|
|
318
|
+
nuxtSettingKey: 'sourcemap.server',
|
|
319
|
+
nuxtSettingValue: nuxtSourceMap,
|
|
320
|
+
otherSettingKey: settingKey,
|
|
321
|
+
otherSettingValue: nitroRollupSourceMap,
|
|
322
|
+
});
|
|
246
323
|
}
|
|
247
324
|
|
|
248
325
|
nitroConfig.rollupConfig.output.sourcemapExcludeSources = false;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
326
|
+
if (isDebug) {
|
|
327
|
+
consoleSandbox(() => {
|
|
328
|
+
// eslint-disable-next-line no-console
|
|
329
|
+
console.log(
|
|
330
|
+
'[Sentry] Set `sourcemapExcludeSources: false` in the Nuxt config (`nitro.rollupConfig.output`). Source maps will now include the actual code to be able to un-minify code snippets in Sentry.',
|
|
331
|
+
);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
255
335
|
|
|
256
|
-
|
|
336
|
+
function validateDifferentSourceMapSettings({
|
|
337
|
+
nuxtSettingKey,
|
|
338
|
+
nuxtSettingValue,
|
|
339
|
+
otherSettingKey,
|
|
340
|
+
otherSettingValue,
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
) {
|
|
344
|
+
if (nuxtSettingValue !== otherSettingValue) {
|
|
345
|
+
consoleSandbox(() => {
|
|
346
|
+
// eslint-disable-next-line no-console
|
|
347
|
+
console.warn(
|
|
348
|
+
`[Sentry] Source map generation settings are conflicting. Sentry uses \`${nuxtSettingKey}: ${nuxtSettingValue}\`. However, a conflicting setting was discovered (\`${otherSettingKey}: ${otherSettingValue}\`). This setting was probably explicitly set in your configuration. Sentry won't override this setting but it may affect source maps generation and upload. Without source maps, code snippets on the Sentry Issues page will remain minified.`,
|
|
349
|
+
);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
257
352
|
}
|
|
258
353
|
|
|
259
|
-
function
|
|
354
|
+
function logKeepEnabledSourceMapSetting(
|
|
260
355
|
sentryNuxtModuleOptions,
|
|
261
356
|
settingKey,
|
|
262
357
|
settingValue,
|
|
@@ -265,7 +360,7 @@ function logKeepSourceMapSetting(
|
|
|
265
360
|
consoleSandbox(() => {
|
|
266
361
|
// eslint-disable-next-line no-console
|
|
267
362
|
console.log(
|
|
268
|
-
`[Sentry]
|
|
363
|
+
`[Sentry] \`${settingKey}\` is enabled with \`${settingValue}\`. This will correctly un-minify the code snippet on the Sentry Issue Details page.`,
|
|
269
364
|
);
|
|
270
365
|
});
|
|
271
366
|
}
|
|
@@ -273,19 +368,19 @@ function logKeepSourceMapSetting(
|
|
|
273
368
|
|
|
274
369
|
function warnExplicitlyDisabledSourceMap(settingKey) {
|
|
275
370
|
consoleSandbox(() => {
|
|
276
|
-
//
|
|
371
|
+
// eslint-disable-next-line no-console
|
|
277
372
|
console.warn(
|
|
278
|
-
`[Sentry]
|
|
373
|
+
`[Sentry] We discovered \`${settingKey}\` is set to \`false\`. This setting is either a default setting or was explicitly set in your configuration. Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified. To show unminified code, enable source maps in \`${settingKey}\` (e.g. by setting them to \`'hidden'\`).`,
|
|
279
374
|
);
|
|
280
375
|
});
|
|
281
376
|
}
|
|
282
377
|
|
|
283
378
|
function logSentryEnablesSourceMap(settingKey, settingValue) {
|
|
284
379
|
consoleSandbox(() => {
|
|
285
|
-
//
|
|
380
|
+
// eslint-disable-next-line no-console
|
|
286
381
|
console.log(`[Sentry] Enabled source map generation in the build options with \`${settingKey}: ${settingValue}\`.`);
|
|
287
382
|
});
|
|
288
383
|
}
|
|
289
384
|
|
|
290
|
-
export { changeNuxtSourceMapSettings,
|
|
385
|
+
export { changeNuxtSourceMapSettings, extractNuxtSourceMapSetting, getPluginOptions, setupSourceMaps, validateNitroSourceMapSettings };
|
|
291
386
|
//# sourceMappingURL=sourceMaps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { consoleSandbox } from '@sentry/core';\nimport { type SentryRollupPluginOptions, sentryRollupPlugin } from '@sentry/rollup-plugin';\nimport { type SentryVitePluginOptions, sentryVitePlugin } from '@sentry/vite-plugin';\nimport type { NitroConfig } from 'nitropack';\nimport type { OutputOptions } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\n\n/**\n * Whether the user enabled (true, 'hidden', 'inline') or disabled (false) source maps\n */\nexport type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;\n\n/**\n * Setup source maps for Sentry inside the Nuxt module during build time (in Vite for Nuxt and Rollup for Nitro).\n */\nexport function setupSourceMaps(moduleOptions: SentryNuxtModuleOptions, nuxt: Nuxt): void {\n const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};\n const sourceMapsEnabled = sourceMapsUploadOptions.enabled ?? true;\n\n nuxt.hook('modules:done', () => {\n if (sourceMapsEnabled && !nuxt.options.dev) {\n changeNuxtSourceMapSettings(nuxt, moduleOptions);\n }\n });\n\n nuxt.hook('vite:extendConfig', async (viteConfig, _env) => {\n if (sourceMapsEnabled && viteConfig.mode !== 'development') {\n const previousUserSourceMapSetting = changeViteSourceMapSettings(viteConfig, moduleOptions);\n\n // Add Sentry plugin\n viteConfig.plugins = viteConfig.plugins || [];\n viteConfig.plugins.push(\n sentryVitePlugin(getPluginOptions(moduleOptions, previousUserSourceMapSetting === 'unset')),\n );\n }\n });\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (sourceMapsEnabled && !nitroConfig.dev) {\n if (!nitroConfig.rollupConfig) {\n nitroConfig.rollupConfig = {};\n }\n\n if (nitroConfig.rollupConfig.plugins === null || nitroConfig.rollupConfig.plugins === undefined) {\n nitroConfig.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitroConfig.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n const previousUserSourceMapSetting = changeRollupSourceMapSettings(nitroConfig, moduleOptions);\n\n // Add Sentry plugin\n nitroConfig.rollupConfig.plugins.push(\n sentryRollupPlugin(getPluginOptions(moduleOptions, previousUserSourceMapSetting === 'unset')),\n );\n }\n });\n}\n\n/**\n * Normalizes the beginning of a path from e.g. ../../../ to ./\n */\nfunction normalizePath(path: string): string {\n return path.replace(/^(\\.\\.\\/)+/, './');\n}\n\n/**\n * Generates source maps upload options for the Sentry Vite and Rollup plugin.\n *\n * Only exported for Testing purposes.\n */\nexport function getPluginOptions(\n moduleOptions: SentryNuxtModuleOptions,\n deleteFilesAfterUpload: boolean,\n): SentryVitePluginOptions | SentryRollupPluginOptions {\n const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};\n\n if (typeof sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload === 'undefined' && deleteFilesAfterUpload) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Setting `sentry.sourceMapsUploadOptions.sourcemaps.filesToDeleteAfterUpload: [\".*/**/public/**/*.map\"]` to delete generated source maps after they were uploaded to Sentry.',\n );\n });\n }\n\n return {\n org: sourceMapsUploadOptions.org ?? process.env.SENTRY_ORG,\n project: sourceMapsUploadOptions.project ?? process.env.SENTRY_PROJECT,\n authToken: sourceMapsUploadOptions.authToken ?? process.env.SENTRY_AUTH_TOKEN,\n telemetry: sourceMapsUploadOptions.telemetry ?? true,\n url: sourceMapsUploadOptions.url ?? process.env.SENTRY_URL,\n debug: moduleOptions.debug ?? false,\n silent: sourceMapsUploadOptions.silent ?? false,\n errorHandler: sourceMapsUploadOptions.errorHandler,\n release: {\n name: sourceMapsUploadOptions.release?.name,\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.release,\n },\n _metaOptions: {\n telemetry: {\n metaFramework: 'nuxt',\n },\n },\n ...moduleOptions?.unstable_sentryBundlerPluginOptions,\n\n sourcemaps: {\n // The server/client files are in different places depending on the nitro preset (e.g. '.output/server' or '.netlify/functions-internal/server')\n // We cannot determine automatically how the build folder looks like (depends on the preset), so we have to accept that source maps are uploaded multiple times (with the vitePlugin for Nuxt and the rollupPlugin for Nitro).\n // If we could know where the server/client assets are located, we could do something like this (based on the Nitro preset): isNitro ? ['./.output/server/**/*'] : ['./.output/public/**/*'],\n assets: sourceMapsUploadOptions.sourcemaps?.assets ?? undefined,\n ignore: sourceMapsUploadOptions.sourcemaps?.ignore ?? undefined,\n filesToDeleteAfterUpload: sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload\n ? sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload\n : deleteFilesAfterUpload\n ? ['.*/**/public/**/*.map']\n : undefined,\n rewriteSources: (source: string) => normalizePath(source),\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.sourcemaps,\n },\n };\n}\n\n/* There are 3 ways to set up source maps (https://github.com/getsentry/sentry-javascript/issues/13993)\n 1. User explicitly disabled source maps\n - keep this setting (emit a warning that errors won't be unminified in Sentry)\n - We will not upload anything\n 2. users enabled source map generation (true, hidden, inline).\n - keep this setting (don't do anything - like deletion - besides uploading)\n 3. users did not set source maps generation\n - we enable 'hidden' source maps generation\n - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n\n Nuxt has 3 places to set source maps: vite options, rollup options, nuxt itself\n Ideally, all 3 are enabled to get all source maps.\n */\n\n/** only exported for testing */\nexport function changeNuxtSourceMapSettings(\n nuxt: Nuxt,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): { client: UserSourceMapSetting; server: UserSourceMapSetting } {\n nuxt.options.sourcemap = nuxt.options.sourcemap ?? { server: undefined, client: undefined };\n\n let previousUserSourceMapSetting: { client: UserSourceMapSetting; server: UserSourceMapSetting } = {\n client: undefined,\n server: undefined,\n };\n\n const nuxtSourceMap = nuxt.options.sourcemap;\n\n if (typeof nuxtSourceMap === 'string' || typeof nuxtSourceMap === 'boolean' || typeof nuxtSourceMap === 'undefined') {\n switch (nuxtSourceMap) {\n case false:\n warnExplicitlyDisabledSourceMap('sourcemap');\n previousUserSourceMapSetting = { client: 'disabled', server: 'disabled' };\n break;\n\n case 'hidden':\n case true:\n logKeepSourceMapSetting(sentryModuleOptions, 'sourcemap', (nuxtSourceMap as true).toString());\n previousUserSourceMapSetting = { client: 'enabled', server: 'enabled' };\n break;\n case undefined:\n nuxt.options.sourcemap = { server: 'hidden', client: 'hidden' };\n logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting = { client: 'unset', server: 'unset' };\n break;\n }\n } else {\n if (nuxtSourceMap.client === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.client');\n previousUserSourceMapSetting.client = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.client)) {\n logKeepSourceMapSetting(sentryModuleOptions, 'sourcemap.client', nuxtSourceMap.client.toString());\n previousUserSourceMapSetting.client = 'enabled';\n } else {\n nuxt.options.sourcemap.client = 'hidden';\n logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n previousUserSourceMapSetting.client = 'unset';\n }\n\n if (nuxtSourceMap.server === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.server');\n previousUserSourceMapSetting.server = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.server)) {\n logKeepSourceMapSetting(sentryModuleOptions, 'sourcemap.server', nuxtSourceMap.server.toString());\n previousUserSourceMapSetting.server = 'enabled';\n } else {\n nuxt.options.sourcemap.server = 'hidden';\n logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting.server = 'unset';\n }\n }\n\n return previousUserSourceMapSetting;\n}\n\n/** only exported for testing */\nexport function changeViteSourceMapSettings(\n viteConfig: { build?: { sourcemap?: boolean | 'inline' | 'hidden' } },\n sentryModuleOptions: SentryNuxtModuleOptions,\n): UserSourceMapSetting {\n viteConfig.build = viteConfig.build || {};\n const viteSourceMap = viteConfig.build.sourcemap;\n\n let previousUserSourceMapSetting: UserSourceMapSetting;\n\n if (viteSourceMap === false) {\n warnExplicitlyDisabledSourceMap('vite.build.sourcemap');\n previousUserSourceMapSetting = 'disabled';\n } else if (viteSourceMap && ['hidden', 'inline', true].includes(viteSourceMap)) {\n logKeepSourceMapSetting(sentryModuleOptions, 'vite.build.sourcemap', viteSourceMap.toString());\n previousUserSourceMapSetting = 'enabled';\n } else {\n viteConfig.build.sourcemap = 'hidden';\n logSentryEnablesSourceMap('vite.build.sourcemap', 'hidden');\n previousUserSourceMapSetting = 'unset';\n }\n\n return previousUserSourceMapSetting;\n}\n\n/** only exported for testing */\nexport function changeRollupSourceMapSettings(\n nitroConfig: {\n rollupConfig?: {\n output?: {\n sourcemap?: OutputOptions['sourcemap'];\n sourcemapExcludeSources?: OutputOptions['sourcemapExcludeSources'];\n };\n };\n },\n sentryModuleOptions: SentryNuxtModuleOptions,\n): UserSourceMapSetting {\n nitroConfig.rollupConfig = nitroConfig.rollupConfig || {};\n nitroConfig.rollupConfig.output = nitroConfig.rollupConfig.output || { sourcemap: undefined };\n\n let previousUserSourceMapSetting: UserSourceMapSetting;\n\n const nitroSourceMap = nitroConfig.rollupConfig.output.sourcemap;\n\n if (nitroSourceMap === false) {\n warnExplicitlyDisabledSourceMap('nitro.rollupConfig.output.sourcemap');\n previousUserSourceMapSetting = 'disabled';\n } else if (nitroSourceMap && ['hidden', 'inline', true].includes(nitroSourceMap)) {\n logKeepSourceMapSetting(sentryModuleOptions, 'nitro.rollupConfig.output.sourcemap', nitroSourceMap.toString());\n previousUserSourceMapSetting = 'enabled';\n } else {\n nitroConfig.rollupConfig.output.sourcemap = 'hidden';\n logSentryEnablesSourceMap('nitro.rollupConfig.output.sourcemap', 'hidden');\n previousUserSourceMapSetting = 'unset';\n }\n\n nitroConfig.rollupConfig.output.sourcemapExcludeSources = false;\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Disabled source map setting in the Nuxt config: `nitro.rollupConfig.output.sourcemapExcludeSources`. Source maps will include the actual code to be able to un-minify code snippets in Sentry.',\n );\n });\n\n return previousUserSourceMapSetting;\n}\n\nfunction logKeepSourceMapSetting(\n sentryNuxtModuleOptions: SentryNuxtModuleOptions,\n settingKey: string,\n settingValue: string,\n): void {\n if (sentryNuxtModuleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`${settingValue}\\`. Sentry will keep this source map setting. This will un-minify the code snippet on the Sentry Issue page.`,\n );\n });\n }\n}\n\nfunction warnExplicitlyDisabledSourceMap(settingKey: string): void {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Parts of source map generation are currently disabled in your Nuxt configuration (\\`${settingKey}: false\\`). This setting is either a default setting or was explicitly set in your configuration. Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified. To show unminified code, enable source maps in \\`${settingKey}\\` (e.g. by setting them to \\`hidden\\`).`,\n );\n });\n}\n\nfunction logSentryEnablesSourceMap(settingKey: string, settingValue: string): void {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(`[Sentry] Enabled source map generation in the build options with \\`${settingKey}: ${settingValue}\\`.`);\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sourceMaps.js","sources":["../../../src/vite/sourceMaps.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema';\nimport { consoleSandbox } from '@sentry/core';\nimport { type SentryRollupPluginOptions, sentryRollupPlugin } from '@sentry/rollup-plugin';\nimport { type SentryVitePluginOptions, sentryVitePlugin } from '@sentry/vite-plugin';\nimport type { NitroConfig } from 'nitropack';\nimport type { SentryNuxtModuleOptions } from '../common/types';\n\n/**\n * Whether the user enabled (true, 'hidden', 'inline') or disabled (false) source maps\n */\nexport type UserSourceMapSetting = 'enabled' | 'disabled' | 'unset' | undefined;\n\n/** A valid source map setting */\nexport type SourceMapSetting = boolean | 'hidden' | 'inline';\n\n/**\n * Setup source maps for Sentry inside the Nuxt module during build time (in Vite for Nuxt and Rollup for Nitro).\n */\nexport function setupSourceMaps(moduleOptions: SentryNuxtModuleOptions, nuxt: Nuxt): void {\n const isDebug = moduleOptions.debug;\n\n const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};\n const sourceMapsEnabled = sourceMapsUploadOptions.enabled ?? true;\n\n // In case we overwrite the source map settings, we default to deleting the files\n let shouldDeleteFilesFallback = { client: true, server: true };\n\n nuxt.hook('modules:done', () => {\n if (sourceMapsEnabled && !nuxt.options.dev) {\n // Changing this setting will propagate:\n // - for client to viteConfig.build.sourceMap\n // - for server to viteConfig.build.sourceMap and nitro.sourceMap\n // On server, nitro.rollupConfig.output.sourcemap remains unaffected from this change.\n\n // ONLY THIS nuxt.sourcemap.(server/client) setting is the one Sentry will eventually overwrite with 'hidden'\n const previousSourceMapSettings = changeNuxtSourceMapSettings(nuxt, moduleOptions);\n\n shouldDeleteFilesFallback = {\n client: previousSourceMapSettings.client === 'unset',\n server: previousSourceMapSettings.server === 'unset',\n };\n\n if (\n isDebug &&\n !sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload &&\n (shouldDeleteFilesFallback.client || shouldDeleteFilesFallback.server)\n ) {\n consoleSandbox(() =>\n // eslint-disable-next-line no-console\n console.log(\n \"[Sentry] As Sentry enabled `'hidden'` source maps, source maps will be automatically deleted after uploading them to Sentry.\",\n ),\n );\n }\n }\n });\n\n nuxt.hook('vite:extendConfig', async (viteConfig, env) => {\n if (sourceMapsEnabled && viteConfig.mode !== 'development') {\n const runtime = env.isServer ? 'server' : env.isClient ? 'client' : undefined;\n const nuxtSourceMapSetting = extractNuxtSourceMapSetting(nuxt, runtime);\n\n viteConfig.build = viteConfig.build || {};\n const viteSourceMap = viteConfig.build.sourcemap;\n\n // Vite source map options are the same as the Nuxt source map config options (unless overwritten)\n validateDifferentSourceMapSettings({\n nuxtSettingKey: `sourcemap.${runtime}`,\n nuxtSettingValue: nuxtSourceMapSetting,\n otherSettingKey: 'viteConfig.build.sourcemap',\n otherSettingValue: viteSourceMap,\n });\n\n if (isDebug) {\n consoleSandbox(() => {\n if (!runtime) {\n // eslint-disable-next-line no-console\n console.log(\"[Sentry] Cannot detect runtime (client/server) inside hook 'vite:extendConfig'.\");\n } else {\n // eslint-disable-next-line no-console\n console.log(`[Sentry] Adding Sentry Vite plugin to the ${runtime} runtime.`);\n }\n });\n }\n\n // Add Sentry plugin\n // Vite plugin is added on the client and server side (hook runs twice)\n // Nuxt client source map is 'false' by default. Warning about this will be shown already in an earlier step, and it's also documented that `nuxt.sourcemap.client` needs to be enabled.\n viteConfig.plugins = viteConfig.plugins || [];\n viteConfig.plugins.push(sentryVitePlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)));\n }\n });\n\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n if (sourceMapsEnabled && !nitroConfig.dev) {\n if (!nitroConfig.rollupConfig) {\n nitroConfig.rollupConfig = {};\n }\n\n if (nitroConfig.rollupConfig.plugins === null || nitroConfig.rollupConfig.plugins === undefined) {\n nitroConfig.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitroConfig.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitroConfig.rollupConfig.plugins = [nitroConfig.rollupConfig.plugins];\n }\n\n validateNitroSourceMapSettings(nuxt, nitroConfig, moduleOptions);\n\n if (isDebug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log('[Sentry] Adding Sentry Rollup plugin to the server runtime.');\n });\n }\n\n // Add Sentry plugin\n // Runs only on server-side (Nitro)\n nitroConfig.rollupConfig.plugins.push(\n sentryRollupPlugin(getPluginOptions(moduleOptions, shouldDeleteFilesFallback)),\n );\n }\n });\n}\n\n/**\n * Normalizes the beginning of a path from e.g. ../../../ to ./\n */\nfunction normalizePath(path: string): string {\n return path.replace(/^(\\.\\.\\/)+/, './');\n}\n\n/**\n * Generates source maps upload options for the Sentry Vite and Rollup plugin.\n *\n * Only exported for Testing purposes.\n */\nexport function getPluginOptions(\n moduleOptions: SentryNuxtModuleOptions,\n shouldDeleteFilesFallback?: { client: boolean; server: boolean },\n): SentryVitePluginOptions | SentryRollupPluginOptions {\n const sourceMapsUploadOptions = moduleOptions.sourceMapsUploadOptions || {};\n\n const shouldDeleteFilesAfterUpload = shouldDeleteFilesFallback?.client || shouldDeleteFilesFallback?.server;\n const fallbackFilesToDelete = [\n ...(shouldDeleteFilesFallback?.client ? ['.*/**/public/**/*.map'] : []),\n ...(shouldDeleteFilesFallback?.server\n ? ['.*/**/server/**/*.map', '.*/**/output/**/*.map', '.*/**/function/**/*.map']\n : []),\n ];\n\n if (\n typeof sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload === 'undefined' &&\n shouldDeleteFilesAfterUpload\n ) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Setting \\`sentry.sourceMapsUploadOptions.sourcemaps.filesToDeleteAfterUpload: [${fallbackFilesToDelete\n // Logging it as strings in the array\n .map(path => `\"${path}\"`)\n .join(', ')}]\\` to delete generated source maps after they were uploaded to Sentry.`,\n );\n });\n }\n\n return {\n org: sourceMapsUploadOptions.org ?? process.env.SENTRY_ORG,\n project: sourceMapsUploadOptions.project ?? process.env.SENTRY_PROJECT,\n authToken: sourceMapsUploadOptions.authToken ?? process.env.SENTRY_AUTH_TOKEN,\n telemetry: sourceMapsUploadOptions.telemetry ?? true,\n url: sourceMapsUploadOptions.url ?? process.env.SENTRY_URL,\n debug: moduleOptions.debug ?? false,\n silent: sourceMapsUploadOptions.silent ?? false,\n errorHandler: sourceMapsUploadOptions.errorHandler,\n release: {\n name: sourceMapsUploadOptions.release?.name,\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.release,\n },\n _metaOptions: {\n telemetry: {\n metaFramework: 'nuxt',\n },\n },\n ...moduleOptions?.unstable_sentryBundlerPluginOptions,\n\n sourcemaps: {\n // The server/client files are in different places depending on the nitro preset (e.g. '.output/server' or '.netlify/functions-internal/server')\n // We cannot determine automatically how the build folder looks like (depends on the preset), so we have to accept that source maps are uploaded multiple times (with the vitePlugin for Nuxt and the rollupPlugin for Nitro).\n // If we could know where the server/client assets are located, we could do something like this (based on the Nitro preset): isNitro ? ['./.output/server/**/*'] : ['./.output/public/**/*'],\n assets: sourceMapsUploadOptions.sourcemaps?.assets ?? undefined,\n ignore: sourceMapsUploadOptions.sourcemaps?.ignore ?? undefined,\n filesToDeleteAfterUpload: sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload\n ? sourceMapsUploadOptions.sourcemaps?.filesToDeleteAfterUpload\n : shouldDeleteFilesFallback?.server || shouldDeleteFilesFallback?.client\n ? fallbackFilesToDelete\n : undefined,\n rewriteSources: (source: string) => normalizePath(source),\n ...moduleOptions?.unstable_sentryBundlerPluginOptions?.sourcemaps,\n },\n };\n}\n\n/* There are multiple ways to set up source maps (https://github.com/getsentry/sentry-javascript/issues/13993 and https://github.com/getsentry/sentry-javascript/pull/15859)\n 1. User explicitly disabled source maps\n - keep this setting (emit a warning that errors won't be unminified in Sentry)\n - We will not upload anything\n 2. users enabled source map generation (true, hidden, inline).\n - keep this setting (don't do anything - like deletion - besides uploading)\n 3. users did not set source maps generation\n - we enable 'hidden' source maps generation\n - configure `filesToDeleteAfterUpload` to delete all .map files (we emit a log about this)\n\n Users only have to explicitly enable client source maps. Sentry only overwrites the base Nuxt source map settings as they propagate.\n */\n\n/** only exported for tests */\nexport function extractNuxtSourceMapSetting(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting; client?: SourceMapSetting } } },\n runtime: 'client' | 'server' | undefined,\n): SourceMapSetting | undefined {\n if (!runtime) {\n return undefined;\n } else {\n return typeof nuxt.options?.sourcemap === 'boolean' || typeof nuxt.options?.sourcemap === 'string'\n ? nuxt.options.sourcemap\n : nuxt.options?.sourcemap?.[runtime];\n }\n}\n\n/** only exported for testing */\nexport function changeNuxtSourceMapSettings(\n nuxt: Nuxt,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): { client: UserSourceMapSetting; server: UserSourceMapSetting } {\n nuxt.options.sourcemap = nuxt.options.sourcemap ?? { server: undefined, client: undefined };\n\n let previousUserSourceMapSetting: { client: UserSourceMapSetting; server: UserSourceMapSetting } = {\n client: undefined,\n server: undefined,\n };\n\n const nuxtSourceMap = nuxt.options.sourcemap;\n\n if (typeof nuxtSourceMap === 'string' || typeof nuxtSourceMap === 'boolean' || typeof nuxtSourceMap === 'undefined') {\n switch (nuxtSourceMap) {\n case false:\n warnExplicitlyDisabledSourceMap('sourcemap');\n previousUserSourceMapSetting = { client: 'disabled', server: 'disabled' };\n break;\n\n case 'hidden':\n case true:\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap', (nuxtSourceMap as true).toString());\n previousUserSourceMapSetting = { client: 'enabled', server: 'enabled' };\n break;\n case undefined:\n nuxt.options.sourcemap = { server: 'hidden', client: 'hidden' };\n logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting = { client: 'unset', server: 'unset' };\n break;\n }\n } else {\n if (nuxtSourceMap.client === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.client');\n previousUserSourceMapSetting.client = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.client)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.client', nuxtSourceMap.client.toString());\n previousUserSourceMapSetting.client = 'enabled';\n } else {\n nuxt.options.sourcemap.client = 'hidden';\n logSentryEnablesSourceMap('sourcemap.client', 'hidden');\n previousUserSourceMapSetting.client = 'unset';\n }\n\n if (nuxtSourceMap.server === false) {\n warnExplicitlyDisabledSourceMap('sourcemap.server');\n previousUserSourceMapSetting.server = 'disabled';\n } else if (['hidden', true].includes(nuxtSourceMap.server)) {\n logKeepEnabledSourceMapSetting(sentryModuleOptions, 'sourcemap.server', nuxtSourceMap.server.toString());\n previousUserSourceMapSetting.server = 'enabled';\n } else {\n nuxt.options.sourcemap.server = 'hidden';\n logSentryEnablesSourceMap('sourcemap.server', 'hidden');\n previousUserSourceMapSetting.server = 'unset';\n }\n }\n\n return previousUserSourceMapSetting;\n}\n\n/** Logs warnings about potentially conflicting source map settings.\n * Configures `sourcemapExcludeSources` in Nitro to make source maps usable in Sentry.\n *\n * only exported for testing\n */\nexport function validateNitroSourceMapSettings(\n nuxt: { options: { sourcemap?: SourceMapSetting | { server?: SourceMapSetting } } },\n nitroConfig: NitroConfig,\n sentryModuleOptions: SentryNuxtModuleOptions,\n): void {\n const isDebug = sentryModuleOptions.debug;\n const nuxtSourceMap = extractNuxtSourceMapSetting(nuxt, 'server');\n\n // NITRO CONFIG ---\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: 'nitro.sourceMap',\n otherSettingValue: nitroConfig.sourceMap,\n });\n\n // ROLLUP CONFIG ---\n\n nitroConfig.rollupConfig = nitroConfig.rollupConfig || {};\n nitroConfig.rollupConfig.output = nitroConfig.rollupConfig.output || { sourcemap: undefined };\n const nitroRollupSourceMap = nitroConfig.rollupConfig.output.sourcemap;\n\n // We don't override nitro.rollupConfig.output.sourcemap (undefined by default, but overrides all other server-side source map settings)\n if (typeof nitroRollupSourceMap !== 'undefined' && ['hidden', 'inline', true, false].includes(nitroRollupSourceMap)) {\n const settingKey = 'nitro.rollupConfig.output.sourcemap';\n\n validateDifferentSourceMapSettings({\n nuxtSettingKey: 'sourcemap.server',\n nuxtSettingValue: nuxtSourceMap,\n otherSettingKey: settingKey,\n otherSettingValue: nitroRollupSourceMap,\n });\n }\n\n nitroConfig.rollupConfig.output.sourcemapExcludeSources = false;\n if (isDebug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n '[Sentry] Set `sourcemapExcludeSources: false` in the Nuxt config (`nitro.rollupConfig.output`). Source maps will now include the actual code to be able to un-minify code snippets in Sentry.',\n );\n });\n }\n}\n\nfunction validateDifferentSourceMapSettings({\n nuxtSettingKey,\n nuxtSettingValue,\n otherSettingKey,\n otherSettingValue,\n}: {\n nuxtSettingKey: string;\n nuxtSettingValue?: SourceMapSetting;\n otherSettingKey: string;\n otherSettingValue?: SourceMapSetting;\n}): void {\n if (nuxtSettingValue !== otherSettingValue) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] Source map generation settings are conflicting. Sentry uses \\`${nuxtSettingKey}: ${nuxtSettingValue}\\`. However, a conflicting setting was discovered (\\`${otherSettingKey}: ${otherSettingValue}\\`). This setting was probably explicitly set in your configuration. Sentry won't override this setting but it may affect source maps generation and upload. Without source maps, code snippets on the Sentry Issues page will remain minified.`,\n );\n });\n }\n}\n\nfunction logKeepEnabledSourceMapSetting(\n sentryNuxtModuleOptions: SentryNuxtModuleOptions,\n settingKey: string,\n settingValue: string,\n): void {\n if (sentryNuxtModuleOptions.debug) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] \\`${settingKey}\\` is enabled with \\`${settingValue}\\`. This will correctly un-minify the code snippet on the Sentry Issue Details page.`,\n );\n });\n }\n}\n\nfunction warnExplicitlyDisabledSourceMap(settingKey: string): void {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] We discovered \\`${settingKey}\\` is set to \\`false\\`. This setting is either a default setting or was explicitly set in your configuration. Sentry won't override this setting. Without source maps, code snippets on the Sentry Issues page will remain minified. To show unminified code, enable source maps in \\`${settingKey}\\` (e.g. by setting them to \\`'hidden'\\`).`,\n );\n });\n}\n\nfunction logSentryEnablesSourceMap(settingKey: string, settingValue: string): void {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.log(`[Sentry] Enabled source map generation in the build options with \\`${settingKey}: ${settingValue}\\`.`);\n });\n}\n"],"names":[],"mappings":"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"}
|