aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-debug-adapter-protocol/debugger/sourcemap.ts
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--packages/bun-debug-adapter-protocol/debugger/sourcemap.ts78
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;
+}