atom.io 0.19.4 → 0.20.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 (94) hide show
  1. package/data/dist/index.js +1 -1
  2. package/data/src/dict.ts +1 -1
  3. package/data/src/join.ts +1 -1
  4. package/data/src/struct-family.ts +1 -1
  5. package/data/src/struct.ts +5 -3
  6. package/internal/dist/index.cjs +127 -92
  7. package/internal/dist/index.d.ts +13 -9
  8. package/internal/dist/index.js +127 -92
  9. package/internal/src/atom/index.ts +1 -1
  10. package/internal/src/caching.ts +13 -9
  11. package/internal/src/families/create-atom-family.ts +1 -1
  12. package/internal/src/families/find-in-store.ts +2 -2
  13. package/internal/src/families/index.ts +1 -1
  14. package/internal/src/future.ts +52 -15
  15. package/internal/src/index.ts +2 -2
  16. package/internal/src/mutable/create-mutable-atom-family.ts +2 -3
  17. package/internal/src/mutable/create-mutable-atom.ts +3 -3
  18. package/internal/src/mutable/get-update-token.ts +1 -0
  19. package/internal/src/selector/delete-selector.ts +1 -1
  20. package/internal/src/selector/register-selector.ts +1 -1
  21. package/internal/src/store/deposit.ts +1 -1
  22. package/internal/src/store/store.ts +2 -2
  23. package/internal/src/store/withdraw-new-family-member.ts +1 -1
  24. package/internal/src/store/withdraw.ts +2 -3
  25. package/internal/src/subscribe/subscribe-to-state.ts +1 -0
  26. package/internal/src/subscribe/subscribe-to-timeline.ts +1 -0
  27. package/internal/src/subscribe/subscribe-to-transaction.ts +2 -1
  28. package/internal/src/timeline/add-atom-to-timeline.ts +2 -2
  29. package/internal/src/timeline/create-timeline.ts +1 -1
  30. package/internal/src/transaction/act-upon-store.ts +1 -1
  31. package/internal/src/transaction/apply-transaction.ts +1 -1
  32. package/internal/src/transaction/build-transaction.ts +2 -2
  33. package/internal/src/transaction/create-transaction.ts +2 -2
  34. package/internal/src/transaction/index.ts +1 -1
  35. package/internal/src/transaction/is-root-store.ts +1 -1
  36. package/introspection/src/attach-atom-index.ts +1 -1
  37. package/introspection/src/attach-introspection-states.ts +2 -2
  38. package/introspection/src/attach-selector-index.ts +1 -1
  39. package/introspection/src/attach-timeline-family.ts +2 -2
  40. package/introspection/src/attach-timeline-index.ts +1 -1
  41. package/introspection/src/attach-transaction-index.ts +2 -2
  42. package/introspection/src/attach-transaction-logs.ts +2 -2
  43. package/json/dist/index.cjs +35 -33
  44. package/json/dist/index.d.ts +5 -5
  45. package/json/src/index.ts +2 -3
  46. package/json/src/select-json-family.ts +1 -1
  47. package/json/src/select-json.ts +1 -2
  48. package/package.json +15 -15
  49. package/react/src/use-tl.ts +1 -1
  50. package/react-devtools/dist/index.cjs +99 -99
  51. package/react-devtools/dist/index.d.ts +2 -2
  52. package/react-devtools/dist/index.js +77 -77
  53. package/react-devtools/src/AtomIODevtools.tsx +2 -2
  54. package/react-devtools/src/TransactionIndex.tsx +2 -2
  55. package/react-devtools/src/Updates.tsx +1 -1
  56. package/react-devtools/src/index.ts +1 -1
  57. package/realtime/src/realtime-continuity.ts +1 -1
  58. package/realtime-client/dist/index.js +1 -1
  59. package/realtime-client/src/pull-atom-family-member.ts +1 -1
  60. package/realtime-client/src/pull-atom.ts +1 -1
  61. package/realtime-client/src/pull-mutable-atom-family-member.ts +2 -2
  62. package/realtime-client/src/sync-continuity.ts +1 -1
  63. package/realtime-react/dist/index.js +1 -1
  64. package/realtime-react/src/use-realtime-service.ts +1 -0
  65. package/realtime-react/src/use-sync-continuity.ts +2 -1
  66. package/realtime-server/dist/index.cjs +98 -98
  67. package/realtime-server/dist/index.d.ts +14 -14
  68. package/realtime-server/dist/index.js +100 -100
  69. package/realtime-server/src/index.ts +5 -5
  70. package/realtime-server/src/ipc-sockets/parent-socket.ts +3 -3
  71. package/realtime-server/src/realtime-action-receiver.ts +1 -1
  72. package/realtime-server/src/realtime-continuity-synchronizer.ts +2 -3
  73. package/realtime-server/src/realtime-family-provider.ts +1 -1
  74. package/realtime-server/src/realtime-mutable-family-provider.ts +1 -1
  75. package/realtime-server/src/realtime-mutable-provider.ts +2 -2
  76. package/realtime-server/src/realtime-server-stores/realtime-continuity-store.ts +2 -2
  77. package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +1 -1
  78. package/realtime-server/src/realtime-server-stores/server-room-external-store.ts +1 -0
  79. package/realtime-server/src/realtime-state-provider.ts +1 -1
  80. package/realtime-server/src/realtime-state-synchronizer.ts +1 -1
  81. package/realtime-testing/dist/index.js +2 -2
  82. package/realtime-testing/src/setup-realtime-test.tsx +3 -2
  83. package/src/atom.ts +1 -1
  84. package/src/find-state.ts +1 -1
  85. package/src/index.ts +1 -0
  86. package/src/selector.ts +1 -1
  87. package/src/silo.ts +4 -4
  88. package/src/subscribe.ts +2 -2
  89. package/src/timeline.ts +1 -1
  90. package/src/transaction.ts +3 -3
  91. package/transceivers/set-rtx/src/set-rtx.ts +1 -1
  92. package/dist/{chunk-ATKDGVTV.js → chunk-2AIFLP2B.js} +0 -0
  93. package/dist/{chunk-CC7IF7QF.js → chunk-3V3VWQ7X.js} +6 -6
  94. /package/dist/{chunk-MSCJWACE.js → chunk-SMZRGPN6.js} +0 -0
