mutts 1.0.13 → 1.0.15

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 (54) hide show
  1. package/BROWSER_ASYNC_POLYFILL.md +79 -0
  2. package/README.md +2 -2
  3. package/dist/browser.cjs +216 -97
  4. package/dist/browser.cjs.map +1 -1
  5. package/dist/browser.d.ts +42 -9
  6. package/dist/browser.dev.cjs +81 -71
  7. package/dist/browser.dev.cjs.map +1 -1
  8. package/dist/browser.dev.d.ts +2 -2
  9. package/dist/browser.dev.esm.js +2 -2
  10. package/dist/browser.esm.js +137 -28
  11. package/dist/browser.esm.js.map +1 -1
  12. package/dist/chunks/{proxy-BtmPFjSr.esm.js → effects-CPjf6gNA.esm.js} +2605 -2155
  13. package/dist/chunks/effects-CPjf6gNA.esm.js.map +1 -0
  14. package/dist/chunks/{proxy-DBHj3kGK.cjs → effects-oUauWxxl.cjs} +2615 -2156
  15. package/dist/chunks/effects-oUauWxxl.cjs.map +1 -0
  16. package/dist/chunks/{index-CAdnMJev.cjs → index-Dtj2qZ0d.cjs} +418 -350
  17. package/dist/chunks/index-Dtj2qZ0d.cjs.map +1 -0
  18. package/dist/chunks/{index-XsYTUhHx.esm.js → index-YGpb1te7.esm.js} +156 -88
  19. package/dist/chunks/index-YGpb1te7.esm.js.map +1 -0
  20. package/dist/chunks/node-CKuro-Uk.cjs +187 -0
  21. package/dist/chunks/node-CKuro-Uk.cjs.map +1 -0
  22. package/dist/chunks/node-sQtns7M-.esm.js +185 -0
  23. package/dist/chunks/node-sQtns7M-.esm.js.map +1 -0
  24. package/dist/debug.cjs +76 -49
  25. package/dist/debug.cjs.map +1 -1
  26. package/dist/debug.esm.js +37 -10
  27. package/dist/debug.esm.js.map +1 -1
  28. package/dist/mutts.umd.js +4169 -3532
  29. package/dist/mutts.umd.js.map +1 -1
  30. package/dist/mutts.umd.min.js +1 -1
  31. package/dist/mutts.umd.min.js.map +1 -1
  32. package/dist/node.cjs +82 -72
  33. package/dist/node.cjs.map +1 -1
  34. package/dist/node.d.ts +2 -2
  35. package/dist/node.dev.cjs +82 -72
  36. package/dist/node.dev.cjs.map +1 -1
  37. package/dist/node.dev.d.ts +2 -2
  38. package/dist/node.dev.esm.js +3 -3
  39. package/dist/node.esm.js +3 -3
  40. package/dist/types.d.ts +30 -15
  41. package/docs/ai/api-reference.md +3 -1
  42. package/docs/ai/manual.md +17 -5
  43. package/docs/reactive/advanced.md +169 -10
  44. package/docs/reactive/debugging.md +15 -13
  45. package/docs/reactive.md +2 -1
  46. package/package.json +12 -7
  47. package/dist/chunks/index-CAdnMJev.cjs.map +0 -1
  48. package/dist/chunks/index-XsYTUhHx.esm.js.map +0 -1
  49. package/dist/chunks/node-DrrphEPf.cjs +0 -98
  50. package/dist/chunks/node-DrrphEPf.cjs.map +0 -1
  51. package/dist/chunks/node-NEZvVo4M.esm.js +0 -96
  52. package/dist/chunks/node-NEZvVo4M.esm.js.map +0 -1
  53. package/dist/chunks/proxy-BtmPFjSr.esm.js.map +0 -1
  54. package/dist/chunks/proxy-DBHj3kGK.cjs.map +0 -1
package/dist/node.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- require('./chunks/node-DrrphEPf.cjs');
4
- var index = require('./chunks/index-CAdnMJev.cjs');
5
- var proxy = require('./chunks/proxy-DBHj3kGK.cjs');
3
+ require('./chunks/node-CKuro-Uk.cjs');
4
+ var index = require('./chunks/index-Dtj2qZ0d.cjs');
5
+ var effects = require('./chunks/effects-oUauWxxl.cjs');
6
6
  require('node:async_hooks');
7
7
 
8
8
 
@@ -40,76 +40,86 @@ exports.throttle = index.throttle;
40
40
  exports.unreactive = index.unreactive;
41
41
  exports.watch = index.watch;
42
42
  exports.when = index.when;
43
- exports.AZone = proxy.AZone;
44
- exports.CompareSymbol = proxy.CompareSymbol;
45
- exports.DecoratorError = proxy.DecoratorError;
46
- exports.IterableWeakMap = proxy.IterableWeakMap;
47
- exports.IterableWeakSet = proxy.IterableWeakSet;
48
- exports.ReactiveBase = proxy.ReactiveBase;
49
- exports.ReactiveError = proxy.ReactiveError;
43
+ exports.AZone = effects.AZone;
44
+ exports.CompareSymbol = effects.CompareSymbol;
45
+ exports.DecoratorError = effects.DecoratorError;
46
+ exports.IterableWeakMap = effects.IterableWeakMap;
47
+ exports.IterableWeakSet = effects.IterableWeakSet;
48
+ exports.ReactiveBase = effects.ReactiveBase;
49
+ exports.ReactiveError = effects.ReactiveError;
50
50
  Object.defineProperty(exports, "ReactiveErrorCode", {
51
51
  enumerable: true,
52
- get: function () { return proxy.ReactiveErrorCode; }
52
+ get: function () { return effects.ReactiveErrorCode; }
53
53
  });
