atom.io 0.20.3 → 0.21.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 (42) hide show
  1. package/data/dist/index.cjs +1 -1
  2. package/data/dist/index.js +1 -1
  3. package/data/src/join.ts +2 -2
  4. package/dist/{chunk-SMZRGPN6.js → chunk-KGZGBCYS.js} +2 -2
  5. package/dist/chunk-PNIHPILQ.js +8 -0
  6. package/dist/{chunk-2AIFLP2B.js → chunk-RT43TVKP.js} +2 -2
  7. package/dist/index.cjs +4 -4
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +5 -7
  10. package/internal/dist/index.cjs +31 -26
  11. package/internal/dist/index.d.ts +10 -6
  12. package/internal/dist/index.js +30 -25
  13. package/internal/src/atom/create-regular-atom.ts +1 -1
  14. package/internal/src/atom/dispose-atom.ts +42 -0
  15. package/internal/src/atom/index.ts +1 -1
  16. package/internal/src/selector/{delete-selector.ts → dispose-selector.ts} +3 -2
  17. package/internal/src/selector/index.ts +1 -1
  18. package/internal/src/store/deposit.ts +5 -0
  19. package/internal/src/store/store.ts +5 -1
  20. package/introspection/dist/index.cjs +250 -106
  21. package/introspection/dist/index.d.ts +43 -6
  22. package/introspection/dist/index.js +225 -83
  23. package/introspection/src/attach-atom-index.ts +68 -47
  24. package/introspection/src/attach-selector-index.ts +76 -59
  25. package/introspection/src/auditor.ts +135 -0
  26. package/introspection/src/index.ts +8 -18
  27. package/package.json +9 -9
  28. package/react-devtools/dist/index.cjs +3 -3
  29. package/react-devtools/dist/index.d.ts +5 -5
  30. package/react-devtools/dist/index.js +4 -4
  31. package/react-devtools/src/StateIndex.tsx +8 -27
  32. package/realtime-client/dist/index.cjs +1 -1
  33. package/realtime-client/dist/index.js +1 -1
  34. package/realtime-client/src/sync-continuity.ts +2 -2
  35. package/realtime-react/dist/index.cjs +1 -1
  36. package/realtime-react/dist/index.js +1 -1
  37. package/realtime-server/dist/index.cjs +2 -2
  38. package/realtime-server/dist/index.js +1 -1
  39. package/realtime-testing/dist/index.cjs +4 -4
  40. package/realtime-testing/dist/index.js +1 -1
  41. package/src/dispose.ts +3 -3
  42. package/internal/src/atom/delete-atom.ts +0 -40
