storion 0.8.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +127 -21
  2. package/README.md +42 -2021
  3. package/dist/async/abortable.d.ts +295 -0
  4. package/dist/async/abortable.d.ts.map +1 -0
  5. package/dist/async/async.d.ts +86 -5
  6. package/dist/async/async.d.ts.map +1 -1
  7. package/dist/async/context.d.ts +15 -0
  8. package/dist/async/context.d.ts.map +1 -0
  9. package/dist/async/index.d.ts +16 -3
  10. package/dist/async/index.d.ts.map +1 -1
  11. package/dist/async/index.js +407 -137
  12. package/dist/async/safe.d.ts +221 -0
  13. package/dist/async/safe.d.ts.map +1 -0
  14. package/dist/async/types.d.ts +77 -29
  15. package/dist/async/types.d.ts.map +1 -1
  16. package/dist/async/wrappers.d.ts +217 -0
  17. package/dist/async/wrappers.d.ts.map +1 -0
  18. package/dist/core/effect.d.ts +34 -26
  19. package/dist/core/effect.d.ts.map +1 -1
  20. package/dist/core/equality.d.ts +25 -0
  21. package/dist/core/equality.d.ts.map +1 -1
  22. package/dist/core/focus.d.ts +20 -0
  23. package/dist/core/focus.d.ts.map +1 -0
  24. package/dist/core/focusHelpers.d.ts +258 -0
  25. package/dist/core/focusHelpers.d.ts.map +1 -0
  26. package/dist/core/middleware.d.ts +4 -4
  27. package/dist/core/store.d.ts.map +1 -1
  28. package/dist/core/storeContext.d.ts +2 -9
  29. package/dist/core/storeContext.d.ts.map +1 -1
  30. package/dist/dev.d.ts +0 -10
  31. package/dist/dev.d.ts.map +1 -1
  32. package/dist/{index-C8B6Mo8r.js → effect-BDQU8Voz.js} +1241 -583
  33. package/dist/errors.d.ts +6 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/index.d.ts +5 -4
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/network/index.d.ts +69 -0
  38. package/dist/network/index.d.ts.map +1 -0
  39. package/dist/network/retry.d.ts +53 -0
  40. package/dist/network/retry.d.ts.map +1 -0
  41. package/dist/network/services.d.ts +58 -0
  42. package/dist/network/services.d.ts.map +1 -0
  43. package/dist/network/store.d.ts +36 -0
  44. package/dist/network/store.d.ts.map +1 -0
  45. package/dist/network/utils.d.ts +9 -0
  46. package/dist/network/utils.d.ts.map +1 -0
  47. package/dist/persist/index.d.ts +1 -1
  48. package/dist/persist/index.d.ts.map +1 -1
  49. package/dist/persist/index.js +55 -31
  50. package/dist/persist/persist.d.ts +119 -62
  51. package/dist/persist/persist.d.ts.map +1 -1
  52. package/dist/pool.d.ts +77 -0
  53. package/dist/pool.d.ts.map +1 -0
  54. package/dist/react/index.d.ts +2 -2
  55. package/dist/react/index.d.ts.map +1 -1
  56. package/dist/react/index.js +245 -244
  57. package/dist/react/stable.d.ts +27 -0
  58. package/dist/react/stable.d.ts.map +1 -0
  59. package/dist/react/useStore.d.ts +38 -13
  60. package/dist/react/useStore.d.ts.map +1 -1
  61. package/dist/react/withStore.d.ts.map +1 -1
  62. package/dist/storion.js +911 -37
  63. package/dist/trigger.d.ts +12 -7
  64. package/dist/trigger.d.ts.map +1 -1
  65. package/dist/types.d.ts +133 -22
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/utils/storeTuple.d.ts +7 -0
  68. package/dist/utils/storeTuple.d.ts.map +1 -0
  69. package/package.json +5 -1
  70. package/dist/collection.d.ts +0 -34
  71. package/dist/collection.d.ts.map +0 -1
  72. package/dist/core/proxy.d.ts +0 -47
  73. package/dist/core/proxy.d.ts.map +0 -1
  74. package/dist/effect-C6h0PDDI.js +0 -446
  75. package/dist/isPromiseLike-bFkfHAbm.js +0 -6
  76. package/dist/react/useLocalStore.d.ts +0 -48
  77. package/dist/react/useLocalStore.d.ts.map +0 -1
package/dist/storion.js CHANGED
@@ -1,46 +1,920 @@
1
- import { S, n, m, c, l, u, q, o, g, a, h, d, f, k, i, e, j, b, z, p, t, s, v, w, y, A, x } from "./index-C8B6Mo8r.js";
2
- import { A as A2, E, H, I, c as c2, L, P, a as a2, d as d2, S as S2, b as b2, e as e2, u as u2 } from "./effect-C6h0PDDI.js";
1
+ import { C as tryDispose, i as isSpec, u as untrack, k as STORION_TYPE, D as unwrapFn, q as shallowEqual, l as resolveEquality } from "./effect-BDQU8Voz.js";
2
+ import { d, E, H, I, L, z, P, S, y, x, n, v, e, o, m, p, B, a, h } from "./effect-BDQU8Voz.js";
3
+ import { e as emitter } from "./emitter-j4rC71vY.js";
3
4
  import { m as m2 } from "./meta-40r-AZfe.js";
