sibujs 2.1.0 → 2.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 (62) hide show
  1. package/dist/browser.cjs +324 -273
  2. package/dist/browser.js +4 -4
  3. package/dist/build.cjs +358 -328
  4. package/dist/build.js +10 -10
  5. package/dist/cdn.global.js +8 -8
  6. package/dist/{chunk-ZAQSMOED.js → chunk-2JQUV4Y3.js} +4 -4
  7. package/dist/{chunk-GWWURC5M.js → chunk-2KM2724A.js} +2 -2
  8. package/dist/{chunk-NASX6ST2.js → chunk-4YTVESDX.js} +1 -1
  9. package/dist/chunk-5WD7BYTZ.js +152 -0
  10. package/dist/{chunk-RDTDJCAB.js → chunk-6QZO7MMG.js} +48 -16
  11. package/dist/{chunk-DRUZZAK4.js → chunk-DF3GTP4Q.js} +7 -2
  12. package/dist/{chunk-AMK2TYNW.js → chunk-J63GPPCJ.js} +9 -9
  13. package/dist/{chunk-O6EFQ3KT.js → chunk-KH4OE6WY.js} +5 -5
  14. package/dist/{chunk-V6C4FADE.js → chunk-KZA7ANXP.js} +3 -3
  15. package/dist/chunk-L4DAT4WU.js +400 -0
  16. package/dist/{chunk-WANSMF2L.js → chunk-L52H775O.js} +4 -4
  17. package/dist/{chunk-45YP72ZQ.js → chunk-NEWH4O5U.js} +1 -1
  18. package/dist/{chunk-ON5MMR2J.js → chunk-RJIRT46U.js} +4 -4
  19. package/dist/{chunk-P2HSJDDN.js → chunk-STFTTMO2.js} +2 -2
  20. package/dist/{chunk-WIPZPFBQ.js → chunk-UKMXT5T6.js} +1 -1
  21. package/dist/{chunk-KGYT6UO6.js → chunk-V65KTDZW.js} +3 -3
  22. package/dist/{chunk-CWBVQML6.js → chunk-VSNLICTS.js} +1 -1
  23. package/dist/{chunk-3DZP6OIT.js → chunk-XDKP4T7G.js} +2 -2
  24. package/dist/{chunk-TH2ILCYW.js → chunk-XVYB3J6C.js} +27 -33
  25. package/dist/{chunk-OJ3P4ECI.js → chunk-YMOIAHWA.js} +1 -1
  26. package/dist/data.cjs +332 -298
  27. package/dist/data.js +6 -6
  28. package/dist/devtools.cjs +353 -296
  29. package/dist/devtools.d.cts +1 -1
  30. package/dist/devtools.d.ts +1 -1
  31. package/dist/devtools.js +4 -4
  32. package/dist/ecosystem.cjs +332 -298
  33. package/dist/ecosystem.js +7 -7
  34. package/dist/extras.cjs +372 -328
  35. package/dist/extras.d.cts +1 -1
  36. package/dist/extras.d.ts +1 -1
  37. package/dist/extras.js +19 -19
  38. package/dist/index.cjs +358 -328
  39. package/dist/index.d.cts +13 -22
  40. package/dist/index.d.ts +13 -22
  41. package/dist/index.js +10 -10
  42. package/dist/{introspect-DnIpHQQz.d.ts → introspect-BZWKvQUZ.d.ts} +2 -3
  43. package/dist/{introspect-2TOlQ7oa.d.cts → introspect-DsJlDD2T.d.cts} +2 -3
  44. package/dist/motion.cjs +147 -123
  45. package/dist/motion.js +3 -3
  46. package/dist/patterns.cjs +332 -298
  47. package/dist/patterns.js +5 -5
  48. package/dist/performance.cjs +315 -268
  49. package/dist/performance.js +4 -4
  50. package/dist/plugins.cjs +332 -266
  51. package/dist/plugins.js +6 -6
  52. package/dist/ssr.cjs +340 -270
  53. package/dist/ssr.js +7 -7
  54. package/dist/testing.cjs +167 -146
  55. package/dist/testing.js +2 -2
  56. package/dist/ui.cjs +324 -294
  57. package/dist/ui.js +6 -6
  58. package/dist/widgets.cjs +332 -298
  59. package/dist/widgets.js +6 -6
  60. package/package.json +1 -1
  61. package/dist/chunk-QO3WC6FS.js +0 -384
  62. package/dist/chunk-WZA53FXU.js +0 -149
