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.
- package/data/dist/index.cjs +1 -1
- package/data/dist/index.js +1 -1
- package/data/src/join.ts +2 -2
- package/dist/{chunk-SMZRGPN6.js → chunk-KGZGBCYS.js} +2 -2
- package/dist/chunk-PNIHPILQ.js +8 -0
- package/dist/{chunk-2AIFLP2B.js → chunk-RT43TVKP.js} +2 -2
- package/dist/index.cjs +4 -4
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -7
- package/internal/dist/index.cjs +31 -26
- package/internal/dist/index.d.ts +10 -6
- package/internal/dist/index.js +30 -25
- package/internal/src/atom/create-regular-atom.ts +1 -1
- package/internal/src/atom/dispose-atom.ts +42 -0
- package/internal/src/atom/index.ts +1 -1
- package/internal/src/selector/{delete-selector.ts → dispose-selector.ts} +3 -2
- package/internal/src/selector/index.ts +1 -1
- package/internal/src/store/deposit.ts +5 -0
- package/internal/src/store/store.ts +5 -1
- package/introspection/dist/index.cjs +250 -106
- package/introspection/dist/index.d.ts +43 -6
- package/introspection/dist/index.js +225 -83
- package/introspection/src/attach-atom-index.ts +68 -47
- package/introspection/src/attach-selector-index.ts +76 -59
- package/introspection/src/auditor.ts +135 -0
- package/introspection/src/index.ts +8 -18
- package/package.json +9 -9
- package/react-devtools/dist/index.cjs +3 -3
- package/react-devtools/dist/index.d.ts +5 -5
- package/react-devtools/dist/index.js +4 -4
- package/react-devtools/src/StateIndex.tsx +8 -27
- package/realtime-client/dist/index.cjs +1 -1
- package/realtime-client/dist/index.js +1 -1
- package/realtime-client/src/sync-continuity.ts +2 -2
- package/realtime-react/dist/index.cjs +1 -1
- package/realtime-react/dist/index.js +1 -1
- package/realtime-server/dist/index.cjs +2 -2
- package/realtime-server/dist/index.js +1 -1
- package/realtime-testing/dist/index.cjs +4 -4
- package/realtime-testing/dist/index.js +1 -1
- package/src/dispose.ts +3 -3
- 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:
|
|
8
|
+
familyMembers: Map<string, Token>
|
|
17
9
|
}
|
|
18
10
|
|
|
19
|
-
export type WritableTokenIndex<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
62
|
-
"@vitest/ui": "1.
|
|
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.
|
|
65
|
+
"drizzle-orm": "0.30.10",
|
|
66
66
|
"eslint": "npm:eslint@8.57.0",
|
|
67
|
-
"eslint-v9": "npm:eslint@9.
|
|
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.
|
|
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.
|
|
82
|
+
"vite": "5.2.11",
|
|
83
83
|
"vite-tsconfig-paths": "4.3.2",
|
|
84
|
-
"vitest": "1.
|
|
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
|
|
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 ?
|
|
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:
|
|
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,
|
|
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
|
|
27
|
+
type FamilyNode<Token extends ReadableToken<unknown>> = {
|
|
28
28
|
key: string;
|
|
29
|
-
familyMembers:
|
|
29
|
+
familyMembers: Map<string, Token>;
|
|
30
30
|
};
|
|
31
|
-
type WritableTokenIndex<Token extends
|
|
31
|
+
type WritableTokenIndex<Token extends ReadableToken<unknown>> = Map<string, FamilyNode<Token> | Token>;
|
|
32
32
|
|
|
33
|
-
type SelectorTokenIndex = WritableTokenIndex<
|
|
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,
|
|
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
|
|
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 ?
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
-
?
|
|
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:
|
|
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
|
-
{
|
|
140
|
+
{[...tokenIds.entries()]
|
|
160
141
|
.filter(([key]) => !key.startsWith(`👁🗨`))
|
|
161
142
|
.sort()
|
|
162
143
|
.map(([key, node]) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { syncContinuity } from '../../dist/chunk-
|
|
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
|
-
|
|
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
|
-
|
|
356
|
+
disposeAtom(token, store)
|
|
357
357
|
}
|
|
358
358
|
},
|
|
359
359
|
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { syncContinuity } from '../../dist/chunk-
|
|
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';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { findRelationsInStore } from '../../dist/chunk-
|
|
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
|
|
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
|
|
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
|
|
219
|
+
const dispose = () => {
|
|
220
220
|
renderResult.unmount();
|
|
221
221
|
socket.disconnect();
|
|
222
222
|
internal.clearStore(silo.store);
|
|
223
223
|
};
|
|
224
|
-
testClient.dispose =
|
|
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-
|
|
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
|
|
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.
|
|
12
|
+
Internal.disposeAtom(token, store)
|
|
13
13
|
break
|
|
14
14
|
case `selector`:
|
|
15
15
|
case `readonly_selector`:
|
|
16
|
-
Internal.
|
|
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
|
-
}
|