54
- exports.Zone = proxy.Zone;
55
- exports.ZoneAggregator = proxy.ZoneAggregator;
56
- exports.ZoneHistory = proxy.ZoneHistory;
57
- exports.addBatchCleanup = proxy.addBatchCleanup;
58
- exports.addUnreactiveProps = proxy.addUnreactiveProps;
59
- exports.arrayEquals = proxy.arrayEquals;
60
- exports.assertUntracked = proxy.assertUntracked;
61
- exports.asyncHook = proxy.asyncHook;
62
- exports.asyncHooks = proxy.asyncHooks;
63
- exports.asyncZone = proxy.asyncZone;
64
- exports.atom = proxy.atom;
65
- exports.atomic = proxy.atomic;
66
- exports.biDi = proxy.biDi;
67
- exports.captioned = proxy.captioned;
68
- exports.captured = proxy.captured;
69
- exports.caught = proxy.caught;
70
- exports.createFlavor = proxy.createFlavor;
71
- exports.debugPreset = proxy.debugPreset;
72
- exports.decorator = proxy.decorator;
73
- exports.deepCompare = proxy.deepCompare;
74
- exports.defer = proxy.defer;
75
- exports.devPreset = proxy.devPreset;
76
- exports.effect = proxy.effect;
77
- exports.effectAggregator = proxy.effectAggregator;
78
- exports.effectContext = proxy.effectContext;
79
- exports.flavorOptions = proxy.flavorOptions;
80
- exports.flavored = proxy.flavored;
81
- exports.formatCleanupReason = proxy.formatCleanupReason;
82
- exports.getActivationLog = proxy.getActivationLog;
83
- exports.getActiveEffect = proxy.getActiveEffect;
84
- exports.getState = proxy.getState;
85
- exports.hooks = proxy.hooks;
86
- exports.inheritCaption = proxy.inheritCaption;
87
- exports.isConstructor = proxy.isConstructor;
88
- exports.isDev = proxy.isDev;
89
- exports.isNonReactive = proxy.isNonReactive;
90
- exports.isObject = proxy.isObject;
91
- exports.isProd = proxy.isProd;
92
- exports.isReactive = proxy.isReactive;
93
- exports.isTest = proxy.isTest;
94
- exports.legacyDecorator = proxy.legacyDecorator;
95
- exports.link = proxy.link;
96
- exports.mixin = proxy.mixin;
97
- exports.modernDecorator = proxy.modernDecorator;
98
- exports.named = proxy.named;
99
- exports.objectToProxy = proxy.objectToProxy;
100
- exports.onEffectThrow = proxy.onEffectThrow;
101
- exports.prodPreset = proxy.prodPreset;
102
- exports.proxyToObject = proxy.proxyToObject;
103
- exports.reactive = proxy.reactive;
104
- exports.reactiveOptions = proxy.options;
105
- exports.reset = proxy.reset;
106
- exports.root = proxy.root;
107
- exports.tag = proxy.tag;
108
- exports.touched = proxy.touched;
109
- exports.touched1 = proxy.touched1;
110
- exports.unlink = proxy.unlink;
111
- exports.untracked = proxy.untracked;
112
- exports.unwrap = proxy.unwrap;
113
- exports.withEffectContext = proxy.withEffectContext;
114
- exports.zip = proxy.zip;
54
+ exports.Zone = effects.Zone;
55
+ exports.ZoneAggregator = effects.ZoneAggregator;
56
+ exports.ZoneHistory = effects.ZoneHistory;
57
+ exports.addBatchCleanup = effects.addBatchCleanup;
58
+ exports.addUnreactiveProps = effects.addUnreactiveProps;
59
+ exports.arrayEquals = effects.arrayEquals;
60
+ exports.assertUntracked = effects.assertUntracked;
61
+ exports.asyncHook = effects.asyncHook;
62
+ exports.asyncHooks = effects.asyncHooks;
63
+ exports.asyncZone = effects.asyncZone;
64
+ exports.atom = effects.atom;
65
+ exports.atomic = effects.atomic;
66
+ exports.biDi = effects.biDi;
67
+ exports.captioned = effects.captioned;
68
+ exports.captured = effects.captured;
69
+ exports.caught = effects.caught;
70
+ exports.createFlavor = effects.createFlavor;
71
+ exports.debugPreset = effects.debugPreset;
72
+ exports.decorator = effects.decorator;
73
+ exports.deepCompare = effects.deepCompare;
74
+ exports.defer = effects.defer;
75
+ exports.devPreset = effects.devPreset;
76
+ exports.effect = effects.effect;
77
+ exports.effectAggregator = effects.effectAggregator;
78
+ exports.effectContext = effects.effectContext;
79
+ exports.flavorOptions = effects.flavorOptions;
80
+ exports.flavored = effects.flavored;
81
+ exports.formatCleanupReason = effects.formatCleanupReason;
82
+ exports.getActivationLog = effects.getActivationLog;
83
+ exports.getActiveEffect = effects.getActiveEffect;
84
+ exports.getState = effects.getState;
85
+ exports.hooks = effects.hooks;
86
+ exports.inert = effects.inert;
87
+ exports.inheritCaption = effects.inheritCaption;
88
+ exports.isConstructor = effects.isConstructor;
89
+ exports.isDev = effects.isDev;
90
+ exports.isNonReactive = effects.isNonReactive;
91
+ exports.isObject = effects.isObject;
92
+ exports.isProd = effects.isProd;
93
+ exports.isReactive = effects.isReactive;
94
+ exports.isReactiveBroken = effects.isReactiveBroken;
95
+ exports.isTest = effects.isTest;
96
+ exports.legacyDecorator = effects.legacyDecorator;
97
+ exports.link = effects.link;
98
+ exports.markRaw = effects.markRaw;
99
+ exports.markRawProps = effects.markRawProps;
100
+ exports.mixin = effects.mixin;
101
+ exports.modernDecorator = effects.modernDecorator;
102
+ exports.named = effects.named;
103
+ exports.objectToProxy = effects.objectToProxy;
104
+ exports.onEffectThrow = effects.onEffectThrow;
105
+ exports.onReactiveBroken = effects.onReactiveBroken;
106
+ exports.onReactiveReset = effects.onReactiveReset;
107
+ exports.prodPreset = effects.prodPreset;
108
+ exports.proxyToObject = effects.proxyToObject;
109
+ exports.reactive = effects.reactive;
110
+ exports.reactiveOptions = effects.options;
111
+ exports.readonlyReactive = effects.readonlyReactive;
112
+ exports.reset = effects.reset;
113
+ exports.root = effects.root;
114
+ exports.shallowReactive = effects.shallowReactive;
115
+ exports.tag = effects.tag;
116
+ exports.toRaw = effects.toRaw;
117
+ exports.touched = effects.touched;
118
+ exports.touched1 = effects.touched1;
119
+ exports.unlink = effects.unlink;
120
+ exports.untracked = effects.untracked;
121
+ exports.unwrap = effects.unwrap;
122
+ exports.withEffectContext = effects.withEffectContext;
123
+ exports.wrapInert = effects.wrapInert;
124
+ exports.zip = effects.zip;
115
125
  //# sourceMappingURL=node.cjs.map
