@fictjs/runtime 0.2.2 → 0.3.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 (58) hide show
  1. package/dist/advanced.cjs +10 -8
  2. package/dist/advanced.cjs.map +1 -1
  3. package/dist/advanced.d.cts +10 -16
  4. package/dist/advanced.d.ts +10 -16
  5. package/dist/advanced.js +5 -3
  6. package/dist/advanced.js.map +1 -1
  7. package/dist/{chunk-3U7EBKEU.cjs → chunk-ID3WBWNO.cjs} +559 -319
  8. package/dist/chunk-ID3WBWNO.cjs.map +1 -0
  9. package/dist/{chunk-3A4VW6AK.cjs → chunk-L4DIV3RC.cjs} +7 -7
  10. package/dist/{chunk-3A4VW6AK.cjs.map → chunk-L4DIV3RC.cjs.map} +1 -1
  11. package/dist/{chunk-URDFDRHR.cjs → chunk-M2TSXZ4C.cjs} +16 -16
  12. package/dist/{chunk-URDFDRHR.cjs.map → chunk-M2TSXZ4C.cjs.map} +1 -1
  13. package/dist/{chunk-YVS4WJ2W.js → chunk-SO6X7G5S.js} +558 -318
  14. package/dist/chunk-SO6X7G5S.js.map +1 -0
  15. package/dist/{chunk-LU2LD2WJ.js → chunk-TWELIZRY.js} +2 -2
  16. package/dist/{chunk-TEYUDPTA.js → chunk-XLIZJMMJ.js} +2 -2
  17. package/dist/{context-9gFXOdJl.d.cts → context-B25xyQrJ.d.cts} +36 -2
  18. package/dist/{context-4woHo7-L.d.ts → context-CGdP7_Jb.d.ts} +36 -2
  19. package/dist/{effect-ClARNUCc.d.cts → effect-D6kaLM2-.d.cts} +80 -1
  20. package/dist/{effect-ClARNUCc.d.ts → effect-D6kaLM2-.d.ts} +80 -1
  21. package/dist/index.cjs +40 -38
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +4 -4
  24. package/dist/index.d.ts +4 -4
  25. package/dist/index.dev.js +430 -246
  26. package/dist/index.dev.js.map +1 -1
  27. package/dist/index.js +4 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal.cjs +39 -35
  30. package/dist/internal.cjs.map +1 -1
  31. package/dist/internal.d.cts +8 -6
  32. package/dist/internal.d.ts +8 -6
  33. package/dist/internal.js +7 -3
  34. package/dist/internal.js.map +1 -1
  35. package/dist/{props-DAyeRPwH.d.ts → props-BEgIVMRx.d.ts} +8 -15
  36. package/dist/{props-CBwuh35e.d.cts → props-BIfromL0.d.cts} +8 -15
  37. package/dist/scope-Cx_3CjIZ.d.cts +18 -0
  38. package/dist/scope-CzNkn587.d.ts +18 -0
  39. package/package.json +1 -1
  40. package/src/advanced.ts +1 -0
  41. package/src/binding.ts +30 -4
  42. package/src/constants.ts +5 -0
  43. package/src/cycle-guard.ts +164 -103
  44. package/src/devtools.ts +22 -2
  45. package/src/dom.ts +84 -10
  46. package/src/hooks.ts +60 -13
  47. package/src/index.ts +3 -1
  48. package/src/internal.ts +2 -2
  49. package/src/lifecycle.ts +13 -5
  50. package/src/memo.ts +3 -4
  51. package/src/props.ts +16 -0
  52. package/src/signal.ts +204 -36
  53. package/dist/chunk-3U7EBKEU.cjs.map +0 -1
  54. package/dist/chunk-YVS4WJ2W.js.map +0 -1
  55. package/dist/scope-DvgMquEy.d.ts +0 -55
  56. package/dist/scope-xmdo6lVU.d.cts +0 -55
  57. /package/dist/{chunk-LU2LD2WJ.js.map → chunk-TWELIZRY.js.map} +0 -0
  58. /package/dist/{chunk-TEYUDPTA.js.map → chunk-XLIZJMMJ.js.map} +0 -0
