rip-lang 3.15.3 → 3.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
  </p>
10
10
 
11
11
  <p align="center">
12
- <a href="https://github.com/shreeve/rip-lang/commits/main"><img src="https://img.shields.io/badge/version-3.15.3-blue.svg" alt="Version"></a>
12
+ <a href="https://github.com/shreeve/rip-lang/commits/main"><img src="https://img.shields.io/badge/version-3.15.4-blue.svg" alt="Version"></a>
13
13
  <a href="#zero-dependencies"><img src="https://img.shields.io/badge/dependencies-ZERO-brightgreen.svg" alt="Dependencies"></a>
14
14
  <a href="#"><img src="https://img.shields.io/badge/tests-1%2C436%2F1%2C436-brightgreen.svg" alt="Tests"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
package/docs/dist/rip.js CHANGED
@@ -8308,6 +8308,20 @@ if (typeof globalThis !== 'undefined') {
8308
8308
  return JSON.stringify(map);
8309
8309
  }
8310
8310
  }
8311
+ function vlqDecode(str) {
8312
+ const values = [];
8313
+ let i = 0;
8314
+ while (i < str.length) {
8315
+ let value = 0, shift = 0, digit;
8316
+ do {
8317
+ digit = B64.indexOf(str[i++]);
8318
+ value |= (digit & 31) << shift;
8319
+ shift += 5;
8320
+ } while (digit & 32);
8321
+ values.push(value & 1 ? -(value >> 1) : value >> 1);
8322
+ }
8323
+ return values;
8324
+ }
8311
8325
 
8312
8326
  // src/error.js