@@ -1,4 +1,4 @@
1
- export { Join, editRelations, editRelationsInStore, findRelations, findRelationsInStore, getInternalRelations, getInternalRelationsFromStore, getJoin, getJoinMap, join } from '../../dist/chunk-MSCJWACE.js';
1
+ export { Join, editRelations, editRelationsInStore, findRelations, findRelationsInStore, getInternalRelations, getInternalRelationsFromStore, getJoin, getJoinMap, join } from '../../dist/chunk-SMZRGPN6.js';
2
2
  import '../../dist/chunk-FTONNX2R.js';
3
3
  import '../../dist/chunk-F2X4B4VY.js';
4
4
  import { createStandaloneSelector, findInStore, IMPLICIT, createRegularAtom, createRegularAtomFamily, createSelectorFamily } from 'atom.io/internal';
package/data/src/dict.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import type * as AtomIO from "atom.io"
2
2
  import type { Store } from "atom.io/internal"
3
3
  import {
4
- IMPLICIT,
5
4
  createStandaloneSelector,
6
5
  findInStore,
6
+ IMPLICIT,
7
7
  } from "atom.io/internal"
8
8
  import type { Json, Stringified } from "atom.io/json"
9
9
 
package/data/src/join.ts CHANGED
@@ -13,13 +13,13 @@ import type {
13
13
  import { dispose, findState, getState, setState } from "atom.io"
14
14
  import type { Store } from "atom.io/internal"
15
15
  import {
16
- IMPLICIT,
17
16
  createMutableAtomFamily,
18
17
  createRegularAtomFamily,
19
18
  createSelectorFamily,
20
19
  findInStore,
21
20
  getFromStore,
22
21
  getJsonFamily,
22
+ IMPLICIT,
23
23
  isChildStore,
24
24
  newest,
25
25
  setIntoStore,
@@ -1,8 +1,8 @@
1
1
  import type * as AtomIO from "atom.io"
2
2
  import {
3
- IMPLICIT,
4
3
  createRegularAtomFamily,
5
4
  createSelectorFamily,
5
+ IMPLICIT,
6
6
  } from "atom.io/internal"
7
7
 
8
8
  const capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)
@@ -1,8 +1,10 @@
1
1
  import type * as AtomIO from "atom.io"
2
2
  import type { Store } from "atom.io/internal"
3
- import { IMPLICIT } from "atom.io/internal"
4
-
5
- import { createRegularAtom, createStandaloneSelector } from "atom.io/internal"
3
+ import {
4
+ createRegularAtom,
5
+ createStandaloneSelector,
6
+ IMPLICIT,
7
+ } from "atom.io/internal"
6
8
 
7
9
  const capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)
