atom.io 0.21.1 → 0.23.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 (116) hide show
  1. package/data/dist/index.cjs +152 -63
  2. package/data/dist/index.d.ts +6 -0
  3. package/data/dist/index.js +3 -3
  4. package/data/src/join.ts +164 -51
  5. package/data/src/struct-family.ts +2 -2
  6. package/dist/chunk-6MLFYN32.js +18 -0
  7. package/dist/{chunk-HITX3MO4.js → chunk-7DT3PVS3.js} +151 -62
  8. package/dist/{chunk-RT43TVKP.js → chunk-GVHKIJ3G.js} +1 -1
  9. package/dist/chunk-OAYGID5B.js +27 -0
  10. package/dist/index.cjs +4 -18
  11. package/dist/index.d.ts +71 -28
  12. package/dist/index.js +6 -19
  13. package/ephemeral/dist/index.cjs +11 -0
  14. package/ephemeral/dist/index.js +9 -0
  15. package/ephemeral/package.json +16 -0
  16. package/ephemeral/src/index.ts +1 -0
  17. package/eslint-plugin/dist/index.cjs +155 -1
  18. package/eslint-plugin/dist/index.js +155 -1
  19. package/eslint-plugin/src/rules/index.ts +1 -0
  20. package/eslint-plugin/src/rules/lifespan.ts +203 -0
  21. package/eslint-plugin/src/rules/synchronous-selector-dependencies.ts +1 -65
  22. package/eslint-plugin/src/walk.ts +73 -0
  23. package/immortal/dist/index.cjs +260 -0
  24. package/immortal/dist/index.js +212 -0
  25. package/immortal/package.json +16 -0
  26. package/immortal/src/index.ts +3 -0
  27. package/immortal/src/make-molecule.ts +222 -0
  28. package/immortal/src/molecule.ts +167 -0
  29. package/immortal/src/seek-state.ts +73 -0
  30. package/internal/dist/index.cjs +1242 -837
  31. package/internal/dist/index.d.ts +135 -22
  32. package/internal/dist/index.js +1215 -838
  33. package/internal/src/atom/create-regular-atom.ts +0 -2
  34. package/internal/src/atom/create-standalone-atom.ts +6 -2
  35. package/internal/src/atom/dispose-atom.ts +26 -3
  36. package/internal/src/families/create-readonly-selector-family.ts +15 -10
  37. package/internal/src/families/create-regular-atom-family.ts +20 -21
  38. package/internal/src/families/create-writable-selector-family.ts +13 -9
  39. package/{src/dispose.ts → internal/src/families/dispose-from-store.ts} +7 -4
  40. package/internal/src/families/find-in-store.ts +11 -6
  41. package/internal/src/families/index.ts +3 -0
  42. package/internal/src/families/init-family-member.ts +112 -0
  43. package/internal/src/families/seek-in-store.ts +123 -0
  44. package/internal/src/get-state/get-from-store.ts +2 -2
  45. package/internal/src/ingest-updates/index.ts +1 -0
  46. package/internal/src/ingest-updates/ingest-creation-disposal.ts +104 -0
  47. package/internal/src/ingest-updates/ingest-transaction-update.ts +26 -4
  48. package/internal/src/mutable/create-mutable-atom-family.ts +22 -24
  49. package/internal/src/mutable/create-mutable-atom.ts +3 -3
  50. package/internal/src/mutable/get-json-family.ts +2 -2
  51. package/internal/src/mutable/get-json-token.ts +26 -12
  52. package/internal/src/mutable/tracker-family.ts +21 -19
  53. package/internal/src/not-found-error.ts +16 -3
  54. package/internal/src/selector/create-readonly-selector.ts +2 -3
  55. package/internal/src/selector/create-standalone-selector.ts +6 -2
  56. package/internal/src/selector/create-writable-selector.ts +2 -3
  57. package/internal/src/selector/dispose-selector.ts +68 -24
  58. package/internal/src/selector/register-selector.ts +10 -5
  59. package/internal/src/set-state/set-into-store.ts +2 -2
  60. package/internal/src/set-state/stow-update.ts +5 -1
  61. package/internal/src/store/deposit.ts +41 -7
  62. package/internal/src/store/index.ts +0 -1
  63. package/internal/src/store/store.ts +29 -5
  64. package/internal/src/store/withdraw.ts +28 -1
  65. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  66. package/internal/src/timeline/add-atom-to-timeline.ts +206 -182
  67. package/internal/src/timeline/create-timeline.ts +181 -60
  68. package/internal/src/timeline/time-travel.ts +20 -0
  69. package/internal/src/transaction/apply-transaction.ts +2 -12
  70. package/internal/src/transaction/build-transaction.ts +16 -2
  71. package/introspection/dist/index.cjs +40 -53
  72. package/introspection/dist/index.js +40 -53
  73. package/introspection/src/attach-atom-index.ts +38 -48
  74. package/introspection/src/attach-selector-index.ts +45 -50
  75. package/introspection/src/attach-timeline-family.ts +1 -0
  76. package/json/dist/index.cjs +40 -6
  77. package/json/dist/index.js +44 -9
  78. package/json/src/select-json-family.ts +47 -9
  79. package/package.json +30 -10
  80. package/react/dist/index.cjs +1 -1
  81. package/react/dist/index.js +1 -1
  82. package/react/src/use-json.ts +1 -1
  83. package/react-devtools/dist/index.cjs +69 -57
  84. package/react-devtools/dist/index.js +62 -49
  85. package/react-devtools/src/StateIndex.tsx +2 -1
  86. package/react-devtools/src/TimelineIndex.tsx +17 -14
  87. package/react-devtools/src/TransactionIndex.tsx +7 -7
  88. package/react-devtools/src/Updates.tsx +41 -32
  89. package/realtime-client/dist/index.cjs +3 -3
  90. package/realtime-client/dist/index.js +3 -3
  91. package/realtime-client/src/pull-mutable-atom-family-member.ts +1 -1
  92. package/realtime-client/src/pull-mutable-atom.ts +1 -1
  93. package/realtime-client/src/sync-continuity.ts +1 -2
  94. package/realtime-react/dist/index.cjs +1 -1
  95. package/realtime-react/dist/index.js +1 -1
  96. package/realtime-server/dist/index.cjs +39 -27
  97. package/realtime-server/dist/index.d.ts +1 -1
  98. package/realtime-server/dist/index.js +27 -16
  99. package/realtime-server/src/realtime-continuity-synchronizer.ts +5 -3
  100. package/realtime-server/src/realtime-mutable-family-provider.ts +2 -1
  101. package/realtime-server/src/realtime-mutable-provider.ts +1 -1
  102. package/realtime-server/src/realtime-server-stores/server-sync-store.ts +21 -11
  103. package/realtime-testing/dist/index.cjs +7 -2
  104. package/realtime-testing/dist/index.js +8 -5
  105. package/realtime-testing/src/setup-realtime-test.tsx +5 -2
  106. package/src/atom.ts +19 -7
  107. package/src/dispose-state.ts +10 -0
  108. package/src/index.ts +5 -2
  109. package/src/selector.ts +13 -7
  110. package/src/silo.ts +3 -3
  111. package/src/subscribe.ts +8 -4
  112. package/src/timeline.ts +18 -1
  113. package/src/transaction.ts +59 -4
  114. package/dist/chunk-BF4MVQF6.js +0 -44
  115. package/internal/src/store/withdraw-new-family-member.ts +0 -69
  116. /package/{src → ephemeral/src}/find-state.ts +0 -0