5
+ function createMetaQuery(entries) {
6
+ const entryArray = Array.isArray(entries) ? entries : entries ? [entries] : [];
7
+ const single = (type) => {
8
+ const result = { store: void 0, fields: {} };
9
+ for (const entry of entryArray) {
10
+ if (entry.type !== type) continue;
11
+ if (entry.fields && entry.fields.length > 0) {
12
+ for (const field of entry.fields) {
13
+ const fieldKey = field;
14
+ if (!(fieldKey in result.fields)) {
15
+ result.fields[fieldKey] = entry.value;
16
+ }
17
+ }
18
+ } else {
19
+ if (result.store === void 0) {
20
+ result.store = entry.value;
21
+ }
22
+ }
23
+ }
24
+ return result;
25
+ };
26
+ const all = (type) => {
27
+ const result = { store: [], fields: {} };
28
+ for (const entry of entryArray) {
29
+ if (entry.type !== type) continue;
30
+ if (entry.fields && entry.fields.length > 0) {
31
+ for (const field of entry.fields) {
32
+ const fieldKey = field;
33
+ let arr = result.fields[fieldKey];
34
+ if (!arr) {
35
+ arr = [];
36
+ result.fields[fieldKey] = arr;
37
+ }
38
+ arr.push(entry.value);
39
+ }
40
+ } else {
41
+ result.store.push(entry.value);
42
+ }
43
+ }
44
+ return result;
45
+ };
46
+ const fields = (type, predicate) => {
47
+ const result = /* @__PURE__ */ new Set();
48
+ for (const entry of entryArray) {
49
+ if (entry.type !== type) continue;
50
+ if (entry.fields && entry.fields.length > 0) {
51
+ if (!predicate || predicate(entry.value)) {
52
+ for (const field of entry.fields) {
53
+ result.add(field);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ return Array.from(result);
59
+ };
60
+ const any = (...types) => {
61
+ return entryArray.some((entry) => types.includes(entry.type));
62
+ };
63
+ const query = Object.assign(
64
+ (type) => single(type),
65
+ { all, any, fields }
66
+ );
67
+ return query;
68
+ }
69
+ function extractDisplayName(factory) {
70
+ if (isSpec(factory)) {
71
+ return factory.displayName;
72
+ }
73
+ if (typeof factory.displayName === "string" && factory.displayName) {
74
+ return factory.displayName;
75
+ }
76
+ if (factory.name && factory.name !== "") {
77
+ return factory.name;
78
+ }
79
+ return void 0;
80
+ }
81
+ function createResolver(options = {}) {
82
+ const {
83
+ middleware = [],
84
+ parent,
85
+ invokeResolver: invokeResolverOption
86
+ } = options;
87
+ const cache2 = /* @__PURE__ */ new Map();
88
+ const overrides = /* @__PURE__ */ new Map();
89
+ const resolve = (factory) => overrides.get(factory) ?? factory;
90
+ const invoke = (factory, resolverForCtx) => {
91
+ const isStoreSpec = isSpec(factory);
92
+ const displayName = extractDisplayName(factory);
93
+ const meta = createMetaQuery(factory.meta);
94
+ const chain = middleware.reduceRight(
95
+ (next, mw) => () => {
96
+ if (isStoreSpec) {
97
+ const ctx = {
98
+ type: "store",
99
+ factory,
100
+ resolver: resolverForCtx,
101
+ next,
102
+ displayName,
103
+ spec: factory,
104
+ meta
105
+ };
106
+ return mw(ctx);
107
+ } else {
108
+ const ctx = {
109
+ type: "service",
110
+ factory,
111
+ resolver: resolverForCtx,
112
+ next,
113
+ displayName,
114
+ meta
115
+ };
116
+ return mw(ctx);
117
+ }
118
+ },
119
+ () => factory(resolverForCtx)
120
+ );
121
+ return chain();
122
+ };
123
+ const resolver = {
124
+ get(factory) {
125
+ if (cache2.has(factory)) {
126
+ return cache2.get(factory);
127
+ }
128
+ if (parent && overrides.size === 0 && parent.has(factory)) {
129
+ return parent.get(factory);
130
+ }
131
+ const instance = invoke(
132
+ resolve(factory),
133
+ invokeResolverOption ?? resolver
134
+ );
135
+ cache2.set(factory, instance);
136
+ return instance;
137
+ },
138
+ create(factory, ...args) {
139
+ const resolverForCtx = invokeResolverOption ?? resolver;
140
+ if (args.length > 0) {
141
+ return factory(resolverForCtx, ...args);
142
+ }
143
+ return invoke(resolve(factory), resolverForCtx);
144
+ },
145
+ set(factory, override) {
146
+ overrides.set(factory, override);
147
+ cache2.delete(factory);
148
+ },
149
+ has(factory) {
150
+ const inParent = parent && overrides.size === 0 && parent.has(factory);
151
+ return cache2.has(factory) || (inParent ?? false);
152
+ },
153
+ tryGet(factory) {
154
+ if (cache2.has(factory)) {
155
+ return cache2.get(factory);
156
+ }
157
+ if (parent && overrides.size === 0) {
158
+ return parent.tryGet(factory);
159
+ }
160
+ return void 0;
161
+ },
162
+ delete(factory) {
163
+ const instance = cache2.get(factory);
164
+ if (instance) {
165
+ tryDispose(instance);
166
+ cache2.delete(factory);
167
+ return true;
168
+ }
169
+ return false;
170
+ },
171
+ clear() {
172
+ for (const instance of cache2.values()) {
173
+ tryDispose(instance);
174
+ }
175
+ cache2.clear();
176
+ },
177
+ scope(scopeOptions = {}) {
178
+ return createResolver({
179
+ middleware: scopeOptions.middleware ?? middleware,
180
+ parent: resolver,
181
+ ...scopeOptions
182
+ });
183
+ }
184
+ };
185
+ return resolver;
186
+ }
187
+ let defaultMiddlewareConfig = {};
188
+ const container = function(options = {}) {
189
+ const middleware = [
190
+ ...defaultMiddlewareConfig.pre ?? [],
191
+ ...Array.isArray(options.middleware) ? options.middleware : options.middleware ? [options.middleware] : [],
192
+ ...defaultMiddlewareConfig.post ?? []
193
+ ];
194
+ const instancesById = /* @__PURE__ */ new Map();
195
+ const creationOrder = [];
196
+ const createEmitter = emitter();
197
+ const disposeEmitter = emitter();
198
+ const parent = options._parent;
199
+ let containerApi;
200
+ const internalResolver = createResolver({
201
+ middleware,
202
+ parent,
203
+ get invokeResolver() {
204
+ return containerApi;
205
+ }
206
+ });
207
+ function trackStore(spec, instance) {
208
+ instancesById.set(instance.id, instance);
209
+ creationOrder.push(spec);
210
+ if (typeof instance.onDispose === "function") {
211
+ instance.onDispose(() => {
212
+ disposeEmitter.emit(instance);
213
+ instancesById.delete(instance.id);
214
+ internalResolver.delete(spec);
215
+ const index = creationOrder.indexOf(spec);
216
+ if (index !== -1) {
217
+ creationOrder.splice(index, 1);
218
+ }
219
+ });
220
+ }
221
+ createEmitter.emit(instance);
222
+ }
223
+ containerApi = {
224
+ [STORION_TYPE]: "container",
225
+ // Get by ID or factory/spec
226
+ get(specOrIdOrFactory) {
227
+ if (typeof specOrIdOrFactory === "string") {
228
+ return instancesById.get(specOrIdOrFactory);
229
+ }
230
+ const wasCached = internalResolver.has(specOrIdOrFactory);
231
+ const instance = untrack(() => internalResolver.get(specOrIdOrFactory));
232
+ if (!wasCached && isSpec(specOrIdOrFactory)) {
233
+ trackStore(specOrIdOrFactory, instance);
234
+ }
235
+ return instance;
236
+ },
237
+ create(specOrFactory, ...args) {
238
+ const instance = untrack(
239
+ () => internalResolver.create(specOrFactory, ...args)
240
+ );
241
+ if (isSpec(specOrFactory)) {
242
+ const storeInstance = instance;
243
+ instancesById.set(storeInstance.id, storeInstance);
244
+ if (typeof storeInstance.onDispose === "function") {
245
+ storeInstance.onDispose(() => {
246
+ disposeEmitter.emit(storeInstance);
247
+ instancesById.delete(storeInstance.id);
248
+ });
249
+ }
250
+ }
251
+ return instance;
252
+ },
253
+ set(spec, override) {
254
+ const existing = internalResolver.tryGet(spec);
255
+ tryDispose(existing);
256
+ internalResolver.set(spec, override);
257
+ },
258
+ has(spec) {
259
+ return internalResolver.has(spec);
260
+ },
261
+ tryGet(spec) {
262
+ return internalResolver.tryGet(spec);
263
+ },
264
+ delete(spec) {
265
+ const instance = internalResolver.tryGet(spec);
266
+ if (instance) {
267
+ tryDispose(instance);
268
+ return true;
269
+ }
270
+ return false;
271
+ },
272
+ clear() {
273
+ const specs = [...creationOrder].reverse();
274
+ for (const spec of specs) {
275
+ const instance = internalResolver.tryGet(spec);
276
+ tryDispose(instance);
277
+ }
278
+ internalResolver.clear();
279
+ instancesById.clear();
280
+ creationOrder.length = 0;
281
+ },
282
+ dispose(spec) {
283
+ return containerApi.delete(spec);
284
+ },
285
+ scope(scopeOptions = {}) {
286
+ return container({
287
+ middleware: scopeOptions.middleware ?? middleware,
288
+ _parent: containerApi
289
+ });
290
+ },
291
+ onCreate: createEmitter.on,
292
+ onDispose: disposeEmitter.on
293
+ };
294
+ return containerApi;
295
+ };
296
+ const defaultsFn = (config = {}) => {
297
+ defaultMiddlewareConfig = {
298
+ pre: [...defaultMiddlewareConfig.pre ?? [], ...config.pre ?? []],
299
+ post: [...defaultMiddlewareConfig.post ?? [], ...config.post ?? []]
300
+ };
301
+ };
302
+ defaultsFn.clear = () => {
303
+ defaultMiddlewareConfig = {};
304
+ };
305
+ container.defaults = defaultsFn;
306
+ function isObject(value) {
307
+ return typeof value === "object" && value !== null;
308
+ }
309
+ function createDisposalTracker() {
310
+ let pendingDisposedItems = /* @__PURE__ */ new Set();
311
+ let disposalScheduled = false;
312
+ return {
313
+ /**
314
+ * Schedule items for async disposal.
315
+ * Items will be disposed in a microtask unless cancelled.
316
+ * Only objects are tracked - primitives are skipped.
317
+ */
318
+ scheduleDisposal(items) {
319
+ if (items.length === 0) return;
320
+ const newPending = new Set(pendingDisposedItems);
321
+ let hasNewItems = false;
322
+ for (const item of items) {
323
+ if (isObject(item)) {
324
+ newPending.add(item);
325
+ hasNewItems = true;
326
+ }
327
+ }
328
+ if (!hasNewItems) return;
329
+ pendingDisposedItems = newPending;
330
+ if (!disposalScheduled) {
331
+ disposalScheduled = true;
332
+ queueMicrotask(() => {
333
+ disposalScheduled = false;
334
+ const toDispose = pendingDisposedItems;
335
+ pendingDisposedItems = /* @__PURE__ */ new Set();
336
+ for (const item of toDispose) {
337
+ tryDispose(item);
338
+ }
339
+ });
340
+ }
341
+ },
342
+ /**
343
+ * Cancel disposal for items that are being re-added.
344
+ * Call this when items are pushed/inserted back into the collection.
345
+ * Only objects are checked - primitives are skipped.
346
+ */
347
+ cancelDisposal(items) {
348
+ if (items.length === 0 || pendingDisposedItems.size === 0) return;
349
+ let hasChanges = false;
350
+ for (const item of items) {
351
+ if (isObject(item) && pendingDisposedItems.has(item)) {
352
+ hasChanges = true;
353
+ break;
354
+ }
355
+ }
356
+ if (!hasChanges) return;
357
+ const newPending = new Set(pendingDisposedItems);
358
+ for (const item of items) {
359
+ if (isObject(item)) {
360
+ newPending.delete(item);
361
+ }
362
+ }
363
+ pendingDisposedItems = newPending;
364
+ },
365
+ /**
366
+ * Check if an item is pending disposal.
367
+ */
368
+ isPending(item) {
369
+ return isObject(item) && pendingDisposedItems.has(item);
370
+ }
371
+ };
372
+ }
373
+ function toggle() {
374
+ return (prev) => !prev;
375
+ }
376
+ function increment(amount = 1) {
377
+ return (prev) => (prev ?? 0) + amount;
378
+ }
379
+ function decrement(amount = 1) {
380
+ return (prev) => (prev ?? 0) - amount;
381
+ }
382
+ function multiply(factor) {
383
+ return (prev) => (prev ?? 0) * factor;
384
+ }
385
+ function divide(divisor) {
386
+ return (prev) => (prev ?? 0) / divisor;
387
+ }
388
+ function clamp(min, max) {
389
+ return (prev) => Math.min(max, Math.max(min, prev ?? 0));
390
+ }
391
+ function append(suffix) {
392
+ return (prev) => (prev ?? "") + suffix;
393
+ }
394
+ function prepend(prefix) {
395
+ return (prev) => prefix + (prev ?? "");
396
+ }
397
+ function merge(partial) {
398
+ return (prev) => ({ ...prev, ...partial });
399
+ }
400
+ function reset(defaultValue) {
401
+ return () => defaultValue;
402
+ }
403
+ function list(options) {
404
+ const autoDispose = (options == null ? void 0 : options.autoDispose) ?? false;
405
+ return (inputFocus) => {
406
+ const focus = inputFocus;
407
+ const [getter, setter] = focus;
408
+ const defaultValue = [];
409
+ const tracker = autoDispose ? createDisposalTracker() : null;
410
+ const getArray = () => getter() ?? defaultValue;
411
+ const scheduleDisposal = (items) => {
412
+ tracker == null ? void 0 : tracker.scheduleDisposal(items);
413
+ };
414
+ const cancelDisposal = (items) => {
415
+ tracker == null ? void 0 : tracker.cancelDisposal(items);
416
+ };
417
+ return {
418
+ get() {
419
+ return getArray();
420
+ },
421
+ at(index) {
422
+ return getArray()[index];
423
+ },
424
+ length() {
425
+ return getArray().length;
426
+ },
427
+ isEmpty() {
428
+ return getArray().length === 0;
429
+ },
430
+ first() {
431
+ return getArray()[0];
432
+ },
433
+ last() {
434
+ const arr = getArray();
435
+ return arr[arr.length - 1];
436
+ },
437
+ push(...items) {
438
+ cancelDisposal(items);
439
+ setter((draft) => {
440
+ const arr = draft ?? [];
441
+ arr.push(...items);
442
+ return arr;
443
+ });
444
+ },
445
+ unshift(...items) {
446
+ cancelDisposal(items);
447
+ setter((draft) => {
448
+ const arr = draft ?? [];
449
+ arr.unshift(...items);
450
+ return arr;
451
+ });
452
+ },
453
+ pop() {
454
+ const currentArray = getArray();
455
+ if (currentArray.length === 0) return void 0;
456
+ const removed = currentArray[currentArray.length - 1];
457
+ setter((draft) => {
458
+ const arr = draft ?? [];
459
+ arr.pop();
460
+ return arr;
461
+ });
462
+ scheduleDisposal([removed]);
463
+ return removed;
464
+ },
465
+ shift() {
466
+ const currentArray = getArray();
467
+ if (currentArray.length === 0) return void 0;
468
+ const removed = currentArray[0];
469
+ setter((draft) => {
470
+ const arr = draft ?? [];
471
+ arr.shift();
472
+ return arr;
473
+ });
474
+ scheduleDisposal([removed]);
475
+ return removed;
476
+ },
477
+ remove(...items) {
478
+ const currentArray = getArray();
479
+ const indicesToRemove = [];
480
+ const removed = [];
481
+ for (const item of items) {
482
+ const index = currentArray.indexOf(item);
483
+ if (index !== -1 && !indicesToRemove.includes(index)) {
484
+ indicesToRemove.push(index);
485
+ removed.push(item);
486
+ }
487
+ }
488
+ if (removed.length === 0) return 0;
489
+ indicesToRemove.sort((a2, b) => b - a2);
490
+ setter((draft) => {
491
+ const arr = draft ?? [];
492
+ for (const idx of indicesToRemove) {
493
+ arr.splice(idx, 1);
494
+ }
495
+ return arr;
496
+ });
497
+ scheduleDisposal(removed);
498
+ return removed.length;
499
+ },
500
+ removeAt(index) {
501
+ const currentArray = getArray();
502
+ if (index < 0 || index >= currentArray.length) return void 0;
503
+ const removed = currentArray[index];
504
+ setter((draft) => {
505
+ const arr = draft ?? [];
506
+ arr.splice(index, 1);
507
+ return arr;
508
+ });
509
+ scheduleDisposal([removed]);
510
+ return removed;
511
+ },
512
+ removeWhere(predicate) {
513
+ const currentArray = getArray();
514
+ const indicesToRemove = [];
515
+ const removed = [];
516
+ for (let i = 0; i < currentArray.length; i++) {
517
+ if (predicate(currentArray[i], i)) {
518
+ indicesToRemove.push(i);
519
+ removed.push(currentArray[i]);
520
+ }
521
+ }
522
+ if (removed.length === 0) return 0;
523
+ indicesToRemove.sort((a2, b) => b - a2);
524
+ setter((draft) => {
525
+ const arr = draft ?? [];
526
+ for (const idx of indicesToRemove) {
527
+ arr.splice(idx, 1);
528
+ }
529
+ return arr;
530
+ });
531
+ scheduleDisposal(removed);
532
+ return removed.length;
533
+ },
534
+ insert(index, ...items) {
535
+ cancelDisposal(items);
536
+ setter((draft) => {
537
+ const arr = draft ?? [];
538
+ arr.splice(index, 0, ...items);
539
+ return arr;
540
+ });
541
+ },
542
+ set(index, itemOrReducerOrUpdater) {
543
+ const isFunction = typeof itemOrReducerOrUpdater === "function";
544
+ const currentArray = getArray();
545
+ if (isFunction && (index < 0 || index >= currentArray.length)) {
546
+ return;
547
+ }
548
+ if (!isFunction) {
549
+ cancelDisposal([itemOrReducerOrUpdater]);
550
+ }
551
+ const old = index >= 0 && index < currentArray.length ? currentArray[index] : void 0;
552
+ setter((draft) => {
553
+ const arr = draft ?? [];
554
+ if (isFunction) {
555
+ const fn = itemOrReducerOrUpdater;
556
+ if (index >= 0 && index < arr.length) {
557
+ const result = fn(arr[index]);
558
+ if (result !== void 0) {
559
+ arr[index] = result;
560
+ }
561
+ }
562
+ } else {
563
+ arr[index] = itemOrReducerOrUpdater;
564
+ }
565
+ return arr;
566
+ });
567
+ const newValue = getArray()[index];
568
+ if (old !== void 0 && old !== newValue) scheduleDisposal([old]);
569
+ },
570
+ clear() {
571
+ const old = getArray();
572
+ setter([]);
573
+ scheduleDisposal(old);
574
+ },
575
+ replace(items) {
576
+ cancelDisposal(items);
577
+ const old = getArray();
578
+ setter(items);
579
+ const toDispose = old.filter((item) => !items.includes(item));
580
+ scheduleDisposal(toDispose);
581
+ },
582
+ find(predicate) {
583
+ return getArray().find(predicate);
584
+ },
585
+ findIndex(predicate) {
586
+ return getArray().findIndex(predicate);
587
+ },
588
+ includes(item) {
589
+ return getArray().includes(item);
590
+ },
591
+ map(fn) {
592
+ return getArray().map(fn);
593
+ },
594
+ filter(predicate) {
595
+ return getArray().filter(predicate);
596
+ },
597
+ pick(equality) {
598
+ return focus.pick(equality) ?? defaultValue;
599
+ }
600
+ };
601
+ };
602
+ }
603
+ function map(options) {
604
+ const autoDispose = (options == null ? void 0 : options.autoDispose) ?? false;
605
+ const defaultValue = {};
606
+ return (inputFocus) => {
607
+ const focus = inputFocus;
608
+ const [getter, setter] = focus;
609
+ const tracker = autoDispose ? createDisposalTracker() : null;
610
+ const getRecord = () => getter() ?? defaultValue;
611
+ const scheduleDisposal = (items) => {
612
+ tracker == null ? void 0 : tracker.scheduleDisposal(items);
613
+ };
614
+ const cancelDisposal = (items) => {
615
+ tracker == null ? void 0 : tracker.cancelDisposal(items);
616
+ };
617
+ return {
618
+ get: getRecord,
619
+ at(key) {
620
+ return getRecord()[key];
621
+ },
622
+ size() {
623
+ return Object.keys(getRecord()).length;
624
+ },
625
+ isEmpty() {
626
+ return Object.keys(getRecord()).length === 0;
627
+ },
628
+ has(key) {
629
+ return key in getRecord();
630
+ },
631
+ set(key, valueOrReducerOrUpdater) {
632
+ const isFunction = typeof valueOrReducerOrUpdater === "function";
633
+ const currentRecord = getRecord();
634
+ if (isFunction && !(key in currentRecord)) return;
635
+ if (!isFunction) {
636
+ cancelDisposal([valueOrReducerOrUpdater]);
637
+ }
638
+ const old = currentRecord[key];
639
+ setter((draft) => {
640
+ const rec = draft ?? {};
641
+ if (isFunction) {
642
+ const fn = valueOrReducerOrUpdater;
643
+ const result = fn(rec[key]);
644
+ if (result !== void 0) {
645
+ rec[key] = result;
646
+ }
647
+ } else {
648
+ rec[key] = valueOrReducerOrUpdater;
649
+ }
650
+ return rec;
651
+ });
652
+ const newValue = getRecord()[key];
653
+ if (old !== void 0 && old !== newValue) scheduleDisposal([old]);
654
+ },
655
+ delete(...keys) {
656
+ const currentRecord = getRecord();
657
+ const removed = [];
658
+ const keysToDelete = [];
659
+ for (const key of keys) {
660
+ if (key in currentRecord) {
661
+ removed.push(currentRecord[key]);
662
+ keysToDelete.push(key);
663
+ }
664
+ }
665
+ if (removed.length === 0) return 0;
666
+ setter((draft) => {
667
+ const rec = draft ?? {};
668
+ for (const key of keysToDelete) {
669
+ delete rec[key];
670
+ }
671
+ return rec;
672
+ });
673
+ scheduleDisposal(removed);
674
+ return removed.length;
675
+ },
676
+ deleteWhere(predicate) {
677
+ const currentRecord = getRecord();
678
+ const removed = [];
679
+ const keysToDelete = [];
680
+ for (const key of Object.keys(currentRecord)) {
681
+ if (predicate(currentRecord[key], key)) {
682
+ removed.push(currentRecord[key]);
683
+ keysToDelete.push(key);
684
+ }
685
+ }
686
+ if (removed.length === 0) return 0;
687
+ setter((draft) => {
688
+ const rec = draft ?? {};
689
+ for (const key of keysToDelete) {
690
+ delete rec[key];
691
+ }
692
+ return rec;
693
+ });
694
+ scheduleDisposal(removed);
695
+ return removed.length;
696
+ },
697
+ clear() {
698
+ const old = Object.values(getRecord());
699
+ setter({});
700
+ scheduleDisposal(old);
701
+ },
702
+ replace(record) {
703
+ cancelDisposal(Object.values(record));
704
+ const old = getRecord();
705
+ setter(record);
706
+ const newKeys = new Set(Object.keys(record));
707
+ const toDispose = Object.entries(old).filter(([key]) => !newKeys.has(key)).map(([, value]) => value);
708
+ scheduleDisposal(toDispose);
709
+ },
710
+ keys() {
711
+ return Object.keys(getRecord());
712
+ },
713
+ values() {
714
+ return Object.values(getRecord());
715
+ },
716
+ entries() {
717
+ return Object.entries(getRecord());
718
+ },
719
+ pick(equality) {
720
+ return focus.pick(equality) ?? defaultValue;
721
+ }
722
+ };
723
+ };
724
+ }
725
+ function patternToPredicate(pattern) {
726
+ if (pattern instanceof RegExp) {
727
+ return (name) => pattern.test(name);
728
+ }
729
+ const startsWithWildcard = pattern.startsWith("*");
730
+ const endsWithWildcard = pattern.endsWith("*");
731
+ if (startsWithWildcard && endsWithWildcard) {
732
+ const substr = pattern.slice(1, -1);
733
+ return (name) => name.includes(substr);
734
+ }
735
+ if (startsWithWildcard) {
736
+ const suffix = pattern.slice(1);
737
+ return (name) => name.endsWith(suffix);
738
+ }
739
+ if (endsWithWildcard) {
740
+ const prefix = pattern.slice(0, -1);
741
+ return (name) => name.startsWith(prefix);
742
+ }
743
+ return (name) => name === pattern;
744
+ }
745
+ function patternsToPredicate(patterns) {
746
+ if (Array.isArray(patterns)) {
747
+ const predicates = patterns.map(patternToPredicate);
748
+ return (ctx) => ctx.displayName !== void 0 && predicates.some((p2) => p2(ctx.displayName));
749
+ }
750
+ const predicate = patternToPredicate(patterns);
751
+ return (ctx) => ctx.displayName !== void 0 && predicate(ctx.displayName);
752
+ }
753
+ function compose(...middlewares) {
754
+ if (middlewares.length === 0) {
755
+ return (ctx) => ctx.next();
756
+ }
757
+ if (middlewares.length === 1) {
758
+ return middlewares[0];
759
+ }
760
+ return (ctx) => {
761
+ let index = 0;
762
+ const executeNext = () => {
763
+ if (index >= middlewares.length) {
764
+ return ctx.next();
765
+ }
766
+ const currentMiddleware = middlewares[index];
767
+ index++;
768
+ const wrappedCtx = ctx.type === "store" ? { ...ctx, next: executeNext } : { ...ctx, next: executeNext };
769
+ return currentMiddleware(wrappedCtx);
770
+ };
771
+ return executeNext();
772
+ };
773
+ }
774
+ function applyFor(predicateOrPatternsOrMap, middleware) {
775
+ if (typeof predicateOrPatternsOrMap === "object" && !Array.isArray(predicateOrPatternsOrMap) && !(predicateOrPatternsOrMap instanceof RegExp)) {
776
+ const entries = Object.entries(predicateOrPatternsOrMap);
777
+ const pairs = entries.map(([pattern, mw]) => ({
778
+ predicate: patternsToPredicate(pattern),
779
+ middleware: Array.isArray(mw) ? compose(...mw) : mw
780
+ }));
781
+ return (ctx) => {
782
+ for (const { predicate: predicate2, middleware: middleware2 } of pairs) {
783
+ if (predicate2(ctx)) {
784
+ return middleware2(ctx);
785
+ }
786
+ }
787
+ return ctx.next();
788
+ };
789
+ }
790
+ const predicate = typeof predicateOrPatternsOrMap === "function" ? predicateOrPatternsOrMap : patternsToPredicate(predicateOrPatternsOrMap);
791
+ const composedMiddleware = Array.isArray(middleware) ? compose(...middleware) : middleware;
792
+ return (ctx) => {
793
+ if (predicate(ctx)) {
794
+ return composedMiddleware(ctx);
795
+ }
796
+ return ctx.next();
797
+ };
798
+ }
799
+ function applyExcept(predicateOrPatterns, middleware) {
800
+ const matchPredicate = typeof predicateOrPatterns === "function" ? predicateOrPatterns : patternsToPredicate(predicateOrPatterns);
801
+ const invertedPredicate = (ctx) => !matchPredicate(ctx);
802
+ return applyFor(invertedPredicate, middleware);
803
+ }
804
+ function forStores(storeMiddleware) {
805
+ const composedMiddleware = Array.isArray(storeMiddleware) ? compose(...storeMiddleware) : storeMiddleware;
806
+ return (ctx) => {
807
+ if (ctx.type === "store") {
808
+ return composedMiddleware(ctx);
809
+ }
810
+ return ctx.next();
811
+ };
812
+ }
813
+ const DEFAULT_KEY = {};
814
+ const cache = /* @__PURE__ */ new Map();
815
+ function normalizeDeps(deps) {
816
+ return Array.isArray(deps) ? deps : [deps];
817
+ }
818
+ function getKeyCache(key) {
819
+ let keyCache = cache.get(key);
820
+ if (!keyCache) {
821
+ keyCache = /* @__PURE__ */ new WeakMap();
822
+ cache.set(key, keyCache);
823
+ }
824
+ return keyCache;
825
+ }
826
+ function trigger(keyOrFn, fnOrDepsOrOptions, depsOrFirstArg, ...restArgs) {
827
+ let key;
828
+ let fn;
829
+ let deps;
830
+ let equality;
831
+ let args;
832
+ if (typeof fnOrDepsOrOptions === "function") {
833
+ key = keyOrFn;
834
+ fn = fnOrDepsOrOptions;
835
+ deps = normalizeDeps(depsOrFirstArg ?? []);
836
+ args = restArgs;
837
+ } else if (fnOrDepsOrOptions !== void 0 && fnOrDepsOrOptions !== null && typeof fnOrDepsOrOptions !== "object") {
838
+ key = DEFAULT_KEY;
839
+ fn = keyOrFn;
840
+ deps = [fnOrDepsOrOptions];
841
+ args = depsOrFirstArg !== void 0 ? [depsOrFirstArg, ...restArgs] : [];
842
+ } else if (Array.isArray(fnOrDepsOrOptions)) {
843
+ key = DEFAULT_KEY;
844
+ fn = keyOrFn;
845
+ deps = fnOrDepsOrOptions;
846
+ args = depsOrFirstArg !== void 0 ? [depsOrFirstArg, ...restArgs] : [];
847
+ } else {
848
+ const options = fnOrDepsOrOptions ?? {};
849
+ key = options.key ?? DEFAULT_KEY;
850
+ fn = keyOrFn;
851
+ deps = normalizeDeps(options.deps ?? []);
852
+ equality = options.equality ? resolveEquality(options.equality) : void 0;
853
+ args = depsOrFirstArg !== void 0 ? [depsOrFirstArg, ...restArgs] : [];
854
+ }
855
+ const cacheKey = unwrapFn(fn);
856
+ const keyCache = getKeyCache(key);
857
+ const cached = keyCache.get(cacheKey);
858
+ const eq = equality ?? (cached == null ? void 0 : cached.equality) ?? shallowEqual;
859
+ if (cached && eq(cached.deps, deps)) {
860
+ return cached.result;
861
+ }
862
+ const result = fn(...args);
863
+ keyCache.set(cacheKey, { deps, result, equality });
864
+ return result;
865
+ }
866
+ trigger.clear = (key) => {
867
+ cache.delete(key);
868
+ };
869
+ trigger.clearAll = () => {
870
+ cache.clear();
871
+ };
872
+ function withMeta(factory, meta) {
873
+ return Object.assign(factory, {
874
+ meta: Array.isArray(meta) ? meta : [meta]
875
+ });
876
+ }
4
877
  export {
5
- A2 as AsyncFunctionError,
878
+ d as AsyncFunctionError,
6
879
  E as EffectRefreshError,
7
880
  H as HooksContextError,
8
881
  I as InvalidActionError,
9
- c2 as LifetimeMismatchError,
10
- L as LocalStoreDependencyError,
882
+ L as LifetimeMismatchError,
883
+ z as LocalStoreDependencyError,
11
884
  P as ProviderMissingError,
12
- S as STORION_TYPE,
13
- a2 as SetupPhaseError,
14
- d2 as StoreDisposedError,
15
- S2 as StorionError,
16
- n as applyExcept,
17
- m as applyFor,
18
- b2 as batch,
19
- c as container,
20
- l as createResolver,
21
- u as deepEqual,
22
- e2 as effect,
23
- q as equality,
24
- o as forStores,
25
- g as getKind,
26
- a as is,
27
- h as isAction,
28
- d as isContainer,
29
- f as isFocus,
30
- k as isSelectorContext,
31
- i as isSpec,
32
- e as isStore,
33
- j as isStoreContext,
34
- b as isStorion,
35
- z as isWrappedFn,
885
+ STORION_TYPE,
886
+ S as SetupPhaseError,
887
+ y as StoreDisposedError,
888
+ x as StorionError,
889
+ append,
890
+ applyExcept,
891
+ applyFor,
892
+ n as batch,
893
+ clamp,
894
+ container,
895
+ decrement,
896
+ v as deepEqual,
897
+ divide,
898
+ e as effect,
899
+ o as equality,
900
+ forStores,
901
+ increment,
902
+ m as is,
903
+ list,
904
+ map,
905
+ merge,
36
906
  m2 as meta,
907
+ multiply,
37
908
  p as pick,
38
- t as shallowEqual,
39
- s as store,
40
- v as strictEqual,
41
- w as trigger,
42
- u2 as untrack,
43
- y as unwrapFn,
44
- A as withMeta,
45
- x as wrapFn
909
+ B as pool,
910
+ prepend,
911
+ reset,
912
+ createResolver as resolver,
913
+ shallowEqual,
914
+ a as store,
915
+ h as strictEqual,
916
+ toggle,
917
+ trigger,
918
+ untrack,
919
+ withMeta
46
920
  };