diff options
author | 2023-08-23 22:55:18 -0700 | |
---|---|---|
committer | 2023-08-24 20:11:20 -0700 | |
commit | 526f7d85416b7310a1fa7b9886f8bb645df3695c (patch) | |
tree | 67e011981486fbe2668561881e7260cd38d1cecf /packages/bun-debug-adapter-protocol/debugger/sourcemap.ts | |
parent | df6cca0fc26521fb0b4c5fd6dfdc16c0b7eca478 (diff) | |
download | bun-526f7d85416b7310a1fa7b9886f8bb645df3695c.tar.gz bun-526f7d85416b7310a1fa7b9886f8bb645df3695c.tar.zst bun-526f7d85416b7310a1fa7b9886f8bb645df3695c.zip |
Fix source maps partly
Diffstat (limited to 'packages/bun-debug-adapter-protocol/debugger/sourcemap.ts')
-rw-r--r-- | packages/bun-debug-adapter-protocol/debugger/sourcemap.ts | 78 |
1 files changed, 49 insertions, 29 deletions
diff --git a/packages/bun-debug-adapter-protocol/debugger/sourcemap.ts b/packages/bun-debug-adapter-protocol/debugger/sourcemap.ts index 1e04e56f4..eeceb520f 100644 --- a/packages/bun-debug-adapter-protocol/debugger/sourcemap.ts +++ b/packages/bun-debug-adapter-protocol/debugger/sourcemap.ts @@ -1,13 +1,13 @@ import { SourceMapConsumer } from "source-map-js"; -export type Position = { +export type Location = { line: number; column: number; }; export interface SourceMap { - generatedPosition(line?: number, column?: number, url?: string): Position; - originalPosition(line?: number, column?: number): Position; + generatedLocation(line?: number, column?: number, url?: string): Location; + originalLocation(line?: number, column?: number): Location; } class ActualSourceMap implements SourceMap { @@ -16,8 +16,7 @@ class ActualSourceMap implements SourceMap { constructor(sourceMap: SourceMapConsumer) { this.#sourceMap = sourceMap; - // @ts-ignore - this.#sources = sourceMap._absoluteSources; + this.#sources = (sourceMap as any)._absoluteSources; } #getSource(url?: string): string { @@ -36,61 +35,61 @@ class ActualSourceMap implements SourceMap { return ""; } - generatedPosition(line?: number, column?: number, url?: string): Position { + generatedLocation(line?: number, column?: number, url?: string): Location { try { const source = this.#getSource(url); const { line: gline, column: gcolumn } = this.#sourceMap.generatedPositionFor({ - line: line ?? 0, - column: column ?? 0, + line: lineTo1BasedLine(line), + column: columnToColumn(column), source, }); console.log(`[sourcemap] -->`, { source, url, line, column }, { gline, gcolumn }); return { - line: gline || 0, - column: gcolumn || 0, + line: lineTo0BasedLine(gline), + column: columnToColumn(gcolumn), }; } catch (error) { - console.error(error); + console.warn(error); return { - line: line || 0, - column: column || 0, + line: lineToLine(line), + column: columnToColumn(column), }; } } - originalPosition(line?: number, column?: number): Position { + originalLocation(line?: number, column?: number): Location { try { const { line: oline, column: ocolumn } = this.#sourceMap.originalPositionFor({ - line: line ?? 0, - column: column ?? 0, + line: lineTo1BasedLine(line), + column: columnToColumn(column), }); console.log(`[sourcemap] <--`, { line, column }, { oline, ocolumn }); return { - line: oline || 0, - column: ocolumn || 0, + line: lineTo0BasedLine(oline), + column: columnToColumn(ocolumn), }; } catch (error) { - console.error(error); + console.warn(error); return { - line: line || 0, - column: column || 0, + line: lineToLine(line), + column: columnToColumn(column), }; } } } class NoopSourceMap implements SourceMap { - generatedPosition(line?: number, column?: number, url?: string): Position { + generatedLocation(line?: number, column?: number, url?: string): Location { return { - line: line ?? 0, - column: column ?? 0, + line: lineToLine(line), + column: columnToColumn(column), }; } - originalPosition(line?: number, column?: number): Position { + originalLocation(line?: number, column?: number): Location { return { - line: line ?? 0, - column: column ?? 0, + line: lineToLine(line), + column: columnToColumn(column), }; } } @@ -103,11 +102,32 @@ export function SourceMap(url?: string): SourceMap { } try { const [_, base64] = url.split(",", 2); - const decoded = Buffer.from(base64, "base64").toString("utf8"); - const sourceMap = new SourceMapConsumer(JSON.parse(decoded)); + const decoded = Buffer.from(base64, "base64url").toString("utf8"); + const schema = JSON.parse(decoded); + // HACK: Bun is sometimes sending invalid mappings + try { + schema.mappings = schema.mappings.replace(/[^a-z,;]/gi, "").slice(1); + } catch {} + 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 line ? line + 1 : 1; +} + +function lineTo0BasedLine(line?: number): number { + return line ? line - 1 : 0; +} + +function lineToLine(line?: number): number { + return line ?? 0; +} + +function columnToColumn(column?: number): number { + return column ?? 0; +} |