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 +1 -1
- package/docs/dist/rip.js +246 -12
- package/docs/dist/rip.min.js +208 -207
- package/docs/dist/rip.min.js.br +0 -0
- package/package.json +1 -1
- package/src/browser.js +30 -15
- package/src/compiler.js +28 -4
- package/src/sourcemap-merge.js +287 -0
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.
|
|
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
|
-
|
|
8890
|
-
|
|
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.
|
|
12457
|
-
var BUILD_DATE = "2026-04-27@
|
|
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,
|
|
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
|
|
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
|
-
${
|
|
12909
|
+
${wrapped}
|
|
12676
12910
|
})()`);
|
|
12677
12911
|
} catch (e) {
|
|
12678
12912
|
ok = false;
|