@fictjs/runtime 0.5.2 → 0.7.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 (63) hide show
  1. package/dist/advanced.cjs +13 -9
  2. package/dist/advanced.cjs.map +1 -1
  3. package/dist/advanced.d.cts +4 -4
  4. package/dist/advanced.d.ts +4 -4
  5. package/dist/advanced.js +8 -4
  6. package/dist/advanced.js.map +1 -1
  7. package/dist/{chunk-D2IWOO4X.js → chunk-4LCHQ7U4.js} +250 -99
  8. package/dist/chunk-4LCHQ7U4.js.map +1 -0
  9. package/dist/{chunk-LRFMCJY3.js → chunk-7YQK3XKY.js} +120 -27
  10. package/dist/chunk-7YQK3XKY.js.map +1 -0
  11. package/dist/{chunk-QB2UD62G.cjs → chunk-CEV6TO5U.cjs} +8 -8
  12. package/dist/{chunk-QB2UD62G.cjs.map → chunk-CEV6TO5U.cjs.map} +1 -1
  13. package/dist/{chunk-ZR435MDC.cjs → chunk-FSCBL7RI.cjs} +120 -27
  14. package/dist/chunk-FSCBL7RI.cjs.map +1 -0
  15. package/dist/{chunk-KNGHYGK4.cjs → chunk-HHDHQGJY.cjs} +17 -17
  16. package/dist/{chunk-KNGHYGK4.cjs.map → chunk-HHDHQGJY.cjs.map} +1 -1
  17. package/dist/{chunk-Z6M3HKLG.cjs → chunk-PRF4QG73.cjs} +400 -249
  18. package/dist/chunk-PRF4QG73.cjs.map +1 -0
  19. package/dist/{chunk-4NUHM77Z.js → chunk-TLDT76RV.js} +3 -3
  20. package/dist/{chunk-SLFAEVKJ.js → chunk-WRU3IZOA.js} +3 -3
  21. package/dist/{context-CTBE00S_.d.cts → context-BFbHf9nC.d.cts} +1 -1
  22. package/dist/{context-lkLhbkFJ.d.ts → context-C4vBQbb4.d.ts} +1 -1
  23. package/dist/{effect-BpSNEJJz.d.cts → effect-DAzpH7Mm.d.cts} +33 -1
  24. package/dist/{effect-BpSNEJJz.d.ts → effect-DAzpH7Mm.d.ts} +33 -1
  25. package/dist/index.cjs +42 -42
  26. package/dist/index.d.cts +5 -5
  27. package/dist/index.d.ts +5 -5
  28. package/dist/index.dev.js +206 -46
  29. package/dist/index.dev.js.map +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/internal.cjs +55 -41
  32. package/dist/internal.cjs.map +1 -1
  33. package/dist/internal.d.cts +3 -3
  34. package/dist/internal.d.ts +3 -3
  35. package/dist/internal.js +17 -3
  36. package/dist/internal.js.map +1 -1
  37. package/dist/loader.cjs +9 -9
  38. package/dist/loader.js +1 -1
  39. package/dist/{props-XTHYD19o.d.cts → props-84UJeWO8.d.cts} +1 -1
  40. package/dist/{props-x-HbI-jX.d.ts → props-BRhFK50f.d.ts} +1 -1
  41. package/dist/{scope-CdbGmsFf.d.ts → scope-D3DpsfoG.d.ts} +1 -1
  42. package/dist/{scope-DfcP9I-A.d.cts → scope-DlCBL1Ft.d.cts} +1 -1
  43. package/package.json +1 -1
  44. package/src/advanced.ts +1 -1
  45. package/src/binding.ts +229 -101
  46. package/src/constants.ts +1 -1
  47. package/src/cycle-guard.ts +4 -3
  48. package/src/dom.ts +15 -4
  49. package/src/hooks.ts +1 -1
  50. package/src/internal.ts +7 -0
  51. package/src/lifecycle.ts +1 -1
  52. package/src/props.ts +60 -1
  53. package/src/signal.ts +60 -10
  54. package/src/store.ts +131 -18
  55. package/src/transition.ts +46 -9
  56. package/dist/chunk-D2IWOO4X.js.map +0 -1
  57. package/dist/chunk-LRFMCJY3.js.map +0 -1
  58. package/dist/chunk-Z6M3HKLG.cjs.map +0 -1
  59. package/dist/chunk-ZR435MDC.cjs.map +0 -1
  60. package/dist/jsx-dev-runtime.d.cts +0 -671
  61. package/dist/jsx-dev-runtime.d.ts +0 -671
  62. /package/dist/{chunk-4NUHM77Z.js.map → chunk-TLDT76RV.js.map} +0 -0
  63. /package/dist/{chunk-SLFAEVKJ.js.map → chunk-WRU3IZOA.js.map} +0 -0
