@sentry/bundler-plugins 11.0.0-alpha.1 → 11.0.0-beta.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 (72) hide show
  1. package/build/cjs/core/build-plugin-manager.js +44 -72
  2. package/build/cjs/core/build-plugin-manager.js.map +1 -1
  3. package/build/cjs/core/cli.js +134 -0
  4. package/build/cjs/core/cli.js.map +1 -0
  5. package/build/cjs/core/index.js +1 -23
  6. package/build/cjs/core/index.js.map +1 -1
  7. package/build/cjs/core/options-mapping.js.map +1 -1
  8. package/build/cjs/core/sentry/telemetry.js +6 -25
  9. package/build/cjs/core/sentry/telemetry.js.map +1 -1
  10. package/build/cjs/core/utils.js +0 -6
  11. package/build/cjs/core/utils.js.map +1 -1
  12. package/build/cjs/core/version.js +1 -1
  13. package/build/cjs/core/version.js.map +1 -1
  14. package/build/cjs/esbuild/index.js +0 -1
  15. package/build/cjs/esbuild/index.js.map +1 -1
  16. package/build/cjs/rollup/index.js +0 -1
  17. package/build/cjs/rollup/index.js.map +1 -1
  18. package/build/cjs/vite/index.js +2 -4
  19. package/build/cjs/vite/index.js.map +1 -1
  20. package/build/cjs/webpack/index.js +0 -2
  21. package/build/cjs/webpack/index.js.map +1 -1
  22. package/build/cjs/webpack/webpack5.js +0 -2
  23. package/build/cjs/webpack/webpack5.js.map +1 -1
  24. package/build/esm/core/build-plugin-manager.js +46 -71
  25. package/build/esm/core/build-plugin-manager.js.map +1 -1
  26. package/build/esm/core/cli.js +132 -0
  27. package/build/esm/core/cli.js.map +1 -0
  28. package/build/esm/core/index.js +2 -6
  29. package/build/esm/core/index.js.map +1 -1
  30. package/build/esm/core/options-mapping.js.map +1 -1
  31. package/build/esm/core/sentry/telemetry.js +5 -20
  32. package/build/esm/core/sentry/telemetry.js.map +1 -1
  33. package/build/esm/core/utils.js +1 -6
  34. package/build/esm/core/utils.js.map +1 -1
  35. package/build/esm/core/version.js +1 -1
  36. package/build/esm/core/version.js.map +1 -1
  37. package/build/esm/esbuild/index.js +0 -1
  38. package/build/esm/esbuild/index.js.map +1 -1
  39. package/build/esm/package.json +1 -1
  40. package/build/esm/rollup/index.js +0 -1
  41. package/build/esm/rollup/index.js.map +1 -1
  42. package/build/esm/vite/index.js +0 -1
  43. package/build/esm/vite/index.js.map +1 -1
  44. package/build/esm/webpack/index.js +0 -1
  45. package/build/esm/webpack/index.js.map +1 -1
  46. package/build/esm/webpack/webpack5.js +0 -1
  47. package/build/esm/webpack/webpack5.js.map +1 -1
  48. package/build/types/core/build-plugin-manager.d.ts.map +1 -1
  49. package/build/types/core/cli.d.ts +50 -0
  50. package/build/types/core/cli.d.ts.map +1 -0
  51. package/build/types/core/index.d.ts +0 -6
  52. package/build/types/core/index.d.ts.map +1 -1
  53. package/build/types/core/options-mapping.d.ts +1 -0
  54. package/build/types/core/options-mapping.d.ts.map +1 -1
  55. package/build/types/core/sentry/telemetry.d.ts.map +1 -1
  56. package/build/types/core/types.d.ts +17 -12
  57. package/build/types/core/types.d.ts.map +1 -1
  58. package/build/types/core/utils.d.ts +0 -6
  59. package/build/types/core/utils.d.ts.map +1 -1
  60. package/build/types/core/version.d.ts +1 -1
  61. package/build/types/core/version.d.ts.map +1 -1
  62. package/build/types/esbuild/index.d.ts +0 -1
  63. package/build/types/esbuild/index.d.ts.map +1 -1
  64. package/build/types/rollup/index.d.ts +0 -1
  65. package/build/types/rollup/index.d.ts.map +1 -1
  66. package/build/types/vite/index.d.ts +0 -1
  67. package/build/types/vite/index.d.ts.map +1 -1
  68. package/build/types/webpack/index.d.ts +0 -1
  69. package/build/types/webpack/index.d.ts.map +1 -1
  70. package/build/types/webpack/webpack5.d.ts +0 -1
  71. package/build/types/webpack/webpack5.d.ts.map +1 -1
  72. package/package.json +5 -3
@@ -1,11 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
- const SentryCli = require('@sentry/cli');
4
3
  const core = require('@sentry/core');
5
4
  const dotenv = require('dotenv');
6
5
  const fs = require('fs');
7
6
  const os = require('os');
8
7
  const path = require('path');
8
+ const cli = require('./cli.js');
9
9
  const optionsMapping = require('./options-mapping.js');
10
10
  const logger = require('./logger.js');
11
11
  const telemetry = require('./sentry/telemetry.js');
@@ -14,8 +14,6 @@ const debugIdUpload = require('./debug-id-upload.js');
14
14
  const glob = require('./glob.js');
15
15
  const version = require('./version.js');
16
16
 
