@sentry/bundler-plugins 11.0.0-beta.1 → 11.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/core/debug-id-upload.js +77 -2
- package/build/cjs/core/debug-id-upload.js.map +1 -1
- package/build/cjs/core/index.js +2 -0
- package/build/cjs/core/index.js.map +1 -1
- package/build/cjs/core/options-mapping.js +4 -2
- package/build/cjs/core/options-mapping.js.map +1 -1
- package/build/cjs/core/utils.js +18 -11
- package/build/cjs/core/utils.js.map +1 -1
- package/build/cjs/core/version.js +1 -1
- package/build/cjs/core/version.js.map +1 -1
- package/build/cjs/esbuild/index.js +17 -2
- package/build/cjs/esbuild/index.js.map +1 -1
- package/build/cjs/rollup/index.js +23 -13
- package/build/cjs/rollup/index.js.map +1 -1
- package/build/cjs/webpack/webpack4and5.js +34 -0
- package/build/cjs/webpack/webpack4and5.js.map +1 -1
- package/build/esm/core/debug-id-upload.js +76 -3
- package/build/esm/core/debug-id-upload.js.map +1 -1
- package/build/esm/core/index.js +1 -1
- package/build/esm/core/index.js.map +1 -1
- package/build/esm/core/options-mapping.js +4 -2
- package/build/esm/core/options-mapping.js.map +1 -1
- package/build/esm/core/utils.js +18 -10
- package/build/esm/core/utils.js.map +1 -1
- package/build/esm/core/version.js +1 -1
- package/build/esm/core/version.js.map +1 -1
- package/build/esm/esbuild/index.js +19 -4
- package/build/esm/esbuild/index.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/rollup/index.js +24 -14
- package/build/esm/rollup/index.js.map +1 -1
- package/build/esm/webpack/webpack4and5.js +36 -2
- package/build/esm/webpack/webpack4and5.js.map +1 -1
- package/build/types/core/debug-id-upload.d.ts +28 -0
- package/build/types/core/debug-id-upload.d.ts.map +1 -1
- package/build/types/core/index.d.ts +1 -1
- package/build/types/core/index.d.ts.map +1 -1
- package/build/types/core/options-mapping.d.ts.map +1 -1
- package/build/types/core/types.d.ts +7 -2
- package/build/types/core/types.d.ts.map +1 -1
- package/build/types/core/utils.d.ts.map +1 -1
- package/build/types/core/version.d.ts +1 -1
- package/build/types/core/version.d.ts.map +1 -1
- package/build/types/esbuild/index.d.ts.map +1 -1
- package/build/types/rollup/index.d.ts +16 -25
- package/build/types/rollup/index.d.ts.map +1 -1
- package/build/types/webpack/webpack4and5.d.ts +20 -21
- package/build/types/webpack/webpack4and5.d.ts.map +1 -1
- package/package.json +2 -3
|
@@ -95,6 +95,80 @@ function addDebugIdToBundleSource(bundleSource, debugId) {
|
|
|
95
95
|
//# debugId=${debugId}`;
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
|
+
function setDebugIdOnSourceMap(map, debugId) {
|
|
99
|
+
map["debug_id"] = debugId;
|
|
100
|
+
map["debugId"] = debugId;
|
|
101
|
+
}
|
|
102
|
+
function parseSourceMap(sourceMapSource) {
|
|
103
|
+
let map;
|
|
104
|
+
try {
|
|
105
|
+
map = JSON.parse(sourceMapSource);
|
|
106
|
+
} catch {
|
|
107
|
+
return void 0;
|
|
108
|
+
}
|
|
109
|
+
return map && typeof map === "object" ? map : void 0;
|
|
110
|
+
}
|
|
111
|
+
function stampDebugId(bundleSource, sourceMapSource) {
|
|
112
|
+
const debugId = determineDebugIdFromBundleSource(bundleSource);
|
|
113
|
+
if (debugId === void 0) {
|
|
114
|
+
return void 0;
|
|
115
|
+
}
|
|
116
|
+
if (sourceMapSource === void 0) {
|
|
117
|
+
if (!bundleHasInlineSourceMap(bundleSource)) {
|
|
118
|
+
return void 0;
|
|
119
|
+
}
|
|
120
|
+
return { bundleSource: addDebugIdToBundleSource(bundleSource, debugId), sourceMapSource: void 0 };
|
|
121
|
+
}
|
|
122
|
+
const map = parseSourceMap(sourceMapSource);
|
|
123
|
+
if (!map) {
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
setDebugIdOnSourceMap(map, debugId);
|
|
127
|
+
return {
|
|
128
|
+
bundleSource: addDebugIdToBundleSource(bundleSource, debugId),
|
|
129
|
+
sourceMapSource: JSON.stringify(map)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function addDebugIdToEmittedArtifacts(bundleFilePath, logger, resolveSourceMapHook) {
|
|
133
|
+
let bundleSource;
|
|
134
|
+
try {
|
|
135
|
+
bundleSource = await fs__default.promises.readFile(bundleFilePath, "utf8");
|
|
136
|
+
} catch (e) {
|
|
137
|
+
logger.error(`Could not read bundle to stamp debug ID: ${bundleFilePath}`, e);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const sourceMapPath = await determineSourceMapPathFromBundle(
|
|
141
|
+
bundleFilePath,
|
|
142
|
+
bundleSource,
|
|
143
|
+
logger,
|
|
144
|
+
resolveSourceMapHook
|
|
145
|
+
);
|
|
146
|
+
let sourceMapSource;
|
|
147
|
+
if (sourceMapPath) {
|
|
148
|
+
try {
|
|
149
|
+
sourceMapSource = await fs__default.promises.readFile(sourceMapPath, "utf8");
|
|
150
|
+
} catch (e) {
|
|
151
|
+
logger.error(`Could not read source map to stamp debug ID: ${sourceMapPath}`, e);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const stamped = stampDebugId(bundleSource, sourceMapSource);
|
|
156
|
+
if (!stamped) {
|
|
157
|
+
logger.debug(
|
|
158
|
+
`Could not stamp debug ID (no debug ID in bundle, no source map, or invalid source map): ${bundleFilePath}`
|
|
159
|
+
);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const writes = [fs__default.promises.writeFile(bundleFilePath, stamped.bundleSource, "utf8")];
|
|
163
|
+
if (sourceMapPath && stamped.sourceMapSource !== void 0) {
|
|
164
|
+
writes.push(fs__default.promises.writeFile(sourceMapPath, stamped.sourceMapSource, "utf8"));
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
await Promise.all(writes);
|
|
168
|
+
} catch (e) {
|
|
169
|
+
logger.error(`Could not write debug ID into build artifacts: ${bundleFilePath}`, e);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
98
172
|
function bundleHasInlineSourceMap(bundleSource) {
|
|
99
173
|
return /^\s*\/\/# sourceMappingURL=data:/m.test(bundleSource);
|
|
100
174
|
}
|
|
@@ -153,8 +227,7 @@ async function prepareSourceMapForDebugIdUpload(sourceMapPath, targetPath, debug
|
|
|
153
227
|
let map;
|
|
154
228
|
try {
|
|
155
229
|
map = JSON.parse(sourceMapFileContent);
|
|
156
|
-
map
|
|
157
|
-
map["debugId"] = debugId;
|
|
230
|
+
setDebugIdOnSourceMap(map, debugId);
|
|
158
231
|
} catch {
|
|
159
232
|
logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);
|
|
160
233
|
return;
|
|
@@ -181,8 +254,10 @@ function defaultRewriteSourcesHook(source) {
|
|
|
181
254
|
}
|
|
182
255
|
}
|
|
183
256
|
|
|
257
|
+
exports.addDebugIdToEmittedArtifacts = addDebugIdToEmittedArtifacts;
|
|
184
258
|
exports.createDebugIdUploadFunction = createDebugIdUploadFunction;
|
|
185
259
|
exports.defaultRewriteSourcesHook = defaultRewriteSourcesHook;
|
|
186
260
|
exports.determineSourceMapPathFromBundle = determineSourceMapPathFromBundle;
|
|
187
261
|
exports.prepareBundleForDebugIdUpload = prepareBundleForDebugIdUpload;
|
|
262
|
+
exports.stampDebugId = stampDebugId;
|
|
188
263
|
//# sourceMappingURL=debug-id-upload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug-id-upload.js","sources":["../../../src/core/debug-id-upload.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport * as url from 'url';\nimport * as util from 'util';\nimport { promisify } from 'util';\nimport type { SentryBuildPluginManager } from './build-plugin-manager';\nimport type { Logger } from './logger';\nimport type { ResolveSourceMapHook, RewriteSourcesHook } from './types';\nimport { stripQueryAndHashFromPath } from './utils';\n\ninterface DebugIdUploadPluginOptions {\n sentryBuildPluginManager: SentryBuildPluginManager;\n}\n\nexport function createDebugIdUploadFunction({ sentryBuildPluginManager }: DebugIdUploadPluginOptions) {\n return async (buildArtifactPaths: string[]) => {\n // Webpack and perhaps other bundlers allow you to append query strings to\n // filenames for cache busting purposes. We should strip these before upload.\n const cleanedPaths = buildArtifactPaths.map(stripQueryAndHashFromPath);\n await sentryBuildPluginManager.uploadSourcemaps(cleanedPaths);\n };\n}\n\nexport async function prepareBundleForDebugIdUpload(\n bundleFilePath: string,\n uploadFolder: string,\n chunkIndex: number,\n logger: Logger,\n rewriteSourcesHook: RewriteSourcesHook,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleContent;\n try {\n bundleContent = await promisify(fs.readFile)(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to determine debug ID and source map: ${bundleFilePath}`, e);\n return;\n }\n\n const debugId = determineDebugIdFromBundleSource(bundleContent);\n if (debugId === undefined) {\n logger.debug(\n `Could not determine debug ID from bundle. This can happen if you did not clean your output folder before installing the Sentry plugin. File will not be source mapped: ${bundleFilePath}`,\n );\n return;\n }\n\n const uniqueUploadName = `${debugId}-${chunkIndex}`;\n\n bundleContent = addDebugIdToBundleSource(bundleContent, debugId);\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleContent,\n logger,\n resolveSourceMapHook,\n );\n\n // A chunk with a debug ID but no resolvable source map\n // (e.g. framework-generated stub chunks that never emit one) can't be\n // symbolicated, so uploading its minified source alone accomplishes\n // nothing and only makes the uploader warn about a missing source map ref.\n // Skip it, unless the source map is inlined into the bundle, in which case\n // the source file carries the map itself and must still be uploaded.\n if (!sourceMapPath && !bundleHasInlineSourceMap(bundleContent)) {\n logger.debug(`Not uploading bundle without a source map: ${bundleFilePath}`);\n return;\n }\n\n const writeSourceFilePromise = fs.promises.writeFile(\n path.join(uploadFolder, `${uniqueUploadName}.js`),\n bundleContent,\n 'utf-8',\n );\n\n const writeSourceMapFilePromise = sourceMapPath\n ? prepareSourceMapForDebugIdUpload(\n sourceMapPath,\n path.join(uploadFolder, `${uniqueUploadName}.js.map`),\n debugId,\n rewriteSourcesHook,\n logger,\n )\n : Promise.resolve();\n\n await writeSourceFilePromise;\n await writeSourceMapFilePromise;\n}\n\n/**\n * Looks for a particular string pattern (`sdbid-[debug ID]`) in the bundle\n * source and extracts the bundle's debug ID from it.\n *\n * The string pattern is injected via the debug ID injection snipped.\n */\nfunction determineDebugIdFromBundleSource(code: string): string | undefined {\n const match = code.match(\n /sentry-dbid-([0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12})/,\n );\n\n if (match) {\n return match[1];\n } else {\n return undefined;\n }\n}\n\nconst SPEC_LAST_DEBUG_ID_REGEX = /\\/\\/# debugId=([a-fA-F0-9-]+)(?![\\s\\S]*\\/\\/# debugId=)/m;\n\nfunction hasSpecCompliantDebugId(bundleSource: string): boolean {\n return SPEC_LAST_DEBUG_ID_REGEX.test(bundleSource);\n}\n\nfunction addDebugIdToBundleSource(bundleSource: string, debugId: string): string {\n if (hasSpecCompliantDebugId(bundleSource)) {\n return bundleSource.replace(SPEC_LAST_DEBUG_ID_REGEX, `//# debugId=${debugId}`);\n } else {\n return `${bundleSource}\\n//# debugId=${debugId}`;\n }\n}\n\n/**\n * Whether the bundle carries its source map inlined as `sourceMappingURL=data:`\n * URI, rather than referencing a separate `.map` file. Such bundles must still\n * be uploaded even when no `.map` file is found, because the source file itself\n * contains the map.\n */\nfunction bundleHasInlineSourceMap(bundleSource: string): boolean {\n return /^\\s*\\/\\/# sourceMappingURL=data:/m.test(bundleSource);\n}\n\n/**\n * Applies a set of heuristics to find the source map for a particular bundle.\n *\n * @returns the path to the bundle's source map or `undefined` if none could be found.\n */\nexport async function determineSourceMapPathFromBundle(\n bundlePath: string,\n bundleSource: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<string | undefined> {\n const sourceMappingUrlMatch = bundleSource.match(/^\\s*\\/\\/# sourceMappingURL=(.*)$/m);\n const sourceMappingUrl = sourceMappingUrlMatch ? (sourceMappingUrlMatch[1] as string) : undefined;\n\n const searchLocations: string[] = [];\n\n if (resolveSourceMapHook) {\n logger.debug(\n `Calling sourcemaps.resolveSourceMap(${JSON.stringify(bundlePath)}, ${JSON.stringify(sourceMappingUrl)})`,\n );\n const customPath = await resolveSourceMapHook(bundlePath, sourceMappingUrl);\n logger.debug(`resolveSourceMap hook returned: ${JSON.stringify(customPath)}`);\n\n if (customPath) {\n searchLocations.push(customPath);\n }\n }\n\n // 1. try to find source map at `sourceMappingURL` location\n if (sourceMappingUrl) {\n let parsedUrl: URL | undefined;\n try {\n parsedUrl = new URL(sourceMappingUrl);\n } catch {\n // noop\n }\n\n if (parsedUrl?.protocol === 'file:') {\n searchLocations.push(url.fileURLToPath(sourceMappingUrl));\n } else if (parsedUrl) {\n // noop, non-file urls don't translate to a local sourcemap file\n } else if (path.isAbsolute(sourceMappingUrl)) {\n searchLocations.push(path.normalize(sourceMappingUrl));\n } else {\n searchLocations.push(path.normalize(path.join(path.dirname(bundlePath), sourceMappingUrl)));\n }\n }\n\n // 2. try to find source map at path adjacent to chunk source, but with `.map` appended\n searchLocations.push(`${bundlePath}.map`);\n\n for (const searchLocation of searchLocations) {\n try {\n await util.promisify(fs.access)(searchLocation);\n logger.debug(`Source map found for bundle \\`${bundlePath}\\`: \\`${searchLocation}\\``);\n return searchLocation;\n } catch {\n // noop\n }\n }\n\n // This is just a debug message because it can be quite spammy for some frameworks\n logger.debug(\n `Could not determine source map path for bundle \\`${bundlePath}\\`` +\n ` with sourceMappingURL=${sourceMappingUrl === undefined ? 'undefined' : `\\`${sourceMappingUrl}\\``}` +\n ` - Did you turn on source map generation in your bundler?` +\n ` (Attempted paths: ${searchLocations.map(e => `\\`${e}\\``).join(', ')})`,\n );\n return undefined;\n}\n\n/**\n * Reads a source map, injects debug ID fields, and writes the source map to the target path.\n */\nasync function prepareSourceMapForDebugIdUpload(\n sourceMapPath: string,\n targetPath: string,\n debugId: string,\n rewriteSourcesHook: RewriteSourcesHook,\n logger: Logger,\n): Promise<void> {\n let sourceMapFileContent: string;\n try {\n sourceMapFileContent = await util.promisify(fs.readFile)(sourceMapPath, {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to read source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n\n let map: Record<string, unknown>;\n try {\n map = JSON.parse(sourceMapFileContent) as { sources: unknown; [key: string]: unknown };\n // For now we write both fields until we know what will become the standard - if ever.\n map['debug_id'] = debugId;\n map['debugId'] = debugId;\n } catch {\n logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);\n return;\n }\n\n if (map['sources'] && Array.isArray(map['sources'])) {\n const mapDir = path.dirname(sourceMapPath);\n map['sources'] = map['sources'].map((source: string) => rewriteSourcesHook(source, map, { mapDir }));\n }\n\n try {\n await util.promisify(fs.writeFile)(targetPath, JSON.stringify(map), {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to prepare source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n}\n\nconst PROTOCOL_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\nexport function defaultRewriteSourcesHook(source: string): string {\n if (source.match(PROTOCOL_REGEX)) {\n return source.replace(PROTOCOL_REGEX, '');\n } else {\n return path.relative(process.cwd(), path.normalize(source));\n }\n}\n"],"names":["stripQueryAndHashFromPath","promisify","fs","path","url","util"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"debug-id-upload.js","sources":["../../../src/core/debug-id-upload.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport * as url from 'url';\nimport * as util from 'util';\nimport { promisify } from 'util';\nimport type { SentryBuildPluginManager } from './build-plugin-manager';\nimport type { Logger } from './logger';\nimport type { ResolveSourceMapHook, RewriteSourcesHook } from './types';\nimport { stripQueryAndHashFromPath } from './utils';\n\ninterface DebugIdUploadPluginOptions {\n sentryBuildPluginManager: SentryBuildPluginManager;\n}\n\nexport function createDebugIdUploadFunction({ sentryBuildPluginManager }: DebugIdUploadPluginOptions) {\n return async (buildArtifactPaths: string[]) => {\n // Webpack and perhaps other bundlers allow you to append query strings to\n // filenames for cache busting purposes. We should strip these before upload.\n const cleanedPaths = buildArtifactPaths.map(stripQueryAndHashFromPath);\n await sentryBuildPluginManager.uploadSourcemaps(cleanedPaths);\n };\n}\n\nexport async function prepareBundleForDebugIdUpload(\n bundleFilePath: string,\n uploadFolder: string,\n chunkIndex: number,\n logger: Logger,\n rewriteSourcesHook: RewriteSourcesHook,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleContent;\n try {\n bundleContent = await promisify(fs.readFile)(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to determine debug ID and source map: ${bundleFilePath}`, e);\n return;\n }\n\n const debugId = determineDebugIdFromBundleSource(bundleContent);\n if (debugId === undefined) {\n logger.debug(\n `Could not determine debug ID from bundle. This can happen if you did not clean your output folder before installing the Sentry plugin. File will not be source mapped: ${bundleFilePath}`,\n );\n return;\n }\n\n const uniqueUploadName = `${debugId}-${chunkIndex}`;\n\n bundleContent = addDebugIdToBundleSource(bundleContent, debugId);\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleContent,\n logger,\n resolveSourceMapHook,\n );\n\n // A chunk with a debug ID but no resolvable source map\n // (e.g. framework-generated stub chunks that never emit one) can't be\n // symbolicated, so uploading its minified source alone accomplishes\n // nothing and only makes the uploader warn about a missing source map ref.\n // Skip it, unless the source map is inlined into the bundle, in which case\n // the source file carries the map itself and must still be uploaded.\n if (!sourceMapPath && !bundleHasInlineSourceMap(bundleContent)) {\n logger.debug(`Not uploading bundle without a source map: ${bundleFilePath}`);\n return;\n }\n\n const writeSourceFilePromise = fs.promises.writeFile(\n path.join(uploadFolder, `${uniqueUploadName}.js`),\n bundleContent,\n 'utf-8',\n );\n\n const writeSourceMapFilePromise = sourceMapPath\n ? prepareSourceMapForDebugIdUpload(\n sourceMapPath,\n path.join(uploadFolder, `${uniqueUploadName}.js.map`),\n debugId,\n rewriteSourcesHook,\n logger,\n )\n : Promise.resolve();\n\n await writeSourceFilePromise;\n await writeSourceMapFilePromise;\n}\n\n/**\n * Looks for a particular string pattern (`sdbid-[debug ID]`) in the bundle\n * source and extracts the bundle's debug ID from it.\n *\n * The string pattern is injected via the debug ID injection snipped.\n */\nfunction determineDebugIdFromBundleSource(code: string): string | undefined {\n const match = code.match(\n /sentry-dbid-([0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12})/,\n );\n\n if (match) {\n return match[1];\n } else {\n return undefined;\n }\n}\n\nconst SPEC_LAST_DEBUG_ID_REGEX = /\\/\\/# debugId=([a-fA-F0-9-]+)(?![\\s\\S]*\\/\\/# debugId=)/m;\n\nfunction hasSpecCompliantDebugId(bundleSource: string): boolean {\n return SPEC_LAST_DEBUG_ID_REGEX.test(bundleSource);\n}\n\nfunction addDebugIdToBundleSource(bundleSource: string, debugId: string): string {\n if (hasSpecCompliantDebugId(bundleSource)) {\n return bundleSource.replace(SPEC_LAST_DEBUG_ID_REGEX, `//# debugId=${debugId}`);\n } else {\n return `${bundleSource}\\n//# debugId=${debugId}`;\n }\n}\n\nfunction setDebugIdOnSourceMap(map: Record<string, unknown>, debugId: string): void {\n // For now we write both fields until we know what will become the standard - if ever.\n map['debug_id'] = debugId;\n map['debugId'] = debugId;\n}\n\nexport type StampedArtifacts = {\n bundleSource: string;\n /** `undefined` when the bundle has no separate source map (i.e. the map is inlined). */\n sourceMapSource: string | undefined;\n};\n\nfunction parseSourceMap(sourceMapSource: string): Record<string, unknown> | undefined {\n let map: unknown;\n try {\n map = JSON.parse(sourceMapSource);\n } catch {\n return undefined;\n }\n\n return map && typeof map === 'object' ? (map as Record<string, unknown>) : undefined;\n}\n\n/**\n * Stamps the debug ID injected into `bundleSource` into the bundle (as `//# debugId=` comment) and its\n * source map (as `debug_id`/`debugId` fields).\n *\n * This exists for `sourcemaps.disable: \"disable-upload\"`: the regular upload path only stamps\n * temporary copies of the artifacts (see `prepareBundleForDebugIdUpload`), so without this the\n * emitted artifacts would carry no debug ID and a later manual upload could not match them.\n * Callers must apply the result inside the bundler's asset pipeline (or, for bundlers without one,\n * before the build resolves) so that integrity hashes computed by later build steps include it.\n *\n * Pass `sourceMapSource: undefined` when the bundle has no separate source map. A bundle with an\n * inlined map still gets the comment, which is all the CLI and Symbolicator read the debug ID from.\n *\n * @returns the stamped artifacts, or `undefined` for bundles without a debug ID, without any source\n * map, or with an unparseable map.\n */\nexport function stampDebugId(bundleSource: string, sourceMapSource: string | undefined): StampedArtifacts | undefined {\n const debugId = determineDebugIdFromBundleSource(bundleSource);\n if (debugId === undefined) {\n return undefined;\n }\n\n if (sourceMapSource === undefined) {\n if (!bundleHasInlineSourceMap(bundleSource)) {\n return undefined;\n }\n\n return { bundleSource: addDebugIdToBundleSource(bundleSource, debugId), sourceMapSource: undefined };\n }\n\n const map = parseSourceMap(sourceMapSource);\n if (!map) {\n return undefined;\n }\n\n setDebugIdOnSourceMap(map, debugId);\n\n return {\n bundleSource: addDebugIdToBundleSource(bundleSource, debugId),\n sourceMapSource: JSON.stringify(map),\n };\n}\n\n/**\n * Stamps the debug ID of an emitted bundle into the bundle and its source map on disk.\n *\n * Used by bundlers that offer no hook to modify assets before they are written (esbuild).\n */\nexport async function addDebugIdToEmittedArtifacts(\n bundleFilePath: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<void> {\n let bundleSource: string;\n try {\n bundleSource = await fs.promises.readFile(bundleFilePath, 'utf8');\n } catch (e) {\n logger.error(`Could not read bundle to stamp debug ID: ${bundleFilePath}`, e);\n return;\n }\n\n const sourceMapPath = await determineSourceMapPathFromBundle(\n bundleFilePath,\n bundleSource,\n logger,\n resolveSourceMapHook,\n );\n\n let sourceMapSource: string | undefined;\n if (sourceMapPath) {\n try {\n sourceMapSource = await fs.promises.readFile(sourceMapPath, 'utf8');\n } catch (e) {\n logger.error(`Could not read source map to stamp debug ID: ${sourceMapPath}`, e);\n return;\n }\n }\n\n const stamped = stampDebugId(bundleSource, sourceMapSource);\n if (!stamped) {\n logger.debug(\n `Could not stamp debug ID (no debug ID in bundle, no source map, or invalid source map): ${bundleFilePath}`,\n );\n return;\n }\n\n const writes = [fs.promises.writeFile(bundleFilePath, stamped.bundleSource, 'utf8')];\n if (sourceMapPath && stamped.sourceMapSource !== undefined) {\n writes.push(fs.promises.writeFile(sourceMapPath, stamped.sourceMapSource, 'utf8'));\n }\n\n try {\n await Promise.all(writes);\n } catch (e) {\n logger.error(`Could not write debug ID into build artifacts: ${bundleFilePath}`, e);\n }\n}\n\n/**\n * Whether the bundle carries its source map inlined as `sourceMappingURL=data:`\n * URI, rather than referencing a separate `.map` file. Such bundles must still\n * be uploaded even when no `.map` file is found, because the source file itself\n * contains the map.\n */\nfunction bundleHasInlineSourceMap(bundleSource: string): boolean {\n return /^\\s*\\/\\/# sourceMappingURL=data:/m.test(bundleSource);\n}\n\n/**\n * Applies a set of heuristics to find the source map for a particular bundle.\n *\n * @returns the path to the bundle's source map or `undefined` if none could be found.\n */\nexport async function determineSourceMapPathFromBundle(\n bundlePath: string,\n bundleSource: string,\n logger: Logger,\n resolveSourceMapHook: ResolveSourceMapHook | undefined,\n): Promise<string | undefined> {\n const sourceMappingUrlMatch = bundleSource.match(/^\\s*\\/\\/# sourceMappingURL=(.*)$/m);\n const sourceMappingUrl = sourceMappingUrlMatch ? (sourceMappingUrlMatch[1] as string) : undefined;\n\n const searchLocations: string[] = [];\n\n if (resolveSourceMapHook) {\n logger.debug(\n `Calling sourcemaps.resolveSourceMap(${JSON.stringify(bundlePath)}, ${JSON.stringify(sourceMappingUrl)})`,\n );\n const customPath = await resolveSourceMapHook(bundlePath, sourceMappingUrl);\n logger.debug(`resolveSourceMap hook returned: ${JSON.stringify(customPath)}`);\n\n if (customPath) {\n searchLocations.push(customPath);\n }\n }\n\n // 1. try to find source map at `sourceMappingURL` location\n if (sourceMappingUrl) {\n let parsedUrl: URL | undefined;\n try {\n parsedUrl = new URL(sourceMappingUrl);\n } catch {\n // noop\n }\n\n if (parsedUrl?.protocol === 'file:') {\n searchLocations.push(url.fileURLToPath(sourceMappingUrl));\n } else if (parsedUrl) {\n // noop, non-file urls don't translate to a local sourcemap file\n } else if (path.isAbsolute(sourceMappingUrl)) {\n searchLocations.push(path.normalize(sourceMappingUrl));\n } else {\n searchLocations.push(path.normalize(path.join(path.dirname(bundlePath), sourceMappingUrl)));\n }\n }\n\n // 2. try to find source map at path adjacent to chunk source, but with `.map` appended\n searchLocations.push(`${bundlePath}.map`);\n\n for (const searchLocation of searchLocations) {\n try {\n await util.promisify(fs.access)(searchLocation);\n logger.debug(`Source map found for bundle \\`${bundlePath}\\`: \\`${searchLocation}\\``);\n return searchLocation;\n } catch {\n // noop\n }\n }\n\n // This is just a debug message because it can be quite spammy for some frameworks\n logger.debug(\n `Could not determine source map path for bundle \\`${bundlePath}\\`` +\n ` with sourceMappingURL=${sourceMappingUrl === undefined ? 'undefined' : `\\`${sourceMappingUrl}\\``}` +\n ` - Did you turn on source map generation in your bundler?` +\n ` (Attempted paths: ${searchLocations.map(e => `\\`${e}\\``).join(', ')})`,\n );\n return undefined;\n}\n\n/**\n * Reads a source map, injects debug ID fields, and writes the source map to the target path.\n */\nasync function prepareSourceMapForDebugIdUpload(\n sourceMapPath: string,\n targetPath: string,\n debugId: string,\n rewriteSourcesHook: RewriteSourcesHook,\n logger: Logger,\n): Promise<void> {\n let sourceMapFileContent: string;\n try {\n sourceMapFileContent = await util.promisify(fs.readFile)(sourceMapPath, {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to read source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n\n let map: Record<string, unknown>;\n try {\n map = JSON.parse(sourceMapFileContent) as { sources: unknown; [key: string]: unknown };\n setDebugIdOnSourceMap(map, debugId);\n } catch {\n logger.error(`Failed to parse source map for debug ID upload: ${sourceMapPath}`);\n return;\n }\n\n if (map['sources'] && Array.isArray(map['sources'])) {\n const mapDir = path.dirname(sourceMapPath);\n map['sources'] = map['sources'].map((source: string) => rewriteSourcesHook(source, map, { mapDir }));\n }\n\n try {\n await util.promisify(fs.writeFile)(targetPath, JSON.stringify(map), {\n encoding: 'utf8',\n });\n } catch (e) {\n logger.error(`Failed to prepare source map for debug ID upload: ${sourceMapPath}`, e);\n return;\n }\n}\n\nconst PROTOCOL_REGEX = /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//;\nexport function defaultRewriteSourcesHook(source: string): string {\n if (source.match(PROTOCOL_REGEX)) {\n return source.replace(PROTOCOL_REGEX, '');\n } else {\n return path.relative(process.cwd(), path.normalize(source));\n }\n}\n"],"names":["stripQueryAndHashFromPath","promisify","fs","path","url","util"],"mappings":"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"}
|
package/build/cjs/core/index.js
CHANGED
|
@@ -95,7 +95,9 @@ exports.replaceBooleanFlagsInCode = utils.replaceBooleanFlagsInCode;
|
|
|
95
95
|
exports.stringToUUID = utils.stringToUUID;
|
|
96
96
|
exports.globFiles = glob.globFiles;
|
|
97
97
|
exports.createSentryBuildPluginManager = buildPluginManager.createSentryBuildPluginManager;
|
|
98
|
+
exports.addDebugIdToEmittedArtifacts = debugIdUpload.addDebugIdToEmittedArtifacts;
|
|
98
99
|
exports.createDebugIdUploadFunction = debugIdUpload.createDebugIdUploadFunction;
|
|
100
|
+
exports.stampDebugId = debugIdUpload.stampDebugId;
|
|
99
101
|
exports.COMMENT_USE_STRICT_REGEX = COMMENT_USE_STRICT_REGEX;
|
|
100
102
|
exports.createComponentNameAnnotateHooks = createComponentNameAnnotateHooks;
|
|
101
103
|
exports.getDebugIdSnippet = getDebugIdSnippet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/core/index.ts"],"sourcesContent":["import { debug } from '@sentry/core';\nimport { CodeInjection, containsOnlyImports, stripQueryAndHashFromPath } from './utils';\nimport type { transformAsync as babelTransformAsync } from '@babel/core';\nimport type componentNameAnnotatePlugin from '../babel-plugin';\nimport type { experimentalComponentNameAnnotatePlugin } from '../babel-plugin';\n\ntype BabelTransformAsync = typeof babelTransformAsync;\ntype BabelParserPlugins = NonNullable<NonNullable<Parameters<BabelTransformAsync>[1]>['parserOpts']>['plugins'];\ntype BabelAnnotationRuntime = {\n transformAsync: BabelTransformAsync;\n componentNameAnnotatePlugin: typeof componentNameAnnotatePlugin;\n experimentalComponentNameAnnotatePlugin: typeof experimentalComponentNameAnnotatePlugin;\n};\n\nlet babelAnnotationRuntimePromise: Promise<BabelAnnotationRuntime> | undefined;\n\nfunction loadBabelAnnotationRuntime(): Promise<BabelAnnotationRuntime> {\n if (!babelAnnotationRuntimePromise) {\n babelAnnotationRuntimePromise = Promise.all([import('@babel/core'), import('../babel-plugin')]).then(\n ([babel, babelPlugin]) => {\n return {\n transformAsync: babel.transformAsync,\n componentNameAnnotatePlugin: babelPlugin.default,\n experimentalComponentNameAnnotatePlugin: babelPlugin.experimentalComponentNameAnnotatePlugin,\n };\n },\n );\n }\n\n return babelAnnotationRuntimePromise;\n}\n\n// We need to be careful not to inject the snippet before any `\"use strict\";`s.\n// As an additional complication `\"use strict\";`s may come after any number of comments.\nexport const COMMENT_USE_STRICT_REGEX =\n // Note: CodeQL complains that this regex potentially has n^2 runtime. This likely won't affect realistic files.\n /^(?:\\s*|\\/\\*(?:.|\\r|\\n)*?\\*\\/|\\/\\/.*[\\n\\r])*(?:\"[^\"]*\";|'[^']*';)?/;\n\n/**\n * Checks if a file is a JavaScript file based on its extension.\n * Handles query strings and hashes in the filename.\n */\nexport function isJsFile(fileName: string): boolean {\n const cleanFileName = stripQueryAndHashFromPath(fileName);\n return ['.js', '.mjs', '.cjs'].some(ext => cleanFileName.endsWith(ext));\n}\n\n/**\n * Checks if a chunk should be skipped for code injection\n *\n * This is necessary to handle Vite's MPA (multi-page application) mode where\n * HTML entry points create \"facade\" chunks that should not contain injected code.\n * See: https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/829\n *\n * However, in SPA mode, the main bundle also has an HTML facade but contains\n * substantial application code. We should NOT skip injection for these bundles.\n *\n * @param code - The chunk's code content\n * @param facadeModuleId - The facade module ID (if any) - HTML files create facade chunks\n * @returns true if the chunk should be skipped\n */\nexport function shouldSkipCodeInjection(code: string, facadeModuleId: string | null | undefined): boolean {\n // Skip empty chunks - these are placeholder chunks that should be optimized away\n if (code.trim().length === 0) {\n return true;\n }\n\n // For HTML facade chunks, only skip if they contain only import statements\n if (facadeModuleId && stripQueryAndHashFromPath(facadeModuleId).endsWith('.html')) {\n return containsOnlyImports(code);\n }\n\n return false;\n}\n\nexport { globFiles } from './glob';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function createComponentNameAnnotateHooks(ignoredComponents: string[], injectIntoHtml: boolean) {\n return {\n async transform(this: void, code: string, id: string) {\n // id may contain query and hash which will trip up our file extension logic below\n const idWithoutQueryAndHash = stripQueryAndHashFromPath(id);\n\n if (idWithoutQueryAndHash.match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n return null;\n }\n\n // We will only apply this plugin on jsx and tsx files\n if (!['.jsx', '.tsx'].some(ending => idWithoutQueryAndHash.endsWith(ending))) {\n return null;\n }\n\n const parserPlugins: BabelParserPlugins = [];\n if (idWithoutQueryAndHash.endsWith('.jsx')) {\n parserPlugins.push('jsx');\n } else if (idWithoutQueryAndHash.endsWith('.tsx')) {\n parserPlugins.push('jsx', 'typescript');\n }\n\n const { transformAsync, componentNameAnnotatePlugin, experimentalComponentNameAnnotatePlugin } =\n await loadBabelAnnotationRuntime();\n const plugin = injectIntoHtml ? experimentalComponentNameAnnotatePlugin : componentNameAnnotatePlugin;\n\n try {\n const result = await transformAsync(code, {\n plugins: [[plugin, { ignoredComponents }]],\n filename: id,\n sourceFileName: idWithoutQueryAndHash,\n parserOpts: {\n sourceType: 'module',\n allowAwaitOutsideFunction: true,\n plugins: parserPlugins,\n },\n generatorOpts: {\n decoratorsBeforeExport: true,\n },\n sourceMaps: true,\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map,\n };\n } catch (e) {\n debug.error(`Failed to apply react annotate plugin`, e);\n }\n\n return { code };\n },\n };\n}\n\nexport function getDebugIdSnippet(debugId: string): CodeInjection {\n return new CodeInjection(\n `var n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]=\"${debugId}\",e._sentryDebugIdIdentifier=\"sentry-dbid-${debugId}\");`,\n );\n}\n\nexport type { Logger } from './logger';\nexport type { Options, SentrySDKBuildFlags } from './types';\nexport {\n CodeInjection,\n replaceBooleanFlagsInCode,\n stringToUUID,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n} from './utils';\nexport { createSentryBuildPluginManager } from './build-plugin-manager';\nexport { createDebugIdUploadFunction } from './debug-id-upload';\n"],"names":["stripQueryAndHashFromPath","containsOnlyImports","debug","CodeInjection"],"mappings":";;;;;;;;AAcA,IAAI,6BAAA;AAEJ,SAAS,0BAAA,GAA8D;AACrE,EAAA,IAAI,CAAC,6BAAA,EAA+B;AAClC,IAAA,6BAAA,GAAgC,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAO,aAAa,GAAG,qCAAO,0BAAiB,EAAC,CAAC,CAAA,CAAE,IAAA;AAAA,MAC9F,CAAC,CAAC,KAAA,EAAO,WAAW,CAAA,KAAM;AACxB,QAAA,OAAO;AAAA,UACL,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,6BAA6B,WAAA,CAAY,OAAA;AAAA,UACzC,yCAAyC,WAAA,CAAY;AAAA,SACvD;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,6BAAA;AACT;AAIO,MAAM,wBAAA;AAAA;AAAA,EAEX;AAAA;AAMK,SAAS,SAAS,QAAA,EAA2B;AAClD,EAAA,MAAM,aAAA,GAAgBA,gCAA0B,QAAQ,CAAA;AACxD,EAAA,OAAO,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA,CAAE,KAAK,CAAA,GAAA,KAAO,aAAA,CAAc,QAAA,CAAS,GAAG,CAAC,CAAA;AACxE;AAgBO,SAAS,uBAAA,CAAwB,MAAc,cAAA,EAAoD;AAExG,EAAA,IAAI,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,kBAAkBA,+BAAA,CAA0B,cAAc,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,EAAG;AACjF,IAAA,OAAOC,0BAAoB,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,gCAAA,CAAiC,mBAA6B,cAAA,EAAyB;AACrG,EAAA,OAAO;AAAA,IACL,MAAM,SAAA,CAAsB,IAAA,EAAc,EAAA,EAAY;AAEpD,MAAA,MAAM,qBAAA,GAAwBD,gCAA0B,EAAE,CAAA;AAE1D,MAAA,IAAI,qBAAA,CAAsB,KAAA,CAAM,mCAAmC,CAAA,EAAG;AACpE,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,CAAC,CAAC,MAAA,EAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU,qBAAA,CAAsB,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG;AAC5E,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,gBAAoC,EAAC;AAC3C,MAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1C,QAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,MAC1B,CAAA,MAAA,IAAW,qBAAA,CAAsB,QAAA,CAAS,MAAM,CAAA,EAAG;AACjD,QAAA,aAAA,CAAc,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,EAAE,cAAA,EAAgB,2BAAA,EAA6B,uCAAA,EAAwC,GAC3F,MAAM,0BAAA,EAA2B;AACnC,MAAA,MAAM,MAAA,GAAS,iBAAiB,uCAAA,GAA0C,2BAAA;AAE1E,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,EAAM;AAAA,UACxC,SAAS,CAAC,CAAC,QAAQ,EAAE,iBAAA,EAAmB,CAAC,CAAA;AAAA,UACzC,QAAA,EAAU,EAAA;AAAA,UACV,cAAA,EAAgB,qBAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV,UAAA,EAAY,QAAA;AAAA,YACZ,yBAAA,EAA2B,IAAA;AAAA,YAC3B,OAAA,EAAS;AAAA,WACX;AAAA,UACA,aAAA,EAAe;AAAA,YACb,sBAAA,EAAwB;AAAA,WAC1B;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,QAAQ,IAAA,IAAQ,IAAA;AAAA,UACtB,KAAK,MAAA,EAAQ;AAAA,SACf;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAAE,UAAA,CAAM,KAAA,CAAM,yCAAyC,CAAC,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,OAAA,EAAgC;AAChE,EAAA,OAAO,IAAIC,mBAAA;AAAA,IACT,CAAA,4FAAA,EAA+F,OAAO,CAAA,0CAAA,EAA6C,OAAO,CAAA,GAAA;AAAA,GAC5J;AACF
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/core/index.ts"],"sourcesContent":["import { debug } from '@sentry/core';\nimport { CodeInjection, containsOnlyImports, stripQueryAndHashFromPath } from './utils';\nimport type { transformAsync as babelTransformAsync } from '@babel/core';\nimport type componentNameAnnotatePlugin from '../babel-plugin';\nimport type { experimentalComponentNameAnnotatePlugin } from '../babel-plugin';\n\ntype BabelTransformAsync = typeof babelTransformAsync;\ntype BabelParserPlugins = NonNullable<NonNullable<Parameters<BabelTransformAsync>[1]>['parserOpts']>['plugins'];\ntype BabelAnnotationRuntime = {\n transformAsync: BabelTransformAsync;\n componentNameAnnotatePlugin: typeof componentNameAnnotatePlugin;\n experimentalComponentNameAnnotatePlugin: typeof experimentalComponentNameAnnotatePlugin;\n};\n\nlet babelAnnotationRuntimePromise: Promise<BabelAnnotationRuntime> | undefined;\n\nfunction loadBabelAnnotationRuntime(): Promise<BabelAnnotationRuntime> {\n if (!babelAnnotationRuntimePromise) {\n babelAnnotationRuntimePromise = Promise.all([import('@babel/core'), import('../babel-plugin')]).then(\n ([babel, babelPlugin]) => {\n return {\n transformAsync: babel.transformAsync,\n componentNameAnnotatePlugin: babelPlugin.default,\n experimentalComponentNameAnnotatePlugin: babelPlugin.experimentalComponentNameAnnotatePlugin,\n };\n },\n );\n }\n\n return babelAnnotationRuntimePromise;\n}\n\n// We need to be careful not to inject the snippet before any `\"use strict\";`s.\n// As an additional complication `\"use strict\";`s may come after any number of comments.\nexport const COMMENT_USE_STRICT_REGEX =\n // Note: CodeQL complains that this regex potentially has n^2 runtime. This likely won't affect realistic files.\n /^(?:\\s*|\\/\\*(?:.|\\r|\\n)*?\\*\\/|\\/\\/.*[\\n\\r])*(?:\"[^\"]*\";|'[^']*';)?/;\n\n/**\n * Checks if a file is a JavaScript file based on its extension.\n * Handles query strings and hashes in the filename.\n */\nexport function isJsFile(fileName: string): boolean {\n const cleanFileName = stripQueryAndHashFromPath(fileName);\n return ['.js', '.mjs', '.cjs'].some(ext => cleanFileName.endsWith(ext));\n}\n\n/**\n * Checks if a chunk should be skipped for code injection\n *\n * This is necessary to handle Vite's MPA (multi-page application) mode where\n * HTML entry points create \"facade\" chunks that should not contain injected code.\n * See: https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/829\n *\n * However, in SPA mode, the main bundle also has an HTML facade but contains\n * substantial application code. We should NOT skip injection for these bundles.\n *\n * @param code - The chunk's code content\n * @param facadeModuleId - The facade module ID (if any) - HTML files create facade chunks\n * @returns true if the chunk should be skipped\n */\nexport function shouldSkipCodeInjection(code: string, facadeModuleId: string | null | undefined): boolean {\n // Skip empty chunks - these are placeholder chunks that should be optimized away\n if (code.trim().length === 0) {\n return true;\n }\n\n // For HTML facade chunks, only skip if they contain only import statements\n if (facadeModuleId && stripQueryAndHashFromPath(facadeModuleId).endsWith('.html')) {\n return containsOnlyImports(code);\n }\n\n return false;\n}\n\nexport { globFiles } from './glob';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport function createComponentNameAnnotateHooks(ignoredComponents: string[], injectIntoHtml: boolean) {\n return {\n async transform(this: void, code: string, id: string) {\n // id may contain query and hash which will trip up our file extension logic below\n const idWithoutQueryAndHash = stripQueryAndHashFromPath(id);\n\n if (idWithoutQueryAndHash.match(/\\\\node_modules\\\\|\\/node_modules\\//)) {\n return null;\n }\n\n // We will only apply this plugin on jsx and tsx files\n if (!['.jsx', '.tsx'].some(ending => idWithoutQueryAndHash.endsWith(ending))) {\n return null;\n }\n\n const parserPlugins: BabelParserPlugins = [];\n if (idWithoutQueryAndHash.endsWith('.jsx')) {\n parserPlugins.push('jsx');\n } else if (idWithoutQueryAndHash.endsWith('.tsx')) {\n parserPlugins.push('jsx', 'typescript');\n }\n\n const { transformAsync, componentNameAnnotatePlugin, experimentalComponentNameAnnotatePlugin } =\n await loadBabelAnnotationRuntime();\n const plugin = injectIntoHtml ? experimentalComponentNameAnnotatePlugin : componentNameAnnotatePlugin;\n\n try {\n const result = await transformAsync(code, {\n plugins: [[plugin, { ignoredComponents }]],\n filename: id,\n sourceFileName: idWithoutQueryAndHash,\n parserOpts: {\n sourceType: 'module',\n allowAwaitOutsideFunction: true,\n plugins: parserPlugins,\n },\n generatorOpts: {\n decoratorsBeforeExport: true,\n },\n sourceMaps: true,\n });\n\n return {\n code: result?.code ?? code,\n map: result?.map,\n };\n } catch (e) {\n debug.error(`Failed to apply react annotate plugin`, e);\n }\n\n return { code };\n },\n };\n}\n\nexport function getDebugIdSnippet(debugId: string): CodeInjection {\n return new CodeInjection(\n `var n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]=\"${debugId}\",e._sentryDebugIdIdentifier=\"sentry-dbid-${debugId}\");`,\n );\n}\n\nexport type { Logger } from './logger';\nexport type { Options, SentrySDKBuildFlags } from './types';\nexport {\n CodeInjection,\n replaceBooleanFlagsInCode,\n stringToUUID,\n generateReleaseInjectorCode,\n generateModuleMetadataInjectorCode,\n} from './utils';\nexport { createSentryBuildPluginManager } from './build-plugin-manager';\nexport { createDebugIdUploadFunction, addDebugIdToEmittedArtifacts, stampDebugId } from './debug-id-upload';\n"],"names":["stripQueryAndHashFromPath","containsOnlyImports","debug","CodeInjection"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
+
const core = require('@sentry/core');
|
|
3
4
|
const utils = require('./utils.js');
|
|
4
5
|
|
|
5
6
|
const SENTRY_SAAS_URL = "https://sentry.io";
|
|
@@ -60,9 +61,10 @@ function normalizeUserOptions(userOptions) {
|
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
+
const vercelEnv = core.getVercelEnv();
|
|
65
|
+
if (options.release.deploy === void 0 && process.env["VERCEL"] && vercelEnv) {
|
|
64
66
|
options.release.deploy = {
|
|
65
|
-
env:
|
|
67
|
+
env: vercelEnv,
|
|
66
68
|
url: process.env["VERCEL_URL"] ? `https://${process.env["VERCEL_URL"]}` : void 0
|
|
67
69
|
};
|
|
68
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-mapping.js","sources":["../../../src/core/options-mapping.ts"],"sourcesContent":["import type { Logger } from './logger';\nimport type {\n Options as UserOptions,\n SetCommitsOptions,\n RewriteSourcesHook,\n ResolveSourceMapHook,\n IncludeEntry,\n ModuleMetadata,\n ModuleMetadataCallback,\n} from './types';\nimport { determineReleaseName } from './utils';\n\nexport type NormalizedOptions = {\n org: string | undefined;\n project: string | string[] | undefined;\n authToken: string | undefined;\n url: string;\n headers: Record<string, string> | undefined;\n debug: boolean;\n silent: boolean;\n errorHandler: ((err: Error) => void) | undefined;\n telemetry: boolean;\n disable: boolean;\n sourcemaps:\n | {\n disable?: boolean | 'disable-upload';\n assets?: string | string[];\n ignore?: string | string[];\n rewriteSources?: RewriteSourcesHook;\n resolveSourceMap?: ResolveSourceMapHook;\n filesToDeleteAfterUpload?: string | string[] | Promise<string | string[] | undefined>;\n }\n | undefined;\n release: {\n name: string | undefined;\n inject: boolean;\n create: boolean;\n finalize: boolean;\n vcsRemote: string;\n setCommits:\n | (SetCommitsOptions & {\n shouldNotThrowOnFailure?: boolean;\n })\n | false\n | undefined;\n dist?: string;\n deploy?:\n | {\n env: string;\n started?: number | string;\n finished?: number | string;\n time?: number;\n name?: string;\n url?: string;\n }\n | false;\n uploadLegacySourcemaps?: string | IncludeEntry | Array<string | IncludeEntry>;\n };\n bundleSizeOptimizations:\n | {\n excludeDebugStatements?: boolean;\n excludeTracing?: boolean;\n excludeChannelInjection?: boolean;\n excludeReplayCanvas?: boolean;\n excludeReplayShadowDom?: boolean;\n excludeReplayIframe?: boolean;\n excludeReplayWorker?: boolean;\n }\n | undefined;\n reactComponentAnnotation:\n | {\n enabled?: boolean;\n ignoredComponents?: string[];\n _experimentalInjectIntoHtml?: boolean;\n }\n | undefined;\n _metaOptions: {\n telemetry: {\n metaFramework: string | undefined;\n bundlerMajorVersion: string | undefined;\n };\n };\n applicationKey: string | undefined;\n moduleMetadata: ModuleMetadata | ModuleMetadataCallback | undefined;\n _experiments: {\n injectBuildInformation?: boolean;\n } & Record<string, unknown>;\n};\n\nexport const SENTRY_SAAS_URL = 'https://sentry.io';\n\n// oxlint-disable-next-line complexity\nexport function normalizeUserOptions(userOptions: UserOptions): NormalizedOptions {\n const options = {\n org: userOptions.org ?? process.env['SENTRY_ORG'],\n project:\n userOptions.project ??\n (process.env['SENTRY_PROJECT']?.includes(',')\n ? process.env['SENTRY_PROJECT'].split(',').map(p => p.trim())\n : process.env['SENTRY_PROJECT']),\n authToken: userOptions.authToken ?? process.env['SENTRY_AUTH_TOKEN'],\n url: userOptions.url ?? process.env['SENTRY_URL'] ?? SENTRY_SAAS_URL,\n headers: userOptions.headers,\n debug: userOptions.debug ?? false,\n silent: userOptions.silent ?? false,\n errorHandler: userOptions.errorHandler,\n telemetry: userOptions.telemetry ?? true,\n disable: userOptions.disable ?? false,\n sourcemaps: userOptions.sourcemaps,\n release: {\n ...userOptions.release,\n name: userOptions.release?.name ?? process.env['SENTRY_RELEASE'] ?? determineReleaseName(),\n inject: userOptions.release?.inject ?? true,\n create: userOptions.release?.create ?? true,\n finalize: userOptions.release?.finalize ?? true,\n vcsRemote: userOptions.release?.vcsRemote ?? process.env['SENTRY_VSC_REMOTE'] ?? 'origin',\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion -- rule false positive: the cast carries the internal `shouldNotThrowOnFailure` field; tsc errors without it\n setCommits: userOptions.release?.setCommits as\n | (SetCommitsOptions & { shouldNotThrowOnFailure?: boolean })\n | false\n | undefined,\n },\n bundleSizeOptimizations: userOptions.bundleSizeOptimizations,\n reactComponentAnnotation: userOptions.reactComponentAnnotation,\n _metaOptions: {\n telemetry: {\n metaFramework: userOptions._metaOptions?.telemetry?.metaFramework,\n bundlerMajorVersion: userOptions._metaOptions?.telemetry?.bundlerMajorVersion,\n },\n },\n applicationKey: userOptions.applicationKey,\n moduleMetadata: userOptions.moduleMetadata,\n _experiments: userOptions._experiments ?? {},\n };\n\n if (options.release.setCommits === undefined) {\n if (\n process.env['VERCEL'] &&\n process.env['VERCEL_GIT_COMMIT_SHA'] &&\n process.env['VERCEL_GIT_REPO_SLUG'] &&\n process.env['VERCEL_GIT_REPO_OWNER'] &&\n // We only want to set commits for the production env because Sentry becomes extremely noisy (eg on slack) for\n // preview environments because the previous commit is always the \"stem\" commit of the preview/PR causing Sentry\n // to notify you for other people creating PRs.\n process.env['VERCEL_TARGET_ENV'] === 'production'\n ) {\n options.release.setCommits = {\n shouldNotThrowOnFailure: true,\n commit: process.env['VERCEL_GIT_COMMIT_SHA'],\n previousCommit: process.env['VERCEL_GIT_PREVIOUS_SHA'],\n repo: `${process.env['VERCEL_GIT_REPO_OWNER']}/${process.env['VERCEL_GIT_REPO_SLUG']}`,\n ignoreEmpty: true,\n ignoreMissing: true,\n };\n } else {\n options.release.setCommits = {\n shouldNotThrowOnFailure: true,\n auto: true,\n ignoreEmpty: true,\n ignoreMissing: true,\n };\n }\n }\n\n if (options.release.deploy === undefined && process.env['VERCEL'] && process.env['VERCEL_TARGET_ENV']) {\n options.release.deploy = {\n env: `vercel-${process.env['VERCEL_TARGET_ENV']}`,\n url: process.env['VERCEL_URL'] ? `https://${process.env['VERCEL_URL']}` : undefined,\n };\n }\n\n return options;\n}\n\n/**\n * Validates a few combinations of options that are not checked by Sentry CLI.\n *\n * For all other options, we can rely on Sentry CLI to validate them. In fact,\n * we can't validate them in the plugin because Sentry CLI might pick up options from\n * its config file.\n *\n * @param options the internal options\n * @param logger the logger\n *\n * @returns `true` if the options are valid, `false` otherwise\n */\nexport function validateOptions(options: NormalizedOptions, logger: Logger): boolean {\n const setCommits = options.release?.setCommits;\n if (setCommits) {\n if (!setCommits.auto && !(setCommits.repo && setCommits.commit)) {\n logger.error(\n 'The `setCommits` option was specified but is missing required properties.',\n 'Please set either `auto` or both, `repo` and `commit`.',\n );\n return false;\n }\n if (setCommits.auto && setCommits.repo && setCommits) {\n logger.warn(\n 'The `setCommits` options includes `auto` but also `repo` and `commit`.',\n 'Ignoring `repo` and `commit`.',\n 'Please only set either `auto` or both, `repo` and `commit`.',\n );\n }\n }\n\n if (options.release?.deploy && typeof options.release.deploy === 'object' && !options.release.deploy.env) {\n logger.error(\n 'The `deploy` option was specified but is missing the required `env` property.',\n 'Please set the `env` property.',\n );\n return false;\n }\n\n if (options.project && Array.isArray(options.project)) {\n if (options.project.length === 0) {\n logger.error(\n 'The `project` option was specified as an array but is empty.',\n 'Please provide at least one project slug.',\n );\n return false;\n }\n // Check each project is a non-empty string\n const invalidProjects = options.project.filter(p => typeof p !== 'string' || p.trim() === '');\n if (invalidProjects.length > 0) {\n logger.error('The `project` option contains invalid project slugs.', 'All projects must be non-empty strings.');\n return false;\n }\n }\n\n return true;\n}\n"],"names":["determineReleaseName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options-mapping.js","sources":["../../../src/core/options-mapping.ts"],"sourcesContent":["import { getVercelEnv } from '@sentry/core';\nimport type { Logger } from './logger';\nimport type {\n Options as UserOptions,\n SetCommitsOptions,\n RewriteSourcesHook,\n ResolveSourceMapHook,\n IncludeEntry,\n ModuleMetadata,\n ModuleMetadataCallback,\n} from './types';\nimport { determineReleaseName } from './utils';\n\nexport type NormalizedOptions = {\n org: string | undefined;\n project: string | string[] | undefined;\n authToken: string | undefined;\n url: string;\n headers: Record<string, string> | undefined;\n debug: boolean;\n silent: boolean;\n errorHandler: ((err: Error) => void) | undefined;\n telemetry: boolean;\n disable: boolean;\n sourcemaps:\n | {\n disable?: boolean | 'disable-upload';\n assets?: string | string[];\n ignore?: string | string[];\n rewriteSources?: RewriteSourcesHook;\n resolveSourceMap?: ResolveSourceMapHook;\n filesToDeleteAfterUpload?: string | string[] | Promise<string | string[] | undefined>;\n }\n | undefined;\n release: {\n name: string | undefined;\n inject: boolean;\n create: boolean;\n finalize: boolean;\n vcsRemote: string;\n setCommits:\n | (SetCommitsOptions & {\n shouldNotThrowOnFailure?: boolean;\n })\n | false\n | undefined;\n dist?: string;\n deploy?:\n | {\n env: string;\n started?: number | string;\n finished?: number | string;\n time?: number;\n name?: string;\n url?: string;\n }\n | false;\n uploadLegacySourcemaps?: string | IncludeEntry | Array<string | IncludeEntry>;\n };\n bundleSizeOptimizations:\n | {\n excludeDebugStatements?: boolean;\n excludeTracing?: boolean;\n excludeChannelInjection?: boolean;\n excludeReplayCanvas?: boolean;\n excludeReplayShadowDom?: boolean;\n excludeReplayIframe?: boolean;\n excludeReplayWorker?: boolean;\n }\n | undefined;\n reactComponentAnnotation:\n | {\n enabled?: boolean;\n ignoredComponents?: string[];\n _experimentalInjectIntoHtml?: boolean;\n }\n | undefined;\n _metaOptions: {\n telemetry: {\n metaFramework: string | undefined;\n bundlerMajorVersion: string | undefined;\n };\n };\n applicationKey: string | undefined;\n moduleMetadata: ModuleMetadata | ModuleMetadataCallback | undefined;\n _experiments: {\n injectBuildInformation?: boolean;\n } & Record<string, unknown>;\n};\n\nexport const SENTRY_SAAS_URL = 'https://sentry.io';\n\n// oxlint-disable-next-line complexity\nexport function normalizeUserOptions(userOptions: UserOptions): NormalizedOptions {\n const options = {\n org: userOptions.org ?? process.env['SENTRY_ORG'],\n project:\n userOptions.project ??\n (process.env['SENTRY_PROJECT']?.includes(',')\n ? process.env['SENTRY_PROJECT'].split(',').map(p => p.trim())\n : process.env['SENTRY_PROJECT']),\n authToken: userOptions.authToken ?? process.env['SENTRY_AUTH_TOKEN'],\n url: userOptions.url ?? process.env['SENTRY_URL'] ?? SENTRY_SAAS_URL,\n headers: userOptions.headers,\n debug: userOptions.debug ?? false,\n silent: userOptions.silent ?? false,\n errorHandler: userOptions.errorHandler,\n telemetry: userOptions.telemetry ?? true,\n disable: userOptions.disable ?? false,\n sourcemaps: userOptions.sourcemaps,\n release: {\n ...userOptions.release,\n name: userOptions.release?.name ?? process.env['SENTRY_RELEASE'] ?? determineReleaseName(),\n inject: userOptions.release?.inject ?? true,\n create: userOptions.release?.create ?? true,\n finalize: userOptions.release?.finalize ?? true,\n vcsRemote: userOptions.release?.vcsRemote ?? process.env['SENTRY_VSC_REMOTE'] ?? 'origin',\n // oxlint-disable-next-line typescript/no-unnecessary-type-assertion -- rule false positive: the cast carries the internal `shouldNotThrowOnFailure` field; tsc errors without it\n setCommits: userOptions.release?.setCommits as\n | (SetCommitsOptions & { shouldNotThrowOnFailure?: boolean })\n | false\n | undefined,\n },\n bundleSizeOptimizations: userOptions.bundleSizeOptimizations,\n reactComponentAnnotation: userOptions.reactComponentAnnotation,\n _metaOptions: {\n telemetry: {\n metaFramework: userOptions._metaOptions?.telemetry?.metaFramework,\n bundlerMajorVersion: userOptions._metaOptions?.telemetry?.bundlerMajorVersion,\n },\n },\n applicationKey: userOptions.applicationKey,\n moduleMetadata: userOptions.moduleMetadata,\n _experiments: userOptions._experiments ?? {},\n };\n\n if (options.release.setCommits === undefined) {\n if (\n process.env['VERCEL'] &&\n process.env['VERCEL_GIT_COMMIT_SHA'] &&\n process.env['VERCEL_GIT_REPO_SLUG'] &&\n process.env['VERCEL_GIT_REPO_OWNER'] &&\n // We only want to set commits for the production env because Sentry becomes extremely noisy (eg on slack) for\n // preview environments because the previous commit is always the \"stem\" commit of the preview/PR causing Sentry\n // to notify you for other people creating PRs.\n process.env['VERCEL_TARGET_ENV'] === 'production'\n ) {\n options.release.setCommits = {\n shouldNotThrowOnFailure: true,\n commit: process.env['VERCEL_GIT_COMMIT_SHA'],\n previousCommit: process.env['VERCEL_GIT_PREVIOUS_SHA'],\n repo: `${process.env['VERCEL_GIT_REPO_OWNER']}/${process.env['VERCEL_GIT_REPO_SLUG']}`,\n ignoreEmpty: true,\n ignoreMissing: true,\n };\n } else {\n options.release.setCommits = {\n shouldNotThrowOnFailure: true,\n auto: true,\n ignoreEmpty: true,\n ignoreMissing: true,\n };\n }\n }\n\n const vercelEnv = getVercelEnv();\n if (options.release.deploy === undefined && process.env['VERCEL'] && vercelEnv) {\n options.release.deploy = {\n env: vercelEnv,\n url: process.env['VERCEL_URL'] ? `https://${process.env['VERCEL_URL']}` : undefined,\n };\n }\n\n return options;\n}\n\n/**\n * Validates a few combinations of options that are not checked by Sentry CLI.\n *\n * For all other options, we can rely on Sentry CLI to validate them. In fact,\n * we can't validate them in the plugin because Sentry CLI might pick up options from\n * its config file.\n *\n * @param options the internal options\n * @param logger the logger\n *\n * @returns `true` if the options are valid, `false` otherwise\n */\nexport function validateOptions(options: NormalizedOptions, logger: Logger): boolean {\n const setCommits = options.release?.setCommits;\n if (setCommits) {\n if (!setCommits.auto && !(setCommits.repo && setCommits.commit)) {\n logger.error(\n 'The `setCommits` option was specified but is missing required properties.',\n 'Please set either `auto` or both, `repo` and `commit`.',\n );\n return false;\n }\n if (setCommits.auto && setCommits.repo && setCommits) {\n logger.warn(\n 'The `setCommits` options includes `auto` but also `repo` and `commit`.',\n 'Ignoring `repo` and `commit`.',\n 'Please only set either `auto` or both, `repo` and `commit`.',\n );\n }\n }\n\n if (options.release?.deploy && typeof options.release.deploy === 'object' && !options.release.deploy.env) {\n logger.error(\n 'The `deploy` option was specified but is missing the required `env` property.',\n 'Please set the `env` property.',\n );\n return false;\n }\n\n if (options.project && Array.isArray(options.project)) {\n if (options.project.length === 0) {\n logger.error(\n 'The `project` option was specified as an array but is empty.',\n 'Please provide at least one project slug.',\n );\n return false;\n }\n // Check each project is a non-empty string\n const invalidProjects = options.project.filter(p => typeof p !== 'string' || p.trim() === '');\n if (invalidProjects.length > 0) {\n logger.error('The `project` option contains invalid project slugs.', 'All projects must be non-empty strings.');\n return false;\n }\n }\n\n return true;\n}\n"],"names":["determineReleaseName","getVercelEnv"],"mappings":"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"}
|
package/build/cjs/core/utils.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
2
|
|
|
3
|
-
const findUp = require('find-up');
|
|
4
3
|
const path = require('path');
|
|
5
4
|
const fs = require('fs');
|
|
6
5
|
const os = require('os');
|
|
@@ -10,7 +9,6 @@ const MagicString = require('magic-string');
|
|
|
10
9
|
|
|
11
10
|
const _interopDefault = e => e && e.__esModule ? e.default : e;
|
|
12
11
|
|
|
13
|
-
const findUp__default = /*#__PURE__*/_interopDefault(findUp);
|
|
14
12
|
const path__default = /*#__PURE__*/_interopDefault(path);
|
|
15
13
|
const fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
16
14
|
const os__default = /*#__PURE__*/_interopDefault(os);
|
|
@@ -100,16 +98,25 @@ function getDependencies(packageJson) {
|
|
|
100
98
|
);
|
|
101
99
|
return { deps, depsVersions };
|
|
102
100
|
}
|
|
101
|
+
function findPackageJson(cwd, stopAt) {
|
|
102
|
+
let dirName = path__default.resolve(cwd);
|
|
103
|
+
for (; ; ) {
|
|
104
|
+
if (path__default.normalize(dirName) === stopAt) {
|
|
105
|
+
return void 0;
|
|
106
|
+
}
|
|
107
|
+
const jsonPath = path__default.join(dirName, "package.json");
|
|
108
|
+
if (fs__default.existsSync(jsonPath)) {
|
|
109
|
+
return jsonPath;
|
|
110
|
+
}
|
|
111
|
+
const parentDirName = path__default.dirname(dirName);
|
|
112
|
+
if (parentDirName === dirName) {
|
|
113
|
+
return void 0;
|
|
114
|
+
}
|
|
115
|
+
dirName = parentDirName;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
103
118
|
function lookupPackageJson(cwd, stopAt) {
|
|
104
|
-
const jsonPath =
|
|
105
|
-
(dirName) => {
|
|
106
|
-
if (path__default.normalize(dirName) === stopAt) {
|
|
107
|
-
return findUp__default.stop;
|
|
108
|
-
}
|
|
109
|
-
return findUp__default.sync.exists(`${dirName}/package.json`) ? "package.json" : void 0;
|
|
110
|
-
},
|
|
111
|
-
{ cwd }
|
|
112
|
-
);
|
|
119
|
+
const jsonPath = findPackageJson(cwd, stopAt);
|
|
113
120
|
if (!jsonPath) {
|
|
114
121
|
return void 0;
|
|
115
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/core/utils.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport findUp from 'find-up';\nimport path from 'path';\nimport fs from 'fs';\nimport os from 'os';\nimport crypto from 'crypto';\nimport childProcess from 'child_process';\nimport type { SourceMap } from 'magic-string';\nimport MagicString from 'magic-string';\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n */\nexport function arrayify<T = unknown>(maybeArray: T | T[]): T[] {\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\ntype PackageJson = Record<string, unknown>;\n\n/**\n * Get the closes package.json from a given starting point upwards.\n * This handles a few edge cases:\n * * Check if a given file package.json appears to be an actual NPM package.json file\n * * Stop at the home dir, to avoid looking too deeply\n */\nexport function getPackageJson({ cwd, stopAt }: { cwd?: string; stopAt?: string } = {}): PackageJson | undefined {\n return lookupPackageJson(cwd ?? process.cwd(), path.normalize(stopAt ?? os.homedir()));\n}\n\nexport function parseMajorVersion(ver: string): number | undefined {\n let version = ver;\n // if it has a `v` prefix, remove it\n if (version.startsWith('v')) {\n version = version.slice(1);\n }\n\n // First, try simple lookup of exact, ~ and ^ versions\n const regex = /^[\\^~]?(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n\n const match = version.match(regex);\n if (match) {\n return parseInt(match[1] as string, 10);\n }\n\n // Try to parse e.g. 1.x\n const coerced = parseInt(version, 10);\n if (!Number.isNaN(coerced)) {\n return coerced;\n }\n\n // Match <= and >= ranges.\n const gteLteRegex = /^[<>]=\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const gteLteMatch = version.match(gteLteRegex);\n if (gteLteMatch) {\n return parseInt(gteLteMatch[1] as string, 10);\n }\n\n // match < ranges\n const ltRegex = /^<\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const ltMatch = version.match(ltRegex);\n if (ltMatch) {\n // Two scenarios:\n // a) < 2.0.0 --> return 1\n // b) < 2.1.0 --> return 2\n\n const major = parseInt(ltMatch[1] as string, 10);\n\n if (\n // minor version > 0\n (typeof ltMatch[2] === 'string' && parseInt(ltMatch[2].slice(1), 10) > 0) ||\n // patch version > 0\n (typeof ltMatch[3] === 'string' && parseInt(ltMatch[3].slice(1), 10) > 0)\n ) {\n return major;\n }\n\n return major - 1;\n }\n\n // match > ranges\n const gtRegex = /^>\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const gtMatch = version.match(gtRegex);\n if (gtMatch) {\n // We always return the version here, even though it _may_ be incorrect\n // E.g. if given > 2.0.0, it should be 2 if there exists any 2.x.x version, else 3\n // Since there is no way for us to know this, we're going to assume any kind of patch/feature release probably exists\n return parseInt(gtMatch[1] as string, 10);\n }\n return undefined;\n}\n\n// This is an explicit list of packages where we want to include the (major) version number.\nconst PACKAGES_TO_INCLUDE_VERSION = [\n 'react',\n '@angular/core',\n 'vue',\n 'ember-source',\n 'svelte',\n '@sveltejs/kit',\n 'webpack',\n 'vite',\n 'gatsby',\n 'next',\n 'remix',\n 'rollup',\n 'esbuild',\n];\n\nexport function getDependencies(packageJson: PackageJson): {\n deps: string[];\n depsVersions: Record<string, number>;\n} {\n const dependencies: Record<string, string> = Object.assign(\n {},\n packageJson['devDependencies'] ?? {},\n packageJson['dependencies'] ?? {},\n );\n\n const deps = Object.keys(dependencies).sort();\n\n const depsVersions: Record<string, number> = deps.reduce(\n (depsVersions, depName) => {\n if (PACKAGES_TO_INCLUDE_VERSION.includes(depName)) {\n const version = dependencies[depName] as string;\n const majorVersion = parseMajorVersion(version);\n if (majorVersion) {\n depsVersions[depName] = majorVersion;\n }\n }\n return depsVersions;\n },\n {} as Record<string, number>,\n );\n\n return { deps, depsVersions };\n}\n\nfunction lookupPackageJson(cwd: string, stopAt: string): PackageJson | undefined {\n const jsonPath = findUp.sync(\n dirName => {\n // Stop if we reach this dir\n if (path.normalize(dirName) === stopAt) {\n return findUp.stop;\n }\n\n return findUp.sync.exists(`${dirName}/package.json`) ? 'package.json' : undefined;\n },\n { cwd },\n );\n\n if (!jsonPath) {\n return undefined;\n }\n\n try {\n const jsonStr = fs.readFileSync(jsonPath, 'utf8');\n const json = JSON.parse(jsonStr) as PackageJson;\n\n // Ensure it is an actual package.json\n // This is very much not bulletproof, but should be good enough\n if ('name' in json || 'private' in json) {\n return json;\n }\n } catch {\n // Ignore and walk up\n }\n\n // Continue up the tree, if we find a fitting package.json\n const newCwd = path.dirname(path.resolve(`${jsonPath}/..`));\n return lookupPackageJson(newCwd, stopAt);\n}\n\n/**\n * Deterministically hashes a string and turns the hash into a uuid.\n */\nexport function stringToUUID(str: string): string {\n const sha256Hash = crypto.createHash('sha256').update(str).digest('hex');\n\n // Position 16 is fixed to either 8, 9, a, or b in the uuid v4 spec (10xx in binary)\n // RFC 4122 section 4.4\n const v4variant = ['8', '9', 'a', 'b'][sha256Hash.substring(16, 17).charCodeAt(0) % 4] as string;\n\n return `${sha256Hash.substring(0, 8)}-${sha256Hash.substring(8, 12)}-4${sha256Hash.substring(13, 16)}-${v4variant}${sha256Hash.substring(17, 20)}-${sha256Hash.substring(20, 32)}`.toLowerCase();\n}\n\nfunction gitRevision(): string | undefined {\n let gitRevision: string | undefined;\n try {\n gitRevision = childProcess\n .execSync('git rev-parse HEAD', { stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true })\n .toString()\n .trim();\n } catch {\n // noop\n }\n return gitRevision;\n}\n\n/**\n * Tries to guess a release name based on environmental data.\n */\n// oxlint-disable-next-line complexity\nexport function determineReleaseName(): string | undefined {\n // This list is in approximate alpha order, separated into 3 categories:\n // 1. Git providers\n // 2. CI providers with specific environment variables (has the provider name in the variable name)\n // 3. CI providers with generic environment variables (checked for last to prevent possible false positives)\n\n const possibleReleaseNameOfGitProvider =\n // GitHub Actions - https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables\n process.env['GITHUB_SHA'] ||\n // GitLab CI - https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n process.env['CI_MERGE_REQUEST_SOURCE_BRANCH_SHA'] ||\n process.env['CI_BUILD_REF'] ||\n process.env['CI_COMMIT_SHA'] ||\n // Bitbucket - https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/\n process.env['BITBUCKET_COMMIT'];\n\n const possibleReleaseNameOfCiProvidersWithSpecificEnvVar =\n // AppVeyor - https://www.appveyor.com/docs/environment-variables/\n process.env['APPVEYOR_PULL_REQUEST_HEAD_COMMIT'] ||\n process.env['APPVEYOR_REPO_COMMIT'] ||\n // AWS CodeBuild - https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html\n process.env['CODEBUILD_RESOLVED_SOURCE_VERSION'] ||\n // AWS Amplify - https://docs.aws.amazon.com/amplify/latest/userguide/environment-variables.html\n process.env['AWS_COMMIT_ID'] ||\n // Azure Pipelines - https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml\n process.env['BUILD_SOURCEVERSION'] ||\n // Bitrise - https://devcenter.bitrise.io/builds/available-environment-variables/\n process.env['GIT_CLONE_COMMIT_HASH'] ||\n // Buddy CI - https://buddy.works/docs/pipelines/environment-variables#default-environment-variables\n process.env['BUDDY_EXECUTION_REVISION'] ||\n // Builtkite - https://buildkite.com/docs/pipelines/environment-variables\n process.env['BUILDKITE_COMMIT'] ||\n // CircleCI - https://circleci.com/docs/variables/\n process.env['CIRCLE_SHA1'] ||\n // Cirrus CI - https://cirrus-ci.org/guide/writing-tasks/#environment-variables\n process.env['CIRRUS_CHANGE_IN_REPO'] ||\n // Codefresh - https://codefresh.io/docs/docs/codefresh-yaml/variables/\n process.env['CF_REVISION'] ||\n // Codemagic - https://docs.codemagic.io/yaml-basic-configuration/environment-variables/\n process.env['CM_COMMIT'] ||\n // Cloudflare Pages - https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables\n process.env['CF_PAGES_COMMIT_SHA'] ||\n // Drone - https://docs.drone.io/pipeline/environment/reference/\n process.env['DRONE_COMMIT_SHA'] ||\n // Flightcontrol - https://www.flightcontrol.dev/docs/guides/flightcontrol/environment-variables#built-in-environment-variables\n process.env['FC_GIT_COMMIT_SHA'] ||\n // Heroku #1 https://devcenter.heroku.com/articles/heroku-ci\n process.env['HEROKU_TEST_RUN_COMMIT_VERSION'] ||\n // Heroku #2 https://docs.sentry.io/product/integrations/deployment/heroku/#configure-releases\n process.env['HEROKU_SLUG_COMMIT'] ||\n // Railway - https://docs.railway.app/reference/variables#git-variables\n process.env['RAILWAY_GIT_COMMIT_SHA'] ||\n // Render - https://render.com/docs/environment-variables\n process.env['RENDER_GIT_COMMIT'] ||\n // Semaphore CI - https://docs.semaphoreci.com/ci-cd-environment/environment-variables\n process.env['SEMAPHORE_GIT_SHA'] ||\n // TravisCI - https://docs.travis-ci.com/user/environment-variables/#default-environment-variables\n process.env['TRAVIS_PULL_REQUEST_SHA'] ||\n // Vercel - https://vercel.com/docs/v2/build-step#system-environment-variables\n process.env['VERCEL_GIT_COMMIT_SHA'] ||\n process.env['VERCEL_GITHUB_COMMIT_SHA'] ||\n process.env['VERCEL_GITLAB_COMMIT_SHA'] ||\n process.env['VERCEL_BITBUCKET_COMMIT_SHA'] ||\n // Zeit (now known as Vercel)\n process.env['ZEIT_GITHUB_COMMIT_SHA'] ||\n process.env['ZEIT_GITLAB_COMMIT_SHA'] ||\n process.env['ZEIT_BITBUCKET_COMMIT_SHA'];\n\n const possibleReleaseNameOfCiProvidersWithGenericEnvVar =\n // CloudBees CodeShip - https://docs.cloudbees.com/docs/cloudbees-codeship/latest/pro-builds-and-configuration/environment-variables\n process.env['CI_COMMIT_ID'] ||\n // Coolify - https://coolify.io/docs/knowledge-base/environment-variables\n process.env['SOURCE_COMMIT'] ||\n // Heroku #3 https://devcenter.heroku.com/changelog-items/630\n process.env['SOURCE_VERSION'] ||\n // Jenkins - https://plugins.jenkins.io/git/#environment-variables\n process.env['GIT_COMMIT'] ||\n // Netlify - https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n process.env['COMMIT_REF'] ||\n // TeamCity - https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html\n process.env['BUILD_VCS_NUMBER'] ||\n // Woodpecker CI - https://woodpecker-ci.org/docs/usage/environment\n process.env['CI_COMMIT_SHA'];\n\n return (\n possibleReleaseNameOfGitProvider ||\n possibleReleaseNameOfCiProvidersWithSpecificEnvVar ||\n possibleReleaseNameOfCiProvidersWithGenericEnvVar ||\n gitRevision()\n );\n}\n\n/**\n * Generates code for the global injector which is responsible for setting the global\n * `SENTRY_RELEASE` & `SENTRY_BUILD_INFO` variables.\n */\nexport function generateReleaseInjectorCode({\n release,\n injectBuildInformation,\n}: {\n release: string;\n injectBuildInformation: boolean;\n}): CodeInjection {\n let code = `e.SENTRY_RELEASE={id:${JSON.stringify(release)}};`;\n\n if (injectBuildInformation) {\n const buildInfo = getBuildInformation();\n\n code += `e.SENTRY_BUILD_INFO=${JSON.stringify(buildInfo)};`;\n }\n\n return new CodeInjection(code);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generateModuleMetadataInjectorCode(metadata: any): CodeInjection {\n // We are merging the metadata objects in case modules are bundled twice with the plugin\n // Use try-catch to avoid issues when bundlers rename global variables like 'window' to 'k'\n return new CodeInjection(\n `e._sentryModuleMetadata=e._sentryModuleMetadata||{},e._sentryModuleMetadata[(new e.Error).stack]=function(e){for(var n=1;n<arguments.length;n++){var a=arguments[n];if(null!=a)for(var t in a)a.hasOwnProperty(t)&&(e[t]=a[t])}return e}({},e._sentryModuleMetadata[(new e.Error).stack],${JSON.stringify(\n metadata,\n )});`,\n );\n}\n\nexport function getBuildInformation(): {\n deps: string[];\n depsVersions: Record<string, number>;\n nodeVersion: number | undefined;\n} {\n const packageJson = getPackageJson();\n\n const { deps, depsVersions } = packageJson ? getDependencies(packageJson) : { deps: [], depsVersions: {} };\n\n return {\n deps,\n depsVersions,\n nodeVersion: parseMajorVersion(process.version),\n };\n}\n\nexport function stripQueryAndHashFromPath(path: string): string {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return path.split('?')[0]!.split('#')[0]!;\n}\n\nexport function replaceBooleanFlagsInCode(\n code: string,\n replacementValues: Record<string, boolean | undefined>,\n): { code: string; map: SourceMap } | null {\n const ms = new MagicString(code);\n\n Object.keys(replacementValues).forEach(key => {\n const value = replacementValues[key];\n\n if (typeof value === 'boolean') {\n ms.replaceAll(key, JSON.stringify(value));\n }\n });\n\n if (ms.hasChanged()) {\n return {\n code: ms.toString(),\n map: ms.generateMap({ hires: 'boundary' }),\n };\n }\n\n return null;\n}\n\n// https://turbo.build/repo/docs/reference/system-environment-variables#environment-variables-in-tasks\nexport function getTurborepoEnvPassthroughWarning(envVarName: string): string {\n return process.env['TURBO_HASH']\n ? `\\nYou seem to be using Turborepo, did you forget to put ${envVarName} in \\`passThroughEnv\\`? https://turbo.build/repo/docs/reference/configuration#passthroughenv`\n : '';\n}\n\n/**\n * Gets the projects from the project option. This might be a single project or an array of projects.\n */\nexport function getProjects(project: string | string[] | undefined): string[] | undefined {\n if (Array.isArray(project)) {\n return project;\n }\n\n if (project) {\n return [project];\n }\n\n return undefined;\n}\n\n/**\n * Checks if a chunk contains only import/export statements and no substantial code.\n *\n * In Vite MPA (multi-page application) mode, HTML entry points create \"facade\" chunks\n * that only contain import statements to load shared modules. These should not have\n * Sentry code injected. However, in SPA mode, the main bundle also has an HTML facade\n * but contains substantial application code that SHOULD have debug IDs injected.\n *\n * @ref https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/829\n * @ref https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/839\n */\nexport function containsOnlyImports(code: string): boolean {\n const codeWithoutImports = code\n // Remove side effect imports: import '/path'; or import \"./path\";\n // Using explicit negated character classes to avoid polynomial backtracking\n .replace(/^\\s*import\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove named/default imports: import x from '/path'; import { x } from '/path';\n .replace(/^\\s*import\\b[^'\"`\\n]*\\bfrom\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove re-exports: export * from '/path'; export { x } from '/path';\n .replace(/^\\s*export\\b[^'\"`\\n]*\\bfrom\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove block comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Remove line comments\n .replace(/\\/\\/.*$/gm, '')\n // Remove \"use strict\" directives\n .replace(/[\"']use strict[\"']\\s*;?/g, '')\n .trim();\n\n return codeWithoutImports.length === 0;\n}\n\nexport class CodeInjection {\n // The code below is mostly ternary operators because it saves bundle size.\n // The checks are to support as many environments as possible. (Node.js, Browser, webworkers, etc.)\n private readonly header: string;\n private readonly footer: string;\n\n constructor(private body: string = '') {\n this.header = `!function(){try{var e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:{};`;\n this.footer = '}catch(e){}}();';\n }\n\n public code(): string {\n if (this.isEmpty()) {\n return '';\n }\n\n return this.header + this.body + this.footer;\n }\n\n public isEmpty(): boolean {\n return this.body.length === 0;\n }\n\n public append(code: CodeInjection | string): void {\n if (code instanceof CodeInjection) {\n this.body += code.body;\n } else {\n this.body += code;\n }\n }\n\n public clear(): void {\n this.body = '';\n }\n\n public clone(): CodeInjection {\n return new CodeInjection(this.body);\n }\n}\n"],"names":["path","os","depsVersions","findUp","fs","crypto","gitRevision","childProcess","MagicString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/core/utils.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport path from 'path';\nimport fs from 'fs';\nimport os from 'os';\nimport crypto from 'crypto';\nimport childProcess from 'child_process';\nimport type { SourceMap } from 'magic-string';\nimport MagicString from 'magic-string';\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n */\nexport function arrayify<T = unknown>(maybeArray: T | T[]): T[] {\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\ntype PackageJson = Record<string, unknown>;\n\n/**\n * Get the closes package.json from a given starting point upwards.\n * This handles a few edge cases:\n * * Check if a given file package.json appears to be an actual NPM package.json file\n * * Stop at the home dir, to avoid looking too deeply\n */\nexport function getPackageJson({ cwd, stopAt }: { cwd?: string; stopAt?: string } = {}): PackageJson | undefined {\n return lookupPackageJson(cwd ?? process.cwd(), path.normalize(stopAt ?? os.homedir()));\n}\n\nexport function parseMajorVersion(ver: string): number | undefined {\n let version = ver;\n // if it has a `v` prefix, remove it\n if (version.startsWith('v')) {\n version = version.slice(1);\n }\n\n // First, try simple lookup of exact, ~ and ^ versions\n const regex = /^[\\^~]?(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n\n const match = version.match(regex);\n if (match) {\n return parseInt(match[1] as string, 10);\n }\n\n // Try to parse e.g. 1.x\n const coerced = parseInt(version, 10);\n if (!Number.isNaN(coerced)) {\n return coerced;\n }\n\n // Match <= and >= ranges.\n const gteLteRegex = /^[<>]=\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const gteLteMatch = version.match(gteLteRegex);\n if (gteLteMatch) {\n return parseInt(gteLteMatch[1] as string, 10);\n }\n\n // match < ranges\n const ltRegex = /^<\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const ltMatch = version.match(ltRegex);\n if (ltMatch) {\n // Two scenarios:\n // a) < 2.0.0 --> return 1\n // b) < 2.1.0 --> return 2\n\n const major = parseInt(ltMatch[1] as string, 10);\n\n if (\n // minor version > 0\n (typeof ltMatch[2] === 'string' && parseInt(ltMatch[2].slice(1), 10) > 0) ||\n // patch version > 0\n (typeof ltMatch[3] === 'string' && parseInt(ltMatch[3].slice(1), 10) > 0)\n ) {\n return major;\n }\n\n return major - 1;\n }\n\n // match > ranges\n const gtRegex = /^>\\s*(\\d+)(\\.\\d+)?(\\.\\d+)?(-.+)?/;\n const gtMatch = version.match(gtRegex);\n if (gtMatch) {\n // We always return the version here, even though it _may_ be incorrect\n // E.g. if given > 2.0.0, it should be 2 if there exists any 2.x.x version, else 3\n // Since there is no way for us to know this, we're going to assume any kind of patch/feature release probably exists\n return parseInt(gtMatch[1] as string, 10);\n }\n return undefined;\n}\n\n// This is an explicit list of packages where we want to include the (major) version number.\nconst PACKAGES_TO_INCLUDE_VERSION = [\n 'react',\n '@angular/core',\n 'vue',\n 'ember-source',\n 'svelte',\n '@sveltejs/kit',\n 'webpack',\n 'vite',\n 'gatsby',\n 'next',\n 'remix',\n 'rollup',\n 'esbuild',\n];\n\nexport function getDependencies(packageJson: PackageJson): {\n deps: string[];\n depsVersions: Record<string, number>;\n} {\n const dependencies: Record<string, string> = Object.assign(\n {},\n packageJson['devDependencies'] ?? {},\n packageJson['dependencies'] ?? {},\n );\n\n const deps = Object.keys(dependencies).sort();\n\n const depsVersions: Record<string, number> = deps.reduce(\n (depsVersions, depName) => {\n if (PACKAGES_TO_INCLUDE_VERSION.includes(depName)) {\n const version = dependencies[depName] as string;\n const majorVersion = parseMajorVersion(version);\n if (majorVersion) {\n depsVersions[depName] = majorVersion;\n }\n }\n return depsVersions;\n },\n {} as Record<string, number>,\n );\n\n return { deps, depsVersions };\n}\n\nfunction findPackageJson(cwd: string, stopAt: string): string | undefined {\n let dirName = path.resolve(cwd);\n\n for (;;) {\n // Stop if we reach this dir\n if (path.normalize(dirName) === stopAt) {\n return undefined;\n }\n\n const jsonPath = path.join(dirName, 'package.json');\n if (fs.existsSync(jsonPath)) {\n return jsonPath;\n }\n\n const parentDirName = path.dirname(dirName);\n // We reached the file system root\n if (parentDirName === dirName) {\n return undefined;\n }\n\n dirName = parentDirName;\n }\n}\n\nfunction lookupPackageJson(cwd: string, stopAt: string): PackageJson | undefined {\n const jsonPath = findPackageJson(cwd, stopAt);\n\n if (!jsonPath) {\n return undefined;\n }\n\n try {\n const jsonStr = fs.readFileSync(jsonPath, 'utf8');\n const json = JSON.parse(jsonStr) as PackageJson;\n\n // Ensure it is an actual package.json\n // This is very much not bulletproof, but should be good enough\n if ('name' in json || 'private' in json) {\n return json;\n }\n } catch {\n // Ignore and walk up\n }\n\n // Continue up the tree, if we find a fitting package.json\n const newCwd = path.dirname(path.resolve(`${jsonPath}/..`));\n return lookupPackageJson(newCwd, stopAt);\n}\n\n/**\n * Deterministically hashes a string and turns the hash into a uuid.\n */\nexport function stringToUUID(str: string): string {\n const sha256Hash = crypto.createHash('sha256').update(str).digest('hex');\n\n // Position 16 is fixed to either 8, 9, a, or b in the uuid v4 spec (10xx in binary)\n // RFC 4122 section 4.4\n const v4variant = ['8', '9', 'a', 'b'][sha256Hash.substring(16, 17).charCodeAt(0) % 4] as string;\n\n return `${sha256Hash.substring(0, 8)}-${sha256Hash.substring(8, 12)}-4${sha256Hash.substring(13, 16)}-${v4variant}${sha256Hash.substring(17, 20)}-${sha256Hash.substring(20, 32)}`.toLowerCase();\n}\n\nfunction gitRevision(): string | undefined {\n let gitRevision: string | undefined;\n try {\n gitRevision = childProcess\n .execSync('git rev-parse HEAD', { stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true })\n .toString()\n .trim();\n } catch {\n // noop\n }\n return gitRevision;\n}\n\n/**\n * Tries to guess a release name based on environmental data.\n */\n// oxlint-disable-next-line complexity\nexport function determineReleaseName(): string | undefined {\n // This list is in approximate alpha order, separated into 3 categories:\n // 1. Git providers\n // 2. CI providers with specific environment variables (has the provider name in the variable name)\n // 3. CI providers with generic environment variables (checked for last to prevent possible false positives)\n\n const possibleReleaseNameOfGitProvider =\n // GitHub Actions - https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables\n process.env['GITHUB_SHA'] ||\n // GitLab CI - https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n process.env['CI_MERGE_REQUEST_SOURCE_BRANCH_SHA'] ||\n process.env['CI_BUILD_REF'] ||\n process.env['CI_COMMIT_SHA'] ||\n // Bitbucket - https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/\n process.env['BITBUCKET_COMMIT'];\n\n const possibleReleaseNameOfCiProvidersWithSpecificEnvVar =\n // AppVeyor - https://www.appveyor.com/docs/environment-variables/\n process.env['APPVEYOR_PULL_REQUEST_HEAD_COMMIT'] ||\n process.env['APPVEYOR_REPO_COMMIT'] ||\n // AWS CodeBuild - https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html\n process.env['CODEBUILD_RESOLVED_SOURCE_VERSION'] ||\n // AWS Amplify - https://docs.aws.amazon.com/amplify/latest/userguide/environment-variables.html\n process.env['AWS_COMMIT_ID'] ||\n // Azure Pipelines - https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml\n process.env['BUILD_SOURCEVERSION'] ||\n // Bitrise - https://devcenter.bitrise.io/builds/available-environment-variables/\n process.env['GIT_CLONE_COMMIT_HASH'] ||\n // Buddy CI - https://buddy.works/docs/pipelines/environment-variables#default-environment-variables\n process.env['BUDDY_EXECUTION_REVISION'] ||\n // Builtkite - https://buildkite.com/docs/pipelines/environment-variables\n process.env['BUILDKITE_COMMIT'] ||\n // CircleCI - https://circleci.com/docs/variables/\n process.env['CIRCLE_SHA1'] ||\n // Cirrus CI - https://cirrus-ci.org/guide/writing-tasks/#environment-variables\n process.env['CIRRUS_CHANGE_IN_REPO'] ||\n // Codefresh - https://codefresh.io/docs/docs/codefresh-yaml/variables/\n process.env['CF_REVISION'] ||\n // Codemagic - https://docs.codemagic.io/yaml-basic-configuration/environment-variables/\n process.env['CM_COMMIT'] ||\n // Cloudflare Pages - https://developers.cloudflare.com/pages/platform/build-configuration/#environment-variables\n process.env['CF_PAGES_COMMIT_SHA'] ||\n // Drone - https://docs.drone.io/pipeline/environment/reference/\n process.env['DRONE_COMMIT_SHA'] ||\n // Flightcontrol - https://www.flightcontrol.dev/docs/guides/flightcontrol/environment-variables#built-in-environment-variables\n process.env['FC_GIT_COMMIT_SHA'] ||\n // Heroku #1 https://devcenter.heroku.com/articles/heroku-ci\n process.env['HEROKU_TEST_RUN_COMMIT_VERSION'] ||\n // Heroku #2 https://docs.sentry.io/product/integrations/deployment/heroku/#configure-releases\n process.env['HEROKU_SLUG_COMMIT'] ||\n // Railway - https://docs.railway.app/reference/variables#git-variables\n process.env['RAILWAY_GIT_COMMIT_SHA'] ||\n // Render - https://render.com/docs/environment-variables\n process.env['RENDER_GIT_COMMIT'] ||\n // Semaphore CI - https://docs.semaphoreci.com/ci-cd-environment/environment-variables\n process.env['SEMAPHORE_GIT_SHA'] ||\n // TravisCI - https://docs.travis-ci.com/user/environment-variables/#default-environment-variables\n process.env['TRAVIS_PULL_REQUEST_SHA'] ||\n // Vercel - https://vercel.com/docs/v2/build-step#system-environment-variables\n process.env['VERCEL_GIT_COMMIT_SHA'] ||\n process.env['VERCEL_GITHUB_COMMIT_SHA'] ||\n process.env['VERCEL_GITLAB_COMMIT_SHA'] ||\n process.env['VERCEL_BITBUCKET_COMMIT_SHA'] ||\n // Zeit (now known as Vercel)\n process.env['ZEIT_GITHUB_COMMIT_SHA'] ||\n process.env['ZEIT_GITLAB_COMMIT_SHA'] ||\n process.env['ZEIT_BITBUCKET_COMMIT_SHA'];\n\n const possibleReleaseNameOfCiProvidersWithGenericEnvVar =\n // CloudBees CodeShip - https://docs.cloudbees.com/docs/cloudbees-codeship/latest/pro-builds-and-configuration/environment-variables\n process.env['CI_COMMIT_ID'] ||\n // Coolify - https://coolify.io/docs/knowledge-base/environment-variables\n process.env['SOURCE_COMMIT'] ||\n // Heroku #3 https://devcenter.heroku.com/changelog-items/630\n process.env['SOURCE_VERSION'] ||\n // Jenkins - https://plugins.jenkins.io/git/#environment-variables\n process.env['GIT_COMMIT'] ||\n // Netlify - https://docs.netlify.com/configure-builds/environment-variables/#build-metadata\n process.env['COMMIT_REF'] ||\n // TeamCity - https://www.jetbrains.com/help/teamcity/predefined-build-parameters.html\n process.env['BUILD_VCS_NUMBER'] ||\n // Woodpecker CI - https://woodpecker-ci.org/docs/usage/environment\n process.env['CI_COMMIT_SHA'];\n\n return (\n possibleReleaseNameOfGitProvider ||\n possibleReleaseNameOfCiProvidersWithSpecificEnvVar ||\n possibleReleaseNameOfCiProvidersWithGenericEnvVar ||\n gitRevision()\n );\n}\n\n/**\n * Generates code for the global injector which is responsible for setting the global\n * `SENTRY_RELEASE` & `SENTRY_BUILD_INFO` variables.\n */\nexport function generateReleaseInjectorCode({\n release,\n injectBuildInformation,\n}: {\n release: string;\n injectBuildInformation: boolean;\n}): CodeInjection {\n let code = `e.SENTRY_RELEASE={id:${JSON.stringify(release)}};`;\n\n if (injectBuildInformation) {\n const buildInfo = getBuildInformation();\n\n code += `e.SENTRY_BUILD_INFO=${JSON.stringify(buildInfo)};`;\n }\n\n return new CodeInjection(code);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generateModuleMetadataInjectorCode(metadata: any): CodeInjection {\n // We are merging the metadata objects in case modules are bundled twice with the plugin\n // Use try-catch to avoid issues when bundlers rename global variables like 'window' to 'k'\n return new CodeInjection(\n `e._sentryModuleMetadata=e._sentryModuleMetadata||{},e._sentryModuleMetadata[(new e.Error).stack]=function(e){for(var n=1;n<arguments.length;n++){var a=arguments[n];if(null!=a)for(var t in a)a.hasOwnProperty(t)&&(e[t]=a[t])}return e}({},e._sentryModuleMetadata[(new e.Error).stack],${JSON.stringify(\n metadata,\n )});`,\n );\n}\n\nexport function getBuildInformation(): {\n deps: string[];\n depsVersions: Record<string, number>;\n nodeVersion: number | undefined;\n} {\n const packageJson = getPackageJson();\n\n const { deps, depsVersions } = packageJson ? getDependencies(packageJson) : { deps: [], depsVersions: {} };\n\n return {\n deps,\n depsVersions,\n nodeVersion: parseMajorVersion(process.version),\n };\n}\n\nexport function stripQueryAndHashFromPath(path: string): string {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return path.split('?')[0]!.split('#')[0]!;\n}\n\nexport function replaceBooleanFlagsInCode(\n code: string,\n replacementValues: Record<string, boolean | undefined>,\n): { code: string; map: SourceMap } | null {\n const ms = new MagicString(code);\n\n Object.keys(replacementValues).forEach(key => {\n const value = replacementValues[key];\n\n if (typeof value === 'boolean') {\n ms.replaceAll(key, JSON.stringify(value));\n }\n });\n\n if (ms.hasChanged()) {\n return {\n code: ms.toString(),\n map: ms.generateMap({ hires: 'boundary' }),\n };\n }\n\n return null;\n}\n\n// https://turbo.build/repo/docs/reference/system-environment-variables#environment-variables-in-tasks\nexport function getTurborepoEnvPassthroughWarning(envVarName: string): string {\n return process.env['TURBO_HASH']\n ? `\\nYou seem to be using Turborepo, did you forget to put ${envVarName} in \\`passThroughEnv\\`? https://turbo.build/repo/docs/reference/configuration#passthroughenv`\n : '';\n}\n\n/**\n * Gets the projects from the project option. This might be a single project or an array of projects.\n */\nexport function getProjects(project: string | string[] | undefined): string[] | undefined {\n if (Array.isArray(project)) {\n return project;\n }\n\n if (project) {\n return [project];\n }\n\n return undefined;\n}\n\n/**\n * Checks if a chunk contains only import/export statements and no substantial code.\n *\n * In Vite MPA (multi-page application) mode, HTML entry points create \"facade\" chunks\n * that only contain import statements to load shared modules. These should not have\n * Sentry code injected. However, in SPA mode, the main bundle also has an HTML facade\n * but contains substantial application code that SHOULD have debug IDs injected.\n *\n * @ref https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/829\n * @ref https://github.com/getsentry/sentry-javascript-bundler-plugins/issues/839\n */\nexport function containsOnlyImports(code: string): boolean {\n const codeWithoutImports = code\n // Remove side effect imports: import '/path'; or import \"./path\";\n // Using explicit negated character classes to avoid polynomial backtracking\n .replace(/^\\s*import\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove named/default imports: import x from '/path'; import { x } from '/path';\n .replace(/^\\s*import\\b[^'\"`\\n]*\\bfrom\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove re-exports: export * from '/path'; export { x } from '/path';\n .replace(/^\\s*export\\b[^'\"`\\n]*\\bfrom\\s+(?:'[^'\\n]*'|\"[^\"\\n]*\"|`[^`\\n]*`)[\\s;]*$/gm, '')\n // Remove block comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Remove line comments\n .replace(/\\/\\/.*$/gm, '')\n // Remove \"use strict\" directives\n .replace(/[\"']use strict[\"']\\s*;?/g, '')\n .trim();\n\n return codeWithoutImports.length === 0;\n}\n\nexport class CodeInjection {\n // The code below is mostly ternary operators because it saves bundle size.\n // The checks are to support as many environments as possible. (Node.js, Browser, webworkers, etc.)\n private readonly header: string;\n private readonly footer: string;\n\n constructor(private body: string = '') {\n this.header = `!function(){try{var e=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:{};`;\n this.footer = '}catch(e){}}();';\n }\n\n public code(): string {\n if (this.isEmpty()) {\n return '';\n }\n\n return this.header + this.body + this.footer;\n }\n\n public isEmpty(): boolean {\n return this.body.length === 0;\n }\n\n public append(code: CodeInjection | string): void {\n if (code instanceof CodeInjection) {\n this.body += code.body;\n } else {\n this.body += code;\n }\n }\n\n public clear(): void {\n this.body = '';\n }\n\n public clone(): CodeInjection {\n return new CodeInjection(this.body);\n }\n}\n"],"names":["path","os","depsVersions","fs","crypto","gitRevision","childProcess","MagicString"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sources":["../../../src/core/version.ts"],"sourcesContent":["export const LIB_VERSION = \"11.0.0-
|
|
1
|
+
{"version":3,"file":"version.js","sources":["../../../src/core/version.ts"],"sourcesContent":["export const LIB_VERSION = \"11.0.0-rc.0\";\n"],"names":[],"mappings":";;AAAO,MAAM,WAAA,GAAc;;;;"}
|
|
@@ -189,9 +189,24 @@ function sentryEsbuildPlugin(userOptions = {}) {
|
|
|
189
189
|
onEnd(async (result) => {
|
|
190
190
|
try {
|
|
191
191
|
await sentryBuildPluginManager.createRelease();
|
|
192
|
-
if (sourcemapsEnabled
|
|
192
|
+
if (sourcemapsEnabled) {
|
|
193
193
|
const buildArtifacts = result.metafile ? Object.keys(result.metafile.outputs) : [];
|
|
194
|
-
|
|
194
|
+
if (options.sourcemaps?.disable !== "disable-upload") {
|
|
195
|
+
await upload(buildArtifacts);
|
|
196
|
+
} else if (initialOptions.write === false) {
|
|
197
|
+
logger.debug("Build output is not written to disk. Skipping debug ID injection into build artifacts.");
|
|
198
|
+
} else {
|
|
199
|
+
const outputDir = initialOptions.absWorkingDir ?? process.cwd();
|
|
200
|
+
await Promise.all(
|
|
201
|
+
buildArtifacts.filter(index.isJsFile).map(
|
|
202
|
+
(bundle) => debugIdUpload.addDebugIdToEmittedArtifacts(
|
|
203
|
+
path__namespace.resolve(outputDir, bundle),
|
|
204
|
+
logger,
|
|
205
|
+
options.sourcemaps?.resolveSourceMap
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
);
|
|
209
|
+
}
|
|
195
210
|
}
|
|
196
211
|
} finally {
|
|
197
212
|
freeGlobalDependencyOnBuildArtifacts();
|