@@ -0,0 +1,135 @@
1
+ import type {
2
+ AtomToken,
3
+ ReadableToken,
4
+ ReadonlySelectorToken,
5
+ SelectorToken,
6
+ } from "atom.io"
7
+ import * as Internal from "atom.io/internal"
8
+
9
+ import { getState } from "../../src/get-state"
10
+ import type { FamilyNode } from "."
11
+ import type { AtomTokenIndex } from "./attach-atom-index"
12
+ import { attachAtomIndex } from "./attach-atom-index"
13
+ import type { SelectorTokenIndex } from "./attach-selector-index"
14
+ import { attachSelectorIndex } from "./attach-selector-index"
15
+
16
+ export type ListResourcesParam = {
17
+ atomFamilies: boolean
18
+ selectorFamilies: boolean
19
+ }
20
+
21
+ /**
22
+ * Auditor is a tool for identifying lingering resources in your store that may result in memory leaks.
23
+ * @experimental
24
+ */
25
+ export class Auditor {
26
+ public auditorCreatedAt: number = performance.now()
27
+ public statesCreatedAt: Map<string, number> = new Map()
28
+ public readonly atomIndex: ReadonlySelectorToken<AtomTokenIndex>
29
+ public readonly selectorIndex: ReadonlySelectorToken<SelectorTokenIndex>
30
+ public disposed = false
31
+
32
+ private readonly unsubscribeFromAtomCreation: () => void
33
+ private readonly unsubscribeFromAtomDisposal: () => void
34
+ private readonly unsubscribeFromSelectorCreation: () => void
35
+ private readonly unsubscribeFromSelectorDisposal: () => void
36
+
37
+ /**
38
+ * @param {Store} store - The store to audit.
39
+ */
40
+ public constructor(
41
+ public readonly store: Internal.Store = Internal.IMPLICIT.STORE,
42
+ ) {
43
+ this.atomIndex = attachAtomIndex(this.store)
44
+ this.selectorIndex = attachSelectorIndex(this.store)
45
+ this.unsubscribeFromAtomCreation = this.store.on.atomCreation.subscribe(
46
+ `auditor-${this.auditorCreatedAt}`,
47
+ ({ key }) => {
48
+ this.statesCreatedAt.set(key, performance.now() - this.auditorCreatedAt)
49
+ },
50
+ )
51
+ this.unsubscribeFromAtomDisposal = this.store.on.atomDisposal.subscribe(
52
+ `auditor-${this.auditorCreatedAt}`,
53
+ ({ key }) => {
54
+ this.statesCreatedAt.delete(key)
55
+ },
56
+ )
57
+ this.unsubscribeFromSelectorCreation =
58
+ this.store.on.selectorCreation.subscribe(
59
+ `auditor-${this.auditorCreatedAt}`,
60
+ ({ key }) => {
61
+ this.statesCreatedAt.set(
62
+ key,
63
+ performance.now() - this.auditorCreatedAt,
64
+ )
65
+ },
66
+ )
67
+ this.unsubscribeFromSelectorDisposal =
68
+ this.store.on.selectorDisposal.subscribe(
69
+ `auditor-${this.auditorCreatedAt}`,
70
+ ({ key }) => {
71
+ this.statesCreatedAt.delete(key)
72
+ },
73
+ )
74
+ }
75
+
76
+ public static readonly DEFAULT_LIST_RESOURCES_PARAM = {
77
+ atomFamilies: true,
78
+ selectorFamilies: true,
79
+ } satisfies ListResourcesParam
80
+ /**
81
+ * Lists all resources in the store, along with their creation time.
82
+ *
83
+ * @param {ListResourcesParam} [param] - Optional parameters for filtering the list of resources.
84
+ * @returns {readonly [ReadableToken<unknown>, number]}[] - An array of tuples, where each tuple contains a state token belonging to a family in the store and that state's creation time.
85
+ */
86
+ public listResources(
87
+ param: ListResourcesParam = Auditor.DEFAULT_LIST_RESOURCES_PARAM,
88
+ ): (readonly [ReadableToken<unknown>, number])[] {
89
+ if (this.disposed) {
90
+ throw new Error(`This Auditor has been disposed`)
91
+ }
92
+ const atoms = getState(this.atomIndex)
93
+ const selectors = getState(this.selectorIndex)
94
+ const atomFamilyNodes = [...atoms.values()].filter(
95
+ (node): node is FamilyNode<AtomToken<unknown>> => `familyMembers` in node,
96
+ )
97
+ const selectorFamilyNodes = [...selectors.values()].filter(
98
+ (node): node is FamilyNode<SelectorToken<unknown>> =>
99
+ `familyMembers` in node,
100
+ )
101
+ const currentTime = performance.now()
102
+ const resources: (readonly [ReadableToken<unknown>, number])[] = []
103
+ if (param.atomFamilies) {
104
+ for (const familyNode of atomFamilyNodes) {
105
+ const tokens = familyNode.familyMembers.values()
106
+ for (const token of tokens) {
107
+ const storedTime = this.statesCreatedAt.get(token.key)
108
+ const creationTime = storedTime ?? this.auditorCreatedAt
109
+ const age = currentTime - creationTime
110
+ resources.push([token, age])
111
+ }
112
+ }
113
+ }
114
+ if (param.selectorFamilies) {
115
+ for (const familyNode of selectorFamilyNodes) {
116
+ const tokens = familyNode.familyMembers.values()
117
+ for (const token of tokens) {
118
+ const storedTime = this.statesCreatedAt.get(token.key)
119
+ const creationTime = storedTime ?? this.auditorCreatedAt
120
+ const age = currentTime - creationTime
121
+ resources.push([token, age])
122
+ }
123
+ }
124
+ }
125
+ return resources
126
+ }
127
+
128
+ public [Symbol.dispose](): void {
129
+ this.unsubscribeFromAtomCreation()
130
+ this.unsubscribeFromAtomDisposal()
131
+ this.unsubscribeFromSelectorCreation()
132
+ this.unsubscribeFromSelectorDisposal()
133
+ this.disposed = true
134
+ }
135
+ }
@@ -1,24 +1,14 @@
1
- import type {
2
- AtomToken,
3
- ReadonlySelectorToken,
4
- WritableSelectorToken,
5
- } from "atom.io"
1
+ import type { ReadableToken } from "atom.io"
6
2
 
