sibujs 3.1.0 → 3.2.0

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.
Files changed (78) hide show
  1. package/README.md +6 -0
  2. package/dist/browser.cjs +16 -8
  3. package/dist/browser.js +6 -5
  4. package/dist/build.cjs +235 -147
  5. package/dist/build.js +35 -24
  6. package/dist/cdn.global.js +7 -7
  7. package/dist/{chunk-WYU7CYJ3.js → chunk-2C4E3HBM.js} +5 -5
  8. package/dist/{chunk-3DYB5B3S.js → chunk-4JCAUOLN.js} +45 -23
  9. package/dist/{chunk-2HAGQWDV.js → chunk-5N74TKLD.js} +1 -1
  10. package/dist/{chunk-SVVAUX7J.js → chunk-7XDYVJLE.js} +19 -9
  11. package/dist/{chunk-2N2UL7O4.js → chunk-BGNLPNGV.js} +20 -12
  12. package/dist/{chunk-RK4BQG25.js → chunk-C427DVQF.js} +1 -1
  13. package/dist/{chunk-ZIBE2SAT.js → chunk-FDY42FIU.js} +3 -2
  14. package/dist/{chunk-GQ7RRFPU.js → chunk-FOI23UJL.js} +11 -1
  15. package/dist/{chunk-2RA7SHDA.js → chunk-GOJMFRBL.js} +20 -4
  16. package/dist/{chunk-IVOUCSZL.js → chunk-GOUM4JCT.js} +6 -6
  17. package/dist/chunk-H3SRKIYX.js +17 -0
  18. package/dist/{chunk-3DJH25UO.js → chunk-H6PCHJZQ.js} +2 -2
  19. package/dist/{chunk-UCS6AMJ7.js → chunk-HMJFCBRR.js} +26 -3
  20. package/dist/{chunk-JYD2PWXH.js → chunk-HXMS4SNP.js} +22 -15
  21. package/dist/{chunk-SC437AMI.js → chunk-JYXOEYI4.js} +12 -18
  22. package/dist/{chunk-KB3BA2XK.js → chunk-NFYWLRUO.js} +11 -18
  23. package/dist/{chunk-QNQY5DUS.js → chunk-NPIEEKPT.js} +20 -11
  24. package/dist/{chunk-UYX2NDOH.js → chunk-OYLPZO4N.js} +33 -15
  25. package/dist/{chunk-LYTCUZ7H.js → chunk-RDRSWYNP.js} +1 -1
  26. package/dist/{chunk-2ZJ7TSW4.js → chunk-RLUJL2MV.js} +4 -8
  27. package/dist/{chunk-CR4MXPHB.js → chunk-V2MTG5FT.js} +99 -36
  28. package/dist/{chunk-CNZ35WI2.js → chunk-VJE6DDYM.js} +2 -2
  29. package/dist/{chunk-PMSDFTK3.js → chunk-VOCE4NNK.js} +157 -75
  30. package/dist/{chunk-WKUXSE7V.js → chunk-X67UYC74.js} +12 -11
  31. package/dist/{chunk-EFOAE5NC.js → chunk-YFDGQWDA.js} +1 -1
  32. package/dist/{chunk-3U4ZVXVD.js → chunk-Z2FWAE4B.js} +6 -2
  33. package/dist/data.cjs +190 -94
  34. package/dist/data.d.cts +7 -1
  35. package/dist/data.d.ts +7 -1
  36. package/dist/data.js +8 -8
  37. package/dist/devtools.cjs +38 -10
  38. package/dist/devtools.d.cts +1 -1
  39. package/dist/devtools.d.ts +1 -1
  40. package/dist/devtools.js +6 -6
  41. package/dist/ecosystem.cjs +123 -63
  42. package/dist/ecosystem.js +9 -9
  43. package/dist/extras.cjs +380 -196
  44. package/dist/extras.d.cts +2 -2
  45. package/dist/extras.d.ts +2 -2
  46. package/dist/extras.js +27 -24
  47. package/dist/index.cjs +214 -136
  48. package/dist/index.d.cts +15 -2
  49. package/dist/index.d.ts +15 -2
  50. package/dist/index.js +15 -13
  51. package/dist/{introspect-BZWKvQUZ.d.ts → introspect-DOZfmC-4.d.ts} +1 -1
  52. package/dist/{introspect-DsJlDD2T.d.cts → introspect-RjLfIFpL.d.cts} +1 -1
  53. package/dist/motion.cjs +10 -0
  54. package/dist/motion.js +3 -3
  55. package/dist/patterns.cjs +45 -40
  56. package/dist/patterns.js +8 -7
  57. package/dist/performance.cjs +101 -25
  58. package/dist/performance.d.cts +2 -2
  59. package/dist/performance.d.ts +2 -2
  60. package/dist/performance.js +8 -7
  61. package/dist/plugins.cjs +203 -136
  62. package/dist/plugins.d.cts +1 -1
  63. package/dist/plugins.d.ts +1 -1
  64. package/dist/plugins.js +96 -45
  65. package/dist/{ssr-FXD2PPMC.js → ssr-2QDQ27EV.js} +5 -3
  66. package/dist/{ssr-CrVNy6Pa.d.cts → ssr-D62yFwuw.d.cts} +8 -1
  67. package/dist/{ssr-CrVNy6Pa.d.ts → ssr-D62yFwuw.d.ts} +8 -1
  68. package/dist/ssr.cjs +145 -66
  69. package/dist/ssr.d.cts +1 -1
  70. package/dist/ssr.d.ts +1 -1
  71. package/dist/ssr.js +12 -10
  72. package/dist/testing.cjs +9 -4
  73. package/dist/testing.js +3 -3
  74. package/dist/ui.cjs +54 -38
  75. package/dist/ui.js +10 -9
  76. package/dist/widgets.cjs +40 -24
  77. package/dist/widgets.js +8 -8
  78. 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 = childExprs.length === 1 ? childExprs[0] : childExprs[0];