8
10
 
@@ -23,6 +23,67 @@ var __spreadValues = (a, b) => {
23
23
  };
24
24
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
25
 
26
+ // internal/src/arbitrary.ts
27
+ function arbitrary(random = Math.random) {
28
+ return random().toString(36).slice(2);
29
+ }
30
+
31
+ // internal/src/future.ts
32
+ var Future = class extends Promise {
33
+ constructor(executor) {
34
+ let promise;
35
+ let superResolve;
36
+ let superReject;
37
+ super((resolve, reject) => {
38
+ superResolve = resolve;
39
+ superReject = reject;
40
+ promise = executor instanceof Promise ? executor : new Promise(executor);
41
+ promise.then(
42
+ (value) => {
43
+ if (promise) {
44
+ this.pass(promise, value);
45
+ }
46
+ },
47
+ (reason) => {
48
+ if (promise) {
49
+ this.fail(promise, reason);
50
+ }
51
+ }
52
+ );
53
+ });
54
+ this.destiny = promise;
55
+ this.resolve = superResolve;
56
+ this.reject = superReject;
57
+ }
58
+ pass(promise, value) {
59
+ if (promise === this.destiny) {
60
+ this.resolve(value);
61
+ }
62
+ }
63
+ fail(promise, reason) {
64
+ if (promise === this.destiny) {
65
+ this.reject(reason);
66
+ }
67
+ }
68
+ use(value) {
69
+ if (value instanceof Promise) {
70
+ const promise = value;
71
+ this.destiny = promise;
72
+ promise.then(
73
+ (resolved) => {
74
+ this.pass(promise, resolved);
75
+ },
76
+ (reason) => {
77
+ this.fail(promise, reason);
78
+ }
79
+ );
80
+ } else {
81
+ this.resolve(value);
82
+ this.destiny = void 0;
83
+ }
84
+ }
85
+ };
86
+
26
87
  // internal/src/lineage.ts