package/dist/advanced.cjs CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkURDFDRHRcjs = require('./chunk-URDFDRHR.cjs');
5
+ var _chunkM2TSXZ4Ccjs = require('./chunk-M2TSXZ4C.cjs');
6
6
 
7
7
 
8
8
 
9
- var _chunk3A4VW6AKcjs = require('./chunk-3A4VW6AK.cjs');
9
+ var _chunkL4DIV3RCcjs = require('./chunk-L4DIV3RC.cjs');
10
10
 
11
11
 
12
12
 
@@ -23,13 +23,14 @@ var _chunk3A4VW6AKcjs = require('./chunk-3A4VW6AK.cjs');
23
23
 
24
24
 
25
25
 
26
- var _chunk3U7EBKEUcjs = require('./chunk-3U7EBKEU.cjs');
26
+
27
+ var _chunkID3WBWNOcjs = require('./chunk-ID3WBWNO.cjs');
27
28
 
28
29
  // src/versioned-signal.ts
29
30
  function createVersionedSignal(initialValue, options) {
30
31
  const equals = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.equals]), () => ( Object.is));
31
- const value = _chunk3U7EBKEUcjs.signal.call(void 0, initialValue);
32
- const version = _chunk3U7EBKEUcjs.signal.call(void 0, 0);
32
+ const value = _chunkID3WBWNOcjs.signal.call(void 0, initialValue);
33
+ const version = _chunkID3WBWNOcjs.signal.call(void 0, 0);
33
34
  const bumpVersion = () => {
34
35
  const next = version() + 1;
35
36
  version(next);
@@ -50,8 +51,8 @@ function createVersionedSignal(initialValue, options) {
50
51
  force: () => {
51
52
  bumpVersion();
52
53
  },
53
- peekVersion: () => _chunk3U7EBKEUcjs.untrack.call(void 0, () => version()),
54
- peekValue: () => _chunk3U7EBKEUcjs.untrack.call(void 0, () => value())
54
+ peekVersion: () => _chunkID3WBWNOcjs.untrack.call(void 0, () => version()),
55
+ peekValue: () => _chunkID3WBWNOcjs.untrack.call(void 0, () => value())
55
56
  };
56
57
  }
57
58
 
