@fluixi/reactive 1.0.0-alpha.83 → 1.0.0-alpha.85

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 (167) hide show
  1. package/dist/cdn/reactive.cjs +2722 -1
  2. package/dist/cdn/reactive.global.js +2 -1
  3. package/dist/cdn/reactive.mjs +2706 -1
  4. package/dist/cdn/signal.cjs +299 -1
  5. package/dist/cdn/signal.d.ts +1 -1
  6. package/dist/cdn/signal.global.js +2 -1
  7. package/dist/cdn/signal.js +1 -1
  8. package/dist/cdn/signal.mjs +276 -1
  9. package/dist/index.cjs +2722 -1
  10. package/dist/index.mjs +2706 -1
  11. package/dist/lib/index.cjs +2723 -1
  12. package/dist/lib/index.js +1 -1
  13. package/dist/lib/index.mjs +2708 -1
  14. package/dist/lib/observable/index.cjs +386 -1
  15. package/dist/lib/observable/index.mjs +364 -1
  16. package/dist/lib/observable/observable.cjs +384 -1
  17. package/dist/lib/observable/observable.d.ts +0 -137
  18. package/dist/lib/observable/observable.d.ts.map +1 -1
  19. package/dist/lib/observable/observable.js +0 -71
  20. package/dist/lib/observable/observable.mjs +361 -1
  21. package/dist/lib/observable/subscription.cjs +180 -1
  22. package/dist/lib/observable/subscription.d.ts +0 -12
  23. package/dist/lib/observable/subscription.d.ts.map +1 -1
  24. package/dist/lib/observable/subscription.js +0 -12
  25. package/dist/lib/observable/subscription.mjs +157 -1
  26. package/dist/lib/observable/types.cjs +18 -1
  27. package/dist/lib/observable/types.d.ts.map +1 -1
  28. package/dist/lib/predicates.cjs +44 -1
  29. package/dist/lib/predicates.d.ts +2 -2
  30. package/dist/lib/predicates.js +2 -2
  31. package/dist/lib/predicates.mjs +23 -1
  32. package/dist/lib/signal/api.cjs +571 -1
  33. package/dist/lib/signal/api.d.ts +211 -1
  34. package/dist/lib/signal/api.d.ts.map +1 -1
  35. package/dist/lib/signal/api.js +207 -12
  36. package/dist/lib/signal/api.mjs +548 -1
  37. package/dist/lib/signal/cached-resource.cjs +672 -1
  38. package/dist/lib/signal/cached-resource.d.ts +28 -16
  39. package/dist/lib/signal/cached-resource.d.ts.map +1 -1
  40. package/dist/lib/signal/cached-resource.js +35 -29
  41. package/dist/lib/signal/cached-resource.mjs +650 -1
  42. package/dist/lib/signal/graph/children.cjs +325 -1
  43. package/dist/lib/signal/graph/children.js +1 -1
  44. package/dist/lib/signal/graph/children.mjs +302 -1
  45. package/dist/lib/signal/graph/compat.cjs +578 -1
  46. package/dist/lib/signal/graph/compat.d.ts +13 -13
  47. package/dist/lib/signal/graph/compat.d.ts.map +1 -1
  48. package/dist/lib/signal/graph/compat.js +33 -31
  49. package/dist/lib/signal/graph/compat.mjs +556 -1
  50. package/dist/lib/signal/graph/core.cjs +295 -1
  51. package/dist/lib/signal/graph/core.d.ts +28 -24
  52. package/dist/lib/signal/graph/core.d.ts.map +1 -1
  53. package/dist/lib/signal/graph/core.js +38 -31
  54. package/dist/lib/signal/graph/core.mjs +273 -1
  55. package/dist/lib/signal/graph/debounced.cjs +668 -1
  56. package/dist/lib/signal/graph/debounced.d.ts +5 -5
  57. package/dist/lib/signal/graph/debounced.d.ts.map +1 -1
  58. package/dist/lib/signal/graph/debounced.js +5 -5
  59. package/dist/lib/signal/graph/debounced.mjs +645 -1
  60. package/dist/lib/signal/graph/derived.cjs +496 -1
  61. package/dist/lib/signal/graph/derived.d.ts +1 -1
  62. package/dist/lib/signal/graph/derived.js +1 -1
  63. package/dist/lib/signal/graph/derived.mjs +473 -1
  64. package/dist/lib/signal/graph/detect.cjs +66 -1
  65. package/dist/lib/signal/graph/detect.mjs +45 -1
  66. package/dist/lib/signal/graph/error-boundary.cjs +301 -1
  67. package/dist/lib/signal/graph/error-boundary.js +3 -3
  68. package/dist/lib/signal/graph/error-boundary.mjs +278 -1
  69. package/dist/lib/signal/graph/index.cjs +305 -1
  70. package/dist/lib/signal/graph/index.d.ts +7 -6
  71. package/dist/lib/signal/graph/index.d.ts.map +1 -1
  72. package/dist/lib/signal/graph/index.js +7 -6
  73. package/dist/lib/signal/graph/index.mjs +283 -1
  74. package/dist/lib/signal/graph/observe.cjs +163 -1
  75. package/dist/lib/signal/graph/observe.d.ts +8 -8
  76. package/dist/lib/signal/graph/observe.js +5 -5
  77. package/dist/lib/signal/graph/observe.mjs +140 -1
  78. package/dist/lib/signal/graph/resource.cjs +620 -1
  79. package/dist/lib/signal/graph/resource.d.ts +1 -1
  80. package/dist/lib/signal/graph/resource.js +7 -8
  81. package/dist/lib/signal/graph/resource.mjs +597 -1
  82. package/dist/lib/signal/graph/runtime.cjs +501 -1
  83. package/dist/lib/signal/graph/runtime.d.ts +7 -7
  84. package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
  85. package/dist/lib/signal/graph/runtime.js +34 -30
  86. package/dist/lib/signal/graph/runtime.mjs +478 -1
  87. package/dist/lib/signal/graph/signal-next.cjs +1208 -1
  88. package/dist/lib/signal/graph/signal-next.d.ts +5 -5
  89. package/dist/lib/signal/graph/signal-next.d.ts.map +1 -1
  90. package/dist/lib/signal/graph/signal-next.js +14 -12
  91. package/dist/lib/signal/graph/signal-next.mjs +1186 -1
  92. package/dist/lib/signal/graph/ssr-hooks.cjs +60 -1
  93. package/dist/lib/signal/graph/ssr-hooks.d.ts +6 -7
  94. package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -1
  95. package/dist/lib/signal/graph/ssr-hooks.js +6 -7
  96. package/dist/lib/signal/graph/ssr-hooks.mjs +39 -1
  97. package/dist/lib/signal/graph/state.cjs +72 -1
  98. package/dist/lib/signal/graph/state.d.ts +41 -10
  99. package/dist/lib/signal/graph/state.d.ts.map +1 -1
  100. package/dist/lib/signal/graph/state.js +83 -22
  101. package/dist/lib/signal/graph/state.mjs +49 -1
  102. package/dist/lib/signal/graph/suspense.cjs +301 -1
  103. package/dist/lib/signal/graph/suspense.js +4 -4
  104. package/dist/lib/signal/graph/suspense.mjs +278 -1
  105. package/dist/lib/signal/index-legacy.cjs +2540 -1
  106. package/dist/lib/signal/index-legacy.d.ts +1 -1
  107. package/dist/lib/signal/index-legacy.js +1 -1
  108. package/dist/lib/signal/index-legacy.mjs +2518 -1
  109. package/dist/lib/signal/index.cjs +1275 -1
  110. package/dist/lib/signal/index.d.ts +3 -2
  111. package/dist/lib/signal/index.d.ts.map +1 -1
  112. package/dist/lib/signal/index.js +7 -4
  113. package/dist/lib/signal/index.mjs +1253 -1
  114. package/dist/lib/signal/list.cjs +549 -1
  115. package/dist/lib/signal/list.d.ts +5 -5
  116. package/dist/lib/signal/list.js +5 -5
  117. package/dist/lib/signal/list.mjs +526 -1
  118. package/dist/lib/signal/resource-api.cjs +626 -1
  119. package/dist/lib/signal/resource-api.d.ts +5 -5
  120. package/dist/lib/signal/resource-api.js +5 -5
  121. package/dist/lib/signal/resource-api.mjs +603 -1
  122. package/dist/lib/signal/signal.cjs +2023 -1
  123. package/dist/lib/signal/signal.d.ts +4 -4
  124. package/dist/lib/signal/signal.d.ts.map +1 -1
  125. package/dist/lib/signal/signal.js +22 -23
  126. package/dist/lib/signal/signal.mjs +2000 -1
  127. package/dist/lib/signal/types.cjs +38 -1
  128. package/dist/lib/signal/types.d.ts.map +1 -1
  129. package/dist/lib/signal/types.js +2 -2
  130. package/dist/lib/signal/types.mjs +17 -1
  131. package/dist/lib/signal/utilities.cjs +1012 -1
  132. package/dist/lib/signal/utilities.d.ts +0 -108
  133. package/dist/lib/signal/utilities.d.ts.map +1 -1
  134. package/dist/lib/signal/utilities.js +0 -158
  135. package/dist/lib/signal/utilities.mjs +990 -1
  136. package/dist/lib/store/api.cjs +661 -1
  137. package/dist/lib/store/api.d.ts +33 -0
  138. package/dist/lib/store/api.d.ts.map +1 -1
  139. package/dist/lib/store/api.js +41 -8
  140. package/dist/lib/store/api.mjs +645 -1
  141. package/dist/lib/store/index.cjs +740 -1
  142. package/dist/lib/store/index.js +1 -1
  143. package/dist/lib/store/index.mjs +725 -1
  144. package/dist/lib/store/setter.types.cjs +18 -1
  145. package/dist/lib/store/setter.types.d.ts +43 -3
  146. package/dist/lib/store/setter.types.d.ts.map +1 -1
  147. package/dist/lib/store/store.cjs +707 -1
  148. package/dist/lib/store/store.d.ts +72 -0
  149. package/dist/lib/store/store.d.ts.map +1 -1
  150. package/dist/lib/store/store.js +238 -8
  151. package/dist/lib/store/store.mjs +693 -1
  152. package/dist/lib/store/types.cjs +18 -1
  153. package/dist/lib/store/types.d.ts +1 -1
  154. package/dist/lib/store/types.d.ts.map +1 -1
  155. package/dist/lib/store/utils.cjs +43 -1
  156. package/dist/lib/store/utils.d.ts +1 -1
  157. package/dist/lib/store/utils.js +1 -1
  158. package/dist/lib/store/utils.mjs +22 -1
  159. package/dist/lib/subject.cjs +450 -1
  160. package/dist/lib/subject.js +3 -91
  161. package/dist/lib/subject.mjs +427 -1
  162. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  163. package/dist/version.generated.cjs +27 -1
  164. package/dist/version.generated.d.ts +1 -1
  165. package/dist/version.generated.js +2 -2
  166. package/dist/version.generated.mjs +7 -1
  167. package/package.json +5 -4