7
3
  export * from "./attach-introspection-states"
4
+ export * from "./auditor"
8
5
 
9
- export type FamilyNode<
10
- Token extends
11
- | AtomToken<unknown>
12
- | ReadonlySelectorToken<unknown>
13
- | WritableSelectorToken<unknown>,
14
- > = {
6
+ export type FamilyNode<Token extends ReadableToken<unknown>> = {
15
7
  key: string
16
- familyMembers: Record<string, Token>
8
+ familyMembers: Map<string, Token>
17
9
  }
18
10
 
19
- export type WritableTokenIndex<
20
- Token extends
21
- | AtomToken<unknown>
22
- | ReadonlySelectorToken<unknown>
23
- | WritableSelectorToken<unknown>,
24
- > = Record<string, FamilyNode<Token> | Token>
11
+ export type WritableTokenIndex<Token extends ReadableToken<unknown>> = Map<
12
+ string,
13
+ FamilyNode<Token> | Token
14
+ >
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atom.io",
3
- "version": "0.20.3",
3
+ "version": "0.21.0",
4
4
  "description": "Composable and testable reactive data library.",
5
5
  "homepage": "https://atom.io.fyi",
6
6
  "sideEffects": false,
@@ -48,7 +48,7 @@
48
48
  }
49
49
  },
50
50
  "devDependencies": {
51
- "@testing-library/react": "15.0.5",
51
+ "@testing-library/react": "15.0.6",
52
52
  "@types/eslint": "npm:@types/eslint@8.56.10",
53
53
  "@types/eslint-v9": "npm:@types/eslint@8.56.10",
54
54
  "@types/estree": "1.0.5",
@@ -58,19 +58,19 @@
58
58
  "@types/tmp": "0.2.6",
59
59
  "@typescript-eslint/parser": "7.8.0",
60
60
  "@typescript-eslint/rule-tester": "7.8.0",
61
- "@vitest/coverage-v8": "1.5.2",
62
- "@vitest/ui": "1.5.2",
61
+ "@vitest/coverage-v8": "1.6.0",
62
+ "@vitest/ui": "1.6.0",
63
63
  "concurrently": "8.2.2",
64
64
  "drizzle-kit": "0.20.17",
65
- "drizzle-orm": "0.30.9",
65
+ "drizzle-orm": "0.30.10",
66
66
  "eslint": "npm:eslint@8.57.0",
67
- "eslint-v9": "npm:eslint@9.1.1",
67
+ "eslint-v9": "npm:eslint@9.2.0",
68
68
  "framer-motion": "11.1.7",
69
69
  "happy-dom": "14.7.1",
70
70
  "http-proxy": "1.18.1",
71
71
  "npmlog": "7.0.1",
72
72
  "postgres": "3.4.4",
73
- "preact": "10.20.2",
73
+ "preact": "10.21.0",
74
74
  "react": "18.3.1",
75
75
  "react-dom": "18.3.1",
76
76
  "react-router-dom": "6.23.0",
@@ -79,9 +79,9 @@
79
79
  "tmp": "0.2.3",
80
80
  "tsup": "8.0.2",
81
81
  "typescript": "5.4.5",
82
- "vite": "5.2.10",
82
+ "vite": "5.2.11",
83
83
  "vite-tsconfig-paths": "4.3.2",
84
- "vitest": "1.5.2"
84
+ "vitest": "1.6.0"
85
85
  },
86
86
  "main": "dist/index.js",
87
87
  "types": "dist/index.d.ts",
@@ -1717,7 +1717,7 @@ var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
1717
1717
  var StateIndexTreeNode = ({ node, isOpenState }) => {
1718
1718
  const setIsOpen = react$1.useI(isOpenState);
1719
1719
  const isOpen = react$1.useO(isOpenState);
1720
- for (const [key, childNode] of recordToEntries(node.familyMembers)) {
1720
+ for (const [key, childNode] of node.familyMembers) {
1721
1721
  atom_io.findState(findViewIsOpenState, key);
1722
1722
  atom_io.findState(findStateTypeState, childNode);
1723
1723
  }
@@ -1736,7 +1736,7 @@ var StateIndexTreeNode = ({ node, isOpenState }) => {
1736
1736
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "type detail", children: " (family)" })
1737
1737
  ] })
