@sentry/bundler-plugins 11.0.0-beta.1 → 11.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/build/cjs/core/debug-id-upload.js +77 -2
  2. package/build/cjs/core/debug-id-upload.js.map +1 -1
  3. package/build/cjs/core/index.js +2 -0
  4. package/build/cjs/core/index.js.map +1 -1
  5. package/build/cjs/core/options-mapping.js +4 -2
  6. package/build/cjs/core/options-mapping.js.map +1 -1
  7. package/build/cjs/core/utils.js +18 -11
  8. package/build/cjs/core/utils.js.map +1 -1
  9. package/build/cjs/core/version.js +1 -1
  10. package/build/cjs/core/version.js.map +1 -1
  11. package/build/cjs/esbuild/index.js +17 -2
  12. package/build/cjs/esbuild/index.js.map +1 -1
  13. package/build/cjs/rollup/index.js +23 -13
  14. package/build/cjs/rollup/index.js.map +1 -1
  15. package/build/cjs/webpack/webpack4and5.js +34 -0
  16. package/build/cjs/webpack/webpack4and5.js.map +1 -1
  17. package/build/esm/core/debug-id-upload.js +76 -3
  18. package/build/esm/core/debug-id-upload.js.map +1 -1
  19. package/build/esm/core/index.js +1 -1
  20. package/build/esm/core/index.js.map +1 -1
  21. package/build/esm/core/options-mapping.js +4 -2
  22. package/build/esm/core/options-mapping.js.map +1 -1
  23. package/build/esm/core/utils.js +18 -10
  24. package/build/esm/core/utils.js.map +1 -1
  25. package/build/esm/core/version.js +1 -1
  26. package/build/esm/core/version.js.map +1 -1
  27. package/build/esm/esbuild/index.js +19 -4
  28. package/build/esm/esbuild/index.js.map +1 -1
  29. package/build/esm/package.json +1 -1
  30. package/build/esm/rollup/index.js +24 -14
  31. package/build/esm/rollup/index.js.map +1 -1
  32. package/build/esm/webpack/webpack4and5.js +36 -2
  33. package/build/esm/webpack/webpack4and5.js.map +1 -1
  34. package/build/types/core/debug-id-upload.d.ts +28 -0
  35. package/build/types/core/debug-id-upload.d.ts.map +1 -1
  36. package/build/types/core/index.d.ts +1 -1
  37. package/build/types/core/index.d.ts.map +1 -1
  38. package/build/types/core/options-mapping.d.ts.map +1 -1
  39. package/build/types/core/types.d.ts +7 -2
  40. package/build/types/core/types.d.ts.map +1 -1
  41. package/build/types/core/utils.d.ts.map +1 -1
  42. package/build/types/core/version.d.ts +1 -1
  43. package/build/types/core/version.d.ts.map +1 -1
  44. package/build/types/esbuild/index.d.ts.map +1 -1
  45. package/build/types/rollup/index.d.ts +16 -25
  46. package/build/types/rollup/index.d.ts.map +1 -1
  47. package/build/types/webpack/webpack4and5.d.ts +20 -21
  48. package/build/types/webpack/webpack4and5.d.ts.map +1 -1
  49. package/package.json +2 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/esbuild/index.ts"],"sourcesContent":["import type { Options } from '../core';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n getDebugIdSnippet,\n createDebugIdUploadFunction,\n CodeInjection,\n} from '../core';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\n\ninterface EsbuildOnResolveArgs {\n path: string;\n kind: string;\n importer?: string;\n resolveDir: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnResolveResult {\n path: string;\n sideEffects?: boolean;\n pluginName?: string;\n namespace?: string;\n suffix?: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnLoadArgs {\n path: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnLoadResult {\n loader: string;\n pluginName: string;\n contents: string;\n resolveDir?: string;\n}\n\ninterface EsbuildOnEndArgs {\n metafile?: {\n outputs: Record<string, unknown>;\n };\n}\n\ninterface EsbuildInitialOptions {\n bundle?: boolean;\n inject?: string[];\n metafile?: boolean;\n define?: Record<string, string>;\n}\n\ninterface EsbuildPluginBuild {\n initialOptions: EsbuildInitialOptions;\n onLoad: (\n options: { filter: RegExp; namespace?: string },\n callback: (args: EsbuildOnLoadArgs) => EsbuildOnLoadResult | null,\n ) => void;\n onResolve: (\n options: { filter: RegExp },\n callback: (args: EsbuildOnResolveArgs) => EsbuildOnResolveResult | undefined,\n ) => void;\n onEnd: (callback: (result: EsbuildOnEndArgs) => void | Promise<void>) => void;\n}\n\nfunction getEsbuildMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - esbuild transpiles this for us\n const req = createRequire(import.meta.url);\n const esbuild = req('esbuild') as { version?: string };\n // esbuild hasn't released a v1 yet, so we'll return the minor version as the major version\n return esbuild.version?.split('.')[1];\n } catch {\n // do nothing, we'll just not report a version\n }\n\n return undefined;\n}\n\nconst pluginName = 'sentry-esbuild-plugin';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function sentryEsbuildPlugin(userOptions: Options = {}): any {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? `[${pluginName}]`,\n buildTool: 'esbuild',\n buildToolMajorVersion: getEsbuildMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n name: 'sentry-esbuild-noop-plugin',\n setup() {\n // noop plugin\n },\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n // Component annotation warning\n if (options.reactComponentAnnotation?.enabled) {\n logger.warn(\n 'Component name annotation is not supported in esbuild. Please use a separate transform step or consider using a different bundler.',\n );\n }\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n\n // Track entry points wrapped for debug ID injection\n const debugIdWrappedPaths = new Set<string>();\n\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n\n return {\n name: pluginName,\n setup({ initialOptions, onLoad, onResolve, onEnd }: EsbuildPluginBuild) {\n // Release and/or metadata injection\n if (!staticInjectionCode.isEmpty()) {\n const virtualInjectionFilePath = path.resolve('_sentry-injection-stub');\n initialOptions.inject = initialOptions.inject || [];\n initialOptions.inject.push(virtualInjectionFilePath);\n\n onResolve({ filter: /_sentry-injection-stub/ }, args => {\n return {\n path: args.path,\n sideEffects: true,\n pluginName,\n };\n });\n\n onLoad({ filter: /_sentry-injection-stub/ }, () => {\n return {\n loader: 'js',\n pluginName,\n contents: staticInjectionCode.code(),\n };\n });\n }\n\n // Bundle size optimizations\n if (transformReplace) {\n const replacementStringValues: Record<string, string> = {};\n Object.entries(replacementValues).forEach(([key, value]) => {\n replacementStringValues[key] = JSON.stringify(value);\n });\n\n initialOptions.define = { ...initialOptions.define, ...replacementStringValues };\n }\n\n // Debug ID injection - requires per-entry-point unique IDs\n if (sourcemapsEnabled) {\n // Clear state from previous builds (important for watch mode and test suites)\n debugIdWrappedPaths.clear();\n\n if (!initialOptions.bundle) {\n logger.warn(\n 'The Sentry esbuild plugin only supports esbuild with `bundle: true` being set in the esbuild build options. Esbuild will probably crash now. Sorry about that. If you need to upload sourcemaps without `bundle: true`, it is recommended to use Sentry CLI instead: https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/cli/',\n );\n }\n\n // Wrap entry points to inject debug IDs\n onResolve({ filter: /.*/ }, args => {\n if (args.kind !== 'entry-point') {\n return;\n }\n\n // Skip injecting debug IDs into modules specified in the esbuild `inject` option\n // since they're already part of the entry points\n if (initialOptions.inject?.includes(args.path)) {\n return;\n }\n\n const resolvedPath = path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path);\n\n // Skip injecting debug IDs into paths that have already been wrapped\n if (debugIdWrappedPaths.has(resolvedPath)) {\n return;\n }\n debugIdWrappedPaths.add(resolvedPath);\n\n return {\n pluginName,\n path: resolvedPath,\n pluginData: {\n isDebugIdProxy: true,\n originalPath: args.path,\n originalResolveDir: args.resolveDir,\n },\n // We need to add a suffix here, otherwise esbuild will mark the entrypoint as resolved and won't traverse\n // the module tree any further down past the proxy module because we're essentially creating a dependency\n // loop back to the proxy module.\n // By setting a suffix we're telling esbuild that the entrypoint and proxy module are two different things,\n // making it re-resolve the entrypoint when it is imported from the proxy module.\n // Super confusing? Yes. Works? Apparently... Let's see.\n suffix: '?sentryDebugIdProxy=true',\n };\n });\n\n onLoad({ filter: /.*/ }, args => {\n if (!(args.pluginData as { isDebugIdProxy?: boolean })?.isDebugIdProxy) {\n return null;\n }\n\n const originalPath = (args.pluginData as { originalPath: string }).originalPath;\n const originalResolveDir = (args.pluginData as { originalResolveDir: string }).originalResolveDir;\n\n return {\n loader: 'js',\n pluginName,\n contents: `\n import \"_sentry-debug-id-injection-stub\";\n import * as OriginalModule from ${JSON.stringify(originalPath)};\n export default OriginalModule.default;\n export * from ${JSON.stringify(originalPath)};`,\n resolveDir: originalResolveDir,\n };\n });\n\n onResolve({ filter: /_sentry-debug-id-injection-stub/ }, args => {\n return {\n path: args.path,\n sideEffects: true,\n pluginName,\n namespace: 'sentry-debug-id-stub',\n suffix: `?sentry-module-id=${randomUUID()}`,\n };\n });\n\n onLoad({ filter: /_sentry-debug-id-injection-stub/, namespace: 'sentry-debug-id-stub' }, () => {\n return {\n loader: 'js',\n pluginName,\n contents: getDebugIdSnippet(randomUUID()).code(),\n };\n });\n }\n\n // Create release and optionally upload\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n\n initialOptions.metafile = true;\n onEnd(async result => {\n try {\n await sentryBuildPluginManager.createRelease();\n\n if (sourcemapsEnabled && options.sourcemaps?.disable !== 'disable-upload') {\n const buildArtifacts = result.metafile ? Object.keys(result.metafile.outputs) : [];\n await upload(buildArtifacts);\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n });\n },\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default sentryEsbuildPlugin;\nexport type { Options as SentryEsbuildPluginOptions } from '../core';\n"],"names":["createRequire","createSentryBuildPluginManager","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","path","randomUUID","getDebugIdSnippet","createDebugIdUploadFunction"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/esbuild/index.ts"],"sourcesContent":["import type { Options } from '../core';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n getDebugIdSnippet,\n createDebugIdUploadFunction,\n CodeInjection,\n addDebugIdToEmittedArtifacts,\n isJsFile,\n} from '../core';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\n\ninterface EsbuildOnResolveArgs {\n path: string;\n kind: string;\n importer?: string;\n resolveDir: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnResolveResult {\n path: string;\n sideEffects?: boolean;\n pluginName?: string;\n namespace?: string;\n suffix?: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnLoadArgs {\n path: string;\n pluginData?: unknown;\n}\n\ninterface EsbuildOnLoadResult {\n loader: string;\n pluginName: string;\n contents: string;\n resolveDir?: string;\n}\n\ninterface EsbuildOnEndArgs {\n metafile?: {\n outputs: Record<string, unknown>;\n };\n}\n\ninterface EsbuildInitialOptions {\n bundle?: boolean;\n inject?: string[];\n metafile?: boolean;\n define?: Record<string, string>;\n write?: boolean;\n absWorkingDir?: string;\n}\n\ninterface EsbuildPluginBuild {\n initialOptions: EsbuildInitialOptions;\n onLoad: (\n options: { filter: RegExp; namespace?: string },\n callback: (args: EsbuildOnLoadArgs) => EsbuildOnLoadResult | null,\n ) => void;\n onResolve: (\n options: { filter: RegExp },\n callback: (args: EsbuildOnResolveArgs) => EsbuildOnResolveResult | undefined,\n ) => void;\n onEnd: (callback: (result: EsbuildOnEndArgs) => void | Promise<void>) => void;\n}\n\nfunction getEsbuildMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - esbuild transpiles this for us\n const req = createRequire(import.meta.url);\n const esbuild = req('esbuild') as { version?: string };\n // esbuild hasn't released a v1 yet, so we'll return the minor version as the major version\n return esbuild.version?.split('.')[1];\n } catch {\n // do nothing, we'll just not report a version\n }\n\n return undefined;\n}\n\nconst pluginName = 'sentry-esbuild-plugin';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function sentryEsbuildPlugin(userOptions: Options = {}): any {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? `[${pluginName}]`,\n buildTool: 'esbuild',\n buildToolMajorVersion: getEsbuildMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n name: 'sentry-esbuild-noop-plugin',\n setup() {\n // noop plugin\n },\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n // Component annotation warning\n if (options.reactComponentAnnotation?.enabled) {\n logger.warn(\n 'Component name annotation is not supported in esbuild. Please use a separate transform step or consider using a different bundler.',\n );\n }\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n\n // Track entry points wrapped for debug ID injection\n const debugIdWrappedPaths = new Set<string>();\n\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n\n return {\n name: pluginName,\n setup({ initialOptions, onLoad, onResolve, onEnd }: EsbuildPluginBuild) {\n // Release and/or metadata injection\n if (!staticInjectionCode.isEmpty()) {\n const virtualInjectionFilePath = path.resolve('_sentry-injection-stub');\n initialOptions.inject = initialOptions.inject || [];\n initialOptions.inject.push(virtualInjectionFilePath);\n\n onResolve({ filter: /_sentry-injection-stub/ }, args => {\n return {\n path: args.path,\n sideEffects: true,\n pluginName,\n };\n });\n\n onLoad({ filter: /_sentry-injection-stub/ }, () => {\n return {\n loader: 'js',\n pluginName,\n contents: staticInjectionCode.code(),\n };\n });\n }\n\n // Bundle size optimizations\n if (transformReplace) {\n const replacementStringValues: Record<string, string> = {};\n Object.entries(replacementValues).forEach(([key, value]) => {\n replacementStringValues[key] = JSON.stringify(value);\n });\n\n initialOptions.define = { ...initialOptions.define, ...replacementStringValues };\n }\n\n // Debug ID injection - requires per-entry-point unique IDs\n if (sourcemapsEnabled) {\n // Clear state from previous builds (important for watch mode and test suites)\n debugIdWrappedPaths.clear();\n\n if (!initialOptions.bundle) {\n logger.warn(\n 'The Sentry esbuild plugin only supports esbuild with `bundle: true` being set in the esbuild build options. Esbuild will probably crash now. Sorry about that. If you need to upload sourcemaps without `bundle: true`, it is recommended to use Sentry CLI instead: https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/cli/',\n );\n }\n\n // Wrap entry points to inject debug IDs\n onResolve({ filter: /.*/ }, args => {\n if (args.kind !== 'entry-point') {\n return;\n }\n\n // Skip injecting debug IDs into modules specified in the esbuild `inject` option\n // since they're already part of the entry points\n if (initialOptions.inject?.includes(args.path)) {\n return;\n }\n\n const resolvedPath = path.isAbsolute(args.path) ? args.path : path.join(args.resolveDir, args.path);\n\n // Skip injecting debug IDs into paths that have already been wrapped\n if (debugIdWrappedPaths.has(resolvedPath)) {\n return;\n }\n debugIdWrappedPaths.add(resolvedPath);\n\n return {\n pluginName,\n path: resolvedPath,\n pluginData: {\n isDebugIdProxy: true,\n originalPath: args.path,\n originalResolveDir: args.resolveDir,\n },\n // We need to add a suffix here, otherwise esbuild will mark the entrypoint as resolved and won't traverse\n // the module tree any further down past the proxy module because we're essentially creating a dependency\n // loop back to the proxy module.\n // By setting a suffix we're telling esbuild that the entrypoint and proxy module are two different things,\n // making it re-resolve the entrypoint when it is imported from the proxy module.\n // Super confusing? Yes. Works? Apparently... Let's see.\n suffix: '?sentryDebugIdProxy=true',\n };\n });\n\n onLoad({ filter: /.*/ }, args => {\n if (!(args.pluginData as { isDebugIdProxy?: boolean })?.isDebugIdProxy) {\n return null;\n }\n\n const originalPath = (args.pluginData as { originalPath: string }).originalPath;\n const originalResolveDir = (args.pluginData as { originalResolveDir: string }).originalResolveDir;\n\n return {\n loader: 'js',\n pluginName,\n contents: `\n import \"_sentry-debug-id-injection-stub\";\n import * as OriginalModule from ${JSON.stringify(originalPath)};\n export default OriginalModule.default;\n export * from ${JSON.stringify(originalPath)};`,\n resolveDir: originalResolveDir,\n };\n });\n\n onResolve({ filter: /_sentry-debug-id-injection-stub/ }, args => {\n return {\n path: args.path,\n sideEffects: true,\n pluginName,\n namespace: 'sentry-debug-id-stub',\n suffix: `?sentry-module-id=${randomUUID()}`,\n };\n });\n\n onLoad({ filter: /_sentry-debug-id-injection-stub/, namespace: 'sentry-debug-id-stub' }, () => {\n return {\n loader: 'js',\n pluginName,\n contents: getDebugIdSnippet(randomUUID()).code(),\n };\n });\n }\n\n // Create release and optionally upload\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n\n initialOptions.metafile = true;\n onEnd(async result => {\n try {\n await sentryBuildPluginManager.createRelease();\n\n if (sourcemapsEnabled) {\n const buildArtifacts = result.metafile ? Object.keys(result.metafile.outputs) : [];\n\n if (options.sourcemaps?.disable !== 'disable-upload') {\n await upload(buildArtifacts);\n } else if (initialOptions.write === false) {\n logger.debug('Build output is not written to disk. Skipping debug ID injection into build artifacts.');\n } else {\n // The upload routine (which stamps debug IDs into temp copies of the artifacts) is\n // skipped with `disable-upload`. esbuild has no hook to modify outputs before they are\n // written, so the emitted artifacts get stamped on disk instead.\n const outputDir = initialOptions.absWorkingDir ?? process.cwd();\n await Promise.all(\n buildArtifacts\n .filter(isJsFile)\n .map(bundle =>\n addDebugIdToEmittedArtifacts(\n path.resolve(outputDir, bundle),\n logger,\n options.sourcemaps?.resolveSourceMap,\n ),\n ),\n );\n }\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n });\n },\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default sentryEsbuildPlugin;\nexport type { Options as SentryEsbuildPluginOptions } from '../core';\n"],"names":["createRequire","createSentryBuildPluginManager","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","path","randomUUID","getDebugIdSnippet","createDebugIdUploadFunction","isJsFile","addDebugIdToEmittedArtifacts"],"mappings":"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"}
@@ -183,6 +183,23 @@ function _rollupPluginInternal(userOptions = {}, buildTool, buildToolMajorVersio
183
183
  map: ms.generateMap({ file: chunk.fileName, hires: "boundary" })
184
184
  };
185
185
  }
186
+ function generateBundle(_outputOptions, bundle) {
187
+ for (const output of Object.values(bundle)) {
188
+ if (output.type !== "chunk" || !index.isJsFile(output.fileName)) {
189
+ continue;
190
+ }
191
+ const sourceMapAsset = bundle[output.sourcemapFileName ?? `${output.fileName}.map`];
192
+ const sourceMapSource = sourceMapAsset?.type === "asset" && typeof sourceMapAsset.source === "string" ? sourceMapAsset.source : void 0;
193
+ const stamped = debugIdUpload.stampDebugId(output.code, sourceMapSource);
194
+ if (!stamped) {
195
+ continue;
196
+ }
197
+ output.code = stamped.bundleSource;
198
+ if (stamped.sourceMapSource !== void 0 && sourceMapAsset?.type === "asset") {
199
+ sourceMapAsset.source = stamped.sourceMapSource;
200
+ }
201
+ }
202
+ }
186
203
  async function writeBundle(outputOptions, bundle) {
187
204
  try {
188
205
  await sentryBuildPluginManager.createRelease();
@@ -212,23 +229,16 @@ function _rollupPluginInternal(userOptions = {}, buildTool, buildToolMajorVersio
212
229
  }
213
230
  }
214
231
  const name = `sentry-${buildTool}-plugin`;
215
- if (shouldTransform) {
216
- const transformHook = buildTool === "vite" ? {
217
- filter: { id: JS_MODULE_ID_FILTER },
218
- handler: transform
219
- } : transform;
220
- return {
221
- name,
222
- buildStart,
223
- transform: transformHook,
224
- renderChunk,
225
- writeBundle
226
- };
227
- }
232
+ const transformHook = buildTool === "vite" ? {
233
+ filter: { id: JS_MODULE_ID_FILTER },
234
+ handler: transform
235
+ } : transform;
228
236
  return {
229
237
  name,
230
238
  buildStart,
239
+ ...shouldTransform ? { transform: transformHook } : {},
231
240
  renderChunk,
241
+ ...options.sourcemaps?.disable === "disable-upload" ? { generateBundle: { order: "pre", handler: generateBundle } } : {},
232
242
  writeBundle
233
243
  };
234
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/rollup/index.ts"],"sourcesContent":["import type { Options } from '../core';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n isJsFile,\n shouldSkipCodeInjection,\n getDebugIdSnippet,\n stringToUUID,\n COMMENT_USE_STRICT_REGEX,\n createDebugIdUploadFunction,\n globFiles,\n createComponentNameAnnotateHooks,\n replaceBooleanFlagsInCode,\n CodeInjection,\n} from '../core';\nimport type {\n ComponentAnnotationTransformMeta,\n ComponentAnnotationTransformResult,\n} from '../core/component-annotation-vite';\nimport type { SourceMap } from 'magic-string';\nimport MagicString from 'magic-string';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\n\n// The subset of Rollup's `TransformResult` that this plugin's `transform`\n// hook actually returns. Defined locally instead of imported from `rollup`\n// because `rollup` is an optional dependency.\ntype TransformResult = { code: string; map?: SourceMap | string | { mappings: string } | null } | null | undefined;\n\ntype ViteModule = {\n parseAstAsync?: (code: string, options: { lang: 'jsx' | 'tsx' }) => Promise<unknown>;\n};\n\ntype ViteParseAstAsync = NonNullable<ViteModule['parseAstAsync']>;\ntype ViteAnnotationHooks = {\n transform(\n code: string,\n id: string,\n meta?: ComponentAnnotationTransformMeta,\n ): Promise<ComponentAnnotationTransformResult>;\n};\n\nlet viteParseAstAsyncPromise: Promise<ViteParseAstAsync | null> | undefined;\n\nconst JS_MODULE_ID_FILTER = /\\.[cm]?[jt]sx?(?:[?#].*)?$/;\n\nfunction hasExistingDebugID(code: string): boolean {\n // Check if a debug ID has already been injected to avoid duplicate injection (e.g. by another plugin or Sentry CLI)\n const chunkStartSnippet = code.slice(0, 6000);\n const chunkEndSnippet = code.slice(-500);\n\n if (chunkStartSnippet.includes('_sentryDebugIdIdentifier') || chunkEndSnippet.includes('//# debugId=')) {\n return true; // Debug ID already present, skip injection\n }\n\n return false;\n}\n\nfunction getRollupMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Rollup already transpiles this for us\n const req = createRequire(import.meta.url);\n const rollup = req('rollup') as { VERSION?: string };\n return rollup.VERSION?.split('.')[0];\n } catch {\n // do nothing, we'll just not report a version\n }\n\n return undefined;\n}\n\nfunction getViteParseAstAsync(): Promise<ViteParseAstAsync | null> {\n if (!viteParseAstAsyncPromise) {\n viteParseAstAsyncPromise = Promise.resolve()\n .then(async () => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Vite is an optional runtime peer for this package\n const viteModule = createRequire(import.meta.url)('vite') as ViteModule;\n\n if (typeof viteModule.parseAstAsync !== 'function') {\n return null;\n }\n\n try {\n await viteModule.parseAstAsync('const x = <div />;', { lang: 'tsx' });\n } catch {\n return null;\n }\n\n return viteModule.parseAstAsync;\n })\n .catch(() => null);\n }\n\n return viteParseAstAsyncPromise;\n}\n\n/**\n * @ignore - this is the internal plugin factory function only used for the Vite plugin!\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function _rollupPluginInternal(\n userOptions: Options = {},\n buildTool: 'rollup' | 'vite',\n buildToolMajorVersion?: string,\n) {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? `[sentry-${buildTool}-plugin]`,\n buildTool,\n buildToolMajorVersion: buildToolMajorVersion || getRollupMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n name: 'sentry-noop-plugin',\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n const transformAnnotations = options.reactComponentAnnotation?.enabled\n ? createComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n !!options.reactComponentAnnotation?._experimentalInjectIntoHtml,\n )\n : undefined;\n const transformViteAnnotations =\n options.reactComponentAnnotation?.enabled &&\n buildTool === 'vite' &&\n buildToolMajorVersion === '8' &&\n !options.reactComponentAnnotation?._experimentalInjectIntoHtml\n ? (() => {\n let viteAnnotationHooksPromise: Promise<ViteAnnotationHooks> | undefined;\n\n return {\n transform(code: string, id: string, meta?: ComponentAnnotationTransformMeta) {\n if (!viteAnnotationHooksPromise) {\n viteAnnotationHooksPromise = import('../core/component-annotation-vite').then(\n ({ createViteComponentNameAnnotateHooks }) =>\n createViteComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n getViteParseAstAsync,\n ),\n );\n }\n\n return viteAnnotationHooksPromise.then(hooks => hooks.transform(code, id, meta));\n },\n };\n })()\n : undefined;\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n const shouldTransform = transformAnnotations || transformReplace;\n\n function buildStart(): void {\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n }\n\n async function transform(\n code: string,\n id: string,\n meta?: ComponentAnnotationTransformMeta,\n ): Promise<TransformResult> {\n // Component annotations are only in user code and boolean flag replacements are\n // only in Sentry code. If we successfully add annotations, we can return early.\n let shouldRunBabelAnnotations = true;\n\n if (transformViteAnnotations?.transform) {\n const result = await transformViteAnnotations.transform(code, id, meta);\n if (result) {\n return result;\n }\n\n if (result === null) {\n shouldRunBabelAnnotations = false;\n }\n }\n\n if (shouldRunBabelAnnotations && transformAnnotations?.transform) {\n const result = await transformAnnotations.transform(code, id);\n if (result) {\n return result;\n }\n }\n\n if (transformReplace) {\n return replaceBooleanFlagsInCode(code, replacementValues);\n }\n\n return null;\n }\n\n function renderChunk(\n code: string,\n chunk: { fileName: string; facadeModuleId?: string | null },\n _?: unknown,\n meta?: { magicString?: MagicString },\n ): {\n code: string;\n map?: SourceMap;\n } | null {\n if (!isJsFile(chunk.fileName)) {\n return null; // returning null means not modifying the chunk at all\n }\n\n // Skip empty chunks and HTML facade chunks (Vite MPA)\n if (shouldSkipCodeInjection(code, chunk.facadeModuleId)) {\n return null;\n }\n\n const injectCode = staticInjectionCode.clone();\n\n if (sourcemapsEnabled && !hasExistingDebugID(code)) {\n const debugId = stringToUUID(code); // generate a deterministic debug ID\n injectCode.append(getDebugIdSnippet(debugId));\n }\n\n if (injectCode.isEmpty()) {\n return null;\n }\n\n const ms = meta?.magicString || new MagicString(code, { filename: chunk.fileName });\n const match = code.match(COMMENT_USE_STRICT_REGEX)?.[0];\n\n if (match) {\n // Add injected code after any comments or \"use strict\" at the beginning of the bundle.\n ms.appendLeft(match.length, injectCode.code());\n } else {\n // ms.replace() doesn't work when there is an empty string match (which happens if\n // there is neither, a comment, nor a \"use strict\" at the top of the chunk) so we\n // need this special case here.\n ms.prepend(injectCode.code());\n }\n\n // Rolldown can pass a native MagicString instance in meta.magicString\n // https://rolldown.rs/in-depth/native-magic-string#usage-examples\n if (ms?.constructor?.name === 'BindingMagicString') {\n // Rolldown docs say to return the magic string instance directly in this case\n return { code: ms as unknown as string };\n }\n\n return {\n code: ms.toString(),\n map: ms.generateMap({ file: chunk.fileName, hires: 'boundary' as unknown as undefined }),\n };\n }\n\n async function writeBundle(\n outputOptions: { dir?: string; file?: string },\n bundle: { [fileName: string]: unknown },\n ): Promise<void> {\n try {\n await sentryBuildPluginManager.createRelease();\n\n if (sourcemapsEnabled && options.sourcemaps?.disable !== 'disable-upload') {\n if (outputOptions.dir) {\n const outputDir = outputOptions.dir;\n const JS_AND_MAP_PATTERNS = [\n '/**/*.js',\n '/**/*.mjs',\n '/**/*.cjs',\n '/**/*.js.map',\n '/**/*.mjs.map',\n '/**/*.cjs.map',\n ].map(q => `${q}?(\\\\?*)?(#*)`); // We want to allow query and hash strings at the end of files\n const buildArtifacts = await globFiles(JS_AND_MAP_PATTERNS, { root: outputDir });\n await upload(buildArtifacts);\n } else if (outputOptions.file) {\n await upload([outputOptions.file]);\n } else {\n const buildArtifacts = Object.keys(bundle).map(asset => path.join(path.resolve(), asset));\n await upload(buildArtifacts);\n }\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n }\n\n const name = `sentry-${buildTool}-plugin`;\n\n if (shouldTransform) {\n const transformHook =\n buildTool === 'vite'\n ? {\n filter: { id: JS_MODULE_ID_FILTER },\n handler: transform,\n }\n : transform;\n\n return {\n name,\n buildStart,\n transform: transformHook,\n renderChunk,\n writeBundle,\n };\n }\n\n return {\n name,\n buildStart,\n renderChunk,\n writeBundle,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/no-explicit-any\nexport function sentryRollupPlugin(userOptions: Options = {}): any {\n // We return an array here so we don't break backwards compatibility with what\n // unplugin used to return\n return [_rollupPluginInternal(userOptions, 'rollup')];\n}\n\nexport type { Options as SentryRollupPluginOptions } from '../core';\n"],"names":["createRequire","createSentryBuildPluginManager","createDebugIdUploadFunction","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","createComponentNameAnnotateHooks","replaceBooleanFlagsInCode","isJsFile","shouldSkipCodeInjection","stringToUUID","getDebugIdSnippet","MagicString","COMMENT_USE_STRICT_REGEX","globFiles","path"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/rollup/index.ts"],"sourcesContent":["import type { Options } from '../core';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n isJsFile,\n shouldSkipCodeInjection,\n getDebugIdSnippet,\n stringToUUID,\n COMMENT_USE_STRICT_REGEX,\n createDebugIdUploadFunction,\n globFiles,\n createComponentNameAnnotateHooks,\n replaceBooleanFlagsInCode,\n CodeInjection,\n stampDebugId,\n} from '../core';\nimport type {\n ComponentAnnotationTransformMeta,\n ComponentAnnotationTransformResult,\n} from '../core/component-annotation-vite';\nimport type { SourceMap } from 'magic-string';\nimport MagicString from 'magic-string';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\n\n// The subset of Rollup's `TransformResult` that this plugin's `transform`\n// hook actually returns. Defined locally instead of imported from `rollup`\n// because `rollup` is an optional dependency.\ntype TransformResult = { code: string; map?: SourceMap | string | { mappings: string } | null } | null | undefined;\n\n// The subset of Rollup's `OutputBundle` the stamping hook reads.\ntype OutputBundle = Record<\n string,\n | { type: 'chunk'; fileName: string; code: string; sourcemapFileName?: string | null }\n | { type: 'asset'; fileName: string; source: string | Uint8Array }\n>;\n\ntype ViteModule = {\n parseAstAsync?: (code: string, options: { lang: 'jsx' | 'tsx' }) => Promise<unknown>;\n};\n\ntype ViteParseAstAsync = NonNullable<ViteModule['parseAstAsync']>;\ntype ViteAnnotationHooks = {\n transform(\n code: string,\n id: string,\n meta?: ComponentAnnotationTransformMeta,\n ): Promise<ComponentAnnotationTransformResult>;\n};\n\nlet viteParseAstAsyncPromise: Promise<ViteParseAstAsync | null> | undefined;\n\nconst JS_MODULE_ID_FILTER = /\\.[cm]?[jt]sx?(?:[?#].*)?$/;\n\nfunction hasExistingDebugID(code: string): boolean {\n // Check if a debug ID has already been injected to avoid duplicate injection (e.g. by another plugin or Sentry CLI)\n const chunkStartSnippet = code.slice(0, 6000);\n const chunkEndSnippet = code.slice(-500);\n\n if (chunkStartSnippet.includes('_sentryDebugIdIdentifier') || chunkEndSnippet.includes('//# debugId=')) {\n return true; // Debug ID already present, skip injection\n }\n\n return false;\n}\n\nfunction getRollupMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Rollup already transpiles this for us\n const req = createRequire(import.meta.url);\n const rollup = req('rollup') as { VERSION?: string };\n return rollup.VERSION?.split('.')[0];\n } catch {\n // do nothing, we'll just not report a version\n }\n\n return undefined;\n}\n\nfunction getViteParseAstAsync(): Promise<ViteParseAstAsync | null> {\n if (!viteParseAstAsyncPromise) {\n viteParseAstAsyncPromise = Promise.resolve()\n .then(async () => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Vite is an optional runtime peer for this package\n const viteModule = createRequire(import.meta.url)('vite') as ViteModule;\n\n if (typeof viteModule.parseAstAsync !== 'function') {\n return null;\n }\n\n try {\n await viteModule.parseAstAsync('const x = <div />;', { lang: 'tsx' });\n } catch {\n return null;\n }\n\n return viteModule.parseAstAsync;\n })\n .catch(() => null);\n }\n\n return viteParseAstAsyncPromise;\n}\n\n/**\n * @ignore - this is the internal plugin factory function only used for the Vite plugin!\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function _rollupPluginInternal(\n userOptions: Options = {},\n buildTool: 'rollup' | 'vite',\n buildToolMajorVersion?: string,\n) {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? `[sentry-${buildTool}-plugin]`,\n buildTool,\n buildToolMajorVersion: buildToolMajorVersion || getRollupMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n name: 'sentry-noop-plugin',\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n const transformAnnotations = options.reactComponentAnnotation?.enabled\n ? createComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n !!options.reactComponentAnnotation?._experimentalInjectIntoHtml,\n )\n : undefined;\n const transformViteAnnotations =\n options.reactComponentAnnotation?.enabled &&\n buildTool === 'vite' &&\n buildToolMajorVersion === '8' &&\n !options.reactComponentAnnotation?._experimentalInjectIntoHtml\n ? (() => {\n let viteAnnotationHooksPromise: Promise<ViteAnnotationHooks> | undefined;\n\n return {\n transform(code: string, id: string, meta?: ComponentAnnotationTransformMeta) {\n if (!viteAnnotationHooksPromise) {\n viteAnnotationHooksPromise = import('../core/component-annotation-vite').then(\n ({ createViteComponentNameAnnotateHooks }) =>\n createViteComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n getViteParseAstAsync,\n ),\n );\n }\n\n return viteAnnotationHooksPromise.then(hooks => hooks.transform(code, id, meta));\n },\n };\n })()\n : undefined;\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n const shouldTransform = transformAnnotations || transformReplace;\n\n function buildStart(): void {\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n }\n\n async function transform(\n code: string,\n id: string,\n meta?: ComponentAnnotationTransformMeta,\n ): Promise<TransformResult> {\n // Component annotations are only in user code and boolean flag replacements are\n // only in Sentry code. If we successfully add annotations, we can return early.\n let shouldRunBabelAnnotations = true;\n\n if (transformViteAnnotations?.transform) {\n const result = await transformViteAnnotations.transform(code, id, meta);\n if (result) {\n return result;\n }\n\n if (result === null) {\n shouldRunBabelAnnotations = false;\n }\n }\n\n if (shouldRunBabelAnnotations && transformAnnotations?.transform) {\n const result = await transformAnnotations.transform(code, id);\n if (result) {\n return result;\n }\n }\n\n if (transformReplace) {\n return replaceBooleanFlagsInCode(code, replacementValues);\n }\n\n return null;\n }\n\n function renderChunk(\n code: string,\n chunk: { fileName: string; facadeModuleId?: string | null },\n _?: unknown,\n meta?: { magicString?: MagicString },\n ): {\n code: string;\n map?: SourceMap;\n } | null {\n if (!isJsFile(chunk.fileName)) {\n return null; // returning null means not modifying the chunk at all\n }\n\n // Skip empty chunks and HTML facade chunks (Vite MPA)\n if (shouldSkipCodeInjection(code, chunk.facadeModuleId)) {\n return null;\n }\n\n const injectCode = staticInjectionCode.clone();\n\n if (sourcemapsEnabled && !hasExistingDebugID(code)) {\n const debugId = stringToUUID(code); // generate a deterministic debug ID\n injectCode.append(getDebugIdSnippet(debugId));\n }\n\n if (injectCode.isEmpty()) {\n return null;\n }\n\n const ms = meta?.magicString || new MagicString(code, { filename: chunk.fileName });\n const match = code.match(COMMENT_USE_STRICT_REGEX)?.[0];\n\n if (match) {\n // Add injected code after any comments or \"use strict\" at the beginning of the bundle.\n ms.appendLeft(match.length, injectCode.code());\n } else {\n // ms.replace() doesn't work when there is an empty string match (which happens if\n // there is neither, a comment, nor a \"use strict\" at the top of the chunk) so we\n // need this special case here.\n ms.prepend(injectCode.code());\n }\n\n // Rolldown can pass a native MagicString instance in meta.magicString\n // https://rolldown.rs/in-depth/native-magic-string#usage-examples\n if (ms?.constructor?.name === 'BindingMagicString') {\n // Rolldown docs say to return the magic string instance directly in this case\n return { code: ms as unknown as string };\n }\n\n return {\n code: ms.toString(),\n map: ms.generateMap({ file: chunk.fileName, hires: 'boundary' as unknown as undefined }),\n };\n }\n\n /**\n * Stamps debug IDs into the emitted chunks and source maps.\n *\n * `disable-upload` skips the upload routine (which stamps debug IDs into temp copies), so the emitted\n * artifacts get stamped here instead. Not in `renderChunk`: minifiers running after it would strip the\n * comment. Rollup computes `[hash]` file names before this hook, so only plugins that hash the final\n * assets afterwards (e.g. subresource integrity) see the stamped content.\n */\n function generateBundle(_outputOptions: unknown, bundle: OutputBundle): void {\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk' || !isJsFile(output.fileName)) {\n continue;\n }\n\n const sourceMapAsset = bundle[output.sourcemapFileName ?? `${output.fileName}.map`];\n const sourceMapSource =\n sourceMapAsset?.type === 'asset' && typeof sourceMapAsset.source === 'string'\n ? sourceMapAsset.source\n : undefined;\n\n const stamped = stampDebugId(output.code, sourceMapSource);\n if (!stamped) {\n continue;\n }\n\n output.code = stamped.bundleSource;\n if (stamped.sourceMapSource !== undefined && sourceMapAsset?.type === 'asset') {\n sourceMapAsset.source = stamped.sourceMapSource;\n }\n }\n }\n\n async function writeBundle(\n outputOptions: { dir?: string; file?: string },\n bundle: { [fileName: string]: unknown },\n ): Promise<void> {\n try {\n await sentryBuildPluginManager.createRelease();\n\n if (sourcemapsEnabled && options.sourcemaps?.disable !== 'disable-upload') {\n if (outputOptions.dir) {\n const outputDir = outputOptions.dir;\n const JS_AND_MAP_PATTERNS = [\n '/**/*.js',\n '/**/*.mjs',\n '/**/*.cjs',\n '/**/*.js.map',\n '/**/*.mjs.map',\n '/**/*.cjs.map',\n ].map(q => `${q}?(\\\\?*)?(#*)`); // We want to allow query and hash strings at the end of files\n const buildArtifacts = await globFiles(JS_AND_MAP_PATTERNS, { root: outputDir });\n await upload(buildArtifacts);\n } else if (outputOptions.file) {\n await upload([outputOptions.file]);\n } else {\n const buildArtifacts = Object.keys(bundle).map(asset => path.join(path.resolve(), asset));\n await upload(buildArtifacts);\n }\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n }\n\n const name = `sentry-${buildTool}-plugin`;\n const transformHook =\n buildTool === 'vite'\n ? {\n filter: { id: JS_MODULE_ID_FILTER },\n handler: transform,\n }\n : transform;\n\n return {\n name,\n buildStart,\n ...(shouldTransform ? { transform: transformHook } : {}),\n renderChunk,\n ...(options.sourcemaps?.disable === 'disable-upload'\n ? { generateBundle: { order: 'pre' as const, handler: generateBundle } }\n : {}),\n writeBundle,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type, @typescript-eslint/no-explicit-any\nexport function sentryRollupPlugin(userOptions: Options = {}): any {\n // We return an array here so we don't break backwards compatibility with what\n // unplugin used to return\n return [_rollupPluginInternal(userOptions, 'rollup')];\n}\n\nexport type { Options as SentryRollupPluginOptions } from '../core';\n"],"names":["createRequire","createSentryBuildPluginManager","createDebugIdUploadFunction","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","createComponentNameAnnotateHooks","replaceBooleanFlagsInCode","isJsFile","shouldSkipCodeInjection","stringToUUID","getDebugIdSnippet","MagicString","COMMENT_USE_STRICT_REGEX","stampDebugId","globFiles","path"],"mappings":"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"}
@@ -43,6 +43,25 @@ function getWebpackMajorVersion() {
43
43
  return void 0;
44
44
  }
45
45
  }
46
+ function addDebugIdsToAssets(compilation, RawSource) {
47
+ for (const asset of compilation.getAssets()) {
48
+ if (!index.isJsFile(asset.name)) {
49
+ continue;
50
+ }
51
+ const bundleSource = asset.source.source().toString();
52
+ const relatedSourceMap = asset.info.related?.sourceMap;
53
+ const sourceMapName = typeof relatedSourceMap === "string" ? relatedSourceMap : `${asset.name}.map`;
54
+ const sourceMapAsset = compilation.getAsset(sourceMapName);
55
+ const stamped = debugIdUpload.stampDebugId(bundleSource, sourceMapAsset?.source.source().toString());
56
+ if (!stamped) {
57
+ continue;
58
+ }
59
+ compilation.updateAsset(asset.name, new RawSource(stamped.bundleSource));
60
+ if (stamped.sourceMapSource !== void 0) {
61
+ compilation.updateAsset(sourceMapName, new RawSource(stamped.sourceMapSource));
62
+ }
63
+ }
64
+ }
46
65
  function sentryWebpackPluginFactory({
47
66
  BannerPlugin: UnsafeBannerPlugin,
48
67
  DefinePlugin: UnsafeDefinePlugin
@@ -123,6 +142,21 @@ function sentryWebpackPluginFactory({
123
142
  );
124
143
  }
125
144
  }
145
+ if (sourcemapsEnabled && options.sourcemaps?.disable === "disable-upload") {
146
+ const RawSource = compiler.webpack?.sources?.RawSource;
147
+ const stage = (compiler.webpack?.Compilation?.PROCESS_ASSETS_STAGE_DEV_TOOLING ?? 500) + 1;
148
+ if (!RawSource) {
149
+ logger.warn(
150
+ "Webpack sources are not available. Skipping debug ID injection into emitted source maps. This usually means webpack is not properly configured."
151
+ );
152
+ } else {
153
+ compiler.hooks.thisCompilation.tap("sentry-webpack-plugin", (compilation) => {
154
+ compilation.hooks.processAssets.tap({ name: "sentry-webpack-plugin", stage }, () => {
155
+ addDebugIdsToAssets(compilation, RawSource);
156
+ });
157
+ });
158
+ }
159
+ }
126
160
  if (transformReplace && DefinePlugin) {
127
161
  compiler.options.plugins = compiler.options.plugins || [];
128
162
  compiler.options.plugins.push(new DefinePlugin(replacementValues));
@@ -1 +1 @@
1
- {"version":3,"file":"webpack4and5.js","sources":["../../../src/webpack/webpack4and5.ts"],"sourcesContent":["import type { Options } from '../core/index';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n stringToUUID,\n createComponentNameAnnotateHooks,\n CodeInjection,\n getDebugIdSnippet,\n createDebugIdUploadFunction,\n} from '../core/index';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\n\nconst _req = createRequire(import.meta.url);\n\n// Resolve the loader path via the package's own exports.\n// webpack4and5.ts may end up in a shared chunk (_chunks/) whose import.meta.url\n// does not point to the webpack/ directory where the transform file lives, so\n// a path-relative lookup would fail. Using require.resolve on the package export\n// always finds the correct installed file regardless of chunk placement.\nlet COMPONENT_ANNOTATION_LOADER: string;\ntry {\n COMPONENT_ANNOTATION_LOADER = _req.resolve('@sentry/bundler-plugins/webpack-loader');\n} catch {\n // Fallback for non-packaged environments (e.g., monorepo source runs without dist)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Rollup transpiles import.meta for us for CJS\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n // The Rollup build emits `.js` for both CJS and ESM, so the extension is the same in both.\n COMPONENT_ANNOTATION_LOADER = path.resolve(dirname, 'component-annotation-transform.js');\n}\n\n// since webpack 5.1 compiler contains webpack module so plugins always use correct webpack version\n// https://github.com/webpack/webpack/commit/65eca2e529ce1d79b79200d4bdb1ce1b81141459\n\ninterface BannerPluginCallbackArg {\n chunk?: {\n hash?: string;\n contentHash?: {\n javascript?: string;\n };\n };\n}\n\ntype UnsafeBannerPlugin = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (options: any): unknown;\n};\n\ntype UnsafeDefinePlugin = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (options: any): unknown;\n};\n\ntype WebpackModule = {\n resource?: string;\n};\n\ntype WebpackLoaderCallback = (err: Error | null, content?: string, sourceMap?: unknown) => void;\n\ntype WebpackLoaderContext = {\n callback: WebpackLoaderCallback;\n};\n\ntype WebpackCompilationContext = {\n compiler: {\n webpack?: {\n NormalModule?: {\n getCompilationHooks: (compilation: WebpackCompilationContext) => {\n loader: {\n tap: (name: string, callback: (loaderContext: WebpackLoaderContext, module: WebpackModule) => void) => void;\n };\n };\n };\n };\n };\n hooks: {\n normalModuleLoader?: {\n tap: (name: string, callback: (loaderContext: WebpackLoaderContext, module: WebpackModule) => void) => void;\n };\n };\n};\n\ntype WebpackCompiler = {\n options: {\n plugins?: unknown[];\n mode?: string;\n module?: {\n rules?: unknown[];\n };\n };\n hooks: {\n thisCompilation: {\n tap: (name: string, callback: (compilation: WebpackCompilationContext) => void) => void;\n };\n afterEmit: {\n tapAsync: (name: string, callback: (compilation: WebpackCompilation, cb: () => void) => void) => void;\n };\n done: {\n tap: (name: string, callback: () => void) => void;\n };\n };\n webpack?: {\n BannerPlugin?: UnsafeBannerPlugin;\n DefinePlugin?: UnsafeDefinePlugin;\n };\n};\n\ntype WebpackCompilation = {\n outputOptions: {\n path?: string;\n };\n assets: Record<string, unknown>;\n hooks: {\n processAssets: {\n tap: (options: { name: string; stage: number }, callback: () => void) => void;\n };\n };\n};\n\n// Detect webpack major version for telemetry (helps differentiate webpack 4 vs 5 usage)\nfunction getWebpackMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Rollup already transpiles this for us\n const req = createRequire(import.meta.url);\n const webpack = req('webpack') as { version?: string; default?: { version?: string } };\n const version = webpack?.version ?? webpack?.default?.version;\n const webpackMajorVersion = version?.split('.')[0]; // \"4\" or \"5\"\n return webpackMajorVersion;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The factory function accepts BannerPlugin and DefinePlugin classes in\n * order to avoid direct dependencies on webpack.\n *\n * This allow us to export version of the plugin for webpack 5.1+ and compatible environments.\n *\n * Since webpack 5.1 compiler contains webpack module so plugins always use correct webpack version.\n */\nexport function sentryWebpackPluginFactory({\n BannerPlugin: UnsafeBannerPlugin,\n DefinePlugin: UnsafeDefinePlugin,\n}: {\n BannerPlugin?: UnsafeBannerPlugin;\n DefinePlugin?: UnsafeDefinePlugin;\n} = {}) {\n return function sentryWebpackPlugin(userOptions: SentryWebpackPluginOptions = {}) {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? '[sentry-webpack-plugin]',\n buildTool: 'webpack',\n buildToolMajorVersion: getWebpackMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n apply() {\n // noop plugin\n },\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n const transformAnnotations = options.reactComponentAnnotation?.enabled\n ? createComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n !!options.reactComponentAnnotation?._experimentalInjectIntoHtml,\n )\n : undefined;\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n\n return {\n apply(compiler: WebpackCompiler) {\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n\n // Get the correct plugin classes (webpack 5.1+ vs older versions)\n const BannerPlugin = compiler?.webpack?.BannerPlugin || UnsafeBannerPlugin;\n const DefinePlugin = compiler?.webpack?.DefinePlugin || UnsafeDefinePlugin;\n\n // Add BannerPlugin for code injection (release, metadata, debug IDs)\n if (!staticInjectionCode.isEmpty() || sourcemapsEnabled) {\n if (!BannerPlugin) {\n logger.warn(\n 'BannerPlugin is not available. Skipping code injection. This usually means webpack is not properly configured.',\n );\n } else {\n compiler.options.plugins = compiler.options.plugins || [];\n compiler.options.plugins.push(\n new BannerPlugin({\n raw: true,\n include: /\\.(js|ts|jsx|tsx|mjs|cjs)(\\?[^?]*)?(#[^#]*)?$/,\n banner: (arg?: BannerPluginCallbackArg) => {\n const codeToInject = staticInjectionCode.clone();\n if (sourcemapsEnabled) {\n const hash = arg?.chunk?.contentHash?.javascript ?? arg?.chunk?.hash;\n const debugId = hash ? stringToUUID(hash) : randomUUID();\n codeToInject.append(getDebugIdSnippet(debugId));\n }\n return codeToInject.code();\n },\n }),\n );\n }\n }\n\n // Add DefinePlugin for bundle size optimizations\n if (transformReplace && DefinePlugin) {\n compiler.options.plugins = compiler.options.plugins || [];\n compiler.options.plugins.push(new DefinePlugin(replacementValues));\n }\n\n // Add component name annotation transform\n if (transformAnnotations?.transform) {\n compiler.options.module = compiler.options.module || {};\n compiler.options.module.rules = compiler.options.module.rules || [];\n compiler.options.module.rules.unshift({\n test: /\\.[jt]sx$/,\n exclude: /node_modules/,\n enforce: 'pre',\n use: [\n {\n loader: COMPONENT_ANNOTATION_LOADER,\n options: {\n transform: transformAnnotations.transform,\n },\n },\n ],\n });\n }\n\n compiler.hooks.afterEmit.tapAsync(\n 'sentry-webpack-plugin',\n (compilation: WebpackCompilation, callback: (err?: Error) => void) => {\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n\n const run = async (): Promise<void> => {\n try {\n await sentryBuildPluginManager.createRelease();\n if (sourcemapsEnabled && options.sourcemaps?.disable !== 'disable-upload') {\n const outputPath = compilation.outputOptions.path ?? path.resolve();\n const buildArtifacts = Object.keys(compilation.assets).map(asset => path.join(outputPath, asset));\n await upload(buildArtifacts);\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n };\n\n run().then(\n () => callback(),\n (err: Error) => callback(err),\n );\n },\n );\n\n if (userOptions._experiments?.forceExitOnBuildCompletion && compiler.options.mode === 'production') {\n compiler.hooks.done.tap('sentry-webpack-plugin', () => {\n setTimeout(() => {\n logger.debug('Exiting process after debug file upload');\n process.exit(0);\n });\n });\n }\n },\n };\n };\n}\n\nexport type SentryWebpackPluginOptions = Options & {\n _experiments?: Options['_experiments'] & {\n /**\n * If enabled, the webpack plugin will exit the build process after the build completes.\n * Use this with caution, as it will terminate the process.\n *\n * More information: https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/345\n *\n * @default false\n */\n forceExitOnBuildCompletion?: boolean;\n };\n};\n"],"names":["createRequire","path","fileURLToPath","createSentryBuildPluginManager","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","createComponentNameAnnotateHooks","stringToUUID","randomUUID","getDebugIdSnippet","createDebugIdUploadFunction"],"mappings":"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"}
1
+ {"version":3,"file":"webpack4and5.js","sources":["../../../src/webpack/webpack4and5.ts"],"sourcesContent":["import type { Options } from '../core/index';\nimport {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n stringToUUID,\n createComponentNameAnnotateHooks,\n CodeInjection,\n getDebugIdSnippet,\n createDebugIdUploadFunction,\n isJsFile,\n stampDebugId,\n} from '../core/index';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { randomUUID } from 'node:crypto';\n\nconst _req = createRequire(import.meta.url);\n\n// Resolve the loader path via the package's own exports.\n// webpack4and5.ts may end up in a shared chunk (_chunks/) whose import.meta.url\n// does not point to the webpack/ directory where the transform file lives, so\n// a path-relative lookup would fail. Using require.resolve on the package export\n// always finds the correct installed file regardless of chunk placement.\nlet COMPONENT_ANNOTATION_LOADER: string;\ntry {\n COMPONENT_ANNOTATION_LOADER = _req.resolve('@sentry/bundler-plugins/webpack-loader');\n} catch {\n // Fallback for non-packaged environments (e.g., monorepo source runs without dist)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Rollup transpiles import.meta for us for CJS\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n // The Rollup build emits `.js` for both CJS and ESM, so the extension is the same in both.\n COMPONENT_ANNOTATION_LOADER = path.resolve(dirname, 'component-annotation-transform.js');\n}\n\n// since webpack 5.1 compiler contains webpack module so plugins always use correct webpack version\n// https://github.com/webpack/webpack/commit/65eca2e529ce1d79b79200d4bdb1ce1b81141459\n\ninterface BannerPluginCallbackArg {\n chunk?: {\n hash?: string;\n contentHash?: {\n javascript?: string;\n };\n };\n}\n\ntype UnsafeBannerPlugin = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (options: any): unknown;\n};\n\ntype UnsafeDefinePlugin = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (options: any): unknown;\n};\n\ntype WebpackSource = {\n source: () => string | Buffer;\n};\n\ntype WebpackRawSource = {\n new (source: string): WebpackSource;\n};\n\ntype WebpackAsset = {\n name: string;\n source: WebpackSource;\n info: {\n related?: {\n sourceMap?: string | string[];\n };\n };\n};\n\ntype WebpackCompiler = {\n options: {\n plugins?: unknown[];\n mode?: string;\n module?: {\n rules?: unknown[];\n };\n };\n hooks: {\n thisCompilation: {\n tap: (name: string, callback: (compilation: WebpackCompilation) => void) => void;\n };\n afterEmit: {\n tapAsync: (name: string, callback: (compilation: WebpackCompilation, cb: () => void) => void) => void;\n };\n done: {\n tap: (name: string, callback: () => void) => void;\n };\n };\n webpack?: {\n BannerPlugin?: UnsafeBannerPlugin;\n DefinePlugin?: UnsafeDefinePlugin;\n Compilation?: {\n PROCESS_ASSETS_STAGE_DEV_TOOLING?: number;\n };\n sources?: {\n RawSource?: WebpackRawSource;\n };\n };\n};\n\ntype WebpackCompilation = {\n outputOptions: {\n path?: string;\n };\n assets: Record<string, unknown>;\n getAssets: () => WebpackAsset[];\n getAsset: (name: string) => WebpackAsset | undefined;\n updateAsset: (name: string, source: WebpackSource) => void;\n hooks: {\n processAssets: {\n tap: (options: { name: string; stage: number }, callback: () => void) => void;\n };\n };\n};\n\n// Detect webpack major version for telemetry (helps differentiate webpack 4 vs 5 usage)\nfunction getWebpackMajorVersion(): string | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore - Rollup already transpiles this for us\n const req = createRequire(import.meta.url);\n const webpack = req('webpack') as { version?: string; default?: { version?: string } };\n const version = webpack?.version ?? webpack?.default?.version;\n const webpackMajorVersion = version?.split('.')[0]; // \"4\" or \"5\"\n return webpackMajorVersion;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Stamps each JS asset's debug ID into the asset itself and its source map asset.\n *\n * Runs after source maps have been generated, so the JS asset no longer needs to carry\n * source map information and can be replaced with a plain `RawSource`.\n */\nfunction addDebugIdsToAssets(compilation: WebpackCompilation, RawSource: WebpackRawSource): void {\n for (const asset of compilation.getAssets()) {\n if (!isJsFile(asset.name)) {\n continue;\n }\n\n const bundleSource = asset.source.source().toString();\n const relatedSourceMap = asset.info.related?.sourceMap;\n const sourceMapName = typeof relatedSourceMap === 'string' ? relatedSourceMap : `${asset.name}.map`;\n const sourceMapAsset = compilation.getAsset(sourceMapName);\n\n const stamped = stampDebugId(bundleSource, sourceMapAsset?.source.source().toString());\n if (!stamped) {\n continue;\n }\n\n compilation.updateAsset(asset.name, new RawSource(stamped.bundleSource));\n if (stamped.sourceMapSource !== undefined) {\n compilation.updateAsset(sourceMapName, new RawSource(stamped.sourceMapSource));\n }\n }\n}\n\n/**\n * The factory function accepts BannerPlugin and DefinePlugin classes in\n * order to avoid direct dependencies on webpack.\n *\n * This allow us to export version of the plugin for webpack 5.1+ and compatible environments.\n *\n * Since webpack 5.1 compiler contains webpack module so plugins always use correct webpack version.\n */\nexport function sentryWebpackPluginFactory({\n BannerPlugin: UnsafeBannerPlugin,\n DefinePlugin: UnsafeDefinePlugin,\n}: {\n BannerPlugin?: UnsafeBannerPlugin;\n DefinePlugin?: UnsafeDefinePlugin;\n} = {}) {\n return function sentryWebpackPlugin(userOptions: SentryWebpackPluginOptions = {}) {\n const sentryBuildPluginManager = createSentryBuildPluginManager(userOptions, {\n loggerPrefix: userOptions._metaOptions?.loggerPrefixOverride ?? '[sentry-webpack-plugin]',\n buildTool: 'webpack',\n buildToolMajorVersion: getWebpackMajorVersion(),\n });\n\n const {\n logger,\n normalizedOptions: options,\n bundleSizeOptimizationReplacementValues: replacementValues,\n bundleMetadata,\n createDependencyOnBuildArtifacts,\n } = sentryBuildPluginManager;\n\n if (options.disable) {\n return {\n apply() {\n // noop plugin\n },\n };\n }\n\n if (process.cwd().match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n logger.warn('Running Sentry plugin from within a `node_modules` folder. Some features may not work.');\n }\n\n const sourcemapsEnabled = options.sourcemaps?.disable !== true;\n const staticInjectionCode = new CodeInjection();\n\n if (!options.release.inject) {\n logger.debug('Release injection disabled via `release.inject` option. Will not inject release.');\n } else if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not inject release. Please set the `release.name` option to identify your release.',\n );\n } else {\n staticInjectionCode.append(\n generateReleaseInjectorCode({\n release: options.release.name,\n injectBuildInformation: options._experiments.injectBuildInformation || false,\n }),\n );\n }\n\n if (Object.keys(bundleMetadata).length > 0) {\n staticInjectionCode.append(generateModuleMetadataInjectorCode(bundleMetadata));\n }\n\n const transformAnnotations = options.reactComponentAnnotation?.enabled\n ? createComponentNameAnnotateHooks(\n options.reactComponentAnnotation?.ignoredComponents || [],\n !!options.reactComponentAnnotation?._experimentalInjectIntoHtml,\n )\n : undefined;\n\n const transformReplace = Object.keys(replacementValues).length > 0;\n\n return {\n apply(compiler: WebpackCompiler) {\n void sentryBuildPluginManager.telemetry.emitBundlerPluginExecutionSignal().catch(() => {\n // Telemetry failures are acceptable\n });\n\n // Get the correct plugin classes (webpack 5.1+ vs older versions)\n const BannerPlugin = compiler?.webpack?.BannerPlugin || UnsafeBannerPlugin;\n const DefinePlugin = compiler?.webpack?.DefinePlugin || UnsafeDefinePlugin;\n\n // Add BannerPlugin for code injection (release, metadata, debug IDs)\n if (!staticInjectionCode.isEmpty() || sourcemapsEnabled) {\n if (!BannerPlugin) {\n logger.warn(\n 'BannerPlugin is not available. Skipping code injection. This usually means webpack is not properly configured.',\n );\n } else {\n compiler.options.plugins = compiler.options.plugins || [];\n compiler.options.plugins.push(\n new BannerPlugin({\n raw: true,\n include: /\\.(js|ts|jsx|tsx|mjs|cjs)(\\?[^?]*)?(#[^#]*)?$/,\n banner: (arg?: BannerPluginCallbackArg) => {\n const codeToInject = staticInjectionCode.clone();\n if (sourcemapsEnabled) {\n const hash = arg?.chunk?.contentHash?.javascript ?? arg?.chunk?.hash;\n const debugId = hash ? stringToUUID(hash) : randomUUID();\n codeToInject.append(getDebugIdSnippet(debugId));\n }\n return codeToInject.code();\n },\n }),\n );\n }\n }\n\n // The upload routine (which stamps debug IDs into temp copies of the artifacts) is skipped\n // with `disable-upload`, so the emitted artifacts get stamped in the asset pipeline instead.\n if (sourcemapsEnabled && options.sourcemaps?.disable === 'disable-upload') {\n const RawSource = compiler.webpack?.sources?.RawSource;\n // Right after source map generation (and thus after minification, which would strip the comment),\n // so later stages (real content hashing, subresource integrity) see the final assets.\n const stage = (compiler.webpack?.Compilation?.PROCESS_ASSETS_STAGE_DEV_TOOLING ?? 500) + 1;\n\n if (!RawSource) {\n logger.warn(\n 'Webpack sources are not available. Skipping debug ID injection into emitted source maps. This usually means webpack is not properly configured.',\n );\n } else {\n compiler.hooks.thisCompilation.tap('sentry-webpack-plugin', compilation => {\n compilation.hooks.processAssets.tap({ name: 'sentry-webpack-plugin', stage }, () => {\n addDebugIdsToAssets(compilation, RawSource);\n });\n });\n }\n }\n\n // Add DefinePlugin for bundle size optimizations\n if (transformReplace && DefinePlugin) {\n compiler.options.plugins = compiler.options.plugins || [];\n compiler.options.plugins.push(new DefinePlugin(replacementValues));\n }\n\n // Add component name annotation transform\n if (transformAnnotations?.transform) {\n compiler.options.module = compiler.options.module || {};\n compiler.options.module.rules = compiler.options.module.rules || [];\n compiler.options.module.rules.unshift({\n test: /\\.[jt]sx$/,\n exclude: /node_modules/,\n enforce: 'pre',\n use: [\n {\n loader: COMPONENT_ANNOTATION_LOADER,\n options: {\n transform: transformAnnotations.transform,\n },\n },\n ],\n });\n }\n\n compiler.hooks.afterEmit.tapAsync(\n 'sentry-webpack-plugin',\n (compilation: WebpackCompilation, callback: (err?: Error) => void) => {\n const freeGlobalDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n const upload = createDebugIdUploadFunction({ sentryBuildPluginManager });\n\n const run = async (): Promise<void> => {\n try {\n await sentryBuildPluginManager.createRelease();\n if (sourcemapsEnabled && options.sourcemaps?.disable !== 'disable-upload') {\n const outputPath = compilation.outputOptions.path ?? path.resolve();\n const buildArtifacts = Object.keys(compilation.assets).map(asset => path.join(outputPath, asset));\n await upload(buildArtifacts);\n }\n } finally {\n freeGlobalDependencyOnBuildArtifacts();\n await sentryBuildPluginManager.deleteArtifacts();\n }\n };\n\n run().then(\n () => callback(),\n (err: Error) => callback(err),\n );\n },\n );\n\n if (userOptions._experiments?.forceExitOnBuildCompletion && compiler.options.mode === 'production') {\n compiler.hooks.done.tap('sentry-webpack-plugin', () => {\n setTimeout(() => {\n logger.debug('Exiting process after debug file upload');\n process.exit(0);\n });\n });\n }\n },\n };\n };\n}\n\nexport type SentryWebpackPluginOptions = Options & {\n _experiments?: Options['_experiments'] & {\n /**\n * If enabled, the webpack plugin will exit the build process after the build completes.\n * Use this with caution, as it will terminate the process.\n *\n * More information: https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/345\n *\n * @default false\n */\n forceExitOnBuildCompletion?: boolean;\n };\n};\n"],"names":["createRequire","path","fileURLToPath","isJsFile","stampDebugId","createSentryBuildPluginManager","CodeInjection","generateReleaseInjectorCode","generateModuleMetadataInjectorCode","createComponentNameAnnotateHooks","stringToUUID","randomUUID","getDebugIdSnippet","createDebugIdUploadFunction"],"mappings":"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"}
@@ -75,6 +75,80 @@ function addDebugIdToBundleSource(bundleSource, debugId) {
75
75
  //# debugId=${debugId}`;
76
76
  }
77
77
  }
78
+ function setDebugIdOnSourceMap(map, debugId) {
79
+ map["debug_id"] = debugId;
80
+ map["debugId"] = debugId;
81
+ }
82
+ function parseSourceMap(sourceMapSource) {
83
+ let map;
84
+ try {
85
+ map = JSON.parse(sourceMapSource);
86
+ } catch {
87
+ return void 0;
88
+ }
89
+ return map && typeof map === "object" ? map : void 0;
90
+ }
91
+ function stampDebugId(bundleSource, sourceMapSource) {
92
+ const debugId = determineDebugIdFromBundleSource(bundleSource);
93
+ if (debugId === void 0) {
94
+ return void 0;
95
+ }
96
+ if (sourceMapSource === void 0) {
97
+ if (!bundleHasInlineSourceMap(bundleSource)) {
98
+ return void 0;
99
+ }
100
+ return { bundleSource: addDebugIdToBundleSource(bundleSource, debugId), sourceMapSource: void 0 };
101
+ }
102
+ const map = parseSourceMap(sourceMapSource);
103
+ if (!map) {
104
+ return void 0;
105
+ }
106
+ setDebugIdOnSourceMap(map, debugId);
107
+ return {
108
+ bundleSource: addDebugIdToBundleSource(bundleSource, debugId),
109
+ sourceMapSource: JSON.stringify(map)
110
+ };
111
+ }
112
+ async function addDebugIdToEmittedArtifacts(bundleFilePath, logger, resolveSourceMapHook) {
113
+ let bundleSource;
114
+ try {
115
+ bundleSource = await fs__default.promises.readFile(bundleFilePath, "utf8");
116
+ } catch (e) {
117
+ logger.error(`Could not read bundle to stamp debug ID: ${bundleFilePath}`, e);
118
+ return;
119
+ }
120
+ const sourceMapPath = await determineSourceMapPathFromBundle(
121
+ bundleFilePath,
122
+ bundleSource,
123
+ logger,
124
+ resolveSourceMapHook
125
+ );
126
+ let sourceMapSource;
127
+ if (sourceMapPath) {
128
+ try {
129
+ sourceMapSource = await fs__default.promises.readFile(sourceMapPath, "utf8");
130
+ } catch (e) {
131
+ logger.error(`Could not read source map to stamp debug ID: ${sourceMapPath}`, e);
132
+ return;
133
+ }
134
+ }
135
+ const stamped = stampDebugId(bundleSource, sourceMapSource);
136
+ if (!stamped) {
137
+ logger.debug(
138
+ `Could not stamp debug ID (no debug ID in bundle, no source map, or invalid source map): ${bundleFilePath}`
139
+ );
140
+ return;
141
+ }
142
+ const writes = [fs__default.promises.writeFile(bundleFilePath, stamped.bundleSource, "utf8")];
143
+ if (sourceMapPath && stamped.sourceMapSource !== void 0) {
144
+ writes.push(fs__default.promises.writeFile(sourceMapPath, stamped.sourceMapSource, "utf8"));
145
+ }
146
+ try {
147
+ await Promise.all(writes);
148
+ } catch (e) {
149
+ logger.error(`Could not write debug ID into build artifacts: ${bundleFilePath}`, e);
150
+ }
151
+ }
78
152
  function bundleHasInlineSourceMap(bundleSource) {
79
153
  return /^\s*\/\/# sourceMappingURL=data:/m.test(bundleSource);
80
154
  }
@@ -133,8 +207,7 @@ async function prepareSourceMapForDebugIdUpload(sourceMapPath, targetPath, debug
133
207
  let map;
134
208
  try {
135
209
  map = JSON.parse(sourceMapFileContent);
136
- map["debug_id"] = debugId;
137
- map["debugId"] = debugId;
210
+ setDebugIdOnSourceMap(map, debugId);
138
211
  } catch {
139
212
  logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);
140
213
  return;
@@ -161,5 +234,5 @@ function defaultRewriteSourcesHook(source) {
161
234
  }
162
235
  }
163
236
 
164
- export { createDebugIdUploadFunction, defaultRewriteSourcesHook, determineSourceMapPathFromBundle, prepareBundleForDebugIdUpload };
237
+ export { addDebugIdToEmittedArtifacts, createDebugIdUploadFunction, defaultRewriteSourcesHook, determineSourceMapPathFromBundle, prepareBundleForDebugIdUpload, stampDebugId };
165
238
  //# sourceMappingURL=debug-id-upload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"debug-id-upload.js","sources":["../../../src/core/debug-id-upload.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport * as url from 'url';\nimport * as util from 'util';\nimport { promisify } from 'util';\nimport type { SentryBuildPluginManager } from './build-plugin-manager';\nimport type { Logger } from './logger';\nimport type { ResolveSourceMapHook, RewriteSourcesHook } from './types';\nimport { stripQueryAndHashFromPath } from './utils';\n\ninterface DebugIdUploadPluginOptions {\n sentryBuildPluginManager: SentryBuildPluginManager;\n}\n\nexport function createDebugIdUploadFunction({ sentryBuildPluginManager }: DebugIdUploadPluginOptions) {\n return async (buildArtifactPaths: string[]) => {\n // Webpack and perhaps other bundlers allow you to append query strings to\n // filenames for cache busting purposes. We should strip these before upload.\n const cleanedPaths = buildArtifactPaths.map(stripQueryAndHashFromPath);\n await sentryBuildPluginManager.uploadSourcemaps(cleanedPaths);\n };\n}\n\nexport async function prepareBundleForDebugIdUpload(\n bundleFilePath: string,\n uploadFolder: string,\n chunkIndex: number,\n logger: Logger,\n rewriteSourcesHook: RewriteSourcesHook,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleContent;\n try {\n bundleContent = await promisify(fs.readFile)(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to determine debug ID and source map: ${bundleFilePath}`, e);\n return;\n }\n\n const debugId = determineDebugIdFromBundleSource(bundleContent);\n if (debugId === undefined) {\n logger.debug(\n `Could not determine debug ID from bundle. This can happen if you did not clean your output folder before installing the Sentry plugin. File will not be source mapped: ${bundleFilePath}`,\n );\n return;\n }\n\n const uniqueUploadName = `${debugId}-${chunkIndex}`;\n\n bundleContent = addDebugIdToBundleSource(bundleContent, debugId);\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleContent,\n logger,\n resolveSourceMapHook,\n );\n\n // A chunk with a debug ID but no resolvable source map\n // (e.g. framework-generated stub chunks that never emit one) can't be\n // symbolicated, so uploading its minified source alone accomplishes\n // nothing and only makes the uploader warn about a missing source map ref.\n // Skip it, unless the source map is inlined into the bundle, in which case\n // the source file carries the map itself and must still be uploaded.\n if (!sourceMapPath && !bundleHasInlineSourceMap(bundleContent)) {\n logger.debug(`Not uploading bundle without a source map: ${bundleFilePath}`);\n return;\n }\n\n const writeSourceFilePromise = fs.promises.writeFile(\n path.join(uploadFolder, `${uniqueUploadName}.js`),\n bundleContent,\n 'utf-8',\n );\n\n const writeSourceMapFilePromise = sourceMapPath\n ? prepareSourceMapForDebugIdUpload(\n sourceMapPath,\n path.join(uploadFolder, `${uniqueUploadName}.js.map`),\n debugId,\n rewriteSourcesHook,\n logger,\n )\n : Promise.resolve();\n\n await writeSourceFilePromise;\n await writeSourceMapFilePromise;\n}\n\n/**\n * Looks for a particular string pattern (`sdbid-[debug ID]`) in the bundle\n * source and extracts the bundle's debug ID from it.\n *\n * The string pattern is injected via the debug ID injection snipped.\n */\nfunction determineDebugIdFromBundleSource(code: string): string | undefined {\n const match = code.match(\n /sentry-dbid-([0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12})/,\n );\n\n if (match) {\n return match[1];\n } else {\n return undefined;\n }\n}\n\nconst SPEC_LAST_DEBUG_ID_REGEX = /\\/\\/# debugId=([a-fA-F0-9-]+)(?![\\s\\S]*\\/\\/# debugId=)/m;\n\nfunction hasSpecCompliantDebugId(bundleSource: string): boolean {\n return SPEC_LAST_DEBUG_ID_REGEX.test(bundleSource);\n}\n\nfunction addDebugIdToBundleSource(bundleSource: string, debugId: string): string {\n if (hasSpecCompliantDebugId(bundleSource)) {\n return bundleSource.replace(SPEC_LAST_DEBUG_ID_REGEX, `//# debugId=${debugId}`);\n } else {\n return `${bundleSource}\\n//# debugId=${debugId}`;\n }\n}\n\n/**\n * Whether the bundle carries its source map inlined as `sourceMappingURL=data:`\n * URI, rather than referencing a separate `.map` file. Such bundles must still\n * be uploaded even when no `.map` file is found, because the source file itself\n * contains the map.\n */\nfunction bundleHasInlineSourceMap(bundleSource: string): boolean {\n return /^\\s*\\/\\/# sourceMappingURL=data:/m.test(bundleSource);\n}\n\n/**\n * Applies a set of heuristics to find the source map for a particular bundle.\n *\n * @returns the path to the bundle's source map or `undefined` if none could be found.\n */\nexport async function determineSourceMapPathFromBundle(\n bundlePath: string,\n bundleSource: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<string | undefined> {\n const sourceMappingUrlMatch = bundleSource.match(/^\\s*\\/\\/# sourceMappingURL=(.*)$/m);\n const sourceMappingUrl = sourceMappingUrlMatch ? (sourceMappingUrlMatch[1] as string) : undefined;\n\n const searchLocations: string[] = [];\n\n if (resolveSourceMapHook) {\n logger.debug(\n `Calling sourcemaps.resolveSourceMap(${JSON.stringify(bundlePath)}, ${JSON.stringify(sourceMappingUrl)})`,\n );\n const customPath = await resolveSourceMapHook(bundlePath, sourceMappingUrl);\n logger.debug(`resolveSourceMap hook returned: ${JSON.stringify(customPath)}`);\n\n if (customPath) {\n searchLocations.push(customPath);\n }\n }\n\n // 1. try to find source map at `sourceMappingURL` location\n if (sourceMappingUrl) {\n let parsedUrl: URL | undefined;\n try {\n parsedUrl = new URL(sourceMappingUrl);\n } catch {\n // noop\n }\n\n if (parsedUrl?.protocol === 'file:') {\n searchLocations.push(url.fileURLToPath(sourceMappingUrl));\n } else if (parsedUrl) {\n // noop, non-file urls don't translate to a local sourcemap file\n } else if (path.isAbsolute(sourceMappingUrl)) {\n searchLocations.push(path.normalize(sourceMappingUrl));\n } else {\n searchLocations.push(path.normalize(path.join(path.dirname(bundlePath), sourceMappingUrl)));\n }\n }\n\n // 2. try to find source map at path adjacent to chunk source, but with `.map` appended\n searchLocations.push(`${bundlePath}.map`);\n\n for (const searchLocation of searchLocations) {\n try {\n await util.promisify(fs.access)(searchLocation);\n logger.debug(`Source map found for bundle \\`${bundlePath}\\`: \\`${searchLocation}\\``);\n return searchLocation;\n } catch {\n // noop\n }\n }\n\n // This is just a debug message because it can be quite spammy for some frameworks\n logger.debug(\n `Could not determine source map path for bundle \\`${bundlePath}\\`` +\n ` with sourceMappingURL=${sourceMappingUrl === undefined ? 'undefined' : `\\`${sourceMappingUrl}\\``}` +\n ` - Did you turn on source map generation in your bundler?` +\n ` (Attempted paths: ${searchLocations.map(e => `\\`${e}\\``).join(', ')})`,\n );\n return undefined;\n}\n\n/**\n * Reads a source map, injects debug ID fields, and writes the source map to the target path.\n */\nasync function prepareSourceMapForDebugIdUpload(\n sourceMapPath: string,\n targetPath: string,\n debugId: string,\n rewriteSourcesHook: RewriteSourcesHook,\n logger: Logger,\n): Promise<void> {\n let sourceMapFileContent: string;\n try {\n sourceMapFileContent = await util.promisify(fs.readFile)(sourceMapPath, {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to read source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n\n let map: Record<string, unknown>;\n try {\n map = JSON.parse(sourceMapFileContent) as { sources: unknown; [key: string]: unknown };\n // For now we write both fields until we know what will become the standard - if ever.\n map['debug_id'] = debugId;\n map['debugId'] = debugId;\n } catch {\n logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);\n return;\n }\n\n if (map['sources'] && Array.isArray(map['sources'])) {\n const mapDir = path.dirname(sourceMapPath);\n map['sources'] = map['sources'].map((source: string) => rewriteSourcesHook(source, map, { mapDir }));\n }\n\n try {\n await util.promisify(fs.writeFile)(targetPath, JSON.stringify(map), {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to prepare source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n}\n\nconst PROTOCOL_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\nexport function defaultRewriteSourcesHook(source: string): string {\n if (source.match(PROTOCOL_REGEX)) {\n return source.replace(PROTOCOL_REGEX, '');\n } else {\n return path.relative(process.cwd(), path.normalize(source));\n }\n}\n"],"names":["fs","path"],"mappings":"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"}
1
+ {"version":3,"file":"debug-id-upload.js","sources":["../../../src/core/debug-id-upload.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport * as url from 'url';\nimport * as util from 'util';\nimport { promisify } from 'util';\nimport type { SentryBuildPluginManager } from './build-plugin-manager';\nimport type { Logger } from './logger';\nimport type { ResolveSourceMapHook, RewriteSourcesHook } from './types';\nimport { stripQueryAndHashFromPath } from './utils';\n\ninterface DebugIdUploadPluginOptions {\n sentryBuildPluginManager: SentryBuildPluginManager;\n}\n\nexport function createDebugIdUploadFunction({ sentryBuildPluginManager }: DebugIdUploadPluginOptions) {\n return async (buildArtifactPaths: string[]) => {\n // Webpack and perhaps other bundlers allow you to append query strings to\n // filenames for cache busting purposes. We should strip these before upload.\n const cleanedPaths = buildArtifactPaths.map(stripQueryAndHashFromPath);\n await sentryBuildPluginManager.uploadSourcemaps(cleanedPaths);\n };\n}\n\nexport async function prepareBundleForDebugIdUpload(\n bundleFilePath: string,\n uploadFolder: string,\n chunkIndex: number,\n logger: Logger,\n rewriteSourcesHook: RewriteSourcesHook,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleContent;\n try {\n bundleContent = await promisify(fs.readFile)(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to determine debug ID and source map: ${bundleFilePath}`, e);\n return;\n }\n\n const debugId = determineDebugIdFromBundleSource(bundleContent);\n if (debugId === undefined) {\n logger.debug(\n `Could not determine debug ID from bundle. This can happen if you did not clean your output folder before installing the Sentry plugin. File will not be source mapped: ${bundleFilePath}`,\n );\n return;\n }\n\n const uniqueUploadName = `${debugId}-${chunkIndex}`;\n\n bundleContent = addDebugIdToBundleSource(bundleContent, debugId);\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleContent,\n logger,\n resolveSourceMapHook,\n );\n\n // A chunk with a debug ID but no resolvable source map\n // (e.g. framework-generated stub chunks that never emit one) can't be\n // symbolicated, so uploading its minified source alone accomplishes\n // nothing and only makes the uploader warn about a missing source map ref.\n // Skip it, unless the source map is inlined into the bundle, in which case\n // the source file carries the map itself and must still be uploaded.\n if (!sourceMapPath && !bundleHasInlineSourceMap(bundleContent)) {\n logger.debug(`Not uploading bundle without a source map: ${bundleFilePath}`);\n return;\n }\n\n const writeSourceFilePromise = fs.promises.writeFile(\n path.join(uploadFolder, `${uniqueUploadName}.js`),\n bundleContent,\n 'utf-8',\n );\n\n const writeSourceMapFilePromise = sourceMapPath\n ? prepareSourceMapForDebugIdUpload(\n sourceMapPath,\n path.join(uploadFolder, `${uniqueUploadName}.js.map`),\n debugId,\n rewriteSourcesHook,\n logger,\n )\n : Promise.resolve();\n\n await writeSourceFilePromise;\n await writeSourceMapFilePromise;\n}\n\n/**\n * Looks for a particular string pattern (`sdbid-[debug ID]`) in the bundle\n * source and extracts the bundle's debug ID from it.\n *\n * The string pattern is injected via the debug ID injection snipped.\n */\nfunction determineDebugIdFromBundleSource(code: string): string | undefined {\n const match = code.match(\n /sentry-dbid-([0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12})/,\n );\n\n if (match) {\n return match[1];\n } else {\n return undefined;\n }\n}\n\nconst SPEC_LAST_DEBUG_ID_REGEX = /\\/\\/# debugId=([a-fA-F0-9-]+)(?![\\s\\S]*\\/\\/# debugId=)/m;\n\nfunction hasSpecCompliantDebugId(bundleSource: string): boolean {\n return SPEC_LAST_DEBUG_ID_REGEX.test(bundleSource);\n}\n\nfunction addDebugIdToBundleSource(bundleSource: string, debugId: string): string {\n if (hasSpecCompliantDebugId(bundleSource)) {\n return bundleSource.replace(SPEC_LAST_DEBUG_ID_REGEX, `//# debugId=${debugId}`);\n } else {\n return `${bundleSource}\\n//# debugId=${debugId}`;\n }\n}\n\nfunction setDebugIdOnSourceMap(map: Record<string, unknown>, debugId: string): void {\n // For now we write both fields until we know what will become the standard - if ever.\n map['debug_id'] = debugId;\n map['debugId'] = debugId;\n}\n\nexport type StampedArtifacts = {\n bundleSource: string;\n /** `undefined` when the bundle has no separate source map (i.e. the map is inlined). */\n sourceMapSource: string | undefined;\n};\n\nfunction parseSourceMap(sourceMapSource: string): Record<string, unknown> | undefined {\n let map: unknown;\n try {\n map = JSON.parse(sourceMapSource);\n } catch {\n return undefined;\n }\n\n return map && typeof map === 'object' ? (map as Record<string, unknown>) : undefined;\n}\n\n/**\n * Stamps the debug ID injected into `bundleSource` into the bundle (as `//# debugId=` comment) and its\n * source map (as `debug_id`/`debugId` fields).\n *\n * This exists for `sourcemaps.disable: \"disable-upload\"`: the regular upload path only stamps\n * temporary copies of the artifacts (see `prepareBundleForDebugIdUpload`), so without this the\n * emitted artifacts would carry no debug ID and a later manual upload could not match them.\n * Callers must apply the result inside the bundler's asset pipeline (or, for bundlers without one,\n * before the build resolves) so that integrity hashes computed by later build steps include it.\n *\n * Pass `sourceMapSource: undefined` when the bundle has no separate source map. A bundle with an\n * inlined map still gets the comment, which is all the CLI and Symbolicator read the debug ID from.\n *\n * @returns the stamped artifacts, or `undefined` for bundles without a debug ID, without any source\n * map, or with an unparseable map.\n */\nexport function stampDebugId(bundleSource: string, sourceMapSource: string | undefined): StampedArtifacts | undefined {\n const debugId = determineDebugIdFromBundleSource(bundleSource);\n if (debugId === undefined) {\n return undefined;\n }\n\n if (sourceMapSource === undefined) {\n if (!bundleHasInlineSourceMap(bundleSource)) {\n return undefined;\n }\n\n return { bundleSource: addDebugIdToBundleSource(bundleSource, debugId), sourceMapSource: undefined };\n }\n\n const map = parseSourceMap(sourceMapSource);\n if (!map) {\n return undefined;\n }\n\n setDebugIdOnSourceMap(map, debugId);\n\n return {\n bundleSource: addDebugIdToBundleSource(bundleSource, debugId),\n sourceMapSource: JSON.stringify(map),\n };\n}\n\n/**\n * Stamps the debug ID of an emitted bundle into the bundle and its source map on disk.\n *\n * Used by bundlers that offer no hook to modify assets before they are written (esbuild).\n */\nexport async function addDebugIdToEmittedArtifacts(\n bundleFilePath: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleSource: string;\n try {\n bundleSource = await fs.promises.readFile(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to stamp debug ID: ${bundleFilePath}`, e);\n return;\n }\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleSource,\n logger,\n resolveSourceMapHook,\n );\n\n let sourceMapSource: string | undefined;\n if (sourceMapPath) {\n try {\n sourceMapSource = await fs.promises.readFile(sourceMapPath, 'utf8');\n } catch (e) {\n logger.error(`Could not read source map to stamp debug ID: ${sourceMapPath}`, e);\n return;\n }\n }\n\n const stamped = stampDebugId(bundleSource, sourceMapSource);\n if (!stamped) {\n logger.debug(\n `Could not stamp debug ID (no debug ID in bundle, no source map, or invalid source map): ${bundleFilePath}`,\n );\n return;\n }\n\n const writes = [fs.promises.writeFile(bundleFilePath, stamped.bundleSource, 'utf8')];\n if (sourceMapPath && stamped.sourceMapSource !== undefined) {\n writes.push(fs.promises.writeFile(sourceMapPath, stamped.sourceMapSource, 'utf8'));\n }\n\n try {\n await Promise.all(writes);\n } catch (e) {\n logger.error(`Could not write debug ID into build artifacts: ${bundleFilePath}`, e);\n }\n}\n\n/**\n * Whether the bundle carries its source map inlined as `sourceMappingURL=data:`\n * URI, rather than referencing a separate `.map` file. Such bundles must still\n * be uploaded even when no `.map` file is found, because the source file itself\n * contains the map.\n */\nfunction bundleHasInlineSourceMap(bundleSource: string): boolean {\n return /^\\s*\\/\\/# sourceMappingURL=data:/m.test(bundleSource);\n}\n\n/**\n * Applies a set of heuristics to find the source map for a particular bundle.\n *\n * @returns the path to the bundle's source map or `undefined` if none could be found.\n */\nexport async function determineSourceMapPathFromBundle(\n bundlePath: string,\n bundleSource: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<string | undefined> {\n const sourceMappingUrlMatch = bundleSource.match(/^\\s*\\/\\/# sourceMappingURL=(.*)$/m);\n const sourceMappingUrl = sourceMappingUrlMatch ? (sourceMappingUrlMatch[1] as string) : undefined;\n\n const searchLocations: string[] = [];\n\n if (resolveSourceMapHook) {\n logger.debug(\n `Calling sourcemaps.resolveSourceMap(${JSON.stringify(bundlePath)}, ${JSON.stringify(sourceMappingUrl)})`,\n );\n const customPath = await resolveSourceMapHook(bundlePath, sourceMappingUrl);\n logger.debug(`resolveSourceMap hook returned: ${JSON.stringify(customPath)}`);\n\n if (customPath) {\n searchLocations.push(customPath);\n }\n }\n\n // 1. try to find source map at `sourceMappingURL` location\n if (sourceMappingUrl) {\n let parsedUrl: URL | undefined;\n try {\n parsedUrl = new URL(sourceMappingUrl);\n } catch {\n // noop\n }\n\n if (parsedUrl?.protocol === 'file:') {\n searchLocations.push(url.fileURLToPath(sourceMappingUrl));\n } else if (parsedUrl) {\n // noop, non-file urls don't translate to a local sourcemap file\n } else if (path.isAbsolute(sourceMappingUrl)) {\n searchLocations.push(path.normalize(sourceMappingUrl));\n } else {\n searchLocations.push(path.normalize(path.join(path.dirname(bundlePath), sourceMappingUrl)));\n }\n }\n\n // 2. try to find source map at path adjacent to chunk source, but with `.map` appended\n searchLocations.push(`${bundlePath}.map`);\n\n for (const searchLocation of searchLocations) {\n try {\n await util.promisify(fs.access)(searchLocation);\n logger.debug(`Source map found for bundle \\`${bundlePath}\\`: \\`${searchLocation}\\``);\n return searchLocation;\n } catch {\n // noop\n }\n }\n\n // This is just a debug message because it can be quite spammy for some frameworks\n logger.debug(\n `Could not determine source map path for bundle \\`${bundlePath}\\`` +\n ` with sourceMappingURL=${sourceMappingUrl === undefined ? 'undefined' : `\\`${sourceMappingUrl}\\``}` +\n ` - Did you turn on source map generation in your bundler?` +\n ` (Attempted paths: ${searchLocations.map(e => `\\`${e}\\``).join(', ')})`,\n );\n return undefined;\n}\n\n/**\n * Reads a source map, injects debug ID fields, and writes the source map to the target path.\n */\nasync function prepareSourceMapForDebugIdUpload(\n sourceMapPath: string,\n targetPath: string,\n debugId: string,\n rewriteSourcesHook: RewriteSourcesHook,\n logger: Logger,\n): Promise<void> {\n let sourceMapFileContent: string;\n try {\n sourceMapFileContent = await util.promisify(fs.readFile)(sourceMapPath, {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to read source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n\n let map: Record<string, unknown>;\n try {\n map = JSON.parse(sourceMapFileContent) as { sources: unknown; [key: string]: unknown };\n setDebugIdOnSourceMap(map, debugId);\n } catch {\n logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);\n return;\n }\n\n if (map['sources'] && Array.isArray(map['sources'])) {\n const mapDir = path.dirname(sourceMapPath);\n map['sources'] = map['sources'].map((source: string) => rewriteSourcesHook(source, map, { mapDir }));\n }\n\n try {\n await util.promisify(fs.writeFile)(targetPath, JSON.stringify(map), {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to prepare source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n}\n\nconst PROTOCOL_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\nexport function defaultRewriteSourcesHook(source: string): string {\n if (source.match(PROTOCOL_REGEX)) {\n return source.replace(PROTOCOL_REGEX, '');\n } else {\n return path.relative(process.cwd(), path.normalize(source));\n }\n}\n"],"names":["fs","path"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { stripQueryAndHashFromPath, CodeInjection, containsOnlyImports } from '.
3
3
  export { generateModuleMetadataInjectorCode, generateReleaseInjectorCode, replaceBooleanFlagsInCode, stringToUUID } from './utils.js';
4
4
  export { globFiles } from './glob.js';
5
5
  export { createSentryBuildPluginManager } from './build-plugin-manager.js';
6
- export { createDebugIdUploadFunction } from './debug-id-upload.js';
6
+ export { addDebugIdToEmittedArtifacts, createDebugIdUploadFunction, stampDebugId } from './debug-id-upload.js';
7
7
 
8
8
  let babelAnnotationRuntimePromise;
9
9
  function loadBabelAnnotationRuntime() {