@sentry/nuxt 9.38.0 → 9.40.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/server/sdk.js +5 -5
- package/build/cjs/server/sdk.js.map +1 -1
- package/build/cjs/vite/addServerConfig.js +3 -3
- package/build/cjs/vite/addServerConfig.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/sdk.js +6 -6
- package/build/esm/server/sdk.js.map +1 -1
- package/build/esm/vite/addServerConfig.js +4 -4
- package/build/esm/vite/addServerConfig.js.map +1 -1
- package/build/module/module.json +1 -1
- package/build/module/module.mjs +6 -6
- package/build/module/runtime/hooks/updateRouteBeforeResponse.js +2 -2
- package/build/module/runtime/plugins/route-detector.server.js +4 -4
- package/build/module/runtime/plugins/sentry-cloudflare.server.js +5 -5
- package/build/module/runtime/plugins/sentry.server.js +2 -2
- package/build/module/runtime/utils/route-extraction.js +3 -3
- package/build/module/runtime/utils.js +6 -14
- package/build/types/runtime/utils.d.ts.map +1 -1
- package/package.json +6 -6
package/build/cjs/server/sdk.js
CHANGED
|
@@ -43,7 +43,7 @@ function lowQualityTransactionsFilter(options) {
|
|
|
43
43
|
if (path.extname(event.transaction)) {
|
|
44
44
|
options.debug &&
|
|
45
45
|
debugBuild.DEBUG_BUILD &&
|
|
46
|
-
core.
|
|
46
|
+
core.debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);
|
|
47
47
|
return null;
|
|
48
48
|
}
|
|
49
49
|
return event;
|
|
@@ -62,7 +62,7 @@ function clientSourceMapErrorFilter(options) {
|
|
|
62
62
|
(event => {
|
|
63
63
|
const errorMsg = event.exception?.values?.[0]?.value;
|
|
64
64
|
if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\/_nuxt\/.*\.js\.map'/)) {
|
|
65
|
-
options.debug && debugBuild.DEBUG_BUILD && core.
|
|
65
|
+
options.debug && debugBuild.DEBUG_BUILD && core.debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);
|
|
66
66
|
return null;
|
|
67
67
|
}
|
|
68
68
|
return event;
|
|
@@ -91,11 +91,11 @@ function getNuxtDefaultIntegrations(options) {
|
|
|
91
91
|
*/
|
|
92
92
|
async function flushSafelyWithTimeout() {
|
|
93
93
|
try {
|
|
94
|
-
debugBuild.DEBUG_BUILD && core.
|
|
94
|
+
debugBuild.DEBUG_BUILD && core.debug.log('Flushing events...');
|
|
95
95
|
await core.flush(2000);
|
|
96
|
-
debugBuild.DEBUG_BUILD && core.
|
|
96
|
+
debugBuild.DEBUG_BUILD && core.debug.log('Done flushing events');
|
|
97
97
|
} catch (e) {
|
|
98
|
-
debugBuild.DEBUG_BUILD && core.
|
|
98
|
+
debugBuild.DEBUG_BUILD && core.debug.log('Error while flushing events:\n', e);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, EventProcessor, Integration } from '@sentry/core';\nimport { applySdkMetadata, flush, getGlobalScope,
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, EventProcessor, Integration } from '@sentry/core';\nimport { applySdkMetadata, debug, flush, getGlobalScope, vercelWaitUntil } from '@sentry/core';\nimport {\n type NodeOptions,\n getDefaultIntegrations as getDefaultNodeIntegrations,\n httpIntegration,\n init as initNode,\n} from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n const sentryOptions = {\n ...options,\n defaultIntegrations: getNuxtDefaultIntegrations(options),\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction) {\n return event;\n }\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\nfunction getNuxtDefaultIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getDefaultNodeIntegrations(options).filter(integration => integration.name !== 'Http'),\n // The httpIntegration is added as defaultIntegration, so users can still overwrite it\n httpIntegration({\n instrumentation: {\n responseHook: () => {\n // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)\n vercelWaitUntil(flushSafelyWithTimeout());\n },\n },\n }),\n ];\n}\n\n/**\n * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.\n */\nexport async function flushSafelyWithTimeout(): Promise<void> {\n try {\n DEBUG_BUILD && debug.log('Flushing events...');\n await flush(2000);\n DEBUG_BUILD && debug.log('Done flushing events');\n } catch (e) {\n DEBUG_BUILD && debug.log('Error while flushing events:\\n', e);\n }\n}\n"],"names":["applySdkMetadata","initNode","getGlobalScope","DEBUG_BUILD","debug","getDefaultNodeIntegrations","httpIntegration","vercelWaitUntil","flush"],"mappings":";;;;;;;AAYA;AACA;AACA;AACA;AACA;AACO,SAAS,IAAI,CAAC,OAAO,EAA+C;AAC3E,EAAE,MAAM,gBAAgB;AACxB,IAAI,GAAG,OAAO;AACd,IAAI,mBAAmB,EAAE,0BAA0B,CAAC,OAAO,CAAC;AAC5D,GAAG;;AAEH,EAAEA,qBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;AAE3D,EAAE,MAAM,MAAA,GAASC,SAAQ,CAAC,aAAa,CAAC;;AAExC,EAAEC,mBAAc,EAAE,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAC3E,EAAEA,mBAAc,EAAE,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;;AAEzE,EAAE,OAAO,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,4BAA4B,CAAC,OAAO,EAA2C;AAC/F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,IAAI,KAAK,CAAC,IAAA,KAAS,aAAA,IAAiB,CAAC,KAAK,CAAC,WAAW,EAAE;AAC9D,QAAQ,OAAO,KAAK;AACpB;AACA;AACA;AACA,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;AAC3C,QAAQ,OAAO,CAAC,KAAA;AAChB,UAAUC,sBAAA;AACV,UAAUC,UAAK,CAAC,GAAG,CAAC,yDAAyD,EAAE,KAAK,CAAC,WAAW,CAAC;AACjG,QAAQ,OAAO,IAAI;AACnB;AACA,MAAM,OAAO,KAAK;AAClB,KAAK;AACL,IAAI,EAAE,EAAE,EAAE,kCAAA,EAAoC;AAC9C,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,0BAA0B,CAAC,OAAO,EAA2C;AAC7F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,MAAM,QAAA,GAAW,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK;AAC1D,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC,mEAAmE,CAAC,EAAE;AAChG,QAAQ,OAAO,CAAC,KAAA,IAASD,sBAAA,IAAeC,UAAK,CAAC,GAAG,CAAC,iDAAiD,EAAE,QAAQ,CAAC;AAC9G,QAAQ,OAAO,IAAI;AACnB;AACA,MAAM,OAAO,KAAK;AAClB,KAAK;AACL,IAAI,EAAE,EAAE,EAAE,gCAAA,EAAkC;AAC5C,GAAG;AACH;;AAEA,SAAS,0BAA0B,CAAC,OAAO,EAA8B;AACzE,EAAE,OAAO;AACT,IAAI,GAAGC,2BAA0B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAA,IAAe,WAAW,CAAC,IAAA,KAAS,MAAM,CAAC;AAC7F;AACA,IAAIC,oBAAe,CAAC;AACpB,MAAM,eAAe,EAAE;AACvB,QAAQ,YAAY,EAAE,MAAM;AAC5B;AACA,UAAUC,oBAAe,CAAC,sBAAsB,EAAE,CAAC;AACnD,SAAS;AACT,OAAO;AACP,KAAK,CAAC;AACN,GAAG;AACH;;AAEA;AACA;AACA;AACO,eAAe,sBAAsB,GAAkB;AAC9D,EAAE,IAAI;AACN,IAAIJ,0BAAeC,UAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAClD,IAAI,MAAMI,UAAK,CAAC,IAAI,CAAC;AACrB,IAAIL,0BAAeC,UAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACpD,GAAE,CAAE,OAAO,CAAC,EAAE;AACd,IAAID,sBAAA,IAAeC,UAAK,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC,CAAC;AACjE;AACA;;;;;;;"}
|
|
@@ -114,7 +114,7 @@ function addDynamicImportEntryFileWrapper(
|
|
|
114
114
|
/**
|
|
115
115
|
* Rollup plugin to include the Sentry server configuration file to the server build output.
|
|
116
116
|
*/
|
|
117
|
-
function injectServerConfigPlugin(nitro, serverConfigFile,
|
|
117
|
+
function injectServerConfigPlugin(nitro, serverConfigFile, isDebug) {
|
|
118
118
|
const filePrefix = '\0virtual:sentry-server-config:';
|
|
119
119
|
|
|
120
120
|
return {
|
|
@@ -124,8 +124,8 @@ function injectServerConfigPlugin(nitro, serverConfigFile, debug) {
|
|
|
124
124
|
const configPath = kit.createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);
|
|
125
125
|
|
|
126
126
|
if (!node_fs.existsSync(configPath)) {
|
|
127
|
-
if (
|
|
128
|
-
core.
|
|
127
|
+
if (isDebug) {
|
|
128
|
+
core.debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);
|
|
129
129
|
}
|
|
130
130
|
return;
|
|
131
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createResolver } from '@nuxt/kit';\nimport { logger } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport type { InputPluginOption } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application (which is needed for import-in-the-middle).\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, debug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (debug) {\n logger.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (source === 'import-in-the-middle/hook.mjs') {\n // We are importing \"import-in-the-middle\" in the returned code of the `load()` function below\n // By setting `moduleSideEffects` to `true`, the import is added to the bundle, although nothing is imported from it\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file is included, as not all node builders are including files imported with `module.register()`.\n // Prevents the error \"Failed to register ESM hook Error: Cannot find module 'import-in-the-middle/hook.mjs'\"\n return { id: source, moduleSideEffects: true, external: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`.\n \"import 'import-in-the-middle/hook.mjs';\\n\" +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":["getFilenameFromNodeStartCommand","createResolver","existsSync","logger","SENTRY_WRAPPED_ENTRY","constructWrappedFunctionExportQuery","QUERY_END_INDICATOR","removeSentryQueryFromPath","SENTRY_WRAPPED_FUNCTIONS","SENTRY_REEXPORTED_FUNCTIONS","constructFunctionReExport"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createResolver } from '@nuxt/kit';\nimport { debug } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport type { InputPluginOption } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application (which is needed for import-in-the-middle).\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, isDebug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (isDebug) {\n debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (source === 'import-in-the-middle/hook.mjs') {\n // We are importing \"import-in-the-middle\" in the returned code of the `load()` function below\n // By setting `moduleSideEffects` to `true`, the import is added to the bundle, although nothing is imported from it\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file is included, as not all node builders are including files imported with `module.register()`.\n // Prevents the error \"Failed to register ESM hook Error: Cannot find module 'import-in-the-middle/hook.mjs'\"\n return { id: source, moduleSideEffects: true, external: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`.\n \"import 'import-in-the-middle/hook.mjs';\\n\" +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":["getFilenameFromNodeStartCommand","createResolver","existsSync","debug","SENTRY_WRAPPED_ENTRY","constructWrappedFunctionExportQuery","QUERY_END_INDICATOR","removeSentryQueryFromPath","SENTRY_WRAPPED_FUNCTIONS","SENTRY_REEXPORTED_FUNCTIONS","constructFunctionReExport"],"mappings":"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"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"9.
|
|
1
|
+
{"type":"module","version":"9.40.0"}
|
package/build/esm/server/sdk.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
|
-
import { applySdkMetadata, getGlobalScope,
|
|
2
|
+
import { applySdkMetadata, getGlobalScope, debug, vercelWaitUntil, flush } from '@sentry/core';
|
|
3
3
|
import { init as init$1, getDefaultIntegrations, httpIntegration } from '@sentry/node';
|
|
4
4
|
import { DEBUG_BUILD } from '../common/debug-build.js';
|
|
5
5
|
|
|
@@ -41,7 +41,7 @@ function lowQualityTransactionsFilter(options) {
|
|
|
41
41
|
if (path.extname(event.transaction)) {
|
|
42
42
|
options.debug &&
|
|
43
43
|
DEBUG_BUILD &&
|
|
44
|
-
|
|
44
|
+
debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);
|
|
45
45
|
return null;
|
|
46
46
|
}
|
|
47
47
|
return event;
|
|
@@ -60,7 +60,7 @@ function clientSourceMapErrorFilter(options) {
|
|
|
60
60
|
(event => {
|
|
61
61
|
const errorMsg = event.exception?.values?.[0]?.value;
|
|
62
62
|
if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\/_nuxt\/.*\.js\.map'/)) {
|
|
63
|
-
options.debug && DEBUG_BUILD &&
|
|
63
|
+
options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);
|
|
64
64
|
return null;
|
|
65
65
|
}
|
|
66
66
|
return event;
|
|
@@ -89,11 +89,11 @@ function getNuxtDefaultIntegrations(options) {
|
|
|
89
89
|
*/
|
|
90
90
|
async function flushSafelyWithTimeout() {
|
|
91
91
|
try {
|
|
92
|
-
DEBUG_BUILD &&
|
|
92
|
+
DEBUG_BUILD && debug.log('Flushing events...');
|
|
93
93
|
await flush(2000);
|
|
94
|
-
DEBUG_BUILD &&
|
|
94
|
+
DEBUG_BUILD && debug.log('Done flushing events');
|
|
95
95
|
} catch (e) {
|
|
96
|
-
DEBUG_BUILD &&
|
|
96
|
+
DEBUG_BUILD && debug.log('Error while flushing events:\n', e);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, EventProcessor, Integration } from '@sentry/core';\nimport { applySdkMetadata, flush, getGlobalScope,
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../src/server/sdk.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Client, EventProcessor, Integration } from '@sentry/core';\nimport { applySdkMetadata, debug, flush, getGlobalScope, vercelWaitUntil } from '@sentry/core';\nimport {\n type NodeOptions,\n getDefaultIntegrations as getDefaultNodeIntegrations,\n httpIntegration,\n init as initNode,\n} from '@sentry/node';\nimport { DEBUG_BUILD } from '../common/debug-build';\nimport type { SentryNuxtServerOptions } from '../common/types';\n\n/**\n * Initializes the server-side of the Nuxt SDK\n *\n * @param options Configuration options for the SDK.\n */\nexport function init(options: SentryNuxtServerOptions): Client | undefined {\n const sentryOptions = {\n ...options,\n defaultIntegrations: getNuxtDefaultIntegrations(options),\n };\n\n applySdkMetadata(sentryOptions, 'nuxt', ['nuxt', 'node']);\n\n const client = initNode(sentryOptions);\n\n getGlobalScope().addEventProcessor(lowQualityTransactionsFilter(options));\n getGlobalScope().addEventProcessor(clientSourceMapErrorFilter(options));\n\n return client;\n}\n\n/**\n * Filter out transactions for resource requests which we don't want to send to Sentry\n * for quota reasons.\n *\n * Only exported for testing\n */\nexport function lowQualityTransactionsFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n if (event.type !== 'transaction' || !event.transaction) {\n return event;\n }\n // We don't want to send transaction for file requests, so everything ending with a *.someExtension should be filtered out\n // path.extname will return an empty string for normal page requests\n if (path.extname(event.transaction)) {\n options.debug &&\n DEBUG_BUILD &&\n debug.log('NuxtLowQualityTransactionsFilter filtered transaction: ', event.transaction);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtLowQualityTransactionsFilter' },\n );\n}\n\n/**\n * The browser devtools try to get the source maps, but as client source maps may not be available there is going to be an error (no problem for the application though).\n *\n * Only exported for testing\n */\nexport function clientSourceMapErrorFilter(options: SentryNuxtServerOptions): EventProcessor {\n return Object.assign(\n (event => {\n const errorMsg = event.exception?.values?.[0]?.value;\n if (errorMsg?.match(/^ENOENT: no such file or directory, open '.*\\/_nuxt\\/.*\\.js\\.map'/)) {\n options.debug && DEBUG_BUILD && debug.log('NuxtClientSourceMapErrorFilter filtered error: ', errorMsg);\n return null;\n }\n return event;\n }) satisfies EventProcessor,\n { id: 'NuxtClientSourceMapErrorFilter' },\n );\n}\n\nfunction getNuxtDefaultIntegrations(options: NodeOptions): Integration[] {\n return [\n ...getDefaultNodeIntegrations(options).filter(integration => integration.name !== 'Http'),\n // The httpIntegration is added as defaultIntegration, so users can still overwrite it\n httpIntegration({\n instrumentation: {\n responseHook: () => {\n // Makes it possible to end the tracing span before closing the Vercel lambda (https://vercel.com/docs/functions/functions-api-reference#waituntil)\n vercelWaitUntil(flushSafelyWithTimeout());\n },\n },\n }),\n ];\n}\n\n/**\n * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections.\n */\nexport async function flushSafelyWithTimeout(): Promise<void> {\n try {\n DEBUG_BUILD && debug.log('Flushing events...');\n await flush(2000);\n DEBUG_BUILD && debug.log('Done flushing events');\n } catch (e) {\n DEBUG_BUILD && debug.log('Error while flushing events:\\n', e);\n }\n}\n"],"names":["initNode","getDefaultNodeIntegrations"],"mappings":";;;;;AAYA;AACA;AACA;AACA;AACA;AACO,SAAS,IAAI,CAAC,OAAO,EAA+C;AAC3E,EAAE,MAAM,gBAAgB;AACxB,IAAI,GAAG,OAAO;AACd,IAAI,mBAAmB,EAAE,0BAA0B,CAAC,OAAO,CAAC;AAC5D,GAAG;;AAEH,EAAE,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;AAE3D,EAAE,MAAM,MAAA,GAASA,MAAQ,CAAC,aAAa,CAAC;;AAExC,EAAE,cAAc,EAAE,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC;AAC3E,EAAE,cAAc,EAAE,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;;AAEzE,EAAE,OAAO,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,4BAA4B,CAAC,OAAO,EAA2C;AAC/F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,IAAI,KAAK,CAAC,IAAA,KAAS,aAAA,IAAiB,CAAC,KAAK,CAAC,WAAW,EAAE;AAC9D,QAAQ,OAAO,KAAK;AACpB;AACA;AACA;AACA,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;AAC3C,QAAQ,OAAO,CAAC,KAAA;AAChB,UAAU,WAAA;AACV,UAAU,KAAK,CAAC,GAAG,CAAC,yDAAyD,EAAE,KAAK,CAAC,WAAW,CAAC;AACjG,QAAQ,OAAO,IAAI;AACnB;AACA,MAAM,OAAO,KAAK;AAClB,KAAK;AACL,IAAI,EAAE,EAAE,EAAE,kCAAA,EAAoC;AAC9C,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,0BAA0B,CAAC,OAAO,EAA2C;AAC7F,EAAE,OAAO,MAAM,CAAC,MAAM;AACtB,KAAK,SAAS;AACd,MAAM,MAAM,QAAA,GAAW,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK;AAC1D,MAAM,IAAI,QAAQ,EAAE,KAAK,CAAC,mEAAmE,CAAC,EAAE;AAChG,QAAQ,OAAO,CAAC,KAAA,IAAS,WAAA,IAAe,KAAK,CAAC,GAAG,CAAC,iDAAiD,EAAE,QAAQ,CAAC;AAC9G,QAAQ,OAAO,IAAI;AACnB;AACA,MAAM,OAAO,KAAK;AAClB,KAAK;AACL,IAAI,EAAE,EAAE,EAAE,gCAAA,EAAkC;AAC5C,GAAG;AACH;;AAEA,SAAS,0BAA0B,CAAC,OAAO,EAA8B;AACzE,EAAE,OAAO;AACT,IAAI,GAAGC,sBAA0B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAA,IAAe,WAAW,CAAC,IAAA,KAAS,MAAM,CAAC;AAC7F;AACA,IAAI,eAAe,CAAC;AACpB,MAAM,eAAe,EAAE;AACvB,QAAQ,YAAY,EAAE,MAAM;AAC5B;AACA,UAAU,eAAe,CAAC,sBAAsB,EAAE,CAAC;AACnD,SAAS;AACT,OAAO;AACP,KAAK,CAAC;AACN,GAAG;AACH;;AAEA;AACA;AACA;AACO,eAAe,sBAAsB,GAAkB;AAC9D,EAAE,IAAI;AACN,IAAI,eAAe,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAClD,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC;AACrB,IAAI,eAAe,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACpD,GAAE,CAAE,OAAO,CAAC,EAAE;AACd,IAAI,WAAA,IAAe,KAAK,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC,CAAC;AACjE;AACA;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { createResolver } from '@nuxt/kit';
|
|
3
|
-
import {
|
|
3
|
+
import { debug } from '@sentry/core';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
5
|
import { getFilenameFromNodeStartCommand, SENTRY_WRAPPED_ENTRY, removeSentryQueryFromPath, SENTRY_WRAPPED_FUNCTIONS, SENTRY_REEXPORTED_FUNCTIONS, constructFunctionReExport, constructWrappedFunctionExportQuery, QUERY_END_INDICATOR } from './utils.js';
|
|
6
6
|
|
|
@@ -112,7 +112,7 @@ function addDynamicImportEntryFileWrapper(
|
|
|
112
112
|
/**
|
|
113
113
|
* Rollup plugin to include the Sentry server configuration file to the server build output.
|
|
114
114
|
*/
|
|
115
|
-
function injectServerConfigPlugin(nitro, serverConfigFile,
|
|
115
|
+
function injectServerConfigPlugin(nitro, serverConfigFile, isDebug) {
|
|
116
116
|
const filePrefix = '\0virtual:sentry-server-config:';
|
|
117
117
|
|
|
118
118
|
return {
|
|
@@ -122,8 +122,8 @@ function injectServerConfigPlugin(nitro, serverConfigFile, debug) {
|
|
|
122
122
|
const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);
|
|
123
123
|
|
|
124
124
|
if (!existsSync(configPath)) {
|
|
125
|
-
if (
|
|
126
|
-
|
|
125
|
+
if (isDebug) {
|
|
126
|
+
debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);
|
|
127
127
|
}
|
|
128
128
|
return;
|
|
129
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createResolver } from '@nuxt/kit';\nimport { logger } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport type { InputPluginOption } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application (which is needed for import-in-the-middle).\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, debug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (debug) {\n logger.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (source === 'import-in-the-middle/hook.mjs') {\n // We are importing \"import-in-the-middle\" in the returned code of the `load()` function below\n // By setting `moduleSideEffects` to `true`, the import is added to the bundle, although nothing is imported from it\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file is included, as not all node builders are including files imported with `module.register()`.\n // Prevents the error \"Failed to register ESM hook Error: Cannot find module 'import-in-the-middle/hook.mjs'\"\n return { id: source, moduleSideEffects: true, external: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`.\n \"import 'import-in-the-middle/hook.mjs';\\n\" +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":[],"mappings":";;;;;;AAkBA,MAAM,sBAAA,GAAyB,sBAAsB;;AAErD;AACA;AACA;AACA;AACA;AACO,SAAS,sBAAsB;AACtC,EAAE,aAAa;AACf,EAAE,KAAK;AACP,EAAE,gBAAgB;AAClB,EAAQ;AACR,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK;AAC7D,IAAI,IAAI,YAAY,EAAE,OAAA,KAAY,IAAA,IAAQ,YAAY,EAAE,OAAA,KAAY,SAAS,EAAE;AAC/E,MAAM,YAAY,CAAC,OAAA,GAAU,EAAE;AAC/B,KAAI,MAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AACrD;AACA,MAAM,YAAY,CAAC,OAAA,GAAU,CAAC,YAAY,CAAC,OAAO,CAAC;AACnD;;AAEA,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AACrG,GAAG,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,aAAa,EAA2B,KAAK,EAAe;AAC/F,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY;AACxC,IAAI,MAAM,mBAAA;AACV,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAA,IAAW,+BAA+B,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;;AAEvG;AACA,IAAI,MAAM,qBAAA,GAAwB,CAAC,SAAS,CAAC;;AAE7C,IAAI,MAAM,gBAAgB;AAC1B,QAAQ;AACR,QAAQ,OAAO,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,cAAA,KAAmB;AACrE,UAAU,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;AAC7C,UAAU,qBAAqB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;AAC7D,YAAY;AACZ,YAAY,WAAW;;AAEvB,IAAI,MAAM,iBAAA,GAAoB,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;AAC5E,IAAI,MAAM,gBAAgB,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC;;AAElE,IAAI,IAAI;AACR,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK;AACxD,QAAQ,MAAM,cAAA,GAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;;AAEA,QAAA,EAAA,CAAA,SAAA,CAAA,aAAA,EAAA,cAAA,EAAA,MAAA,EAAA,MAAA;AACA,UAAA,IAAA,aAAA,CAAA,KAAA,EAAA;AACA;AACA,YAAA,OAAA,CAAA,GAAA;AACA,cAAA,CAAA,0EAAA,EAAA,aAAA,CAAA,GAAA,CAAA;AACA,aAAA;AACA;AACA,SAAA,CAAA;AACA,OAAA,CAAA;AACA,KAAA,CAAA,OAAA,GAAA,EAAA;AACA,MAAA,IAAA,aAAA,CAAA,KAAA,EAAA;AACA;AACA,QAAA,OAAA,CAAA,IAAA;AACA,UAAA,CAAA,4FAAA,EAAA,aAAA,CAAA,IAAA,CAAA;AACA,UAAA,GAAA;AACA,SAAA;AACA;AACA;AACA,GAAA,CAAA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,gCAAA;AACA,EAAA,KAAA;AACA,EAAA,gBAAA;AACA,EAAA;AACA;AACA,EAAA;AACA,EAAA,IAAA,CAAA,KAAA,CAAA,OAAA,CAAA,YAAA,EAAA;AACA,IAAA,KAAA,CAAA,OAAA,CAAA,YAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA;AACA;;AAEA,EAAA,IAAA,KAAA,CAAA,OAAA,CAAA,YAAA,EAAA,OAAA,KAAA,IAAA,IAAA,KAAA,CAAA,OAAA,CAAA,YAAA,EAAA,OAAA,KAAA,SAAA,EAAA;AACA,IAAA,KAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,GAAA,EAAA;AACA,GAAA,MAAA,IAAA,CAAA,KAAA,CAAA,OAAA,CAAA,KAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,EAAA;AACA;AACA,IAAA,KAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,GAAA,CAAA,KAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA;AACA;;AAEA,EAAA,KAAA,CAAA,OAAA,CAAA,YAAA,CAAA,OAAA,CAAA,IAAA;AACA,IAAA,0BAAA,CAAA;AACA,MAAA,wBAAA,EAAA,cAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,gBAAA,CAAA,CAAA,CAAA;AACA,MAAA,uCAAA,EAAA,aAAA,CAAA,uCAAA;AACA,KAAA,CAAA;AACA,GAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,wBAAA,CAAA,KAAA,EAAA,gBAAA,EAAA,KAAA,EAAA;AACA,EAAA,MAAA,UAAA,GAAA,iCAAA;;AAEA,EAAA,OAAA;AACA,IAAA,IAAA,EAAA,2CAAA;;AAEA,IAAA,UAAA,GAAA;AACA,MAAA,MAAA,UAAA,GAAA,cAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,gBAAA,CAAA,CAAA,CAAA;;AAEA,MAAA,IAAA,CAAA,UAAA,CAAA,UAAA,CAAA,EAAA;AACA,QAAA,IAAA,KAAA,EAAA;AACA,UAAA,MAAA,CAAA,GAAA,CAAA,CAAA,8CAAA,EAAA,UAAA,CAAA,CAAA,CAAA;AACA;AACA,QAAA;AACA;;AAEA;AACA,MAAA,IAAA,CAAA,QAAA,CAAA;AACA,QAAA,IAAA,EAAA,OAAA;AACA,QAAA,EAAA,EAAA,CAAA,EAAA,UAAA,CAAA,EAAA,gBAAA,CAAA,CAAA;AACA,QAAA,QAAA,EAAA,CAAA,EAAA,sBAAA,CAAA,IAAA,CAAA;AACA,OAAA,CAAA;AACA,KAAA;;AAEA,IAAA,SAAA,CAAA,MAAA,EAAA;AACA,MAAA,IAAA,MAAA,CAAA,UAAA,CAAA,UAAA,CAAA,EAAA;AACA,QAAA,MAAA,gBAAA,GAAA,MAAA,CAAA,OAAA,CAAA,UAAA,EAAA,EAAA,CAAA;AACA,QAAA,MAAA,UAAA,GAAA,cAAA,CAAA,KAAA,CAAA,OAAA,CAAA,OAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,gBAAA,CAAA,CAAA,CAAA;;AAEA,QAAA,OAAA,EAAA,EAAA,EAAA,UAAA,EAAA;AACA;AACA,MAAA,OAAA,IAAA;AACA,KAAA;AACA,GAAA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAA,0BAAA,CAAA;AACA,EAAA,wBAAA;AACA,EAAA,uCAAA;AACA,EAAA,KAAA;AACA;;AAIA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA,MAAA,kBAAA,GAAA,OAAA;;AAEA,EAAA,OAAA;AACA,IAAA,IAAA,EAAA,uCAAA;AACA,IAAA,MAAA,SAAA,CAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA;AACA,MAAA,IAAA,MAAA,CAAA,QAAA,CAAA,CAAA,CAAA,EAAA,sBAAA,CAAA,CAAA,CAAA,EAAA;AACA,QAAA,OAAA,EAAA,EAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,IAAA,EAAA;AACA;;AAEA,MAAA,IAAA,MAAA,KAAA,+BAAA,EAAA;AACA;AACA;AACA;AACA;AACA,QAAA,OAAA,EAAA,EAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA;AACA;;AAEA,MAAA,IAAA,OAAA,CAAA,OAAA,IAAA,MAAA,CAAA,QAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA,CAAA,QAAA,CAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,EAAA;AACA,QAAA,MAAA,UAAA,GAAA,MAAA,IAAA,CAAA,OAAA,CAAA,MAAA,EAAA,QAAA,EAAA,OAAA,CAAA;;AAEA;AACA,QAAA,IAAA,CAAA,UAAA,IAAA,UAAA,EAAA,QAAA,EAAA,OAAA,UAAA;;AAEA,QAAA,MAAA,UAAA,GAAA,MAAA,IAAA,CAAA,IAAA,CAAA,UAAA,CAAA;;AAEA,QAAA,UAAA,CAAA,iBAAA,GAAA,IAAA;;AAEA;AACA,QAAA,OAAA,UAAA,CAAA,EAAA,CAAA,QAAA,CAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,CAAA;AACA,YAAA,UAAA,CAAA;AACA,YAAA,CAAA,EAAA,kBAAA,CAAA,EAAA,UAAA,CAAA;AACA;AACA,eAAA,MAAA,CAAA,oBAAA;AACA,eAAA,MAAA;AACA,gBAAA,mCAAA;AACA,kBAAA,UAAA,CAAA,gBAAA;AACA,kBAAA,uCAAA;AACA,kBAAA,KAAA;AACA,iBAAA;AACA;AACA,eAAA,MAAA,CAAA,mBAAA,CAAA,CAAA,CAAA;AACA;AACA,MAAA,OAAA,IAAA;AACA,KAAA;AACA,IAAA,IAAA,CAAA,EAAA,EAAA;AACA,MAAA,IAAA,EAAA,CAAA,QAAA,CAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,CAAA,CAAA,EAAA;AACA,QAAA,MAAA,OAAA,GAAA,yBAAA,CAAA,EAAA,CAAA,CAAA,KAAA,CAAA,kBAAA,CAAA,MAAA,CAAA;;AAEA;AACA,QAAA,MAAA,mBAAA;AACA,UAAA,EAAA,CAAA,QAAA,CAAA,wBAAA,CAAA,IAAA,EAAA,CAAA,QAAA,CAAA,2BAAA;AACA,cAAA,yBAAA,CAAA,EAAA,EAAA,OAAA;AACA,cAAA,EAAA;;AAEA,QAAA;AACA;AACA,UAAA,CAAA,OAAA,EAAA,IAAA,CAAA,SAAA,CAAA,wBAAA,CAAA,CAAA,GAAA,CAAA;AACA;AACA;AACA,UAAA,CAAA,OAAA,EAAA,IAAA,CAAA,SAAA,CAAA,OAAA,CAAA,CAAA,IAAA,CAAA;AACA;AACA,UAAA,2CAAA;AACA,UAAA,CAAA,EAAA,mBAAA,CAAA,EAAA;AACA;AACA;;AAEA,MAAA,OAAA,IAAA;AACA,KAAA;AACA,GAAA;AACA;;;;"}
|
|
1
|
+
{"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createResolver } from '@nuxt/kit';\nimport { debug } from '@sentry/core';\nimport * as fs from 'fs';\nimport type { Nitro } from 'nitropack';\nimport type { InputPluginOption } from 'rollup';\nimport type { SentryNuxtModuleOptions } from '../common/types';\nimport {\n constructFunctionReExport,\n constructWrappedFunctionExportQuery,\n getFilenameFromNodeStartCommand,\n QUERY_END_INDICATOR,\n removeSentryQueryFromPath,\n SENTRY_REEXPORTED_FUNCTIONS,\n SENTRY_WRAPPED_ENTRY,\n SENTRY_WRAPPED_FUNCTIONS,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application (which is needed for import-in-the-middle).\n * See: https://nodejs.org/api/module.html#enabling\n */\nexport function addDynamicImportEntryFileWrapper(\n nitro: Nitro,\n serverConfigFile: string,\n moduleOptions: Omit<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'> &\n Required<Pick<SentryNuxtModuleOptions, 'experimental_entrypointWrappedFunctions'>>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, isDebug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);\n\n if (!existsSync(configPath)) {\n if (isDebug) {\n debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(`/${originalFilePath}`);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n */\nfunction wrapEntryWithDynamicImport({\n resolvedSentryConfigPath,\n experimental_entrypointWrappedFunctions,\n debug,\n}: {\n resolvedSentryConfigPath: string;\n experimental_entrypointWrappedFunctions: string[];\n debug?: boolean;\n}): InputPluginOption {\n // In order to correctly import the server config file\n // and dynamically import the nitro runtime, we need to\n // mark the resolutionId with '\\0raw' to fall into the\n // raw chunk group, c.f. https://github.com/nitrojs/nitro/commit/8b4a408231bdc222569a32ce109796a41eac4aa6#diff-e58102d2230f95ddeef2662957b48d847a6e891e354cfd0ae6e2e03ce848d1a2R142\n const resolutionIdPrefix = '\\0raw';\n\n return {\n name: 'sentry-wrap-entry-with-dynamic-import',\n async resolveId(source, importer, options) {\n if (source.includes(`/${SERVER_CONFIG_FILENAME}`)) {\n return { id: source, moduleSideEffects: true };\n }\n\n if (source === 'import-in-the-middle/hook.mjs') {\n // We are importing \"import-in-the-middle\" in the returned code of the `load()` function below\n // By setting `moduleSideEffects` to `true`, the import is added to the bundle, although nothing is imported from it\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file is included, as not all node builders are including files imported with `module.register()`.\n // Prevents the error \"Failed to register ESM hook Error: Cannot find module 'import-in-the-middle/hook.mjs'\"\n return { id: source, moduleSideEffects: true, external: true };\n }\n\n if (options.isEntry && source.includes('.mjs') && !source.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const resolution = await this.resolve(source, importer, options);\n\n // If it cannot be resolved or is external, just return it so that Rollup can display an error\n if (!resolution || resolution?.external) return resolution;\n\n const moduleInfo = await this.load(resolution);\n\n moduleInfo.moduleSideEffects = true;\n\n // The enclosing `if` already checks for the suffix in `source`, but a check in `resolution.id` is needed as well to prevent multiple attachment of the suffix\n return resolution.id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ? resolution.id\n : `${resolutionIdPrefix}${resolution.id\n // Concatenates the query params to mark the file (also attaches names of re-exports - this is needed for serverless functions to re-export the handler)\n .concat(SENTRY_WRAPPED_ENTRY)\n .concat(\n constructWrappedFunctionExportQuery(\n moduleInfo.exportedBindings,\n experimental_entrypointWrappedFunctions,\n debug,\n ),\n )\n .concat(QUERY_END_INDICATOR)}`;\n }\n return null;\n },\n load(id: string) {\n if (id.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)) {\n const entryId = removeSentryQueryFromPath(id).slice(resolutionIdPrefix.length);\n\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryId)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(resolvedSentryConfigPath)};\\n` +\n // Dynamic `import()` for the previous, actual entry point.\n // `import()` can be used for any code that should be run after the hooks are registered (https://nodejs.org/api/module.html#enabling)\n `import(${JSON.stringify(entryId)});\\n` +\n // By importing \"import-in-the-middle/hook.mjs\", we can make sure this file wil be included, as not all node builders are including files imported with `module.register()`.\n \"import 'import-in-the-middle/hook.mjs';\\n\" +\n `${reExportedFunctions}\\n`\n );\n }\n\n return null;\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
package/build/module/module.json
CHANGED
package/build/module/module.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createResolver, defineNuxtModule, addPluginTemplate, addPlugin, addServerPlugin, addTemplate } from '@nuxt/kit';
|
|
2
|
-
import { consoleSandbox,
|
|
2
|
+
import { consoleSandbox, debug } from '@sentry/core';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { existsSync } from 'node:fs';
|
|
5
5
|
import * as fs from 'fs';
|
|
@@ -176,15 +176,15 @@ function addDynamicImportEntryFileWrapper(nitro, serverConfigFile, moduleOptions
|
|
|
176
176
|
})
|
|
177
177
|
);
|
|
178
178
|
}
|
|
179
|
-
function injectServerConfigPlugin(nitro, serverConfigFile,
|
|
179
|
+
function injectServerConfigPlugin(nitro, serverConfigFile, isDebug) {
|
|
180
180
|
const filePrefix = "\0virtual:sentry-server-config:";
|
|
181
181
|
return {
|
|
182
182
|
name: "rollup-plugin-inject-sentry-server-config",
|
|
183
183
|
buildStart() {
|
|
184
184
|
const configPath = createResolver(nitro.options.srcDir).resolve(`/${serverConfigFile}`);
|
|
185
185
|
if (!existsSync(configPath)) {
|
|
186
|
-
if (
|
|
187
|
-
|
|
186
|
+
if (isDebug) {
|
|
187
|
+
debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);
|
|
188
188
|
}
|
|
189
189
|
return;
|
|
190
190
|
}
|
|
@@ -207,7 +207,7 @@ function injectServerConfigPlugin(nitro, serverConfigFile, debug) {
|
|
|
207
207
|
function wrapEntryWithDynamicImport({
|
|
208
208
|
resolvedSentryConfigPath,
|
|
209
209
|
experimental_entrypointWrappedFunctions,
|
|
210
|
-
debug
|
|
210
|
+
debug: debug2
|
|
211
211
|
}) {
|
|
212
212
|
const resolutionIdPrefix = "\0raw";
|
|
213
213
|
return {
|
|
@@ -229,7 +229,7 @@ function wrapEntryWithDynamicImport({
|
|
|
229
229
|
constructWrappedFunctionExportQuery(
|
|
230
230
|
moduleInfo.exportedBindings,
|
|
231
231
|
experimental_entrypointWrappedFunctions,
|
|
232
|
-
|
|
232
|
+
debug2
|
|
233
233
|
)
|
|
234
234
|
).concat(QUERY_END_INDICATOR)}`;
|
|
235
235
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getActiveSpan, getRootSpan,
|
|
1
|
+
import { debug, getActiveSpan, getRootSpan, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from "@sentry/core";
|
|
2
2
|
export function updateRouteBeforeResponse(event) {
|
|
3
3
|
if (!event.context.matchedRoute) {
|
|
4
4
|
return;
|
|
@@ -29,6 +29,6 @@ export function updateRouteBeforeResponse(event) {
|
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
debug.log(`Updated transaction name for parametrized route: ${matchedRoutePath}`);
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getActiveSpan, getRootSpan,
|
|
1
|
+
import { debug, getActiveSpan, getRootSpan, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from "@sentry/core";
|
|
2
2
|
import { defineNuxtPlugin } from "nuxt/app";
|
|
3
3
|
import { extractParametrizedRouteFromContext } from "../utils/route-extraction.js";
|
|
4
4
|
export default defineNuxtPlugin((nuxtApp) => {
|
|
@@ -7,10 +7,10 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|
|
7
7
|
try {
|
|
8
8
|
const { default: importedPagesData } = await import("#build/sentry--nuxt-pages-data.mjs");
|
|
9
9
|
buildTimePagesData = importedPagesData || [];
|
|
10
|
-
|
|
10
|
+
debug.log("Imported build-time pages data:", buildTimePagesData);
|
|
11
11
|
} catch (error) {
|
|
12
12
|
buildTimePagesData = [];
|
|
13
|
-
|
|
13
|
+
debug.warn("Failed to import build-time pages data:", error);
|
|
14
14
|
}
|
|
15
15
|
const ssrContext = renderContext.ssrContext;
|
|
16
16
|
const routeInfo = extractParametrizedRouteFromContext(
|
|
@@ -27,7 +27,7 @@ export default defineNuxtPlugin((nuxtApp) => {
|
|
|
27
27
|
if (!rootSpan) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
debug.log("Matched parametrized server route:", routeInfo.parametrizedRoute);
|
|
31
31
|
rootSpan.setAttributes({
|
|
32
32
|
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route",
|
|
33
33
|
"http.route": routeInfo.parametrizedRoute
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { setAsyncLocalStorageAsyncContextStrategy, wrapRequestHandler } from "@sentry/cloudflare";
|
|
2
|
-
import { getDefaultIsolationScope, getIsolationScope, getTraceData
|
|
2
|
+
import { debug, getDefaultIsolationScope, getIsolationScope, getTraceData } from "@sentry/core";
|
|
3
3
|
import { sentryCaptureErrorHook } from "../hooks/captureErrorHook.js";
|
|
4
4
|
import { updateRouteBeforeResponse } from "../hooks/updateRouteBeforeResponse.js";
|
|
5
5
|
import { addSentryTracingMetaTags } from "../utils.js";
|
|
@@ -22,7 +22,7 @@ export const sentryCloudflareNitroPlugin = (optionsOrFn) => (nitroApp) => {
|
|
|
22
22
|
const pathname = handlerArgs[0];
|
|
23
23
|
const event = handlerArgs[1];
|
|
24
24
|
if (!isEventType(event)) {
|
|
25
|
-
|
|
25
|
+
debug.log("Nitro Cloudflare plugin did not detect a Cloudflare event type. Won't patch Cloudflare handler.");
|
|
26
26
|
return handlerTarget.apply(handlerThisArg, handlerArgs);
|
|
27
27
|
} else {
|
|
28
28
|
const url = `${event.protocol}${event.protocol.endsWith(":") ? "" : ":"}//${event.host}${pathname}`;
|
|
@@ -42,9 +42,9 @@ export const sentryCloudflareNitroPlugin = (optionsOrFn) => (nitroApp) => {
|
|
|
42
42
|
const traceData = getTraceData();
|
|
43
43
|
if (traceData && Object.keys(traceData).length > 0) {
|
|
44
44
|
traceDataMap.set(event.context.cf, traceData);
|
|
45
|
-
|
|
45
|
+
debug.log("Stored trace data for later use in HTML meta-tags: ", traceData);
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
debug.log(
|
|
48
48
|
`Patched Cloudflare handler (\`nitroApp.localFetch\`). ${isolationScope === newIsolationScope ? "Using existing" : "Created new"} isolation scope.`
|
|
49
49
|
);
|
|
50
50
|
return handlerTarget.apply(handlerThisArg, handlerArgs);
|
|
@@ -56,7 +56,7 @@ export const sentryCloudflareNitroPlugin = (optionsOrFn) => (nitroApp) => {
|
|
|
56
56
|
nitroApp.hooks.hook("render:html", (html, { event }) => {
|
|
57
57
|
const storedTraceData = event?.context?.cf ? traceDataMap.get(event.context.cf) : void 0;
|
|
58
58
|
if (storedTraceData && Object.keys(storedTraceData).length > 0) {
|
|
59
|
-
|
|
59
|
+
debug.log("Using stored trace data for HTML meta-tags: ", storedTraceData);
|
|
60
60
|
addSentryTracingMetaTags(html.head, storedTraceData);
|
|
61
61
|
} else {
|
|
62
62
|
addSentryTracingMetaTags(html.head);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDefaultIsolationScope, getIsolationScope,
|
|
1
|
+
import { debug, getDefaultIsolationScope, getIsolationScope, withIsolationScope } from "@sentry/core";
|
|
2
2
|
import { defineNitroPlugin } from "nitropack/runtime";
|
|
3
3
|
import { sentryCaptureErrorHook } from "../hooks/captureErrorHook.js";
|
|
4
4
|
import { updateRouteBeforeResponse } from "../hooks/updateRouteBeforeResponse.js";
|
|
@@ -16,7 +16,7 @@ function patchEventHandler(handler) {
|
|
|
16
16
|
async apply(handlerTarget, handlerThisArg, handlerArgs) {
|
|
17
17
|
const isolationScope = getIsolationScope();
|
|
18
18
|
const newIsolationScope = isolationScope === getDefaultIsolationScope() ? isolationScope.clone() : isolationScope;
|
|
19
|
-
|
|
19
|
+
debug.log(
|
|
20
20
|
`Patched h3 event handler. ${isolationScope === newIsolationScope ? "Using existing" : "Created new"} isolation scope.`
|
|
21
21
|
);
|
|
22
22
|
return withIsolationScope(newIsolationScope, async () => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { debug } from "@sentry/core";
|
|
2
2
|
const extractionResultCache = /* @__PURE__ */ new Map();
|
|
3
3
|
export function extractParametrizedRouteFromContext(ssrContextModules, requestedUrl, buildTimePagesData = []) {
|
|
4
4
|
if (!ssrContextModules || !requestedUrl) {
|
|
@@ -10,10 +10,10 @@ export function extractParametrizedRouteFromContext(ssrContextModules, requested
|
|
|
10
10
|
const cacheKey = Array.from(ssrContextModules).sort().join("|");
|
|
11
11
|
const cachedResult = extractionResultCache.get(cacheKey);
|
|
12
12
|
if (cachedResult !== void 0) {
|
|
13
|
-
|
|
13
|
+
debug.log("Found cached result for parametrized route:", requestedUrl);
|
|
14
14
|
return cachedResult;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
debug.log("No parametrized route found in cache lookup. Extracting parametrized route for:", requestedUrl);
|
|
17
17
|
const modulesArray = Array.from(ssrContextModules);
|
|
18
18
|
const modulePagePaths = modulesArray.map((module) => {
|
|
19
19
|
const filePathParts = module.split("/");
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
captureException,
|
|
3
|
-
flush,
|
|
4
|
-
getClient,
|
|
5
|
-
getTraceMetaTags,
|
|
6
|
-
GLOBAL_OBJ,
|
|
7
|
-
logger,
|
|
8
|
-
vercelWaitUntil
|
|
9
|
-
} from "@sentry/core";
|
|
1
|
+
import { captureException, debug, flush, getClient, getTraceMetaTags, GLOBAL_OBJ, vercelWaitUntil } from "@sentry/core";
|
|
10
2
|
export function extractErrorContext(errorContext) {
|
|
11
3
|
const ctx = {};
|
|
12
4
|
if (!errorContext) {
|
|
@@ -24,13 +16,13 @@ export function extractErrorContext(errorContext) {
|
|
|
24
16
|
export function addSentryTracingMetaTags(head, traceData) {
|
|
25
17
|
const metaTags = getTraceMetaTags(traceData);
|
|
26
18
|
if (head.some((tag) => tag.includes("meta") && tag.includes("sentry-trace"))) {
|
|
27
|
-
|
|
19
|
+
debug.warn(
|
|
28
20
|
"Skipping addition of meta tags. Sentry tracing meta tags are already present in HTML page. Make sure to only set up Sentry once on the server-side. "
|
|
29
21
|
);
|
|
30
22
|
return;
|
|
31
23
|
}
|
|
32
24
|
if (metaTags) {
|
|
33
|
-
|
|
25
|
+
debug.log("Adding Sentry tracing meta tags to HTML page:", metaTags);
|
|
34
26
|
head.push(metaTags);
|
|
35
27
|
}
|
|
36
28
|
}
|
|
@@ -56,11 +48,11 @@ export function reportNuxtError(options) {
|
|
|
56
48
|
}
|
|
57
49
|
async function flushWithTimeout() {
|
|
58
50
|
try {
|
|
59
|
-
|
|
51
|
+
debug.log("Flushing events...");
|
|
60
52
|
await flush(2e3);
|
|
61
|
-
|
|
53
|
+
debug.log("Done flushing events");
|
|
62
54
|
} catch (e) {
|
|
63
|
-
|
|
55
|
+
debug.log("Error while flushing events:\n", e);
|
|
64
56
|
}
|
|
65
57
|
}
|
|
66
58
|
export async function flushIfServerless() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/runtime/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/runtime/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,KAAK,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,oBAAoB,GAAG,SAAS,GAAG,OAAO,CAiB3F;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAcnH;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CAyBP;AAYD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAcvD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/nuxt",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.40.0",
|
|
4
4
|
"description": "Official Sentry SDK for Nuxt (EXPERIMENTAL)",
|
|
5
5
|
"repository": "git://github.com/getsentry/sentry-javascript.git",
|
|
6
6
|
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/nuxt",
|
|
@@ -47,13 +47,13 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@nuxt/kit": "^3.13.2",
|
|
50
|
-
"@sentry/browser": "9.
|
|
51
|
-
"@sentry/cloudflare": "9.
|
|
52
|
-
"@sentry/core": "9.
|
|
53
|
-
"@sentry/node": "9.
|
|
50
|
+
"@sentry/browser": "9.40.0",
|
|
51
|
+
"@sentry/cloudflare": "9.40.0",
|
|
52
|
+
"@sentry/core": "9.40.0",
|
|
53
|
+
"@sentry/node": "9.40.0",
|
|
54
54
|
"@sentry/rollup-plugin": "^3.5.0",
|
|
55
55
|
"@sentry/vite-plugin": "^3.5.0",
|
|
56
|
-
"@sentry/vue": "9.
|
|
56
|
+
"@sentry/vue": "9.40.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@nuxt/module-builder": "^0.8.4",
|