package/dist/node.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"node.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/node.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { ArrayDiffResult, ArrayReadForward, Captioned, CompareSymbol, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, EffectContext, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captioned, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, effectContext, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, inheritCaption, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isTest, legacyDecorator, lift, link, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, reactive, reset, resource, root, setAt, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, withEffectContext, zip } from './browser.js';
2
- export { A as AZone, C as CleanupReason, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, h as ReactiveErrorCode, S as ScopedCallback, i as Zone, Z as ZoneAggregator, j as ZoneHistory, k as asyncZone, l as debugPreset, m as devPreset, n as formatCleanupReason, o as isReactive, p as objectToProxy, q as prodPreset, r as proxyToObject, s as reactiveOptions, u as unwrap } from './types.js';
1
+ export { ArrayDiffResult, ArrayReadForward, Captioned, CompareSymbol, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, EffectContext, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, MorphPosition, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captioned, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, effectContext, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, inert, inheritCaption, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isReactiveBroken, isTest, legacyDecorator, lift, link, markRaw, markRawProps, memoize, mixin, modernDecorator, morph, named, onEffectThrow, onReactiveBroken, onReactiveReset, organize, organized, profileInfo, reactive, readonlyReactive, reset, resource, root, setAt, shallowReactive, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, withEffectContext, wrapInert, zip } from './browser.js';
2
+ export { A as AZone, C as CleanupReason, h as CycleHandlingMode, D as DeprecatedCycleHandlingMode, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, i as ReactiveErrorCode, j as SchedulerMode, S as ScopedCallback, k as Zone, Z as ZoneAggregator, l as ZoneHistory, m as asyncZone, n as debugPreset, o as devPreset, p as formatCleanupReason, q as isReactive, r as objectToProxy, s as prodPreset, t as proxyToObject, u as reactiveOptions, v as toRaw, w as unwrap } from './types.js';
package/dist/node.dev.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  require('./debug.cjs');
4
- require('./chunks/node-DrrphEPf.cjs');
5
- var index = require('./chunks/index-CAdnMJev.cjs');
6
- var proxy = require('./chunks/proxy-DBHj3kGK.cjs');
4
+ require('./chunks/node-CKuro-Uk.cjs');
5
+ var index = require('./chunks/index-Dtj2qZ0d.cjs');
6
+ var effects = require('./chunks/effects-oUauWxxl.cjs');
7
7
  require('node:async_hooks');
8
8
 
9
9
 
@@ -41,76 +41,86 @@ exports.throttle = index.throttle;
41
41
  exports.unreactive = index.unreactive;
42
42
  exports.watch = index.watch;
43
43
  exports.when = index.when;