@@ -37,10 +37,82 @@ declare class Store<T> {
37
37
  splice(path: string, start: number, deleteCount: number, ...items: any[]): any[];
38
38
  insert(path: string, index: number, value: any): void;
39
39
  removeAt(path: string, index: number): any[];
40
+ /**
41
+ * Swap a whole value, rather than merging into it.
42
+ *
43
+ * `set(partial)` merges per key, which is what you want for an object and never what
44
+ * you want for an array. This replaces: `replace(value)` at the root, or
45
+ * `replace(path, value)` further down.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const [items, set] = createStore([1, 2, 3]);
50
+ * set.replace([]); // now empty
51
+ * set.replace(['a', 'b']); // now two entries
52
+ * ```
53
+ */
54
+ replace(pathOrValue: any, maybeValue?: any): void;
55
+ /**
56
+ * Empty an array, at the root or at a path.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * set.clear(); // the root array
61
+ * set.clear('todos'); // a nested one
62
+ * ```
63
+ */
64
+ clear(path?: string): void;
40
65
  toObservable(): Observable<T>;
41
66
  dispose(): void;
42
67
  }
68
+ /**
69
+ * A fine-grained reactive store: a plain object tree that tracks reads per key.
70
+ *
71
+ * Returns the state and its setter as a tuple. The state is a proxy, so reading a
72
+ * property subscribes the current computation to that property alone, and a write
73
+ * elsewhere in the tree does not disturb it. Signals are created lazily, one per key
74
+ * that something actually reads, so the cost follows what the app looks at rather than
75
+ * the size of the state.
76
+ *
77
+ * The state is immutable from the outside by default, assigning to it does nothing, and
78
+ * `set` is the way in. That is what makes the tracking trustworthy, since every change
79
+ * goes through a path the store can see.
80
+ *
81
+ * `store()` wraps this as a single binding for the common case. Prefer it unless the
82
+ * state has a `set` key of its own, which the single-binding form cannot express.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * const [state, setState] = createStore({ user: { name: 'Ada' }, count: 0 });
87
+ *
88
+ * effect(() => console.log(state.user.name)); // tracks user.name only
89
+ * setState('count', 1); // the effect does not re-run
90
+ * setState('user.name', 'Grace'); // now it does
91
+ * ```
92
+ *
93
+ * @example A patch merges the keys it names; a dot path reaches through arrays:
94
+ * ```ts
95
+ * setState({ count: 5 }); // user is untouched
96
+ * setState('todos.0.done', true);
97
+ * setState('count', (n) => n + 1); // or derive from the current value
98
+ * ```
99
+ */
43
100
  declare function createStore<T>(initialState: T, options?: StoreOptions<T>): [Immutable<T>, Store<T>['set']];