404
+ compiled = rootExpr;
403
405
  } else {
404
- const body2 = childExprs.length === 1 ? childExprs[0] : childExprs[0];
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.replace(/[\x00-\x20\x7f-\x9f]+/g, "").trim();
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 = () => cleanup(subscriber));
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[0] === "o" || name[0] === "O") && (name[1] === "n" || name[1] === "N")) return;
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/reactivity/bindChildNode.ts
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 (_isDev4) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
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 (_isDev4)
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
- const anchor = placeholder.nextSibling;
1959
+ let prev = placeholder;
1878
1960
  for (let i2 = 0; i2 < newNodes.length; i2++) {
1879
1961
  const node = newNodes[i2];
1880
- if (reused?.has(node) && node.parentNode === parent) {
1881
- if (node.nextSibling !== anchor) {
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 (lkey[0] === "o" && lkey[1] === "n") continue;
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
- const valStart = pos;
2480
- while (pos < len) {
2481
- const c = template2.charCodeAt(pos);
2482
- if (c === 32 || c === 9 || c === 10 || c === 13 || c === 62 || c === 47) break;
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 (lname[0] === "o" && lname[1] === "n") break;
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
- const req = Function("return typeof require==='function'?require:null")();
3459
- if (req) {
3460
- const mod = req("node:async_hooks");
3461
- als = new mod.AsyncLocalStorage();
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
- const prev = cs._v;
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(_, prop) {
3769
- if (prop in signals) {
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 void 0;
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 in signals) {
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 childEl = nodes();
4623
- if (childEl.classList.contains("sibu-lazy")) {
4624
- if (!childEl.querySelector(".sibu-lazy-loading")) {
4625
- container.replaceChildren(childEl);
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 = childEl.querySelector(".sibu-lazy-loading");
4709
+ const loading = el.querySelector(".sibu-lazy-loading");
4631
4710
  if (!loading) {
4632
4711
  observer?.disconnect();
4633
4712
  observer = null;
4634
- container.replaceChildren(childEl);
4713
+ container.replaceChildren(el);
4635
4714
  }
4636
4715
  });
4637
- observer.observe(childEl, { childList: true, subtree: true });
4716
+ observer.observe(el, { childList: true, subtree: true });
4638
4717
  } else {
4639
- container.replaceChildren(childEl);
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
- let functionDepth = 0;
6002
+ const fnOpenDepths = [];
5924
6003
  for (let i2 = 0; i2 <= lineIdx; i2++) {
5925
- const scanLine = lines[i2].trim();
5926
- if (/\b(function\s+\w+|function\s*\(|=>\s*\{)/.test(scanLine) && i2 < lineIdx) {
5927
- functionDepth++;
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
- for (const ch of lines[i2]) {
5933
- if (ch === "{") braceDepth++;
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) {