@@ -1,7 +1,13 @@
1
1
  import type {
2
2
  AtomFamilyToken,
3
3
  FamilyMetadata,
4
+ Flat,
4
5
  Func,
6
+ MoleculeCreation,
7
+ MoleculeDisposal,
8
+ ReadableToken,
9
+ StateCreation,
10
+ StateDisposal,
5
11
  StateUpdate,
6
12
  TimelineManageable,
7
13
  TimelineOptions,
@@ -10,6 +16,7 @@ import type {
10
16
  TokenType,
11
17
  TransactionUpdate,
12
18
  } from "atom.io"
19
+ import { type Json, stringifyJson } from "atom.io/json"
13
20
 
14
21
  import { newest } from "../lineage"
15
22
  import { getUpdateToken, isMutable } from "../mutable"
@@ -17,31 +24,46 @@ import { type Store, withdraw } from "../store"
17
24
  import { Subject } from "../subject"
18
25
  import { addAtomToTimeline } from "./add-atom-to-timeline"
19
26
 
20
- export type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> =
27
+ export type TimelineAtomUpdate<ManagedAtom extends TimelineManageable> = Flat<
21
28
  StateUpdate<TokenType<ManagedAtom>> & {
22
29
  key: string
23
30
  type: `atom_update`
24
31
  timestamp: number
25
32
  family?: FamilyMetadata
26
33
  }
34
+ >
27
35
  export type TimelineSelectorUpdate<ManagedAtom extends TimelineManageable> = {
28
36
  key: string
29
37
  type: `selector_update`
30
38
  timestamp: number
31
39
  atomUpdates: Omit<TimelineAtomUpdate<ManagedAtom>, `timestamp`>[]
32
40
  }
33
- export type TimelineTransactionUpdate = TransactionUpdate<Func> & {
34
- key: string
35
- type: `transaction_update`
36
- timestamp: number
37
- }
41
+ export type TimelineTransactionUpdate = Flat<
42
+ TransactionUpdate<Func> & {
43
+ key: string
44
+ type: `transaction_update`
45
+ timestamp: number
46
+ }
47
+ >
48
+ export type TimelineStateCreation<T extends ReadableToken<any>> = Flat<
49
+ StateCreation<T> & { timestamp: number }
50
+ >
51
+ export type TimelineStateDisposal<T extends ReadableToken<any>> = Flat<
52
+ StateDisposal<T> & { timestamp: number }
53
+ >
54
+ export type TimelineMoleculeCreation<Key extends Json.Serializable> = Flat<
55
+ MoleculeCreation<Key> & { timestamp: number }
56
+ >
57
+ export type TimelineMoleculeDisposal<Key extends Json.Serializable> = Flat<
58
+ MoleculeDisposal<Key> & { timestamp: number }
59
+ >
38
60
 
39
61
  export type Timeline<ManagedAtom extends TimelineManageable> = {
40
62
  type: `timeline`
41
63
  key: string
42
64
  at: number
43
65
  shouldCapture?: (
44
- update: TimelineUpdate<TimelineManageable>,
66
+ update: TimelineUpdate<ManagedAtom>,
45
67
  timeline: Timeline<ManagedAtom>,
46
68
  ) => boolean
47
69
  timeTraveling: `into_future` | `into_past` | null
@@ -49,13 +71,8 @@ export type Timeline<ManagedAtom extends TimelineManageable> = {
49
71
  selectorTime: number | null
50
72
  transactionKey: string | null
51
73
  install: (store: Store) => void
52
- subject: Subject<
53
- | TimelineAtomUpdate<ManagedAtom>
54
- | TimelineSelectorUpdate<ManagedAtom>
55
- | TimelineTransactionUpdate
56
- | `redo`
57
- | `undo`
58
- >
74
+ subject: Subject<TimelineUpdate<ManagedAtom> | `redo` | `undo`>
75
+ subscriptions: Map<string, () => void>
59
76
  }
60
77
 
61
78
  export function createTimeline<ManagedAtom extends TimelineManageable>(
@@ -67,6 +84,7 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
67
84
  type: `timeline`,
68
85
  key: options.key,
69
86
  at: 0,
87
+
70
88
  timeTraveling: null,
71
89
  selectorTime: null,
72
90
  transactionKey: null,
@@ -74,62 +92,140 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
74
92
  history: data?.history.map((update) => ({ ...update })) ?? [],
75
93
  install: (s) => createTimeline(options, s, tl),
76
94
  subject: new Subject(),
95
+ subscriptions: new Map(),
77
96
  }
78
97
  if (options.shouldCapture) {
79
98
  tl.shouldCapture = options.shouldCapture
80
99
  }
81
100
  const timelineKey = options.key
82
101
  const target = newest(store)
83
- for (const tokenOrFamily of options.atoms) {
102
+ for (const tokenOrFamily of options.scope) {
84
103
  let atomKey = tokenOrFamily.key
85
- if (
86
- tokenOrFamily.type === `atom_family` ||
87
- tokenOrFamily.type === `mutable_atom_family`
88
- ) {
89
- const familyToken: AtomFamilyToken<any> = tokenOrFamily
90
- const family = withdraw(familyToken, store)
91
- const familyKey = family.key
92
- target.timelineAtoms.set({ atomKey: familyKey, timelineKey })
93
- family.subject.subscribe(`timeline:${options.key}`, (token) => {
94
- addAtomToTimeline(token, tl, store)
95
- })
96
- for (const atom of target.atoms.values()) {
97
- if (atom.family?.key === familyKey) {
104
+ switch (tokenOrFamily.type) {
105
+ case `atom_family`:
106
+ case `mutable_atom_family`:
107
+ {
108
+ const familyToken: AtomFamilyToken<any> = tokenOrFamily
109
+ const family = withdraw(familyToken, store)
110
+ const familyKey = family.key
111
+ target.timelineAtoms.set({ atomKey: familyKey, timelineKey })
112
+ tl.subscriptions.set(
113
+ family.key,
114
+ family.subject.subscribe(
115
+ `timeline:${options.key}`,
116
+ (creationOrDisposal) => {
117
+ handleStateLifecycleEvent(creationOrDisposal, tl, store)
118
+ },
119
+ ),
120
+ )
121
+ for (const atom of target.atoms.values()) {
122
+ if (atom.family?.key === familyKey) {
123
+ addAtomToTimeline(atom, tl, store)
124
+ }
125
+ }
126
+ }
127
+ break
128
+ case `atom`:
129
+ case `mutable_atom`:
130
+ {
131
+ let atom = withdraw(tokenOrFamily, store)
132
+ if (isMutable(atom)) {
133
+ const updateAtom = withdraw(getUpdateToken(atom), store)
134
+ atom = updateAtom
135
+ atomKey = atom.key
136
+ }
137
+ if (`family` in atom) {
138
+ const familyTimelineKey = target.timelineAtoms.getRelatedKey(
139
+ atom.family.key,
140
+ )
141
+ if (familyTimelineKey) {
142
+ store.logger.error(
143
+ `❌`,
144
+ `timeline`,
145
+ options.key,
146
+ `Failed to add atom "${atom.key}" because its family "${atom.family.key}" already belongs to timeline "${familyTimelineKey}"`,
147
+ )
148
+ continue
149
+ }
150
+ }
151
+ const existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)
152
+ if (existingTimelineKey) {
153
+ store.logger.error(
154
+ `❌`,
155
+ `timeline`,
156
+ options.key,
157
+ `Failed to add atom "${atomKey}" because it already belongs to timeline "${existingTimelineKey}"`,
158
+ )
159
+ continue
160
+ }
98
161
  addAtomToTimeline(atom, tl, store)
99
162
  }
100
- }
101
- } else {
102
- let atom = withdraw(tokenOrFamily, store)
103
- if (isMutable(atom)) {
104
- const updateAtom = withdraw(getUpdateToken(atom), store)
105
- atom = updateAtom
106
- atomKey = atom.key
107
- }
108
- if (`family` in atom) {
109
- const familyTimelineKey = target.timelineAtoms.getRelatedKey(
110
- atom.family.key,
111
- )
112
- if (familyTimelineKey) {
113
- store.logger.error(
114
- `❌`,
115
- `timeline`,
116
- options.key,
117
- `Failed to add atom "${atom.key}" because its family "${atom.family.key}" already belongs to timeline "${familyTimelineKey}"`,
118
- )
119
- continue
163
+ break
164
+ case `molecule_family`:
165
+ {
166
+ const family = store.moleculeFamilies.get(tokenOrFamily.key)
167
+ if (family) {
168
+ tl.subscriptions.set(
169
+ tokenOrFamily.key,
170
+ family.subject.subscribe(
171
+ `timeline:${options.key}`,
172
+ (creationOrDisposal) => {
173
+ switch (creationOrDisposal.type) {
174
+ case `molecule_creation`:
175
+ {
176
+ const molecule = store.molecules.get(
177
+ stringifyJson(creationOrDisposal.token.key),
178
+ )
179
+ if (molecule) {
180
+ const event = Object.assign(creationOrDisposal, {
181
+ timestamp: Date.now(),
182
+ })
183
+ tl.history.push(event)
184
+ tl.at = tl.history.length
185
+ tl.subject.next(event)
186
+
187
+ for (const token of molecule.tokens) {
188
+ switch (token.type) {
189
+ case `atom`:
190
+ case `mutable_atom`:
191
+ addAtomToTimeline(token, tl, store)
192
+ break
193
+ }
194
+ }
195
+ tl.subscriptions.set(
196
+ molecule.key,
197
+ molecule.subject.subscribe(
198
+ `timeline:${options.key}`,
199
+ (stateCreationOrDisposal) => {
200
+ handleStateLifecycleEvent(
201
+ stateCreationOrDisposal,
202
+ tl,
203
+ store,
204
+ )
205
+ },
206
+ ),
207
+ )
208
+ }
209
+ }
210
+ break
211
+ case `molecule_disposal`:
212
+ tl.subscriptions.get(creationOrDisposal.token.key)?.()
213
+ tl.subscriptions.delete(creationOrDisposal.token.key)
214
+ for (const familyKey of creationOrDisposal.familyKeys) {
215
+ const stateKey = `${familyKey}(${stringifyJson(
216
+ creationOrDisposal.token.key,
217
+ )})`
218
+ tl.subscriptions.get(stateKey)?.()
219
+ tl.subscriptions.delete(stateKey)
220
+ }
221
+ break
222
+ }
223
+ },
224
+ ),
225
+ )
226
+ }
120
227
  }
121
- }
122
- const existingTimelineKey = target.timelineAtoms.getRelatedKey(atomKey)
123
- if (existingTimelineKey) {
124
- store.logger.error(
125
- `❌`,
126
- `timeline`,
127
- options.key,
128
- `Failed to add atom "${atomKey}" because it already belongs to timeline "${existingTimelineKey}"`,
129
- )
130
- continue
131
- }
132
- addAtomToTimeline(atom, tl, store)
228
+ break
133
229
  }
134
230
  }
135
231
 
@@ -141,3 +237,28 @@ export function createTimeline<ManagedAtom extends TimelineManageable>(
141
237
  store.on.timelineCreation.next(token)
142
238
  return token
143
239
  }
240
+
241
+ function handleStateLifecycleEvent(
242
+ event: StateCreation<any> | StateDisposal<any>,
243
+ tl: Timeline<any>,
244
+ store: Store,
245
+ ): void {
246
+ const timestamp = Date.now()
247
+ const timelineEvent = Object.assign(event, {
248
+ timestamp,
249
+ }) as TimelineUpdate<any>
250
+ if (!tl.timeTraveling) {
251
+ tl.history.push(timelineEvent)
252
+ tl.at = tl.history.length
253
+ tl.subject.next(timelineEvent)
254
+ }
255
+ switch (event.type) {
256
+ case `state_creation`:
257
+ addAtomToTimeline(event.token, tl, store)
258
+ break
259
+ case `state_disposal`:
260
+ tl.subscriptions.get(event.token.key)?.()
261
+ tl.subscriptions.delete(event.token.key)
262
+ break
263
+ }
264
+ }
@@ -2,6 +2,10 @@ import type { TimelineToken } from "atom.io"
2
2
 
3
3
  import {
4
4
  ingestAtomUpdate,
5
+ ingestCreationEvent,
6
+ ingestDisposalEvent,
7
+ ingestMoleculeCreationEvent,
8
+ ingestMoleculeDisposalEvent,
5
9
  ingestSelectorUpdate,
6
10
  ingestTransactionUpdate,
7
11
  } from "../ingest-updates"
@@ -64,6 +68,22 @@ export const timeTravel = (
64
68
  ingestTransactionUpdate(applying, update, store)
65
69
  break
66
70
  }
71
+ case `state_creation`: {
72
+ ingestCreationEvent(update, applying, store)
73
+ break
74
+ }
75
+ case `state_disposal`: {
76
+ ingestDisposalEvent(update, applying, store)
77
+ break
78
+ }
79
+ case `molecule_creation`: {
80
+ ingestMoleculeCreationEvent(update, applying, store)
81
+ break
82
+ }
83
+ case `molecule_disposal`: {
84
+ ingestMoleculeDisposalEvent(update, applying, store)
85
+ break
86
+ }
67
87
  }
68
88
 
69
89
  if (action === `redo`) {
@@ -46,19 +46,9 @@ export const applyTransaction = <F extends Func>(
46
46
  }
47
47
  tracker.dispose()
48
48
  }
49
- for (const atom of child.atoms.values()) {
50
- if (!parent.atoms.has(atom.key)) {
51
- parent.atoms.set(atom.key, atom)
52
- parent.valueMap.set(atom.key, atom.default)
53
- parent.logger.info(
54
- `🔨`,
55
- `transaction`,
56
- child.transactionMeta.update.key,
57
- `Adding atom "${atom.key}"`,
58
- )
59
- }
60
- }
49
+
61
50
  ingestTransactionUpdate(`newValue`, child.transactionMeta.update, parent)
51
+
62
52
  if (isRootStore(parent)) {
63
53
  setEpochNumberOfAction(
64
54
  child.transactionMeta.update.key,
@@ -1,13 +1,16 @@
1
- import type { findState, Func } from "atom.io"
1
+ import type { Func } from "atom.io"
2
+ import type { findState } from "atom.io/ephemeral"
3
+ import { makeMoleculeInStore, type seekState } from "atom.io/immortal"
2
4
 
3
5
  import { Junction } from "~/packages/rel8/junction/src"
4
6
 
5
7
  import { arbitrary } from "../arbitrary"
6
- import { findInStore } from "../families"
8
+ import { disposeFromStore, findInStore, seekInStore } from "../families"
7
9
  import { getEnvironmentData } from "../get-environment-data"
8
10
  import { getFromStore } from "../get-state"
9
11
  import { LazyMap } from "../lazy-map"
10
12
  import { newest } from "../lineage"
13
+ import { getJsonToken } from "../mutable"
11
14
  import { setIntoStore } from "../set-state"
12
15
  import type { Store } from "../store"
13
16
  import type { TransactionProgress } from "."
@@ -43,11 +46,15 @@ export const buildTransaction = (
43
46
  }),
44
47
  selectors: new LazyMap(parent.selectors),
45
48
  valueMap: new LazyMap(parent.valueMap),
49
+ molecules: new LazyMap(parent.molecules),
50
+ moleculeFamilies: new LazyMap(parent.moleculeFamilies),
51
+ miscResources: new LazyMap(parent.miscResources),
46
52
  }
47
53
  const epoch = getEpochNumberOfAction(key, store)
48
54
  const transactionMeta: TransactionProgress<Func> = {
49
55
  phase: `building`,
50
56
  update: {
57
+ type: `transaction_update`,
51
58
  key,
52
59
  id,
53
60
  epoch: epoch === undefined ? Number.NaN : epoch + 1,
@@ -63,6 +70,13 @@ export const buildTransaction = (
63
70
  run: (token, identifier = arbitrary()) =>
64
71
  actUponStore(token, identifier, child),
65
72
  find: ((token, k) => findInStore(token, k, child)) as typeof findState,
73
+ seek: ((token, k) => seekInStore(token, k, child)) as typeof seekState,
74
+ json: (token) => getJsonToken(token, child),
75
+ make: (context, family, k, ...args) =>
76
+ makeMoleculeInStore(child, context, family, k, ...args),
77
+ dispose: (token) => {
78
+ disposeFromStore(token, child)
79
+ },
66
80
  env: () => getEnvironmentData(child),
67
81
  },
68
82
  }
@@ -66,55 +66,45 @@ var attachAtomIndex = (store = Internal2.IMPLICIT.STORE) => {
66
66
  },
67
67
  effects: [
68
68
  ({ setSelf }) => {
69
- const unsubscribeFromAtomCreation = store.on.atomCreation.subscribe(
70
- `introspection`,
71
- (atomToken) => {
72
- if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
73
- return;
74
- }
75
- setSelf((self) => {
76
- if (atomToken.family) {
77
- const { key: familyKey, subKey } = atomToken.family;
78
- let familyNode = self.get(familyKey);
79
- if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
80
- familyNode = {
81
- key: familyKey,
82
- familyMembers: /* @__PURE__ */ new Map()
83
- };
84
- self.set(familyKey, familyNode);
85
- }
86
- familyNode.familyMembers.set(subKey, atomToken);
87
- } else {
88
- self.set(atomToken.key, atomToken);
89
- }
90
- return self;
91
- });
69
+ store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
70
+ if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
71
+ return;
92
72
  }
93
- );
94
- const unsubscribeFromAtomDisposal = store.on.atomDisposal.subscribe(
95
- `introspection`,
96
- (atomToken) => {
97
- setSelf((self) => {
98
- if (atomToken.family) {
99
- const { key: familyKey, subKey } = atomToken.family;
100
- const familyNode = self.get(familyKey);
101
- if (familyNode && `familyMembers` in familyNode) {
102
- familyNode.familyMembers.delete(subKey);
103
- if (familyNode.familyMembers.size === 0) {
104
- self.delete(familyKey);
105
- }
73
+ setSelf((self) => {
74
+ if (atomToken.family) {
75
+ const { key: familyKey, subKey } = atomToken.family;
76
+ let familyNode = self.get(familyKey);
77
+ if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
78
+ familyNode = {
79
+ key: familyKey,
80
+ familyMembers: /* @__PURE__ */ new Map()
81
+ };
82
+ self.set(familyKey, familyNode);
83
+ }
84
+ familyNode.familyMembers.set(subKey, atomToken);
85
+ } else {
86
+ self.set(atomToken.key, atomToken);
87
+ }
88
+ return self;
89
+ });
90
+ });
91
+ store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
92
+ setSelf((self) => {
93
+ if (atomToken.family) {
94
+ const { key: familyKey, subKey } = atomToken.family;
95
+ const familyNode = self.get(familyKey);
96
+ if (familyNode && `familyMembers` in familyNode) {
97
+ familyNode.familyMembers.delete(subKey);
98
+ if (familyNode.familyMembers.size === 0) {
99
+ self.delete(familyKey);
106
100
  }
107
- } else {
108
- self.delete(atomToken.key);
109
101
  }
110
- return self;
111
- });
112
- }
113
- );
114
- return () => {
115
- unsubscribeFromAtomCreation();
116
- unsubscribeFromAtomDisposal();
117
- };
102
+ } else {
103
+ self.delete(atomToken.key);
104
+ }
105
+ return self;
106
+ });
107
+ });
118
108
  }
119
109
  ]
