{"version":3,"file":"index.js","names":["CodeInjection","MagicString","COMMENT_USE_STRICT_REGEX","path"],"sources":["../../src/index.ts"],"sourcesContent":["import {\n createSentryBuildPluginManager,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n isJsFile,\n shouldSkipCodeInjection,\n Options,\n getDebugIdSnippet,\n stringToUUID,\n COMMENT_USE_STRICT_REGEX,\n createDebugIdUploadFunction,\n globFiles,\n createComponentNameAnnotateHooks,\n replaceBooleanFlagsInCode,\n CodeInjection,\n} from \"@sentry/bundler-plugin-core\";\nimport MagicString, { SourceMap } from \"magic-string\";\nimport type { TransformResult } from \"rollup\";\nimport * as path from \"node:path\";\nimport { createRequire } from \"node:module\";\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 (\n chunkStartSnippet.includes(\"_sentryDebugIdIdentifier\") ||\n chunkEndSnippet.includes(\"//# debugId=\")\n ) {\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 (err) {\n // do nothing, we'll just not report a version\n }\n\n return undefined;\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(\n \"Running Sentry plugin from within a `node_modules` folder. Some features may not work.\"\n );\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(\n \"Release injection disabled via `release.inject` option. Will not inject release.\"\n );\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 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(code: string, id: string): Promise {\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\n if (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 {\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) =>\n path.join(path.resolve(), asset)\n );\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 return {\n name,\n buildStart,\n transform,\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 \"@sentry/bundler-plugin-core\";\nexport { sentryCliBinaryExists } from \"@sentry/bundler-plugin-core\";\n"],"mappings":"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"}