atom.io 0.24.6 → 0.24.8

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.
@@ -765,6 +765,20 @@ function createAtomFamily(options, store) {
765
765
  return createRegularAtomFamily(options, store);
766
766
  }
767
767
 
768
+ // internal/src/get-state/get-from-store.ts
769
+ function getFromStore(token, store) {
770
+ if (token.type === `molecule`) {
771
+ try {
772
+ const molecule = withdraw(token, store);
773
+ return molecule.instance;
774
+ } catch (_) {
775
+ return void 0;
776
+ }
777
+ }
778
+ const state = withdraw(token, store);
779
+ return readOrComputeValue(state, store);
780
+ }
781
+
768
782
  // internal/src/keys.ts
769
783
  var isAtomKey = (key, store) => newest(store).atoms.has(key);
770
784
  var isSelectorKey = (key, store) => newest(store).selectors.has(key);
@@ -778,21 +792,18 @@ var getSelectorDependencyKeys = (key, store) => {
778
792
  };
779
793
 
780
794
  // internal/src/selector/trace-selector-atoms.ts
781
- var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
795
+ var traceSelectorAtoms = (directDependencyKey, covered, store) => {
782
796
  const rootKeys = [];
783
797
  const indirectDependencyKeys = getSelectorDependencyKeys(
784
798
  directDependencyKey,
785
799
  store
786
800
  );
787
- let depth = 0;
788
801
  while (indirectDependencyKeys.length > 0) {
789
802
  const indirectDependencyKey = indirectDependencyKeys.shift();
790
- ++depth;
791
- if (depth > 99999) {
792
- throw new Error(
793
- `Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
794
- );
803
+ if (covered.has(indirectDependencyKey)) {
804
+ continue;
795
805
  }
806
+ covered.add(indirectDependencyKey);
796
807
  if (!isAtomKey(indirectDependencyKey, store)) {
797
808
  indirectDependencyKeys.push(
798
809
  ...getSelectorDependencyKeys(indirectDependencyKey, store)
@@ -806,13 +817,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
806
817
  var traceAllSelectorAtoms = (selector, store) => {
807
818
  const selectorKey = selector.key;
808
819
  const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
820
+ const covered = /* @__PURE__ */ new Set();
809
821
  return directDependencyKeys.flatMap(
810
- (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(selectorKey, depKey, store)
822
+ (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
811
823
  );
812
824
  };
813
825
 
814
826
  // internal/src/selector/update-selector-atoms.ts
815
- var updateSelectorAtoms = (selectorKey, dependency, store) => {
827
+ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
816
828
  const target = newest(store);
817
829
  if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
818
830
  target.selectorAtoms.set({
@@ -826,7 +838,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
826
838
  `discovers root atom "${dependency.key}"`
827
839
  );
828
840
  } else {
829
- const rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store);
841
+ const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
830
842
  store.logger.info(
831
843
  `\u{1F50D}`,
832
844
  `selector`,
@@ -840,12 +852,16 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
840
852
  });
841
853
  }
842
854
  }
855
+ covered.add(dependency.key);
843
856
  };
844
857
 
845
858
  // internal/src/selector/register-selector.ts
846
- var registerSelector = (selectorKey, store) => ({
859
+ var registerSelector = (selectorKey, covered, store) => ({
847
860
  get: (dependency) => {
848
861
  const target = newest(store);
862
+ if (dependency.type === `molecule`) {
863
+ return getFromStore(dependency, store);
864
+ }
849
865
  const dependencyState = withdraw(dependency, store);
850
866
  const dependencyValue = readOrComputeValue(dependencyState, store);
851
867
  store.logger.info(
@@ -865,7 +881,7 @@ var registerSelector = (selectorKey, store) => ({
865
881
  source: dependency.key
866
882
  }
867
883
  );
868
- updateSelectorAtoms(selectorKey, dependency, store);
884
+ updateSelectorAtoms(selectorKey, dependency, covered, store);
869
885
  return dependencyValue;
870
886
  },
871
887
  set: (WritableToken, newValue) => {
@@ -882,10 +898,16 @@ var registerSelector = (selectorKey, store) => ({
882
898
  var createReadonlySelector = (options, family, store) => {
883
899
  const target = newest(store);
884
900
  const subject = new Subject();
885
- const { get, find, seek, json } = registerSelector(options.key, target);
901
+ const covered = /* @__PURE__ */ new Set();
902
+ const { get, find, seek, json } = registerSelector(
903
+ options.key,
904
+ covered,
905
+ target
906
+ );
886
907
  const getSelf = () => {
887
908
  const value = options.get({ get, find, seek, json });
888
909
  cacheValue(options.key, value, subject, newest(store));
910
+ covered.clear();
889
911
  return value;
890
912
  };
891
913
  const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
@@ -917,12 +939,14 @@ var createReadonlySelector = (options, family, store) => {
917
939
  var createWritableSelector = (options, family, store) => {
918
940
  const target = newest(store);
919
941
  const subject = new Subject();
920
- const transactors = registerSelector(options.key, target);
942
+ const covered = /* @__PURE__ */ new Set();
943
+ const transactors = registerSelector(options.key, covered, target);
921
944
  const { find, get, seek, json } = transactors;
922
945
  const readonlyTransactors = { find, get, seek, json };
923
946
  const getSelf = (innerTarget = newest(store)) => {
924
947
  const value = options.get(readonlyTransactors);
925
948
  cacheValue(options.key, value, subject, innerTarget);
949
+ covered.clear();
926
950
  return value;
927
951
  };
928
952
  const setSelf = (next) => {
@@ -1323,20 +1347,6 @@ function getEnvironmentData(store) {
1323
1347
  store
1324
1348
  };
1325
1349
  }
1326
-
1327
- // internal/src/get-state/get-from-store.ts
1328
- function getFromStore(token, store) {
1329
- if (token.type === `molecule`) {
1330
- try {
1331
- const molecule = withdraw(token, store);
1332
- return molecule.instance;
1333
- } catch (_) {
1334
- return void 0;
1335
- }
1336
- }
1337
- const state = withdraw(token, store);
1338
- return readOrComputeValue(state, store);
1339
- }
1340
1350
  var Molecule = class {
1341
1351
  constructor(ctx, key, family) {
1342
1352
  this.key = key;
@@ -523,12 +523,12 @@ declare function disposeSelector(selectorToken: ReadonlySelectorToken<unknown> |
523
523
 
524
524
  declare const getSelectorDependencyKeys: (key: string, store: Store) => (AtomKey<unknown> | ReadonlySelectorKey<unknown> | SelectorKey<unknown>)[];
525
525
 
526
- declare const registerSelector: (selectorKey: string, store: Store) => Transactors;
526
+ declare const registerSelector: (selectorKey: string, covered: Set<string>, store: Store) => Transactors;
527
527
 
528
- declare const traceSelectorAtoms: (selectorKey: string, directDependencyKey: StateKey<unknown>, store: Store) => AtomKey<unknown>[];
528
+ declare const traceSelectorAtoms: (directDependencyKey: StateKey<unknown>, covered: Set<string>, store: Store) => AtomKey<unknown>[];
529
529
  declare const traceAllSelectorAtoms: (selector: Selector<any>, store: Store) => AtomKey<unknown>[];
530
530
 
531
- declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, store: Store) => void;
531
+ declare const updateSelectorAtoms: (selectorKey: string, dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>, covered: Set<string>, store: Store) => void;
532
532
 
533
533
  type Modify<T> = (thing: T) => T;
534
534
  declare const become: <T>(nextVersionOfThing: Modify<T> | T) => (originalThing: T) => T;
@@ -490,6 +490,20 @@ function createAtomFamily(options, store) {
490
490
  return createRegularAtomFamily(options, store);
491
491
  }
492
492
 
493
+ // internal/src/get-state/get-from-store.ts
494
+ function getFromStore(token, store) {
495
+ if (token.type === `molecule`) {
496
+ try {
497
+ const molecule = withdraw(token, store);
498
+ return molecule.instance;
499
+ } catch (_) {
500
+ return void 0;
501
+ }
502
+ }
503
+ const state = withdraw(token, store);
504
+ return readOrComputeValue(state, store);
505
+ }
506
+
493
507
  // internal/src/keys.ts
494
508
  var isAtomKey = (key, store) => newest(store).atoms.has(key);
495
509
  var isSelectorKey = (key, store) => newest(store).selectors.has(key);
@@ -503,21 +517,18 @@ var getSelectorDependencyKeys = (key, store) => {
503
517
  };
504
518
 
505
519
  // internal/src/selector/trace-selector-atoms.ts
506
- var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
520
+ var traceSelectorAtoms = (directDependencyKey, covered, store) => {
507
521
  const rootKeys = [];
508
522
  const indirectDependencyKeys = getSelectorDependencyKeys(
509
523
  directDependencyKey,
510
524
  store
511
525
  );
512
- let depth = 0;
513
526
  while (indirectDependencyKeys.length > 0) {
514
527
  const indirectDependencyKey = indirectDependencyKeys.shift();
515
- ++depth;
516
- if (depth > 99999) {
517
- throw new Error(
518
- `Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
519
- );
528
+ if (covered.has(indirectDependencyKey)) {
529
+ continue;
520
530
  }
531
+ covered.add(indirectDependencyKey);
521
532
  if (!isAtomKey(indirectDependencyKey, store)) {
522
533
  indirectDependencyKeys.push(
523
534
  ...getSelectorDependencyKeys(indirectDependencyKey, store)
@@ -531,13 +542,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
531
542
  var traceAllSelectorAtoms = (selector, store) => {
532
543
  const selectorKey = selector.key;
533
544
  const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
545
+ const covered = /* @__PURE__ */ new Set();
534
546
  return directDependencyKeys.flatMap(
535
- (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(selectorKey, depKey, store)
547
+ (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
536
548
  );
537
549
  };
538
550
 
539
551
  // internal/src/selector/update-selector-atoms.ts
540
- var updateSelectorAtoms = (selectorKey, dependency, store) => {
552
+ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
541
553
  const target = newest(store);
542
554
  if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
543
555
  target.selectorAtoms.set({
@@ -551,7 +563,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
551
563
  `discovers root atom "${dependency.key}"`
552
564
  );
553
565
  } else {
554
- const rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store);
566
+ const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
555
567
  store.logger.info(
556
568
  `\u{1F50D}`,
557
569
  `selector`,
@@ -565,12 +577,16 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
565
577
  });
566
578
  }
567
579
  }
580
+ covered.add(dependency.key);
568
581
  };
569
582
 
570
583
  // internal/src/selector/register-selector.ts
571
- var registerSelector = (selectorKey, store) => ({
584
+ var registerSelector = (selectorKey, covered, store) => ({
572
585
  get: (dependency) => {
573
586
  const target = newest(store);
587
+ if (dependency.type === `molecule`) {
588
+ return getFromStore(dependency, store);
589
+ }
574
590
  const dependencyState = withdraw(dependency, store);
575
591
  const dependencyValue = readOrComputeValue(dependencyState, store);
576
592
  store.logger.info(
@@ -590,7 +606,7 @@ var registerSelector = (selectorKey, store) => ({
590
606
  source: dependency.key
591
607
  }
592
608
  );
593
- updateSelectorAtoms(selectorKey, dependency, store);
609
+ updateSelectorAtoms(selectorKey, dependency, covered, store);
594
610
  return dependencyValue;
595
611
  },
596
612
  set: (WritableToken, newValue) => {
@@ -607,10 +623,16 @@ var registerSelector = (selectorKey, store) => ({
607
623
  var createReadonlySelector = (options, family, store) => {
608
624
  const target = newest(store);
609
625
  const subject = new Subject();
610
- const { get, find, seek, json } = registerSelector(options.key, target);
626
+ const covered = /* @__PURE__ */ new Set();
627
+ const { get, find, seek, json } = registerSelector(
628
+ options.key,
629
+ covered,
630
+ target
631
+ );
611
632
  const getSelf = () => {
612
633
  const value = options.get({ get, find, seek, json });
613
634
  cacheValue(options.key, value, subject, newest(store));
635
+ covered.clear();
614
636
  return value;
615
637
  };
616
638
  const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
@@ -642,12 +664,14 @@ var createReadonlySelector = (options, family, store) => {
642
664
  var createWritableSelector = (options, family, store) => {
643
665
  const target = newest(store);
644
666
  const subject = new Subject();
645
- const transactors = registerSelector(options.key, target);
667
+ const covered = /* @__PURE__ */ new Set();
668
+ const transactors = registerSelector(options.key, covered, target);
646
669
  const { find, get, seek, json } = transactors;
647
670
  const readonlyTransactors = { find, get, seek, json };
648
671
  const getSelf = (innerTarget = newest(store)) => {
649
672
  const value = options.get(readonlyTransactors);
650
673
  cacheValue(options.key, value, subject, innerTarget);
674
+ covered.clear();
651
675
  return value;
652
676
  };
653
677
  const setSelf = (next) => {
@@ -1048,20 +1072,6 @@ function getEnvironmentData(store) {
1048
1072
  store
1049
1073
  };
1050
1074
  }
1051
-
1052
- // internal/src/get-state/get-from-store.ts
1053
- function getFromStore(token, store) {
1054
- if (token.type === `molecule`) {
1055
- try {
1056
- const molecule = withdraw(token, store);
1057
- return molecule.instance;
1058
- } catch (_) {
1059
- return void 0;
1060
- }
1061
- }
1062
- const state = withdraw(token, store);
1063
- return readOrComputeValue(state, store);
1064
- }
1065
1075
  var Molecule = class {
1066
1076
  constructor(ctx, key, family) {
1067
1077
  this.key = key;
@@ -18,11 +18,16 @@ export const createReadonlySelector = <T>(
18
18
  ): ReadonlySelectorToken<T> => {
19
19
  const target = newest(store)
20
20
  const subject = new Subject<{ newValue: T; oldValue: T }>()
21
-
22
- const { get, find, seek, json } = registerSelector(options.key, target)
21
+ const covered = new Set<string>()
22
+ const { get, find, seek, json } = registerSelector(
23
+ options.key,
24
+ covered,
25
+ target,
26
+ )
23
27
  const getSelf = () => {
24
28
  const value = options.get({ get, find, seek, json })
25
29
  cacheValue(options.key, value, subject, newest(store))
30
+ covered.clear()
26
31
  return value
27
32
  }
28
33
 
@@ -21,13 +21,15 @@ export const createWritableSelector = <T>(
21
21
  ): WritableSelectorToken<T> => {
22
22
  const target = newest(store)
23
23
  const subject = new Subject<{ newValue: T; oldValue: T }>()
24
- const transactors = registerSelector(options.key, target)
24
+ const covered = new Set<string>()
25
+ const transactors = registerSelector(options.key, covered, target)
25
26
  const { find, get, seek, json } = transactors
26
27
  const readonlyTransactors = { find, get, seek, json }
27
28
 
28
29
  const getSelf = (innerTarget = newest(store)): T => {
29
30
  const value = options.get(readonlyTransactors)
30
31
  cacheValue(options.key, value, subject, innerTarget)
32
+ covered.clear()
31
33
  return value
32
34
  }
33
35
 
@@ -1,8 +1,14 @@
1
- import type { Transactors } from "atom.io"
1
+ import type {
2
+ MoleculeConstructor,
3
+ MoleculeToken,
4
+ ReadableToken,
5
+ Transactors,
6
+ } from "atom.io"
2
7
  import type { findState } from "atom.io/ephemeral"
3
8
  import type { seekState } from "atom.io/immortal"
4
9
 
5
10
  import { findInStore, seekInStore } from "../families"
11
+ import { getFromStore } from "../get-state"
6
12
  import { readOrComputeValue } from "../get-state/read-or-compute-value"
7
13
  import { newest } from "../lineage"
8
14
  import { getJsonToken } from "../mutable"
@@ -13,11 +19,16 @@ import { updateSelectorAtoms } from "./update-selector-atoms"
13
19
 
14
20
  export const registerSelector = (
15
21
  selectorKey: string,
22
+ covered: Set<string>,
16
23
  store: Store,
17
24
  ): Transactors => ({
18
- get: (dependency) => {
25
+ get: (dependency: MoleculeToken<MoleculeConstructor> | ReadableToken<any>) => {
19
26
  const target = newest(store)
20
27
 
28
+ if (dependency.type === `molecule`) {
29
+ return getFromStore(dependency, store)
30
+ }
31
+
21
32
  const dependencyState = withdraw(dependency, store)
22
33
  const dependencyValue = readOrComputeValue(dependencyState, store)
23
34
 
@@ -39,7 +50,7 @@ export const registerSelector = (
39
50
  source: dependency.key,
40
51
  },
41
52
  )
42
- updateSelectorAtoms(selectorKey, dependency, store)
53
+ updateSelectorAtoms(selectorKey, dependency, covered, store)
43
54
  return dependencyValue
44
55
  },
45
56
  set: (WritableToken, newValue) => {
@@ -4,8 +4,8 @@ import { isAtomKey } from "../keys"
4
4
  import { getSelectorDependencyKeys } from "./get-selector-dependency-keys"
5
5
 
6
6
  export const traceSelectorAtoms = (
7
- selectorKey: string,
8
7
  directDependencyKey: StateKey<unknown>,
8
+ covered: Set<string>,
9
9
  store: Store,
10
10
  ): AtomKey<unknown>[] => {
11
11
  const rootKeys: AtomKey<unknown>[] = []
@@ -14,16 +14,13 @@ export const traceSelectorAtoms = (
14
14
  directDependencyKey,
15
15
  store,
16
16
  )
17
- let depth = 0
18
17
  while (indirectDependencyKeys.length > 0) {
19
18
  // biome-ignore lint/style/noNonNullAssertion: just checked length ^^^
20
19
  const indirectDependencyKey = indirectDependencyKeys.shift()!
21
- ++depth
22
- if (depth > 99999) {
23
- throw new Error(
24
- `Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`,
25
- )
20
+ if (covered.has(indirectDependencyKey)) {
21
+ continue
26
22
  }
23
+ covered.add(indirectDependencyKey)
27
24
 
28
25
  if (!isAtomKey(indirectDependencyKey, store)) {
29
26
  indirectDependencyKeys.push(
@@ -43,9 +40,10 @@ export const traceAllSelectorAtoms = (
43
40
  ): AtomKey<unknown>[] => {
44
41
  const selectorKey = selector.key
45
42
  const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store)
43
+ const covered = new Set<string>()
46
44
  return directDependencyKeys.flatMap((depKey) =>
47
45
  isAtomKey(depKey, store)
48
46
  ? depKey
49
- : traceSelectorAtoms(selectorKey, depKey, store),
47
+ : traceSelectorAtoms(depKey, covered, store),
50
48
  )
51
49
  }
@@ -7,6 +7,7 @@ import { traceSelectorAtoms } from "./trace-selector-atoms"
7
7
  export const updateSelectorAtoms = (
8
8
  selectorKey: string,
9
9
  dependency: ReadonlySelectorToken<unknown> | WritableToken<unknown>,
10
+ covered: Set<string>,
10
11
  store: Store,
11
12
  ): void => {
12
13
  const target = newest(store)
@@ -22,7 +23,7 @@ export const updateSelectorAtoms = (
22
23
  `discovers root atom "${dependency.key}"`,
23
24
  )
24
25
  } else {
25
- const rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store)
26
+ const rootKeys = traceSelectorAtoms(dependency.key, covered, store)
26
27
  store.logger.info(
27
28
  `🔍`,
28
29
  `selector`,
@@ -38,4 +39,5 @@ export const updateSelectorAtoms = (
38
39
  })
39
40
  }
40
41
  }
42
+ covered.add(dependency.key)
41
43
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.24.6",
3
+ "version": "0.24.8",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -56,8 +56,8 @@
56
56
  "@types/npmlog": "7.0.0",
57
57
  "@types/react": "18.3.3",
58
58
  "@types/tmp": "0.2.6",
59
- "@typescript-eslint/parser": "7.13.1",
60
- "@typescript-eslint/rule-tester": "7.13.1",
59
+ "@typescript-eslint/parser": "7.14.1",
60
+ "@typescript-eslint/rule-tester": "7.14.1",
61
61
  "@vitest/coverage-v8": "1.6.0",
62
62
  "@vitest/ui": "1.6.0",
63
63
  "concurrently": "8.2.2",
@@ -65,7 +65,7 @@
65
65
  "drizzle-orm": "0.31.2",
66
66
  "eslint": "npm:eslint@8.57.0",
67
67
  "eslint-v9": "npm:eslint@9.5.0",
68
- "framer-motion": "11.2.11",
68
+ "framer-motion": "11.2.12",
69
69
  "happy-dom": "14.12.3",
70
70
  "http-proxy": "1.18.1",
71
71
  "npmlog": "7.0.1",
@@ -73,7 +73,7 @@
73
73
  "preact": "10.22.0",
74
74
  "react": "18.3.1",
75
75
  "react-dom": "18.3.1",
76
- "react-router-dom": "6.23.1",
76
+ "react-router-dom": "6.24.0",
77
77
  "socket.io": "4.7.5",
78
78
  "socket.io-client": "4.7.5",
79
79
  "tmp": "0.2.3",