120
110
  },
@@ -159,7 +149,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
159
149
  },
160
150
  effects: [
161
151
  ({ setSelf }) => {
162
- const unsubscribeFromSelectorCreation = store.on.selectorCreation.subscribe(
152
+ store.on.selectorCreation.subscribe(
163
153
  `introspection`,
164
154
  (selectorToken) => {
165
155
  if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
@@ -184,7 +174,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
184
174
  });
185
175
  }
186
176
  );
187
- const unsubscribeFromSelectorDisposal = store.on.selectorDisposal.subscribe(
177
+ store.on.selectorDisposal.subscribe(
188
178
  `introspection`,
189
179
  (selectorToken) => {
190
180
  setSelf((self) => {
@@ -204,10 +194,6 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
204
194
  });
205
195
  }
206
196
  );
207
- return () => {
208
- unsubscribeFromSelectorCreation();
209
- unsubscribeFromSelectorDisposal();
210
- };
211
197
  }
212
198
  ]
213
199
  },
@@ -238,7 +224,8 @@ var attachTimelineFamily = (store = Internal2.IMPLICIT.STORE) => {
238
224
  transactionKey: null,
239
225
  install: () => {
240
226
  },
241
- subject: new Internal2.Subject()
227
+ subject: new Internal2.Subject(),
228
+ subscriptions: /* @__PURE__ */ new Map()
242
229
  };
