atom.io 0.24.7 → 0.25.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 (40) hide show
  1. package/data/dist/index.cjs +40 -62
  2. package/data/dist/index.d.ts +3 -3
  3. package/data/dist/index.js +41 -63
  4. package/data/src/join.ts +47 -64
  5. package/dist/index.cjs +26 -8
  6. package/dist/index.d.ts +37 -15
  7. package/dist/index.js +27 -9
  8. package/internal/dist/index.cjs +224 -117
  9. package/internal/dist/index.d.ts +12 -7
  10. package/internal/dist/index.js +225 -118
  11. package/internal/src/families/dispose-from-store.ts +56 -3
  12. package/internal/src/get-state/get-from-store.ts +58 -25
  13. package/internal/src/molecule/make-molecule-in-store.ts +59 -23
  14. package/internal/src/not-found-error.ts +29 -6
  15. package/internal/src/selector/create-readonly-selector.ts +7 -2
  16. package/internal/src/selector/create-writable-selector.ts +7 -5
  17. package/internal/src/selector/register-selector.ts +59 -9
  18. package/internal/src/selector/trace-selector-atoms.ts +6 -8
  19. package/internal/src/selector/update-selector-atoms.ts +3 -1
  20. package/internal/src/set-state/set-into-store.ts +48 -1
  21. package/internal/src/store/store.ts +4 -4
  22. package/internal/src/transaction/build-transaction.ts +10 -9
  23. package/internal/src/transaction/create-transaction.ts +2 -2
  24. package/internal/src/transaction/index.ts +2 -2
  25. package/package.json +6 -6
  26. package/react/dist/index.cjs +4 -1
  27. package/react/dist/index.js +5 -2
  28. package/react/src/use-o.ts +11 -3
  29. package/realtime/dist/index.cjs +0 -1
  30. package/realtime/dist/index.js +0 -1
  31. package/realtime/src/realtime-continuity.ts +0 -1
  32. package/realtime-server/dist/index.cjs +7 -7
  33. package/realtime-server/dist/index.js +7 -7
  34. package/realtime-server/src/realtime-server-stores/server-room-external-actions.ts +7 -7
  35. package/src/dispose-state.ts +32 -3
  36. package/src/get-state.ts +37 -4
  37. package/src/molecule.ts +20 -7
  38. package/src/set-state.ts +19 -2
  39. package/src/silo.ts +11 -4
  40. package/src/transaction.ts +9 -17
@@ -2,7 +2,7 @@ import { Junction } from '../../dist/chunk-HYXKCFVY.js';
2
2
  import { __spreadValues, __spreadProps } from '../../dist/chunk-S4N6XNPH.js';
3
3
  import { stringifyJson, parseJson, selectJson, selectJsonFamily } from 'atom.io/json';
4
4
  import { AtomIOLogger } from 'atom.io';
5
- import { getJoin } from 'atom.io/data';
5
+ import { getJoin, findRelations } from 'atom.io/data';
6
6
 
7
7
  // internal/src/arbitrary.ts
8
8
  function arbitrary(random = Math.random) {
@@ -132,8 +132,6 @@ var abortTransaction = (store) => {
132
132
  );
133
133
  target.parent.child = null;
134
134
  };
135
-
136
- // internal/src/not-found-error.ts
137
135
  var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
