sia-reactor 0.0.22 → 0.0.23

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.
package/README.md CHANGED
@@ -102,7 +102,7 @@ import { setAny, getAny, mergeObjs } from "sia-reactor/utils";
102
102
 
103
103
  ```javascript
104
104
  import { reactive, Reactor } from "sia-reactor";
105
- import "sia-reactor/utils"; // deep object helpers (setAny/getAny/deleteAny/inAny/parseAnyObj/fanout/mergeObjs/deepClone/nuke...)
105
+ import "sia-reactor/utils"; // deep object helpers (setAny/getAny/deleteAny/inAny/parseAnyObj/fanout/mergeObjs/deepClone/nuke...) take note of `fanout`!
106
106
  import "sia-reactor/modules"; // built-in modules + storage adapters
107
107
  import "sia-reactor/adapters/vanilla"; // Autotracker + effect API + TimeTravelOverlay class
108
108
  import "sia-reactor/adapters/react"; // useReactor/useSelector/usePath hooks
@@ -245,7 +245,7 @@ const persist = new PersistModule({ // Plug it in. State is now automatically hy
245
245
  key: "APP_PREFS",
246
246
  paths: ["theme", "settings.brightness"],
247
247
  throttle: 5000,
248
- fanout: true, // async hydration should use leaf writes incase UI listeners already initialized.
248
+ fanout: true, // async hydration should use leaf writes to sync already initialized listeners.
249
249
  adapter: new IndexedDBAdapter({ dbName: "Session", version: 1, onversionchange: () => location.reload(), useSnapshot: true }) // or `LocalStorageAdapter` (instance or signature)
250
250
  };
251
251
  state.use(persist, getReactor(state))); // Put `Reactor` as second constructor arg if you want type inference, e.g. for the paths in the array.
@@ -346,7 +346,7 @@ player.on("intent.playing", (e) => {
346
346
  ### Troubleshooting
347
347
 
348
348
  - Listener timing feels late: `on(path, ...)` is microtask-batched by design; use `watch(path, ...)` only for strict immediate engine sync on leaf paths preferably.
349
- - Listeners don't react to changes: use `fanout(state, path, object, { depth: n })` instead of direct object sets to keep immutable semantics.
349
+ - Listeners don't react to changes: use `fanout(target, object, { depth: n })` instead of direct object sets to keep immutable semantics.
350
350
  - `reject()` appears ignored: call it in capture phase and ensure branch is wrapped in `intent(...)`, also remember it's the listener's choice to comply.
351
351
  - Snapshot behavior feels stale: enable `referenceTracking: true` with `smartCloning: true`, also use these when persisting to environments that don't take proxies, e.g. IndexedDB.
352
352
  - Cross-frame data is skipped: enable `crossRealms: true` for iframe/other realm objects.
@@ -475,7 +475,7 @@ rtr.on("todos", ({ type, target: { path, key } }) => {
475
475
  if (type === "update") console.log(path, key);
476
476
  }, { depth: 1 });
477
477
  // Better: narrow first, then destructure inside
478
- rtr.on("todos", (e: REvent<user, "todos", 1>) => {
478
+ rtr.on("todos", (e: REvent<User, "todos", 1>) => {
479
479
  if (e.type === "update") {
480
480
  const { path, key } = e.target;
481
481
  console.log(path, key); // or e.target.path, e.target.key
@@ -1,5 +1,5 @@
1
- import { d as Reactive } from './index-BgbbNXTW.js';
2
- import { m as TimeTravelModule } from './timeTravel-YUxRHRgh.js';
1
+ import { d as Reactive } from './index-m0aAWxhX.js';
2
+ import { m as TimeTravelModule } from './timeTravel-DExvNb04.js';
3
3
 
4
4
  /** Reactive options for the TimeTravel overlay instance. */
5
5
  interface TimeTravelConfig {
@@ -1,5 +1,5 @@
1
- import { d as Reactive } from './index-BgbbNXTW.cjs';
2
- import { m as TimeTravelModule } from './timeTravel-CraHdbXZ.cjs';
1
+ import { d as Reactive } from './index-m0aAWxhX.cjs';
2
+ import { m as TimeTravelModule } from './timeTravel-DctvcHVt.cjs';
3
3
 
4
4
  /** Reactive options for the TimeTravel overlay instance. */
5
5
  interface TimeTravelConfig {
@@ -63,7 +63,7 @@ var NOOP = () => {
63
63
  };
64
64
 
65
65
  // src/ts/utils/obj.ts
66
- var arrRx = /^([^\[\]]+)\[(\d+)\]$/;
66
+ var arrRegex = /^([^\[\]]+)\[(\d+)\]$/;
67
67
  function isObj(obj, arraycheck = true) {
68
68
  return "object" === typeof obj && obj !== null && (arraycheck ? !Array.isArray(obj) : true);
69
69
  }
@@ -71,7 +71,7 @@ function isPOJO(obj, config = NIL, typecheck = true) {
71
71
  return (typecheck ? isObj(obj, false) : true) && (config.crossRealms ? Object.prototype.toString.call(obj) === "[object Object]" : obj.constructor === Object);
72
72
  }
73
73
  function canHandle(obj, config = NIL, typecheck = true) {
74
- if (typecheck && !isObj(obj, false)) return false;
74
+ if (typecheck && !isObj(obj, false) || obj[INERTIA]) return false;
75
75
  if (Array.isArray(obj) || !config.preserveContext && isPOJO(obj, config, false)) return true;
76
76
  if (config.preserveContext) return !(obj instanceof Map) && !(obj instanceof Set) && !(obj instanceof WeakMap) && !(obj instanceof WeakSet) && !(obj instanceof Error) && !(obj instanceof Number) && !(obj instanceof Date) && !(obj instanceof String) && !(obj instanceof RegExp) && !(obj instanceof ArrayBuffer) && !(obj instanceof Promise);
77
77
  return false;
@@ -82,7 +82,7 @@ function getAny(source, key, separator = ".", keyFunc) {
82
82
  const keys2 = key.split(separator);
83
83
  let currObj = source;
84
84
  for (let i = 0, len = keys2.length; i < len; i++) {
85
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
85
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
86
86
  if (match) {
87
87
  const [, key3, iStr] = match;
88
88
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return void 0;
@@ -99,7 +99,7 @@ function setAny(target, key, value, separator = ".", keyFunc) {
99
99
  if (!key.includes(separator)) return void (target[keyFunc ? keyFunc(key) : key] = value);
100
100
  const keys2 = key.split(separator);
101
101
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
102
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
102
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
103
103
  if (match) {
104
104
  const [, key3, iStr] = match;
105
105
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -120,7 +120,7 @@ function deleteAny(target, key, separator = ".", keyFunc) {
120
120
  if (!key.includes(separator)) return void delete target[keyFunc ? keyFunc(key) : key];
121
121
  const keys2 = key.split(separator);
122
122
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
123
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
123
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
124
124
  if (match) {
125
125
  const [, key3, iStr] = match;
126
126
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -138,7 +138,7 @@ function inAny(source, key, separator = ".", keyFunc) {
138
138
  if (!key.includes(separator)) return key in source;
139
139
  const keys2 = key.split(separator);
140
140
  for (let currObj = source, i = 0, len = keys2.length; i < len; i++) {
141
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
141
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
142
142
  if (match) {
143
143
  const [, key3, iStr] = match;
144
144
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -339,7 +339,7 @@ var Reactor = class {
339
339
  if (this.config.referenceTracking && parent && key && !this.link(target, parent, key, false)) return target;
340
340
  const cached = this.proxyCache.get(target);
341
341
  if (cached) return cached;
342
- if (target[INERTIA] || !canHandle(target, this.config, false)) return target;
342
+ if (!canHandle(target, this.config, false)) return target;
343
343
  rejectable ||= target[REJECTABLE];
344
344
  indiffable ||= target[INDIFFABLE];
345
345
  const proxy = new Proxy(target, {
@@ -621,7 +621,8 @@ var Reactor = class {
621
621
  for (let i = 0, len = keys2.length; i < len; i++)
622
622
  try {
623
623
  clone[keys2[i]] = this.cloned(obj[keys2[i]], raw, seen);
624
- } catch {
624
+ } catch (e) {
625
+ if (e instanceof RangeError) throw e;
625
626
  }
626
627
  if (!raw && this.config.smartCloning) this.snapCache.set(obj, clone), obj[SSVERSION] = version;
627
628
  return clone;
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions, R as Reactor, d as Reactive, r as ReactorBuild, W as WildPaths, t as PathValue } from '../index-BgbbNXTW.cjs';
1
+ import { E as EffectOptions, R as Reactor, d as Reactive, u as ReactorBuild, W as WildPaths, v as PathValue } from '../index-m0aAWxhX.cjs';
2
2
  import { useLayoutEffect } from 'react';
3
- import { m as TimeTravelModule } from '../timeTravel-CraHdbXZ.cjs';
4
- import { T as TimeTravelConfig } from '../TimeTravelOverlay-DiXUgbUU.cjs';
3
+ import { m as TimeTravelModule } from '../timeTravel-DctvcHVt.cjs';
4
+ import { T as TimeTravelConfig } from '../TimeTravelOverlay-OjklzuCD.cjs';
5
5
 
6
6
  /**
7
7
  * Subscribes a component to desired Reactor state and returns it.
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions, R as Reactor, d as Reactive, r as ReactorBuild, W as WildPaths, t as PathValue } from '../index-BgbbNXTW.js';
1
+ import { E as EffectOptions, R as Reactor, d as Reactive, u as ReactorBuild, W as WildPaths, v as PathValue } from '../index-m0aAWxhX.js';
2
2
  import { useLayoutEffect } from 'react';
3
- import { m as TimeTravelModule } from '../timeTravel-YUxRHRgh.js';
4
- import { T as TimeTravelConfig } from '../TimeTravelOverlay-eWjAy0yr.js';
3
+ import { m as TimeTravelModule } from '../timeTravel-DExvNb04.js';
4
+ import { T as TimeTravelConfig } from '../TimeTravelOverlay-Dglcwpg-.js';
5
5
 
6
6
  /**
7
7
  * Subscribes a component to desired Reactor state and returns it.
@@ -2,10 +2,10 @@ import {
2
2
  Autotracker,
3
3
  TimeTravelOverlay,
4
4
  withTracker
5
- } from "../chunk-CS3FOV6J.js";
5
+ } from "../chunk-5JNWC7Z4.js";
6
6
  import {
7
7
  getReactor
8
- } from "../chunk-3SKLWTEA.js";
8
+ } from "../chunk-MSTHQVNK.js";
9
9
  import "../chunk-5A44QFT6.js";
10
10
  import "../chunk-P37ADJMM.js";
11
11
  import {
@@ -13,7 +13,7 @@ import {
13
13
  NIL,
14
14
  NOOP,
15
15
  getAny
16
- } from "../chunk-BTA6MIQ6.js";
16
+ } from "../chunk-MKL3JUPO.js";
17
17
 
18
18
  // src/ts/adapters/react/hooks/useReactor.ts
19
19
  import { useRef, useCallback, useSyncExternalStore, useMemo } from "react";
@@ -51,7 +51,7 @@ var NOOP = () => {
51
51
  };
52
52
 
53
53
  // src/ts/utils/obj.ts
54
- var arrRx = /^([^\[\]]+)\[(\d+)\]$/;
54
+ var arrRegex = /^([^\[\]]+)\[(\d+)\]$/;
55
55
  function isObj(obj, arraycheck = true) {
56
56
  return "object" === typeof obj && obj !== null && (arraycheck ? !Array.isArray(obj) : true);
57
57
  }
@@ -59,7 +59,7 @@ function isPOJO(obj, config = NIL, typecheck = true) {
59
59
  return (typecheck ? isObj(obj, false) : true) && (config.crossRealms ? Object.prototype.toString.call(obj) === "[object Object]" : obj.constructor === Object);
60
60
  }
61
61
  function canHandle(obj, config = NIL, typecheck = true) {
62
- if (typecheck && !isObj(obj, false)) return false;
62
+ if (typecheck && !isObj(obj, false) || obj[INERTIA]) return false;
63
63
  if (Array.isArray(obj) || !config.preserveContext && isPOJO(obj, config, false)) return true;
64
64
  if (config.preserveContext) return !(obj instanceof Map) && !(obj instanceof Set) && !(obj instanceof WeakMap) && !(obj instanceof WeakSet) && !(obj instanceof Error) && !(obj instanceof Number) && !(obj instanceof Date) && !(obj instanceof String) && !(obj instanceof RegExp) && !(obj instanceof ArrayBuffer) && !(obj instanceof Promise);
65
65
  return false;
@@ -70,7 +70,7 @@ function getAny(source, key, separator = ".", keyFunc) {
70
70
  const keys2 = key.split(separator);
71
71
  let currObj = source;
72
72
  for (let i = 0, len = keys2.length; i < len; i++) {
73
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
73
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
74
74
  if (match) {
75
75
  const [, key3, iStr] = match;
76
76
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return void 0;
@@ -87,7 +87,7 @@ function setAny(target, key, value, separator = ".", keyFunc) {
87
87
  if (!key.includes(separator)) return void (target[keyFunc ? keyFunc(key) : key] = value);
88
88
  const keys2 = key.split(separator);
89
89
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
90
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
90
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
91
91
  if (match) {
92
92
  const [, key3, iStr] = match;
93
93
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -108,7 +108,7 @@ function deleteAny(target, key, separator = ".", keyFunc) {
108
108
  if (!key.includes(separator)) return void delete target[keyFunc ? keyFunc(key) : key];
109
109
  const keys2 = key.split(separator);
110
110
  for (let currObj = target, i = 0, len = keys2.length; i < len; i++) {
111
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
111
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
112
112
  if (match) {
113
113
  const [, key3, iStr] = match;
114
114
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -126,7 +126,7 @@ function inAny(source, key, separator = ".", keyFunc) {
126
126
  if (!key.includes(separator)) return key in source;
127
127
  const keys2 = key.split(separator);
128
128
  for (let currObj = source, i = 0, len = keys2.length; i < len; i++) {
129
- const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRx);
129
+ const key2 = keyFunc ? keyFunc(keys2[i]) : keys2[i], match = key2.includes("[") && key2.match(arrRegex);
130
130
  if (match) {
131
131
  const [, key3, iStr] = match;
132
132
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -479,7 +479,7 @@ var Reactor = class {
479
479
  if (this.config.referenceTracking && parent && key && !this.link(target, parent, key, false)) return target;
480
480
  const cached = this.proxyCache.get(target);
481
481
  if (cached) return cached;
482
- if (target[INERTIA] || !canHandle(target, this.config, false)) return target;
482
+ if (!canHandle(target, this.config, false)) return target;
483
483
  rejectable ||= target[REJECTABLE];
484
484
  indiffable ||= target[INDIFFABLE];
485
485
  const proxy = new Proxy(target, {
@@ -761,7 +761,8 @@ var Reactor = class {
761
761
  for (let i = 0, len = keys2.length; i < len; i++)
762
762
  try {
763
763
  clone[keys2[i]] = this.cloned(obj[keys2[i]], raw, seen);
764
- } catch {
764
+ } catch (e) {
765
+ if (e instanceof RangeError) throw e;
765
766
  }
766
767
  if (!raw && this.config.smartCloning) this.snapCache.set(obj, clone), obj[SSVERSION] = version;
767
768
  return clone;
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions } from '../index-BgbbNXTW.cjs';
2
- export { A as Autotracker, w as withTracker } from '../index-BgbbNXTW.cjs';
3
- export { T as TimeTravelConfig, a as TimeTravelOverlay } from '../TimeTravelOverlay-DiXUgbUU.cjs';
4
- import '../timeTravel-CraHdbXZ.cjs';
1
+ import { E as EffectOptions } from '../index-m0aAWxhX.cjs';
2
+ export { A as Autotracker, w as withTracker } from '../index-m0aAWxhX.cjs';
3
+ export { T as TimeTravelConfig, a as TimeTravelOverlay } from '../TimeTravelOverlay-OjklzuCD.cjs';
4
+ import '../timeTravel-DctvcHVt.cjs';
5
5
 
6
6
  /**
7
7
  * Runs a reactive side effect in vanilla JavaScript.
@@ -1,7 +1,7 @@
1
- import { E as EffectOptions } from '../index-BgbbNXTW.js';
2
- export { A as Autotracker, w as withTracker } from '../index-BgbbNXTW.js';
3
- export { T as TimeTravelConfig, a as TimeTravelOverlay } from '../TimeTravelOverlay-eWjAy0yr.js';
4
- import '../timeTravel-YUxRHRgh.js';
1
+ import { E as EffectOptions } from '../index-m0aAWxhX.js';
2
+ export { A as Autotracker, w as withTracker } from '../index-m0aAWxhX.js';
3
+ export { T as TimeTravelConfig, a as TimeTravelOverlay } from '../TimeTravelOverlay-Dglcwpg-.js';
4
+ import '../timeTravel-DExvNb04.js';
5
5
 
6
6
  /**
7
7
  * Runs a reactive side effect in vanilla JavaScript.
@@ -3,11 +3,11 @@ import {
3
3
  TimeTravelOverlay,
4
4
  effect,
5
5
  withTracker
6
- } from "../chunk-CS3FOV6J.js";
7
- import "../chunk-3SKLWTEA.js";
6
+ } from "../chunk-5JNWC7Z4.js";
7
+ import "../chunk-MSTHQVNK.js";
8
8
  import "../chunk-5A44QFT6.js";
9
9
  import "../chunk-P37ADJMM.js";
10
- import "../chunk-BTA6MIQ6.js";
10
+ import "../chunk-MKL3JUPO.js";
11
11
  export {
12
12
  Autotracker,
13
13
  TimeTravelOverlay,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  reactive
3
- } from "./chunk-3SKLWTEA.js";
3
+ } from "./chunk-MSTHQVNK.js";
4
4
  import {
5
5
  createEl,
6
6
  formatKeyForDisplay,
@@ -13,7 +13,7 @@ import {
13
13
  RAW,
14
14
  canHandle,
15
15
  nuke
16
- } from "./chunk-BTA6MIQ6.js";
16
+ } from "./chunk-MKL3JUPO.js";
17
17
 
18
18
  // src/ts/adapters/autotracker.ts
19
19
  var Autotracker = class {
@@ -22,7 +22,7 @@ var NOOP = () => {
22
22
  };
23
23
 
24
24
  // src/ts/utils/obj.ts
25
- var arrRx = /^([^\[\]]+)\[(\d+)\]$/;
25
+ var arrRegex = /^([^\[\]]+)\[(\d+)\]$/;
26
26
  function isObj(obj, arraycheck = true) {
27
27
  return "object" === typeof obj && obj !== null && (arraycheck ? !Array.isArray(obj) : true);
28
28
  }
@@ -30,7 +30,7 @@ function isPOJO(obj, config = NIL, typecheck = true) {
30
30
  return (typecheck ? isObj(obj, false) : true) && (config.crossRealms ? Object.prototype.toString.call(obj) === "[object Object]" : obj.constructor === Object);
31
31
  }
32
32
  function canHandle(obj, config = NIL, typecheck = true) {
33
- if (typecheck && !isObj(obj, false)) return false;
33
+ if (typecheck && !isObj(obj, false) || obj[INERTIA]) return false;
34
34
  if (Array.isArray(obj) || !config.preserveContext && isPOJO(obj, config, false)) return true;
35
35
  if (config.preserveContext) return !(obj instanceof Map) && !(obj instanceof Set) && !(obj instanceof WeakMap) && !(obj instanceof WeakSet) && !(obj instanceof Error) && !(obj instanceof Number) && !(obj instanceof Date) && !(obj instanceof String) && !(obj instanceof RegExp) && !(obj instanceof ArrayBuffer) && !(obj instanceof Promise);
36
36
  return false;
@@ -41,7 +41,7 @@ function getAny(source, key, separator = ".", keyFunc) {
41
41
  const keys = key.split(separator);
42
42
  let currObj = source;
43
43
  for (let i = 0, len = keys.length; i < len; i++) {
44
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRx);
44
+ const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
45
45
  if (match) {
46
46
  const [, key3, iStr] = match;
47
47
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return void 0;
@@ -58,7 +58,7 @@ function setAny(target, key, value, separator = ".", keyFunc) {
58
58
  if (!key.includes(separator)) return void (target[keyFunc ? keyFunc(key) : key] = value);
59
59
  const keys = key.split(separator);
60
60
  for (let currObj = target, i = 0, len = keys.length; i < len; i++) {
61
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRx);
61
+ const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
62
62
  if (match) {
63
63
  const [, key3, iStr] = match;
64
64
  if (!Array.isArray(currObj[key3])) currObj[key3] = [];
@@ -79,7 +79,7 @@ function deleteAny(target, key, separator = ".", keyFunc) {
79
79
  if (!key.includes(separator)) return void delete target[keyFunc ? keyFunc(key) : key];
80
80
  const keys = key.split(separator);
81
81
  for (let currObj = target, i = 0, len = keys.length; i < len; i++) {
82
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRx);
82
+ const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
83
83
  if (match) {
84
84
  const [, key3, iStr] = match;
85
85
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return;
@@ -97,7 +97,7 @@ function inAny(source, key, separator = ".", keyFunc) {
97
97
  if (!key.includes(separator)) return key in source;
98
98
  const keys = key.split(separator);
99
99
  for (let currObj = source, i = 0, len = keys.length; i < len; i++) {
100
- const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRx);
100
+ const key2 = keyFunc ? keyFunc(keys[i]) : keys[i], match = key2.includes("[") && key2.match(arrRegex);
101
101
  if (match) {
102
102
  const [, key3, iStr] = match;
103
103
  if (!Array.isArray(currObj[key3]) || !(key3 in currObj)) return false;
@@ -125,30 +125,35 @@ function parseEvtOpts(options, opts, boolOpt = opts[0], result = {}) {
125
125
  return Object.assign(result, "boolean" === typeof options ? { [boolOpt]: options } : options), result;
126
126
  }
127
127
  function fanout(a, b, c, d) {
128
- const isEvtPld = !!a?.target, [state, path, news, olds, opts, type] = isEvtPld ? [a.root, a.currentTarget.path, a.currentTarget.value, a.currentTarget.oldValue, b || NIL, a.type] : [a, b, c, (d || NIL).merge ? getAny(a, b) : NIL, d || NIL], target = path === "*" ? state : getAny(state, path);
129
- if (isEvtPld && type !== "set" && type !== "delete" || !target || !canHandle(news, opts)) return;
128
+ const isEvPd = !!a?.target, isPath = !isEvPd && "string" === typeof b, [state, path, olds, news, opts, type] = isEvPd ? [a.root, a.currentTarget.path, a.currentTarget.oldValue, a.currentTarget.value, b || NIL, a.type] : isPath ? [a, b, getAny(a, b), c, d || NIL, void 0] : [void 0, void 0, a, b, c || NIL, void 0], target = isEvPd ? getAny(a.root, a.currentTarget.path) : isPath ? getAny(state, path) : olds;
129
+ if (isEvPd && type !== "set" && type !== "delete" || !target || !canHandle(news, opts)) return;
130
130
  const prev = CTX.isCascading;
131
- CTX.isCascading = isEvtPld;
131
+ CTX.isCascading = isEvPd;
132
132
  try {
133
- const walk = (target2, obj, depth = 1, keys = Object.keys(obj)) => {
133
+ const walk = (target2, obj, depth = isEvPd ? 1 : Infinity, keys = Object.keys(obj)) => {
134
134
  for (let i = 0, len = keys.length; i < len; i++) {
135
135
  const val = obj[keys[i]];
136
136
  try {
137
- depth > 1 && canHandle(val, opts) ? walk(target2[keys[i]] ||= {}, val, depth - 1) : target2[keys[i]] = val;
138
- } catch {
137
+ if ((opts.atomic ?? true) && Array.isArray(val)) target2[keys[i]] = val, target2[keys[i]].length = target2[keys[i]].length;
138
+ else depth > 1 && canHandle(val, opts) ? walk(target2[keys[i]] ||= {}, val, depth - 1) : target2[keys[i]] = val;
139
+ } catch (e) {
140
+ if (e instanceof RangeError) throw e;
139
141
  }
140
142
  }
141
143
  };
142
- walk(target, opts.merge && canHandle(olds, opts) ? mergeObjs(olds, news) : news, opts.depth === true ? Infinity : +opts.depth);
144
+ if ((opts.atomic ?? true) && Array.isArray(news) && isPath) setAny(state, path, news), getAny(state, path).length = news.length;
145
+ else walk(target, opts.merge ? mergeObjs(olds, news, opts) : news, opts.depth === true ? Infinity : opts.depth);
143
146
  } finally {
144
147
  CTX.isCascading = prev;
145
148
  }
146
149
  }
147
- function mergeObjs(o1 = {}, o2 = {}) {
150
+ var fanoutOptsArr = ["merge", "depth", "atomic"];
151
+ function mergeObjs(o1, o2, config, pojocheck = true) {
152
+ if (pojocheck && (!isPOJO(o1 || NIL, config) || !isPOJO(o2 || NIL, config))) return o2;
148
153
  const merged = { ...o1 ||= {}, ...o2 ||= {} }, keys = Object.keys(merged);
149
154
  for (let i = 0, len = keys.length; i < len; i++) {
150
- const k = keys[i];
151
- if (isObj(o1[k]) && isObj(o2[k])) merged[k] = mergeObjs(o1[k], o2[k]);
155
+ const o1C = o1[keys[i]], o2C = o2[keys[i]];
156
+ if (isPOJO(o1C, config) && isPOJO(o2C, config)) merged[keys[i]] = mergeObjs(o1C, o2C, config, false);
152
157
  }
153
158
  return merged;
154
159
  }
@@ -168,7 +173,8 @@ function deepClone(obj, config = NIL, seen = /* @__PURE__ */ new WeakMap()) {
168
173
  for (let i = 0, len = keys.length; i < len; i++)
169
174
  try {
170
175
  clone[keys[i]] = deepClone(obj[keys[i]], config, seen);
171
- } catch {
176
+ } catch (e) {
177
+ if (e instanceof RangeError) throw e;
172
178
  }
173
179
  return clone;
174
180
  }
@@ -200,6 +206,7 @@ export {
200
206
  EVT_OPTS,
201
207
  NIL,
202
208
  NOOP,
209
+ arrRegex,
203
210
  isObj,
204
211
  isPOJO,
205
212
  canHandle,
@@ -210,6 +217,7 @@ export {
210
217
  parseAnyObj,
211
218
  parseEvtOpts,
212
219
  fanout,
220
+ fanoutOptsArr,
213
221
  mergeObjs,
214
222
  getTrailRecords,
215
223
  deepClone,
@@ -20,7 +20,7 @@ import {
20
20
  nuke,
21
21
  parseEvtOpts,
22
22
  setAny
23
- } from "./chunk-BTA6MIQ6.js";
23
+ } from "./chunk-MKL3JUPO.js";
24
24
 
25
25
  // src/ts/core/event.ts
26
26
  var ReactorEvent = class _ReactorEvent {
@@ -187,7 +187,7 @@ var Reactor = class {
187
187
  if (this.config.referenceTracking && parent && key && !this.link(target, parent, key, false)) return target;
188
188
  const cached = this.proxyCache.get(target);
189
189
  if (cached) return cached;
190
- if (target[INERTIA] || !canHandle(target, this.config, false)) return target;
190
+ if (!canHandle(target, this.config, false)) return target;
191
191
  rejectable ||= target[REJECTABLE];
192
192
  indiffable ||= target[INDIFFABLE];
193
193
  const proxy = new Proxy(target, {
@@ -469,7 +469,8 @@ var Reactor = class {
469
469
  for (let i = 0, len = keys.length; i < len; i++)
470
470
  try {
471
471
  clone[keys[i]] = this.cloned(obj[keys[i]], raw, seen);
472
- } catch {
472
+ } catch (e) {
473
+ if (e instanceof RangeError) throw e;
473
474
  }
474
475
  if (!raw && this.config.smartCloning) this.snapCache.set(obj, clone), obj[SSVERSION] = version;
475
476
  return clone;
@@ -706,7 +707,7 @@ function inert(target) {
706
707
  function live(target) {
707
708
  return delete getRaw(target)[INERTIA], target;
708
709
  }
709
- function isInert(target) {
710
+ function isInert(target = NIL) {
710
711
  return !!getRaw(target)[INERTIA];
711
712
  }
712
713
  function intent(target) {
@@ -715,7 +716,7 @@ function intent(target) {
715
716
  function state(target) {
716
717
  return delete getRaw(target)[REJECTABLE], target;
717
718
  }
718
- function isIntent(target) {
719
+ function isIntent(target = NIL) {
719
720
  return !!getRaw(target)[REJECTABLE];
720
721
  }
721
722
  function volatile(target) {
@@ -724,19 +725,19 @@ function volatile(target) {
724
725
  function stable(target) {
725
726
  return delete getRaw(target)[INDIFFABLE], target;
726
727
  }
727
- function isVolatile(target) {
728
+ function isVolatile(target = NIL) {
728
729
  return !!getRaw(target)[INDIFFABLE];
729
730
  }
730
731
  function getReactor(target, create = false, build) {
731
732
  return (target instanceof Reactor ? target : target.__Reactor__) || (create ? new Reactor(target, build) : void 0);
732
733
  }
733
- function getRaw(target) {
734
- return target?.[RAW] || target;
734
+ function getRaw(target = NIL) {
735
+ return target[RAW] || target;
735
736
  }
736
- function getVersion(target) {
737
+ function getVersion(target = NIL) {
737
738
  return getRaw(target)[VERSION] || 0;
738
739
  }
739
- function getSnapshotVersion(target) {
740
+ function getSnapshotVersion(target = NIL) {
740
741
  return getRaw(target)[SSVERSION] || 0;
741
742
  }
742
743