243
230
  },
244
231
  effects: (key) => [
@@ -31,55 +31,45 @@ var attachAtomIndex = (store = IMPLICIT.STORE) => {
31
31
  },
32
32
  effects: [
33
33
  ({ setSelf }) => {
34
- const unsubscribeFromAtomCreation = store.on.atomCreation.subscribe(
35
- `introspection`,
36
- (atomToken) => {
37
- if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
38
- return;
39
- }
40
- setSelf((self) => {
41
- if (atomToken.family) {
42
- const { key: familyKey, subKey } = atomToken.family;
43
- let familyNode = self.get(familyKey);
44
- if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
45
- familyNode = {
46
- key: familyKey,
47
- familyMembers: /* @__PURE__ */ new Map()
48
- };
49
- self.set(familyKey, familyNode);
50
- }
51
- familyNode.familyMembers.set(subKey, atomToken);
52
- } else {
53
- self.set(atomToken.key, atomToken);
54
- }
55
- return self;
56
- });
34
+ store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
35
+ if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
36
+ return;
57
37
  }
58
- );
59
- const unsubscribeFromAtomDisposal = store.on.atomDisposal.subscribe(
60
- `introspection`,
61
- (atomToken) => {
62
- setSelf((self) => {
63
- if (atomToken.family) {
64
- const { key: familyKey, subKey } = atomToken.family;
65
- const familyNode = self.get(familyKey);
66
- if (familyNode && `familyMembers` in familyNode) {
67
- familyNode.familyMembers.delete(subKey);
68
- if (familyNode.familyMembers.size === 0) {
69
- self.delete(familyKey);
70
- }
38
+ setSelf((self) => {
39
+ if (atomToken.family) {
40
+ const { key: familyKey, subKey } = atomToken.family;
41
+ let familyNode = self.get(familyKey);
42
+ if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
43
+ familyNode = {
44
+ key: familyKey,
45
+ familyMembers: /* @__PURE__ */ new Map()
46
+ };
47
+ self.set(familyKey, familyNode);
48
+ }
49
+ familyNode.familyMembers.set(subKey, atomToken);
50
+ } else {
51
+ self.set(atomToken.key, atomToken);
52
+ }
53
+ return self;
54
+ });
55
+ });
56
+ store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
57
+ setSelf((self) => {
58
+ if (atomToken.family) {
59
+ const { key: familyKey, subKey } = atomToken.family;
60
+ const familyNode = self.get(familyKey);
61
+ if (familyNode && `familyMembers` in familyNode) {
62
+ familyNode.familyMembers.delete(subKey);
63
+ if (familyNode.familyMembers.size === 0) {
64
+ self.delete(familyKey);
71
65
  }
72
- } else {
73
- self.delete(atomToken.key);
74
66
  }
75
- return self;
76
- });
77
- }
78
- );
79
- return () => {
80
- unsubscribeFromAtomCreation();
81
- unsubscribeFromAtomDisposal();
82
- };
67
+ } else {
68
+ self.delete(atomToken.key);
69
+ }
70
+ return self;
71
+ });
72
+ });
83
73
  }