44
- exports.AZone = proxy.AZone;
45
- exports.CompareSymbol = proxy.CompareSymbol;
46
- exports.DecoratorError = proxy.DecoratorError;
47
- exports.IterableWeakMap = proxy.IterableWeakMap;
48
- exports.IterableWeakSet = proxy.IterableWeakSet;
49
- exports.ReactiveBase = proxy.ReactiveBase;
50
- exports.ReactiveError = proxy.ReactiveError;
44
+ exports.AZone = effects.AZone;
45
+ exports.CompareSymbol = effects.CompareSymbol;
46
+ exports.DecoratorError = effects.DecoratorError;
47
+ exports.IterableWeakMap = effects.IterableWeakMap;
48
+ exports.IterableWeakSet = effects.IterableWeakSet;
49
+ exports.ReactiveBase = effects.ReactiveBase;
50
+ exports.ReactiveError = effects.ReactiveError;
51
51
  Object.defineProperty(exports, "ReactiveErrorCode", {
52
52
  enumerable: true,
53
- get: function () { return proxy.ReactiveErrorCode; }
53
+ get: function () { return effects.ReactiveErrorCode; }
54
54
  });
55
- exports.Zone = proxy.Zone;
56
- exports.ZoneAggregator = proxy.ZoneAggregator;
57
- exports.ZoneHistory = proxy.ZoneHistory;
58
- exports.addBatchCleanup = proxy.addBatchCleanup;
59
- exports.addUnreactiveProps = proxy.addUnreactiveProps;
60
- exports.arrayEquals = proxy.arrayEquals;
61
- exports.assertUntracked = proxy.assertUntracked;
62
- exports.asyncHook = proxy.asyncHook;
63
- exports.asyncHooks = proxy.asyncHooks;
64
- exports.asyncZone = proxy.asyncZone;
65
- exports.atom = proxy.atom;
66
- exports.atomic = proxy.atomic;
67
- exports.biDi = proxy.biDi;
68
- exports.captioned = proxy.captioned;
69
- exports.captured = proxy.captured;
70
- exports.caught = proxy.caught;
71
- exports.createFlavor = proxy.createFlavor;
72
- exports.debugPreset = proxy.debugPreset;
73
- exports.decorator = proxy.decorator;
74
- exports.deepCompare = proxy.deepCompare;
75
- exports.defer = proxy.defer;
76
- exports.devPreset = proxy.devPreset;
77
- exports.effect = proxy.effect;
78
- exports.effectAggregator = proxy.effectAggregator;
79
- exports.effectContext = proxy.effectContext;
80
- exports.flavorOptions = proxy.flavorOptions;
81
- exports.flavored = proxy.flavored;
82
- exports.formatCleanupReason = proxy.formatCleanupReason;
83
- exports.getActivationLog = proxy.getActivationLog;
84
- exports.getActiveEffect = proxy.getActiveEffect;
85
- exports.getState = proxy.getState;
86
- exports.hooks = proxy.hooks;
87
- exports.inheritCaption = proxy.inheritCaption;
88
- exports.isConstructor = proxy.isConstructor;
89
- exports.isDev = proxy.isDev;
90
- exports.isNonReactive = proxy.isNonReactive;
91
- exports.isObject = proxy.isObject;
92
- exports.isProd = proxy.isProd;
93
- exports.isReactive = proxy.isReactive;
94
- exports.isTest = proxy.isTest;
95
- exports.legacyDecorator = proxy.legacyDecorator;
96
- exports.link = proxy.link;
97
- exports.mixin = proxy.mixin;
98
- exports.modernDecorator = proxy.modernDecorator;
99
- exports.named = proxy.named;
100
- exports.objectToProxy = proxy.objectToProxy;
101
- exports.onEffectThrow = proxy.onEffectThrow;
102
- exports.prodPreset = proxy.prodPreset;
103
- exports.proxyToObject = proxy.proxyToObject;
104
- exports.reactive = proxy.reactive;
105
- exports.reactiveOptions = proxy.options;
106
- exports.reset = proxy.reset;
107
- exports.root = proxy.root;
108
- exports.tag = proxy.tag;
109
- exports.touched = proxy.touched;
110
- exports.touched1 = proxy.touched1;
111
- exports.unlink = proxy.unlink;
112
- exports.untracked = proxy.untracked;
113
- exports.unwrap = proxy.unwrap;
114
- exports.withEffectContext = proxy.withEffectContext;
115
- exports.zip = proxy.zip;
55
+ exports.Zone = effects.Zone;
56
+ exports.ZoneAggregator = effects.ZoneAggregator;
57
+ exports.ZoneHistory = effects.ZoneHistory;
58
+ exports.addBatchCleanup = effects.addBatchCleanup;
59
+ exports.addUnreactiveProps = effects.addUnreactiveProps;
60
+ exports.arrayEquals = effects.arrayEquals;
61
+ exports.assertUntracked = effects.assertUntracked;
62
+ exports.asyncHook = effects.asyncHook;
63
+ exports.asyncHooks = effects.asyncHooks;
64
+ exports.asyncZone = effects.asyncZone;
65
+ exports.atom = effects.atom;
66
+ exports.atomic = effects.atomic;
67
+ exports.biDi = effects.biDi;
68
+ exports.captioned = effects.captioned;
69
+ exports.captured = effects.captured;
70
+ exports.caught = effects.caught;
71
+ exports.createFlavor = effects.createFlavor;
72
+ exports.debugPreset = effects.debugPreset;
73
+ exports.decorator = effects.decorator;
74
+ exports.deepCompare = effects.deepCompare;
75
+ exports.defer = effects.defer;
76
+ exports.devPreset = effects.devPreset;
77
+ exports.effect = effects.effect;
78
+ exports.effectAggregator = effects.effectAggregator;
79
+ exports.effectContext = effects.effectContext;
80
+ exports.flavorOptions = effects.flavorOptions;
81
+ exports.flavored = effects.flavored;
82
+ exports.formatCleanupReason = effects.formatCleanupReason;
83
+ exports.getActivationLog = effects.getActivationLog;
84
+ exports.getActiveEffect = effects.getActiveEffect;
85
+ exports.getState = effects.getState;
86
+ exports.hooks = effects.hooks;
87
+ exports.inert = effects.inert;
88
+ exports.inheritCaption = effects.inheritCaption;
89
+ exports.isConstructor = effects.isConstructor;
90
+ exports.isDev = effects.isDev;
91
+ exports.isNonReactive = effects.isNonReactive;
92
+ exports.isObject = effects.isObject;
93
+ exports.isProd = effects.isProd;
94
+ exports.isReactive = effects.isReactive;
95
+ exports.isReactiveBroken = effects.isReactiveBroken;
96
+ exports.isTest = effects.isTest;
97
+ exports.legacyDecorator = effects.legacyDecorator;
98
+ exports.link = effects.link;
99
+ exports.markRaw = effects.markRaw;
100
+ exports.markRawProps = effects.markRawProps;
101
+ exports.mixin = effects.mixin;
102
+ exports.modernDecorator = effects.modernDecorator;
103
+ exports.named = effects.named;
104
+ exports.objectToProxy = effects.objectToProxy;
105
+ exports.onEffectThrow = effects.onEffectThrow;
106
+ exports.onReactiveBroken = effects.onReactiveBroken;
107
+ exports.onReactiveReset = effects.onReactiveReset;
108
+ exports.prodPreset = effects.prodPreset;
109
+ exports.proxyToObject = effects.proxyToObject;
110
+ exports.reactive = effects.reactive;
111
+ exports.reactiveOptions = effects.options;
112
+ exports.readonlyReactive = effects.readonlyReactive;
113
+ exports.reset = effects.reset;
114
+ exports.root = effects.root;
115
+ exports.shallowReactive = effects.shallowReactive;
116
+ exports.tag = effects.tag;
117
+ exports.toRaw = effects.toRaw;
118
+ exports.touched = effects.touched;
119
+ exports.touched1 = effects.touched1;
120
+ exports.unlink = effects.unlink;
121
+ exports.untracked = effects.untracked;
122
+ exports.unwrap = effects.unwrap;
123
+ exports.withEffectContext = effects.withEffectContext;
124
+ exports.wrapInert = effects.wrapInert;
125
+ exports.zip = effects.zip;
116
126
  //# sourceMappingURL=node.dev.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"node.dev.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- export { A as AZone, C as CleanupReason, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, h as ReactiveErrorCode, S as ScopedCallback, i as Zone, Z as ZoneAggregator, j as ZoneHistory, k as asyncZone, l as debugPreset, m as devPreset, n as formatCleanupReason, o as isReactive, p as objectToProxy, q as prodPreset, r as proxyToObject, s as reactiveOptions, u as unwrap } from './types.js';