8313
8327
  class RipError extends Error {
@@ -8880,17 +8894,30 @@ if (typeof globalThis !== 'undefined') {
8880
8894
  this.collectSubExprs(sexpr, subs);
8881
8895
  let codeLines = code.split(`
8882
8896
  `);
8897
+ const lineStarts = [0];
8898
+ for (let i = 0;i < code.length; i++) {
8899
+ if (code.charCodeAt(i) === 10)
8900
+ lineStarts.push(i + 1);
8901
+ }
8902
+ const offsetToLine = (offset) => {
8903
+ let lo = 0, hi = lineStarts.length - 1;
8904
+ while (lo <= hi) {
8905
+ const mid = lo + hi >> 1;
8906
+ if (lineStarts[mid] <= offset)
8907
+ lo = mid + 1;
8908
+ else
8909
+ hi = mid - 1;
8910
+ }
8911
+ return hi;
8912
+ };
8883
8913
  for (let { name, origLine, origCol } of subs) {
8884
8914
  let escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8885
8915
  let re = new RegExp("\\b" + escaped + "\\b", "g");
8886
8916
  let m, bestMatch = null, bestDist = Infinity;
8887
8917
  let origLineInStmt = origLine - stmtOrigLine;
8888
8918
  while ((m = re.exec(code)) !== null) {
8889
- let before = code.substring(0, m.index);
8890
- let nl = before.split(`
8891
- `);
8892
- let genLineInStmt = nl.length - 1;
8893
- let genCol = nl[nl.length - 1].length;
8919
+ const genLineInStmt = offsetToLine(m.index);
8920
+ const genCol = m.index - lineStarts[genLineInStmt];
8894
8921
  let lineText = codeLines[genLineInStmt];
8895
8922
  if (lineText && CodeEmitter._isColInsideString(lineText, genCol))
8896
8923
  continue;
@@ -12452,9 +12479,216 @@ globalThis.zip ??= (...a) => a[0].map((_, i) => a.map(b => b[i]));
12452
12479
  function getComponentRuntime() {
12453
12480
  return new CodeEmitter({}).getComponentRuntime();
12454
12481
  }
12482
+ // src/sourcemap-merge.js
12483
+ var SEPARATOR = `
12484
+ ;
12485
+ `;
12486
+ var SEPARATOR_LINES = 2;
12487
+ function extractMap(js) {
12488
+ const re = /\n?\/\/# sourceMappingURL=data:application\/json(?:;charset=[^;,]+)?;base64,([A-Za-z0-9+/=]+)\s*$/;
12489
+ const m = js.match(re);
12490
+ if (!m)
12491
+ return { js, mapJSON: null };
12492
+ let mapJSON;
12493
+ try {
12494
+ const bin = atob(m[1]);
12495
+ const bytes = new Uint8Array(bin.length);
12496
+ for (let i = 0;i < bin.length; i++)
12497
+ bytes[i] = bin.charCodeAt(i);
12498
+ mapJSON = new TextDecoder().decode(bytes);
12499
+ } catch {
12500
+ return { js: js.slice(0, m.index), mapJSON: null };
12501
+ }
12502
+ return { js: js.slice(0, m.index), mapJSON };
12503
+ }
12504
+ function countNewlines(str2) {
12505
+ let n = 0;
12506
+ for (let i = 0;i < str2.length; i++)
12507
+ if (str2.charCodeAt(i) === 10)
12508
+ n++;
12509
+ return n;
12510
+ }
12511
+ function decodeMappings(mappingsStr) {
12512
+ const lines = mappingsStr.split(";");
12513
+ const result = [];
12514
+ let src = 0, origLine = 0, origCol = 0, nameIdx = 0;
12515
+ for (const line of lines) {
12516
+ const segs = [];
12517
+ let genCol = 0;
12518
+ if (line.length > 0) {
12519
+ for (const segStr of line.split(",")) {
12520
+ if (segStr.length === 0)
12521
+ continue;
12522
+ const fields = vlqDecode(segStr);
12523
+ genCol += fields[0];
12524
+ if (fields.length === 1) {
12525
+ segs.push({ genCol });
12526
+ } else {
12527
+ src += fields[1];
12528
+ origLine += fields[2];
12529
+ origCol += fields[3];
12530
+ const seg = { genCol, src, origLine, origCol };
12531
+ if (fields.length >= 5) {
12532
+ nameIdx += fields[4];
12533
+ seg.name = nameIdx;
12534
+ }
12535
+ segs.push(seg);
12536
+ }
12537
+ }
12538
+ }
12539
+ result.push(segs);
12540
+ }
12541
+ return result;
12542
+ }
12543
+ function encodeMappings(perLineSegs) {
12544
+ let prevGenCol = 0;
12545
+ let prevSrc = 0, prevOrigLine = 0, prevOrigCol = 0, prevNameIdx = 0;
12546
+ const out = [];
12547
+ for (const segs of perLineSegs) {
12548
+ prevGenCol = 0;
12549
+ const lineParts = [];
12550
+ for (const seg of segs) {
12551
+ if (seg.src == null) {
12552
+ lineParts.push(vlqEncode(seg.genCol - prevGenCol));
12553
+ } else {
12554
+ let s = vlqEncode(seg.genCol - prevGenCol);
12555
+ s += vlqEncode(seg.src - prevSrc);
12556
+ s += vlqEncode(seg.origLine - prevOrigLine);
12557
+ s += vlqEncode(seg.origCol - prevOrigCol);
12558
+ if (seg.name != null) {
12559
+ s += vlqEncode(seg.name - prevNameIdx);
12560
+ prevNameIdx = seg.name;
12561
+ }
12562
+ prevSrc = seg.src;
12563
+ prevOrigLine = seg.origLine;
12564
+ prevOrigCol = seg.origCol;
12565
+ lineParts.push(s);
12566
+ }
12567
+ prevGenCol = seg.genCol;
12568
+ }
12569
+ out.push(lineParts.join(","));
12570
+ }
12571
+ return out.join(";");
12572
+ }
12573
+ function mergeChunks(chunks) {
12574
+ const stripped = chunks.map((c) => {
12575
+ if (c.mapJSON !== undefined)
12576
+ return { js: c.js, mapJSON: c.mapJSON };
12577
+ return extractMap(c.js);
12578
+ });
12579
+ const anyMap = stripped.some((c) => c.mapJSON);
12580
+ const mergedJS = stripped.map((c) => c.js).join(SEPARATOR);
12581
+ if (!anyMap)
12582
+ return { js: mergedJS, mapJSON: null };
12583
+ const mergedSources = [];
12584
+ const mergedSourcesContent = [];
12585
+ const sourceIndexByName = new Map;
12586
+ const mergedNames = [];
12587
+ const nameIndexByName = new Map;
12588
+ function addSource(name, content) {
12589
+ if (sourceIndexByName.has(name))
12590
+ return sourceIndexByName.get(name);
12591
+ const idx = mergedSources.length;
12592
+ mergedSources.push(name);
12593
+ mergedSourcesContent.push(content ?? null);
12594
+ sourceIndexByName.set(name, idx);
12595
+ return idx;
12596
+ }
12597
+ function addName(name) {
12598
+ if (nameIndexByName.has(name))
12599
+ return nameIndexByName.get(name);
12600
+ const idx = mergedNames.length;
12601
+ mergedNames.push(name);
12602
+ nameIndexByName.set(name, idx);
12603
+ return idx;
12604
+ }
12605
+ const chunkInfos = [];
12606
+ let lineOffset = 0;
12607
+ for (let i = 0;i < stripped.length; i++) {
12608
+ const c = stripped[i];
12609
+ const info = { lineOffset, srcRemap: [], nameRemap: [], perLineSegs: null };
12610
+ if (c.mapJSON) {
12611
+ let map;
12612
+ try {
12613
+ map = JSON.parse(c.mapJSON);
12614
+ } catch {
12615
+ map = null;
12616
+ }
12617
+ if (map && typeof map.mappings === "string") {
12618
+ const sources = map.sources || [];
12619
+ const sourcesContent = map.sourcesContent || [];
12620
+ info.srcRemap = sources.map((s, idx) => addSource(s, sourcesContent[idx]));
12621
+ const names = map.names || [];
12622
+ info.nameRemap = names.map((n) => addName(n));
12623
+ info.perLineSegs = decodeMappings(map.mappings);
12624
+ }
12625
+ }
12626
+ chunkInfos.push(info);
12627
+ const chunkLines = countNewlines(c.js);
12628
+ const sepLines = i < stripped.length - 1 ? SEPARATOR_LINES : 0;
12629
+ lineOffset += chunkLines + sepLines;
12630
+ }
12631
+ const totalLines = lineOffset + 1;
12632
+ const mergedPerLineSegs = new Array(totalLines).fill(null).map(() => []);
12633
+ for (const info of chunkInfos) {
12634
+ if (!info.perLineSegs)
12635
+ continue;
12636
+ for (let li = 0;li < info.perLineSegs.length; li++) {
12637
+ const target = info.lineOffset + li;
12638
+ if (target >= mergedPerLineSegs.length) {
12639
+ while (mergedPerLineSegs.length <= target)
12640
+ mergedPerLineSegs.push([]);
12641
+ }
12642
+ for (const seg of info.perLineSegs[li]) {
12643
+ if (seg.src == null) {
12644
+ mergedPerLineSegs[target].push({ genCol: seg.genCol });
12645
+ } else {
12646
+ const remapped = {
12647
+ genCol: seg.genCol,
12648
+ src: info.srcRemap[seg.src],
12649
+ origLine: seg.origLine,
12650
+ origCol: seg.origCol
12651
+ };
12652
+ if (seg.name != null)
12653
+ remapped.name = info.nameRemap[seg.name];
12654
+ mergedPerLineSegs[target].push(remapped);
12655
+ }
12656
+ }
12657
+ }
12658
+ }
12659
+ const mergedMappings = encodeMappings(mergedPerLineSegs);
12660
+ const mergedMap = {
12661
+ version: 3,
12662
+ sources: mergedSources,
12663
+ sourcesContent: mergedSourcesContent,
12664
+ names: mergedNames,
12665
+ mappings: mergedMappings
12666
+ };
12667
+ return { js: mergedJS, mapJSON: JSON.stringify(mergedMap) };
12668
+ }
12669
+ function utf8ToBase64(str2) {
12670
+ if (typeof Buffer !== "undefined") {
12671
+ return Buffer.from(str2, "utf8").toString("base64");
12672
+ }
12673
+ const bytes = new TextEncoder().encode(str2);
12674
+ let bin = "";
12675
+ for (let i = 0;i < bytes.length; i++)
12676
+ bin += String.fromCharCode(bytes[i]);
12677
+ return btoa(bin);
12678
+ }
12679
+ function mergeChunksWithInlineMap(chunks) {
12680
+ const { js, mapJSON } = mergeChunks(chunks);
12681
+ if (!mapJSON)
12682
+ return js;
12683
+ const b64 = utf8ToBase64(mapJSON);
12684
+ return js + `
12685
+ //# sourceMappingURL=data:application/json;base64,` + b64 + `
12686
+ `;
12687
+ }
12688
+
12455
12689
  // src/browser.js
12456
- var VERSION = "3.15.3";
12457
- var BUILD_DATE = "2026-04-27@07:02:58GMT";
12690
+ var VERSION = "3.15.4";
12691
+ var BUILD_DATE = "2026-04-27@08:44:03GMT";
12458
12692
  if (typeof globalThis !== "undefined") {
12459
12693
  if (!globalThis.__rip)
12460
12694
  new Function(getReactiveRuntime())();
@@ -12631,8 +12865,9 @@ ${js}
12631
12865
  if (!s.code)
12632
12866
  continue;
12633
12867
  const ripName = s.url || `inline-${++inlineCounter}.rip`;
12868
+ const opts = debug ? { ...baseOpts, sourceMap: "inline", filename: ripName } : baseOpts;
12634
12869
  try {
12635
- const js = compileToJS(s.code, baseOpts);
12870
+ const js = compileToJS(s.code, opts);
12636
12871
  compiled.push({ js, url: ripName });
12637
12872
  } catch (e) {
12638
12873
  console.error(formatError(e, { source: s.code, file: ripName, color: false }));
@@ -12666,13 +12901,12 @@ ${js}
12666
12901
  const mountSnippet = mount ? `
12667
12902
  ${mount}.mount(${JSON.stringify(target)});
12668
12903
  ` : "";
12669
- const merged = compiled.map((c) => c.js).join(`
12670
- ;
12671
- `);
12904
+ const mergedBody = mergeChunksWithInlineMap(compiled.map((c) => ({ js: c.js })));
12905
+ const wrapped = mount ? mergedBody.replace(/(\n\/\/# sourceMappingURL=[^\n]*\n?)?$/, mountSnippet + "$1") : mergedBody;
12672
12906
  let ok = true;
12673
12907
  try {
12674
12908
  await (0, eval)(`(async()=>{
12675
- ${merged}${mountSnippet}
12909
+ ${wrapped}
12676
12910
  })()`);
12677
12911
  } catch (e) {
12678
12912
  ok = false;