rip-lang 3.15.2 → 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 +259 -29
- package/docs/dist/rip.min.js +209 -204
- package/docs/dist/rip.min.js.br +0 -0
- package/package.json +1 -1
- package/src/browser.js +44 -33
- 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())();
|
|
@@ -12662,30 +12896,26 @@ ${js}
|
|
|
12662
12896
|
}
|
|
12663
12897
|
}
|
|
12664
12898
|
if (compiled.length > 0) {
|
|
12665
|
-
let anyError = false;
|
|
12666
|
-
for (const c of compiled) {
|
|
12667
|
-
try {
|
|
12668
|
-
await (0, eval)(debug ? wrapForEval(c.js, c.url) : `(async()=>{
|
|
12669
|
-
${c.js}
|
|
12670
|
-
})()`);
|
|
12671
|
-
} catch (e) {
|
|
12672
|
-
anyError = true;
|
|
12673
|
-
if (e instanceof SyntaxError)
|
|
12674
|
-
console.error(`Rip syntax error in ${c.url}: ${e.message}`);
|
|
12675
|
-
else
|
|
12676
|
-
console.error(`Rip runtime error in ${c.url}:`, e);
|
|
12677
|
-
}
|
|
12678
|
-
}
|
|
12679
12899
|
const mount = runtimeTag?.getAttribute("data-mount");
|
|
12680
|
-
|
|
12681
|
-
|
|
12682
|
-
|
|
12683
|
-
|
|
12684
|
-
|
|
12685
|
-
|
|
12686
|
-
|
|
12900
|
+
const target = runtimeTag?.getAttribute("data-target") || "body";
|
|
12901
|
+
const mountSnippet = mount ? `
|
|
12902
|
+
${mount}.mount(${JSON.stringify(target)});
|
|
12903
|
+
` : "";
|
|
12904
|
+
const mergedBody = mergeChunksWithInlineMap(compiled.map((c) => ({ js: c.js })));
|
|
12905
|
+
const wrapped = mount ? mergedBody.replace(/(\n\/\/# sourceMappingURL=[^\n]*\n?)?$/, mountSnippet + "$1") : mergedBody;
|
|
12906
|
+
let ok = true;
|
|
12907
|
+
try {
|
|
12908
|
+
await (0, eval)(`(async()=>{
|
|
12909
|
+
${wrapped}
|
|
12910
|
+
})()`);
|
|
12911
|
+
} catch (e) {
|
|
12912
|
+
ok = false;
|
|
12913
|
+
if (e instanceof SyntaxError)
|
|
12914
|
+
console.error(`Rip syntax error: ${e.message}`);
|
|
12915
|
+
else
|
|
12916
|
+
console.error("Rip runtime error:", e);
|
|
12687
12917
|
}
|
|
12688
|
-
if (
|
|
12918
|
+
if (ok)
|
|
12689
12919
|
document.body.classList.add("ready");
|
|
12690
12920
|
}
|
|
12691
12921
|
}
|