2
- export { ArrayDiffResult, ArrayReadForward, Captioned, CompareSymbol, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, EffectContext, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captioned, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, effectContext, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, inheritCaption, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isTest, legacyDecorator, lift, link, memoize, mixin, modernDecorator, morph, named, onEffectThrow, organize, organized, profileInfo, reactive, reset, resource, root, setAt, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, withEffectContext, zip } from './browser.js';
1
+ export { A as AZone, C as CleanupReason, h as CycleHandlingMode, D as DeprecatedCycleHandlingMode, c as EffectAccess, b as EffectCleanup, d as EffectCloser, g as EffectOptions, E as EffectTrigger, a as Evolution, G as GetterWrapper, H as HistoryValue, P as PropTrigger, R as ReactiveError, i as ReactiveErrorCode, j as SchedulerMode, S as ScopedCallback, k as Zone, Z as ZoneAggregator, l as ZoneHistory, m as asyncZone, n as debugPreset, o as devPreset, p as formatCleanupReason, q as isReactive, r as objectToProxy, s as prodPreset, t as proxyToObject, u as reactiveOptions, v as toRaw, w as unwrap } from './types.js';
2
+ export { ArrayDiffResult, ArrayReadForward, Captioned, CompareSymbol, ContextManager, Decorator, DecoratorDescription, DecoratorError, DecoratorFactory, Destroyable, DestructionError, EffectContext, Eventful, EventsBase, GenericClassDecorator, Hook, Indexable, IterableWeakMap, IterableWeakSet, LegacyClassDecorator, LegacyPropertyDecorator, Memoizable, MemoizableArgument, MixinClass, MixinFunction, ModernAccessorDecorator, ModernClassDecorator, ModernGetterDecorator, ModernMethodDecorator, ModernSetterDecorator, MorphPosition, PromiseChain, ReactiveBase, Resource, Restorer, addBatchCleanup, addUnreactiveProps, allocated, allocatedValues, arrayDiff, arrayEquals, assertUntracked, asyncHook, asyncHooks, atom, atomic, attend, biDi, cache, cached, callOnGC, captioned, captured, caught, chainPromise, createFlavor, debounce, decorator, deepCompare, deepWatch, defer, deprecated, descriptor, destructor, effect, effectAggregator, effectContext, flavorOptions, flavored, forwardArray, getActivationLog, getActiveEffect, getAt, getState, hooks, inert, inheritCaption, isCached, isConstructor, isDev, isNonReactive, isObject, isProd, isReactiveBroken, isTest, legacyDecorator, lift, link, markRaw, markRawProps, memoize, mixin, modernDecorator, morph, named, onEffectThrow, onReactiveBroken, onReactiveReset, organize, organized, profileInfo, reactive, readonlyReactive, reset, resource, root, setAt, shallowReactive, tag, throttle, touched, touched1, unlink, unreactive, untracked, watch, when, withEffectContext, wrapInert, zip } from './browser.js';
@@ -1,6 +1,6 @@
1
1
  import './debug.esm.js';
