import type { LineRange, MappedPosition } from "source-map-js"; import { SourceMapConsumer } from "source-map-js"; export type LocationRequest = { line?: number; column?: number; url?: string; }; export type Location = { line: number; // 0-based column: number; // 0-based } & ( | { verified: true; } | { verified?: false; message?: string; } ); export interface SourceMap { generatedLocation(request: LocationRequest): Location; originalLocation(request: LocationRequest): Location; } class ActualSourceMap implements SourceMap { #sourceMap: SourceMapConsumer; #sources: string[]; constructor(sourceMap: SourceMapConsumer) { this.#sourceMap = sourceMap; this.#sources = (sourceMap as any)._absoluteSources; } #getSource(url?: string): string { const sources = this.#sources; if (!sources.length) { return ""; } if (sources.length === 1 || !url) { return sources[0]; } for (const source of sources) { if (url.endsWith(source)) { return source; } } return ""; } generatedLocation(request: LocationRequest): Location { const { line, column, url } = request; let lineRange: LineRange; try { const source = this.#getSource(url); lineRange = this.#sourceMap.generatedPositionFor({ line: lineTo1BasedLine(line), column: columnToColumn(column), source, }); } catch (error) { return { line: lineToLine(line), column: columnToColumn(column), verified: false, message: unknownToError(error), }; } if (!locationIsValid(lineRange)) { return { line: lineToLine(line), column: columnToColumn(column), verified: false, }; } const { line: gline, column: gcolumn } = lineRange; return { line: lineTo0BasedLine(gline), column: columnToColumn(gcolumn), verified: true, }; } originalLocation(request: LocationRequest): Location { const { line, column } = request; let mappedPosition: MappedPosition; try { mappedPosition = this.#sourceMap.originalPositionFor({ line: lineTo1BasedLine(line), column: columnToColumn(column), }); } catch (error) { return { line: lineToLine(line), column: columnToColumn(column), verified: false, message: unknownToError(error), }; } if (!locationIsValid(mappedPosition)) { return { line: lineToLine(line), column: columnToColumn(column), verified: false, }; } const { line: oline, column: ocolumn } = mappedPosition; return { line: lineTo0BasedLine(oline), column: columnToColumn(ocolumn), verified: true, }; } } class NoopSourceMap implements SourceMap { generatedLocation(request: LocationRequest): Location { const { line, column } = request; return { line: lineToLine(line), column: columnToColumn(column), verified: true, }; } originalLocation(request: LocationRequest): Location { const { line, column } = request; return { line: lineToLine(line), column: columnToColumn(column), verified: true, }; } } const defaultSourceMap = new NoopSourceMap(); export function SourceMap(url?: string): SourceMap { if (!url) { return defaultSourceMap; } if (!url.startsWith("data:")) { const match = url.match(/\/\/[#@]\s*sourceMappingURL=(.*)$/m); if (!match) { return defaultSourceMap; } const [_, sourceMapUrl] = match; url = sourceMapUrl; } try { const [_, base64] = url.split(",", 2); const decoded = Buffer.from(base64, "base64url").toString("utf8"); const schema = JSON.parse(decoded); const sourceMap = new SourceMapConsumer(schema); return new ActualSourceMap(sourceMap); } catch (error) { console.warn("Failed to parse source map URL", url); } return defaultSourceMap; } function lineTo1BasedLine(line?: number): number { return numberIsValid(line) ? line + 1 : 1; } function lineTo0BasedLine(line?: number): number { return numberIsValid(line) ? line - 1 : 0; } function lineToLine(line?: number): number { return numberIsValid(line) ? line : 0; } function columnToColumn(column?: number): number { return numberIsValid(column) ? column : 0; } function locationIsValid(location: Location): location is Location { const { line, column } = location; return numberIsValid(line) && numberIsValid(column); } function numberIsValid(number?: number): number is number { return typeof number === "number" && isFinite(number) && number >= 0; } function unknownToError(error: unknown): string { if (error instanceof Error) { const { message } = error; return message; } return String(error); } ='feat/ecosystem'>feat/ecosystem Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/build.zig (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2022-11-07[bun:test] Rejected promises should cause tests to failGravatar Jarred Sumner 1-0/+9
2022-11-07[bun:test] Implement `done` callback with support for async functionsGravatar Jarred Sumner 7-19/+284
2022-11-07[bun:test] Implement `expect` in faster Zig bindingsGravatar Jarred Sumner 12-2742/+4175
2022-11-07[bindings generator] Support cached values that do not correspond to properti...Gravatar Jarred Sumner 2-80/+144
2022-11-07Handle types which do not support getting an objectGravatar Jarred Sumner 1-1/+52
2022-11-07Fix UAF in canaryGravatar Jarred Sumner 5-81/+100
2022-11-06BumpGravatar Jarred Sumner 2-1/+3
2022-11-06Automatically install npm packages when running a script in Bun's runtime (#1...Gravatar Jarred Sumner 35-1786/+5529
2022-11-06chore: remove space lookalike (#1465)Gravatar Carter Snook 2-2/+2
2022-11-06Fixes https://github.com/oven-sh/bun/issues/1451Gravatar Jarred Sumner 1-1/+7
2022-11-06Add way to explicitly coercion object to int32Gravatar Jarred Sumner 11-18/+55
2022-11-06Fix symbol error with `make headers`Gravatar Jarred Sumner 1-0/+3
2022-11-06Fix bug when passing ABI Types as integersGravatar Jarred Sumner 1-3/+5
2022-11-06Fixes https://github.com/oven-sh/bun/issues/1462Gravatar Jarred Sumner 2-4/+28
2022-11-06UndoGravatar Jarred Sumner 4-59/+12
2022-11-06Update action.ymlGravatar Jarred Sumner 1-1/+0
2022-11-06PrettierGravatar Jarred Sumner 1-1/+1
2022-11-06Pass `tar -C`Gravatar Jarred Sumner 4-6/+53
2022-11-06[TypeScript] Fix `export = value`Gravatar Jarred Sumner 2-0/+5
2022-11-06Fix artifact name, use tarballGravatar Jarred Sumner 3-12/+11
2022-11-06Try tarballGravatar Jarred Sumner 1-4/+4
2022-11-06Try againGravatar Jarred Sumner 4-0/+4
2022-11-06Node12 is deprecatedGravatar Jarred Sumner 4-28/+32
2022-11-06feat(child_process): add node:child_process polyfill (#1424)Gravatar Derrick Farris 4-3/+2756
2022-11-06fix(subprocess): fix typo in spawnSync (#1464)Gravatar Derrick Farris 1-2/+2
2022-11-05Fix fetch api to accept stringifier object (#1460)Gravatar zhiyuan 2-11/+25
2022-11-03Fix crash in setTimeout/setIntervalGravatar Jarred Sumner 1-0/+5
2022-11-03Fix incorrect exit codeGravatar Jarred Sumner 1-9/+15
2022-11-03Fix crash when reading promise value wihtout checking if nullGravatar Jarred Sumner 1-0/+1
2022-11-03Fix `which` not handling absolute paths to a binGravatar Jarred Sumner 1-3/+20
2022-11-03Fix `cmd not found in $PATH` printing raw structGravatar Jarred Sumner 1-1/+1
2022-11-03Delete unused fileGravatar Jarred Sumner 1-97/+0
2022-11-03Add minified prod build of react-dom/server.bun (#1458)Gravatar Colin McDonnell 2-6819/+138
2022-11-03chore: remove unecessary files (#1457)Gravatar Hyro 2-118/+0
2022-11-03Introduce `import.meta.primordials` for builtin JSGravatar Jarred Sumner 5-3/+95