101
+ /**
102
+ * A store you assign to directly, without a setter.
103
+ *
104
+ * The same per-key tracking as `createStore`, with the immutability dropped, so
105
+ * `state.count = 1` is a tracked write. Reach for it when the state is local to one
106
+ * component and the indirection of a setter buys nothing. The cost is that a change
107
+ * can come from anywhere holding the object.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * const state = createMutableStore({ count: 0 });
112
+ * effect(() => console.log(state.count));
113
+ * state.count = 1; // the effect re-runs
114
+ * ```
115
+ */
44
116
  declare function createMutableStore<T>(initialState: T, options?: Omit<StoreOptions<T>, 'immutable'>): Store<T>;
45
117
  /** A store whose state is derived from a reactive function. */
46
118
  declare function createComputedStore<T>(fn: () => T, options?: StoreOptions<T>): Store<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/lib/store/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/lib/store/store.ts"],"names":[],"mappings":"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"}
@@ -66,7 +66,7 @@ function nodesOf(target) {
66
66
  let ns = NODES.get(target);
67
67
  if (!ns)
68
68
  NODES.set(target, (ns = { keys: new Map(), owner: OWNERS.get(target), array: Array.isArray(target) }));
69
- // An object can be reached before the store has claimed it a write touches it, or it is
69
+ // An object can be reached before the store has claimed it, a write touches it, or it is
70
70
  // read through something other than its parent's proxy. Caching "no owner" there would
71
71
  // leave every key signal it ever makes unnamed and unattached.
72
72
  else if (!ns.owner)
@@ -109,7 +109,7 @@ function trackKeys(target) {
109
109
  const ns = nodesOf(target);
110
110
  // Which keys exist, as opposed to what any one of them holds. It has no value of its own,
111
111
  // so a graph would otherwise show an unexplained empty node the first time a list is
112
- // iterated which is exactly when one appears.
112
+ // iterated, which is exactly when one appears.
113
113
  (ns.all || (ns.all = createDataNode(undefined, ns, '*')))();
114
114
  }
115
115
  // The signal setter reads a function argument as an updater, so a function value
@@ -317,12 +317,43 @@ function applyAt(current, segs, value) {
317
317
  function applyPath(root, path, value) {
318
318
  applyAt(root, parsePath(path), value);
319
319
  }
320
+ /**
321
+ * Whether a lone array argument is a batch of `[path, value]` pairs.
322
+ *
323
+ * The batch form and a replacement array are the same shape at the call site, so the
324
+ * entries decide. Every one has to be a pair with a string path; anything else is a
325
+ * value. An empty array is not a batch, which is what made `set([])` on an array root
326
+ * do nothing at all.
327
+ */
328
+ function isPathBatch(value) {
329
+ return (Array.isArray(value) &&
330
+ value.length > 0 &&
331
+ value.every((e) => Array.isArray(e) && e.length >= 2 && typeof e[0] === 'string'));
332
+ }
333
+ /**
334
+ * Replace an array's contents in place, keeping its identity.
335
+ *
336
+ * The tail is written away before the length moves, so an index that had a signal is
337
+ * told it is gone. Assigning `length` alone truncates without notifying anyone, which
338
+ * leaves a stale read behind on every removed index.
339
+ */
340
+ function replaceArray(target, next) {
341
+ // Keys are strings everywhere else, because every other path reaches writeKey through
342
+ // parsePath. A numeric key here would miss the node the proxy registered under '2'.
343
+ for (let i = target.length - 1; i >= next.length; i--)
344
+ writeKey(target, String(i), undefined);
345
+ if (target.length !== next.length)
346
+ writeKey(target, 'length', next.length);
347
+ for (let i = 0; i < next.length; i++)
348
+ writeKey(target, String(i), next[i]);
349
+ }
320
350
  /**
321
351
  * Runs the setter overloads against the raw root:
322
352
  * set(state => newState) whole-state updater, merged back
323
353
  * set(partialObject) per-key merge
324
354
  * set([[path, valOrFn], ...]) batch of path updates
325
- * set(path, ['seg', ...], val) path plus extra segments
355
+ * set(path, ...steps, val) a step per argument: key, index, [indices],
356
+ * { from, to, by }, a predicate, or '*'
326
357
  * set(path, val | updater) the common form (dotted, [n], [*])
327
358
  */
328
359
  function applySet(root, args) {
@@ -334,10 +365,22 @@ function applySet(root, args) {
334
365
  return;
335
366
  }
336
367
  if (Array.isArray(first) && args.length === 1) {
337
- for (const entry of first)
338
- if (Array.isArray(entry))
368
+ if (isPathBatch(first)) {
369
+ for (const entry of first)
339
370
  applyPath(root, entry[0], entry[1]);
340
- return;
371
+ return;
372
+ }
373
+ // Not a batch, so it is a value. Against an array root that is a replacement.
374
+ if (Array.isArray(root)) {
375
+ replaceArray(root, first);
376
+ return;
377
+ }
378
+ // An empty array asks for no updates, which is harmless either way.
379
+ if (first.length === 0)
380
+ return;
381
+ throw new TypeError('[fluixi] set() was given an array that is neither a batch of [path, value] ' +
382
+ 'pairs nor a replacement for an array root. Name the path you meant, as in ' +
383
+ "set('items', [...]).");
341
384
  }
342
385
  if (first &&
343
386
  typeof first === 'object' &&
@@ -346,12 +389,98 @@ function applySet(root, args) {
346
389
  mergeInto(root, first);
347
390
  return;
348
391
  }
349
- if (Array.isArray(args[1]) && args.length >= 3) {
350
- applyPath(root, `${first}.${args[1].join('.')}`, args[2]);
392
+ // Three or more arguments: every one but the last selects a step, the last is the
393
+ // value. This used to read `args[1]` as the value and ignore the rest, so
394
+ // `set('items', 0, 'done', true)` wrote the number 0 over `items`, accepted by the
395
+ // typings, and silent.
396
+ if (args.length >= 3) {
397
+ setDeep(root, args.slice(0, -1), args[args.length - 1]);
351
398
  return;
352
399
  }
353
400
  applyPath(root, String(first), args[1]);
354
401
  }
402
+ /**
403
+ * Which keys a selector names at this level.
404
+ *
405
+ * The typings offer four shapes for the steps between a path and a value, and each one
406
+ * resolves here rather than at a call site:
407
+ * 'name' | 2 a single key, dotted paths expanded by the caller
408
+ * [0, 2] several indices of an array
409
+ * { from, to, by } a range of indices
410
+ * (item, i) => bool a predicate over an array
411
+ * '*' every key
412
+ */
413
+ function selectKeys(current, selector) {
414
+ if (typeof selector === 'function') {
415
+ if (!Array.isArray(current))
416
+ return [];
417
+ const keys = [];
418
+ for (let i = 0; i < current.length; i++)
419
+ if (selector(current[i], i))
420
+ keys.push(i);
421
+ return keys;
422
+ }
423
+ if (Array.isArray(selector)) {
424
+ // Against an array these are indices. Against anything else there is nothing to
425
+ // index, so they are path segments: the form this function used to be given.
426
+ return Array.isArray(current) ? selector.map(Number) : selector.map(String);
427
+ }
428
+ if (selector &&
429
+ typeof selector === 'object' &&
430
+ ('from' in selector || 'to' in selector || 'by' in selector)) {
431
+ if (!Array.isArray(current))
432
+ return [];
433
+ const by = selector.by ?? 1;
434
+ const from = selector.from ?? 0;
435
+ const to = selector.to ?? current.length - 1;
436
+ const keys = [];
437
+ for (let i = from; i <= to; i += by)
438
+ if (i >= 0 && i < current.length)
439
+ keys.push(i);
440
+ return keys;
441
+ }
442
+ if (selector === '*') {
443
+ return Array.isArray(current)
444
+ ? current.map((_, i) => i)
445
+ : Object.keys(current ?? {});
446
+ }
447
+ return [selector];
448
+ }
449
+ /**
450
+ * Walk the selectors, writing the value at every leaf they reach.
451
+ *
452
+ * A string step is expanded first, so `set('a.b', 'c', v)` and `set('a', 'b', 'c', v)`
453
+ * land in the same place. Missing containers are created on the way down, as an array
454
+ * when the next step looks like an index.
455
+ */
456
+ function setDeep(current, selectors, value) {
457
+ if (current == null)
458
+ return;
459
+ // Expand a dotted or bracketed string into its own steps before selecting.
460
+ const [head, ...rest] = selectors;
461
+ if (typeof head === 'string') {
462
+ const parts = parsePath(head);
463
+ if (parts.length > 1) {
464
+ setDeep(current, [...parts, ...rest], value);
465
+ return;
466
+ }
467
+ }
468
+ const keys = selectKeys(current, head);
469
+ if (rest.length === 0) {
470
+ for (const key of keys)
471
+ writeKey(current, key, nextValue(value, current[key]));
472
+ return;
473
+ }
474
+ for (const key of keys) {
475
+ let next = current[key];
476
+ if (next == null || typeof next !== 'object') {
477
+ const lookahead = rest[0];
478
+ next = typeof lookahead === 'number' || /^\d+$/.test(String(lookahead)) ? [] : {};
479
+ writeKey(current, key, next);
480
+ }
481
+ setDeep(next, rest, value);
482
+ }
483
+ }
355
484
  function clone(value) {
356
485
  if (value == null || typeof value !== 'object')
357
486
  return value;
@@ -485,6 +614,58 @@ class Store {
485
614
  this.set(path, arr);
486
615
  return removed;
487
616
  }
617
+ /**
618
+ * Swap a whole value, rather than merging into it.
619
+ *
620
+ * `set(partial)` merges per key, which is what you want for an object and never what
621
+ * you want for an array. This replaces: `replace(value)` at the root, or
622
+ * `replace(path, value)` further down.
623
+ *
624
+ * @example
625
+ * ```ts
626
+ * const [items, set] = createStore([1, 2, 3]);
627
+ * set.replace([]); // now empty
628
+ * set.replace(['a', 'b']); // now two entries
629
+ * ```
630
+ */
631
+ replace(pathOrValue, maybeValue) {
632
+ if (arguments.length >= 2) {
633
+ const target = rawAt(this.root, String(pathOrValue));
634
+ const next = maybeValue;
635
+ if (Array.isArray(target) && Array.isArray(next)) {
636
+ replaceArray(target, next);
637
+ return;
638
+ }
639
+ this.set(pathOrValue, next);
640
+ return;
641
+ }
642
+ const root = this.root;
643
+ if (Array.isArray(root) && Array.isArray(pathOrValue)) {
644
+ replaceArray(root, pathOrValue);
645
+ return;
646
+ }
647
+ this.set(pathOrValue);
648
+ }
649
+ /**
650
+ * Empty an array, at the root or at a path.
651
+ *
652
+ * @example
653
+ * ```ts
654
+ * set.clear(); // the root array
655
+ * set.clear('todos'); // a nested one
656
+ * ```
657
+ */
658
+ clear(path) {
659
+ const target = path === undefined ? this.root : rawAt(this.root, path);
660
+ if (Array.isArray(target)) {
661
+ replaceArray(target, []);
662
+ return;
663
+ }
664
+ if (target && typeof target === 'object') {
665
+ for (const key of Object.keys(target))
666
+ writeKey(target, key, undefined);
667
+ }
668
+ }
488
669
  toObservable() {
489
670
  const [get] = createSignal(this.state);
490
671
  return get.toObservable();
@@ -506,6 +687,8 @@ const SETTER_METHODS = [
506
687
  'splice',
507
688
  'insert',
508
689
  'removeAt',
690
+ 'replace',
691
+ 'clear',
509
692
  'unwrap',
510
693
  'toObservable',
511
694
  ];
@@ -515,11 +698,58 @@ function attachStoreMethods(target, store) {
515
698
  target.$ = store.reactive.bind(store);
516
699
  }
517
700
  // public api
701
+ /**
702
+ * A fine-grained reactive store: a plain object tree that tracks reads per key.
703
+ *
704
+ * Returns the state and its setter as a tuple. The state is a proxy, so reading a
705
+ * property subscribes the current computation to that property alone, and a write
706
+ * elsewhere in the tree does not disturb it. Signals are created lazily, one per key
707
+ * that something actually reads, so the cost follows what the app looks at rather than
708
+ * the size of the state.
709
+ *
710
+ * The state is immutable from the outside by default, assigning to it does nothing, and
711
+ * `set` is the way in. That is what makes the tracking trustworthy, since every change
712
+ * goes through a path the store can see.
713
+ *
714
+ * `store()` wraps this as a single binding for the common case. Prefer it unless the
715
+ * state has a `set` key of its own, which the single-binding form cannot express.
716
+ *
717
+ * @example
718
+ * ```ts
719
+ * const [state, setState] = createStore({ user: { name: 'Ada' }, count: 0 });
720
+ *
721
+ * effect(() => console.log(state.user.name)); // tracks user.name only
722
+ * setState('count', 1); // the effect does not re-run
723
+ * setState('user.name', 'Grace'); // now it does
724
+ * ```
725
+ *
726
+ * @example A patch merges the keys it names; a dot path reaches through arrays:
727
+ * ```ts
728
+ * setState({ count: 5 }); // user is untouched
729
+ * setState('todos.0.done', true);
730
+ * setState('count', (n) => n + 1); // or derive from the current value
731
+ * ```
732
+ */
518
733
  function createStore(initialState, options = { immutable: true }) {
519
734
  const store = new Store(initialState, options);
520
735
  attachStoreMethods(store.set, store);
521
736
  return [store.proxy, store.set];
522
737
  }
738
+ /**
739
+ * A store you assign to directly, without a setter.
740
+ *
741
+ * The same per-key tracking as `createStore`, with the immutability dropped, so
742
+ * `state.count = 1` is a tracked write. Reach for it when the state is local to one
743
+ * component and the indirection of a setter buys nothing. The cost is that a change
744
+ * can come from anywhere holding the object.
745
+ *
746
+ * @example
747
+ * ```ts
748
+ * const state = createMutableStore({ count: 0 });
749
+ * effect(() => console.log(state.count));
750
+ * state.count = 1; // the effect re-runs
751
+ * ```
752
+ */
523
753
  function createMutableStore(initialState, options = {}) {
524
754
  return new Store(initialState, { ...options, immutable: false });
525
755
  }