27
88
  function newest(scion) {
28
89
  while (scion.child !== null) {
@@ -539,93 +600,6 @@ function withdrawOrCreate(token, store) {
539
600
  }
540
601
  }
541
602
 
542
- // internal/src/future.ts
543
- var Future = class extends Promise {
544
- constructor(executor) {
545
- super((resolve, reject) => {
546
- const pass = (value) => {
547
- this.isCanceled ? reject(`canceled`) : resolve(value);
548
- };
549
- const fail = (reason) => {
550
- this.isCanceled ? reject(`canceled`) : reject(reason);
551
- };
552
- if (typeof executor === `function`) {
553
- executor(pass, fail);
554
- } else {
555
- executor.then(pass, fail);
556
- }
557
- });
558
- this.isCanceled = false;
559
- }
560
- cancel() {
561
- this.isCanceled = true;
562
- }
563
- };
564
-
565
- // internal/src/set-state/copy-mutable-if-needed.ts
566
- function copyMutableIfNeeded(atom, origin, target) {
567
- const originValue = origin.valueMap.get(atom.key);
568
- const targetValue = target.valueMap.get(atom.key);
569
- if (originValue === targetValue) {
570
- if (originValue === void 0) {
571
- return typeof atom.default === `function` ? atom.default() : atom.default;
572
- }
573
- origin.logger.info(`\u{1F4C3}`, `atom`, atom.key, `copying`);
574
- const jsonValue = atom.toJson(originValue);
575
- const copiedValue = atom.fromJson(jsonValue);
576
- target.valueMap.set(atom.key, copiedValue);
577
- new Tracker(atom, origin);
578
- return copiedValue;
579
- }
580
- return targetValue;
581
- }
582
-
583
- // internal/src/caching.ts
584
- function cacheValue(key, value, subject, target) {
585
- const currentValue = target.valueMap.get(key);
586
- if (currentValue instanceof Future) {
587
- currentValue.cancel();
588
- }
589
- if (value instanceof Promise) {
590
- const future = new Future(value);
591
- target.valueMap.set(key, future);
592
- future.then((resolved) => {
593
- if (future.isCanceled) {
594
- return;
595
- }
596
- cacheValue(key, resolved, subject, target);
597
- subject.next({ newValue: resolved, oldValue: future });
598
- }).catch((thrown) => {
599
- if (thrown !== `canceled`) {
600
- target.logger.error(`\u{1F4A5}`, `state`, key, `rejected:`, thrown);
601
- }
602
- });
603
- return future;
604
- }
605
- target.valueMap.set(key, value);
606
- return value;
607
- }
608
- var readCachedValue = (token, target) => {
609
- let value = target.valueMap.get(token.key);
610
- if (token.type === `mutable_atom` && isChildStore(target)) {
611
- const { parent } = target;
612
- const copiedValue = copyMutableIfNeeded(token, parent, target);
613
- value = copiedValue;
614
- }
615
- return value;
616
- };
617
- var evictCachedValue = (key, target) => {
618
- const currentValue = target.valueMap.get(key);
619
- if (currentValue instanceof Future) {
620
- currentValue.cancel();
621
- }
622
- if (target.operation.open) {
623
- target.operation.prev.set(key, currentValue);
624
- }
625
- target.valueMap.delete(key);
626
- target.logger.info(`\u{1F5D1}`, `state`, key, `evicted`);
627
- };
628
-
629
603
  // internal/src/get-state/read-or-compute-value.ts
630
604
  var readOrComputeValue = (state, target) => {
631
605
  if (target.valueMap.has(state.key)) {
@@ -1727,6 +1701,72 @@ function isTransceiver(value) {
1727
1701
  return typeof value === `object` && value !== null && `do` in value && `undo` in value && `subscribe` in value;
1728
1702
  }
1729
1703
 
1704
+ // internal/src/set-state/copy-mutable-if-needed.ts
1705
+ function copyMutableIfNeeded(atom, origin, target) {
1706
+ const originValue = origin.valueMap.get(atom.key);
1707
+ const targetValue = target.valueMap.get(atom.key);
1708
+ if (originValue === targetValue) {
1709
+ if (originValue === void 0) {
1710
+ return typeof atom.default === `function` ? atom.default() : atom.default;
1711
+ }
1712
+ origin.logger.info(`\u{1F4C3}`, `atom`, atom.key, `copying`);
1713
+ const jsonValue = atom.toJson(originValue);
1714
+ const copiedValue = atom.fromJson(jsonValue);
1715
+ target.valueMap.set(atom.key, copiedValue);
1716
+ new Tracker(atom, origin);
1717
+ return copiedValue;
1718
+ }
1719
+ return targetValue;
1720
+ }
1721
+
1722
+ // internal/src/caching.ts
1723
+ function cacheValue(key, value, subject, target) {
1724
+ const currentValue = target.valueMap.get(key);
1725
+ if (currentValue instanceof Future) {
1726
+ const future = currentValue;
1727
+ future.use(value);
1728
+ }
1729
+ if (value instanceof Promise) {
1730
+ const future = new Future(value);
1731
+ target.valueMap.set(key, future);
1732
+ future.then((resolved) => {
1733
+ cacheValue(key, resolved, subject, target);
1734
+ subject.next({ newValue: resolved, oldValue: future });
1735
+ }).catch((thrown) => {
1736
+ target.logger.error(`\u{1F4A5}`, `state`, key, `rejected:`, thrown);
1737
+ });
1738
+ return future;
1739
+ }
1740
+ target.valueMap.set(key, value);
1741
+ return value;
1742
+ }
1743
+ var readCachedValue = (token, target) => {
1744
+ let value = target.valueMap.get(token.key);
1745
+ if (token.type === `mutable_atom` && isChildStore(target)) {
1746
+ const { parent } = target;
1747
+ const copiedValue = copyMutableIfNeeded(token, parent, target);
1748
+ value = copiedValue;
1749
+ }
1750
+ return value;
1751
+ };
1752
+ var evictCachedValue = (key, target) => {
1753
+ var _a;
1754
+ const currentValue = target.valueMap.get(key);
1755
+ if (currentValue instanceof Future) {
1756
+ const future = currentValue;
1757
+ const selector = (_a = target.selectors.get(key)) != null ? _a : target.readonlySelectors.get(key);
1758
+ if (selector) {
1759
+ future.use(selector.get());
1760
+ }
1761
+ return;
1762
+ }
1763
+ if (target.operation.open) {
1764
+ target.operation.prev.set(key, currentValue);
1765
+ }
1766
+ target.valueMap.delete(key);
1767
+ target.logger.info(`\u{1F5D1}`, `state`, key, `evicted`);
1768
+ };
1769
+
1730
1770
  // internal/src/atom/is-default.ts
1731
1771
  var isAtomDefault = (key, store) => {
1732
1772
  const core = newest(store);
@@ -1856,11 +1896,6 @@ function deleteAtom(atomToken, store) {
1856
1896
  store.logger.info(`\u{1F525}`, `atom`, key, `deleted`);
1857
1897
  }
1858
1898
 
1859
- // internal/src/arbitrary.ts
1860
- function arbitrary(random = Math.random) {
1861
- return random().toString(36).slice(2);
1862
- }
1863
-
1864
1899
  // internal/src/get-environment-data.ts
1865
1900
  function getEnvironmentData(store) {
1866
1901
  return {
@@ -315,21 +315,21 @@ declare class FamilyTracker<Core extends Transceiver<any>, FamilyMemberKey exten
315
315
  constructor(findMutableState: MutableAtomFamily<Core, any, FamilyMemberKey>, store: Store);
316
316
  }
317
317
 
318
- declare function createStandaloneAtom<T>(options: RegularAtomOptions<T>, store: Store): RegularAtomToken<T>;
319
- declare function createStandaloneAtom<T extends Transceiver<any>, J extends Json.Serializable>(options: MutableAtomOptions<T, J>, store: Store): MutableAtomToken<T, J>;
318
+ declare function arbitrary(random?: () => number): string;
320
319
 
321
320
  declare function createRegularAtom<T>(options: MutableAtomOptions<any, any> | RegularAtomOptions<T>, family: FamilyMetadata | undefined, store: Store): RegularAtomToken<T>;
322
321
 
322
+ declare function createStandaloneAtom<T>(options: RegularAtomOptions<T>, store: Store): RegularAtomToken<T>;
323
+ declare function createStandaloneAtom<T extends Transceiver<any>, J extends Json.Serializable>(options: MutableAtomOptions<T, J>, store: Store): MutableAtomToken<T, J>;
324
+
323
325
  declare function deleteAtom(atomToken: AtomToken<unknown>, store: Store): void;
324
326
 
325
327
  declare const isAtomDefault: (key: string, store: Store) => boolean;
326
328
  declare const markAtomAsDefault: (key: string, store: Store) => void;
327
329
  declare const markAtomAsNotDefault: (key: string, store: Store) => void;
328
330
 
329
- declare function arbitrary(random?: () => number): string;
330
-
331
331
  /**
332
- * A Promise that can be canceled.
332
+ * A Promise whose incoming value can be hot swapped.
333
333
  * @internal
334
334
  * @private
335
335
  * @typeParam T The type of the value that the promise will resolve to.
@@ -338,9 +338,13 @@ declare function arbitrary(random?: () => number): string;
338
338
  * Can be constructed like a Promise, or from an existing Promise.
339
339
  */
340
340
  declare class Future<T> extends Promise<T> {
341
- isCanceled: boolean;
341
+ private destiny;
342
+ private resolve;
343
+ private reject;
342
344
  constructor(executor: Promise<T> | ((resolve: (value: T) => void, reject: (reason?: any) => void) => void));
343
- cancel(): void;
345
+ private pass;
346
+ private fail;
347
+ use(value: Promise<T> | T): void;
344
348
  }
345
349
 
346
350
  declare function cacheValue<T>(key: string, value: T, subject: Subject<StateUpdate<unknown>>, store: Store): T;
@@ -351,10 +355,10 @@ declare const evictCachedValue: (key: string, target: Store) => void;
351
355
  declare function createAtomFamily<T extends Transceiver<any>, J extends Json.Serializable, K extends Json.Serializable>(options: MutableAtomFamilyOptions<T, J, K>, store: Store): MutableAtomFamily<T, J, K>;
352
356
  declare function createAtomFamily<T, K extends Json.Serializable>(options: RegularAtomFamilyOptions<T, K>, store: Store): RegularAtomFamily<T, K>;
353
357
 
354
- declare function createRegularAtomFamily<T, K extends Json.Serializable>(options: RegularAtomFamilyOptions<T, K>, store: Store): RegularAtomFamily<T, K>;
355
-
356
358
  declare function createReadonlySelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store: Store): ReadonlySelectorFamily<T, K>;
357
359
 
360
+ declare function createRegularAtomFamily<T, K extends Json.Serializable>(options: RegularAtomFamilyOptions<T, K>, store: Store): RegularAtomFamily<T, K>;
361
+
358
362
  declare function createSelectorFamily<T, K extends Json.Serializable>(options: WritableSelectorFamilyOptions<T, K>, store: Store): WritableSelectorFamily<T, K>;
359
363
  declare function createSelectorFamily<T, K extends Json.Serializable>(options: ReadonlySelectorFamilyOptions<T, K>, store: Store): ReadonlySelectorFamily<T, K>;
360
364
 
@@ -3,6 +3,67 @@ import { __spreadValues, __spreadProps } from '../../dist/chunk-F2X4B4VY.js';
3
3
  import { stringifyJson, selectJson, parseJson, selectJsonFamily } from 'atom.io/json';
4
4
  import { AtomIOLogger } from 'atom.io';
5
5
 
6
+ // internal/src/arbitrary.ts
7
+ function arbitrary(random = Math.random) {
8
+ return random().toString(36).slice(2);
9
+ }
10
+
11
+ // internal/src/future.ts
12
+ var Future = class extends Promise {
13
+ constructor(executor) {
14
+ let promise;
15
+ let superResolve;
16
+ let superReject;
17
+ super((resolve, reject) => {
18
+ superResolve = resolve;
19
+ superReject = reject;
20
+ promise = executor instanceof Promise ? executor : new Promise(executor);
21
+ promise.then(
22
+ (value) => {
23
+ if (promise) {
24
+ this.pass(promise, value);
25
+ }
26
+ },
27
+ (reason) => {
28
+ if (promise) {
29
+ this.fail(promise, reason);
30
+ }
31
+ }
32
+ );
33
+ });
34
+ this.destiny = promise;
35
+ this.resolve = superResolve;
36
+ this.reject = superReject;
37
+ }
38
+ pass(promise, value) {
39
+ if (promise === this.destiny) {
40
+ this.resolve(value);
41
+ }
42
+ }
43
+ fail(promise, reason) {
44
+ if (promise === this.destiny) {
45
+ this.reject(reason);
46
+ }
47
+ }
48
+ use(value) {
49
+ if (value instanceof Promise) {
50
+ const promise = value;
51
+ this.destiny = promise;
52
+ promise.then(
53
+ (resolved) => {
54
+ this.pass(promise, resolved);
55
+ },
56
+ (reason) => {
57
+ this.fail(promise, reason);
58
+ }
59
+ );
60
+ } else {
61
+ this.resolve(value);
62
+ this.destiny = void 0;
63
+ }
64
+ }
65
+ };
66
+
6
67
  // internal/src/lineage.ts
7
68
  function newest(scion) {
8
69
  while (scion.child !== null) {
@@ -261,93 +322,6 @@ function withdrawOrCreate(token, store) {
261
322
  }
262
323
  }
263
324
 
264
- // internal/src/future.ts
265
- var Future = class extends Promise {
266
- constructor(executor) {
267
- super((resolve, reject) => {
268
- const pass = (value) => {
269
- this.isCanceled ? reject(`canceled`) : resolve(value);
270
- };
271
- const fail = (reason) => {
272
- this.isCanceled ? reject(`canceled`) : reject(reason);
273
- };
274
- if (typeof executor === `function`) {
275
- executor(pass, fail);
276
- } else {
277
- executor.then(pass, fail);
278
- }
279
- });
280
- this.isCanceled = false;
281
- }
282
- cancel() {
283
- this.isCanceled = true;
284
- }
285
- };
286
-
287
- // internal/src/set-state/copy-mutable-if-needed.ts
288
- function copyMutableIfNeeded(atom, origin, target) {
289
- const originValue = origin.valueMap.get(atom.key);
290
- const targetValue = target.valueMap.get(atom.key);
291
- if (originValue === targetValue) {
292
- if (originValue === void 0) {
293
- return typeof atom.default === `function` ? atom.default() : atom.default;
294
- }
295
- origin.logger.info(`\u{1F4C3}`, `atom`, atom.key, `copying`);
296
- const jsonValue = atom.toJson(originValue);
297
- const copiedValue = atom.fromJson(jsonValue);
298
- target.valueMap.set(atom.key, copiedValue);
299
- new Tracker(atom, origin);
300
- return copiedValue;
301
- }
302
- return targetValue;
303
- }
304
-
305
- // internal/src/caching.ts
306
- function cacheValue(key, value, subject, target) {
307
- const currentValue = target.valueMap.get(key);
308
- if (currentValue instanceof Future) {
309
- currentValue.cancel();
310
- }
311
- if (value instanceof Promise) {
312
- const future = new Future(value);
313
- target.valueMap.set(key, future);
314
- future.then((resolved) => {
315
- if (future.isCanceled) {
316
- return;
317
- }
318
- cacheValue(key, resolved, subject, target);
319
- subject.next({ newValue: resolved, oldValue: future });
320
- }).catch((thrown) => {
321
- if (thrown !== `canceled`) {
322
- target.logger.error(`\u{1F4A5}`, `state`, key, `rejected:`, thrown);
323
- }
324
- });
325
- return future;
326
- }
327
- target.valueMap.set(key, value);
328
- return value;
329
- }
330
- var readCachedValue = (token, target) => {
331
- let value = target.valueMap.get(token.key);
332
- if (token.type === `mutable_atom` && isChildStore(target)) {
333
- const { parent } = target;
334
- const copiedValue = copyMutableIfNeeded(token, parent, target);
335
- value = copiedValue;
336
- }
337
- return value;
338
- };
339
- var evictCachedValue = (key, target) => {
340
- const currentValue = target.valueMap.get(key);
341
- if (currentValue instanceof Future) {
342
- currentValue.cancel();
343
- }
344
- if (target.operation.open) {
345
- target.operation.prev.set(key, currentValue);
346
- }
347
- target.valueMap.delete(key);
348
- target.logger.info(`\u{1F5D1}`, `state`, key, `evicted`);
349
- };
350
-
351
325
  // internal/src/get-state/read-or-compute-value.ts
352
326
  var readOrComputeValue = (state, target) => {
353
327
  if (target.valueMap.has(state.key)) {
@@ -1449,6 +1423,72 @@ function isTransceiver(value) {
1449
1423
  return typeof value === `object` && value !== null && `do` in value && `undo` in value && `subscribe` in value;
1450
1424
  }
1451
1425
 
1426
+ // internal/src/set-state/copy-mutable-if-needed.ts
1427
+ function copyMutableIfNeeded(atom, origin, target) {
1428
+ const originValue = origin.valueMap.get(atom.key);
1429
+ const targetValue = target.valueMap.get(atom.key);
1430
+ if (originValue === targetValue) {
1431
+ if (originValue === void 0) {
1432
+ return typeof atom.default === `function` ? atom.default() : atom.default;
1433
+ }
1434
+ origin.logger.info(`\u{1F4C3}`, `atom`, atom.key, `copying`);
1435
+ const jsonValue = atom.toJson(originValue);
1436
+ const copiedValue = atom.fromJson(jsonValue);
1437
+ target.valueMap.set(atom.key, copiedValue);
1438
+ new Tracker(atom, origin);
1439
+ return copiedValue;
1440
+ }
1441
+ return targetValue;
1442
+ }
1443
+
1444
+ // internal/src/caching.ts
1445
+ function cacheValue(key, value, subject, target) {
1446
+ const currentValue = target.valueMap.get(key);
1447
+ if (currentValue instanceof Future) {
1448
+ const future = currentValue;
1449
+ future.use(value);
1450
+ }
1451
+ if (value instanceof Promise) {
1452
+ const future = new Future(value);
1453
+ target.valueMap.set(key, future);
1454
+ future.then((resolved) => {
1455
+ cacheValue(key, resolved, subject, target);
1456
+ subject.next({ newValue: resolved, oldValue: future });
1457
+ }).catch((thrown) => {
1458
+ target.logger.error(`\u{1F4A5}`, `state`, key, `rejected:`, thrown);
1459
+ });
1460
+ return future;
1461
+ }
1462
+ target.valueMap.set(key, value);
1463
+ return value;
1464
+ }
1465
+ var readCachedValue = (token, target) => {
1466
+ let value = target.valueMap.get(token.key);
1467
+ if (token.type === `mutable_atom` && isChildStore(target)) {
1468
+ const { parent } = target;
1469
+ const copiedValue = copyMutableIfNeeded(token, parent, target);
1470
+ value = copiedValue;
1471
+ }
1472
+ return value;
1473
+ };
1474
+ var evictCachedValue = (key, target) => {
1475
+ var _a;
1476
+ const currentValue = target.valueMap.get(key);
1477
+ if (currentValue instanceof Future) {
1478
+ const future = currentValue;
1479
+ const selector = (_a = target.selectors.get(key)) != null ? _a : target.readonlySelectors.get(key);
1480
+ if (selector) {
1481
+ future.use(selector.get());
1482
+ }
1483
+ return;
1484
+ }
1485
+ if (target.operation.open) {
1486
+ target.operation.prev.set(key, currentValue);
1487
+ }
1488
+ target.valueMap.delete(key);
1489
+ target.logger.info(`\u{1F5D1}`, `state`, key, `evicted`);
1490
+ };
1491
+
1452
1492
  // internal/src/atom/is-default.ts
1453
1493
  var isAtomDefault = (key, store) => {
1454
1494
  const core = newest(store);
@@ -1578,11 +1618,6 @@ function deleteAtom(atomToken, store) {
1578
1618
  store.logger.info(`\u{1F525}`, `atom`, key, `deleted`);
1579
1619
  }
1580
1620
 
1581
- // internal/src/arbitrary.ts
1582
- function arbitrary(random = Math.random) {
1583
- return random().toString(36).slice(2);
1584
- }
1585
-
1586
1621
  // internal/src/get-environment-data.ts
1587
1622
  function getEnvironmentData(store) {
1588
1623
  return {
@@ -1,4 +1,4 @@
1
- export * from "./create-standalone-atom"
2
1
  export * from "./create-regular-atom"
2
+ export * from "./create-standalone-atom"
3
3
  export * from "./delete-atom"
4
4
  export * from "./is-default"
@@ -1,5 +1,7 @@
1
1
  import type { StateUpdate } from "atom.io"
2
- import { type ReadableState, isChildStore } from "."
2
+
3
+ import type { ReadableState } from "."
4
+ import { isChildStore } from "."
3
5
  import { Future } from "./future"
4
6
  import { copyMutableIfNeeded } from "./set-state/copy-mutable-if-needed"
5
7
  import type { Store } from "./store"
@@ -25,23 +27,19 @@ export function cacheValue<T>(
25
27
  ): Future<T> | T {
26
28
  const currentValue = target.valueMap.get(key)
27
29
  if (currentValue instanceof Future) {
28
- currentValue.cancel()
30
+ const future = currentValue
31
+ future.use(value)
29
32
  }
30
33
  if (value instanceof Promise) {
31
34
  const future = new Future<T>(value)
32
35
  target.valueMap.set(key, future)
33
36
  future
34
37
  .then((resolved) => {
35
- if (future.isCanceled) {
36
- return
37
- }
38
38
  cacheValue(key, resolved, subject, target)
39
39
  subject.next({ newValue: resolved, oldValue: future })
40
40
  })
41
41
  .catch((thrown) => {
42
- if (thrown !== `canceled`) {
43
- target.logger.error(`💥`, `state`, key, `rejected:`, thrown)
44
- }
42
+ target.logger.error(`💥`, `state`, key, `rejected:`, thrown)
45
43
  })
46
44
  return future
47
45
  }
@@ -65,7 +63,13 @@ export const readCachedValue = <T>(
65
63
  export const evictCachedValue = (key: string, target: Store): void => {
66
64
  const currentValue = target.valueMap.get(key)
67
65
  if (currentValue instanceof Future) {
68
- currentValue.cancel()
66
+ const future = currentValue
67
+ const selector =
68
+ target.selectors.get(key) ?? target.readonlySelectors.get(key)
69
+ if (selector) {
70
+ future.use(selector.get())
71
+ }
72
+ return
69
73
  }
70
74
  if (target.operation.open) {
71
75
  target.operation.prev.set(key, currentValue)
@@ -6,7 +6,7 @@ import type {
6
6
  } from "atom.io"
7
7
  import type { Json } from "atom.io/json"
8
8
 
9
- import { type Transceiver, createMutableAtomFamily } from "../mutable"
9
+ import { createMutableAtomFamily, type Transceiver } from "../mutable"
10
10
  import type { Store } from "../store"
11
11
  import { createRegularAtomFamily } from "./create-regular-atom-family"
12
12
 
@@ -1,5 +1,3 @@
1
- import type { Json } from "atom.io/json"
2
-
3
1
  import type {
4
2
  AtomFamilyToken,
5
3
  AtomToken,
@@ -18,6 +16,8 @@ import type {
18
16
  WritableSelectorToken,
19
17
  WritableToken,
20
18
  } from "atom.io"
19
+ import type { Json } from "atom.io/json"
20
+
21
21
  import type { Transceiver } from "../mutable"
22
22
  import { NotFoundError } from "../not-found-error"
23
23
  import type { Store } from "../store"