{"version":3,"file":"index.mjs","names":[],"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<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\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<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) =>\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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"}