sourcemap-codec.mjs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. // src/vlq.ts
  2. var comma = ",".charCodeAt(0);
  3. var semicolon = ";".charCodeAt(0);
  4. var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  5. var intToChar = new Uint8Array(64);
  6. var charToInt = new Uint8Array(128);
  7. for (let i = 0; i < chars.length; i++) {
  8. const c = chars.charCodeAt(i);
  9. intToChar[i] = c;
  10. charToInt[c] = i;
  11. }
  12. function decodeInteger(reader) {
  13. let value = 0;
  14. let shift = 0;
  15. let integer = 0;
  16. do {
  17. const c = reader.next();
  18. integer = charToInt[c];
  19. value |= (integer & 31) << shift;
  20. shift += 5;
  21. } while (integer & 32);
  22. return value;
  23. }
  24. function decodeSign(num) {
  25. return num & 1 ? -2147483648 | -(num >>> 1) : num >>> 1;
  26. }
  27. function encodeInteger(builder, num) {
  28. do {
  29. let clamped = num & 31;
  30. num >>>= 5;
  31. if (num > 0) clamped |= 32;
  32. builder.write(intToChar[clamped]);
  33. } while (num > 0);
  34. }
  35. function encodeSign(num) {
  36. return num < 0 ? -num << 1 | 1 : num << 1;
  37. }
  38. function hasMoreVlq(reader, max) {
  39. if (reader.pos >= max) return false;
  40. return reader.peek() !== comma;
  41. }
  42. // src/strings.ts
  43. var bufLength = 1024 * 16;
  44. var td = typeof TextDecoder !== "undefined" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== "undefined" ? {
  45. decode(buf) {
  46. const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
  47. return out.toString();
  48. }
  49. } : {
  50. decode(buf) {
  51. let out = "";
  52. for (let i = 0; i < buf.length; i++) {
  53. out += String.fromCharCode(buf[i]);
  54. }
  55. return out;
  56. }
  57. };
  58. var StringWriter = class {
  59. constructor() {
  60. this.pos = 0;
  61. this.out = "";
  62. this.buffer = new Uint8Array(bufLength);
  63. }
  64. write(v) {
  65. const { buffer } = this;
  66. buffer[this.pos++] = v;
  67. if (this.pos === bufLength) {
  68. this.out += td.decode(buffer);
  69. this.pos = 0;
  70. }
  71. }
  72. flush() {
  73. const { buffer, out, pos } = this;
  74. return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;
  75. }
  76. };
  77. var StringReader = class {
  78. constructor(buffer) {
  79. this.pos = 0;
  80. this.buffer = buffer;
  81. }
  82. next() {
  83. return this.buffer.charCodeAt(this.pos++);
  84. }
  85. peek() {
  86. return this.buffer.charCodeAt(this.pos);
  87. }
  88. indexOf(char) {
  89. const { buffer, pos } = this;
  90. const idx = buffer.indexOf(char, pos);
  91. return idx === -1 ? buffer.length : idx;
  92. }
  93. };
  94. // src/scopes.ts
  95. var EMPTY = [];
  96. function decodeOriginalScopes(input) {
  97. const { length } = input;
  98. const reader = new StringReader(input);
  99. const scopes = [];
  100. const stack = [];
  101. let line = 0;
  102. for (; reader.pos < length; reader.pos++) {
  103. line += decodeSign(decodeInteger(reader));
  104. const column = decodeSign(decodeInteger(reader));
  105. if (!hasMoreVlq(reader, length)) {
  106. const last = stack.pop();
  107. last[2] = line;
  108. last[3] = column;
  109. continue;
  110. }
  111. const kind = decodeSign(decodeInteger(reader));
  112. const fields = decodeSign(decodeInteger(reader));
  113. const hasName = fields & 1;
  114. const scope = hasName ? [line, column, 0, 0, kind, decodeSign(decodeInteger(reader))] : [line, column, 0, 0, kind];
  115. let vars = EMPTY;
  116. if (hasMoreVlq(reader, length)) {
  117. vars = [];
  118. do {
  119. const varsIndex = decodeSign(decodeInteger(reader));
  120. vars.push(varsIndex);
  121. } while (hasMoreVlq(reader, length));
  122. }
  123. scope.vars = vars;
  124. scopes.push(scope);
  125. stack.push(scope);
  126. }
  127. return scopes;
  128. }
  129. function encodeOriginalScopes(scopes) {
  130. const writer = new StringWriter();
  131. for (let i = 0; i < scopes.length; ) {
  132. i = _encodeOriginalScopes(scopes, i, writer, [0]);
  133. }
  134. return writer.flush();
  135. }
  136. function _encodeOriginalScopes(scopes, index, writer, state) {
  137. const scope = scopes[index];
  138. const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;
  139. if (index > 0) writer.write(comma);
  140. encodeInteger(writer, encodeSign(startLine - state[0]));
  141. state[0] = startLine;
  142. encodeInteger(writer, encodeSign(startColumn));
  143. encodeInteger(writer, encodeSign(kind));
  144. const fields = scope.length === 6 ? 1 : 0;
  145. encodeInteger(writer, encodeSign(fields));
  146. if (scope.length === 6) encodeInteger(writer, encodeSign(scope[5]));
  147. for (const v of vars) {
  148. encodeInteger(writer, encodeSign(v));
  149. }
  150. for (index++; index < scopes.length; ) {
  151. const next = scopes[index];
  152. const { 0: l, 1: c } = next;
  153. if (l > endLine || l === endLine && c >= endColumn) {
  154. break;
  155. }
  156. index = _encodeOriginalScopes(scopes, index, writer, state);
  157. }
  158. writer.write(comma);
  159. encodeInteger(writer, encodeSign(endLine - state[0]));
  160. state[0] = endLine;
  161. encodeInteger(writer, encodeSign(endColumn));
  162. return index;
  163. }
  164. function decodeGeneratedRanges(input) {
  165. const { length } = input;
  166. const reader = new StringReader(input);
  167. const ranges = [];
  168. const stack = [];
  169. let genLine = 0;
  170. let definitionSourcesIndex = 0;
  171. let definitionScopeIndex = 0;
  172. let callsiteSourcesIndex = 0;
  173. let callsiteLine = 0;
  174. let callsiteColumn = 0;
  175. let bindingLine = 0;
  176. let bindingColumn = 0;
  177. do {
  178. const semi = reader.indexOf(";");
  179. let genColumn = 0;
  180. for (; reader.pos < semi; reader.pos++) {
  181. genColumn += decodeSign(decodeInteger(reader));
  182. if (!hasMoreVlq(reader, semi)) {
  183. const last = stack.pop();
  184. last[2] = genLine;
  185. last[3] = genColumn;
  186. continue;
  187. }
  188. const fields = decodeSign(decodeInteger(reader));
  189. const hasDefinition = fields & 1;
  190. const hasCallsite = fields & 2;
  191. const hasScope = fields & 4;
  192. let callsite = null;
  193. let bindings = EMPTY;
  194. let range;
  195. if (hasDefinition) {
  196. const defSourcesIndex = definitionSourcesIndex + decodeSign(decodeInteger(reader));
  197. definitionScopeIndex = decodeSign(decodeInteger(reader)) + (definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0);
  198. definitionSourcesIndex = defSourcesIndex;
  199. range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];
  200. } else {
  201. range = [genLine, genColumn, 0, 0];
  202. }
  203. range.isScope = !!hasScope;
  204. if (hasCallsite) {
  205. const prevCsi = callsiteSourcesIndex;
  206. const prevLine = callsiteLine;
  207. callsiteSourcesIndex += decodeSign(decodeInteger(reader));
  208. const sameSource = prevCsi === callsiteSourcesIndex;
  209. callsiteLine = (sameSource ? callsiteLine : 0) + decodeSign(decodeInteger(reader));
  210. callsiteColumn = (sameSource && prevLine === callsiteLine ? callsiteColumn : 0) + decodeSign(decodeInteger(reader));
  211. callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];
  212. }
  213. range.callsite = callsite;
  214. if (hasMoreVlq(reader, semi)) {
  215. bindings = [];
  216. do {
  217. bindingLine = genLine;
  218. bindingColumn = genColumn;
  219. const expressionsCount = decodeSign(decodeInteger(reader));
  220. let expressionRanges;
  221. if (expressionsCount < -1) {
  222. expressionRanges = [[decodeSign(decodeInteger(reader))]];
  223. for (let i = -1; i > expressionsCount; i--) {
  224. const prevBl = bindingLine;
  225. bindingLine += decodeSign(decodeInteger(reader));
  226. bindingColumn = (bindingLine === prevBl ? bindingColumn : 0) + decodeSign(decodeInteger(reader));
  227. const expression = decodeSign(decodeInteger(reader));
  228. expressionRanges.push([expression, bindingLine, bindingColumn]);
  229. }
  230. } else {
  231. expressionRanges = [[expressionsCount]];
  232. }
  233. bindings.push(expressionRanges);
  234. } while (hasMoreVlq(reader, semi));
  235. }
  236. range.bindings = bindings;
  237. ranges.push(range);
  238. stack.push(range);
  239. }
  240. genLine++;
  241. reader.pos = semi + 1;
  242. } while (reader.pos < length);
  243. return ranges;
  244. }
  245. function encodeGeneratedRanges(ranges) {
  246. if (ranges.length === 0) return "";
  247. const writer = new StringWriter();
  248. for (let i = 0; i < ranges.length; ) {
  249. i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);
  250. }
  251. return writer.flush();
  252. }
  253. function _encodeGeneratedRanges(ranges, index, writer, state) {
  254. const range = ranges[index];
  255. const {
  256. 0: startLine,
  257. 1: startColumn,
  258. 2: endLine,
  259. 3: endColumn,
  260. isScope,
  261. callsite,
  262. bindings
  263. } = range;
  264. if (state[0] < startLine) {
  265. catchupLine(writer, state[0], startLine);
  266. state[0] = startLine;
  267. state[1] = 0;
  268. } else if (index > 0) {
  269. writer.write(comma);
  270. }
  271. encodeInteger(writer, encodeSign(range[1] - state[1]));
  272. state[1] = range[1];
  273. const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0);
  274. encodeInteger(writer, encodeSign(fields));
  275. if (range.length === 6) {
  276. const { 4: sourcesIndex, 5: scopesIndex } = range;
  277. if (sourcesIndex !== state[2]) {
  278. state[3] = 0;
  279. }
  280. encodeInteger(writer, encodeSign(sourcesIndex - state[2]));
  281. state[2] = sourcesIndex;
  282. encodeInteger(writer, encodeSign(scopesIndex - state[3]));
  283. state[3] = scopesIndex;
  284. }
  285. if (callsite) {
  286. const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;
  287. if (sourcesIndex !== state[4]) {
  288. state[5] = 0;
  289. state[6] = 0;
  290. } else if (callLine !== state[5]) {
  291. state[6] = 0;
  292. }
  293. encodeInteger(writer, encodeSign(sourcesIndex - state[4]));
  294. state[4] = sourcesIndex;
  295. encodeInteger(writer, encodeSign(callLine - state[5]));
  296. state[5] = callLine;
  297. encodeInteger(writer, encodeSign(callColumn - state[6]));
  298. state[6] = callColumn;
  299. }
  300. if (bindings) {
  301. for (const binding of bindings) {
  302. if (binding.length > 1) encodeInteger(writer, encodeSign(-binding.length));
  303. const expression = binding[0][0];
  304. encodeInteger(writer, encodeSign(expression));
  305. let bindingStartLine = startLine;
  306. let bindingStartColumn = startColumn;
  307. for (let i = 1; i < binding.length; i++) {
  308. const expRange = binding[i];
  309. encodeInteger(writer, encodeSign(expRange[1] - bindingStartLine));
  310. bindingStartLine = expRange[1];
  311. encodeInteger(writer, encodeSign(expRange[2] - bindingStartColumn));
  312. bindingStartColumn = expRange[2];
  313. encodeInteger(writer, encodeSign(expRange[0]));
  314. }
  315. }
  316. }
  317. for (index++; index < ranges.length; ) {
  318. const next = ranges[index];
  319. const { 0: l, 1: c } = next;
  320. if (l > endLine || l === endLine && c >= endColumn) {
  321. break;
  322. }
  323. index = _encodeGeneratedRanges(ranges, index, writer, state);
  324. }
  325. if (state[0] < endLine) {
  326. catchupLine(writer, state[0], endLine);
  327. state[0] = endLine;
  328. state[1] = 0;
  329. } else {
  330. writer.write(comma);
  331. }
  332. encodeInteger(writer, encodeSign(endColumn - state[1]));
  333. state[1] = endColumn;
  334. return index;
  335. }
  336. function catchupLine(writer, lastLine, line) {
  337. do {
  338. writer.write(semicolon);
  339. } while (++lastLine < line);
  340. }
  341. // src/range-mappings.ts
  342. function decodeRangeMappings(input) {
  343. const { length } = input;
  344. const reader = new StringReader(input);
  345. const rangeMappings = [];
  346. do {
  347. const semi = reader.indexOf(";");
  348. const indices = [];
  349. let index = 0;
  350. while (reader.pos < semi) {
  351. index += decodeInteger(reader);
  352. indices.push(index);
  353. }
  354. rangeMappings.push(indices);
  355. reader.pos = semi + 1;
  356. } while (reader.pos <= length);
  357. return rangeMappings;
  358. }
  359. function encodeRangeMappings(decoded) {
  360. if (decoded.length === 0) return "";
  361. const writer = new StringWriter();
  362. for (let i = 0; i < decoded.length; i++) {
  363. const indices = decoded[i];
  364. if (i > 0) writer.write(semicolon);
  365. let index = 0;
  366. for (let j = 0; j < indices.length; j++) {
  367. const offset = indices[j];
  368. encodeInteger(writer, offset - index);
  369. index = offset;
  370. }
  371. }
  372. return writer.flush();
  373. }
  374. // src/sourcemap-codec.ts
  375. function decode(mappings) {
  376. const { length } = mappings;
  377. const reader = new StringReader(mappings);
  378. const decoded = [];
  379. let genColumn = 0;
  380. let sourcesIndex = 0;
  381. let sourceLine = 0;
  382. let sourceColumn = 0;
  383. let namesIndex = 0;
  384. do {
  385. const semi = reader.indexOf(";");
  386. const line = [];
  387. let sorted = true;
  388. let lastCol = 0;
  389. genColumn = 0;
  390. while (reader.pos < semi) {
  391. let seg;
  392. genColumn += decodeSign(decodeInteger(reader));
  393. if (genColumn < lastCol) sorted = false;
  394. lastCol = genColumn;
  395. if (hasMoreVlq(reader, semi)) {
  396. sourcesIndex += decodeSign(decodeInteger(reader));
  397. sourceLine += decodeSign(decodeInteger(reader));
  398. sourceColumn += decodeSign(decodeInteger(reader));
  399. if (hasMoreVlq(reader, semi)) {
  400. namesIndex += decodeSign(decodeInteger(reader));
  401. seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];
  402. } else {
  403. seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];
  404. }
  405. } else {
  406. seg = [genColumn];
  407. }
  408. line.push(seg);
  409. reader.pos++;
  410. }
  411. if (!sorted) sort(line);
  412. decoded.push(line);
  413. reader.pos = semi + 1;
  414. } while (reader.pos <= length);
  415. return decoded;
  416. }
  417. function sort(line) {
  418. line.sort(sortComparator);
  419. }
  420. function sortComparator(a, b) {
  421. return a[0] - b[0];
  422. }
  423. function encode(decoded) {
  424. const writer = new StringWriter();
  425. let sourcesIndex = 0;
  426. let sourceLine = 0;
  427. let sourceColumn = 0;
  428. let namesIndex = 0;
  429. for (let i = 0; i < decoded.length; i++) {
  430. const line = decoded[i];
  431. if (i > 0) writer.write(semicolon);
  432. if (line.length === 0) continue;
  433. let genColumn = 0;
  434. for (let j = 0; j < line.length; j++) {
  435. const segment = line[j];
  436. if (j > 0) writer.write(comma);
  437. encodeInteger(writer, encodeSign(segment[0] - genColumn));
  438. genColumn = segment[0];
  439. if (segment.length === 1) continue;
  440. encodeInteger(writer, encodeSign(segment[1] - sourcesIndex));
  441. encodeInteger(writer, encodeSign(segment[2] - sourceLine));
  442. encodeInteger(writer, encodeSign(segment[3] - sourceColumn));
  443. sourcesIndex = segment[1];
  444. sourceLine = segment[2];
  445. sourceColumn = segment[3];
  446. if (segment.length === 4) continue;
  447. encodeInteger(writer, encodeSign(segment[4] - namesIndex));
  448. namesIndex = segment[4];
  449. }
  450. }
  451. return writer.flush();
  452. }
  453. export {
  454. decode,
  455. decodeGeneratedRanges,
  456. decodeOriginalScopes,
  457. decodeRangeMappings,
  458. encode,
  459. encodeGeneratedRanges,
  460. encodeOriginalScopes,
  461. encodeRangeMappings
  462. };
  463. //# sourceMappingURL=sourcemap-codec.mjs.map