sourav-das/stem-separator
3
1import { comma, decodeInteger, encodeInteger, hasMoreVlq, semicolon } from './vlq';2import { StringWriter, StringReader } from './strings';3 4export {5 decodeOriginalScopes,6 encodeOriginalScopes,7 decodeGeneratedRanges,8 encodeGeneratedRanges,9} from './scopes';10export type { OriginalScope, GeneratedRange, CallSite, BindingExpressionRange } from './scopes';11 12export type SourceMapSegment =13 | [number]14 | [number, number, number, number]15 | [number, number, number, number, number];16export type SourceMapLine = SourceMapSegment[];17export type SourceMapMappings = SourceMapLine[];18 19export function decode(mappings: string): SourceMapMappings {20 const { length } = mappings;21 const reader = new StringReader(mappings);22 const decoded: SourceMapMappings = [];23 let genColumn = 0;24 let sourcesIndex = 0;25 let sourceLine = 0;26 let sourceColumn = 0;27 let namesIndex = 0;28 29 do {30 const semi = reader.indexOf(';');31 const line: SourceMapLine = [];32 let sorted = true;33 let lastCol = 0;34 genColumn = 0;35 36 while (reader.pos < semi) {37 let seg: SourceMapSegment;38 39 genColumn = decodeInteger(reader, genColumn);40 if (genColumn < lastCol) sorted = false;41 lastCol = genColumn;42 43 if (hasMoreVlq(reader, semi)) {44 sourcesIndex = decodeInteger(reader, sourcesIndex);45 sourceLine = decodeInteger(reader, sourceLine);46 sourceColumn = decodeInteger(reader, sourceColumn);47 48 if (hasMoreVlq(reader, semi)) {49 namesIndex = decodeInteger(reader, namesIndex);50 seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];51 } else {52 seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];53 }54 } else {55 seg = [genColumn];56 }57 58 line.push(seg);59 reader.pos++;60 }61 62 if (!sorted) sort(line);63 decoded.push(line);64 reader.pos = semi + 1;65 } while (reader.pos <= length);66 67 return decoded;68}69 70function sort(line: SourceMapSegment[]) {71 line.sort(sortComparator);72}73 74function sortComparator(a: SourceMapSegment, b: SourceMapSegment): number {75 return a[0] - b[0];76}77 78export function encode(decoded: SourceMapMappings): string;79export function encode(decoded: Readonly<SourceMapMappings>): string;80export function encode(decoded: Readonly<SourceMapMappings>): string {81 const writer = new StringWriter();82 let sourcesIndex = 0;83 let sourceLine = 0;84 let sourceColumn = 0;85 let namesIndex = 0;86 87 for (let i = 0; i < decoded.length; i++) {88 const line = decoded[i];89 if (i > 0) writer.write(semicolon);90 if (line.length === 0) continue;91 92 let genColumn = 0;93 94 for (let j = 0; j < line.length; j++) {95 const segment = line[j];96 if (j > 0) writer.write(comma);97 98 genColumn = encodeInteger(writer, segment[0], genColumn);99 100 if (segment.length === 1) continue;101 sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);102 sourceLine = encodeInteger(writer, segment[2], sourceLine);103 sourceColumn = encodeInteger(writer, segment[3], sourceColumn);104 105 if (segment.length === 4) continue;106 namesIndex = encodeInteger(writer, segment[4], namesIndex);107 }108 }109 110 return writer.flush();111}112 