atom.io 0.21.1 → 0.22.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 (92) hide show
  1. package/data/dist/index.cjs +136 -63
  2. package/data/dist/index.d.ts +6 -0
  3. package/data/dist/index.js +3 -3
  4. package/data/src/join.ts +135 -51
  5. package/data/src/struct-family.ts +2 -2
  6. package/dist/{chunk-RT43TVKP.js → chunk-GVHKIJ3G.js} +1 -1
  7. package/dist/{chunk-HITX3MO4.js → chunk-JA4V7TJY.js} +135 -62
  8. package/dist/index.cjs +2 -7
  9. package/dist/index.d.ts +29 -14
  10. package/dist/index.js +4 -8
  11. package/ephemeral/dist/index.cjs +11 -0
  12. package/ephemeral/dist/index.js +9 -0
  13. package/ephemeral/package.json +16 -0
  14. package/ephemeral/src/index.ts +1 -0
  15. package/eslint-plugin/dist/index.cjs +156 -1
  16. package/eslint-plugin/dist/index.js +156 -1
  17. package/eslint-plugin/src/rules/index.ts +1 -0
  18. package/eslint-plugin/src/rules/lifespan.ts +204 -0
  19. package/eslint-plugin/src/rules/synchronous-selector-dependencies.ts +1 -65
  20. package/eslint-plugin/src/walk.ts +73 -0
  21. package/immortal/dist/index.cjs +100 -0
  22. package/immortal/dist/index.js +97 -0
  23. package/immortal/package.json +16 -0
  24. package/immortal/src/index.ts +2 -0
  25. package/immortal/src/molecule.ts +134 -0
  26. package/immortal/src/seek-state.ts +60 -0
  27. package/internal/dist/index.cjs +186 -146
  28. package/internal/dist/index.d.ts +29 -13
  29. package/internal/dist/index.js +185 -146
  30. package/internal/src/atom/dispose-atom.ts +4 -1
  31. package/internal/src/families/create-readonly-selector-family.ts +9 -9
  32. package/internal/src/families/create-regular-atom-family.ts +15 -20
  33. package/internal/src/families/create-writable-selector-family.ts +6 -7
  34. package/internal/src/families/find-in-store.ts +11 -5
  35. package/internal/src/families/index.ts +2 -0
  36. package/internal/src/families/init-family-member.ts +91 -0
  37. package/internal/src/families/seek-in-store.ts +106 -0
  38. package/internal/src/get-state/get-from-store.ts +2 -2
  39. package/internal/src/mutable/create-mutable-atom-family.ts +17 -23
  40. package/internal/src/mutable/create-mutable-atom.ts +3 -1
  41. package/internal/src/mutable/get-json-family.ts +2 -2
  42. package/internal/src/mutable/get-json-token.ts +27 -12
  43. package/internal/src/mutable/tracker-family.ts +14 -12
  44. package/internal/src/not-found-error.ts +11 -3
  45. package/internal/src/selector/create-readonly-selector.ts +2 -2
  46. package/internal/src/selector/create-writable-selector.ts +2 -2
  47. package/internal/src/selector/dispose-selector.ts +40 -23
  48. package/internal/src/selector/register-selector.ts +8 -5
  49. package/internal/src/set-state/set-into-store.ts +2 -2
  50. package/internal/src/store/index.ts +0 -1
  51. package/internal/src/store/store.ts +18 -5
  52. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  53. package/internal/src/transaction/build-transaction.ts +7 -2
  54. package/introspection/dist/index.cjs +38 -52
  55. package/introspection/dist/index.js +38 -52
  56. package/introspection/src/attach-atom-index.ts +38 -48
  57. package/introspection/src/attach-selector-index.ts +45 -50
  58. package/json/dist/index.cjs +38 -4
  59. package/json/dist/index.js +40 -6
  60. package/json/src/select-json-family.ts +46 -7
  61. package/package.json +30 -10
  62. package/react/dist/index.cjs +1 -1
  63. package/react/dist/index.js +1 -1
  64. package/react/src/use-json.ts +1 -1
  65. package/react-devtools/dist/index.cjs +11 -10
  66. package/react-devtools/dist/index.js +2 -1
  67. package/react-devtools/src/StateIndex.tsx +2 -1
  68. package/react-devtools/src/TimelineIndex.tsx +2 -1
  69. package/react-devtools/src/TransactionIndex.tsx +7 -7
  70. package/realtime-client/dist/index.cjs +3 -3
  71. package/realtime-client/dist/index.js +3 -3
  72. package/realtime-client/src/pull-mutable-atom-family-member.ts +1 -1
  73. package/realtime-client/src/pull-mutable-atom.ts +1 -1
  74. package/realtime-client/src/sync-continuity.ts +1 -2
  75. package/realtime-react/dist/index.cjs +1 -1
  76. package/realtime-react/dist/index.js +1 -1
  77. package/realtime-server/dist/index.cjs +18 -17
  78. package/realtime-server/dist/index.js +7 -6
  79. package/realtime-server/src/realtime-continuity-synchronizer.ts +5 -3
  80. package/realtime-server/src/realtime-mutable-family-provider.ts +2 -1
  81. package/realtime-server/src/realtime-mutable-provider.ts +1 -1
  82. package/realtime-testing/dist/index.cjs +6 -2
  83. package/realtime-testing/dist/index.js +8 -5
  84. package/realtime-testing/src/setup-realtime-test.tsx +5 -2
  85. package/src/atom.ts +10 -4
  86. package/src/index.ts +1 -2
  87. package/src/selector.ts +10 -4
  88. package/src/silo.ts +3 -3
  89. package/src/transaction.ts +5 -2
  90. package/internal/src/store/withdraw-new-family-member.ts +0 -69
  91. /package/{src → ephemeral/src}/find-state.ts +0 -0
  92. /package/src/{dispose.ts → dispose-state.ts} +0 -0