@@ -25,7 +25,7 @@ var DelegatedEventNames = [
25
25
  ];
26
26
 
27
27
  // src/constants.ts
28
- var isDev = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || process.env?.NODE_ENV !== "production";
28
+ var isDev = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
29
29
  var booleans = isDev ? [
30
30
  "allowfullscreen",
31
31
  "async",
@@ -387,7 +387,7 @@ function getDevtoolsHook() {
387
387
  }
388
388
 
389
389
  // src/cycle-guard.ts
390
- var isDev2 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || process.env?.NODE_ENV !== "production";
390
+ var isDev2 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
391
391
  var setCycleProtectionOptions = () => {
392
392
  };
393
393
  var resetCycleProtectionStateForTests = () => {
@@ -401,7 +401,8 @@ var enterRootGuard = () => true;
401
401
  var exitRootGuard = () => {
402
402
  };
403
403
  var defaultOptions = {
404
- enabled: isDev2,
404
+ // Keep cycle guards on in production to avoid infinite flush loops.
405
+ enabled: true,
405
406
  maxFlushCyclesPerMicrotask: 1e4,
406
407
  maxEffectRunsPerFlush: 2e4,
407
408
  windowSize: 5,
@@ -554,7 +555,7 @@ var reportCycle = (reason, detail = void 0) => {
554
555
  };
555
556
 
556
557
  // src/lifecycle.ts
557
- var isDev3 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || process.env?.NODE_ENV !== "production";
558
+ var isDev3 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
558
559
  var currentRoot;
559
560
  var currentEffectCleanups;
560
561
  var globalErrorHandlers = /* @__PURE__ */ new WeakMap();
@@ -872,7 +873,7 @@ function createRenderEffect(fn) {
872
873
  }
873
874
 
874
875
  // src/hooks.ts
875
- var isDev4 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || process.env?.NODE_ENV !== "production";
876
+ var isDev4 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
876
877
  var ctxStack = [];
877
878
  var preparedContext = null;
878
879
  function assertRenderContext(ctx, hookName) {
@@ -963,7 +964,7 @@ function __fictRender(ctx, fn) {
963
964
  }
964
965
 
965
966
  // src/signal.ts
966
- var isDev5 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process === "undefined" || process.env?.NODE_ENV !== "production";
967
+ var isDev5 = typeof __DEV__ !== "undefined" ? __DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
967
968
  var Mutable = 1;
968
969
  var Watching = 2;
969
970
  var Running = 4;
@@ -1255,6 +1256,7 @@ function updateComputed(c) {
1255
1256
  } catch (e) {
1256
1257
  activeSub = prevSub;
1257
1258
  c.flags &= ~Running;
1259
+ purgeDeps(c);
1258
1260
  throw e;
1259
1261
  }
1260
1262
  }
@@ -1287,6 +1289,7 @@ function runEffect(e) {
1287
1289
  } catch (err) {
1288
1290
  activeSub = prevSub;
1289
1291
  e.flags = Watching;
1292
+ purgeDeps(e);
1290
1293
  throw err;
1291
1294
  }
1292
1295
  } else if (flags & Pending && e.deps) {
@@ -1324,6 +1327,7 @@ function runEffect(e) {
1324
1327
  } catch (err) {
1325
1328
  activeSub = prevSub;
1326
1329
  e.flags = Watching;
1330
+ purgeDeps(e);
1327
1331
  throw err;
1328
1332
  }
1329
1333
  } else {
@@ -1427,11 +1431,11 @@ function signal(initialValue, options2) {
1427
1431
  subs: void 0,
1428
1432
  subsTail: void 0,
1429
1433
  flags: Mutable,
1430
- __id: void 0,
1431
- ...options2?.equals !== void 0 ? { equals: options2.equals } : {},
1432
- ...options2?.name !== void 0 ? { name: options2.name } : {},
1433
- ...options2?.devToolsSource !== void 0 ? { devToolsSource: options2.devToolsSource } : {}
1434
+ __id: void 0
1434
1435
  };
1436
+ if (options2?.equals !== void 0) s.equals = options2.equals;
1437
+ if (options2?.name !== void 0) s.name = options2.name;
1438
+ if (options2?.devToolsSource !== void 0) s.devToolsSource = options2.devToolsSource;
1435
1439
  if (isDev5) registerSignalDevtools(s);
1436
1440
  const accessor = signalOper.bind(s);
1437
1441
  accessor[SIGNAL_MARKER] = true;
@@ -1486,11 +1490,11 @@ function computed(getter, options2) {
1486
1490
  depsTail: void 0,
1487
1491
  flags: 0,
1488
1492
  getter,
1489
- __id: void 0,
1490
- ...options2?.equals !== void 0 ? { equals: options2.equals } : {},
1491
- ...options2?.name !== void 0 ? { name: options2.name } : {},
1492
- ...options2?.devToolsSource !== void 0 ? { devToolsSource: options2.devToolsSource } : {}
1493
+ __id: void 0
1493
1494
  };
1495
+ if (options2?.equals !== void 0) c.equals = options2.equals;
1496
+ if (options2?.name !== void 0) c.name = options2.name;
1497
+ if (options2?.devToolsSource !== void 0) c.devToolsSource = options2.devToolsSource;
1494
1498
  if (isDev5) registerComputedDevtools(c);
1495
1499
  const bound = computedOper.bind(
1496
1500
  c
@@ -1521,14 +1525,21 @@ function computedOper() {
1521
1525
  this.flags = flags & ~Pending;
1522
1526
  }
1523
1527
  } else if (!flags) {
1528
+ this.depsTail = void 0;
1524
1529
  this.flags = MutableRunning;
1525
1530
  const prevSub = setActiveSub(this);
1526
1531
  try {
1527
1532
  this.value = this.getter(void 0);
1528
1533
  if (isDev5) updateComputedDevtools(this, this.value);
1534
+ } catch (err) {
1535
+ this.flags = 0;
1536
+ purgeDeps(this);
1537
+ throw err;
1529
1538
  } finally {
1530
1539
  setActiveSub(prevSub);
1531
- this.flags &= ~Running;
1540
+ if (this.flags & Running) {
1541
+ this.flags &= ~Running;
1542
+ }
1532
1543
  }
1533
1544
  }
1534
1545
  if (activeSub !== void 0) link(this, activeSub, cycle);
@@ -1552,13 +1563,23 @@ function effect(fn) {
1552
1563
  const prevSub = activeSub;
1553
1564
  if (prevSub !== void 0) link(e, prevSub, 0);
1554
1565
  activeSub = e;
1566
+ let didThrow = false;
1567
+ let thrown;
1555
1568
  try {
1556
1569
  if (isDev5) effectRunDevtools(e);
1557
1570
  fn();
1571
+ } catch (err) {
1572
+ didThrow = true;
1573
+ thrown = err;
1558
1574
  } finally {
1559
1575
  activeSub = prevSub;
1560
- e.flags &= ~Running;
1576
+ if (didThrow) {
1577
+ disposeNode(e);
1578
+ } else {
1579
+ e.flags &= ~Running;
1580
+ }
1561
1581
  }
1582
+ if (didThrow) throw thrown;
1562
1583
  const disposer = effectOper.bind(e);
1563
1584
  disposer[EFFECT_MARKER] = true;
1564
1585
  return disposer;
@@ -1582,13 +1603,23 @@ function effectWithCleanup(fn, cleanupRunner, root) {
1582
1603
  const prevSub = activeSub;
1583
1604
  if (prevSub !== void 0) link(e, prevSub, 0);
1584
1605
  activeSub = e;
1606
+ let didThrow = false;
1607
+ let thrown;
1585
1608
  try {
1586
1609
  if (isDev5) effectRunDevtools(e);
1587
1610
  fn();
1611
+ } catch (err) {
1612
+ didThrow = true;
1613
+ thrown = err;
1588
1614
  } finally {
1589
1615
  activeSub = prevSub;
1590
- e.flags &= ~Running;
1616
+ if (didThrow) {
1617
+ disposeNode(e);
1618
+ } else {
1619
+ e.flags &= ~Running;
1620
+ }
1591
1621
  }
1622
+ if (didThrow) throw thrown;
1592
1623
  const disposer = effectOper.bind(e);
1593
1624
  disposer[EFFECT_MARKER] = true;
1594
1625
  return disposer;
@@ -1601,11 +1632,20 @@ function effectScope(fn) {
1601
1632
  const prevSub = activeSub;
1602
1633
  if (prevSub !== void 0) link(e, prevSub, 0);
1603
1634
  activeSub = e;
1635
+ let didThrow = false;
1636
+ let thrown;
1604
1637
  try {
1605
1638
  fn();
1639
+ } catch (err) {
1640
+ didThrow = true;
1641
+ thrown = err;
1606
1642
  } finally {
1607
1643
  activeSub = prevSub;
1644
+ if (didThrow) {
1645
+ disposeNode(e);
1646
+ }
1608
1647
  }
1648
+ if (didThrow) throw thrown;
1609
1649
  const disposer = effectScopeOper.bind(e);
1610
1650
  disposer[EFFECT_SCOPE_MARKER] = true;
1611
1651
  return disposer;
@@ -1844,6 +1884,20 @@ function createStore(initialValue) {
1844
1884
  }
1845
1885
  var proxyCache = /* @__PURE__ */ new WeakMap();
1846
1886
  var signalCache = /* @__PURE__ */ new WeakMap();
1887
+ var iterateVersionCache = /* @__PURE__ */ new WeakMap();
1888
+ function getIterateVersion(target) {
1889
+ return iterateVersionCache.get(target) ?? 0;
1890
+ }
1891
+ function bumpIterateVersion(target) {
1892
+ const next = getIterateVersion(target) + 1;
1893
+ iterateVersionCache.set(target, next);
1894
+ return next;
1895
+ }
1896
+ function isArrayIndexKey(prop) {
1897
+ if (typeof prop !== "string") return false;
1898
+ const index = Number(prop);
1899
+ return Number.isInteger(index) && index >= 0 && String(index) === prop;
1900
+ }
1847
1901
  function wrap(value) {
1848
1902
  if (value === null || typeof value !== "object") return value;
1849
1903
  if (Reflect.get(value, PROXY)) return value;
@@ -1872,7 +1926,8 @@ function wrap(value) {
1872
1926
  set(target, prop, value2, receiver) {
1873
1927
  if (prop === PROXY || prop === TARGET) return false;
1874
1928
  const isArrayLength = Array.isArray(target) && prop === "length";
1875
- const oldLength = isArrayLength ? target.length : void 0;
1929
+ const isArrayIndex = Array.isArray(target) && isArrayIndexKey(prop);
1930
+ const oldLength = (isArrayLength || isArrayIndex) && Array.isArray(target) ? target.length : void 0;
1876
1931
  const hadKey = Object.prototype.hasOwnProperty.call(target, prop);
1877
1932
  const oldValue = Reflect.get(target, prop, receiver);
1878
1933
  if (oldValue === value2) return true;
@@ -1882,6 +1937,12 @@ function wrap(value) {
1882
1937
  if (!hadKey) {
1883
1938
  trigger(target, ITERATE_KEY);
1884
1939
  }
1940
+ if (isArrayIndex) {
1941
+ const nextLength = target.length;
1942
+ if (typeof oldLength === "number" && nextLength !== oldLength) {
1943
+ trigger(target, "length");
1944
+ }
1945
+ }
1885
1946
  if (isArrayLength) {
1886
1947
  const nextLength = target.length;
1887
1948
  if (typeof oldLength === "number" && nextLength < oldLength) {
@@ -1938,7 +1999,7 @@ function track(target, prop) {
1938
1999
  }
1939
2000
  let s = signals.get(prop);
1940
2001
  if (!s) {
1941
- const initial = prop === ITERATE_KEY ? Reflect.ownKeys(target).length : getLastValue(target, prop);
2002
+ const initial = prop === ITERATE_KEY ? getIterateVersion(target) : getLastValue(target, prop);
1942
2003
  s = signal(initial);
1943
2004
  signals.set(prop, s);
1944
2005
  }
@@ -1950,7 +2011,7 @@ function trigger(target, prop) {
1950
2011
  const s = signals.get(prop);
1951
2012
  if (s) {
1952
2013
  if (prop === ITERATE_KEY) {
1953
- s(Reflect.ownKeys(target).length);
2014
+ s(bumpIterateVersion(target));
1954
2015
  } else {
1955
2016
  s(getLastValue(target, prop));
1956
2017
  }
@@ -1960,7 +2021,22 @@ function trigger(target, prop) {
1960
2021
  function getLastValue(target, prop) {
1961
2022
  return Reflect.get(target, prop);
1962
2023
  }
1963
- function reconcile(target, value) {
2024
+ function isPlainObject(value) {
2025
+ const proto = Object.getPrototypeOf(value);
2026
+ return proto === Object.prototype || proto === null;
2027
+ }
2028
+ function isReconcilableObject(value) {
2029
+ if (value === null || typeof value !== "object") return false;
2030
+ const raw = unwrap(value);
2031
+ return Array.isArray(raw) || isPlainObject(raw);
2032
+ }
2033
+ function canReconcileNestedValues(current, next) {
2034
+ if (!isReconcilableObject(current) || !isReconcilableObject(next)) return false;
2035
+ const currentRaw = unwrap(current);
2036
+ const nextRaw = unwrap(next);
2037
+ return Array.isArray(currentRaw) === Array.isArray(nextRaw);
2038
+ }
2039
+ function reconcile(target, value, seenPairs) {
1964
2040
  if (target === value) return;
1965
2041
  if (value === null || typeof value !== "object") {
1966
2042
  throw new Error(
@@ -1971,18 +2047,35 @@ function reconcile(target, value) {
1971
2047
  }
1972
2048
  const realTarget = unwrap(target);
1973
2049
  const realValue = unwrap(value);
2050
+ const seen = seenPairs ?? /* @__PURE__ */ new WeakMap();
2051
+ let visitedValues = seen.get(realTarget);
2052
+ if (!visitedValues) {
2053
+ visitedValues = /* @__PURE__ */ new WeakSet();
2054
+ seen.set(realTarget, visitedValues);
2055
+ }
2056
+ if (visitedValues.has(realValue)) return;
2057
+ visitedValues.add(realValue);
1974
2058
  const keys = /* @__PURE__ */ new Set([...Object.keys(realTarget), ...Object.keys(realValue)]);
1975
2059
  for (const key of keys) {
1976
2060
  const rTarget = realTarget;
1977
2061
  const rValue = realValue;
1978
- if (rValue[key] === void 0 && rTarget[key] !== void 0) {
2062
+ const hasCurrent = Object.prototype.hasOwnProperty.call(rTarget, key);
2063
+ const hasNext = Object.prototype.hasOwnProperty.call(rValue, key);
2064
+ const current = rTarget[key];
2065
+ const next = rValue[key];
2066
+ if (!hasNext && hasCurrent) {
1979
2067
  delete target[key];
1980
- } else if (rTarget[key] !== rValue[key]) {
1981
- ;
1982
- target[key] = rValue[key];
2068
+ } else if (hasNext && (!hasCurrent || current !== next)) {
2069
+ if (canReconcileNestedValues(current, next)) {
2070
+ reconcile(target[key], next, seen);
2071
+ } else {
2072
+ ;
2073
+ target[key] = next;
2074
+ }
1983
2075
  }
1984
2076
  }
1985
- if (Array.isArray(target) && Array.isArray(realValue) && target.length !== realValue.length) {
2077
+ if (Array.isArray(realTarget) && Array.isArray(realValue) && realTarget.length !== realValue.length) {
2078
+ ;
1986
2079
  target.length = realValue.length;
1987
2080
  }
1988
2081
  }
@@ -2460,4 +2553,4 @@ export {
2460
2553
  serializeValue,
2461
2554
  deserializeValue
2462
2555
  };
2463
- //# sourceMappingURL=chunk-LRFMCJY3.js.map
2556
+ //# sourceMappingURL=chunk-7YQK3XKY.js.map