17
- const _interopDefault = e => e && e.__esModule ? e.default : e;
18
-
19
17
  function _interopNamespace(e) {
20
18
  if (e && e.__esModule) return e;
21
19
  const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
@@ -28,28 +26,12 @@ function _interopNamespace(e) {
28
26
  return n;
29
27
  }
30
28
 
31
- const SentryCli__default = /*#__PURE__*/_interopDefault(SentryCli);
32
29
  const dotenv__namespace = /*#__PURE__*/_interopNamespace(dotenv);
33
30
  const fs__namespace = /*#__PURE__*/_interopNamespace(fs);
34
31
  const os__namespace = /*#__PURE__*/_interopNamespace(os);
35
32
  const path__namespace = /*#__PURE__*/_interopNamespace(path);
36
33
 
37
34
  const _deployedReleases = /* @__PURE__ */ new Set();
38
- function createCliInstance(options) {
39
- return new SentryCli__default(null, {
40
- authToken: options.authToken,
41
- org: options.org,
42
- // Default to the first project if multiple projects are specified
43
- project: utils.getProjects(options.project)?.[0],
44
- silent: options.silent,
45
- url: options.url,
46
- vcsRemote: options.release.vcsRemote,
47
- headers: {
48
- ...options.telemetry ? core.getTraceData() : {},
49
- ...options.headers
50
- }
51
- });
52
- }
53
35
  function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
54
36
  const logger$1 = logger.createLogger({
55
37
  prefix: bundlerPluginMetaContext.loggerPrefix,
@@ -181,6 +163,9 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
181
163
  if (bundleSizeOptimizations.excludeTracing) {
182
164
  bundleSizeOptimizationReplacementValues["__SENTRY_TRACING__"] = false;
183
165
  }
166
+ if (bundleSizeOptimizations.excludeChannelInjection) {
167
+ bundleSizeOptimizationReplacementValues["__SENTRY_CHANNEL_INJECTION__"] = false;
168
+ }
184
169
  if (bundleSizeOptimizations.excludeReplayCanvas) {
185
170
  bundleSizeOptimizationReplacementValues["__RRWEB_EXCLUDE_CANVAS__"] = true;
186
171
  }
@@ -283,32 +268,31 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
283
268
  return;
284
269
  }
285
270
  const freeWriteBundleInvocationDependencyOnSourcemapFiles = createDependencyOnBuildArtifacts();
271
+ const releaseName = options.release.name;
286
272
  try {
287
- const cliInstance = createCliInstance(options);
273
+ const cliInstance = new cli.SentryCliAdapter(options);
288
274
  if (options.release.create) {
289
- const releaseOutput = await cliInstance.releases.new(options.release.name);
275
+ const releaseOutput = await cliInstance.createRelease(releaseName);
290
276
  logger$1.debug("Release created:", releaseOutput);
291
277
  }
292
278
  if (options.release.uploadLegacySourcemaps) {
293
- const normalizedInclude = utils.arrayify(options.release.uploadLegacySourcemaps).map((includeItem) => typeof includeItem === "string" ? { paths: [includeItem] } : includeItem).map((includeEntry) => ({
294
- ...includeEntry,
295
- validate: includeEntry.validate ?? false,
296
- ext: includeEntry.ext ? includeEntry.ext.map((extension) => `.${extension.replace(/^\./, "")}`) : [".js", ".map", ".jsbundle", ".bundle"],
297
- ignore: includeEntry.ignore ? utils.arrayify(includeEntry.ignore) : void 0
298
- }));
299
- await cliInstance.releases.uploadSourceMaps(options.release.name, {
300
- include: normalizedInclude,
301
- dist: options.release.dist,
302
- projects: utils.getProjects(options.project),
303
- // We want this promise to throw if the sourcemaps fail to upload so that we know about it.
304
- // see: https://github.com/getsentry/sentry-cli/pull/2605
305
- live: "rejectOnError"
306
- });
279
+ const uploadTargets = utils.arrayify(options.release.uploadLegacySourcemaps).map((includeItem) => typeof includeItem === "string" ? { paths: [includeItem] } : includeItem).flatMap(
280
+ (includeEntry) => includeEntry.paths.map((directory) => ({
281
+ directory,
282
+ dist: options.release.dist,
283
+ ext: includeEntry.ext ? includeEntry.ext.map((extension) => `.${extension.replace(/^\./, "")}`) : [".js", ".map", ".jsbundle", ".bundle"],
284
+ // The old CLI only skipped `node_modules` when neither ignore source was configured.
285
+ ignore: includeEntry.ignore ? utils.arrayify(includeEntry.ignore) : includeEntry.ignoreFile ? void 0 : ["node_modules"],
286
+ ignoreFile: includeEntry.ignoreFile,
287
+ urlPrefix: includeEntry.urlPrefix
288
+ }))
289
+ );
290
+ await cliInstance.uploadSourcemaps(releaseName, uploadTargets);
307
291
  }
308
292
  if (options.release.setCommits !== false) {
309
293
  try {
310
- await cliInstance.releases.setCommits(
311
- options.release.name,
294
+ await cliInstance.setCommits(
295
+ releaseName,
312
296
  // set commits always exists due to the normalize function
313
297
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
314
298
  options.release.setCommits
@@ -325,11 +309,11 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
325
309
  }
326
310
  }
327
311
  if (options.release.finalize) {
328
- await cliInstance.releases.finalize(options.release.name);
312
+ await cliInstance.finalizeRelease(releaseName);
329
313
  }
330
- if (options.release.deploy && !_deployedReleases.has(options.release.name)) {
331
- await cliInstance.releases.newDeploy(options.release.name, options.release.deploy);
332
- _deployedReleases.add(options.release.name);
314
+ if (options.release.deploy && !_deployedReleases.has(releaseName)) {
315
+ await cliInstance.newDeploy(releaseName, options.release.deploy);
316
+ _deployedReleases.add(releaseName);
333
317
  }
334
318
  } catch (e) {
335
319
  sentryScope.captureException('Error in "releaseManagementPlugin" writeBundle hook');
@@ -349,11 +333,8 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
349
333
  async injectDebugIds(buildArtifactPaths) {
350
334
  await core.startSpan({ name: "inject-debug-ids", scope: sentryScope, forceTransaction: true }, async () => {
351
335
  try {
352
- const cliInstance = createCliInstance(options);
353
- await cliInstance.execute(
354
- ["sourcemaps", "inject", ...utils.serializeIgnoreOptions(options.sourcemaps?.ignore), ...buildArtifactPaths],
355
- options.debug ? "rejectOnError" : false
356
- );
336
+ const cliInstance = new cli.SentryCliAdapter(options);
337
+ await cliInstance.injectDebugIds(buildArtifactPaths, options.sourcemaps?.ignore);
357
338
  } catch (e) {
358
339
  sentryScope.captureException('Error in "debugIdInjectionPlugin" writeBundle hook');
359
340
  handleRecoverableError(e, false);
@@ -383,6 +364,7 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
383
364
  }
384
365
  await core.startSpan(
385
366
  // This is `forceTransaction`ed because this span is used in dashboards in the form of indexed transactions.
367
+ // oxlint-disable-next-line typescript/no-deprecated
386
368
  { name: "debug-id-sourcemap-upload", scope: sentryScope, forceTransaction: true },
387
369
  async () => {
388
370
  const shouldPrepare = opts?.prepareArtifacts ?? true;
@@ -399,21 +381,16 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
399
381
  } else {
400
382
  pathsToUpload = buildArtifactPaths;
401
383
  }
402
- const ignorePaths = options.sourcemaps?.ignore ? Array.isArray(options.sourcemaps?.ignore) ? options.sourcemaps?.ignore : [options.sourcemaps?.ignore] : [];
403
384
  await core.startSpan({ name: "upload", scope: sentryScope }, async () => {
404
- const cliInstance = createCliInstance(options);
405
- await cliInstance.releases.uploadSourceMaps(options.release.name ?? "undefined", {
406
- include: [
407
- {
408
- paths: pathsToUpload,
409
- rewrite: true,
410
- dist: options.release.dist
411
- }
412
- ],
413
- ignore: ignorePaths,
414
- projects: utils.getProjects(options.project),
415
- live: "rejectOnError"
416
- });
385
+ const cliInstance = new cli.SentryCliAdapter(options);
386
+ await cliInstance.uploadSourcemaps(
387
+ options.release.name ?? "undefined",
388
+ pathsToUpload.map((directory) => ({
389
+ directory,
390
+ dist: options.release.dist,
391
+ ignore: options.sourcemaps?.ignore
392
+ }))
393
+ );
417
394
  });
418
395
  logger$1.info("Successfully uploaded source maps to Sentry");
419
396
  } else {
@@ -482,18 +459,13 @@ function createSentryBuildPluginManager(userOptions, bundlerPluginMetaContext) {
482
459
  return;
483
460
  }
484
461
  await core.startSpan({ name: "upload", scope: sentryScope }, async () => {
485
- const cliInstance = createCliInstance(options);
486
- await cliInstance.releases.uploadSourceMaps(options.release.name ?? "undefined", {
487
- include: [
488
- {
489
- paths: [tmpUploadFolder],
490
- rewrite: false,
491
- dist: options.release.dist
492
- }
493
- ],
494
- projects: utils.getProjects(options.project),
495
- live: "rejectOnError"
496
- });
462
+ const cliInstance = new cli.SentryCliAdapter(options);
463
+ await cliInstance.uploadSourcemaps(options.release.name ?? "undefined", [
464
+ {
465
+ directory: tmpUploadFolder,
466
+ dist: options.release.dist
467
+ }
468
+ ]);
497
469
  });
498
470
  logger$1.info("Successfully uploaded source maps to Sentry");
499
471
  });
@@ -1 +1 @@
1
- {"version":3,"file":"build-plugin-manager.js","sources":["../../../src/core/build-plugin-manager.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport SentryCli from '@sentry/cli';\nimport { closeSession, DEFAULT_ENVIRONMENT, getTraceData, makeSession, setMeasurement, startSpan } from '@sentry/core';\nimport * as dotenv from 'dotenv';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport type { NormalizedOptions } from './options-mapping';\nimport { normalizeUserOptions, validateOptions } from './options-mapping';\nimport type { Logger } from './logger';\nimport { createLogger } from './logger';\nimport { allowedToSendTelemetry, createSentryInstance, safeFlushTelemetry } from './sentry/telemetry';\nimport type { Options, SentrySDKBuildFlags } from './types';\nimport {\n arrayify,\n getProjects,\n getTurborepoEnvPassthroughWarning,\n serializeIgnoreOptions,\n stripQueryAndHashFromPath,\n} from './utils';\nimport { defaultRewriteSourcesHook, prepareBundleForDebugIdUpload } from './debug-id-upload';\nimport { globFiles } from './glob';\nimport { LIB_VERSION } from './version';\n\n// Module-level guard to prevent duplicate deploy records when multiple bundler plugin\n// instances run in the same process (e.g. Next.js creates separate webpack compilers\n// for client, server, and edge). Keyed by release name.\nconst _deployedReleases = new Set<string>();\n\n/** @internal Exported for testing only. */\nexport function _resetDeployedReleasesForTesting(): void {\n _deployedReleases.clear();\n}\n\nexport type SentryBuildPluginManager = {\n /**\n * A logger instance that takes the options passed to the build plugin manager into account. (for silencing and log level etc.)\n */\n logger: Logger;\n\n /**\n * Options after normalization. Includes things like the inferred release name.\n */\n normalizedOptions: NormalizedOptions;\n /**\n * Magic strings and their replacement values that can be used for bundle size optimizations. This already takes\n * into account the options passed to the build plugin manager.\n */\n bundleSizeOptimizationReplacementValues: SentrySDKBuildFlags;\n /**\n * Metadata that should be injected into bundles if possible. Takes into account options passed to the build plugin manager.\n */\n // See `generateModuleMetadataInjectorCode` for how this should be used exactly\n bundleMetadata: Record<string, unknown>;\n\n /**\n * Contains utility functions for emitting telemetry via the build plugin manager.\n */\n telemetry: {\n /**\n * Emits a `Sentry Bundler Plugin execution` signal.\n */\n emitBundlerPluginExecutionSignal(): Promise<void>;\n };\n\n /**\n * Will potentially create a release based on the build plugin manager options.\n *\n * Also\n * - finalizes the release\n * - sets commits\n * - uploads legacy sourcemaps\n * - adds deploy information\n */\n createRelease(): Promise<void>;\n\n /**\n * Injects debug IDs into the build artifacts.\n *\n * This is a separate function from `uploadSourcemaps` because that needs to run before the sourcemaps are uploaded.\n * Usually the respective bundler-plugin will take care of this before the sourcemaps are uploaded.\n * Only use this if you need to manually inject debug IDs into the build artifacts.\n */\n injectDebugIds(buildArtifactPaths: string[]): Promise<void>;\n\n /**\n * Uploads sourcemaps using the \"Debug ID\" method. This function takes a list of build artifact paths that will be uploaded\n */\n uploadSourcemaps(buildArtifactPaths: string[], opts?: { prepareArtifacts?: boolean }): Promise<void>;\n\n /**\n * Will delete artifacts based on the passed `sourcemaps.filesToDeleteAfterUpload` option.\n */\n deleteArtifacts(): Promise<void>;\n\n createDependencyOnBuildArtifacts: () => () => void;\n};\n\nfunction createCliInstance(options: NormalizedOptions): SentryCli {\n return new SentryCli(null, {\n authToken: options.authToken,\n org: options.org,\n // Default to the first project if multiple projects are specified\n project: getProjects(options.project)?.[0],\n silent: options.silent,\n url: options.url,\n vcsRemote: options.release.vcsRemote,\n headers: {\n ...(options.telemetry ? getTraceData() : {}),\n ...options.headers,\n },\n });\n}\n\n/**\n * Creates a build plugin manager that exposes primitives for everything that a Sentry JavaScript SDK or build tooling may do during a build.\n *\n * The build plugin manager's behavior strongly depends on the options that are passed in.\n */\nexport function createSentryBuildPluginManager(\n userOptions: Options,\n bundlerPluginMetaContext: {\n /**\n * E.g. `webpack` or `nextjs` or `turbopack`\n */\n buildTool: string;\n /**\n * E.g. `5` for webpack v5 or `4` for Rollup v4\n */\n buildToolMajorVersion?: string;\n /**\n * E.g. `[sentry-webpack-plugin]` or `[@sentry/nextjs]`\n */\n loggerPrefix: string;\n },\n): SentryBuildPluginManager {\n const logger = createLogger({\n prefix: bundlerPluginMetaContext.loggerPrefix,\n silent: userOptions.silent ?? false,\n debug: userOptions.debug ?? false,\n });\n\n try {\n const dotenvFile = fs.readFileSync(path.join(process.cwd(), '.env.sentry-build-plugin'), 'utf-8');\n // NOTE: Do not use the dotenv.config API directly to read the dotenv file! For some ungodly reason, it falls back to reading `${process.cwd()}/.env` which is absolutely not what we want.\n const dotenvResult = dotenv.parse(dotenvFile);\n\n // Vite has a bug/behaviour where spreading into process.env will cause it to crash\n // https://github.com/vitest-dev/vitest/issues/1870#issuecomment-1501140251\n Object.assign(process.env, dotenvResult);\n\n logger.info('Using environment variables configured in \".env.sentry-build-plugin\".');\n } catch (e: unknown) {\n // Ignore \"file not found\" errors but throw all others\n if (typeof e === 'object' && e && 'code' in e && e.code !== 'ENOENT') {\n throw e;\n }\n }\n\n const options = normalizeUserOptions(userOptions);\n\n if (options.disable) {\n // Early-return a noop build plugin manager instance so that we\n // don't continue validating options, setting up Sentry, etc.\n // Otherwise we might create side-effects or log messages that\n // users don't expect from a disabled plugin.\n return {\n normalizedOptions: options,\n logger,\n bundleSizeOptimizationReplacementValues: {},\n telemetry: {\n emitBundlerPluginExecutionSignal: async () => {\n /* noop */\n },\n },\n bundleMetadata: {},\n createRelease: async () => {\n /* noop */\n },\n uploadSourcemaps: async () => {\n /* noop */\n },\n deleteArtifacts: async () => {\n /* noop */\n },\n createDependencyOnBuildArtifacts: () => () => {\n /* noop */\n },\n injectDebugIds: async () => {\n /* noop */\n },\n };\n }\n\n const shouldSendTelemetry = allowedToSendTelemetry(options);\n const { sentryScope, sentryClient } = createSentryInstance(\n options,\n shouldSendTelemetry,\n bundlerPluginMetaContext.buildTool,\n bundlerPluginMetaContext.buildToolMajorVersion,\n );\n\n const { release, environment = DEFAULT_ENVIRONMENT } = sentryClient.getOptions();\n\n const sentrySession = makeSession({ release, environment });\n sentryScope.setSession(sentrySession);\n // Send the start of the session\n sentryClient.captureSession(sentrySession);\n\n let sessionHasEnded = false; // Just to prevent infinite loops with beforeExit, which is called whenever the event loop empties out\n\n function endSession(): void {\n if (sessionHasEnded) {\n return;\n }\n\n closeSession(sentrySession);\n sentryClient.captureSession(sentrySession);\n sessionHasEnded = true;\n }\n\n // We also need to manually end sessions on errors because beforeExit is not called on crashes\n process.on('beforeExit', () => {\n endSession();\n });\n\n // Set the User-Agent that Sentry CLI will use when interacting with Sentry\n process.env['SENTRY_PIPELINE'] = `${bundlerPluginMetaContext.buildTool}-plugin/${LIB_VERSION}`;\n\n // Propagate debug flag to Sentry CLI via environment variable\n // Only set if not already defined to respect user's explicit configuration\n if (options.debug && !process.env['SENTRY_LOG_LEVEL']) {\n process.env['SENTRY_LOG_LEVEL'] = 'debug';\n }\n\n // Not a bulletproof check but should be good enough to at least sometimes determine\n // if the plugin is called in dev/watch mode or for a prod build. The important part\n // here is to avoid a false positive. False negatives are okay.\n const isDevMode = process.env['NODE_ENV'] === 'development';\n\n /**\n * Handles errors caught and emitted in various areas of the plugin.\n *\n * Also sets the sentry session status according to the error handling.\n *\n * If users specify their custom `errorHandler` we'll leave the decision to throw\n * or continue up to them. By default, @param throwByDefault controls if the plugin\n * should throw an error (which causes a build fail in most bundlers) or continue.\n */\n function handleRecoverableError(unknownError: unknown, throwByDefault: boolean): void {\n sentrySession.status = 'abnormal';\n try {\n if (options.errorHandler) {\n try {\n if (unknownError instanceof Error) {\n options.errorHandler(unknownError);\n } else {\n options.errorHandler(new Error('An unknown error occurred'));\n }\n } catch (e) {\n sentrySession.status = 'crashed';\n throw e;\n }\n } else {\n // setting the session to \"crashed\" b/c from a plugin perspective this run failed.\n // However, we're intentionally not rethrowing the error to avoid breaking the user build.\n sentrySession.status = 'crashed';\n if (throwByDefault) {\n throw unknownError;\n }\n logger.error(\"An error occurred. Couldn't finish all operations:\", unknownError);\n }\n } finally {\n endSession();\n }\n }\n\n if (!validateOptions(options, logger)) {\n // Throwing by default to avoid a misconfigured plugin going unnoticed.\n handleRecoverableError(new Error('Options were not set correctly. See output above for more details.'), true);\n }\n\n // We have multiple plugins depending on generated source map files. (debug ID upload, legacy upload)\n // Additionally, we also want to have the functionality to delete files after uploading sourcemaps.\n // All of these plugins and the delete functionality need to run in the same hook (`writeBundle`).\n // Since the plugins among themselves are not aware of when they run and finish, we need a system to\n // track their dependencies on the generated files, so that we can initiate the file deletion only after\n // nothing depends on the files anymore.\n const dependenciesOnBuildArtifacts = new Set<symbol>();\n const buildArtifactsDependencySubscribers: (() => void)[] = [];\n\n function notifyBuildArtifactDependencySubscribers(): void {\n buildArtifactsDependencySubscribers.forEach(subscriber => {\n subscriber();\n });\n }\n\n function createDependencyOnBuildArtifacts(): () => void {\n const dependencyIdentifier = Symbol();\n dependenciesOnBuildArtifacts.add(dependencyIdentifier);\n\n return function freeDependencyOnBuildArtifacts() {\n dependenciesOnBuildArtifacts.delete(dependencyIdentifier);\n notifyBuildArtifactDependencySubscribers();\n };\n }\n\n /**\n * Returns a Promise that resolves when all the currently active dependencies are freed again.\n *\n * It is very important that this function is called as late as possible before wanting to await the Promise to give\n * the dependency producers as much time as possible to register themselves.\n */\n function waitUntilBuildArtifactDependenciesAreFreed(): Promise<void> {\n return new Promise<void>(resolve => {\n buildArtifactsDependencySubscribers.push(() => {\n if (dependenciesOnBuildArtifacts.size === 0) {\n resolve();\n }\n });\n\n if (dependenciesOnBuildArtifacts.size === 0) {\n resolve();\n }\n });\n }\n\n const bundleSizeOptimizationReplacementValues: SentrySDKBuildFlags = {};\n if (options.bundleSizeOptimizations) {\n const { bundleSizeOptimizations } = options;\n\n if (bundleSizeOptimizations.excludeDebugStatements) {\n bundleSizeOptimizationReplacementValues['__SENTRY_DEBUG__'] = false;\n }\n if (bundleSizeOptimizations.excludeTracing) {\n bundleSizeOptimizationReplacementValues['__SENTRY_TRACING__'] = false;\n }\n if (bundleSizeOptimizations.excludeReplayCanvas) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_CANVAS__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayIframe) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_IFRAME__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayShadowDom) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_SHADOW_DOM__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayWorker) {\n bundleSizeOptimizationReplacementValues['__SENTRY_EXCLUDE_REPLAY_WORKER__'] = true;\n }\n }\n\n let bundleMetadata: Record<string, unknown> = {};\n if (options.moduleMetadata || options.applicationKey) {\n if (options.applicationKey) {\n // We use different keys so that if user-code receives multiple bundling passes, we will store the application keys of all the passes.\n // It is a bit unfortunate that we have to inject the metadata snippet at the top, because after multiple\n // injections, the first injection will always \"win\" because it comes last in the code. We would generally be\n // fine with making the last bundling pass win. But because it cannot win, we have to use a workaround of storing\n // the app keys in different object keys.\n // We can simply use the `_sentryBundlerPluginAppKey:` to filter for app keys in the SDK.\n bundleMetadata[`_sentryBundlerPluginAppKey:${options.applicationKey}`] = true;\n }\n\n if (typeof options.moduleMetadata === 'function') {\n const args = {\n org: options.org,\n project: getProjects(options.project)?.[0],\n projects: getProjects(options.project),\n release: options.release.name,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n bundleMetadata = { ...bundleMetadata, ...options.moduleMetadata(args) };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n bundleMetadata = { ...bundleMetadata, ...options.moduleMetadata };\n }\n }\n\n return {\n /**\n * A logger instance that takes the options passed to the build plugin manager into account. (for silencing and log level etc.)\n */\n logger,\n\n /**\n * Options after normalization. Includes things like the inferred release name.\n */\n normalizedOptions: options,\n\n /**\n * Magic strings and their replacement values that can be used for bundle size optimizations. This already takes\n * into account the options passed to the build plugin manager.\n */\n bundleSizeOptimizationReplacementValues,\n\n /**\n * Metadata that should be injected into bundles if possible. Takes into account options passed to the build plugin manager.\n */\n // See `generateModuleMetadataInjectorCode` for how this should be used exactly\n bundleMetadata,\n\n /**\n * Contains utility functions for emitting telemetry via the build plugin manager.\n */\n telemetry: {\n /**\n * Emits a `Sentry Bundler Plugin execution` signal.\n */\n async emitBundlerPluginExecutionSignal() {\n if (await shouldSendTelemetry) {\n logger.info(\n 'Sending telemetry data on issues and performance to Sentry. To disable telemetry, set `options.telemetry` to `false`.',\n );\n startSpan({ name: 'Sentry Bundler Plugin execution', scope: sentryScope }, () => {\n //\n });\n await safeFlushTelemetry(sentryClient);\n }\n },\n },\n\n /**\n * Will potentially create a release based on the build plugin manager options.\n *\n * Also\n * - finalizes the release\n * - sets commits\n * - uploads legacy sourcemaps\n * - adds deploy information\n */\n async createRelease() {\n if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not create release. Please set the `release.name` option to identify your release.',\n );\n return;\n } else if (isDevMode) {\n logger.debug('Running in development mode. Will not create release.');\n return;\n } else if (!options.authToken) {\n logger.warn(\n `No auth token provided. Will not create release. Please set the \\`authToken\\` option. You can find information on how to generate a Sentry auth token here: https://docs.sentry.io/api/auth/${getTurborepoEnvPassthroughWarning('SENTRY_AUTH_TOKEN')}`,\n );\n return;\n } else if (!options.org && !options.authToken.startsWith('sntrys_')) {\n logger.warn(\n `No organization slug provided. Will not create release. Please set the \\`org\\` option to your Sentry organization slug.${getTurborepoEnvPassthroughWarning('SENTRY_ORG')}`,\n );\n return;\n } else if (!options.project || (Array.isArray(options.project) && options.project.length === 0)) {\n logger.warn(\n `No project provided. Will not create release. Please set the \\`project\\` option to your Sentry project slug.${getTurborepoEnvPassthroughWarning('SENTRY_PROJECT')}`,\n );\n return;\n }\n\n // It is possible that this writeBundle hook is called multiple times in one build (for example when reusing the plugin, or when using build tooling like `@vitejs/plugin-legacy`)\n // Therefore we need to actually register the execution of this hook as dependency on the sourcemap files.\n const freeWriteBundleInvocationDependencyOnSourcemapFiles = createDependencyOnBuildArtifacts();\n\n try {\n const cliInstance = createCliInstance(options);\n\n if (options.release.create) {\n const releaseOutput = await cliInstance.releases.new(options.release.name);\n logger.debug('Release created:', releaseOutput);\n }\n\n if (options.release.uploadLegacySourcemaps) {\n const normalizedInclude = arrayify(options.release.uploadLegacySourcemaps)\n .map(includeItem => (typeof includeItem === 'string' ? { paths: [includeItem] } : includeItem))\n .map(includeEntry => ({\n ...includeEntry,\n validate: includeEntry.validate ?? false,\n ext: includeEntry.ext\n ? includeEntry.ext.map(extension => `.${extension.replace(/^\\./, '')}`)\n : ['.js', '.map', '.jsbundle', '.bundle'],\n ignore: includeEntry.ignore ? arrayify(includeEntry.ignore) : undefined,\n }));\n\n await cliInstance.releases.uploadSourceMaps(options.release.name, {\n include: normalizedInclude,\n dist: options.release.dist,\n projects: getProjects(options.project),\n // We want this promise to throw if the sourcemaps fail to upload so that we know about it.\n // see: https://github.com/getsentry/sentry-cli/pull/2605\n live: 'rejectOnError',\n });\n }\n\n if (options.release.setCommits !== false) {\n try {\n await cliInstance.releases.setCommits(\n options.release.name,\n // set commits always exists due to the normalize function\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n options.release.setCommits!,\n );\n } catch (e) {\n // shouldNotThrowOnFailure being present means that the plugin defaulted to `{ auto: true }` for the setCommitsOptions, meaning that wee should not throw when CLI throws because there is no repo\n if (\n options.release.setCommits &&\n 'shouldNotThrowOnFailure' in options.release.setCommits &&\n options.release.setCommits.shouldNotThrowOnFailure\n ) {\n logger.debug(\n 'An error occurred setting commits on release (this message can be ignored unless you commits on release are desired):',\n e,\n );\n } else {\n throw e;\n }\n }\n }\n\n if (options.release.finalize) {\n await cliInstance.releases.finalize(options.release.name);\n }\n\n if (options.release.deploy && !_deployedReleases.has(options.release.name)) {\n await cliInstance.releases.newDeploy(options.release.name, options.release.deploy);\n _deployedReleases.add(options.release.name);\n }\n } catch (e) {\n sentryScope.captureException('Error in \"releaseManagementPlugin\" writeBundle hook');\n await safeFlushTelemetry(sentryClient);\n handleRecoverableError(e, false);\n } finally {\n freeWriteBundleInvocationDependencyOnSourcemapFiles();\n }\n },\n\n /*\n Injects debug IDs into the build artifacts.\n\n This is a separate function from `uploadSourcemaps` because that needs to run before the sourcemaps are uploaded.\n Usually the respective bundler-plugin will take care of this before the sourcemaps are uploaded.\n Only use this if you need to manually inject debug IDs into the build artifacts.\n */\n async injectDebugIds(buildArtifactPaths: string[]) {\n await startSpan({ name: 'inject-debug-ids', scope: sentryScope, forceTransaction: true }, async () => {\n try {\n const cliInstance = createCliInstance(options);\n await cliInstance.execute(\n ['sourcemaps', 'inject', ...serializeIgnoreOptions(options.sourcemaps?.ignore), ...buildArtifactPaths],\n options.debug ? 'rejectOnError' : false,\n );\n } catch (e) {\n sentryScope.captureException('Error in \"debugIdInjectionPlugin\" writeBundle hook');\n handleRecoverableError(e, false);\n } finally {\n await safeFlushTelemetry(sentryClient);\n }\n });\n },\n\n /**\n * Uploads sourcemaps using the \"Debug ID\" method.\n *\n * By default, this prepares bundles in a temporary folder before uploading. You can opt into an\n * in-place, direct upload path by setting `prepareArtifacts` to `false`. If `prepareArtifacts` is set to\n * `false`, no preparation (e.g. adding `//# debugId=...` and writing adjusted source maps) is performed and no temp folder is used.\n *\n * @param buildArtifactPaths - The paths of the build artifacts to upload\n * @param opts - Optional flags to control temp folder usage and preparation\n */\n async uploadSourcemaps(buildArtifactPaths: string[], opts?: { prepareArtifacts?: boolean }) {\n if (!canUploadSourceMaps(options, logger, isDevMode)) {\n return;\n }\n\n // Early exit if assets is explicitly set to an empty array\n const assets = options.sourcemaps?.assets;\n if (Array.isArray(assets) && assets.length === 0) {\n logger.debug('Empty `sourcemaps.assets` option provided. Will not upload sourcemaps with debug ID.');\n return;\n }\n\n await startSpan(\n // This is `forceTransaction`ed because this span is used in dashboards in the form of indexed transactions.\n { name: 'debug-id-sourcemap-upload', scope: sentryScope, forceTransaction: true },\n async () => {\n // If we're not using a temp folder, we must not prepare artifacts in-place (to avoid mutating user files)\n const shouldPrepare = opts?.prepareArtifacts ?? true;\n\n let folderToCleanUp: string | undefined;\n\n // It is possible that this writeBundle hook (which calls this function) is called multiple times in one build (for example when reusing the plugin, or when using build tooling like `@vitejs/plugin-legacy`)\n // Therefore we need to actually register the execution of this hook as dependency on the sourcemap files.\n const freeUploadDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n\n try {\n if (!shouldPrepare) {\n // Direct CLI upload from existing artifact paths (no globbing, no preparation)\n let pathsToUpload: string[];\n\n if (assets) {\n pathsToUpload = Array.isArray(assets) ? assets : [assets];\n logger.debug(\n `Direct upload mode: passing user-provided assets directly to CLI: ${pathsToUpload.join(', ')}`,\n );\n } else {\n // Use original paths e.g. like ['.next/server'] directly –> preferred way when no globbing is done\n pathsToUpload = buildArtifactPaths;\n }\n\n const ignorePaths = options.sourcemaps?.ignore\n ? Array.isArray(options.sourcemaps?.ignore)\n ? options.sourcemaps?.ignore\n : [options.sourcemaps?.ignore]\n : [];\n await startSpan({ name: 'upload', scope: sentryScope }, async () => {\n const cliInstance = createCliInstance(options);\n await cliInstance.releases.uploadSourceMaps(options.release.name ?? 'undefined', {\n include: [\n {\n paths: pathsToUpload,\n rewrite: true,\n dist: options.release.dist,\n },\n ],\n ignore: ignorePaths,\n projects: getProjects(options.project),\n live: 'rejectOnError',\n });\n });\n\n logger.info('Successfully uploaded source maps to Sentry');\n } else {\n // Prepare artifacts in temp folder before uploading\n let globAssets: string | string[];\n if (assets) {\n globAssets = assets;\n } else {\n logger.debug(\n 'No `sourcemaps.assets` option provided, falling back to uploading detected build artifacts.',\n );\n globAssets = buildArtifactPaths;\n }\n\n const globResult = await startSpan({ name: 'glob', scope: sentryScope }, async () =>\n globFiles(globAssets, { ignore: options.sourcemaps?.ignore }),\n );\n\n const debugIdChunkFilePaths = globResult.filter(debugIdChunkFilePath => {\n return !!stripQueryAndHashFromPath(debugIdChunkFilePath).match(/\\.(js|mjs|cjs)$/);\n });\n\n // The order of the files output by glob() is not deterministic\n // Ensure order within the files so that {debug-id}-{chunkIndex} coupling is consistent\n debugIdChunkFilePaths.sort();\n\n if (debugIdChunkFilePaths.length === 0) {\n logger.warn(\n \"Didn't find any matching sources for debug ID upload. Please check the `sourcemaps.assets` option.\",\n );\n } else {\n const tmpUploadFolder = await startSpan({ name: 'mkdtemp', scope: sentryScope }, async () => {\n return (\n process.env?.['SENTRY_TEST_OVERRIDE_TEMP_DIR'] ||\n (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'sentry-bundler-plugin-upload-')))\n );\n });\n folderToCleanUp = tmpUploadFolder;\n\n // Prepare into temp folder, then upload\n await startSpan({ name: 'prepare-bundles', scope: sentryScope }, async prepBundlesSpan => {\n // Preparing the bundles can be a lot of work and doing it all at once has the potential of nuking the heap so\n // instead we do it with a maximum of 16 concurrent workers\n const preparationTasks = debugIdChunkFilePaths.map((chunkFilePath, chunkIndex) => async () => {\n await prepareBundleForDebugIdUpload(\n chunkFilePath,\n tmpUploadFolder,\n chunkIndex,\n logger,\n options.sourcemaps?.rewriteSources ?? defaultRewriteSourcesHook,\n options.sourcemaps?.resolveSourceMap,\n );\n });\n const workers: Promise<void>[] = [];\n const worker = async (): Promise<void> => {\n while (preparationTasks.length > 0) {\n const task = preparationTasks.shift();\n if (task) {\n await task();\n }\n }\n };\n for (let workerIndex = 0; workerIndex < 16; workerIndex++) {\n workers.push(worker());\n }\n\n await Promise.all(workers);\n\n const files = await fs.promises.readdir(tmpUploadFolder);\n const stats = files.map(file => fs.promises.stat(path.join(tmpUploadFolder, file)));\n const uploadSize = (await Promise.all(stats)).reduce(\n (accumulator, { size }) => accumulator + size,\n 0,\n );\n\n setMeasurement('files', files.length, 'none', prepBundlesSpan);\n setMeasurement('upload_size', uploadSize, 'byte', prepBundlesSpan);\n\n // Preparation produced no artifacts, meaning none of the\n // matched bundles had an associated source map. This almost\n // always means source map generation is turned off in the\n // bundler, so warn instead of silently reporting success.\n if (files.length === 0) {\n logger.warn(\n `No source maps found for any of the ${debugIdChunkFilePaths.length} matched build ` +\n 'artifacts, so no source maps were uploaded to Sentry. This usually means source map ' +\n 'generation is not enabled in your bundler. Enable it so Sentry can un-minify your stack traces.',\n );\n return;\n }\n\n await startSpan({ name: 'upload', scope: sentryScope }, async () => {\n const cliInstance = createCliInstance(options);\n await cliInstance.releases.uploadSourceMaps(options.release.name ?? 'undefined', {\n include: [\n {\n paths: [tmpUploadFolder],\n rewrite: false,\n dist: options.release.dist,\n },\n ],\n projects: getProjects(options.project),\n live: 'rejectOnError',\n });\n });\n\n // this must be in the method so that the \"no sourcemaps\"\n // early return doesn't also log success.\n logger.info('Successfully uploaded source maps to Sentry');\n });\n }\n }\n } catch (e) {\n sentryScope.captureException('Error in \"debugIdUploadPlugin\" writeBundle hook');\n handleRecoverableError(e, false);\n } finally {\n if (folderToCleanUp && !process.env?.['SENTRY_TEST_OVERRIDE_TEMP_DIR']) {\n logger.debug('Cleaning up temporary files...');\n try {\n await startSpan({ name: 'cleanup', scope: sentryScope }, async () => {\n if (folderToCleanUp) {\n await fs.promises.rm(folderToCleanUp, { recursive: true, force: true });\n logger.debug(`Temporary folder deleted: ${folderToCleanUp}`);\n }\n });\n } catch (e) {\n // A failed cleanup must not skip the teardown steps below (freeing upload\n // dependencies, flushing telemetry), so swallow and log instead of rethrowing.\n logger.debug('Failed to clean up temporary folder:', e);\n }\n }\n logger.debug('Freeing upload dependencies...');\n freeUploadDependencyOnBuildArtifacts();\n logger.debug('Flushing telemetry data...');\n await safeFlushTelemetry(sentryClient);\n logger.debug('Telemetry flushed. Plugin upload process complete.');\n }\n },\n );\n },\n\n /**\n * Will delete artifacts based on the passed `sourcemaps.filesToDeleteAfterUpload` option.\n */\n async deleteArtifacts() {\n try {\n const filesToDelete = await options.sourcemaps?.filesToDeleteAfterUpload;\n if (filesToDelete !== undefined) {\n const filePathsToDelete = await globFiles(filesToDelete);\n\n logger.debug('Waiting for dependencies on generated files to be freed before deleting...');\n\n await waitUntilBuildArtifactDependenciesAreFreed();\n\n filePathsToDelete.forEach(filePathToDelete => {\n logger.debug(`Deleting asset after upload: ${filePathToDelete}`);\n });\n\n await Promise.all(\n filePathsToDelete.map(filePathToDelete =>\n fs.promises.rm(filePathToDelete, { force: true }).catch(e => {\n // This is allowed to fail - we just don't do anything\n logger.debug(`An error occurred while attempting to delete asset: ${filePathToDelete}`, e);\n }),\n ),\n );\n }\n } catch (e) {\n sentryScope.captureException('Error in \"sentry-file-deletion-plugin\" buildEnd hook');\n await safeFlushTelemetry(sentryClient);\n // We throw by default if we get here b/c not being able to delete\n // source maps could leak them to production\n handleRecoverableError(e, true);\n }\n },\n createDependencyOnBuildArtifacts,\n };\n}\n\nfunction canUploadSourceMaps(options: NormalizedOptions, logger: Logger, isDevMode: boolean): boolean {\n if (options.sourcemaps?.disable) {\n logger.debug('Source map upload was disabled. Will not upload sourcemaps using debug ID process.');\n return false;\n }\n if (isDevMode) {\n logger.debug('Running in development mode. Will not upload sourcemaps.');\n return false;\n }\n if (!options.authToken) {\n logger.warn(\n `No auth token provided. Will not upload source maps. Please set the \\`authToken\\` option. You can find information on how to generate a Sentry auth token here: https://docs.sentry.io/api/auth/${getTurborepoEnvPassthroughWarning('SENTRY_AUTH_TOKEN')}`,\n );\n return false;\n }\n if (!options.org && !options.authToken.startsWith('sntrys_')) {\n logger.warn(\n `No org provided. Will not upload source maps. Please set the \\`org\\` option to your Sentry organization slug.${getTurborepoEnvPassthroughWarning('SENTRY_ORG')}`,\n );\n return false;\n }\n if (!getProjects(options.project)?.[0]) {\n logger.warn(\n `No project provided. Will not upload source maps. Please set the \\`project\\` option to your Sentry project slug.${getTurborepoEnvPassthroughWarning('SENTRY_PROJECT')}`,\n );\n return false;\n }\n\n return true;\n}\n"],"names":["SentryCli","getProjects","getTraceData","logger","createLogger","fs","path","dotenv","normalizeUserOptions","allowedToSendTelemetry","createSentryInstance","DEFAULT_ENVIRONMENT","makeSession","closeSession","LIB_VERSION","validateOptions","startSpan","safeFlushTelemetry","getTurborepoEnvPassthroughWarning","arrayify","serializeIgnoreOptions","globFiles","stripQueryAndHashFromPath","os","prepareBundleForDebugIdUpload","defaultRewriteSourcesHook","setMeasurement"],"mappings":"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"}
1
+ {"version":3,"file":"build-plugin-manager.js","sources":["../../../src/core/build-plugin-manager.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { closeSession, DEFAULT_ENVIRONMENT, makeSession, setMeasurement, startSpan } from '@sentry/core';\nimport * as dotenv from 'dotenv';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { SentryCliAdapter } from './cli';\nimport type { NormalizedOptions } from './options-mapping';\nimport { normalizeUserOptions, validateOptions } from './options-mapping';\nimport type { Logger } from './logger';\nimport { createLogger } from './logger';\nimport { allowedToSendTelemetry, createSentryInstance, safeFlushTelemetry } from './sentry/telemetry';\nimport type { Options, SentrySDKBuildFlags } from './types';\nimport { arrayify, getProjects, getTurborepoEnvPassthroughWarning, stripQueryAndHashFromPath } from './utils';\nimport { defaultRewriteSourcesHook, prepareBundleForDebugIdUpload } from './debug-id-upload';\nimport { globFiles } from './glob';\nimport { LIB_VERSION } from './version';\n\n// Module-level guard to prevent duplicate deploy records when multiple bundler plugin\n// instances run in the same process (e.g. Next.js creates separate webpack compilers\n// for client, server, and edge). Keyed by release name.\nconst _deployedReleases = new Set<string>();\n\n/** @internal Exported for testing only. */\nexport function _resetDeployedReleasesForTesting(): void {\n _deployedReleases.clear();\n}\n\nexport type SentryBuildPluginManager = {\n /**\n * A logger instance that takes the options passed to the build plugin manager into account. (for silencing and log level etc.)\n */\n logger: Logger;\n\n /**\n * Options after normalization. Includes things like the inferred release name.\n */\n normalizedOptions: NormalizedOptions;\n /**\n * Magic strings and their replacement values that can be used for bundle size optimizations. This already takes\n * into account the options passed to the build plugin manager.\n */\n bundleSizeOptimizationReplacementValues: SentrySDKBuildFlags;\n /**\n * Metadata that should be injected into bundles if possible. Takes into account options passed to the build plugin manager.\n */\n // See `generateModuleMetadataInjectorCode` for how this should be used exactly\n bundleMetadata: Record<string, unknown>;\n\n /**\n * Contains utility functions for emitting telemetry via the build plugin manager.\n */\n telemetry: {\n /**\n * Emits a `Sentry Bundler Plugin execution` signal.\n */\n emitBundlerPluginExecutionSignal(): Promise<void>;\n };\n\n /**\n * Will potentially create a release based on the build plugin manager options.\n *\n * Also\n * - finalizes the release\n * - sets commits\n * - uploads legacy sourcemaps\n * - adds deploy information\n */\n createRelease(): Promise<void>;\n\n /**\n * Injects debug IDs into the build artifacts.\n *\n * This is a separate function from `uploadSourcemaps` because that needs to run before the sourcemaps are uploaded.\n * Usually the respective bundler-plugin will take care of this before the sourcemaps are uploaded.\n * Only use this if you need to manually inject debug IDs into the build artifacts.\n */\n injectDebugIds(buildArtifactPaths: string[]): Promise<void>;\n\n /**\n * Uploads sourcemaps using the \"Debug ID\" method. This function takes a list of build artifact paths that will be uploaded\n */\n uploadSourcemaps(buildArtifactPaths: string[], opts?: { prepareArtifacts?: boolean }): Promise<void>;\n\n /**\n * Will delete artifacts based on the passed `sourcemaps.filesToDeleteAfterUpload` option.\n */\n deleteArtifacts(): Promise<void>;\n\n createDependencyOnBuildArtifacts: () => () => void;\n};\n\n/**\n * Creates a build plugin manager that exposes primitives for everything that a Sentry JavaScript SDK or build tooling may do during a build.\n *\n * The build plugin manager's behavior strongly depends on the options that are passed in.\n */\nexport function createSentryBuildPluginManager(\n userOptions: Options,\n bundlerPluginMetaContext: {\n /**\n * E.g. `webpack` or `nextjs` or `turbopack`\n */\n buildTool: string;\n /**\n * E.g. `5` for webpack v5 or `4` for Rollup v4\n */\n buildToolMajorVersion?: string;\n /**\n * E.g. `[sentry-webpack-plugin]` or `[@sentry/nextjs]`\n */\n loggerPrefix: string;\n },\n): SentryBuildPluginManager {\n const logger = createLogger({\n prefix: bundlerPluginMetaContext.loggerPrefix,\n silent: userOptions.silent ?? false,\n debug: userOptions.debug ?? false,\n });\n\n try {\n const dotenvFile = fs.readFileSync(path.join(process.cwd(), '.env.sentry-build-plugin'), 'utf-8');\n // NOTE: Do not use the dotenv.config API directly to read the dotenv file! For some ungodly reason, it falls back to reading `${process.cwd()}/.env` which is absolutely not what we want.\n const dotenvResult = dotenv.parse(dotenvFile);\n\n // Vite has a bug/behaviour where spreading into process.env will cause it to crash\n // https://github.com/vitest-dev/vitest/issues/1870#issuecomment-1501140251\n Object.assign(process.env, dotenvResult);\n\n logger.info('Using environment variables configured in \".env.sentry-build-plugin\".');\n } catch (e: unknown) {\n // Ignore \"file not found\" errors but throw all others\n if (typeof e === 'object' && e && 'code' in e && e.code !== 'ENOENT') {\n throw e;\n }\n }\n\n const options = normalizeUserOptions(userOptions);\n\n if (options.disable) {\n // Early-return a noop build plugin manager instance so that we\n // don't continue validating options, setting up Sentry, etc.\n // Otherwise we might create side-effects or log messages that\n // users don't expect from a disabled plugin.\n return {\n normalizedOptions: options,\n logger,\n bundleSizeOptimizationReplacementValues: {},\n telemetry: {\n emitBundlerPluginExecutionSignal: async () => {\n /* noop */\n },\n },\n bundleMetadata: {},\n createRelease: async () => {\n /* noop */\n },\n uploadSourcemaps: async () => {\n /* noop */\n },\n deleteArtifacts: async () => {\n /* noop */\n },\n createDependencyOnBuildArtifacts: () => () => {\n /* noop */\n },\n injectDebugIds: async () => {\n /* noop */\n },\n };\n }\n\n const shouldSendTelemetry = allowedToSendTelemetry(options);\n const { sentryScope, sentryClient } = createSentryInstance(\n options,\n shouldSendTelemetry,\n bundlerPluginMetaContext.buildTool,\n bundlerPluginMetaContext.buildToolMajorVersion,\n );\n\n const { release, environment = DEFAULT_ENVIRONMENT } = sentryClient.getOptions();\n\n const sentrySession = makeSession({ release, environment });\n sentryScope.setSession(sentrySession);\n // Send the start of the session\n sentryClient.captureSession(sentrySession);\n\n let sessionHasEnded = false; // Just to prevent infinite loops with beforeExit, which is called whenever the event loop empties out\n\n function endSession(): void {\n if (sessionHasEnded) {\n return;\n }\n\n closeSession(sentrySession);\n sentryClient.captureSession(sentrySession);\n sessionHasEnded = true;\n }\n\n // We also need to manually end sessions on errors because beforeExit is not called on crashes\n process.on('beforeExit', () => {\n endSession();\n });\n\n // Set the User-Agent that Sentry CLI will use when interacting with Sentry\n process.env['SENTRY_PIPELINE'] = `${bundlerPluginMetaContext.buildTool}-plugin/${LIB_VERSION}`;\n\n // Propagate debug flag to Sentry CLI via environment variable\n // Only set if not already defined to respect user's explicit configuration\n if (options.debug && !process.env['SENTRY_LOG_LEVEL']) {\n process.env['SENTRY_LOG_LEVEL'] = 'debug';\n }\n\n // Not a bulletproof check but should be good enough to at least sometimes determine\n // if the plugin is called in dev/watch mode or for a prod build. The important part\n // here is to avoid a false positive. False negatives are okay.\n const isDevMode = process.env['NODE_ENV'] === 'development';\n\n /**\n * Handles errors caught and emitted in various areas of the plugin.\n *\n * Also sets the sentry session status according to the error handling.\n *\n * If users specify their custom `errorHandler` we'll leave the decision to throw\n * or continue up to them. By default, @param throwByDefault controls if the plugin\n * should throw an error (which causes a build fail in most bundlers) or continue.\n */\n function handleRecoverableError(unknownError: unknown, throwByDefault: boolean): void {\n sentrySession.status = 'abnormal';\n try {\n if (options.errorHandler) {\n try {\n if (unknownError instanceof Error) {\n options.errorHandler(unknownError);\n } else {\n options.errorHandler(new Error('An unknown error occurred'));\n }\n } catch (e) {\n sentrySession.status = 'crashed';\n throw e;\n }\n } else {\n // setting the session to \"crashed\" b/c from a plugin perspective this run failed.\n // However, we're intentionally not rethrowing the error to avoid breaking the user build.\n sentrySession.status = 'crashed';\n if (throwByDefault) {\n throw unknownError;\n }\n logger.error(\"An error occurred. Couldn't finish all operations:\", unknownError);\n }\n } finally {\n endSession();\n }\n }\n\n if (!validateOptions(options, logger)) {\n // Throwing by default to avoid a misconfigured plugin going unnoticed.\n handleRecoverableError(new Error('Options were not set correctly. See output above for more details.'), true);\n }\n\n // We have multiple plugins depending on generated source map files. (debug ID upload, legacy upload)\n // Additionally, we also want to have the functionality to delete files after uploading sourcemaps.\n // All of these plugins and the delete functionality need to run in the same hook (`writeBundle`).\n // Since the plugins among themselves are not aware of when they run and finish, we need a system to\n // track their dependencies on the generated files, so that we can initiate the file deletion only after\n // nothing depends on the files anymore.\n const dependenciesOnBuildArtifacts = new Set<symbol>();\n const buildArtifactsDependencySubscribers: (() => void)[] = [];\n\n function notifyBuildArtifactDependencySubscribers(): void {\n buildArtifactsDependencySubscribers.forEach(subscriber => {\n subscriber();\n });\n }\n\n function createDependencyOnBuildArtifacts(): () => void {\n const dependencyIdentifier = Symbol();\n dependenciesOnBuildArtifacts.add(dependencyIdentifier);\n\n return function freeDependencyOnBuildArtifacts() {\n dependenciesOnBuildArtifacts.delete(dependencyIdentifier);\n notifyBuildArtifactDependencySubscribers();\n };\n }\n\n /**\n * Returns a Promise that resolves when all the currently active dependencies are freed again.\n *\n * It is very important that this function is called as late as possible before wanting to await the Promise to give\n * the dependency producers as much time as possible to register themselves.\n */\n function waitUntilBuildArtifactDependenciesAreFreed(): Promise<void> {\n return new Promise<void>(resolve => {\n buildArtifactsDependencySubscribers.push(() => {\n if (dependenciesOnBuildArtifacts.size === 0) {\n resolve();\n }\n });\n\n if (dependenciesOnBuildArtifacts.size === 0) {\n resolve();\n }\n });\n }\n\n const bundleSizeOptimizationReplacementValues: SentrySDKBuildFlags = {};\n if (options.bundleSizeOptimizations) {\n const { bundleSizeOptimizations } = options;\n\n if (bundleSizeOptimizations.excludeDebugStatements) {\n bundleSizeOptimizationReplacementValues['__SENTRY_DEBUG__'] = false;\n }\n if (bundleSizeOptimizations.excludeTracing) {\n bundleSizeOptimizationReplacementValues['__SENTRY_TRACING__'] = false;\n }\n if (bundleSizeOptimizations.excludeChannelInjection) {\n bundleSizeOptimizationReplacementValues['__SENTRY_CHANNEL_INJECTION__'] = false;\n }\n if (bundleSizeOptimizations.excludeReplayCanvas) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_CANVAS__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayIframe) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_IFRAME__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayShadowDom) {\n bundleSizeOptimizationReplacementValues['__RRWEB_EXCLUDE_SHADOW_DOM__'] = true;\n }\n if (bundleSizeOptimizations.excludeReplayWorker) {\n bundleSizeOptimizationReplacementValues['__SENTRY_EXCLUDE_REPLAY_WORKER__'] = true;\n }\n }\n\n let bundleMetadata: Record<string, unknown> = {};\n if (options.moduleMetadata || options.applicationKey) {\n if (options.applicationKey) {\n // We use different keys so that if user-code receives multiple bundling passes, we will store the application keys of all the passes.\n // It is a bit unfortunate that we have to inject the metadata snippet at the top, because after multiple\n // injections, the first injection will always \"win\" because it comes last in the code. We would generally be\n // fine with making the last bundling pass win. But because it cannot win, we have to use a workaround of storing\n // the app keys in different object keys.\n // We can simply use the `_sentryBundlerPluginAppKey:` to filter for app keys in the SDK.\n bundleMetadata[`_sentryBundlerPluginAppKey:${options.applicationKey}`] = true;\n }\n\n if (typeof options.moduleMetadata === 'function') {\n const args = {\n org: options.org,\n project: getProjects(options.project)?.[0],\n projects: getProjects(options.project),\n release: options.release.name,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n bundleMetadata = { ...bundleMetadata, ...options.moduleMetadata(args) };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n bundleMetadata = { ...bundleMetadata, ...options.moduleMetadata };\n }\n }\n\n return {\n /**\n * A logger instance that takes the options passed to the build plugin manager into account. (for silencing and log level etc.)\n */\n logger,\n\n /**\n * Options after normalization. Includes things like the inferred release name.\n */\n normalizedOptions: options,\n\n /**\n * Magic strings and their replacement values that can be used for bundle size optimizations. This already takes\n * into account the options passed to the build plugin manager.\n */\n bundleSizeOptimizationReplacementValues,\n\n /**\n * Metadata that should be injected into bundles if possible. Takes into account options passed to the build plugin manager.\n */\n // See `generateModuleMetadataInjectorCode` for how this should be used exactly\n bundleMetadata,\n\n /**\n * Contains utility functions for emitting telemetry via the build plugin manager.\n */\n telemetry: {\n /**\n * Emits a `Sentry Bundler Plugin execution` signal.\n */\n async emitBundlerPluginExecutionSignal() {\n if (await shouldSendTelemetry) {\n logger.info(\n 'Sending telemetry data on issues and performance to Sentry. To disable telemetry, set `options.telemetry` to `false`.',\n );\n startSpan({ name: 'Sentry Bundler Plugin execution', scope: sentryScope }, () => {\n //\n });\n await safeFlushTelemetry(sentryClient);\n }\n },\n },\n\n /**\n * Will potentially create a release based on the build plugin manager options.\n *\n * Also\n * - finalizes the release\n * - sets commits\n * - uploads legacy sourcemaps\n * - adds deploy information\n */\n async createRelease() {\n if (!options.release.name) {\n logger.debug(\n 'No release name provided. Will not create release. Please set the `release.name` option to identify your release.',\n );\n return;\n } else if (isDevMode) {\n logger.debug('Running in development mode. Will not create release.');\n return;\n } else if (!options.authToken) {\n logger.warn(\n `No auth token provided. Will not create release. Please set the \\`authToken\\` option. You can find information on how to generate a Sentry auth token here: https://docs.sentry.io/api/auth/${getTurborepoEnvPassthroughWarning('SENTRY_AUTH_TOKEN')}`,\n );\n return;\n } else if (!options.org && !options.authToken.startsWith('sntrys_')) {\n logger.warn(\n `No organization slug provided. Will not create release. Please set the \\`org\\` option to your Sentry organization slug.${getTurborepoEnvPassthroughWarning('SENTRY_ORG')}`,\n );\n return;\n } else if (!options.project || (Array.isArray(options.project) && options.project.length === 0)) {\n logger.warn(\n `No project provided. Will not create release. Please set the \\`project\\` option to your Sentry project slug.${getTurborepoEnvPassthroughWarning('SENTRY_PROJECT')}`,\n );\n return;\n }\n\n // It is possible that this writeBundle hook is called multiple times in one build (for example when reusing the plugin, or when using build tooling like `@vitejs/plugin-legacy`)\n // Therefore we need to actually register the execution of this hook as dependency on the sourcemap files.\n const freeWriteBundleInvocationDependencyOnSourcemapFiles = createDependencyOnBuildArtifacts();\n\n // Guaranteed to be set by the guard clause above.\n const releaseName = options.release.name;\n\n try {\n const cliInstance = new SentryCliAdapter(options);\n\n if (options.release.create) {\n const releaseOutput = await cliInstance.createRelease(releaseName);\n logger.debug('Release created:', releaseOutput);\n }\n\n if (options.release.uploadLegacySourcemaps) {\n const uploadTargets = arrayify(options.release.uploadLegacySourcemaps)\n .map(includeItem => (typeof includeItem === 'string' ? { paths: [includeItem] } : includeItem))\n .flatMap(includeEntry =>\n includeEntry.paths.map(directory => ({\n directory,\n dist: options.release.dist,\n ext: includeEntry.ext\n ? includeEntry.ext.map(extension => `.${extension.replace(/^\\./, '')}`)\n : ['.js', '.map', '.jsbundle', '.bundle'],\n // The old CLI only skipped `node_modules` when neither ignore source was configured.\n ignore: includeEntry.ignore\n ? arrayify(includeEntry.ignore)\n : includeEntry.ignoreFile\n ? undefined\n : ['node_modules'],\n ignoreFile: includeEntry.ignoreFile,\n urlPrefix: includeEntry.urlPrefix,\n })),\n );\n\n await cliInstance.uploadSourcemaps(releaseName, uploadTargets);\n }\n\n if (options.release.setCommits !== false) {\n try {\n await cliInstance.setCommits(\n releaseName,\n // set commits always exists due to the normalize function\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n options.release.setCommits!,\n );\n } catch (e) {\n // shouldNotThrowOnFailure being present means that the plugin defaulted to `{ auto: true }` for the setCommitsOptions, meaning that wee should not throw when CLI throws because there is no repo\n if (\n options.release.setCommits &&\n 'shouldNotThrowOnFailure' in options.release.setCommits &&\n options.release.setCommits.shouldNotThrowOnFailure\n ) {\n logger.debug(\n 'An error occurred setting commits on release (this message can be ignored unless you commits on release are desired):',\n e,\n );\n } else {\n throw e;\n }\n }\n }\n\n if (options.release.finalize) {\n await cliInstance.finalizeRelease(releaseName);\n }\n\n if (options.release.deploy && !_deployedReleases.has(releaseName)) {\n await cliInstance.newDeploy(releaseName, options.release.deploy);\n _deployedReleases.add(releaseName);\n }\n } catch (e) {\n sentryScope.captureException('Error in \"releaseManagementPlugin\" writeBundle hook');\n await safeFlushTelemetry(sentryClient);\n handleRecoverableError(e, false);\n } finally {\n freeWriteBundleInvocationDependencyOnSourcemapFiles();\n }\n },\n\n /*\n Injects debug IDs into the build artifacts.\n\n This is a separate function from `uploadSourcemaps` because that needs to run before the sourcemaps are uploaded.\n Usually the respective bundler-plugin will take care of this before the sourcemaps are uploaded.\n Only use this if you need to manually inject debug IDs into the build artifacts.\n */\n async injectDebugIds(buildArtifactPaths: string[]) {\n // oxlint-disable-next-line typescript/no-deprecated\n await startSpan({ name: 'inject-debug-ids', scope: sentryScope, forceTransaction: true }, async () => {\n try {\n const cliInstance = new SentryCliAdapter(options);\n await cliInstance.injectDebugIds(buildArtifactPaths, options.sourcemaps?.ignore);\n } catch (e) {\n sentryScope.captureException('Error in \"debugIdInjectionPlugin\" writeBundle hook');\n handleRecoverableError(e, false);\n } finally {\n await safeFlushTelemetry(sentryClient);\n }\n });\n },\n\n /**\n * Uploads sourcemaps using the \"Debug ID\" method.\n *\n * By default, this prepares bundles in a temporary folder before uploading. You can opt into an\n * in-place, direct upload path by setting `prepareArtifacts` to `false`. If `prepareArtifacts` is set to\n * `false`, no preparation (e.g. adding `//# debugId=...` and writing adjusted source maps) is performed and no temp folder is used.\n *\n * @param buildArtifactPaths - The paths of the build artifacts to upload\n * @param opts - Optional flags to control temp folder usage and preparation\n */\n async uploadSourcemaps(buildArtifactPaths: string[], opts?: { prepareArtifacts?: boolean }) {\n if (!canUploadSourceMaps(options, logger, isDevMode)) {\n return;\n }\n\n // Early exit if assets is explicitly set to an empty array\n const assets = options.sourcemaps?.assets;\n if (Array.isArray(assets) && assets.length === 0) {\n logger.debug('Empty `sourcemaps.assets` option provided. Will not upload sourcemaps with debug ID.');\n return;\n }\n\n await startSpan(\n // This is `forceTransaction`ed because this span is used in dashboards in the form of indexed transactions.\n // oxlint-disable-next-line typescript/no-deprecated\n { name: 'debug-id-sourcemap-upload', scope: sentryScope, forceTransaction: true },\n async () => {\n // If we're not using a temp folder, we must not prepare artifacts in-place (to avoid mutating user files)\n const shouldPrepare = opts?.prepareArtifacts ?? true;\n\n let folderToCleanUp: string | undefined;\n\n // It is possible that this writeBundle hook (which calls this function) is called multiple times in one build (for example when reusing the plugin, or when using build tooling like `@vitejs/plugin-legacy`)\n // Therefore we need to actually register the execution of this hook as dependency on the sourcemap files.\n const freeUploadDependencyOnBuildArtifacts = createDependencyOnBuildArtifacts();\n\n try {\n if (!shouldPrepare) {\n // Direct CLI upload from existing artifact paths (no globbing, no preparation)\n let pathsToUpload: string[];\n\n if (assets) {\n pathsToUpload = Array.isArray(assets) ? assets : [assets];\n logger.debug(\n `Direct upload mode: passing user-provided assets directly to CLI: ${pathsToUpload.join(', ')}`,\n );\n } else {\n // Use original paths e.g. like ['.next/server'] directly –> preferred way when no globbing is done\n pathsToUpload = buildArtifactPaths;\n }\n\n await startSpan({ name: 'upload', scope: sentryScope }, async () => {\n const cliInstance = new SentryCliAdapter(options);\n await cliInstance.uploadSourcemaps(\n options.release.name ?? 'undefined',\n pathsToUpload.map(directory => ({\n directory,\n dist: options.release.dist,\n ignore: options.sourcemaps?.ignore,\n })),\n );\n });\n\n logger.info('Successfully uploaded source maps to Sentry');\n } else {\n // Prepare artifacts in temp folder before uploading\n let globAssets: string | string[];\n if (assets) {\n globAssets = assets;\n } else {\n logger.debug(\n 'No `sourcemaps.assets` option provided, falling back to uploading detected build artifacts.',\n );\n globAssets = buildArtifactPaths;\n }\n\n const globResult = await startSpan({ name: 'glob', scope: sentryScope }, async () =>\n globFiles(globAssets, { ignore: options.sourcemaps?.ignore }),\n );\n\n const debugIdChunkFilePaths = globResult.filter(debugIdChunkFilePath => {\n return !!stripQueryAndHashFromPath(debugIdChunkFilePath).match(/\\.(js|mjs|cjs)$/);\n });\n\n // The order of the files output by glob() is not deterministic\n // Ensure order within the files so that {debug-id}-{chunkIndex} coupling is consistent\n debugIdChunkFilePaths.sort();\n\n if (debugIdChunkFilePaths.length === 0) {\n logger.warn(\n \"Didn't find any matching sources for debug ID upload. Please check the `sourcemaps.assets` option.\",\n );\n } else {\n const tmpUploadFolder = await startSpan({ name: 'mkdtemp', scope: sentryScope }, async () => {\n return (\n process.env?.['SENTRY_TEST_OVERRIDE_TEMP_DIR'] ||\n (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'sentry-bundler-plugin-upload-')))\n );\n });\n folderToCleanUp = tmpUploadFolder;\n\n // Prepare into temp folder, then upload\n await startSpan({ name: 'prepare-bundles', scope: sentryScope }, async prepBundlesSpan => {\n // Preparing the bundles can be a lot of work and doing it all at once has the potential of nuking the heap so\n // instead we do it with a maximum of 16 concurrent workers\n const preparationTasks = debugIdChunkFilePaths.map((chunkFilePath, chunkIndex) => async () => {\n await prepareBundleForDebugIdUpload(\n chunkFilePath,\n tmpUploadFolder,\n chunkIndex,\n logger,\n options.sourcemaps?.rewriteSources ?? defaultRewriteSourcesHook,\n options.sourcemaps?.resolveSourceMap,\n );\n });\n const workers: Promise<void>[] = [];\n const worker = async (): Promise<void> => {\n while (preparationTasks.length > 0) {\n const task = preparationTasks.shift();\n if (task) {\n await task();\n }\n }\n };\n for (let workerIndex = 0; workerIndex < 16; workerIndex++) {\n workers.push(worker());\n }\n\n await Promise.all(workers);\n\n const files = await fs.promises.readdir(tmpUploadFolder);\n const stats = files.map(file => fs.promises.stat(path.join(tmpUploadFolder, file)));\n const uploadSize = (await Promise.all(stats)).reduce(\n (accumulator, { size }) => accumulator + size,\n 0,\n );\n\n setMeasurement('files', files.length, 'none', prepBundlesSpan);\n setMeasurement('upload_size', uploadSize, 'byte', prepBundlesSpan);\n\n // Preparation produced no artifacts, meaning none of the\n // matched bundles had an associated source map. This almost\n // always means source map generation is turned off in the\n // bundler, so warn instead of silently reporting success.\n if (files.length === 0) {\n logger.warn(\n `No source maps found for any of the ${debugIdChunkFilePaths.length} matched build ` +\n 'artifacts, so no source maps were uploaded to Sentry. This usually means source map ' +\n 'generation is not enabled in your bundler. Enable it so Sentry can un-minify your stack traces.',\n );\n return;\n }\n\n await startSpan({ name: 'upload', scope: sentryScope }, async () => {\n const cliInstance = new SentryCliAdapter(options);\n await cliInstance.uploadSourcemaps(options.release.name ?? 'undefined', [\n {\n directory: tmpUploadFolder,\n dist: options.release.dist,\n },\n ]);\n });\n\n // this must be in the method so that the \"no sourcemaps\"\n // early return doesn't also log success.\n logger.info('Successfully uploaded source maps to Sentry');\n });\n }\n }\n } catch (e) {\n sentryScope.captureException('Error in \"debugIdUploadPlugin\" writeBundle hook');\n handleRecoverableError(e, false);\n } finally {\n if (folderToCleanUp && !process.env?.['SENTRY_TEST_OVERRIDE_TEMP_DIR']) {\n logger.debug('Cleaning up temporary files...');\n try {\n await startSpan({ name: 'cleanup', scope: sentryScope }, async () => {\n if (folderToCleanUp) {\n await fs.promises.rm(folderToCleanUp, { recursive: true, force: true });\n logger.debug(`Temporary folder deleted: ${folderToCleanUp}`);\n }\n });\n } catch (e) {\n // A failed cleanup must not skip the teardown steps below (freeing upload\n // dependencies, flushing telemetry), so swallow and log instead of rethrowing.\n logger.debug('Failed to clean up temporary folder:', e);\n }\n }\n logger.debug('Freeing upload dependencies...');\n freeUploadDependencyOnBuildArtifacts();\n logger.debug('Flushing telemetry data...');\n await safeFlushTelemetry(sentryClient);\n logger.debug('Telemetry flushed. Plugin upload process complete.');\n }\n },\n );\n },\n\n /**\n * Will delete artifacts based on the passed `sourcemaps.filesToDeleteAfterUpload` option.\n */\n async deleteArtifacts() {\n try {\n const filesToDelete = await options.sourcemaps?.filesToDeleteAfterUpload;\n if (filesToDelete !== undefined) {\n const filePathsToDelete = await globFiles(filesToDelete);\n\n logger.debug('Waiting for dependencies on generated files to be freed before deleting...');\n\n await waitUntilBuildArtifactDependenciesAreFreed();\n\n filePathsToDelete.forEach(filePathToDelete => {\n logger.debug(`Deleting asset after upload: ${filePathToDelete}`);\n });\n\n await Promise.all(\n filePathsToDelete.map(filePathToDelete =>\n fs.promises.rm(filePathToDelete, { force: true }).catch(e => {\n // This is allowed to fail - we just don't do anything\n logger.debug(`An error occurred while attempting to delete asset: ${filePathToDelete}`, e);\n }),\n ),\n );\n }\n } catch (e) {\n sentryScope.captureException('Error in \"sentry-file-deletion-plugin\" buildEnd hook');\n await safeFlushTelemetry(sentryClient);\n // We throw by default if we get here b/c not being able to delete\n // source maps could leak them to production\n handleRecoverableError(e, true);\n }\n },\n createDependencyOnBuildArtifacts,\n };\n}\n\nfunction canUploadSourceMaps(options: NormalizedOptions, logger: Logger, isDevMode: boolean): boolean {\n if (options.sourcemaps?.disable) {\n logger.debug('Source map upload was disabled. Will not upload sourcemaps using debug ID process.');\n return false;\n }\n if (isDevMode) {\n logger.debug('Running in development mode. Will not upload sourcemaps.');\n return false;\n }\n if (!options.authToken) {\n logger.warn(\n `No auth token provided. Will not upload source maps. Please set the \\`authToken\\` option. You can find information on how to generate a Sentry auth token here: https://docs.sentry.io/api/auth/${getTurborepoEnvPassthroughWarning('SENTRY_AUTH_TOKEN')}`,\n );\n return false;\n }\n if (!options.org && !options.authToken.startsWith('sntrys_')) {\n logger.warn(\n `No org provided. Will not upload source maps. Please set the \\`org\\` option to your Sentry organization slug.${getTurborepoEnvPassthroughWarning('SENTRY_ORG')}`,\n );\n return false;\n }\n if (!getProjects(options.project)?.[0]) {\n logger.warn(\n `No project provided. Will not upload source maps. Please set the \\`project\\` option to your Sentry project slug.${getTurborepoEnvPassthroughWarning('SENTRY_PROJECT')}`,\n );\n return false;\n }\n\n return true;\n}\n"],"names":["logger","createLogger","fs","path","dotenv","normalizeUserOptions","allowedToSendTelemetry","createSentryInstance","DEFAULT_ENVIRONMENT","makeSession","closeSession","LIB_VERSION","validateOptions","getProjects","startSpan","safeFlushTelemetry","getTurborepoEnvPassthroughWarning","SentryCliAdapter","arrayify","globFiles","stripQueryAndHashFromPath","os","prepareBundleForDebugIdUpload","defaultRewriteSourcesHook","setMeasurement"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const sentry = require('sentry');
4
+ const utils = require('./utils.js');
5
+
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
14
+ var _options, _sdk, _SentryCliAdapter_instances, createClient_fn;
15
+ function serializeIgnore(ignore) {
16
+ if (!ignore) {
17
+ return void 0;
18
+ }
19
+ const patterns = utils.arrayify(ignore);
20
+ return patterns.length > 0 ? patterns.join(",") : void 0;
21
+ }
22
+ class SentryCliAdapter {
23
+ constructor(options) {
24
+ __privateAdd(this, _SentryCliAdapter_instances);
25
+ __privateAdd(this, _options);
26
+ /** Client for every command that is not scoped to a specific project. */
27
+ __privateAdd(this, _sdk);
28
+ __privateSet(this, _options, options);
29
+ __privateSet(this, _sdk, __privateMethod(this, _SentryCliAdapter_instances, createClient_fn).call(this));
30
+ }
31
+ /** Create a release and associate it with the configured project(s). */
32
+ async createRelease(name) {
33
+ return __privateGet(this, _sdk).release.create({ orgVersion: name, project: utils.getProjects(__privateGet(this, _options).project)?.join(",") });
34
+ }
35
+ /** Finalize a release by stamping an end timestamp. */
36
+ async finalizeRelease(name) {
37
+ await __privateGet(this, _sdk).release.finalize({ orgVersion: name });
38
+ }
39
+ /**
40
+ * Associate commits with a release. Translates the plugin's {@link SetCommitsOptions} `auto` /
41
+ * `repo`+`commit` union into the flags accepted by `sentry release set-commits`. The old CLI's
42
+ * `ignoreMissing`/`ignoreEmpty` toggles have no equivalent flag on the new CLI; the caller's
43
+ * `shouldNotThrowOnFailure` handling still swallows the "no repository" failure case.
44
+ */
45
+ async setCommits(name, setCommitsOptions) {
46
+ const { auto, repo, commit, previousCommit } = setCommitsOptions;
47
+ const commitSpec = repo && commit ? `${repo}@${previousCommit ? `${previousCommit}..${commit}` : commit}` : void 0;
48
+ await __privateGet(this, _sdk).release["set-commits"]({
49
+ orgVersion: name,
50
+ auto: auto === true,
51
+ commit: commitSpec
52
+ });
53
+ }
54
+ /** Create a deploy for a release. */
55
+ async newDeploy(name, deploy) {
56
+ if (deploy === false) {
57
+ return;
58
+ }
59
+ await __privateGet(this, _sdk).release.deploy({
60
+ orgVersion: name,
61
+ environment: deploy.env,
62
+ name: deploy.name,
63
+ url: deploy.url,
64
+ started: deploy.started !== void 0 ? String(deploy.started) : void 0,
65
+ finished: deploy.finished !== void 0 ? String(deploy.finished) : void 0,
66
+ time: deploy.time !== void 0 ? String(deploy.time) : void 0
67
+ });
68
+ }
69
+ /**
70
+ * Upload sourcemaps for one or more directories. The old CLI accepted a structured `include`
71
+ * array; the new `sourcemap upload` command takes a single directory, so we upload each target
72
+ * separately. A client is created per project because project selection is bound at client
73
+ * creation time.
74
+ */
75
+ async uploadSourcemaps(name, targets) {
76
+ const projects = utils.getProjects(__privateGet(this, _options).project) ?? [void 0];
77
+ for (const project of projects) {
78
+ const sdk = __privateMethod(this, _SentryCliAdapter_instances, createClient_fn).call(this, project);
79
+ for (const target of targets) {
80
+ await sdk.sourcemap.upload({
81
+ directory: target.directory,
82
+ release: name,
83
+ dist: target.dist ?? __privateGet(this, _options).release.dist,
84
+ ext: target.ext?.join(","),
85
+ ignore: serializeIgnore(target.ignore),
86
+ ignoreFile: target.ignoreFile,
87
+ urlPrefix: target.urlPrefix
88
+ });
89
+ }
90
+ }
91
+ }
92
+ /** Inject debug IDs into the given build artifacts. */
93
+ async injectDebugIds(directories, ignore) {
94
+ const serializedIgnore = serializeIgnore(ignore) ?? "node_modules";
95
+ for (const directory of directories) {
96
+ await __privateGet(this, _sdk).sourcemap.inject({ directory, ignore: serializedIgnore });
97
+ }
98
+ }
99
+ /**
100
+ * Resolve the Sentry server URL the CLI is configured to talk to. Used by the telemetry guard
101
+ * to decide whether the current build targets Sentry SaaS. Returns `undefined` on error.
102
+ */
103
+ async getServerUrl() {
104
+ try {
105
+ const info = await __privateGet(this, _sdk).run("info");
106
+ return info.config?.url;
107
+ } catch {
108
+ return void 0;
109
+ }
110
+ }
111
+ }
112
+ _options = new WeakMap();
113
+ _sdk = new WeakMap();
114
+ _SentryCliAdapter_instances = new WeakSet();
115
+ /**
116
+ * The CLI binds `org`/`project`/`url` when the client is created rather than per call, so a
117
+ * client scoped to a different project needs to be a different client.
118
+ *
119
+ * Creating one is free: it reads no config and opens no connection, it only closes over these
120
+ * options. Everything happens when a command is actually invoked.
121
+ */
122
+ createClient_fn = function(project) {
123
+ const options = {
124
+ token: __privateGet(this, _options).authToken,
125
+ org: __privateGet(this, _options).org,
126
+ project,
127
+ url: __privateGet(this, _options).url,
128
+ headers: __privateGet(this, _options).headers
129
+ };
130
+ return sentry.createSentrySDK(options);
131
+ };
132
+
133
+ exports.SentryCliAdapter = SentryCliAdapter;
134
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sources":["../../../src/core/cli.ts"],"sourcesContent":["import { createSentrySDK } from 'sentry';\nimport type { NormalizedOptions } from './options-mapping';\nimport type { SetCommitsOptions } from './types';\nimport { arrayify, getProjects } from './utils';\n\ntype SentrySDK = ReturnType<typeof createSentrySDK>;\ntype SentryOptions = NonNullable<Parameters<typeof createSentrySDK>[0]>;\n\n/**\n * The CLI accepts `headers` since 0.44.0, but its bundled type declarations do not list the\n * option yet.\n * TODO: Drop once `SentryOptions` in the `sentry` package declares `headers`: https://github.com/getsentry/cli/pull/1500\n */\ntype SentryOptionsWithHeaders = SentryOptions & { headers?: Record<string, string> };\n\n/** Comma-joined list of ignore globs, or `undefined` when nothing should be ignored. */\nfunction serializeIgnore(ignore: string | string[] | undefined): string | undefined {\n if (!ignore) {\n return undefined;\n }\n const patterns = arrayify(ignore);\n return patterns.length > 0 ? patterns.join(',') : undefined;\n}\n\n/** A single sourcemap directory to upload plus the flags that apply to it. */\ninterface UploadTarget {\n directory: string;\n dist?: string;\n ext?: string[];\n ignore?: string | string[];\n ignoreFile?: string;\n urlPrefix?: string;\n}\n\n/**\n * Thin wrapper around the Sentry CLI's programmatic SDK. The bundler plugin used to drive the\n * old `@sentry/cli` binary through a `SentryCli` class; the new CLI exposes typed methods via\n * `createSentrySDK()` instead. This adapter maps the plugin's structured option shapes onto\n * those methods and keeps all translation logic in one place.\n */\nexport class SentryCliAdapter {\n readonly #options: NormalizedOptions;\n /** Client for every command that is not scoped to a specific project. */\n readonly #sdk: SentrySDK;\n\n public constructor(options: NormalizedOptions) {\n this.#options = options;\n this.#sdk = this.#createClient();\n }\n\n /**\n * The CLI binds `org`/`project`/`url` when the client is created rather than per call, so a\n * client scoped to a different project needs to be a different client.\n *\n * Creating one is free: it reads no config and opens no connection, it only closes over these\n * options. Everything happens when a command is actually invoked.\n */\n #createClient(project?: string): SentrySDK {\n const options: SentryOptionsWithHeaders = {\n token: this.#options.authToken,\n org: this.#options.org,\n project,\n url: this.#options.url,\n headers: this.#options.headers,\n };\n\n return createSentrySDK(options);\n }\n\n /** Create a release and associate it with the configured project(s). */\n public async createRelease(name: string): Promise<unknown> {\n // Sentry rejects a release without projects, and the unscoped client carries none.\n return this.#sdk.release.create({ orgVersion: name, project: getProjects(this.#options.project)?.join(',') });\n }\n\n /** Finalize a release by stamping an end timestamp. */\n public async finalizeRelease(name: string): Promise<void> {\n await this.#sdk.release.finalize({ orgVersion: name });\n }\n\n /**\n * Associate commits with a release. Translates the plugin's {@link SetCommitsOptions} `auto` /\n * `repo`+`commit` union into the flags accepted by `sentry release set-commits`. The old CLI's\n * `ignoreMissing`/`ignoreEmpty` toggles have no equivalent flag on the new CLI; the caller's\n * `shouldNotThrowOnFailure` handling still swallows the \"no repository\" failure case.\n */\n public async setCommits(name: string, setCommitsOptions: SetCommitsOptions): Promise<void> {\n const { auto, repo, commit, previousCommit } = setCommitsOptions;\n\n // Manual mode is expressed as `REPO@SHA` (optionally `REPO@PREV..SHA`).\n const commitSpec =\n repo && commit ? `${repo}@${previousCommit ? `${previousCommit}..${commit}` : commit}` : undefined;\n\n await this.#sdk.release['set-commits']({\n orgVersion: name,\n auto: auto === true,\n commit: commitSpec,\n });\n }\n\n /** Create a deploy for a release. */\n public async newDeploy(name: string, deploy: NonNullable<NormalizedOptions['release']['deploy']>): Promise<void> {\n if (deploy === false) {\n return;\n }\n\n await this.#sdk.release.deploy({\n orgVersion: name,\n environment: deploy.env,\n name: deploy.name,\n url: deploy.url,\n started: deploy.started !== undefined ? String(deploy.started) : undefined,\n finished: deploy.finished !== undefined ? String(deploy.finished) : undefined,\n time: deploy.time !== undefined ? String(deploy.time) : undefined,\n });\n }\n\n /**\n * Upload sourcemaps for one or more directories. The old CLI accepted a structured `include`\n * array; the new `sourcemap upload` command takes a single directory, so we upload each target\n * separately. A client is created per project because project selection is bound at client\n * creation time.\n */\n public async uploadSourcemaps(name: string, targets: UploadTarget[]): Promise<void> {\n const projects = getProjects(this.#options.project) ?? [undefined];\n\n for (const project of projects) {\n const sdk = this.#createClient(project);\n for (const target of targets) {\n await sdk.sourcemap.upload({\n directory: target.directory,\n release: name,\n dist: target.dist ?? this.#options.release.dist,\n ext: target.ext?.join(','),\n ignore: serializeIgnore(target.ignore),\n ignoreFile: target.ignoreFile,\n urlPrefix: target.urlPrefix,\n });\n }\n }\n }\n\n /** Inject debug IDs into the given build artifacts. */\n public async injectDebugIds(directories: string[], ignore: string | string[] | undefined): Promise<void> {\n // Preserve the previous CLI's default of ignoring `node_modules` when nothing else is configured.\n const serializedIgnore = serializeIgnore(ignore) ?? 'node_modules';\n for (const directory of directories) {\n await this.#sdk.sourcemap.inject({ directory, ignore: serializedIgnore });\n }\n }\n\n /**\n * Resolve the Sentry server URL the CLI is configured to talk to. Used by the telemetry guard\n * to decide whether the current build targets Sentry SaaS. Returns `undefined` on error.\n */\n public async getServerUrl(): Promise<string | undefined> {\n try {\n const info = (await this.#sdk.run('info')) as { config?: { url?: string } };\n return info.config?.url;\n } catch {\n return undefined;\n }\n }\n}\n"],"names":["arrayify","getProjects","createSentrySDK"],"mappings":"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"}