@@ -391,7 +391,7 @@ function isChildStore(store) {
391
391
 
392
392
  // internal/src/store/store.ts
393
393
  var Store = class {
394
- constructor(name, store = null) {
394
+ constructor(config, store = null) {
395
395
  this.parent = null;
396
396
  this.child = null;
397
397
  this.valueMap = /* @__PURE__ */ new Map();
@@ -420,6 +420,8 @@ var Store = class {
420
420
  makeContentKey: (...keys) => keys.sort().join(`:`)
421
421
  }
422
422
  );
423
+ this.molecules = /* @__PURE__ */ new Map();
424
+ this.miscResources = /* @__PURE__ */ new Map();
423
425
  this.on = {
424
426
  atomCreation: new Subject(),
425
427
  atomDisposal: new Subject(),
@@ -441,7 +443,8 @@ var Store = class {
441
443
  })
442
444
  };
443
445
  this.config = {
444
- name: `IMPLICIT_STORE`
446
+ name: `IMPLICIT_STORE`,
447
+ lifespan: `ephemeral`
445
448
  };
446
449
  this.loggers = [
447
450
  new atom_io.AtomIOLogger(`warn`, (_, __, key) => !key.includes(`\u{1F441}\u200D\u{1F5E8}`))
@@ -471,9 +474,7 @@ var Store = class {
471
474
  )
472
475
  };
473
476
  }
474
- this.config = __spreadProps(__spreadValues({}, store == null ? void 0 : store.config), {
475
- name
476
- });
477
+ this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
477
478
  for (const [, family] of store.families) {
478
479
  family.install(this);
479
480
  }
@@ -484,7 +485,7 @@ var Store = class {
484
485
  }
485
486
  atom.install(this);
486
487
  if (atom.type === `mutable_atom`) {
487
- const originalJsonToken = getJsonToken(atom);
488
+ const originalJsonToken = getJsonToken(atom, store);
488
489
  const originalUpdateToken = getUpdateToken(atom);
489
490
  mutableHelpers.add(originalJsonToken.key);
490
491
  mutableHelpers.add(originalUpdateToken.key);
@@ -512,12 +513,18 @@ var IMPLICIT = {
512
513
  STORE_INTERNAL: void 0,
513
514
  get STORE() {
514
515
  var _a;
515
- return (_a = this.STORE_INTERNAL) != null ? _a : this.STORE_INTERNAL = new Store(`IMPLICIT_STORE`);
516
+ return (_a = this.STORE_INTERNAL) != null ? _a : this.STORE_INTERNAL = new Store({
517
+ name: `IMPLICIT_STORE`,
518
+ lifespan: `ephemeral`
519
+ });
516
520
  }
517
521
  };
518
522
  var clearStore = (store) => {
519
523
  const { config } = store;
520
- Object.assign(store, new Store(config.name));
524
+ for (const disposable of store.miscResources.values()) {
525
+ disposable[Symbol.dispose]();
526
+ }
527
+ Object.assign(store, new Store(config));
521
528
  store.config = config;
522
529
  };
523
530
 
@@ -558,36 +565,6 @@ function withdraw(token, store) {
558
565
  throw new NotFoundError(token, store);
559
566
  }
560
567
 
561
- // internal/src/store/withdraw-new-family-member.ts
562
- function withdrawOrCreate(token, store) {
563
- try {
564
- const state = withdraw(token, store);
565
- return state;
566
- } catch (notFoundError) {
567
- if (token.family) {
568
- store.logger.info(
569
- `\u{1F46A}`,
570
- token.type,
571
- token.key,
572
- `creating new family member in store "${store.config.name}"`
573
- );
574
- const target = newest(store);
575
- const family = target.families.get(token.family.key);
576
- if (family) {
577
- const jsonSubKey = JSON.parse(token.family.subKey);
578
- family(jsonSubKey);
579
- const state = withdraw(token, store);
580
- return state;
581
- }
582
- throw new NotFoundError(
583
- { key: token.family.key, type: `${token.type}_family` },
584
- store
585
- );
586
- }
587
- throw notFoundError;
588
- }
589
- }
590
-
591
568
  // internal/src/get-state/read-or-compute-value.ts
592
569
  var readOrComputeValue = (state, target) => {
593
570
  if (target.valueMap.has(state.key)) {
@@ -615,22 +592,17 @@ function createRegularAtomFamily(options, store) {
615
592
  const subKey = json.stringifyJson(key);
616
593
  const family = { key: options.key, subKey };
617
594
  const fullKey = `${options.key}(${subKey})`;
618
- const target2 = newest(store);
619
- const atomAlreadyCreated = target2.atoms.has(fullKey);
620
- let token;
621
- if (atomAlreadyCreated) {
622
- token = { type: `atom`, key: fullKey, family };
623
- } else {
624
- const individualOptions = {
625
- key: fullKey,
626
- default: options.default instanceof Function ? options.default(key) : options.default
627
- };
628
- if (options.effects) {
629
- individualOptions.effects = options.effects(key);
630
- }
631
- token = createRegularAtom(individualOptions, family, store);
632
- subject.next(token);
595
+ const target = newest(store);
596
+ const def = options.default;
597
+ const individualOptions = {
598
+ key: fullKey,
599
+ default: def instanceof Function ? def(key) : def
600
+ };
601
+ if (options.effects) {
602
+ individualOptions.effects = options.effects(key);
633
603
  }
604
+ const token = createRegularAtom(individualOptions, family, target);
605
+ subject.next(token);
634
606
  return token;
635
607
  },
636
608
  {
@@ -640,8 +612,7 @@ function createRegularAtomFamily(options, store) {
640
612
  install: (s) => createRegularAtomFamily(options, s)
641
613
  }
642
614
  );
643
- const target = newest(store);
644
- target.families.set(options.key, atomFamily);
615
+ store.families.set(options.key, atomFamily);
645
616
  return atomFamily;
646
617
  }
647
618
 
@@ -657,22 +628,20 @@ function createReadonlySelectorFamily(options, store) {
657
628
  const subject = new Subject();
658
629
  const readonlySelectorFamily = Object.assign(
659
630
  (key) => {
660
- const target = newest(store);
661
631
  const subKey = json.stringifyJson(key);
662
632
  const family = { key: options.key, subKey };
663
633
  const fullKey = `${options.key}(${subKey})`;
664
- const existing = target.readonlySelectors.get(fullKey);
665
- if (existing) {
666
- return deposit(existing);
667
- }
668
- return createReadonlySelector(
634
+ const target = newest(store);
635
+ const token = createReadonlySelector(
669
636
  {
670
637
  key: fullKey,
671
638
  get: options.get(key)
672
639
  },
673
640
  family,
674
- store
641
+ target
675
642
  );
643
+ subject.next(token);
644
+ return token;
676
645
  },
677
646
  {
678
647
  key: options.key,
@@ -691,10 +660,7 @@ function createWritableSelectorFamily(options, store) {
691
660
  const subKey = json.stringifyJson(key);
692
661
  const family = { key: options.key, subKey };
693
662
  const fullKey = `${options.key}(${subKey})`;
694
- const existing = store.selectors.get(fullKey);
695
- if (existing) {
696
- return deposit(existing);
697
- }
663
+ const target = newest(store);
698
664
  const token = createWritableSelector(
699
665
  {
700
666
  key: fullKey,
@@ -702,7 +668,7 @@ function createWritableSelectorFamily(options, store) {
702
668
  set: options.set(key)
703
669
  },
704
670
  family,
705
- store
671
+ target
706
672
  );
707
673
  subject.next(token);
708
674
  return token;
@@ -730,10 +696,18 @@ function createSelectorFamily(options, store) {
730
696
  // internal/src/not-found-error.ts
731
697
  var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
732
698
  function prettyPrintTokenType(token) {
733
- if (token.type === `readonly_selector`) {
734
- return `Readonly Selector`;
699
+ switch (token.type) {
700
+ case `atom_family`:
701
+ return `Atom Family`;
702
+ case `readonly_selector`:
703
+ return `Readonly Selector`;
704
+ case `readonly_selector_family`:
705
+ return `Readonly Selector Family`;
706
+ case `selector_family`:
707
+ return `Selector Family`;
708
+ default:
709
+ return capitalize(token.type);
735
710
  }
736
- return capitalize(token.type);
737
711
  }
738
712
  var NotFoundError = class extends Error {
739
713
  constructor(token, store) {
@@ -743,8 +717,8 @@ var NotFoundError = class extends Error {
743
717
  }
744
718
  };
745
719
 
746
- // internal/src/families/find-in-store.ts
747
- function findInStore(token, key, store) {
720
+ // internal/src/families/init-family-member.ts
721
+ function initFamilyMember(token, key, store) {
748
722
  const familyKey = token.key;
749
723
  const family = store.families.get(familyKey);
750
724
  if (family === void 0) {
@@ -753,6 +727,44 @@ function findInStore(token, key, store) {
753
727
  const state = family(key);
754
728
  return state;
755
729
  }
730
+ function seekInStore(token, key, store) {
731
+ const subKey = json.stringifyJson(key);
732
+ const fullKey = `${token.key}(${subKey})`;
733
+ const target = newest(store);
734
+ let state;
735
+ switch (token.type) {
736
+ case `atom_family`:
737
+ case `mutable_atom_family`:
738
+ state = target.atoms.get(fullKey);
739
+ break;
740
+ case `selector_family`: {
741
+ state = target.selectors.get(fullKey);
742
+ break;
743
+ }
744
+ case `readonly_selector_family`:
745
+ state = target.readonlySelectors.get(fullKey);
746
+ break;
747
+ }
748
+ if (state) {
749
+ return deposit(state);
750
+ }
751
+ return state;
752
+ }
753
+
754
+ // internal/src/families/find-in-store.ts
755
+ function findInStore(token, key, store) {
756
+ if (store.config.lifespan === `immortal`) {
757
+ throw new Error(
758
+ `Do not use \`find\` or \`findState\` in an immortal store. Prefer \`seek\` or \`seekState\`.`
759
+ );
760
+ }
761
+ let state = seekInStore(token, key, store);
762
+ if (state) {
763
+ return state;
764
+ }
765
+ state = initFamilyMember(token, key, store);
766
+ return state;
767
+ }
756
768
 
757
769
  // internal/src/set-state/become.ts
758
770
  var become = (nextVersionOfThing) => (originalThing) => nextVersionOfThing instanceof Function ? nextVersionOfThing(
@@ -995,7 +1007,7 @@ function setIntoStore(token, value, store) {
995
1007
  );
996
1008
  return;
997
1009
  }
998
- const state = withdrawOrCreate(token, store);
1010
+ const state = withdraw(token, store);
999
1011
  setAtomOrSelector(state, value, store);
1000
1012
  closeOperation(store);
1001
1013
  }
@@ -1081,7 +1093,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
1081
1093
  var registerSelector = (selectorKey, store) => ({
1082
1094
  get: (dependency) => {
1083
1095
  const target = newest(store);
1084
- const dependencyState = withdrawOrCreate(dependency, store);
1096
+ const dependencyState = withdraw(dependency, store);
1085
1097
  const dependencyValue = readOrComputeValue(dependencyState, store);
1086
1098
  store.logger.info(
1087
1099
  `\u{1F50C}`,
@@ -1104,19 +1116,20 @@ var registerSelector = (selectorKey, store) => ({
1104
1116
  return dependencyValue;
1105
1117
  },
1106
1118
  set: (WritableToken, newValue) => {
1107
- const state = withdrawOrCreate(WritableToken, store);
1119
+ const state = withdraw(WritableToken, store);
1108
1120
  setAtomOrSelector(state, newValue, store);
1109
1121
  },
1110
- find: (token, key) => findInStore(token, key, store)
1122
+ find: (token, key) => findInStore(token, key, store),
1123
+ seek: (token, key) => seekInStore(token, key, store)
1111
1124
  });
1112
1125
 
1113
1126
  // internal/src/selector/create-readonly-selector.ts
1114
1127
  var createReadonlySelector = (options, family, store) => {
1115
1128
  const target = newest(store);
1116
1129
  const subject = new Subject();
1117
- const { get, find } = registerSelector(options.key, target);
1130
+ const { get, find, seek } = registerSelector(options.key, target);
1118
1131
  const getSelf = () => {
1119
- const value = options.get({ get, find });
1132
+ const value = options.get({ get, find, seek });
1120
1133
  cacheValue(options.key, value, subject, newest(store));
1121
1134
  return value;
1122
1135
  };
@@ -1151,8 +1164,8 @@ var createWritableSelector = (options, family, store) => {
1151
1164
  const target = newest(store);
1152
1165
  const subject = new Subject();
1153
1166
  const transactors = registerSelector(options.key, target);
1154
- const { find, get } = transactors;
1155
- const readonlyTransactors = { find, get };
1167
+ const { find, get, seek } = transactors;
1168
+ const readonlyTransactors = { find, get, seek };
1156
1169
  const getSelf = () => {
1157
1170
  const value = options.get(readonlyTransactors);
1158
1171
  cacheValue(options.key, value, subject, newest(store));
@@ -1210,32 +1223,50 @@ function createStandaloneSelector(options, store) {
1210
1223
 
1211
1224
  // internal/src/selector/dispose-selector.ts
1212
1225
  function disposeSelector(selectorToken, store) {
1226
+ var _a;
1213
1227
  const target = newest(store);
1214
1228
  const { key } = selectorToken;
1215
- switch (selectorToken.type) {
1216
- case `selector`:
1217
- target.selectors.delete(key);
1218
- break;
1219
- case `readonly_selector`:
1220
- target.readonlySelectors.delete(key);
1221
- break;
1222
- }
1223
- target.valueMap.delete(key);
1224
- target.selectorAtoms.delete(key);
1225
- const downstreamTokens = target.selectorGraph.getRelationEntries({ upstreamSelectorKey: key }).filter(([_, { source }]) => source === key).map(
1226
- ([downstreamSelectorKey]) => {
1227
- var _a;
1228
- return (_a = target.selectors.get(downstreamSelectorKey)) != null ? _a : target.readonlySelectors.get(downstreamSelectorKey);
1229
+ const selector = (_a = target.selectors.get(key)) != null ? _a : target.readonlySelectors.get(key);
1230
+ if (!selector) {
1231
+ store.logger.error(
1232
+ `\u274C`,
1233
+ `selector`,
1234
+ key,
1235
+ `Tried to dispose selector, but it does not exist in the store.`
1236
+ );
1237
+ } else if (!selector.family) {
1238
+ store.logger.error(
1239
+ `\u274C`,
1240
+ `selector`,
1241
+ key,
1242
+ `Standalone selectors cannot be disposed.`
1243
+ );
1244
+ } else {
1245
+ switch (selectorToken.type) {
1246
+ case `selector`:
1247
+ target.selectors.delete(key);
1248
+ break;
1249
+ case `readonly_selector`:
1250
+ target.readonlySelectors.delete(key);
1251
+ break;
1229
1252
  }
1230
- );
1231
- for (const downstreamToken of downstreamTokens) {
1232
- if (downstreamToken) {
1233
- disposeSelector(downstreamToken, store);
1253
+ target.valueMap.delete(key);
1254
+ target.selectorAtoms.delete(key);
1255
+ const downstreamTokens = target.selectorGraph.getRelationEntries({ upstreamSelectorKey: key }).filter(([_, { source }]) => source === key).map(
1256
+ ([downstreamSelectorKey]) => {
1257
+ var _a2;
1258
+ return (_a2 = target.selectors.get(downstreamSelectorKey)) != null ? _a2 : target.readonlySelectors.get(downstreamSelectorKey);
1259
+ }
1260
+ );
1261
+ for (const downstreamToken of downstreamTokens) {
1262
+ if (downstreamToken) {
1263
+ disposeSelector(downstreamToken, store);
1264
+ }
1234
1265
  }
1266
+ target.selectorGraph.delete(key);
1267
+ store.logger.info(`\u{1F525}`, selectorToken.type, key, `deleted`);
1268
+ store.on.selectorDisposal.next(selectorToken);
1235
1269
  }
1236
- target.selectorGraph.delete(key);
1237
- store.logger.info(`\u{1F525}`, selectorToken.type, key, `deleted`);
1238
- store.on.selectorDisposal.next(selectorToken);
1239
1270
  }
1240
1271
 
1241
1272
  // internal/src/subscribe/recall-state.ts
@@ -1306,7 +1337,7 @@ function subscribeToState(token, handleUpdate, key, store) {
1306
1337
  handleUpdate(update);
1307
1338
  }
1308
1339
  }
1309
- const state = withdrawOrCreate(token, store);
1340
+ const state = withdraw(token, store);
1310
1341
  store.logger.info(`\u{1F440}`, state.type, state.key, `Adding subscription "${key}"`);
1311
1342
  const isSelector = state.type === `selector` || state.type === `readonly_selector`;
1312
1343
  let dependencyUnsubFunctions = null;
@@ -1567,37 +1598,41 @@ function createMutableAtom(options, family, store) {
1567
1598
  };
1568
1599
  }
1569
1600
  new Tracker(token, store);
1570
- json.selectJson(token, options, store);
1601
+ if (!family) {
1602
+ json.selectJson(token, options, store);
1603
+ }
1571
1604
  store.on.atomCreation.next(token);
1572
1605
  return token;
1573
1606
  }
1574
1607
  var FamilyTracker = class {
1575
- constructor(findMutableState, store) {
1576
- this.findLatestUpdateState = createRegularAtomFamily(
1608
+ constructor(mutableAtoms, store) {
1609
+ this.latestUpdateAtoms = createRegularAtomFamily(
1577
1610
  {
1578
- key: `*${findMutableState.key}`,
1611
+ key: `*${mutableAtoms.key}`,
1579
1612
  default: null
1580
1613
  },
1581
1614
  store
1582
1615
  );
1583
- this.findMutableState = findMutableState;
1584
- this.findMutableState.subject.subscribe(
1616
+ this.mutableAtoms = mutableAtoms;
1617
+ this.mutableAtoms.subject.subscribe(
1585
1618
  `store=${store.config.name}::tracker-atom-family`,
1586
1619
  (atomToken) => {
1587
1620
  if (atomToken.family) {
1588
1621
  const key = json.parseJson(atomToken.family.subKey);
1589
- this.findLatestUpdateState(key);
1622
+ seekInStore(this.latestUpdateAtoms, key, store);
1590
1623
  new Tracker(atomToken, store);
1591
1624
  }
1592
1625
  }
1593
1626
  );
1594
- this.findLatestUpdateState.subject.subscribe(
1627
+ this.latestUpdateAtoms.subject.subscribe(
1595
1628
  `store=${store.config.name}::tracker-atom-family`,
1596
1629
  (atomToken) => {
1597
1630
  if (atomToken.family) {
1598
1631
  const key = json.parseJson(atomToken.family.subKey);
1599
- const mutableAtomToken = this.findMutableState(key);
1600
- new Tracker(mutableAtomToken, store);
1632
+ const mutableAtomToken = seekInStore(this.mutableAtoms, key, store);
1633
+ if (mutableAtomToken) {
1634
+ new Tracker(mutableAtomToken, store);
1635
+ }
1601
1636
  }
1602
1637
  }
1603
1638
  );
@@ -1612,25 +1647,19 @@ function createMutableAtomFamily(options, store) {
1612
1647
  const subKey = json.stringifyJson(key);
1613
1648
  const family = { key: options.key, subKey };
1614
1649
  const fullKey = `${options.key}(${subKey})`;
1615
- const target2 = newest(store);
1616
- const atomAlreadyCreated = target2.atoms.has(fullKey);
1617
- let token;
1618
- if (atomAlreadyCreated) {
1619
- token = { type: `mutable_atom`, key: fullKey, family };
1620
- } else {
1621
- const individualOptions = {
1622
- key: fullKey,
1623
- default: () => options.default(key),
1624
- toJson: options.toJson,
1625
- fromJson: options.fromJson,
1626
- mutable: true
1627
- };
1628
- if (options.effects) {
1629
- individualOptions.effects = options.effects(key);
1630
- }
1631
- token = createMutableAtom(individualOptions, family, store);
1632
- subject.next(token);
1650
+ const target = newest(store);
1651
+ const individualOptions = {
1652
+ key: fullKey,
1653
+ default: () => options.default(key),
1654
+ toJson: options.toJson,
1655
+ fromJson: options.fromJson,
1656
+ mutable: true
1657
+ };
1658
+ if (options.effects) {
1659
+ individualOptions.effects = options.effects(key);
1633
1660
  }
1661
+ const token = createMutableAtom(individualOptions, family, target);
1662
+ subject.next(token);
1634
1663
  return token;
1635
1664
  },
1636
1665
  {
@@ -1642,8 +1671,7 @@ function createMutableAtomFamily(options, store) {
1642
1671
  fromJson: options.fromJson
1643
1672
  }
1644
1673
  );
1645
- const target = newest(store);
1646
- target.families.set(options.key, atomFamily);
1674
+ store.families.set(options.key, atomFamily);
1647
1675
  json.selectJsonFamily(atomFamily, options, store);
1648
1676
  new FamilyTracker(atomFamily, store);
1649
1677
  return atomFamily;
@@ -1658,19 +1686,24 @@ var getJsonFamily = (mutableAtomFamily, store) => {
1658
1686
  };
1659
1687
 
1660
1688
  // internal/src/mutable/get-json-token.ts
1661
- var getJsonToken = (mutableAtomToken) => {
1662
- const key = mutableAtomToken.family ? `${mutableAtomToken.family.key}:JSON(${mutableAtomToken.family.subKey})` : `${mutableAtomToken.key}:JSON`;
1663
- const jsonToken = {
1664
- type: `selector`,
1665
- key
1666
- };
1689
+ var getJsonToken = (mutableAtomToken, store) => {
1667
1690
  if (mutableAtomToken.family) {
1668
- jsonToken.family = {
1669
- key: `${mutableAtomToken.family.key}:JSON`,
1670
- subKey: mutableAtomToken.family.subKey
1691
+ const target = newest(store);
1692
+ const jsonFamilyKey = `${mutableAtomToken.family.key}:JSON`;
1693
+ const jsonFamilyToken = {
1694
+ key: jsonFamilyKey,
1695
+ type: `selector_family`
1671
1696
  };
1697
+ const family = withdraw(jsonFamilyToken, target);
1698
+ const subKey = JSON.parse(mutableAtomToken.family.subKey);
1699
+ const jsonToken = findInStore(family, subKey, store);
1700
+ return jsonToken;
1672
1701
  }
1673
- return jsonToken;
1702
+ const token = {
1703
+ type: `selector`,
1704
+ key: `${mutableAtomToken.key}:JSON`
1705
+ };
1706
+ return token;
1674
1707
  };
1675
1708
 
1676
1709
  // internal/src/mutable/get-update-token.ts
@@ -1866,8 +1899,10 @@ function disposeAtom(atomToken, store) {
1866
1899
  `\u274C`,
1867
1900
  `atom`,
1868
1901
  key,
1869
- `Tried to delete atom, but it does not exist in the store.`
1902
+ `Tried to dispose atom, but it does not exist in the store.`
1870
1903
  );
1904
+ } else if (!atom.family) {
1905
+ store.logger.error(`\u274C`, `atom`, key, `Standalone atoms cannot be disposed.`);
1871
1906
  } else {
1872
1907
  (_a = atom.cleanup) == null ? void 0 : _a.call(atom);
1873
1908
  target.atoms.delete(key);
@@ -1887,6 +1922,7 @@ function disposeAtom(atomToken, store) {
1887
1922
  if (atomToken.type === `mutable_atom`) {
1888
1923
  const updateToken = getUpdateToken(atomToken);
1889
1924
  disposeAtom(updateToken, store);
1925
+ store.trackers.delete(key);
1890
1926
  }
1891
1927
  store.logger.info(`\u{1F525}`, `atom`, key, `deleted`);
1892
1928
  store.on.atomDisposal.next(atomToken);
@@ -1904,7 +1940,7 @@ function getEnvironmentData(store) {
1904
1940
 
1905
1941
  // internal/src/get-state/get-from-store.ts
1906
1942
  function getFromStore(token, store) {
1907
- const state = withdrawOrCreate(token, store);
1943
+ const state = withdraw(token, store);
1908
1944
  return readOrComputeValue(state, store);
1909
1945
  }
1910
1946
 
@@ -2458,7 +2494,9 @@ var buildTransaction = (key, params, store, id) => {
2458
2494
  makeContentKey: (...keys) => keys.sort().join(`:`)
2459
2495
  }),
2460
2496
  selectors: new LazyMap(parent.selectors),
2461
- valueMap: new LazyMap(parent.valueMap)
2497
+ valueMap: new LazyMap(parent.valueMap),
2498
+ molecules: new LazyMap(parent.molecules),
2499
+ miscResources: new LazyMap(parent.miscResources)
2462
2500
  };
2463
2501
  const epoch = getEpochNumberOfAction(key, store);
2464
2502
  const transactionMeta = {
@@ -2478,6 +2516,7 @@ var buildTransaction = (key, params, store, id) => {
2478
2516
  },
2479
2517
  run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
2480
2518
  find: (token, k) => findInStore(token, k, child),
2519
+ seek: (token, k) => seekInStore(token, k, child),
2481
2520
  env: () => getEnvironmentData(child)
2482
2521
  }
2483
2522
  };
@@ -2596,6 +2635,7 @@ exports.getUpdateToken = getUpdateToken;
2596
2635
  exports.ingestAtomUpdate = ingestAtomUpdate;
2597
2636
  exports.ingestSelectorUpdate = ingestSelectorUpdate;
2598
2637
  exports.ingestTransactionUpdate = ingestTransactionUpdate;
2638
+ exports.initFamilyMember = initFamilyMember;
2599
2639
  exports.isAtomDefault = isAtomDefault;
2600
2640
  exports.isAtomKey = isAtomKey;
2601
2641
  exports.isChildStore = isChildStore;
@@ -2614,6 +2654,7 @@ exports.openOperation = openOperation;
2614
2654
  exports.readCachedValue = readCachedValue;
2615
2655
  exports.readOrComputeValue = readOrComputeValue;
2616
2656
  exports.registerSelector = registerSelector;
2657
+ exports.seekInStore = seekInStore;
2617
2658
  exports.setAtomOrSelector = setAtomOrSelector;
2618
2659
  exports.setEpochNumberOfAction = setEpochNumberOfAction;
2619
2660
  exports.setEpochNumberOfContinuity = setEpochNumberOfContinuity;
@@ -2627,4 +2668,3 @@ exports.traceAllSelectorAtoms = traceAllSelectorAtoms;
2627
2668
  exports.traceSelectorAtoms = traceSelectorAtoms;
2628
2669
  exports.updateSelectorAtoms = updateSelectorAtoms;
2629
2670
  exports.withdraw = withdraw;
2630
- exports.withdrawOrCreate = withdrawOrCreate;