{"version":3,"file":"addServerConfig.js","sources":["../../../src/vite/addServerConfig.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { basename } from 'node:path';\nimport { pathToFileURL } from 'node:url';\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 toResolvablePath,\n} from './utils';\n\nconst SERVER_CONFIG_FILENAME = 'sentry.server.config';\n\nconst CONFIG_EXTENSIONS = ['.ts', '.js', '.mjs', '.cjs', '.mts', '.cts'];\n\nfunction isServerConfigFile(sourcePath: string, resolvedPath: string): boolean {\n if (sourcePath === resolvedPath) {\n return true;\n }\n const name = basename(sourcePath);\n return name === SERVER_CONFIG_FILENAME || CONFIG_EXTENSIONS.some(ext => name === `${SERVER_CONFIG_FILENAME}${ext}`);\n}\n\n/**\n * Adds the `sentry.server.config.ts` file as `sentry.server.config.mjs` to the `.output` directory to be able to reference this file in the node --import option.\n *\n * By adding a Rollup plugin to the Nitro Rollup options, the Sentry server config is transpiled and emitted to the server build.\n */\nexport function addServerConfigToBuild(\n moduleOptions: SentryNuxtModuleOptions,\n nitro: Nitro,\n serverConfigFile: string,\n): void {\n nitro.hooks.hook('rollup:before', (nitro, rollupConfig) => {\n if (rollupConfig?.plugins === null || rollupConfig?.plugins === undefined) {\n rollupConfig.plugins = [];\n } else if (!Array.isArray(rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n rollupConfig.plugins = [rollupConfig.plugins];\n }\n\n rollupConfig.plugins.push(injectServerConfigPlugin(nitro, serverConfigFile, moduleOptions.debug));\n });\n}\n\n/**\n * Adds the Sentry server config import at the top of the server entry file to load the SDK on the server.\n * This is necessary for environments where modifying the node option `--import` is not possible.\n * However, only limited tracing instrumentation is supported when doing this.\n */\nexport function addSentryTopImport(moduleOptions: SentryNuxtModuleOptions, nitro: Nitro): void {\n nitro.hooks.hook('close', async () => {\n const fileNameFromCommand =\n nitro.options.commands.preview && getFilenameFromNodeStartCommand(nitro.options.commands.preview);\n\n // other presets ('node-server' or 'vercel') have an index.mjs\n const presetsWithServerFile = ['netlify'];\n\n const entryFileName = fileNameFromCommand\n ? fileNameFromCommand\n : typeof nitro.options.rollupConfig?.output.entryFileNames === 'string'\n ? nitro.options.rollupConfig?.output.entryFileNames\n : presetsWithServerFile.includes(nitro.options.preset)\n ? 'server.mjs'\n : 'index.mjs';\n\n const serverDirResolver = createResolver(nitro.options.output.serverDir);\n const entryFilePath = serverDirResolver.resolve(entryFileName);\n\n try {\n fs.readFile(entryFilePath, 'utf8', (err, data) => {\n const updatedContent = `import './${SERVER_CONFIG_FILENAME}.mjs';\\n${data}`;\n\n fs.writeFile(entryFilePath, updatedContent, 'utf8', () => {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.log(\n `[Sentry] Successfully added the Sentry import to the server entry file \"\\`${entryFilePath}\\`\"`,\n );\n }\n });\n });\n } catch (err) {\n if (moduleOptions.debug) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Sentry] An error occurred when trying to add the Sentry import to the server entry file \"\\`${entryFilePath}\\`\":`,\n err,\n );\n }\n }\n });\n}\n\n/**\n * This function modifies the Rollup configuration to include a plugin that wraps the entry file with a dynamic import (`import()`)\n * and adds the Sentry server config with the static `import` declaration.\n *\n * With this, the Sentry server config can be loaded before all other modules of the application (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 &\n Required>,\n): void {\n if (!nitro.options.rollupConfig) {\n nitro.options.rollupConfig = { output: {} };\n }\n\n if (nitro.options.rollupConfig?.plugins === null || nitro.options.rollupConfig?.plugins === undefined) {\n nitro.options.rollupConfig.plugins = [];\n } else if (!Array.isArray(nitro.options.rollupConfig.plugins)) {\n // `rollupConfig.plugins` can be a single plugin, so we want to put it into an array so that we can push our own plugin\n nitro.options.rollupConfig.plugins = [nitro.options.rollupConfig.plugins];\n }\n\n nitro.options.rollupConfig.plugins.push(\n wrapEntryWithDynamicImport({\n resolvedSentryConfigPath: createResolver(nitro.options.rootDir).resolve(serverConfigFile),\n experimental_entrypointWrappedFunctions: moduleOptions.experimental_entrypointWrappedFunctions,\n }),\n );\n}\n\n/**\n * Rollup plugin to include the Sentry server configuration file to the server build output.\n */\nfunction injectServerConfigPlugin(nitro: Nitro, serverConfigFile: string, isDebug?: boolean): InputPluginOption {\n const filePrefix = '\\0virtual:sentry-server-config:';\n\n return {\n name: 'rollup-plugin-inject-sentry-server-config',\n\n buildStart() {\n const configPath = createResolver(nitro.options.rootDir).resolve(serverConfigFile);\n\n if (!existsSync(configPath)) {\n if (isDebug) {\n debug.log(`[Sentry] Sentry server config file not found: ${configPath}`);\n }\n return;\n }\n\n // Emitting a file adds it to the build output (Rollup is aware of the file, and we can later return the code in resolveId)\n this.emitFile({\n type: 'chunk',\n id: `${filePrefix}${serverConfigFile}`,\n fileName: `${SERVER_CONFIG_FILENAME}.mjs`,\n });\n },\n\n resolveId(source) {\n if (source.startsWith(filePrefix)) {\n const originalFilePath = source.replace(filePrefix, '');\n const configPath = createResolver(nitro.options.rootDir).resolve(originalFilePath);\n\n return { id: configPath };\n }\n return null;\n },\n };\n}\n\n/**\n * A Rollup plugin which wraps the server entry with a dynamic `import()`. This makes it possible to initialize Sentry first\n * by using a regular `import` and load the server after that.\n * This also works with serverless `handler` functions, as it re-exports the `handler`.\n *\n * Only exported for testing.\n */\nexport function 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 // `load()` emits `file://` specifiers because Node's ESM loader rejects bare Windows paths,\n // but Rollup's resolver only understands filesystem paths.\n const resolvable = toResolvablePath(source);\n if (!resolvable) {\n return null;\n }\n const { path: normalizedSource, wasFileUrl } = resolvable;\n\n if (isServerConfigFile(normalizedSource, resolvedSentryConfigPath)) {\n return { id: normalizedSource, 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 (\n options.isEntry &&\n normalizedSource.includes('.mjs') &&\n !normalizedSource.includes(`.mjs${SENTRY_WRAPPED_ENTRY}`)\n ) {\n const resolution = await this.resolve(normalizedSource, 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\n // Pass isEntry:false to avoid re-entering the isEntry branch and double-wrapping\n // (normalizedSource strips the SENTRY_WRAPPED_ENTRY query suffix).\n if (wasFileUrl) {\n const resolved = await this.resolve(normalizedSource, importer, { ...options, isEntry: false });\n if (resolved) return resolved;\n return { id: normalizedSource };\n }\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 const entryIdUrl = pathToFileURL(entryId).href;\n const configUrl = pathToFileURL(resolvedSentryConfigPath).href;\n\n // Use entryIdUrl so Node's runtime ESM loader receives file:// on Windows; Rollup normalizes it in resolveId.\n // Mostly useful for serverless `handler` functions\n const reExportedFunctions =\n id.includes(SENTRY_WRAPPED_FUNCTIONS) || id.includes(SENTRY_REEXPORTED_FUNCTIONS)\n ? constructFunctionReExport(id, entryIdUrl)\n : '';\n\n return (\n // Regular `import` of the Sentry config\n `import ${JSON.stringify(configUrl)};\\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(entryIdUrl)});\\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":["nitro","debug"],"mappings":"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"}