atom.io 0.33.12 → 0.33.14
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/dist/data/index.js.map +1 -1
- package/dist/eslint-plugin/index.js.map +1 -1
- package/dist/internal/index.js +25 -23
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +7 -7
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js +26 -38
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.js.map +1 -1
- package/dist/main/index.js +11 -11
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.css +182 -96
- package/dist/react-devtools/index.css.map +1 -1
- package/dist/react-devtools/index.d.ts +1 -0
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js +177 -81
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.js.map +1 -1
- package/dist/transceivers/set-rtx/index.js.map +1 -1
- package/dist/use-o-BrXc7Qro.js.map +1 -1
- package/dist/web/index.js.map +1 -1
- package/package.json +10 -10
- package/src/internal/transaction/create-transaction.ts +9 -5
- package/src/introspection/attach-atom-index.ts +6 -15
- package/src/introspection/attach-introspection-states.ts +5 -5
- package/src/introspection/attach-selector-index.ts +78 -85
- package/src/introspection/attach-timeline-index.ts +5 -12
- package/src/introspection/attach-transaction-index.ts +18 -16
- package/src/introspection/auditor.ts +2 -3
- package/src/react-devtools/Button.tsx +12 -4
- package/src/react-devtools/StateEditor.tsx +13 -1
- package/src/react-devtools/StateIndex.tsx +83 -39
- package/src/react-devtools/TimelineIndex.tsx +16 -12
- package/src/react-devtools/TransactionIndex.tsx +22 -18
- package/src/react-devtools/devtools.css +182 -96
- package/src/react-devtools/json-editor/developer-interface.tsx +2 -1
- package/src/react-devtools/json-editor/editors-by-type/array-editor.tsx +23 -20
- package/src/react-devtools/json-editor/editors-by-type/object-editor.tsx +7 -23
- package/src/react-devtools/json-editor/json-editor-internal.tsx +94 -77
- package/src/react-devtools/store.ts +97 -6
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
AtomToken,
|
|
2
3
|
Loadable,
|
|
3
4
|
ReadableToken,
|
|
4
5
|
ReadonlyPureSelectorToken,
|
|
5
6
|
RegularAtomToken,
|
|
6
7
|
} from "atom.io"
|
|
7
|
-
import {
|
|
8
|
-
|
|
8
|
+
import {
|
|
9
|
+
actUponStore,
|
|
10
|
+
arbitrary,
|
|
11
|
+
disposeFromStore,
|
|
12
|
+
findInStore,
|
|
13
|
+
getFromStore,
|
|
14
|
+
} from "atom.io/internal"
|
|
9
15
|
import type { FamilyNode, WritableTokenIndex } from "atom.io/introspection"
|
|
10
16
|
import { primitiveRefinery } from "atom.io/introspection"
|
|
11
17
|
import { useI, useO } from "atom.io/react"
|
|
12
18
|
import { type FC, useContext } from "react"
|
|
13
19
|
|
|
14
20
|
import { button } from "./Button"
|
|
21
|
+
import { DEFAULT_JSON_EDITOR_COMPONENTS } from "./json-editor"
|
|
15
22
|
import { StoreEditor } from "./StateEditor"
|
|
16
23
|
import { DevtoolsContext } from "./store"
|
|
17
24
|
|
|
@@ -21,7 +28,10 @@ export const StateIndexLeafNode: FC<{
|
|
|
21
28
|
node: ReadableToken<unknown>
|
|
22
29
|
isOpenState: RegularAtomToken<boolean>
|
|
23
30
|
typeState: ReadonlyPureSelectorToken<Loadable<string>>
|
|
24
|
-
|
|
31
|
+
dispose?: (() => void) | undefined
|
|
32
|
+
}> = ({ node, isOpenState, typeState, dispose }) => {
|
|
33
|
+
const { openCloseAllTX, store } = useContext(DevtoolsContext)
|
|
34
|
+
|
|
25
35
|
const setIsOpen = useI(isOpenState)
|
|
26
36
|
const isOpen = useO(isOpenState)
|
|
27
37
|
|
|
@@ -32,31 +42,49 @@ export const StateIndexLeafNode: FC<{
|
|
|
32
42
|
|
|
33
43
|
const isPrimitive = Boolean(primitiveRefinery.refine(state))
|
|
34
44
|
|
|
45
|
+
const path = node.family ? [node.family.key, node.family.subKey] : [node.key]
|
|
46
|
+
|
|
35
47
|
return (
|
|
36
48
|
<>
|
|
37
49
|
<header>
|
|
38
|
-
<button.OpenClose
|
|
39
|
-
isOpen={isOpen && !isPrimitive}
|
|
40
|
-
testid={`open-close-state-${node.key}`}
|
|
41
|
-
setIsOpen={setIsOpen}
|
|
42
|
-
disabled={isPrimitive}
|
|
43
|
-
/>
|
|
44
50
|
<main
|
|
45
51
|
onClick={() => {
|
|
46
|
-
console.log(node,
|
|
52
|
+
console.log(node, getFromStore(store, node))
|
|
47
53
|
}}
|
|
48
54
|
onKeyUp={() => {
|
|
49
|
-
console.log(node,
|
|
55
|
+
console.log(node, getFromStore(store, node))
|
|
50
56
|
}}
|
|
51
57
|
>
|
|
58
|
+
<button.OpenClose
|
|
59
|
+
isOpen={isOpen && !isPrimitive}
|
|
60
|
+
testid={`open-close-state-${node.key}`}
|
|
61
|
+
onShiftClick={() => {
|
|
62
|
+
actUponStore(store, openCloseAllTX, arbitrary())(path, isOpen)
|
|
63
|
+
return false
|
|
64
|
+
}}
|
|
65
|
+
setIsOpen={setIsOpen}
|
|
66
|
+
disabled={isPrimitive}
|
|
67
|
+
/>
|
|
52
68
|
<h2>{node.family?.subKey ?? node.key}</h2>
|
|
53
69
|
<span className="type detail">({stateType})</span>
|
|
54
70
|
</main>
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
71
|
+
<footer>
|
|
72
|
+
{isPrimitive ? (
|
|
73
|
+
<StoreEditor token={node} />
|
|
74
|
+
) : (
|
|
75
|
+
<div className="json_viewer">{JSON.stringify(state)}</div>
|
|
76
|
+
)}
|
|
77
|
+
{dispose ? (
|
|
78
|
+
<DEFAULT_JSON_EDITOR_COMPONENTS.Button
|
|
79
|
+
onClick={() => {
|
|
80
|
+
dispose?.()
|
|
81
|
+
}}
|
|
82
|
+
testid={`${node.key}-dispose`}
|
|
83
|
+
>
|
|
84
|
+
<DEFAULT_JSON_EDITOR_COMPONENTS.DeleteIcon />
|
|
85
|
+
</DEFAULT_JSON_EDITOR_COMPONENTS.Button>
|
|
86
|
+
) : null}
|
|
87
|
+
</footer>
|
|
60
88
|
</header>
|
|
61
89
|
{isOpen && !isPrimitive ? (
|
|
62
90
|
<main>
|
|
@@ -73,21 +101,30 @@ export const StateIndexTreeNode: FC<{
|
|
|
73
101
|
const setIsOpen = useI(isOpenState)
|
|
74
102
|
const isOpen = useO(isOpenState)
|
|
75
103
|
|
|
76
|
-
const { typeSelectors, viewIsOpenAtoms, store } =
|
|
104
|
+
const { typeSelectors, viewIsOpenAtoms, openCloseAllTX, store } =
|
|
105
|
+
useContext(DevtoolsContext)
|
|
77
106
|
|
|
78
107
|
for (const [key, childNode] of node.familyMembers) {
|
|
79
|
-
findInStore(store, viewIsOpenAtoms, key)
|
|
108
|
+
findInStore(store, viewIsOpenAtoms, [key])
|
|
80
109
|
findInStore(store, typeSelectors, childNode.key)
|
|
81
110
|
}
|
|
82
111
|
return (
|
|
83
112
|
<>
|
|
84
113
|
<header>
|
|
85
|
-
<button.OpenClose
|
|
86
|
-
isOpen={isOpen}
|
|
87
|
-
testid={`open-close-state-family-${node.key}`}
|
|
88
|
-
setIsOpen={setIsOpen}
|
|
89
|
-
/>
|
|
90
114
|
<main>
|
|
115
|
+
<button.OpenClose
|
|
116
|
+
isOpen={isOpen}
|
|
117
|
+
testid={`open-close-state-family-${node.key}`}
|
|
118
|
+
onShiftClick={() => {
|
|
119
|
+
actUponStore(
|
|
120
|
+
store,
|
|
121
|
+
openCloseAllTX,
|
|
122
|
+
arbitrary(),
|
|
123
|
+
)([node.key], isOpen)
|
|
124
|
+
return false
|
|
125
|
+
}}
|
|
126
|
+
setIsOpen={setIsOpen}
|
|
127
|
+
/>
|
|
91
128
|
<h2>{node.key}</h2>
|
|
92
129
|
<span className="type detail"> (family)</span>
|
|
93
130
|
</main>
|
|
@@ -97,8 +134,11 @@ export const StateIndexTreeNode: FC<{
|
|
|
97
134
|
<StateIndexNode
|
|
98
135
|
key={key}
|
|
99
136
|
node={childNode}
|
|
100
|
-
isOpenState={findInStore(store, viewIsOpenAtoms,
|
|
137
|
+
isOpenState={findInStore(store, viewIsOpenAtoms, [node.key, key])}
|
|
101
138
|
typeState={findInStore(store, typeSelectors, childNode.key)}
|
|
139
|
+
dispose={() => {
|
|
140
|
+
disposeFromStore(store, childNode)
|
|
141
|
+
}}
|
|
102
142
|
/>
|
|
103
143
|
))
|
|
104
144
|
: null}
|
|
@@ -110,7 +150,8 @@ export const StateIndexNode: FC<{
|
|
|
110
150
|
node: FamilyNode<ReadableToken<unknown>> | ReadableToken<unknown>
|
|
111
151
|
isOpenState: RegularAtomToken<boolean>
|
|
112
152
|
typeState: ReadonlyPureSelectorToken<Loadable<string>>
|
|
113
|
-
|
|
153
|
+
dispose?: () => void
|
|
154
|
+
}> = ({ node, isOpenState, typeState, dispose }) => {
|
|
114
155
|
return (
|
|
115
156
|
<section className="node state" data-testid={`state-${node.key}`}>
|
|
116
157
|
{`type` in node ? (
|
|
@@ -118,6 +159,7 @@ export const StateIndexNode: FC<{
|
|
|
118
159
|
node={node}
|
|
119
160
|
isOpenState={isOpenState}
|
|
120
161
|
typeState={typeState}
|
|
162
|
+
dispose={dispose}
|
|
121
163
|
/>
|
|
122
164
|
) : (
|
|
123
165
|
<StateIndexTreeNode node={node} isOpenState={isOpenState} />
|
|
@@ -127,27 +169,29 @@ export const StateIndexNode: FC<{
|
|
|
127
169
|
}
|
|
128
170
|
|
|
129
171
|
export const StateIndex: FC<{
|
|
130
|
-
tokenIndex:
|
|
131
|
-
WritableTokenIndex<ReadableToken<unknown>>
|
|
132
|
-
>
|
|
172
|
+
tokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown>>>
|
|
133
173
|
}> = ({ tokenIndex }) => {
|
|
134
174
|
const tokenIds = useO(tokenIndex)
|
|
135
175
|
|
|
136
176
|
const { typeSelectors, viewIsOpenAtoms, store } = useContext(DevtoolsContext)
|
|
177
|
+
const statesName = tokenIndex.key.includes(`Atom`) ? `atoms` : `selectors`
|
|
137
178
|
|
|
138
|
-
console.log(tokenIds)
|
|
139
179
|
return (
|
|
140
180
|
<article className="index state_index" data-testid="state-index">
|
|
141
|
-
{
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
181
|
+
{tokenIds.size === 0 ? (
|
|
182
|
+
<p className="index-empty-state">(no {statesName})</p>
|
|
183
|
+
) : (
|
|
184
|
+
[...tokenIds.entries()].map(([key, node]) => {
|
|
185
|
+
return (
|
|
186
|
+
<StateIndexNode
|
|
187
|
+
key={key}
|
|
188
|
+
node={node}
|
|
189
|
+
isOpenState={findInStore(store, viewIsOpenAtoms, [node.key])}
|
|
190
|
+
typeState={findInStore(store, typeSelectors, node.key)}
|
|
191
|
+
/>
|
|
192
|
+
)
|
|
193
|
+
})
|
|
194
|
+
)}
|
|
151
195
|
</article>
|
|
152
196
|
)
|
|
153
197
|
}
|
|
@@ -95,18 +95,22 @@ export const TimelineIndex: FC = () => {
|
|
|
95
95
|
|
|
96
96
|
return (
|
|
97
97
|
<article className="index timeline_index" data-testid="timeline-index">
|
|
98
|
-
{tokenIds
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
98
|
+
{tokenIds.length === 0 ? (
|
|
99
|
+
<p className="index-empty-state">(no timelines)</p>
|
|
100
|
+
) : (
|
|
101
|
+
tokenIds
|
|
102
|
+
.filter((token) => !token.key.startsWith(`👁🗨`))
|
|
103
|
+
.map((token) => {
|
|
104
|
+
return (
|
|
105
|
+
<TimelineLog
|
|
106
|
+
key={token.key}
|
|
107
|
+
token={token}
|
|
108
|
+
isOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}
|
|
109
|
+
timelineState={findInStore(store, timelineSelectors, token.key)}
|
|
110
|
+
/>
|
|
111
|
+
)
|
|
112
|
+
})
|
|
113
|
+
)}
|
|
110
114
|
</article>
|
|
111
115
|
)
|
|
112
116
|
}
|
|
@@ -27,15 +27,15 @@ export const TransactionLog: FC<{
|
|
|
27
27
|
data-testid={`transaction-${token.key}`}
|
|
28
28
|
>
|
|
29
29
|
<header>
|
|
30
|
-
<button.OpenClose
|
|
31
|
-
isOpen={isOpen}
|
|
32
|
-
testid={`open-close-transaction-${token.key}`}
|
|
33
|
-
setIsOpen={setIsOpen}
|
|
34
|
-
/>
|
|
35
30
|
<main>
|
|
31
|
+
<button.OpenClose
|
|
32
|
+
isOpen={isOpen}
|
|
33
|
+
testid={`open-close-transaction-${token.key}`}
|
|
34
|
+
setIsOpen={setIsOpen}
|
|
35
|
+
/>
|
|
36
36
|
<h2>{token.key}</h2>
|
|
37
|
-
<span className="detail length">({log.length})</span>
|
|
38
37
|
</main>
|
|
38
|
+
<span className="detail length">({log.length})</span>
|
|
39
39
|
</header>
|
|
40
40
|
{isOpen ? (
|
|
41
41
|
<main>
|
|
@@ -59,18 +59,22 @@ export const TransactionIndex: FC = () => {
|
|
|
59
59
|
const tokenIds = useO(transactionIndex)
|
|
60
60
|
return (
|
|
61
61
|
<article className="index transaction_index" data-testid="transaction-index">
|
|
62
|
-
{tokenIds
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
62
|
+
{tokenIds.length === 0 ? (
|
|
63
|
+
<p className="index-empty-state">(no transactions)</p>
|
|
64
|
+
) : (
|
|
65
|
+
tokenIds
|
|
66
|
+
.filter((token) => !token.key.startsWith(`🔍`))
|
|
67
|
+
.map((token) => {
|
|
68
|
+
return (
|
|
69
|
+
<TransactionLog
|
|
70
|
+
key={token.key}
|
|
71
|
+
token={token}
|
|
72
|
+
isOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}
|
|
73
|
+
logState={findInStore(store, transactionLogSelectors, token.key)}
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
})
|
|
77
|
+
)}
|
|
74
78
|
</article>
|
|
75
79
|
)
|
|
76
80
|
}
|