138
136
  function prettyPrintTokenType(token) {
139
137
  switch (token.type) {
@@ -152,10 +150,19 @@ function prettyPrintTokenType(token) {
152
150
  }
153
151
  }
154
152
  var NotFoundError = class extends Error {
155
- constructor(token, store) {
156
- super(
157
- `${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
158
- );
153
+ constructor(...params) {
154
+ const token = params[0];
155
+ const store = params.length === 2 ? params[1] : params[2];
156
+ if (params.length === 2) {
157
+ super(
158
+ `${prettyPrintTokenType(token)} "${token.key}" not found in store "${store.config.name}".`
159
+ );
160
+ } else {
161
+ const key = params[1];
162
+ super(
163
+ `${prettyPrintTokenType(token)} "${token.key}" member ${stringifyJson(key)} not found in store "${store.config.name}".`
164
+ );
165
+ }
159
166
  }
160
167
  };
161
168
 
@@ -415,41 +422,6 @@ var setAtomOrSelector = (state, value, store) => {
415
422
  break;
416
423
  }
417
424
  };
418
-
419
- // internal/src/set-state/set-into-store.ts
420
- function setIntoStore(token, value, store) {
421
- const rejectionTime = openOperation(token, store);
422
- if (rejectionTime) {
423
- const unsubscribe = store.on.operationClose.subscribe(
424
- `waiting to set "${token.key}" at T-${rejectionTime}`,
425
- () => {
426
- unsubscribe();
427
- store.logger.info(
428
- `\u{1F7E2}`,
429
- token.type,
430
- token.key,
431
- `resuming deferred setState from T-${rejectionTime}`
432
- );
433
- setIntoStore(token, value, store);
434
- }
435
- );
436
- return;
437
- }
438
- const state = withdraw(token, store);
439
- setAtomOrSelector(state, value, store);
440
- closeOperation(store);
441
- }
442
-
443
- // internal/src/ingest-updates/ingest-atom-update.ts
444
- function ingestAtomUpdate(applying, atomUpdate, store) {
445
- const { key, newValue, oldValue } = atomUpdate;
446
- const value = applying === `newValue` ? newValue : oldValue;
447
- const token = { key, type: `atom` };
448
- if (atomUpdate.family) {
449
- Object.assign(token, { family: atomUpdate.family });
450
- }
451
- setIntoStore(token, value, store);
452
- }
453
425
  function createRegularAtomFamily(options, store) {
454
426
  const subject = new Subject();
455
427
  const atomFamily = Object.assign(
@@ -491,17 +463,31 @@ function createAtomFamily(options, store) {
491
463
  }
492
464
 
493
465
  // 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;
466
+ function getFromStore(...params) {
467
+ let token;
468
+ let store;
469
+ if (params.length === 2) {
470
+ token = params[0];
471
+ store = params[1];
472
+ } else {
473
+ const family = params[0];
474
+ const key = params[1];
475
+ store = params[2];
476
+ const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
477
+ if (!maybeToken) {
478
+ throw new NotFoundError(family, key, store);
501
479
  }
480
+ token = maybeToken;
481
+ }
482
+ switch (token.type) {
483
+ case `atom`:
484
+ case `mutable_atom`:
485
+ case `selector`:
486
+ case `readonly_selector`:
487
+ return readOrComputeValue(withdraw(token, store), store);
488
+ case `molecule`:
489
+ return withdraw(token, store).instance;
502
490
  }
503
- const state = withdraw(token, store);
504
- return readOrComputeValue(state, store);
505
491
  }
506
492
 
507
493
  // internal/src/keys.ts
@@ -517,21 +503,18 @@ var getSelectorDependencyKeys = (key, store) => {
517
503
  };
518
504
 
519
505
  // internal/src/selector/trace-selector-atoms.ts
520
- var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
506
+ var traceSelectorAtoms = (directDependencyKey, covered, store) => {
521
507
  const rootKeys = [];
522
508
  const indirectDependencyKeys = getSelectorDependencyKeys(
523
509
  directDependencyKey,
524
510
  store
525
511
  );
526
- let depth = 0;
527
512
  while (indirectDependencyKeys.length > 0) {
528
513
  const indirectDependencyKey = indirectDependencyKeys.shift();
529
- ++depth;
530
- if (depth > 99999) {
531
- throw new Error(
532
- `Maximum selector dependency depth exceeded (> 99999) in selector "${selectorKey}". This is likely due to a circular dependency.`
533
- );
514
+ if (covered.has(indirectDependencyKey)) {
515
+ continue;
534
516
  }
517
+ covered.add(indirectDependencyKey);
535
518
  if (!isAtomKey(indirectDependencyKey, store)) {
536
519
  indirectDependencyKeys.push(
537
520
  ...getSelectorDependencyKeys(indirectDependencyKey, store)
@@ -545,13 +528,14 @@ var traceSelectorAtoms = (selectorKey, directDependencyKey, store) => {
545
528
  var traceAllSelectorAtoms = (selector, store) => {
546
529
  const selectorKey = selector.key;
547
530
  const directDependencyKeys = getSelectorDependencyKeys(selectorKey, store);
531
+ const covered = /* @__PURE__ */ new Set();
548
532
  return directDependencyKeys.flatMap(
549
- (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(selectorKey, depKey, store)
533
+ (depKey) => isAtomKey(depKey, store) ? depKey : traceSelectorAtoms(depKey, covered, store)
550
534
  );
551
535
  };
552
536
 
553
537
  // internal/src/selector/update-selector-atoms.ts
554
- var updateSelectorAtoms = (selectorKey, dependency, store) => {
538
+ var updateSelectorAtoms = (selectorKey, dependency, covered, store) => {
555
539
  const target = newest(store);
556
540
  if (dependency.type === `atom` || dependency.type === `mutable_atom`) {
557
541
  target.selectorAtoms.set({
@@ -565,7 +549,7 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
565
549
  `discovers root atom "${dependency.key}"`
566
550
  );
567
551
  } else {
568
- const rootKeys = traceSelectorAtoms(selectorKey, dependency.key, store);
552
+ const rootKeys = traceSelectorAtoms(dependency.key, covered, store);
569
553
  store.logger.info(
570
554
  `\u{1F50D}`,
571
555
  `selector`,
@@ -579,12 +563,21 @@ var updateSelectorAtoms = (selectorKey, dependency, store) => {
579
563
  });
580
564
  }
581
565
  }
566
+ covered.add(dependency.key);
582
567
  };
583
568
 
584
569
  // internal/src/selector/register-selector.ts
585
- var registerSelector = (selectorKey, store) => ({
586
- get: (dependency) => {
570
+ var registerSelector = (selectorKey, covered, store) => ({
571
+ get: (dependency, key) => {
587
572
  const target = newest(store);
573
+ if (key) {
574
+ switch (dependency.type) {
575
+ case `molecule_family`:
576
+ return getFromStore(dependency, key, store);
577
+ case `atom_family`:
578
+ dependency = seekInStore(dependency, key, store);
579
+ }
580
+ }
588
581
  if (dependency.type === `molecule`) {
589
582
  return getFromStore(dependency, store);
590
583
  }
@@ -607,13 +600,28 @@ var registerSelector = (selectorKey, store) => ({
607
600
  source: dependency.key
608
601
  }
609
602
  );
610
- updateSelectorAtoms(selectorKey, dependency, store);
603
+ updateSelectorAtoms(selectorKey, dependency, covered, store);
611
604
  return dependencyValue;
612
605
  },
613
- set: (WritableToken, newValue) => {
606
+ set: (...params) => {
607
+ let token;
608
+ let value;
609
+ if (params.length === 2) {
610
+ token = params[0];
611
+ value = params[1];
612
+ } else {
613
+ const family = params[0];
614
+ const key = params[1];
615
+ value = params[2];
616
+ const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
617
+ if (!maybeToken) {
618
+ throw new NotFoundError(family, key, store);
619
+ }
620
+ token = maybeToken;
621
+ }
614
622
  const target = newest(store);
615
- const state = withdraw(WritableToken, target);
616
- setAtomOrSelector(state, newValue, target);
623
+ const state = withdraw(token, target);
624
+ setAtomOrSelector(state, value, target);
617
625
  },
618
626
  find: (token, key) => findInStore(token, key, store),
619
627
  seek: (token, key) => seekInStore(token, key, store),
@@ -624,10 +632,16 @@ var registerSelector = (selectorKey, store) => ({
624
632
  var createReadonlySelector = (options, family, store) => {
625
633
  const target = newest(store);
626
634
  const subject = new Subject();
627
- const { get, find, seek, json } = registerSelector(options.key, target);
635
+ const covered = /* @__PURE__ */ new Set();
636
+ const { get, find, seek, json } = registerSelector(
637
+ options.key,
638
+ covered,
639
+ target
640
+ );
628
641
  const getSelf = () => {
629
642
  const value = options.get({ get, find, seek, json });
630
643
  cacheValue(options.key, value, subject, newest(store));
644
+ covered.clear();
631
645
  return value;
632
646
  };
633
647
  const readonlySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
@@ -659,12 +673,14 @@ var createReadonlySelector = (options, family, store) => {
659
673
  var createWritableSelector = (options, family, store) => {
660
674
  const target = newest(store);
661
675
  const subject = new Subject();
662
- const transactors = registerSelector(options.key, target);
663
- const { find, get, seek, json } = transactors;
664
- const readonlyTransactors = { find, get, seek, json };
676
+ const covered = /* @__PURE__ */ new Set();
677
+ const toolkit = registerSelector(options.key, covered, target);
678
+ const { find, get, seek, json } = toolkit;
679
+ const getterToolkit = { find, get, seek, json };
665
680
  const getSelf = (innerTarget = newest(store)) => {
666
- const value = options.get(readonlyTransactors);
681
+ const value = options.get(getterToolkit);
667
682
  cacheValue(options.key, value, subject, innerTarget);
683
+ covered.clear();
668
684
  return value;
669
685
  };
670
686
  const setSelf = (next) => {
@@ -686,7 +702,7 @@ var createWritableSelector = (options, family, store) => {
686
702
  if (isRootStore(innerTarget)) {
687
703
  subject.next({ newValue, oldValue });
688
704
  }
689
- options.set(transactors, newValue);
705
+ options.set(toolkit, newValue);
690
706
  };
691
707
  const mySelector = __spreadValues(__spreadProps(__spreadValues({}, options), {
692
708
  subject,
@@ -940,23 +956,6 @@ function disposeMolecule(token, store) {
940
956
  }
941
957
  }
942
958
 
943
- // internal/src/families/dispose-from-store.ts
944
- function disposeFromStore(token, store = IMPLICIT.STORE) {
945
- switch (token.type) {
946
- case `atom`:
947
- case `mutable_atom`:
948
- disposeAtom(token, store);
949
- break;
950
- case `selector`:
951
- case `readonly_selector`:
952
- disposeSelector(token, store);
953
- break;
954
- case `molecule`:
955
- disposeMolecule(token, store);
956
- break;
957
- }
958
- }
959
-
960
959
  // internal/src/families/init-family-member.ts
961
960
  function initFamilyMemberInStore(token, key, store) {
962
961
  const familyKey = token.key;
@@ -1030,6 +1029,91 @@ function findInStore(token, key, store) {
1030
1029
  return state;
1031
1030
  }
1032
1031
 
1032
+ // internal/src/families/dispose-from-store.ts
1033
+ function disposeFromStore(...params) {
1034
+ let token;
1035
+ let store;
1036
+ if (params.length === 2) {
1037
+ token = params[0];
1038
+ store = params[1];
1039
+ } else {
1040
+ const family = params[0];
1041
+ const key = params[1];
1042
+ store = params[2];
1043
+ const maybeToken = family.type === `molecule_family` ? seekInStore(family, key, store) : store.config.lifespan === `immortal` ? seekInStore(family, key, store) : findInStore(family, key, store);
1044
+ if (!maybeToken) {
1045
+ throw new NotFoundError(family, key, store);
1046
+ }
1047
+ token = maybeToken;
1048
+ }
1049
+ switch (token.type) {
1050
+ case `atom`:
1051
+ case `mutable_atom`:
1052
+ disposeAtom(token, store);
1053
+ break;
1054
+ case `selector`:
1055
+ case `readonly_selector`:
1056
+ disposeSelector(token, store);
1057
+ break;
1058
+ case `molecule`:
1059
+ disposeMolecule(token, store);
1060
+ break;
1061
+ }
1062
+ }
1063
+
1064
+ // internal/src/set-state/set-into-store.ts
1065
+ function setIntoStore(...params) {
1066
+ let token;
1067
+ let value;
1068
+ let store;
1069
+ if (params.length === 3) {
1070
+ token = params[0];
1071
+ value = params[1];
1072
+ store = params[2];
1073
+ } else {
1074
+ const family = params[0];
1075
+ const key = params[1];
1076
+ value = params[2];
1077
+ store = params[3];
1078
+ const maybeToken = store.config.lifespan === `ephemeral` ? findInStore(family, key, store) : seekInStore(family, key, store);
1079
+ if (!maybeToken) {
1080
+ throw new NotFoundError(family, key, store);
1081
+ }
1082
+ token = maybeToken;
1083
+ }
1084
+ const rejectionTime = openOperation(token, store);
1085
+ if (rejectionTime) {
1086
+ const unsubscribe = store.on.operationClose.subscribe(
1087
+ `waiting to set "${token.key}" at T-${rejectionTime}`,
1088
+ () => {
1089
+ unsubscribe();
1090
+ store.logger.info(
1091
+ `\u{1F7E2}`,
1092
+ token.type,
1093
+ token.key,
1094
+ `resuming deferred setState from T-${rejectionTime}`
1095
+ );
1096
+ setIntoStore(token, value, store);
1097
+ }
1098
+ );
1099
+ return;
1100
+ }
1101
+ const state = withdraw(token, store);
1102
+ setAtomOrSelector(state, value, store);
1103
+ closeOperation(store);
1104
+ }
1105
+
1106
+ // internal/src/ingest-updates/ingest-atom-update.ts
1107
+ function ingestAtomUpdate(applying, atomUpdate, store) {
1108
+ const { key, newValue, oldValue } = atomUpdate;
1109
+ const value = applying === `newValue` ? newValue : oldValue;
1110
+ const token = { key, type: `atom` };
1111
+ if (atomUpdate.family) {
1112
+ Object.assign(token, { family: atomUpdate.family });
1113
+ }
1114
+ setIntoStore(token, value, store);
1115
+ }
1116
+
1033
1117
  // internal/src/molecule/create-molecule-family.ts
1034
1118
  function createMoleculeFamily(options, store) {
1035
1119
  var _a;
@@ -1091,30 +1175,34 @@ var Molecule = class {
1091
1175
  };
1092
1176
 
1093
1177
  // internal/src/molecule/make-molecule-in-store.ts
1178
+ function capitalize2(string) {
1179
+ return string[0].toUpperCase() + string.slice(1);
1180
+ }
1094
1181
  function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1095
1182
  const target = newest(store);
1096
- target.moleculeInProgress = key;
1183
+ const stringKey = stringifyJson(key);
1184
+ target.moleculeInProgress = stringKey;
1097
1185
  const contextArray = Array.isArray(context) ? context : [context];
1098
1186
  const owners = contextArray.map((ctx) => {
1099
1187
  if (ctx instanceof Molecule) {
1100
1188
  return ctx;
1101
1189
  }
1102
- const stringKey = stringifyJson(ctx.key);
1103
- const molecule2 = store.molecules.get(stringKey);
1190
+ const ctxStringKey = stringifyJson(ctx.key);
1191
+ const molecule2 = store.molecules.get(ctxStringKey);
1104
1192
  if (!molecule2) {
1105
1193
  throw new Error(
1106
- `Molecule ${stringKey} not found in store "${store.config.name}"`
1194
+ `Molecule ${ctxStringKey} not found in store "${store.config.name}"`
1107
1195
  );
1108
1196
  }
1109
1197
  return molecule2;
1110
1198
  });
1111
1199
  const molecule = new Molecule(owners, key, familyToken);
1112
- target.molecules.set(stringifyJson(key), molecule);
1200
+ target.molecules.set(stringKey, molecule);
1113
1201
  for (const owner of owners) {
1114
1202
  owner.below.set(molecule.stringKey, molecule);
1115
1203
  }
1116
- const transactors = {
1117
- get: (t) => getFromStore(t, newest(store)),
1204
+ const toolkit = {
1205
+ get: (t) => getFromStore(t, void 0, newest(store)),
1118
1206
  set: (t, newValue) => {
1119
1207
  setIntoStore(t, newValue, newest(store));
1120
1208
  },
@@ -1126,11 +1214,36 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1126
1214
  disposeFromStore(t, newest(store));
1127
1215
  },
1128
1216
  env: () => getEnvironmentData(newest(store)),
1129
- bond: (f) => growMoleculeInStore(
1130
- molecule,
1131
- withdraw(f, store),
1132
- newest(store)
1133
- ),
1217
+ bond: (token2, maybeRole) => {
1218
+ if (token2.type === `join`) {
1219
+ const { as: role } = maybeRole;
1220
+ const join = getJoin(token2, store);
1221
+ join.molecules.set(stringKey, molecule);
1222
+ molecule.joins.set(token2.key, join);
1223
+ const unsubFromFamily = family.subject.subscribe(
1224
+ `join:${token2.key}-${stringKey}`,
1225
+ (event) => {
1226
+ if (event.type === `molecule_disposal` && stringifyJson(event.token.key) === stringKey) {
1227
+ unsubFromFamily();
1228
+ join.molecules.delete(stringKey);
1229
+ }
1230
+ }
1231
+ );
1232
+ if (role === null) {
1233
+ return;
1234
+ }
1235
+ const otherRole = token2.a === role ? token2.b : token2.a;
1236
+ const relations = findRelations(token2, key);
1237
+ const relatedKeys = relations[`${otherRole}KeysOf${capitalize2(role)}`];
1238
+ const relatedEntries = relations[`${otherRole}EntriesOf${capitalize2(role)}`];
1239
+ let tokens = { relatedKeys };
1240
+ if (relatedEntries) {
1241
+ tokens = Object.assign(tokens, { relatedEntries });
1242
+ }
1243
+ return tokens;
1244
+ }
1245
+ return growMoleculeInStore(molecule, withdraw(token2, store), newest(store));
1246
+ },
1134
1247
  claim: (below, options) => {
1135
1248
  const { exclusive } = options;
1136
1249
  const belowMolecule = newest(store).molecules.get(stringifyJson(below.key));
@@ -1148,12 +1261,6 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1148
1261
  }
1149
1262
  }
1150
1263
  },
1151
- join: (joinToken) => {
1152
- const join = getJoin(joinToken, store);
1153
- join.molecules.set(stringifyJson(key), molecule);
1154
- molecule.joins.set(joinToken.key, join);
1155
- return joinToken;
1156
- },
1157
1264
  spawn: (f, k, ...p) => makeMoleculeInStore(
1158
1265
  newest(store),
1159
1266
  [molecule],
@@ -1164,7 +1271,7 @@ function makeMoleculeInStore(store, context, familyToken, key, ...params) {
1164
1271
  };
1165
1272
  const family = withdraw(familyToken, store);
1166
1273
  const Constructor = family.new;
1167
- molecule.instance = new Constructor(transactors, key, ...params);
1274
+ molecule.instance = new Constructor(toolkit, key, ...params);
1168
1275
  const token = {
1169
1276
  type: `molecule`,
1170
1277
  key,
@@ -1465,18 +1572,18 @@ var buildTransaction = (key, params, store, id) => {
1465
1572
  params,
1466
1573
  output: void 0
1467
1574
  },
1468
- transactors: {
1469
- get: (token) => getFromStore(token, child),
1470
- set: (token, value) => {
1471
- setIntoStore(token, value, child);
1575
+ toolkit: {
1576
+ get: (...ps) => getFromStore(...ps, child),
1577
+ set: (...ps) => {
1578
+ setIntoStore(...ps, child);
1472
1579
  },
1473
1580
  run: (token, identifier = arbitrary()) => actUponStore(token, identifier, child),
1474
1581
  find: (token, k) => findInStore(token, k, child),
1475
1582
  seek: (token, k) => seekInStore(token, k, child),
1476
1583
  json: (token) => getJsonToken(token, child),
1477
1584
  make: (context, family, k, ...args) => makeMoleculeInStore(child, context, family, k, ...args),
1478
- dispose: (token) => {
1479
- disposeFromStore(token, child);
1585
+ dispose: (...ps) => {
1586
+ disposeFromStore(...ps, child);
1480
1587
  },
1481
1588
  env: () => getEnvironmentData(child)
1482
1589
  }
@@ -1504,8 +1611,8 @@ function createTransaction(options, store) {
1504
1611
  const childStore = buildTransaction(options.key, params, store, id);
1505
1612
  try {
1506
1613
  const target2 = newest(store);
1507
- const { transactors } = childStore.transactionMeta;
1508
- const output = options.do(transactors, ...params);
1614
+ const { toolkit } = childStore.transactionMeta;
1615
+ const output = options.do(toolkit, ...params);
1509
1616
  applyTransaction(output, target2);
1510
1617
  return output;
1511
1618
  } catch (thrown) {
@@ -1621,6 +1728,7 @@ var Store = class {
1621
1728
  for (const logger of this.loggers) logger.warn(...messages);
1622
1729
  }
1623
1730
  };
1731
+ this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
1624
1732
  if (store !== null) {
1625
1733
  this.valueMap = new Map(store == null ? void 0 : store.valueMap);
1626
1734
  this.operation = __spreadValues({}, store == null ? void 0 : store.operation);
@@ -1632,7 +1740,6 @@ var Store = class {
1632
1740
  )
1633
1741
  };
1634
1742
  }
1635
- this.config = __spreadValues(__spreadValues({}, store == null ? void 0 : store.config), config);
1636
1743
  for (const [, family] of store.families) {
1637
1744
  family.install(this);
1638
1745
  }
@@ -1,15 +1,68 @@
1
- import type { MoleculeToken, ReadableToken } from "atom.io"
1
+ import type {
2
+ MoleculeConstructor,
3
+ MoleculeFamilyToken,
4
+ MoleculeKey,
5
+ MoleculeToken,
6
+ ReadableFamilyToken,
7
+ ReadableToken,
8
+ } from "atom.io"
9
+ import type { Json } from "atom.io/json"
2
10
 
3
11
  import { disposeAtom } from "../atom"
4
12
  import { disposeMolecule } from "../molecule/dispose-molecule"
13
+ import { NotFoundError } from "../not-found-error"
5
14
  import { disposeSelector } from "../selector"
6
15
  import type { Store } from "../store"
7
- import { IMPLICIT } from "../store"
16
+ import { findInStore } from "./find-in-store"
17
+ import { seekInStore } from "./seek-in-store"
8
18
 
9
19
  export function disposeFromStore(
10
20
  token: MoleculeToken<any> | ReadableToken<any>,
11
- store: Store = IMPLICIT.STORE,
21
+ store: Store,
22
+ ): void
23
+
24
+ export function disposeFromStore<K extends Json.Serializable>(
25
+ token: ReadableFamilyToken<any, K>,
26
+ key: K,
27
+ store: Store,
28
+ ): void
29
+
30
+ export function disposeFromStore<M extends MoleculeConstructor>(
31
+ token: MoleculeFamilyToken<M>,
32
+ key: MoleculeKey<M>,
33
+ store: Store,
34
+ ): void
35
+
36
+ export function disposeFromStore(
37
+ ...params:
38
+ | [
39
+ token: ReadableFamilyToken<any, any>,
40
+ key: Json.Serializable,
41
+ store: Store,
42
+ ]
43
+ | [token: MoleculeFamilyToken<any>, key: MoleculeKey<any>, store: Store]
44
+ | [token: MoleculeToken<any> | ReadableToken<any>, store: Store]
12
45
  ): void {
46
+ let token: MoleculeToken<any> | ReadableToken<any>
47
+ let store: Store
48
+ if (params.length === 2) {
49
+ token = params[0]
50
+ store = params[1]
51
+ } else {
52
+ const family = params[0]
53
+ const key = params[1]
54
+ store = params[2]
55
+ const maybeToken =
56
+ family.type === `molecule_family`
57
+ ? seekInStore(family, key, store)
58
+ : store.config.lifespan === `immortal`
59
+ ? seekInStore(family, key, store)
60
+ : findInStore(family, key, store)
61
+ if (!maybeToken) {
62
+ throw new NotFoundError(family, key, store)
63
+ }
64
+ token = maybeToken
65
+ }
13
66
  switch (token.type) {
14
67
  case `atom`:
15
68
  case `mutable_atom`: