fix: source map decoding

This commit is contained in:
2025-05-22 14:20:29 +03:00
parent a4c09b6cd6
commit fd8b0b7cbe

View File

@@ -1,10 +1,11 @@
const map: number[] = []; function decodeBase64(val: number) {
let j = 0; if (val >= 65 && val <= 90) return val - 65;
else if (val >= 97 && val <= 122) return val - 97 + 26;
for (let i = 65; i <= 90; i++) map[i] = j++; else if (val >= 48 && val <= 57) return val - 48 + 52;
for (let i = 97; i <= 122; i++) map[i] = j++; else if (val == 43) return 62;
map[43] = j++; else if (val == 47) return 63;
map[47] = j++; else throw "Invalid Base64 char";
}
export function decodeVLQ(val: string): number[][][] { export function decodeVLQ(val: string): number[][][] {
const lines: number[][][] = []; const lines: number[][][] = [];
@@ -30,14 +31,14 @@ export function decodeVLQ(val: string): number[][][] {
for (let i = 0; i < el.length;) { for (let i = 0; i < el.length;) {
let sign = 1; let sign = 1;
let curr = map[el.charCodeAt(i++)]; let curr = decodeBase64(el.charCodeAt(i++));
let cont = (curr & 0x20) === 0x20; let cont = (curr & 0x20) === 0x20;
if ((curr & 1) === 1) sign = -1; if ((curr & 1) === 1) sign = -1;
let res = (curr & 0b11110) >> 1; let res = (curr & 0b11110) >> 1;
let n = 4; let n = 4;
for (; i < el.length && cont;) { for (; i < el.length && cont;) {
curr = map[el.charCodeAt(i++)]; curr = decodeBase64(el.charCodeAt(i++));
cont = (curr & 0x20) == 0x20; cont = (curr & 0x20) == 0x20;
res |= (curr & 0b11111) << n; res |= (curr & 0b11111) << n;
n += 5; n += 5;
@@ -99,7 +100,7 @@ export class VLQSourceMap {
while (true) { while (true) {
const done = b - a <= 1; const done = b - a <= 1;
const mid = (a + b) >> 1; const mid = (a + b) >> 1;
const el = line[mid]; const el = line[mid];
@@ -134,7 +135,6 @@ export class VLQSourceMap {
let originalRow = 0; let originalRow = 0;
let originalCol = 0; let originalCol = 0;
let originalFile = 0; let originalFile = 0;
const lastCols = new Set<number>();
for (let compiledRow = 0; compiledRow < mapping.length; compiledRow++) { for (let compiledRow = 0; compiledRow < mapping.length; compiledRow++) {
const line: [start: number, dst: Location][] = file[compiledRow] = []; const line: [start: number, dst: Location][] = file[compiledRow] = [];
@@ -149,10 +149,7 @@ export class VLQSourceMap {
originalRow += rawSeg.length > 2 ? rawSeg[2] : 0; originalRow += rawSeg.length > 2 ? rawSeg[2] : 0;
originalCol += rawSeg.length > 3 ? rawSeg[3] : 0; originalCol += rawSeg.length > 3 ? rawSeg[3] : 0;
if (!lastCols.has(compiledCol)) { line[line.length] = [compiledCol, [filenames[originalFile], originalRow, originalCol]];
line[line.length] = [compiledCol, [filenames[originalFile], originalRow, originalCol]];
}
lastCols.add(compiledCol);
} }
line.sort((a, b) => a[0] - b[0]); line.sort((a, b) => a[0] - b[0]);