sibujs 3.1.0 → 3.2.1
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 +6 -0
- package/dist/browser.cjs +16 -8
- package/dist/browser.js +6 -5
- package/dist/build.cjs +235 -147
- package/dist/build.js +35 -24
- package/dist/cdn.global.js +7 -7
- package/dist/{chunk-WYU7CYJ3.js → chunk-2C4E3HBM.js} +5 -5
- package/dist/{chunk-3DYB5B3S.js → chunk-4JCAUOLN.js} +45 -23
- package/dist/{chunk-2HAGQWDV.js → chunk-5N74TKLD.js} +1 -1
- package/dist/{chunk-SVVAUX7J.js → chunk-7XDYVJLE.js} +19 -9
- package/dist/{chunk-2N2UL7O4.js → chunk-BGNLPNGV.js} +20 -12
- package/dist/{chunk-RK4BQG25.js → chunk-C427DVQF.js} +1 -1
- package/dist/{chunk-ZIBE2SAT.js → chunk-FDY42FIU.js} +3 -2
- package/dist/{chunk-GQ7RRFPU.js → chunk-FOI23UJL.js} +11 -1
- package/dist/{chunk-2RA7SHDA.js → chunk-GOJMFRBL.js} +20 -4
- package/dist/{chunk-IVOUCSZL.js → chunk-GOUM4JCT.js} +6 -6
- package/dist/chunk-H3SRKIYX.js +17 -0
- package/dist/{chunk-3DJH25UO.js → chunk-H6PCHJZQ.js} +2 -2
- package/dist/{chunk-UCS6AMJ7.js → chunk-HMJFCBRR.js} +26 -3
- package/dist/{chunk-JYD2PWXH.js → chunk-HXMS4SNP.js} +22 -15
- package/dist/{chunk-SC437AMI.js → chunk-JYXOEYI4.js} +12 -18
- package/dist/{chunk-KB3BA2XK.js → chunk-NFYWLRUO.js} +11 -18
- package/dist/{chunk-QNQY5DUS.js → chunk-NPIEEKPT.js} +20 -11
- package/dist/{chunk-UYX2NDOH.js → chunk-OYLPZO4N.js} +33 -15
- package/dist/{chunk-LYTCUZ7H.js → chunk-RDRSWYNP.js} +1 -1
- package/dist/{chunk-2ZJ7TSW4.js → chunk-RLUJL2MV.js} +4 -8
- package/dist/{chunk-CR4MXPHB.js → chunk-V2MTG5FT.js} +99 -36
- package/dist/{chunk-CNZ35WI2.js → chunk-VJE6DDYM.js} +2 -2
- package/dist/{chunk-PMSDFTK3.js → chunk-VOCE4NNK.js} +157 -75
- package/dist/{chunk-WKUXSE7V.js → chunk-X67UYC74.js} +12 -11
- package/dist/{chunk-EFOAE5NC.js → chunk-YFDGQWDA.js} +1 -1
- package/dist/{chunk-3U4ZVXVD.js → chunk-Z2FWAE4B.js} +6 -2
- package/dist/data.cjs +190 -94
- package/dist/data.d.cts +7 -1
- package/dist/data.d.ts +7 -1
- package/dist/data.js +8 -8
- package/dist/devtools.cjs +38 -10
- package/dist/devtools.d.cts +1 -1
- package/dist/devtools.d.ts +1 -1
- package/dist/devtools.js +6 -6
- package/dist/ecosystem.cjs +123 -63
- package/dist/ecosystem.js +9 -9
- package/dist/extras.cjs +380 -196
- package/dist/extras.d.cts +2 -2
- package/dist/extras.d.ts +2 -2
- package/dist/extras.js +27 -24
- package/dist/index.cjs +214 -136
- package/dist/index.d.cts +15 -2
- package/dist/index.d.ts +15 -2
- package/dist/index.js +15 -13
- package/dist/{introspect-BZWKvQUZ.d.ts → introspect-DOZfmC-4.d.ts} +1 -1
- package/dist/{introspect-DsJlDD2T.d.cts → introspect-RjLfIFpL.d.cts} +1 -1
- package/dist/motion.cjs +10 -0
- package/dist/motion.js +3 -3
- package/dist/patterns.cjs +45 -40
- package/dist/patterns.js +8 -7
- package/dist/performance.cjs +101 -25
- package/dist/performance.d.cts +2 -2
- package/dist/performance.d.ts +2 -2
- package/dist/performance.js +8 -7
- package/dist/plugins.cjs +234 -160
- package/dist/plugins.d.cts +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js +127 -69
- package/dist/{ssr-FXD2PPMC.js → ssr-2QDQ27EV.js} +5 -3
- package/dist/{ssr-CrVNy6Pa.d.cts → ssr-D62yFwuw.d.cts} +8 -1
- package/dist/{ssr-CrVNy6Pa.d.ts → ssr-D62yFwuw.d.ts} +8 -1
- package/dist/ssr.cjs +145 -66
- package/dist/ssr.d.cts +1 -1
- package/dist/ssr.d.ts +1 -1
- package/dist/ssr.js +12 -10
- package/dist/testing.cjs +9 -4
- package/dist/testing.js +3 -3
- package/dist/ui.cjs +54 -38
- package/dist/ui.js +10 -9
- package/dist/widgets.cjs +40 -24
- package/dist/widgets.js +8 -8
- package/package.json +3 -1
package/dist/build.cjs
CHANGED
|
@@ -394,14 +394,16 @@ function compileHtmlTemplates(code2) {
|
|
|
394
394
|
const tmpl = templates[i2];
|
|
395
395
|
const ast = parseTemplateToAST(tmpl.strings);
|
|
396
396
|
collectTags(ast, usedTags);
|
|
397
|
+
if (ast.length > 1) usedTags.add("div");
|
|
397
398
|
if (Array.from(usedTags).some((t) => SVG_TAGS.has(t))) usesSvg = true;
|
|
398
399
|
const valuesVar = "__v";
|
|
399
400
|
const childExprs = ast.map((c) => generateChild(c, valuesVar));
|
|
401
|
+
const rootExpr = childExprs.length === 1 ? childExprs[0] : `div([${childExprs.join(", ")}])`;
|
|
400
402
|
let compiled;
|
|
401
403
|
if (tmpl.exprCount === 0) {
|
|
402
|
-
compiled =
|
|
404
|
+
compiled = rootExpr;
|
|
403
405
|
} else {
|
|
404
|
-
const body2 =
|
|
406
|
+
const body2 = rootExpr;
|
|
405
407
|
const exprSource = extractExpressions(code2, tmpl.start, tmpl.end, tmpl.exprCount);
|
|
406
408
|
compiled = `((${valuesVar}) => ${body2})([${exprSource.join(", ")}])`;
|
|
407
409
|
}
|
|
@@ -1134,6 +1136,7 @@ __export(index_exports, {
|
|
|
1134
1136
|
footer: () => footer,
|
|
1135
1137
|
form: () => form,
|
|
1136
1138
|
g: () => g,
|
|
1139
|
+
getRequestScopedCache: () => getRequestScopedCache,
|
|
1137
1140
|
getSSRStore: () => getSSRStore,
|
|
1138
1141
|
getSlot: () => getSlot,
|
|
1139
1142
|
h1: () => h1,
|
|
@@ -1282,9 +1285,17 @@ function devWarn(message) {
|
|
|
1282
1285
|
}
|
|
1283
1286
|
|
|
1284
1287
|
// src/utils/sanitize.ts
|
|
1288
|
+
function stripControlChars(value) {
|
|
1289
|
+
return value.replace(/[\x00-\x20\x7f-\x9f]+/g, "");
|
|
1290
|
+
}
|
|
1291
|
+
function isEventHandlerAttr(name) {
|
|
1292
|
+
if (name.length < 3) return false;
|
|
1293
|
+
const lower = name.toLowerCase();
|
|
1294
|
+
return lower[0] === "o" && lower[1] === "n" && lower.charCodeAt(2) >= 97 && lower.charCodeAt(2) <= 122;
|
|
1295
|
+
}
|
|
1285
1296
|
var SAFE_URL_PROTOCOLS = ["http:", "https:", "mailto:", "tel:", "ftp:"];
|
|
1286
1297
|
function sanitizeUrl(url) {
|
|
1287
|
-
const trimmed = url
|
|
1298
|
+
const trimmed = stripControlChars(url).trim();
|
|
1288
1299
|
if (!trimmed) return "";
|
|
1289
1300
|
const lower = trimmed.toLowerCase();
|
|
1290
1301
|
let schemeEnd = -1;
|
|
@@ -1347,7 +1358,7 @@ var URL_ATTRIBUTES = /* @__PURE__ */ new Set([
|
|
|
1347
1358
|
"data"
|
|
1348
1359
|
]);
|
|
1349
1360
|
function isUrlAttribute(attr) {
|
|
1350
|
-
return URL_ATTRIBUTES.has(attr);
|
|
1361
|
+
return URL_ATTRIBUTES.has(attr.toLowerCase());
|
|
1351
1362
|
}
|
|
1352
1363
|
|
|
1353
1364
|
// src/reactivity/track.ts
|
|
@@ -1526,7 +1537,7 @@ function track(effectFn, subscriber) {
|
|
|
1526
1537
|
function reactiveBinding(commit) {
|
|
1527
1538
|
const run = () => {
|
|
1528
1539
|
const s2 = subscriber;
|
|
1529
|
-
if (s2._reentrant) return;
|
|
1540
|
+
if (s2._disposed || s2._reentrant) return;
|
|
1530
1541
|
s2._reentrant = true;
|
|
1531
1542
|
try {
|
|
1532
1543
|
retrack(commit, subscriber);
|
|
@@ -1542,8 +1553,12 @@ function reactiveBinding(commit) {
|
|
|
1542
1553
|
subscriber._runEpoch = 0;
|
|
1543
1554
|
subscriber._runs = 0;
|
|
1544
1555
|
subscriber._reentrant = false;
|
|
1556
|
+
subscriber._disposed = false;
|
|
1545
1557
|
run();
|
|
1546
|
-
return subscriber._dispose ?? (subscriber._dispose = () =>
|
|
1558
|
+
return subscriber._dispose ?? (subscriber._dispose = () => {
|
|
1559
|
+
subscriber._disposed = true;
|
|
1560
|
+
cleanup(subscriber);
|
|
1561
|
+
});
|
|
1547
1562
|
}
|
|
1548
1563
|
function recordDependency(signal2) {
|
|
1549
1564
|
if (!currentSubscriber) return;
|
|
@@ -1736,11 +1751,6 @@ var _isDev3 = isDev();
|
|
|
1736
1751
|
function setProp(el, key, val) {
|
|
1737
1752
|
el[key] = val;
|
|
1738
1753
|
}
|
|
1739
|
-
function isEventHandlerAttr(name) {
|
|
1740
|
-
if (name.length < 3) return false;
|
|
1741
|
-
const lower = name.toLowerCase();
|
|
1742
|
-
return lower[0] === "o" && lower[1] === "n" && lower.charCodeAt(2) >= 97 && lower.charCodeAt(2) <= 122;
|
|
1743
|
-
}
|
|
1744
1754
|
function bindAttribute(el, attr, getter) {
|
|
1745
1755
|
if (isEventHandlerAttr(attr)) {
|
|
1746
1756
|
if (_isDev3)
|
|
@@ -1795,7 +1805,7 @@ function bindDynamic(el, nameGetter, valueGetter) {
|
|
|
1795
1805
|
if (_isDev3) devWarn(`bindDynamic: value getter threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
1796
1806
|
return;
|
|
1797
1807
|
}
|
|
1798
|
-
if ((name
|
|
1808
|
+
if (isEventHandlerAttr(name)) return;
|
|
1799
1809
|
if (prevName !== null && prevName !== name) {
|
|
1800
1810
|
el.removeAttribute(prevName);
|
|
1801
1811
|
}
|
|
@@ -1816,8 +1826,78 @@ function bindDynamic(el, nameGetter, valueGetter) {
|
|
|
1816
1826
|
};
|
|
1817
1827
|
}
|
|
1818
1828
|
|
|
1819
|
-
// src/
|
|
1829
|
+
// src/core/rendering/dispose.ts
|
|
1830
|
+
var elementDisposers = /* @__PURE__ */ new WeakMap();
|
|
1820
1831
|
var _isDev4 = isDev();
|
|
1832
|
+
var activeBindingCount = 0;
|
|
1833
|
+
function registerDisposer(node, teardown) {
|
|
1834
|
+
let disposers = elementDisposers.get(node);
|
|
1835
|
+
if (!disposers) {
|
|
1836
|
+
disposers = [];
|
|
1837
|
+
elementDisposers.set(node, disposers);
|
|
1838
|
+
}
|
|
1839
|
+
disposers.push(teardown);
|
|
1840
|
+
if (_isDev4) activeBindingCount++;
|
|
1841
|
+
}
|
|
1842
|
+
function dispose(node) {
|
|
1843
|
+
const stack = [node];
|
|
1844
|
+
const order = [];
|
|
1845
|
+
while (stack.length > 0) {
|
|
1846
|
+
const current = stack.pop();
|
|
1847
|
+
order.push(current);
|
|
1848
|
+
const children = Array.from(current.childNodes);
|
|
1849
|
+
for (let i2 = 0; i2 < children.length; i2++) {
|
|
1850
|
+
stack.push(children[i2]);
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
for (let i2 = order.length - 1; i2 >= 0; i2--) {
|
|
1854
|
+
const current = order[i2];
|
|
1855
|
+
const disposers = elementDisposers.get(current);
|
|
1856
|
+
if (disposers) {
|
|
1857
|
+
const snapshot = disposers.slice();
|
|
1858
|
+
elementDisposers.delete(current);
|
|
1859
|
+
if (_isDev4) activeBindingCount -= snapshot.length;
|
|
1860
|
+
for (const d of snapshot) {
|
|
1861
|
+
try {
|
|
1862
|
+
d();
|
|
1863
|
+
} catch (err) {
|
|
1864
|
+
if (_isDev4 && typeof console !== "undefined") {
|
|
1865
|
+
console.warn("[SibuJS] Disposer threw during cleanup:", err);
|
|
1866
|
+
}
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1869
|
+
let extraPasses = 0;
|
|
1870
|
+
while (extraPasses++ < 8) {
|
|
1871
|
+
const added = elementDisposers.get(current);
|
|
1872
|
+
if (!added || added.length === 0) break;
|
|
1873
|
+
const moreSnapshot = added.slice();
|
|
1874
|
+
elementDisposers.delete(current);
|
|
1875
|
+
if (_isDev4) activeBindingCount -= moreSnapshot.length;
|
|
1876
|
+
for (const d of moreSnapshot) {
|
|
1877
|
+
try {
|
|
1878
|
+
d();
|
|
1879
|
+
} catch (err) {
|
|
1880
|
+
if (_isDev4 && typeof console !== "undefined") {
|
|
1881
|
+
console.warn("[SibuJS] Disposer threw during cleanup:", err);
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
}
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
function checkLeaks(warnThreshold = 0) {
|
|
1890
|
+
if (!_isDev4) return 0;
|
|
1891
|
+
if (warnThreshold > 0 && activeBindingCount > warnThreshold) {
|
|
1892
|
+
devWarn(
|
|
1893
|
+
`checkLeaks: ${activeBindingCount} active DOM bindings detected. Expected \u2264${warnThreshold}. This may indicate a component was removed from the DOM without calling dispose().`
|
|
1894
|
+
);
|
|
1895
|
+
}
|
|
1896
|
+
return activeBindingCount;
|
|
1897
|
+
}
|
|
1898
|
+
|
|
1899
|
+
// src/reactivity/bindChildNode.ts
|
|
1900
|
+
var _isDev5 = isDev();
|
|
1821
1901
|
function bindChildNode(placeholder, getter) {
|
|
1822
1902
|
let lastNodes = [];
|
|
1823
1903
|
function commit() {
|
|
@@ -1825,12 +1905,13 @@ function bindChildNode(placeholder, getter) {
|
|
|
1825
1905
|
try {
|
|
1826
1906
|
result = getter();
|
|
1827
1907
|
} catch (err) {
|
|
1828
|
-
if (
|
|
1908
|
+
if (_isDev5) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
1829
1909
|
return;
|
|
1830
1910
|
}
|
|
1831
1911
|
if (result == null || typeof result === "boolean") {
|
|
1832
1912
|
for (let i2 = 0; i2 < lastNodes.length; i2++) {
|
|
1833
1913
|
const node = lastNodes[i2];
|
|
1914
|
+
dispose(node);
|
|
1834
1915
|
if (node.parentNode) node.parentNode.removeChild(node);
|
|
1835
1916
|
}
|
|
1836
1917
|
lastNodes.length = 0;
|
|
@@ -1850,7 +1931,7 @@ function bindChildNode(placeholder, getter) {
|
|
|
1850
1931
|
if (item == null || typeof item === "boolean") continue;
|
|
1851
1932
|
const node = item instanceof Node ? item : document.createTextNode(String(item));
|
|
1852
1933
|
if (seen.has(node)) {
|
|
1853
|
-
if (
|
|
1934
|
+
if (_isDev5)
|
|
1854
1935
|
devWarn("bindChildNode: duplicate node reference in array \u2014 only the first occurrence is rendered.");
|
|
1855
1936
|
continue;
|
|
1856
1937
|
}
|
|
@@ -1872,94 +1953,22 @@ function bindChildNode(placeholder, getter) {
|
|
|
1872
1953
|
for (let i2 = 0; i2 < lastNodes.length; i2++) {
|
|
1873
1954
|
const node = lastNodes[i2];
|
|
1874
1955
|
if (reused?.has(node)) continue;
|
|
1956
|
+
dispose(node);
|
|
1875
1957
|
if (node.parentNode) node.parentNode.removeChild(node);
|
|
1876
1958
|
}
|
|
1877
|
-
|
|
1959
|
+
let prev = placeholder;
|
|
1878
1960
|
for (let i2 = 0; i2 < newNodes.length; i2++) {
|
|
1879
1961
|
const node = newNodes[i2];
|
|
1880
|
-
if (
|
|
1881
|
-
|
|
1882
|
-
parent.insertBefore(node, anchor);
|
|
1883
|
-
}
|
|
1884
|
-
} else {
|
|
1885
|
-
parent.insertBefore(node, anchor);
|
|
1962
|
+
if (prev.nextSibling !== node) {
|
|
1963
|
+
parent.insertBefore(node, prev.nextSibling);
|
|
1886
1964
|
}
|
|
1965
|
+
prev = node;
|
|
1887
1966
|
}
|
|
1888
1967
|
lastNodes = newNodes;
|
|
1889
1968
|
}
|
|
1890
1969
|
return reactiveBinding(commit);
|
|
1891
1970
|
}
|
|
1892
1971
|
|
|
1893
|
-
// src/core/rendering/dispose.ts
|
|
1894
|
-
var elementDisposers = /* @__PURE__ */ new WeakMap();
|
|
1895
|
-
var _isDev5 = isDev();
|
|
1896
|
-
var activeBindingCount = 0;
|
|
1897
|
-
function registerDisposer(node, teardown) {
|
|
1898
|
-
let disposers = elementDisposers.get(node);
|
|
1899
|
-
if (!disposers) {
|
|
1900
|
-
disposers = [];
|
|
1901
|
-
elementDisposers.set(node, disposers);
|
|
1902
|
-
}
|
|
1903
|
-
disposers.push(teardown);
|
|
1904
|
-
if (_isDev5) activeBindingCount++;
|
|
1905
|
-
}
|
|
1906
|
-
function dispose(node) {
|
|
1907
|
-
const stack = [node];
|
|
1908
|
-
const order = [];
|
|
1909
|
-
while (stack.length > 0) {
|
|
1910
|
-
const current = stack.pop();
|
|
1911
|
-
order.push(current);
|
|
1912
|
-
const children = Array.from(current.childNodes);
|
|
1913
|
-
for (let i2 = 0; i2 < children.length; i2++) {
|
|
1914
|
-
stack.push(children[i2]);
|
|
1915
|
-
}
|
|
1916
|
-
}
|
|
1917
|
-
for (let i2 = order.length - 1; i2 >= 0; i2--) {
|
|
1918
|
-
const current = order[i2];
|
|
1919
|
-
const disposers = elementDisposers.get(current);
|
|
1920
|
-
if (disposers) {
|
|
1921
|
-
const snapshot = disposers.slice();
|
|
1922
|
-
elementDisposers.delete(current);
|
|
1923
|
-
if (_isDev5) activeBindingCount -= snapshot.length;
|
|
1924
|
-
for (const d of snapshot) {
|
|
1925
|
-
try {
|
|
1926
|
-
d();
|
|
1927
|
-
} catch (err) {
|
|
1928
|
-
if (_isDev5 && typeof console !== "undefined") {
|
|
1929
|
-
console.warn("[SibuJS] Disposer threw during cleanup:", err);
|
|
1930
|
-
}
|
|
1931
|
-
}
|
|
1932
|
-
}
|
|
1933
|
-
let extraPasses = 0;
|
|
1934
|
-
while (extraPasses++ < 8) {
|
|
1935
|
-
const added = elementDisposers.get(current);
|
|
1936
|
-
if (!added || added.length === 0) break;
|
|
1937
|
-
const moreSnapshot = added.slice();
|
|
1938
|
-
elementDisposers.delete(current);
|
|
1939
|
-
if (_isDev5) activeBindingCount -= moreSnapshot.length;
|
|
1940
|
-
for (const d of moreSnapshot) {
|
|
1941
|
-
try {
|
|
1942
|
-
d();
|
|
1943
|
-
} catch (err) {
|
|
1944
|
-
if (_isDev5 && typeof console !== "undefined") {
|
|
1945
|
-
console.warn("[SibuJS] Disposer threw during cleanup:", err);
|
|
1946
|
-
}
|
|
1947
|
-
}
|
|
1948
|
-
}
|
|
1949
|
-
}
|
|
1950
|
-
}
|
|
1951
|
-
}
|
|
1952
|
-
}
|
|
1953
|
-
function checkLeaks(warnThreshold = 0) {
|
|
1954
|
-
if (!_isDev5) return 0;
|
|
1955
|
-
if (warnThreshold > 0 && activeBindingCount > warnThreshold) {
|
|
1956
|
-
devWarn(
|
|
1957
|
-
`checkLeaks: ${activeBindingCount} active DOM bindings detected. Expected \u2264${warnThreshold}. This may indicate a component was removed from the DOM without calling dispose().`
|
|
1958
|
-
);
|
|
1959
|
-
}
|
|
1960
|
-
return activeBindingCount;
|
|
1961
|
-
}
|
|
1962
|
-
|
|
1963
1972
|
// src/core/rendering/tagFactory.ts
|
|
1964
1973
|
var SVG_NS = "http://www.w3.org/2000/svg";
|
|
1965
1974
|
var _isDev6 = isDev();
|
|
@@ -2195,7 +2204,7 @@ var tagFactory = (tag, ns) => {
|
|
|
2195
2204
|
const value = props[key];
|
|
2196
2205
|
if (value == null) continue;
|
|
2197
2206
|
const lkey = key.toLowerCase();
|
|
2198
|
-
if (
|
|
2207
|
+
if (isEventHandlerAttr(key)) continue;
|
|
2199
2208
|
if (typeof value === "function") {
|
|
2200
2209
|
registerDisposer(el, bindAttribute(el, key, value));
|
|
2201
2210
|
} else if (typeof value === "boolean") {
|
|
@@ -2476,14 +2485,28 @@ function parseTemplate(strings) {
|
|
|
2476
2485
|
}
|
|
2477
2486
|
return { kind: "mixed", statics, exprs };
|
|
2478
2487
|
}
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
const
|
|
2482
|
-
|
|
2483
|
-
pos
|
|
2488
|
+
{
|
|
2489
|
+
const statics = [];
|
|
2490
|
+
const exprs = [];
|
|
2491
|
+
let current = "";
|
|
2492
|
+
while (pos < len) {
|
|
2493
|
+
const c = template2.charCodeAt(pos);
|
|
2494
|
+
if (c === 32 || c === 9 || c === 10 || c === 13 || c === 62) break;
|
|
2495
|
+
const innerIdx = tryExprIdx();
|
|
2496
|
+
if (innerIdx >= 0) {
|
|
2497
|
+
statics.push(current);
|
|
2498
|
+
current = "";
|
|
2499
|
+
exprs.push(innerIdx);
|
|
2500
|
+
} else {
|
|
2501
|
+
current += template2[pos++];
|
|
2502
|
+
}
|
|
2503
|
+
}
|
|
2504
|
+
statics.push(current);
|
|
2505
|
+
if (exprs.length === 0) {
|
|
2506
|
+
return { kind: "static", value: statics[0] };
|
|
2507
|
+
}
|
|
2508
|
+
return { kind: "mixed", statics, exprs };
|
|
2484
2509
|
}
|
|
2485
|
-
const val = template2.slice(valStart, pos);
|
|
2486
|
-
return { kind: "static", value: val };
|
|
2487
2510
|
}
|
|
2488
2511
|
function parseAttrs() {
|
|
2489
2512
|
const attrs = [];
|
|
@@ -2540,6 +2563,30 @@ function parseTemplate(strings) {
|
|
|
2540
2563
|
while (pos < len) {
|
|
2541
2564
|
if (template2[pos] === "<" && pos + 1 < len && template2[pos + 1] === "/") break;
|
|
2542
2565
|
if (template2[pos] === "<") {
|
|
2566
|
+
const next = template2[pos + 1];
|
|
2567
|
+
if (next === "!") {
|
|
2568
|
+
if (template2.startsWith("<!--", pos)) {
|
|
2569
|
+
const end = template2.indexOf("-->", pos + 4);
|
|
2570
|
+
pos = end === -1 ? len : end + 3;
|
|
2571
|
+
} else if (template2.startsWith("<![CDATA[", pos)) {
|
|
2572
|
+
const end = template2.indexOf("]]>", pos + 9);
|
|
2573
|
+
pos = end === -1 ? len : end + 3;
|
|
2574
|
+
} else {
|
|
2575
|
+
const end = template2.indexOf(">", pos);
|
|
2576
|
+
pos = end === -1 ? len : end + 1;
|
|
2577
|
+
}
|
|
2578
|
+
continue;
|
|
2579
|
+
}
|
|
2580
|
+
if (next === "?") {
|
|
2581
|
+
const end = template2.indexOf(">", pos);
|
|
2582
|
+
pos = end === -1 ? len : end + 1;
|
|
2583
|
+
continue;
|
|
2584
|
+
}
|
|
2585
|
+
if (!(next >= "a" && next <= "z") && !(next >= "A" && next <= "Z")) {
|
|
2586
|
+
children.push({ t: 1, value: "<" });
|
|
2587
|
+
pos++;
|
|
2588
|
+
continue;
|
|
2589
|
+
}
|
|
2543
2590
|
pos++;
|
|
2544
2591
|
const tag = readTagName();
|
|
2545
2592
|
const attrs = parseAttrs();
|
|
@@ -2588,7 +2635,7 @@ function executeElement(tmpl, values) {
|
|
|
2588
2635
|
case 1: {
|
|
2589
2636
|
const name = attr.name;
|
|
2590
2637
|
const lname = name.toLowerCase();
|
|
2591
|
-
if (
|
|
2638
|
+
if (isEventHandlerAttr(name)) break;
|
|
2592
2639
|
const val = values[attr.idx];
|
|
2593
2640
|
if (typeof val === "function") {
|
|
2594
2641
|
registerDisposer(el, bindAttribute(el, name, val));
|
|
@@ -2837,6 +2884,11 @@ function each(getArray, render, options) {
|
|
|
2837
2884
|
workMap.clear();
|
|
2838
2885
|
keyIndexMap.clear();
|
|
2839
2886
|
for (let i2 = 0; i2 < newLen; i2++) {
|
|
2887
|
+
if (_isDev8 && keyIndexMap.has(newKeys[i2])) {
|
|
2888
|
+
devWarn(
|
|
2889
|
+
`each: duplicate key "${String(newKeys[i2])}" at index ${i2} (first seen at ${keyIndexMap.get(newKeys[i2])}). Keys must be unique \u2014 duplicates cause rows to be dropped or mis-ordered.`
|
|
2890
|
+
);
|
|
2891
|
+
}
|
|
2840
2892
|
keyIndexMap.set(newKeys[i2], i2);
|
|
2841
2893
|
}
|
|
2842
2894
|
for (let i2 = 0; i2 < newLen; i2++) {
|
|
@@ -3068,7 +3120,7 @@ function show(condition, element) {
|
|
|
3068
3120
|
const update = () => {
|
|
3069
3121
|
element.style.display = condition() ? "" : "none";
|
|
3070
3122
|
};
|
|
3071
|
-
track(update);
|
|
3123
|
+
registerDisposer(element, track(update));
|
|
3072
3124
|
return element;
|
|
3073
3125
|
}
|
|
3074
3126
|
function when(condition, thenBranch, elseBranch) {
|
|
@@ -3095,7 +3147,7 @@ function when(condition, thenBranch, elseBranch) {
|
|
|
3095
3147
|
}
|
|
3096
3148
|
initialized = true;
|
|
3097
3149
|
};
|
|
3098
|
-
track(update);
|
|
3150
|
+
registerDisposer(anchor, track(update));
|
|
3099
3151
|
if (!initialized) {
|
|
3100
3152
|
queueMicrotask(() => {
|
|
3101
3153
|
if (!initialized && anchor.parentNode) update();
|
|
@@ -3130,7 +3182,7 @@ function match(value, cases, fallback) {
|
|
|
3130
3182
|
}
|
|
3131
3183
|
initialized = true;
|
|
3132
3184
|
};
|
|
3133
|
-
track(update);
|
|
3185
|
+
registerDisposer(anchor, track(update));
|
|
3134
3186
|
if (!initialized) {
|
|
3135
3187
|
queueMicrotask(() => {
|
|
3136
3188
|
if (!initialized && anchor.parentNode) update();
|
|
@@ -3171,6 +3223,12 @@ function KeepAlive(activeKey, cases, options) {
|
|
|
3171
3223
|
return;
|
|
3172
3224
|
}
|
|
3173
3225
|
node = factory();
|
|
3226
|
+
if (node instanceof DocumentFragment) {
|
|
3227
|
+
const wrapper = document.createElement("div");
|
|
3228
|
+
wrapper.style.display = "contents";
|
|
3229
|
+
wrapper.appendChild(node);
|
|
3230
|
+
node = wrapper;
|
|
3231
|
+
}
|
|
3174
3232
|
cache2.set(key, node);
|
|
3175
3233
|
lruOrder.push(key);
|
|
3176
3234
|
if (max > 0 && lruOrder.length > max) {
|
|
@@ -3455,11 +3513,15 @@ function signal(initial, options) {
|
|
|
3455
3513
|
var als = null;
|
|
3456
3514
|
try {
|
|
3457
3515
|
if (typeof process !== "undefined" && process.versions && process.versions.node) {
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3516
|
+
let mod = null;
|
|
3517
|
+
const getBuiltin = process.getBuiltinModule;
|
|
3518
|
+
if (typeof getBuiltin === "function") {
|
|
3519
|
+
mod = getBuiltin("node:async_hooks");
|
|
3520
|
+
} else {
|
|
3521
|
+
const req = Function("return typeof require==='function'?require:null")();
|
|
3522
|
+
if (req) mod = req("node:async_hooks");
|
|
3462
3523
|
}
|
|
3524
|
+
if (mod) als = new mod.AsyncLocalStorage();
|
|
3463
3525
|
}
|
|
3464
3526
|
} catch {
|
|
3465
3527
|
als = null;
|
|
@@ -3475,6 +3537,17 @@ function getSSRStore() {
|
|
|
3475
3537
|
function isSSR() {
|
|
3476
3538
|
return getSSRStore().ssr;
|
|
3477
3539
|
}
|
|
3540
|
+
function getRequestScopedCache(name) {
|
|
3541
|
+
if (!isSSR()) return null;
|
|
3542
|
+
const store2 = getSSRStore();
|
|
3543
|
+
const caches = store2.caches ?? (store2.caches = /* @__PURE__ */ new Map());
|
|
3544
|
+
let c = caches.get(name);
|
|
3545
|
+
if (!c) {
|
|
3546
|
+
c = /* @__PURE__ */ new Map();
|
|
3547
|
+
caches.set(name, c);
|
|
3548
|
+
}
|
|
3549
|
+
return c;
|
|
3550
|
+
}
|
|
3478
3551
|
function enableSSR() {
|
|
3479
3552
|
getSSRStore().ssr = true;
|
|
3480
3553
|
}
|
|
@@ -3609,6 +3682,7 @@ function effect(effectFn, options) {
|
|
|
3609
3682
|
ctx.fn(ctx.onCleanup);
|
|
3610
3683
|
};
|
|
3611
3684
|
const sub2 = (() => {
|
|
3685
|
+
if (ctx.disposed) return;
|
|
3612
3686
|
if (ctx.running) {
|
|
3613
3687
|
ctx.rerunPending = true;
|
|
3614
3688
|
return;
|
|
@@ -3651,6 +3725,7 @@ function derived(getter, options) {
|
|
|
3651
3725
|
const equals = options?.equals;
|
|
3652
3726
|
const cs = {};
|
|
3653
3727
|
cs._d = false;
|
|
3728
|
+
cs._init = false;
|
|
3654
3729
|
cs._g = getter;
|
|
3655
3730
|
cs.__v = 0;
|
|
3656
3731
|
const markDirty = () => {
|
|
@@ -3659,11 +3734,18 @@ function derived(getter, options) {
|
|
|
3659
3734
|
};
|
|
3660
3735
|
markDirty._c = 1;
|
|
3661
3736
|
markDirty._sig = cs;
|
|
3737
|
+
const recompute = () => {
|
|
3738
|
+
const next = getter();
|
|
3739
|
+
cs._v = equals && cs._init ? equals(cs._v, next) ? cs._v : next : next;
|
|
3740
|
+
cs._d = false;
|
|
3741
|
+
cs._init = true;
|
|
3742
|
+
};
|
|
3662
3743
|
track(() => {
|
|
3663
3744
|
let threw = true;
|
|
3664
3745
|
try {
|
|
3665
3746
|
cs._v = getter();
|
|
3666
3747
|
cs._d = false;
|
|
3748
|
+
cs._init = true;
|
|
3667
3749
|
threw = false;
|
|
3668
3750
|
} finally {
|
|
3669
3751
|
if (threw) cs._d = true;
|
|
@@ -3679,20 +3761,13 @@ function derived(getter, options) {
|
|
|
3679
3761
|
}
|
|
3680
3762
|
if (trackingSuspended) {
|
|
3681
3763
|
if (cs._d) {
|
|
3764
|
+
const prev = cs._v;
|
|
3682
3765
|
evaluating = true;
|
|
3683
|
-
let threw = true;
|
|
3684
3766
|
try {
|
|
3685
|
-
|
|
3686
|
-
retrack(() => {
|
|
3687
|
-
const next = getter();
|
|
3688
|
-
cs._v = equals && cs._v !== void 0 ? equals(cs._v, next) ? cs._v : next : next;
|
|
3689
|
-
cs._d = false;
|
|
3690
|
-
threw = false;
|
|
3691
|
-
}, markDirty);
|
|
3767
|
+
retrack(recompute, markDirty);
|
|
3692
3768
|
if (!Object.is(prev, cs._v)) cs.__v++;
|
|
3693
3769
|
} finally {
|
|
3694
3770
|
evaluating = false;
|
|
3695
|
-
if (threw) cs._d = true;
|
|
3696
3771
|
}
|
|
3697
3772
|
}
|
|
3698
3773
|
return cs._v;
|
|
@@ -3701,18 +3776,11 @@ function derived(getter, options) {
|
|
|
3701
3776
|
if (cs._d) {
|
|
3702
3777
|
const oldValue = cs._v;
|
|
3703
3778
|
evaluating = true;
|
|
3704
|
-
let threw = true;
|
|
3705
3779
|
try {
|
|
3706
|
-
retrack(
|
|
3707
|
-
const next = getter();
|
|
3708
|
-
cs._v = equals && cs._v !== void 0 ? equals(cs._v, next) ? cs._v : next : next;
|
|
3709
|
-
cs._d = false;
|
|
3710
|
-
threw = false;
|
|
3711
|
-
}, markDirty);
|
|
3780
|
+
retrack(recompute, markDirty);
|
|
3712
3781
|
if (!Object.is(oldValue, cs._v)) cs.__v++;
|
|
3713
3782
|
} finally {
|
|
3714
3783
|
evaluating = false;
|
|
3715
|
-
if (threw) cs._d = true;
|
|
3716
3784
|
}
|
|
3717
3785
|
if (hook && oldValue !== cs._v) {
|
|
3718
3786
|
hook.emit("computed:update", { signal: cs, oldValue, newValue: cs._v });
|
|
@@ -3765,12 +3833,12 @@ function store(initialState) {
|
|
|
3765
3833
|
signals[key] = [getter, setter];
|
|
3766
3834
|
});
|
|
3767
3835
|
const store2 = new Proxy({}, {
|
|
3768
|
-
get(
|
|
3769
|
-
if (prop
|
|
3836
|
+
get(target, prop) {
|
|
3837
|
+
if (typeof prop === "string" && Object.hasOwn(signals, prop)) {
|
|
3770
3838
|
const getter = signals[prop][0];
|
|
3771
3839
|
return getter();
|
|
3772
3840
|
}
|
|
3773
|
-
return
|
|
3841
|
+
return Reflect.get(target, prop);
|
|
3774
3842
|
},
|
|
3775
3843
|
set() {
|
|
3776
3844
|
throw new Error(
|
|
@@ -3790,7 +3858,7 @@ function store(initialState) {
|
|
|
3790
3858
|
const nextState = typeof patch === "function" ? patch(current) : patch;
|
|
3791
3859
|
batch(() => {
|
|
3792
3860
|
Object.entries(nextState).forEach(([key, value]) => {
|
|
3793
|
-
if (key
|
|
3861
|
+
if (Object.hasOwn(signals, key)) {
|
|
3794
3862
|
signals[key][1](value);
|
|
3795
3863
|
}
|
|
3796
3864
|
});
|
|
@@ -4088,6 +4156,14 @@ function deepEqual(a2, b2, seen) {
|
|
|
4088
4156
|
}
|
|
4089
4157
|
return true;
|
|
4090
4158
|
}
|
|
4159
|
+
if (a2 instanceof DataView) {
|
|
4160
|
+
if (!(b2 instanceof DataView)) return false;
|
|
4161
|
+
if (a2.byteLength !== b2.byteLength) return false;
|
|
4162
|
+
for (let i2 = 0; i2 < a2.byteLength; i2++) {
|
|
4163
|
+
if (a2.getUint8(i2) !== b2.getUint8(i2)) return false;
|
|
4164
|
+
}
|
|
4165
|
+
return true;
|
|
4166
|
+
}
|
|
4091
4167
|
if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) {
|
|
4092
4168
|
const ta = a2;
|
|
4093
4169
|
const tb = b2;
|
|
@@ -4106,7 +4182,7 @@ function deepEqual(a2, b2, seen) {
|
|
|
4106
4182
|
const keysB = Object.keys(objB);
|
|
4107
4183
|
if (keysA.length !== keysB.length) return false;
|
|
4108
4184
|
return keysA.every(
|
|
4109
|
-
(key) => deepEqual(objA[key], objB[key], seen)
|
|
4185
|
+
(key) => Object.hasOwn(objB, key) && deepEqual(objA[key], objB[key], seen)
|
|
4110
4186
|
);
|
|
4111
4187
|
}
|
|
4112
4188
|
function deepSignal(initial) {
|
|
@@ -4609,34 +4685,37 @@ function Suspense({ nodes, fallback }) {
|
|
|
4609
4685
|
container.appendChild(fallbackEl);
|
|
4610
4686
|
let suspenseDisposed = false;
|
|
4611
4687
|
let observer = null;
|
|
4688
|
+
let childEl = null;
|
|
4612
4689
|
registerDisposer(container, () => {
|
|
4613
4690
|
suspenseDisposed = true;
|
|
4614
4691
|
if (observer) {
|
|
4615
4692
|
observer.disconnect();
|
|
4616
4693
|
observer = null;
|
|
4617
4694
|
}
|
|
4695
|
+
if (childEl && !container.contains(childEl)) dispose(childEl);
|
|
4618
4696
|
});
|
|
4619
4697
|
queueMicrotask(() => {
|
|
4620
4698
|
if (suspenseDisposed) return;
|
|
4621
4699
|
try {
|
|
4622
|
-
const
|
|
4623
|
-
|
|
4624
|
-
|
|
4625
|
-
|
|
4700
|
+
const el = nodes();
|
|
4701
|
+
childEl = el;
|
|
4702
|
+
if (el.classList.contains("sibu-lazy")) {
|
|
4703
|
+
if (!el.querySelector(".sibu-lazy-loading")) {
|
|
4704
|
+
container.replaceChildren(el);
|
|
4626
4705
|
return;
|
|
4627
4706
|
}
|
|
4628
4707
|
observer = new MutationObserver(() => {
|
|
4629
4708
|
if (suspenseDisposed) return;
|
|
4630
|
-
const loading =
|
|
4709
|
+
const loading = el.querySelector(".sibu-lazy-loading");
|
|
4631
4710
|
if (!loading) {
|
|
4632
4711
|
observer?.disconnect();
|
|
4633
4712
|
observer = null;
|
|
4634
|
-
container.replaceChildren(
|
|
4713
|
+
container.replaceChildren(el);
|
|
4635
4714
|
}
|
|
4636
4715
|
});
|
|
4637
|
-
observer.observe(
|
|
4716
|
+
observer.observe(el, { childList: true, subtree: true });
|
|
4638
4717
|
} else {
|
|
4639
|
-
container.replaceChildren(
|
|
4718
|
+
container.replaceChildren(el);
|
|
4640
4719
|
}
|
|
4641
4720
|
} catch (err) {
|
|
4642
4721
|
const errorObj = err instanceof Error ? err : new Error(String(err));
|
|
@@ -5920,25 +5999,34 @@ var lintRules = {
|
|
|
5920
5999
|
let braceDepth = 0;
|
|
5921
6000
|
let insideConditionalOrLoop = false;
|
|
5922
6001
|
let insideNestedFunction = false;
|
|
5923
|
-
|
|
6002
|
+
const fnOpenDepths = [];
|
|
5924
6003
|
for (let i2 = 0; i2 <= lineIdx; i2++) {
|
|
5925
|
-
const
|
|
5926
|
-
|
|
5927
|
-
|
|
5928
|
-
|
|
5929
|
-
if (i2 < lineIdx && /^\s*(if|else\s+if|else|for|while|do|switch)\s*[({]/.test(lines[i2])) {
|
|
6004
|
+
const rawLine = lines[i2];
|
|
6005
|
+
const scanLine = rawLine.trim();
|
|
6006
|
+
const opensFunction = i2 < lineIdx && /\b(function\s+\w+|function\s*\(|=>\s*\{)/.test(scanLine);
|
|
6007
|
+
if (i2 < lineIdx && /^\s*(if|else\s+if|else|for|while|do|switch)\s*[({]/.test(rawLine)) {
|
|
5930
6008
|
insideConditionalOrLoop = true;
|
|
5931
6009
|
}
|
|
5932
|
-
|
|
5933
|
-
|
|
5934
|
-
if (ch === "
|
|
6010
|
+
let fnBracePending = opensFunction;
|
|
6011
|
+
for (const ch of rawLine) {
|
|
6012
|
+
if (ch === "{") {
|
|
6013
|
+
braceDepth++;
|
|
6014
|
+
if (fnBracePending) {
|
|
6015
|
+
fnOpenDepths.push(braceDepth);
|
|
6016
|
+
fnBracePending = false;
|
|
6017
|
+
}
|
|
6018
|
+
} else if (ch === "}") {
|
|
5935
6019
|
braceDepth--;
|
|
6020
|
+
while (fnOpenDepths.length > 0 && fnOpenDepths[fnOpenDepths.length - 1] > braceDepth) {
|
|
6021
|
+
fnOpenDepths.pop();
|
|
6022
|
+
}
|
|
5936
6023
|
if (braceDepth <= 1) {
|
|
5937
6024
|
insideConditionalOrLoop = false;
|
|
5938
6025
|
}
|
|
5939
6026
|
}
|
|
5940
6027
|
}
|
|
5941
6028
|
}
|
|
6029
|
+
const functionDepth = fnOpenDepths.length;
|
|
5942
6030
|
const beforeHook = line2.substring(0, line2.indexOf(hookMatch[0]));
|
|
5943
6031
|
const inlineConditional = /\b(if|else|for|while|switch)\s*\(/.test(beforeHook) || /\?\s*$/.test(beforeHook.trim());
|
|
5944
6032
|
if (insideConditionalOrLoop || inlineConditional) {
|