84
74
  ]
85
75
  },
@@ -124,7 +114,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
124
114
  },
125
115
  effects: [
126
116
  ({ setSelf }) => {
127
- const unsubscribeFromSelectorCreation = store.on.selectorCreation.subscribe(
117
+ store.on.selectorCreation.subscribe(
128
118
  `introspection`,
129
119
  (selectorToken) => {
130
120
  if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
@@ -149,7 +139,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
149
139
  });
150
140
  }
151
141
  );
152
- const unsubscribeFromSelectorDisposal = store.on.selectorDisposal.subscribe(
142
+ store.on.selectorDisposal.subscribe(
153
143
  `introspection`,
154
144
  (selectorToken) => {
155
145
  setSelf((self) => {
@@ -169,10 +159,6 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
169
159
  });
170
160
  }
171
161
  );
172
- return () => {
173
- unsubscribeFromSelectorCreation();
174
- unsubscribeFromSelectorDisposal();
175
- };
176
162
  }
177
163
  ]
178
164
  },
@@ -203,7 +189,8 @@ var attachTimelineFamily = (store = IMPLICIT.STORE) => {
203
189
  transactionKey: null,
204
190
  install: () => {
205
191
  },
206
- subject: new Subject()
192
+ subject: new Subject(),
193
+ subscriptions: /* @__PURE__ */ new Map()
207
194
  };
208
195
  },
209
196
  effects: (key) => [