2
- import './chunks/node-NEZvVo4M.esm.js';
3
- export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-XsYTUhHx.esm.js';
4
- export { A as AZone, C as CompareSymbol, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captioned, q as captured, r as caught, s as createFlavor, t as debugPreset, u as decorator, v as deepCompare, w as defer, x as devPreset, y as effect, z as effectAggregator, B as effectContext, E as flavorOptions, F as flavored, G as formatCleanupReason, H as getActivationLog, J as getActiveEffect, K as getState, L as hooks, M as inheritCaption, N as isConstructor, O as isDev, P as isNonReactive, Q as isObject, S as isProd, T as isReactive, U as isTest, V as legacyDecorator, W as link, X as mixin, Y as modernDecorator, _ as named, $ as objectToProxy, a0 as onEffectThrow, a1 as prodPreset, a2 as proxyToObject, a3 as reactive, a4 as reactiveOptions, a5 as reset, a6 as root, a7 as tag, a8 as touched, a9 as touched1, aa as unlink, ab as untracked, ac as unwrap, ad as withEffectContext, ae as zip } from './chunks/proxy-BtmPFjSr.esm.js';
2
+ import './chunks/node-sQtns7M-.esm.js';
3
+ export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-YGpb1te7.esm.js';
4
+ export { A as AZone, C as CompareSymbol, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captioned, q as captured, r as caught, s as createFlavor, t as debugPreset, u as decorator, v as deepCompare, w as defer, x as devPreset, y as effect, z as effectAggregator, B as effectContext, E as flavorOptions, F as flavored, G as formatCleanupReason, H as getActivationLog, J as getActiveEffect, K as getState, L as hooks, M as inert, N as inheritCaption, O as isConstructor, P as isDev, Q as isNonReactive, S as isObject, T as isProd, U as isReactive, V as isReactiveBroken, W as isTest, X as legacyDecorator, Y as link, _ as markRaw, $ as markRawProps, a0 as mixin, a1 as modernDecorator, a2 as named, a3 as objectToProxy, a4 as onEffectThrow, a5 as onReactiveBroken, a6 as onReactiveReset, a7 as prodPreset, a8 as proxyToObject, a9 as reactive, aa as reactiveOptions, ab as readonlyReactive, ac as reset, ad as root, ae as shallowReactive, af as tag, ag as toRaw, ah as touched, ai as touched1, aj as unlink, ak as untracked, al as unwrap, am as withEffectContext, an as wrapInert, ao as zip } from './chunks/effects-CPjf6gNA.esm.js';
5
5
  import 'node:async_hooks';
6
6
  //# sourceMappingURL=node.dev.esm.js.map
package/dist/node.esm.js CHANGED
@@ -1,5 +1,5 @@
1
- import './chunks/node-NEZvVo4M.esm.js';
2
- export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-XsYTUhHx.esm.js';
3
- export { A as AZone, C as CompareSymbol, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captioned, q as captured, r as caught, s as createFlavor, t as debugPreset, u as decorator, v as deepCompare, w as defer, x as devPreset, y as effect, z as effectAggregator, B as effectContext, E as flavorOptions, F as flavored, G as formatCleanupReason, H as getActivationLog, J as getActiveEffect, K as getState, L as hooks, M as inheritCaption, N as isConstructor, O as isDev, P as isNonReactive, Q as isObject, S as isProd, T as isReactive, U as isTest, V as legacyDecorator, W as link, X as mixin, Y as modernDecorator, _ as named, $ as objectToProxy, a0 as onEffectThrow, a1 as prodPreset, a2 as proxyToObject, a3 as reactive, a4 as reactiveOptions, a5 as reset, a6 as root, a7 as tag, a8 as touched, a9 as touched1, aa as unlink, ab as untracked, ac as unwrap, ad as withEffectContext, ae as zip } from './chunks/proxy-BtmPFjSr.esm.js';
1
+ import './chunks/node-sQtns7M-.esm.js';
2
+ export { A as ArrayReadForward, D as Destroyable, a as DestructionError, E as Eventful, I as Indexable, b as allocated, c as allocatedValues, d as arrayDiff, e as attend, f as cache, g as cached, h as callOnGC, i as chainPromise, j as debounce, k as deepWatch, l as deprecated, m as descriptor, n as destructor, o as forwardArray, p as getAt, q as isCached, r as lift, s as memoize, t as morph, u as organize, v as organized, w as profileInfo, x as resource, y as setAt, z as throttle, B as unreactive, C as watch, F as when } from './chunks/index-YGpb1te7.esm.js';
3
+ export { A as AZone, C as CompareSymbol, D as DecoratorError, I as IterableWeakMap, a as IterableWeakSet, R as ReactiveBase, b as ReactiveError, c as ReactiveErrorCode, Z as Zone, d as ZoneAggregator, e as ZoneHistory, f as addBatchCleanup, g as addUnreactiveProps, h as arrayEquals, i as assertUntracked, j as asyncHook, k as asyncHooks, l as asyncZone, m as atom, n as atomic, o as biDi, p as captioned, q as captured, r as caught, s as createFlavor, t as debugPreset, u as decorator, v as deepCompare, w as defer, x as devPreset, y as effect, z as effectAggregator, B as effectContext, E as flavorOptions, F as flavored, G as formatCleanupReason, H as getActivationLog, J as getActiveEffect, K as getState, L as hooks, M as inert, N as inheritCaption, O as isConstructor, P as isDev, Q as isNonReactive, S as isObject, T as isProd, U as isReactive, V as isReactiveBroken, W as isTest, X as legacyDecorator, Y as link, _ as markRaw, $ as markRawProps, a0 as mixin, a1 as modernDecorator, a2 as named, a3 as objectToProxy, a4 as onEffectThrow, a5 as onReactiveBroken, a6 as onReactiveReset, a7 as prodPreset, a8 as proxyToObject, a9 as reactive, aa as reactiveOptions, ab as readonlyReactive, ac as reset, ad as root, ae as shallowReactive, af as tag, ag as toRaw, ah as touched, ai as touched1, aj as unlink, ak as untracked, al as unwrap, am as withEffectContext, an as wrapInert, ao as zip } from './chunks/effects-CPjf6gNA.esm.js';
4
4
  import 'node:async_hooks';
