lineSourceMap

tcmts.loader.sourcemap.lineSourceMap · #dccvec4j · term · runs anywhere

A source map (v3); sources are as given (paths relative to the generated file).

import { vlq } from "#codebase/tcmts/loader/sourcemap";
import type { LineMapping } from "#codebase/tcmts/loader/sourcemap";

export function lineSourceMap(file: string, mappings: LineMapping[]): string {
  const sources = [...new Set(mappings.map((m) => m.source))];
  const byLine = new Map(mappings.map((m) => [m.line, m]));
  const lastLine = Math.max(-1, ...mappings.map((m) => m.line));
  let prevSource = 0;
  let prevLine = 0;
  let prevCol = 0;
  const lines: string[] = [];
  for (let l = 0; l <= lastLine; l++) {
    const m = byLine.get(l);
    if (!m) {
      lines.push("");
      continue;
    }
    const s = sources.indexOf(m.source);
    let genPrev = 0;
    const segments: string[] = [];
    for (const [gen, col] of m.columns ?? [[0, 0]]) {
      // [generated column, source index delta, source line delta, source column delta]
      segments.push(vlq(gen - genPrev) + vlq(s - prevSource) + vlq(m.sourceLine - prevLine) + vlq(col - prevCol));
      genPrev = gen;
      prevSource = s;
      prevLine = m.sourceLine;
      prevCol = col;
    }
    lines.push(segments.join(","));
  }
  return JSON.stringify({ version: 3, file, sources, names: [], mappings: lines.join(";") });
}

uses

used by