package/dist/ssr.js CHANGED
@@ -22,8 +22,8 @@ import {
22
22
  wasm,
23
23
  worker,
24
24
  workerFn
25
- } from "./chunk-KGYT6UO6.js";
26
- import "./chunk-CWBVQML6.js";
25
+ } from "./chunk-V65KTDZW.js";
26
+ import "./chunk-VSNLICTS.js";
27
27
  import {
28
28
  collectStream,
29
29
  deserializeState,
@@ -43,14 +43,14 @@ import {
43
43
  suspenseSwapScript,
44
44
  trustHTML
45
45
  } from "./chunk-JYD2PWXH.js";
46
- import "./chunk-P2HSJDDN.js";
47
- import "./chunk-WIPZPFBQ.js";
46
+ import "./chunk-STFTTMO2.js";
47
+ import "./chunk-UKMXT5T6.js";
48
48
  import "./chunk-2UPRY23K.js";
49
49
  import "./chunk-UCS6AMJ7.js";
50
- import "./chunk-WZA53FXU.js";
50
+ import "./chunk-5WD7BYTZ.js";
51
51
  import "./chunk-2RA7SHDA.js";
52
- import "./chunk-RDTDJCAB.js";
53
- import "./chunk-QO3WC6FS.js";
52
+ import "./chunk-6QZO7MMG.js";
53
+ import "./chunk-L4DAT4WU.js";
54
54
  import "./chunk-LMLD24FC.js";
55
55
  export {
56
56
  Head,
package/dist/testing.cjs CHANGED
@@ -1549,69 +1549,88 @@ function testComponent(component, options = {}) {
1549
1549
 
1550
1550
  // src/reactivity/track.ts
1551
1551
  var _isDev3 = isDev();
1552
- var STACK_INITIAL = 32;
1553
- var STACK_SHRINK_THRESHOLD = 128;
1554
- var subscriberStack = new Array(STACK_INITIAL);
1555
- var stackCapacity = STACK_INITIAL;
1556
- var stackTop = -1;
1552
+ var POOL_MAX = 4096;
1553
+ var nodePool = [];
1554
+ function freeNode(node) {
1555
+ node.sig = null;
1556
+ node.sub = null;
1557
+ node.sigPrev = null;
1558
+ node.sigNext = null;
1559
+ node.subPrev = null;
1560
+ node.subNext = null;
1561
+ node.prevActive = null;
1562
+ if (nodePool.length < POOL_MAX) nodePool.push(node);
1563
+ }
1564
+ function unlinkSignal(node) {
1565
+ const sig = node.sig;
1566
+ if (!sig) return;
1567
+ const prev = node.sigPrev;
1568
+ const next = node.sigNext;
1569
+ if (prev) prev.sigNext = next;
1570
+ else sig.subsHead = next;
1571
+ if (next) next.sigPrev = prev;
1572
+ else sig.subsTail = prev;
1573
+ sig.__sc = (sig.__sc ?? 1) - 1;
1574
+ if (sig.__activeNode === node) sig.__activeNode = node.prevActive;
1575
+ if (sig.__sc === 0) {
1576
+ sig.subsHead = null;
1577
+ sig.subsTail = null;
1578
+ }
1579
+ }
1580
+ function unlinkSub(node) {
1581
+ const sub = node.sub;
1582
+ if (!sub) return;
1583
+ const prev = node.subPrev;
1584
+ const next = node.subNext;
1585
+ if (prev) prev.subNext = next;
1586
+ else sub.depsHead = next;
1587
+ if (next) next.subPrev = prev;
1588
+ else sub.depsTail = prev;
1589
+ }
1557
1590
  var currentSubscriber = null;
1558
- var SUBS = "__s";
1559
- function syncFastPath(signal, subs) {
1560
- const size = subs.size;
1561
- if (size === 0) {
1562
- signal.__f = void 0;
1563
- delete signal[SUBS];
1564
- } else if (size === 1) {
1565
- signal.__f = subs.values().next().value;
1566
- } else {
1567
- signal.__f = void 0;
1568
- }
1569
- }
1570
- function track(effectFn, subscriber) {
1571
- if (!subscriber) subscriber = effectFn;
1572
- cleanup(subscriber);
1573
- ++stackTop;
1574
- if (stackTop >= stackCapacity) {
1575
- stackCapacity *= 2;
1576
- subscriberStack.length = stackCapacity;
1577
- }
1578
- subscriberStack[stackTop] = subscriber;
1591
+ var subscriberEpochCounter = 0;
1592
+ function retrack(effectFn, subscriber) {
1593
+ const prev = currentSubscriber;
1579
1594
  currentSubscriber = subscriber;
1595
+ const sub = subscriber;
1596
+ const epoch = ++subscriberEpochCounter;
1597
+ sub._epoch = epoch;
1598
+ sub._structDirty = false;
1599
+ for (let n = sub.depsHead ?? null; n !== null; n = n.subNext) {
1600
+ const sig = n.sig;
1601
+ n.prevActive = sig.__activeNode ?? null;
1602
+ sig.__activeNode = n;
1603
+ }
1580
1604
  try {
1581
1605
  effectFn();
1582
1606
  } finally {
1583
- stackTop--;
1584
- currentSubscriber = stackTop >= 0 ? subscriberStack[stackTop] : null;
1585
- if (stackTop < 0 && stackCapacity > STACK_SHRINK_THRESHOLD) {
1586
- stackCapacity = Math.max(STACK_INITIAL, stackCapacity >>> 1);
1587
- subscriberStack.length = stackCapacity;
1607
+ currentSubscriber = prev;
1608
+ let node = sub.depsHead ?? null;
1609
+ while (node !== null) {
1610
+ const next = node.subNext;
1611
+ const sig = node.sig;
1612
+ sig.__activeNode = node.prevActive;
1613
+ node.prevActive = null;
1614
+ if (node.epoch !== epoch) {
1615
+ unlinkSub(node);
1616
+ unlinkSignal(node);
1617
+ freeNode(node);
1618
+ }
1619
+ node = next;
1588
1620
  }
1589
1621
  }
1590
- return () => cleanup(subscriber);
1591
1622
  }
1592
1623
  function cleanup(subscriber) {
1593
1624
  const sub = subscriber;
1594
- const singleDep = sub._dep;
1595
- if (singleDep !== void 0) {
1596
- const sig = singleDep;
1597
- const subs = sig[SUBS];
1598
- if (subs?.delete(subscriber)) {
1599
- syncFastPath(sig, subs);
1600
- }
1601
- sub._dep = void 0;
1602
- sub._depEpoch = void 0;
1603
- return;
1604
- }
1605
- const deps = sub._deps;
1606
- if (!deps || deps.size === 0) return;
1607
- for (const signal of deps.keys()) {
1608
- const sig = signal;
1609
- const subs = sig[SUBS];
1610
- if (subs?.delete(subscriber)) {
1611
- syncFastPath(sig, subs);
1612
- }
1625
+ let node = sub.depsHead ?? null;
1626
+ sub.depsHead = null;
1627
+ sub.depsTail = null;
1628
+ while (node) {
1629
+ const next = node.subNext;
1630
+ unlinkSignal(node);
1631
+ freeNode(node);
1632
+ node = next;
1613
1633
  }
1614
- deps.clear();
1615
1634
  }
1616
1635
 
1617
1636
  // src/core/ssr-context.ts
@@ -1641,120 +1660,122 @@ function isSSR() {
1641
1660
 
1642
1661
  // src/core/signals/effect.ts
1643
1662
  var _g = globalThis;
1663
+ var MAX_RERUNS = 100;
1664
+ function flushUserCleanups(ctx) {
1665
+ const list = ctx.userCleanups;
1666
+ if (list.length === 0) return;
1667
+ ctx.userCleanups = [];
1668
+ for (let i = list.length - 1; i >= 0; i--) {
1669
+ try {
1670
+ list[i]();
1671
+ } catch (err) {
1672
+ if (typeof console !== "undefined") console.warn("[SibuJS effect] onCleanup threw:", err);
1673
+ }
1674
+ }
1675
+ }
1676
+ function drainReruns(ctx) {
1677
+ let reruns = 1;
1678
+ do {
1679
+ ctx.rerunPending = false;
1680
+ if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
1681
+ retrack(ctx.bodyFn, ctx.subscriber);
1682
+ } while (ctx.rerunPending && ++reruns <= MAX_RERUNS);
1683
+ if (ctx.rerunPending) {
1684
+ ctx.rerunPending = false;
1685
+ if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
1686
+ console.error(
1687
+ `[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
1688
+ );
1689
+ }
1690
+ }
1691
+ }
1692
+ function disposeEffect(ctx) {
1693
+ if (ctx.disposed) return;
1694
+ ctx.disposed = true;
1695
+ const h = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
1696
+ if (h) {
1697
+ try {
1698
+ h.emit("effect:destroy", { effectFn: ctx.fn });
1699
+ } catch {
1700
+ }
1701
+ }
1702
+ try {
1703
+ if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
1704
+ } catch (err) {
1705
+ if (typeof console !== "undefined") {
1706
+ console.warn("[SibuJS effect] onCleanup threw during dispose:", err);
1707
+ }
1708
+ }
1709
+ try {
1710
+ cleanup(ctx.subscriber);
1711
+ } catch (err) {
1712
+ if (typeof console !== "undefined") {
1713
+ console.warn("[SibuJS effect] dispose threw:", err);
1714
+ }
1715
+ }
1716
+ }
1644
1717
  function effect(effectFn, options) {
1645
1718
  devAssert(typeof effectFn === "function", "effect: argument must be a function.");
1646
1719
  if (isSSR()) return () => {
1647
1720
  };
1648
- const onError = options?.onError;
1649
- let userCleanups = [];
1650
- const onCleanup = (fn) => {
1651
- userCleanups.push(fn);
1721
+ const ctx = {
1722
+ fn: effectFn,
1723
+ onError: options?.onError,
1724
+ userCleanups: [],
1725
+ running: false,
1726
+ rerunPending: false,
1727
+ disposed: false,
1728
+ onCleanup: null,
1729
+ subscriber: null,
1730
+ bodyFn: null
1652
1731
  };
1653
- const runUserCleanups = () => {
1654
- if (userCleanups.length === 0) return;
1655
- const list = userCleanups;
1656
- userCleanups = [];
1657
- for (let i = list.length - 1; i >= 0; i--) {
1658
- try {
1659
- list[i]();
1660
- } catch (err) {
1661
- if (typeof console !== "undefined") {
1662
- console.warn("[SibuJS effect] onCleanup threw:", err);
1663
- }
1664
- }
1665
- }
1732
+ ctx.onCleanup = (fn) => {
1733
+ ctx.userCleanups.push(fn);
1666
1734
  };
1667
- const invokeBody = () => effectFn(onCleanup);
1668
- const wrappedFn = onError ? () => {
1735
+ const onErrorCaptured = ctx.onError;
1736
+ ctx.bodyFn = onErrorCaptured ? () => {
1669
1737
  try {
1670
- invokeBody();
1738
+ ctx.fn(ctx.onCleanup);
1671
1739
  } catch (err) {
1672
- onError(err);
1740
+ onErrorCaptured(err);
1673
1741
  }
1674
- } : invokeBody;
1675
- let cleanupHandle = () => {
1742
+ } : () => {
1743
+ ctx.fn(ctx.onCleanup);
1676
1744
  };
1677
- let running = false;
1678
- let rerunPending = false;
1679
- const MAX_RERUNS = 100;
1680
- const subscriber = () => {
1681
- if (running) {
1682
- rerunPending = true;
1745
+ const sub = (() => {
1746
+ if (ctx.running) {
1747
+ ctx.rerunPending = true;
1683
1748
  return;
1684
1749
  }
1685
- running = true;
1750
+ ctx.running = true;
1686
1751
  try {
1687
- let reruns = 0;
1688
- do {
1689
- rerunPending = false;
1690
- runUserCleanups();
1691
- cleanupHandle();
1692
- cleanupHandle = track(wrappedFn, subscriber);
1693
- if (++reruns > MAX_RERUNS) {
1694
- if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
1695
- console.error(
1696
- `[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
1697
- );
1698
- }
1699
- rerunPending = false;
1700
- break;
1701
- }
1702
- } while (rerunPending);
1752
+ ctx.rerunPending = false;
1753
+ if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
1754
+ retrack(ctx.bodyFn, sub);
1755
+ if (ctx.rerunPending) drainReruns(ctx);
1703
1756
  } finally {
1704
- running = false;
1705
- rerunPending = false;
1757
+ ctx.running = false;
1758
+ ctx.rerunPending = false;
1706
1759
  }
1707
- };
1708
- running = true;
1760
+ });
1761
+ sub.depsHead = null;
1762
+ sub.depsTail = null;
1763
+ sub._epoch = 0;
1764
+ sub._structDirty = false;
1765
+ sub._runEpoch = 0;
1766
+ sub._runs = 0;
1767
+ ctx.subscriber = sub;
1768
+ ctx.running = true;
1709
1769
  try {
1710
- let reruns = 0;
1711
- do {
1712
- rerunPending = false;
1713
- runUserCleanups();
1714
- cleanupHandle();
1715
- cleanupHandle = track(wrappedFn, subscriber);
1716
- if (++reruns > MAX_RERUNS) {
1717
- if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
1718
- console.error(
1719
- `[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times on initial run \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
1720
- );
1721
- }
1722
- rerunPending = false;
1723
- break;
1724
- }
1725
- } while (rerunPending);
1770
+ retrack(ctx.bodyFn, ctx.subscriber);
1771
+ if (ctx.rerunPending) drainReruns(ctx);
1726
1772
  } finally {
1727
- running = false;
1728
- rerunPending = false;
1773
+ ctx.running = false;
1774
+ ctx.rerunPending = false;
1729
1775
  }
1730
1776
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
1731
1777
  if (hook) hook.emit("effect:create", { effectFn });
1732
- let disposed = false;
1733
- return () => {
1734
- if (disposed) return;
1735
- disposed = true;
1736
- const h = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
1737
- if (h) {
1738
- try {
1739
- h.emit("effect:destroy", { effectFn });
1740
- } catch {
1741
- }
1742
- }
1743
- try {
1744
- runUserCleanups();
1745
- } catch (err) {
1746
- if (typeof console !== "undefined") {
1747
- console.warn("[SibuJS effect] onCleanup threw during dispose:", err);
1748
- }
1749
- }
1750
- try {
1751
- cleanupHandle();
1752
- } catch (err) {
1753
- if (typeof console !== "undefined") {
1754
- console.warn("[SibuJS effect] dispose threw:", err);
1755
- }
1756
- }
1757
- };
1778
+ return () => disposeEffect(ctx);
1758
1779
  }
1759
1780
 
1760
1781
  // src/testing/queries.ts
package/dist/testing.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  } from "./chunk-2UPRY23K.js";
4
4
  import {
5
5
  effect
6
- } from "./chunk-WZA53FXU.js";
6
+ } from "./chunk-5WD7BYTZ.js";
7
7
  import "./chunk-2RA7SHDA.js";
8
- import "./chunk-QO3WC6FS.js";
8
+ import "./chunk-L4DAT4WU.js";
9
9
  import "./chunk-LMLD24FC.js";
10
10
 
11
11
  // src/testing/a11y.ts