5
5
  //# sourceMappingURL=node.esm.js.map
package/dist/types.d.ts CHANGED
@@ -278,6 +278,9 @@ declare class ReactiveError extends Error {
278
278
  get code(): ReactiveErrorCode | undefined;
279
279
  get cause(): any;
280
280
  }
281
+ type SchedulerMode = 'raw' | 'ordered' | 'debug';
282
+ type DeprecatedCycleHandlingMode = 'production' | 'development' | 'debug';
283
+ type CycleHandlingMode = SchedulerMode | DeprecatedCycleHandlingMode;
281
284
  /**
282
285
  * Global options for the reactive system
283
286
  */
@@ -367,22 +370,33 @@ declare const options: {
367
370
  */
368
371
  onMemoizationDiscrepancy: ((cached: any, fresh: any, fn: Function, args: any[], cause: "calculation" | "comparison") => void) | undefined;
369
372
  /**
370
- * How to handle cycles detected in effect batches.
373
+ * Effect scheduler mode.
371
374
  *
372
- * - `'production'` (Default): High-performance mode. Disables dependency graph maintenance and
373
- * Topological Sorting in favor of a simple FIFO queue. Use this for trustworthy, acyclic UI code.
374
- * Cycle detection is heuristic (uses maxEffectChain execution counts).
375
+ * - `'ordered'` (Default): maintains the causal effect graph so effects that are already
376
+ * queued together can run in dependency order. It also preserves parent/child effect
377
+ * lifecycle ordering and catches cycles eagerly when edges are created.
375
378
  *
376
- * - `'development'`: Maintains direct dependency graph for early cycle detection during edge creation.
377
- * Catches cycles before effects execute via DFS check when adding edges. Throws immediately with
378
- * basic path information. Good balance of debugging help with moderate overhead.
379
+ * - `'raw'`: fastest FIFO scheduler. It does not maintain the effect graph.
380
+ * Cycle detection is heuristic, using maxEffectChain execution counts.
379
381
  *
380
- * - `'debug'`: Full diagnostic mode with transitive closures and topological sorting.
381
- * Provides detailed cycle path reporting. Highest overhead but most informative for bug hunting.
382
+ * - `'debug'`: ordered scheduling plus the most detailed graph diagnostics. Highest overhead,
383
+ * best for investigation.
382
384
  *
383
- * @default 'production'
385
+ * @default 'ordered'
384
386
  */
385
- cycleHandling: "production" | "development" | "debug";
387
+ scheduler: SchedulerMode;
388
+ /**
389
+ * @deprecated Use `scheduler` instead.
390
+ *
391
+ * Backward-compatible alias for older names:
392
+ * - `'production'` maps to `scheduler = 'raw'`
393
+ * - `'development'` maps to `scheduler = 'ordered'`
394
+ * - `'debug'` maps to `scheduler = 'debug'`
395
+ *
396
+ * The new names describe scheduler behavior rather than runtime environment.
397
+ */
398
+ get cycleHandling(): SchedulerMode;
399
+ set cycleHandling(mode: CycleHandlingMode);
386
400
  /**
387
401
  * Internal flag used by memoization discrepancy detector to avoid counting calls in tests
388
402
  * @warning Do not modify this flag manually, this flag is given by the engine
@@ -455,18 +469,19 @@ declare const options: {
455
469
  logErrors: boolean;
456
470
  enableHistory: boolean;
457
471
  historySize: number;
458
- } | null;
472
+ } | undefined;
459
473
  };
460
474
  /** Production preset: no introspection, heuristic cycle detection, minimal overhead */
461
475
  declare const prodPreset: Partial<typeof options>;
462
- /** Development preset (default): introspection on, early cycle detection, warnings */
476
+ /** Development preset: introspection on, early cycle detection, warnings */
463
477
  declare const devPreset: Partial<typeof options>;
464
478
  /** Debug preset: full diagnostics, throws on violations, rich lineage capture */
465
479
  declare const debugPreset: Partial<typeof options>;
466
480
  declare const objectToProxy: WeakMap<object, object>;
467
481
  declare const proxyToObject: WeakMap<object, object>;
468
482
  declare function unwrap<T>(obj: T): T;
483
+ declare const toRaw: typeof unwrap;
469
484
  declare function isReactive(obj: any): boolean;
470
485
 
471
- export { AZone as A, ReactiveError as R, ZoneAggregator as Z, ReactiveErrorCode as h, Zone as i, ZoneHistory as j, asyncZone as k, debugPreset as l, devPreset as m, formatCleanupReason as n, isReactive as o, objectToProxy as p, prodPreset as q, proxyToObject as r, options as s, unwrap as u };
472
- export type { CleanupReason as C, EffectTrigger as E, GetterWrapper as G, HistoryValue as H, PropTrigger as P, ScopedCallback as S, Evolution as a, EffectCleanup as b, EffectAccess as c, EffectCloser as d, State as e, CatchFunction as f, EffectOptions as g };
486
+ export { AZone as A, ReactiveError as R, ZoneAggregator as Z, ReactiveErrorCode as i, Zone as k, ZoneHistory as l, asyncZone as m, debugPreset as n, devPreset as o, formatCleanupReason as p, isReactive as q, objectToProxy as r, prodPreset as s, proxyToObject as t, options as u, toRaw as v, unwrap as w };
487
+ export type { CleanupReason as C, DeprecatedCycleHandlingMode as D, EffectTrigger as E, GetterWrapper as G, HistoryValue as H, PropTrigger as P, ScopedCallback as S, Evolution as a, EffectCleanup as b, EffectAccess as c, EffectCloser as d, State as e, CatchFunction as f, EffectOptions as g, CycleHandlingMode as h, SchedulerMode as j };
@@ -185,7 +185,9 @@ export declare function deprecated(message?: string): Function;
185
185
  // buildReactivityGraph, getMutationHistory, getDependents, getDependencies, etc.
186
186
 
187
187
  export declare const reactiveOptions: {
188
- cycleHandling: 'production' | 'development' | 'debug';
188
+ scheduler: 'raw' | 'ordered' | 'debug';
189
+ /** @deprecated Use scheduler instead. */
190
+ cycleHandling: 'raw' | 'ordered' | 'debug' | 'production' | 'development';
189
191
  introspection: unknown;
190
192
  };
191
193
 
package/docs/ai/manual.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## 1. MENTAL MODEL
8
8
 
9
- Proxy-based **fine-grained reactivity** — changes propagate synchronously through dependency-tracked effects. No VDOM, no scheduler, no hooks.
9
+ Proxy-based **fine-grained reactivity** — changes propagate synchronously through dependency-tracked effects. No VDOM, no async render scheduler, no hooks.
10
10
 
11
11
  | Concept | Mutts |
12
12
  |---------|-------|
@@ -202,6 +202,8 @@ const updateBoth = atomic((a, b) => { state.a = a; state.b = b }) // effects fir
202
202
  // Decorator: @atomic on methods
203
203
  ```
204
204
 
205
+ `atomic()` wraps for later invocation but still executes synchronously when called. Internally it behaves like `batch(fn, { immediate: true })`, so nested atomic calls join the active batch by default instead of creating an implicit child batch.
206
+
205
207
  ### 3.7 atom() — Immediate atomic execution
206
208
 
207
209
  ```ts
@@ -209,6 +211,16 @@ atom(() => { state.a = 1; state.b = 2 }) // runs now, effects fire once
209
211
  // Unlike atomic() which wraps for later, atom() executes immediately
210
212
  ```
211
213
 
214
+ The explicit batching API is now:
215
+
216
+ ```ts
217
+ batch(fnOrEffects, { immediate?: boolean, contained?: boolean, caller?: EffectTrigger })
218
+ ```
219
+
220
+ - `batch(fn)` joins the current batch when nested
221
+ - `batch(fn, { immediate: true })` runs `fn` now and queues its consequences into the active batch
222
+ - `batch(fn, { contained: true })` creates an isolated nested batch that flushes before returning
223
+
212
224
  ### 3.8 defer() — Avoid cycles
213
225
 
214
226
  ```ts
@@ -396,10 +408,10 @@ effect(() => {
396
408
  ```ts
397
409
  import { reactiveOptions } from 'mutts'
398
410
 
399
- // Cycle detection
400
- reactiveOptions.cycleHandling = 'development' // default: graph-based, throws
401
- reactiveOptions.cycleHandling = 'debug' // full transitive closure, detailed paths
402
- reactiveOptions.cycleHandling = 'production' // heuristic via maxTriggerPerBatch
411
+ // Scheduler / cycle detection
412
+ reactiveOptions.scheduler = 'ordered' // default: causal graph ordering, eager cycles
413
+ reactiveOptions.scheduler = 'raw' // fastest FIFO mode, heuristic cycles
414
+ reactiveOptions.scheduler = 'debug' // ordered mode plus heavier diagnostics
403
415
 
404
416
  // Lifecycle hooks (all wrapped via optionCall for safety)
405
417
  reactiveOptions.enter = (effect) => {} // before effect runs