@@ -75,5 +76,6 @@ function createVersionedSignal(initialValue, options) {
75
76
 
76
77
 
77
78
 
78
- exports.createAttributeBinding = _chunk3U7EBKEUcjs.createAttributeBinding; exports.createChildBinding = _chunk3U7EBKEUcjs.createChildBinding; exports.createClassBinding = _chunk3U7EBKEUcjs.createClassBinding; exports.createContext = _chunkURDFDRHRcjs.createContext; exports.createRenderEffect = _chunk3U7EBKEUcjs.createRenderEffect; exports.createScope = _chunk3A4VW6AKcjs.createScope; exports.createSelector = _chunk3U7EBKEUcjs.createSelector; exports.createShow = _chunk3U7EBKEUcjs.createShow; exports.createSignal = _chunk3U7EBKEUcjs.signal; exports.createStyleBinding = _chunk3U7EBKEUcjs.createStyleBinding; exports.createTextBinding = _chunk3U7EBKEUcjs.createTextBinding; exports.createVersionedSignal = createVersionedSignal; exports.effectScope = _chunk3U7EBKEUcjs.effectScope; exports.getDevtoolsHook = _chunk3U7EBKEUcjs.getDevtoolsHook; exports.hasContext = _chunkURDFDRHRcjs.hasContext; exports.isReactive = _chunk3U7EBKEUcjs.isReactive; exports.runInScope = _chunk3A4VW6AKcjs.runInScope; exports.setCycleProtectionOptions = _chunk3U7EBKEUcjs.setCycleProtectionOptions; exports.unwrap = _chunk3U7EBKEUcjs.unwrap; exports.useContext = _chunkURDFDRHRcjs.useContext;
79
+
80
+ exports.createAttributeBinding = _chunkID3WBWNOcjs.createAttributeBinding; exports.createChildBinding = _chunkID3WBWNOcjs.createChildBinding; exports.createClassBinding = _chunkID3WBWNOcjs.createClassBinding; exports.createContext = _chunkM2TSXZ4Ccjs.createContext; exports.createRenderEffect = _chunkID3WBWNOcjs.createRenderEffect; exports.createScope = _chunkL4DIV3RCcjs.createScope; exports.createSelector = _chunkID3WBWNOcjs.createSelector; exports.createShow = _chunkID3WBWNOcjs.createShow; exports.createSignal = _chunkID3WBWNOcjs.signal; exports.createStyleBinding = _chunkID3WBWNOcjs.createStyleBinding; exports.createTextBinding = _chunkID3WBWNOcjs.createTextBinding; exports.createVersionedSignal = createVersionedSignal; exports.effectScope = _chunkID3WBWNOcjs.effectScope; exports.getDevtoolsHook = _chunkID3WBWNOcjs.getDevtoolsHook; exports.hasContext = _chunkM2TSXZ4Ccjs.hasContext; exports.isReactive = _chunkID3WBWNOcjs.isReactive; exports.registerErrorHandler = _chunkID3WBWNOcjs.registerErrorHandler; exports.runInScope = _chunkL4DIV3RCcjs.runInScope; exports.setCycleProtectionOptions = _chunkID3WBWNOcjs.setCycleProtectionOptions; exports.unwrap = _chunkID3WBWNOcjs.unwrap; exports.useContext = _chunkM2TSXZ4Ccjs.useContext;
79
81
  //# sourceMappingURL=advanced.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/advanced.cjs","../src/versioned-signal.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACHO,SAAS,qBAAA,CACd,YAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,OAAA,mCAAS,OAAA,2BAAS,QAAA,UAAU,MAAA,CAAO,IAAA;AACzC,EAAA,MAAM,MAAA,EAAQ,sCAAA,YAAyB,CAAA;AACvC,EAAA,MAAM,QAAA,EAAU,sCAAA,CAAc,CAAA;AAE9B,EAAA,MAAM,YAAA,EAAc,CAAA,EAAA,GAAM;AACxB,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,EAAA,EAAI,CAAA;AACzB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA,EAAA,GAAM;AAEV,MAAA,OAAA,CAAQ,CAAA;AACR,MAAA,OAAO,KAAA,CAAM,CAAA;AAAA,IACf,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,IAAA,EAAA,GAAY;AAClB,MAAA,MAAM,KAAA,EAAO,KAAA,CAAM,CAAA;AACnB,MAAA,GAAA,CAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA,EAAG;AACvB,QAAA,KAAA,CAAM,IAAI,CAAA;AACV,QAAA,MAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,CAAA;AAAA,IACd,CAAA;AAAA,IACA,KAAA,EAAO,CAAA,EAAA,GAAM;AACX,MAAA,WAAA,CAAY,CAAA;AAAA,IACd,CAAA;AAAA,IACA,WAAA,EAAa,CAAA,EAAA,GAAM,uCAAA,CAAQ,EAAA,GAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1C,SAAA,EAAW,CAAA,EAAA,GAAM,uCAAA,CAAQ,EAAA,GAAM,KAAA,CAAM,CAAC;AAAA,EACxC,CAAA;AACF;ADDA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qpCAAC","file":"/home/runner/work/fict/fict/packages/runtime/dist/advanced.cjs","sourcesContent":[null,"import { createSignal, untrack } from './signal'\n\nexport interface VersionedSignalOptions<T> {\n equals?: (prev: T, next: T) => boolean\n}\n\nexport interface VersionedSignal<T> {\n /** Reactive read that tracks both the value and version counter */\n read: () => T\n /** Write a new value, forcing a version bump when value is equal */\n write: (next: T) => void\n /** Force a version bump without changing the value */\n force: () => void\n /** Read the current version without creating a dependency */\n peekVersion: () => number\n /** Read the current value without tracking */\n peekValue: () => T\n}\n\n/**\n * Create a signal wrapper that forces subscribers to update when the same reference is written.\n *\n * Useful for compiler-generated keyed list items where updates may reuse the same object reference.\n */\nexport function createVersionedSignal<T>(\n initialValue: T,\n options?: VersionedSignalOptions<T>,\n): VersionedSignal<T> {\n const equals = options?.equals ?? Object.is\n const value = createSignal(initialValue)\n const version = createSignal(0)\n\n const bumpVersion = () => {\n const next = version() + 1\n version(next)\n }\n\n return {\n read: () => {\n // Track both version and value to ensure equal writes notify subscribers\n version()\n return value()\n },\n write: (next: T) => {\n const prev = value()\n if (!equals(prev, next)) {\n value(next)\n return\n }\n bumpVersion()\n },\n force: () => {\n bumpVersion()\n },\n peekVersion: () => untrack(() => version()),\n peekValue: () => untrack(() => value()),\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/fict/fict/packages/runtime/dist/advanced.cjs","../src/versioned-signal.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACJO,SAAS,qBAAA,CACd,YAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,OAAA,mCAAS,OAAA,2BAAS,QAAA,UAAU,MAAA,CAAO,IAAA;AACzC,EAAA,MAAM,MAAA,EAAQ,sCAAA,YAAyB,CAAA;AACvC,EAAA,MAAM,QAAA,EAAU,sCAAA,CAAc,CAAA;AAE9B,EAAA,MAAM,YAAA,EAAc,CAAA,EAAA,GAAM;AACxB,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,EAAA,EAAI,CAAA;AACzB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,CAAA,EAAA,GAAM;AAEV,MAAA,OAAA,CAAQ,CAAA;AACR,MAAA,OAAO,KAAA,CAAM,CAAA;AAAA,IACf,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,IAAA,EAAA,GAAY;AAClB,MAAA,MAAM,KAAA,EAAO,KAAA,CAAM,CAAA;AACnB,MAAA,GAAA,CAAI,CAAC,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA,EAAG;AACvB,QAAA,KAAA,CAAM,IAAI,CAAA;AACV,QAAA,MAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,CAAA;AAAA,IACd,CAAA;AAAA,IACA,KAAA,EAAO,CAAA,EAAA,GAAM;AACX,MAAA,WAAA,CAAY,CAAA;AAAA,IACd,CAAA;AAAA,IACA,WAAA,EAAa,CAAA,EAAA,GAAM,uCAAA,CAAQ,EAAA,GAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1C,SAAA,EAAW,CAAA,EAAA,GAAM,uCAAA,CAAQ,EAAA,GAAM,KAAA,CAAM,CAAC;AAAA,EACxC,CAAA;AACF;ADAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,4tCAAC","file":"/home/runner/work/fict/fict/packages/runtime/dist/advanced.cjs","sourcesContent":[null,"import { createSignal, untrack } from './signal'\n\nexport interface VersionedSignalOptions<T> {\n equals?: (prev: T, next: T) => boolean\n}\n\nexport interface VersionedSignal<T> {\n /** Reactive read that tracks both the value and version counter */\n read: () => T\n /** Write a new value, forcing a version bump when value is equal */\n write: (next: T) => void\n /** Force a version bump without changing the value */\n force: () => void\n /** Read the current version without creating a dependency */\n peekVersion: () => number\n /** Read the current value without tracking */\n peekValue: () => T\n}\n\n/**\n * Create a signal wrapper that forces subscribers to update when the same reference is written.\n *\n * Useful for compiler-generated keyed list items where updates may reuse the same object reference.\n */\nexport function createVersionedSignal<T>(\n initialValue: T,\n options?: VersionedSignalOptions<T>,\n): VersionedSignal<T> {\n const equals = options?.equals ?? Object.is\n const value = createSignal(initialValue)\n const version = createSignal(0)\n\n const bumpVersion = () => {\n const next = version() + 1\n version(next)\n }\n\n return {\n read: () => {\n // Track both version and value to ensure equal writes notify subscribers\n version()\n return value()\n },\n write: (next: T) => {\n const prev = value()\n if (!equals(prev, next)) {\n value(next)\n return\n }\n bumpVersion()\n },\n force: () => {\n bumpVersion()\n },\n peekVersion: () => untrack(() => version()),\n peekValue: () => untrack(() => value()),\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- export { R as ReactiveScope, S as Signal, c as createScope, a as createSelector, s as createSignal, e as effectScope, r as runInScope } from './scope-xmdo6lVU.cjs';
2
- export { b as createAttributeBinding, a as createChildBinding, e as createClassBinding, g as createRenderEffect, f as createShow, d as createStyleBinding, c as createTextBinding, i as isReactive, u as unwrap } from './effect-ClARNUCc.cjs';
3
- export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-9gFXOdJl.cjs';
1
+ export { R as ReactiveScope, c as createScope, r as runInScope } from './scope-Cx_3CjIZ.cjs';
2
+ export { S as Signal, d as createAttributeBinding, b as createChildBinding, g as createClassBinding, j as createRenderEffect, c as createSelector, h as createShow, s as createSignal, f as createStyleBinding, a as createTextBinding, e as effectScope, i as isReactive, r as registerErrorHandler, u as unwrap } from './effect-D6kaLM2-.cjs';
3
+ export { C as Context, F as FictDevtoolsHook, P as ProviderProps, c as createContext, g as getDevtoolsHook, h as hasContext, u as useContext } from './context-B25xyQrJ.cjs';
4
4
 
5
5
  interface VersionedSignalOptions<T> {
6
6
  equals?: (prev: T, next: T) => boolean;
@@ -24,19 +24,9 @@ interface VersionedSignal<T> {
24
24
  */
25
25
  declare function createVersionedSignal<T>(initialValue: T, options?: VersionedSignalOptions<T>): VersionedSignal<T>;
26
26
 
27
- interface FictDevtoolsHook {
28
- registerSignal: (id: number, value: unknown) => void;
29
- updateSignal: (id: number, value: unknown) => void;
30
- registerEffect: (id: number) => void;
31
- effectRun: (id: number) => void;
32
- cycleDetected?: (payload: {
33
- reason: string;
34
- detail?: Record<string, unknown>;
35
- }) => void;
36
- }
37
- declare function getDevtoolsHook(): FictDevtoolsHook | undefined;
38
-
39
27
  interface CycleProtectionOptions {
28
+ /** Enable cycle protection guards (defaults to dev-only) */
29
+ enabled?: boolean;
40
30
  maxFlushCyclesPerMicrotask?: number;
41
31
  maxEffectRunsPerFlush?: number;
42
32
  windowSize?: number;
@@ -44,7 +34,11 @@ interface CycleProtectionOptions {
44
34
  maxRootReentrantDepth?: number;
45
35
  enableWindowWarning?: boolean;
46
36
  devMode?: boolean;
37
+ /** Enable backoff warnings at 50% and 75% of limits */
38
+ enableBackoffWarning?: boolean;
39
+ /** Ratio at which to show first backoff warning (default 0.5) */
40
+ backoffWarningRatio?: number;
47
41
  }
48
42
  declare let setCycleProtectionOptions: (opts: CycleProtectionOptions) => void;
49
43
 
50
- export { type FictDevtoolsHook, type VersionedSignal, type VersionedSignalOptions, createVersionedSignal, getDevtoolsHook, setCycleProtectionOptions };
44
+ export { type VersionedSignal, type VersionedSignalOptions, createVersionedSignal, setCycleProtectionOptions };
@@ -1,6 +1,6 @@
1
- export { R as ReactiveScope, S as Signal, c as createScope, a as createSelector, s as createSignal, e as effectScope, r as runInScope } from './scope-DvgMquEy.js';
2
- export { b as createAttributeBinding, a as createChildBinding, e as createClassBinding, g as createRenderEffect, f as createShow, d as createStyleBinding, c as createTextBinding, i as isReactive, u as unwrap } from './effect-ClARNUCc.js';
3
- export { C as Context, P as ProviderProps, c as createContext, h as hasContext, u as useContext } from './context-4woHo7-L.js';
1
+ export { R as ReactiveScope, c as createScope, r as runInScope } from './scope-CzNkn587.js';
2
+ export { S as Signal, d as createAttributeBinding, b as createChildBinding, g as createClassBinding, j as createRenderEffect, c as createSelector, h as createShow, s as createSignal, f as createStyleBinding, a as createTextBinding, e as effectScope, i as isReactive, r as registerErrorHandler, u as unwrap } from './effect-D6kaLM2-.js';
3
+ export { C as Context, F as FictDevtoolsHook, P as ProviderProps, c as createContext, g as getDevtoolsHook, h as hasContext, u as useContext } from './context-CGdP7_Jb.js';
4
4
 
5
5
  interface VersionedSignalOptions<T> {
6
6
  equals?: (prev: T, next: T) => boolean;
@@ -24,19 +24,9 @@ interface VersionedSignal<T> {
24
24
  */
25
25
  declare function createVersionedSignal<T>(initialValue: T, options?: VersionedSignalOptions<T>): VersionedSignal<T>;
26
26
 
27
- interface FictDevtoolsHook {
28
- registerSignal: (id: number, value: unknown) => void;
29
- updateSignal: (id: number, value: unknown) => void;
30
- registerEffect: (id: number) => void;
31
- effectRun: (id: number) => void;
32
- cycleDetected?: (payload: {
33
- reason: string;
34
- detail?: Record<string, unknown>;
35
- }) => void;
36
- }
37
- declare function getDevtoolsHook(): FictDevtoolsHook | undefined;
38
-
39
27
  interface CycleProtectionOptions {
28
+ /** Enable cycle protection guards (defaults to dev-only) */
29
+ enabled?: boolean;
40
30
  maxFlushCyclesPerMicrotask?: number;
41
31
  maxEffectRunsPerFlush?: number;
42
32
  windowSize?: number;
@@ -44,7 +34,11 @@ interface CycleProtectionOptions {
44
34
  maxRootReentrantDepth?: number;
45
35
  enableWindowWarning?: boolean;
46
36
  devMode?: boolean;
37
+ /** Enable backoff warnings at 50% and 75% of limits */
38
+ enableBackoffWarning?: boolean;
39
+ /** Ratio at which to show first backoff warning (default 0.5) */
40
+ backoffWarningRatio?: number;
47
41
  }
48
42
  declare let setCycleProtectionOptions: (opts: CycleProtectionOptions) => void;
49
43
 
50
- export { type FictDevtoolsHook, type VersionedSignal, type VersionedSignalOptions, createVersionedSignal, getDevtoolsHook, setCycleProtectionOptions };
44
+ export { type VersionedSignal, type VersionedSignalOptions, createVersionedSignal, setCycleProtectionOptions };
package/dist/advanced.js CHANGED
@@ -2,11 +2,11 @@ import {
2
2
  createContext,
3
3
  hasContext,
4
4
  useContext
5
- } from "./chunk-TEYUDPTA.js";
5
+ } from "./chunk-XLIZJMMJ.js";
6
6
  import {
7
7
  createScope,
8
8
  runInScope
9
- } from "./chunk-LU2LD2WJ.js";
9
+ } from "./chunk-TWELIZRY.js";
10
10
  import {
11
11
  createAttributeBinding,
12
12
  createChildBinding,
@@ -19,11 +19,12 @@ import {
19
19
  effectScope,
20
20
  getDevtoolsHook,
21
21
  isReactive,
22
+ registerErrorHandler,
22
23
  setCycleProtectionOptions,
23
24
  signal,
24
25
  untrack,
25
26
  unwrap
26
- } from "./chunk-YVS4WJ2W.js";
27
+ } from "./chunk-SO6X7G5S.js";
27
28
 
28
29
  // src/versioned-signal.ts
29
30
  function createVersionedSignal(initialValue, options) {
@@ -71,6 +72,7 @@ export {
71
72
  getDevtoolsHook,
72
73
  hasContext,
73
74
  isReactive,
75
+ registerErrorHandler,
74
76
  runInScope,
75
77
  setCycleProtectionOptions,
76
78
  unwrap,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/versioned-signal.ts"],"sourcesContent":["import { createSignal, untrack } from './signal'\n\nexport interface VersionedSignalOptions<T> {\n equals?: (prev: T, next: T) => boolean\n}\n\nexport interface VersionedSignal<T> {\n /** Reactive read that tracks both the value and version counter */\n read: () => T\n /** Write a new value, forcing a version bump when value is equal */\n write: (next: T) => void\n /** Force a version bump without changing the value */\n force: () => void\n /** Read the current version without creating a dependency */\n peekVersion: () => number\n /** Read the current value without tracking */\n peekValue: () => T\n}\n\n/**\n * Create a signal wrapper that forces subscribers to update when the same reference is written.\n *\n * Useful for compiler-generated keyed list items where updates may reuse the same object reference.\n */\nexport function createVersionedSignal<T>(\n initialValue: T,\n options?: VersionedSignalOptions<T>,\n): VersionedSignal<T> {\n const equals = options?.equals ?? Object.is\n const value = createSignal(initialValue)\n const version = createSignal(0)\n\n const bumpVersion = () => {\n const next = version() + 1\n version(next)\n }\n\n return {\n read: () => {\n // Track both version and value to ensure equal writes notify subscribers\n version()\n return value()\n },\n write: (next: T) => {\n const prev = value()\n if (!equals(prev, next)) {\n value(next)\n return\n }\n bumpVersion()\n },\n force: () => {\n bumpVersion()\n },\n peekVersion: () => untrack(() => version()),\n peekValue: () => untrack(() => value()),\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,SAAS,sBACd,cACA,SACoB;AACpB,QAAM,SAAS,SAAS,UAAU,OAAO;AACzC,QAAM,QAAQ,OAAa,YAAY;AACvC,QAAM,UAAU,OAAa,CAAC;AAE9B,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,QAAQ,IAAI;AACzB,YAAQ,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL,MAAM,MAAM;AAEV,cAAQ;AACR,aAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,CAAC,SAAY;AAClB,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB,cAAM,IAAI;AACV;AAAA,MACF;AACA,kBAAY;AAAA,IACd;AAAA,IACA,OAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,IACA,aAAa,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,IAC1C,WAAW,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EACxC;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/versioned-signal.ts"],"sourcesContent":["import { createSignal, untrack } from './signal'\n\nexport interface VersionedSignalOptions<T> {\n equals?: (prev: T, next: T) => boolean\n}\n\nexport interface VersionedSignal<T> {\n /** Reactive read that tracks both the value and version counter */\n read: () => T\n /** Write a new value, forcing a version bump when value is equal */\n write: (next: T) => void\n /** Force a version bump without changing the value */\n force: () => void\n /** Read the current version without creating a dependency */\n peekVersion: () => number\n /** Read the current value without tracking */\n peekValue: () => T\n}\n\n/**\n * Create a signal wrapper that forces subscribers to update when the same reference is written.\n *\n * Useful for compiler-generated keyed list items where updates may reuse the same object reference.\n */\nexport function createVersionedSignal<T>(\n initialValue: T,\n options?: VersionedSignalOptions<T>,\n): VersionedSignal<T> {\n const equals = options?.equals ?? Object.is\n const value = createSignal(initialValue)\n const version = createSignal(0)\n\n const bumpVersion = () => {\n const next = version() + 1\n version(next)\n }\n\n return {\n read: () => {\n // Track both version and value to ensure equal writes notify subscribers\n version()\n return value()\n },\n write: (next: T) => {\n const prev = value()\n if (!equals(prev, next)) {\n value(next)\n return\n }\n bumpVersion()\n },\n force: () => {\n bumpVersion()\n },\n peekVersion: () => untrack(() => version()),\n peekValue: () => untrack(() => value()),\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBO,SAAS,sBACd,cACA,SACoB;AACpB,QAAM,SAAS,SAAS,UAAU,OAAO;AACzC,QAAM,QAAQ,OAAa,YAAY;AACvC,QAAM,UAAU,OAAa,CAAC;AAE9B,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,QAAQ,IAAI;AACzB,YAAQ,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL,MAAM,MAAM;AAEV,cAAQ;AACR,aAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO,CAAC,SAAY;AAClB,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB,cAAM,IAAI;AACV;AAAA,MACF;AACA,kBAAY;AAAA,IACd;AAAA,IACA,OAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,IACA,aAAa,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,IAC1C,WAAW,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EACxC;AACF;","names":[]}