1738
1738
  ] }),
1739
- isOpen ? Object.entries(node.familyMembers).map(([key, childNode]) => /* @__PURE__ */ jsxRuntime.jsx(
1739
+ isOpen ? [...node.familyMembers.entries()].map(([key, childNode]) => /* @__PURE__ */ jsxRuntime.jsx(
1740
1740
  StateIndexNode,
1741
1741
  {
1742
1742
  node: childNode,
@@ -1759,7 +1759,7 @@ var StateIndexNode = ({ node, isOpenState, typeState }) => {
1759
1759
  };
1760
1760
  var StateIndex = ({ tokenIndex }) => {
1761
1761
  const tokenIds = react$1.useO(tokenIndex);
1762
- return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index state_index", "data-testid": "state-index", children: Object.entries(tokenIds).filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
1762
+ return /* @__PURE__ */ jsxRuntime.jsx("article", { className: "index state_index", "data-testid": "state-index", children: [...tokenIds.entries()].filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
1763
1763
  return /* @__PURE__ */ jsxRuntime.jsx(
1764
1764
  StateIndexNode,
1765
1765
  {
@@ -1,6 +1,6 @@
1
1
  import * as Internal from 'atom.io/internal';
2
2
  import * as atom_io from 'atom.io';
3
- import { AtomToken, ReadonlySelectorToken, WritableSelectorToken } from 'atom.io';
3
+ import { AtomToken, ReadableToken, SelectorToken } from 'atom.io';
4
4
 
5
5
  type ClassSignature = abstract new (...args: any) => any;
6
6
 
@@ -24,13 +24,13 @@ type PlainObject = Record<keyof any, unknown>;
24
24
 
25
25
  type AtomTokenIndex = WritableTokenIndex<AtomToken<unknown>>;
26
26
 
27
- type FamilyNode<Token extends AtomToken<unknown> | ReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>> = {
27
+ type FamilyNode<Token extends ReadableToken<unknown>> = {
28
28
  key: string;
29
- familyMembers: Record<string, Token>;
29
+ familyMembers: Map<string, Token>;
30
30
  };
31
- type WritableTokenIndex<Token extends AtomToken<unknown> | ReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>> = Record<string, FamilyNode<Token> | Token>;
31
+ type WritableTokenIndex<Token extends ReadableToken<unknown>> = Map<string, FamilyNode<Token> | Token>;
32
32
 
33
- type SelectorTokenIndex = WritableTokenIndex<ReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>>;
33
+ type SelectorTokenIndex = WritableTokenIndex<SelectorToken<unknown>>;
34
34
 
35
35
  type Delta = {
36
36
  summary: string;
@@ -1,4 +1,4 @@
1
- import { pipe, ifDefined, isArray, isRecord, doesExtend, isPlainObject, raiseError, sprawl, recordToEntries, fallback, doNothing, become, mapObject, delve } from '../../dist/chunk-3V3VWQ7X.js';
1
+ import { pipe, ifDefined, isArray, isRecord, doesExtend, isPlainObject, raiseError, sprawl, fallback, doNothing, become, mapObject, delve } from '../../dist/chunk-3V3VWQ7X.js';
2
2
  import { lazyLocalStorageEffect } from '../../dist/chunk-BWWVY5O5.js';
3
3
  import { JSON_TYPE_NAMES, isString, isNumber, isBoolean, stringifyJson, JSON_DEFAULTS } from '../../dist/chunk-BF4MVQF6.js';
4
4
  import { __spreadProps, __spreadValues, __objRest, __restKey } from '../../dist/chunk-F2X4B4VY.js';
@@ -1500,7 +1500,7 @@ var StateIndexLeafNode = ({ node, isOpenState, typeState }) => {
1500
1500
  var StateIndexTreeNode = ({ node, isOpenState }) => {
1501
1501
  const setIsOpen = useI(isOpenState);
1502
1502
  const isOpen = useO(isOpenState);
1503
- for (const [key, childNode] of recordToEntries(node.familyMembers)) {
1503
+ for (const [key, childNode] of node.familyMembers) {
1504
1504
  findState(findViewIsOpenState, key);
1505
1505
  findState(findStateTypeState, childNode);
1506
1506
  }
@@ -1519,7 +1519,7 @@ var StateIndexTreeNode = ({ node, isOpenState }) => {
1519
1519
  /* @__PURE__ */ jsx("span", { className: "type detail", children: " (family)" })
1520
1520
  ] })
1521
1521
  ] }),
1522
- isOpen ? Object.entries(node.familyMembers).map(([key, childNode]) => /* @__PURE__ */ jsx(
1522
+ isOpen ? [...node.familyMembers.entries()].map(([key, childNode]) => /* @__PURE__ */ jsx(
1523
1523
  StateIndexNode,
1524
1524
  {
1525
1525
  node: childNode,
@@ -1542,7 +1542,7 @@ var StateIndexNode = ({ node, isOpenState, typeState }) => {
1542
1542
  };
1543
1543
  var StateIndex = ({ tokenIndex }) => {
1544
1544
  const tokenIds = useO(tokenIndex);
1545
- return /* @__PURE__ */ jsx("article", { className: "index state_index", "data-testid": "state-index", children: Object.entries(tokenIds).filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
1545
+ return /* @__PURE__ */ jsx("article", { className: "index state_index", "data-testid": "state-index", children: [...tokenIds.entries()].filter(([key]) => !key.startsWith(`\u{1F441}\u200D\u{1F5E8}`)).sort().map(([key, node]) => {
1546
1546
  return /* @__PURE__ */ jsx(
1547
1547
  StateIndexNode,
1548
1548
  {
@@ -1,15 +1,13 @@
1
1
  import type {
2
- AtomToken,
2
+ ReadableToken,
3
3
  ReadonlySelectorToken,
4
4
  RegularAtomToken,
5
- WritableSelectorToken,
6
5
  } from "atom.io"
7
6
  import { findState, getState, selectorFamily } from "atom.io"
8
7
  import type { FamilyNode, WritableTokenIndex } from "atom.io/introspection"
9
8
  import { useI, useO } from "atom.io/react"
10
9
  import type { FC } from "react"
11
10
 
12
- import { recordToEntries } from "~/packages/anvl/src/object"
13
11
  import { isJson, refineJsonType } from "~/packages/anvl/src/refinement"
14
12
 
15
13
  import { findViewIsOpenState, primitiveRefinery } from "."
@@ -34,10 +32,7 @@ const findStateTypeState = selectorFamily<string, { key: string }>({
34
32
  })
35
33
 
36
34
  export const StateIndexLeafNode: FC<{
37
- node:
38
- | AtomToken<unknown>
39
- | ReadonlySelectorToken<unknown>
40
- | WritableSelectorToken<unknown>
35
+ node: ReadableToken<unknown>
41
36
  isOpenState: RegularAtomToken<boolean>
42
37
  typeState: ReadonlySelectorToken<string>
43
38
  }> = ({ node, isOpenState, typeState }) => {
@@ -80,16 +75,12 @@ export const StateIndexLeafNode: FC<{
80
75
  )
81
76
  }
82
77
  export const StateIndexTreeNode: FC<{
83
- node: FamilyNode<
84
- | AtomToken<unknown>
85
- | ReadonlySelectorToken<unknown>
86
- | WritableSelectorToken<unknown>
87
- >
78
+ node: FamilyNode<ReadableToken<unknown>>
88
79
  isOpenState: RegularAtomToken<boolean>
89
80
  }> = ({ node, isOpenState }) => {
90
81
  const setIsOpen = useI(isOpenState)
91
82
  const isOpen = useO(isOpenState)
92
- for (const [key, childNode] of recordToEntries(node.familyMembers)) {
83
+ for (const [key, childNode] of node.familyMembers) {
93
84
  findState(findViewIsOpenState, key)
94
85
  findState(findStateTypeState, childNode)
95
86
  }
@@ -107,7 +98,7 @@ export const StateIndexTreeNode: FC<{
107
98
  </label>
108
99
  </header>
109
100
  {isOpen
110
- ? Object.entries(node.familyMembers).map(([key, childNode]) => (
101
+ ? [...node.familyMembers.entries()].map(([key, childNode]) => (
111
102
  <StateIndexNode
112
103
  key={key}
113
104
  node={childNode}
@@ -121,11 +112,7 @@ export const StateIndexTreeNode: FC<{
121
112
  }
122
113
 
123
114
  export const StateIndexNode: FC<{
124
- node: WritableTokenIndex<
125
- | AtomToken<unknown>
126
- | ReadonlySelectorToken<unknown>
127
- | WritableSelectorToken<unknown>
128
- >[string]
115
+ node: FamilyNode<ReadableToken<unknown>> | ReadableToken<unknown>
129
116
  isOpenState: RegularAtomToken<boolean>
130
117
  typeState: ReadonlySelectorToken<string>
131
118
  }> = ({ node, isOpenState, typeState }) => {
@@ -145,18 +132,12 @@ export const StateIndexNode: FC<{
145
132
  }
146
133
 
147
134
  export const StateIndex: FC<{
148
- tokenIndex: ReadonlySelectorToken<
149
- WritableTokenIndex<
150
- | AtomToken<unknown>
151
- | ReadonlySelectorToken<unknown>
152
- | WritableSelectorToken<unknown>
153
- >
154
- >
135
+ tokenIndex: ReadonlySelectorToken<WritableTokenIndex<ReadableToken<unknown>>>
155
136
  }> = ({ tokenIndex }) => {
156
137
  const tokenIds = useO(tokenIndex)
157
138
  return (
158
139
  <article className="index state_index" data-testid="state-index">
159
- {Object.entries(tokenIds)
140
+ {[...tokenIds.entries()]
160
141
  .filter(([key]) => !key.startsWith(`👁‍🗨`))
161
142
  .sort()
162
143
  .map(([key, node]) => {
@@ -542,7 +542,7 @@ function syncContinuity(continuity, socket, store) {
542
542
  `conceal:${continuityKey}`,
543
543
  (concealed) => {
544
544
  for (const token of concealed) {
545
- Internal.deleteAtom(token, store);
545
+ Internal.disposeAtom(token, store);
546
546
  }
547
547
  }
548
548
  );
@@ -1,4 +1,4 @@
1
- export { syncContinuity } from '../../dist/chunk-2AIFLP2B.js';
1
+ export { syncContinuity } from '../../dist/chunk-RT43TVKP.js';
2
2
  export { confirmedUpdateQueue, myIdState, myIdState__INTERNAL, myUsernameState, optimisticUpdateQueue } from '../../dist/chunk-O47EQUM6.js';
3
3
  import '../../dist/chunk-BWWVY5O5.js';
4
4
  import '../../dist/chunk-F2X4B4VY.js';
@@ -3,7 +3,7 @@ import type { Store } from "atom.io/internal"
3
3
  import {
4
4
  actUponStore,
5
5
  assignTransactionToContinuity,
6
- deleteAtom,
6
+ disposeAtom,
7
7
  getEpochNumberOfContinuity,
8
8
  getFromStore,
9
9
  getJsonToken,
@@ -353,7 +353,7 @@ export function syncContinuity<F extends AtomIO.Func>(
353
353
  `conceal:${continuityKey}`,
354
354
  (concealed: AtomIO.AtomToken<unknown>[]) => {
355
355
  for (const token of concealed) {
356
- deleteAtom(token, store)
356
+ disposeAtom(token, store)
357
357
  }
358
358
  },
359
359
  )
@@ -480,7 +480,7 @@ function syncContinuity(continuity, socket, store) {
480
480
  `conceal:${continuityKey}`,
481
481
  (concealed) => {
482
482
  for (const token of concealed) {
483
- internal.deleteAtom(token, store);
483
+ internal.disposeAtom(token, store);
484
484
  }
485
485
  }
486
486
  );
@@ -1,4 +1,4 @@
1
- import { syncContinuity } from '../../dist/chunk-2AIFLP2B.js';
1
+ import { syncContinuity } from '../../dist/chunk-RT43TVKP.js';
2
2
  import '../../dist/chunk-F2X4B4VY.js';
3
3
  import { useI, StoreContext, useO } from 'atom.io/react';
4
4
  import * as RTC from 'atom.io/realtime-client';
@@ -216,8 +216,8 @@ var SubjectSocket = class extends CustomSocket {
216
216
  });
217
217
  }
218
218
  dispose() {
219
- for (const dispose2 of this.disposalFunctions) {
220
- dispose2();
219
+ for (const dispose of this.disposalFunctions) {
220
+ dispose();
221
221
  }
222
222
  }
223
223
  };
@@ -1,4 +1,4 @@
1
- import { findRelationsInStore } from '../../dist/chunk-SMZRGPN6.js';
1
+ import { findRelationsInStore } from '../../dist/chunk-KGZGBCYS.js';
2
2
  import '../../dist/chunk-FTONNX2R.js';
3
3
  import { __spreadProps, __spreadValues } from '../../dist/chunk-F2X4B4VY.js';
4
4
  import { parseJson, stringifyJson } from 'atom.io/json';
@@ -172,7 +172,7 @@ var setupRealtimeTestServer = (options) => {
172
172
  server.on(`connection`, (socket) => {
173
173
  options.server({ socket, silo });
174
174
  });
175
- const dispose2 = () => {
175
+ const dispose = () => {
176
176
  server.close();
177
177
  const roomKeys = internal.getFromStore(RT__namespace.roomIndex, silo.store);
178
178
  for (const roomKey of roomKeys) {
@@ -187,7 +187,7 @@ var setupRealtimeTestServer = (options) => {
187
187
  return {
188
188
  name: `SERVER`,
189
189
  silo,
190
- dispose: dispose2,
190
+ dispose,
191
191
  port
192
192
  };
193
193
  };
@@ -216,12 +216,12 @@ var setupRealtimeTestClient = (options, name, port) => {
216
216
  const prettyPrint = () => {
217
217
  console.log(react.prettyDOM(renderResult.container));
218
218
  };
219
- const dispose2 = () => {
219
+ const dispose = () => {
220
220
  renderResult.unmount();
221
221
  socket.disconnect();
222
222
  internal.clearStore(silo.store);
223
223
  };
224
- testClient.dispose = dispose2;
224
+ testClient.dispose = dispose;
225
225
  return {
226
226
  name,
227
227
  silo,
@@ -1,5 +1,5 @@
1
1
  import { myUsernameState } from '../../dist/chunk-O47EQUM6.js';
2
- import { editRelationsInStore } from '../../dist/chunk-SMZRGPN6.js';
2
+ import { editRelationsInStore } from '../../dist/chunk-KGZGBCYS.js';
3
3
  import '../../dist/chunk-FTONNX2R.js';
4
4
  import { recordToEntries } from '../../dist/chunk-3V3VWQ7X.js';
5
5
  import '../../dist/chunk-BWWVY5O5.js';
package/src/dispose.ts CHANGED
@@ -2,18 +2,18 @@ import * as Internal from "atom.io/internal"
2
2
 
3
3
  import type { ReadableToken } from "."
4
4
 
5
- export function dispose(
5
+ export function disposeState(
6
6
  token: ReadableToken<any>,
7
7
  store: Internal.Store = Internal.IMPLICIT.STORE,
8
8
  ): void {
9
9
  switch (token.type) {
10
10
  case `atom`:
11
11
  case `mutable_atom`:
12
- Internal.deleteAtom(token, store)
12
+ Internal.disposeAtom(token, store)
13
13
  break
14
14
  case `selector`:
15
15
  case `readonly_selector`:
16
- Internal.deleteSelector(token, store)
16
+ Internal.disposeSelector(token, store)
17
17
  break
18
18
  }
19
19
  }
@@ -1,40 +0,0 @@
1
- import type { AtomToken } from "atom.io"
2
-
3
- import type { Store } from ".."
4
- import { deleteSelector, getUpdateToken, newest } from ".."
5
-
6
- export function deleteAtom(atomToken: AtomToken<unknown>, store: Store): void {
7
- const target = newest(store)
8
- const { key } = atomToken
9
- const atom = target.atoms.get(key)
10
- if (!atom) {
11
- store.logger.error(
12
- `❌`,
13
- `atom`,
14
- key,
15
- `Tried to delete atom, but it does not exist in the store.`,
16
- )
17
- }
18
- atom?.cleanup?.()
19
- target.atoms.delete(key)
20
- target.valueMap.delete(key)
21
- const selectorKeys = target.selectorAtoms.getRelatedKeys(key)
22
- if (selectorKeys) {
23
- for (const selectorKey of selectorKeys) {
24
- const token =
25
- target.selectors.get(selectorKey) ??
26
- target.readonlySelectors.get(selectorKey)
27
- if (token) {
28
- deleteSelector(token, store)
29
- }
30
- }
31
- }
32
- target.selectorAtoms.delete(key)
33
- target.atomsThatAreDefault.delete(key)
34
- target.timelineAtoms.delete(key)
35
- if (atomToken.type === `mutable_atom`) {
36
- const updateToken = getUpdateToken(atomToken)
37
- deleteAtom(updateToken, store)
38
- }
39
- store.logger.info(`🔥`, `atom`, key, `deleted`)
40
- }