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.
Files changed (45) hide show
  1. package/dist/data/index.js.map +1 -1
  2. package/dist/eslint-plugin/index.js.map +1 -1
  3. package/dist/internal/index.js +25 -23
  4. package/dist/internal/index.js.map +1 -1
  5. package/dist/introspection/index.d.ts +7 -7
  6. package/dist/introspection/index.d.ts.map +1 -1
  7. package/dist/introspection/index.js +26 -38
  8. package/dist/introspection/index.js.map +1 -1
  9. package/dist/json/index.js.map +1 -1
  10. package/dist/main/index.js +11 -11
  11. package/dist/main/index.js.map +1 -1
  12. package/dist/react/index.js.map +1 -1
  13. package/dist/react-devtools/index.css +182 -96
  14. package/dist/react-devtools/index.css.map +1 -1
  15. package/dist/react-devtools/index.d.ts +1 -0
  16. package/dist/react-devtools/index.d.ts.map +1 -1
  17. package/dist/react-devtools/index.js +177 -81
  18. package/dist/react-devtools/index.js.map +1 -1
  19. package/dist/realtime/index.js.map +1 -1
  20. package/dist/realtime-client/index.js.map +1 -1
  21. package/dist/realtime-react/index.js.map +1 -1
  22. package/dist/realtime-server/index.js.map +1 -1
  23. package/dist/realtime-testing/index.js.map +1 -1
  24. package/dist/transceivers/set-rtx/index.js.map +1 -1
  25. package/dist/use-o-BrXc7Qro.js.map +1 -1
  26. package/dist/web/index.js.map +1 -1
  27. package/package.json +10 -10
  28. package/src/internal/transaction/create-transaction.ts +9 -5
  29. package/src/introspection/attach-atom-index.ts +6 -15
  30. package/src/introspection/attach-introspection-states.ts +5 -5
  31. package/src/introspection/attach-selector-index.ts +78 -85
  32. package/src/introspection/attach-timeline-index.ts +5 -12
  33. package/src/introspection/attach-transaction-index.ts +18 -16
  34. package/src/introspection/auditor.ts +2 -3
  35. package/src/react-devtools/Button.tsx +12 -4
  36. package/src/react-devtools/StateEditor.tsx +13 -1
  37. package/src/react-devtools/StateIndex.tsx +83 -39
  38. package/src/react-devtools/TimelineIndex.tsx +16 -12
  39. package/src/react-devtools/TransactionIndex.tsx +22 -18
  40. package/src/react-devtools/devtools.css +182 -96
  41. package/src/react-devtools/json-editor/developer-interface.tsx +2 -1
  42. package/src/react-devtools/json-editor/editors-by-type/array-editor.tsx +23 -20
  43. package/src/react-devtools/json-editor/editors-by-type/object-editor.tsx +7 -23
  44. package/src/react-devtools/json-editor/json-editor-internal.tsx +94 -77
  45. 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 { getState } from "atom.io"
8
- import { findInStore } from "atom.io/internal"
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
- }> = ({ node, isOpenState, typeState }) => {
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, getState(node))
52
+ console.log(node, getFromStore(store, node))
47
53
  }}
48
54
  onKeyUp={() => {
49
- console.log(node, getState(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
- {isPrimitive ? (
56
- <StoreEditor token={node} />
57
- ) : (
58
- <div className="json_viewer">{JSON.stringify(state)}</div>
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 } = useContext(DevtoolsContext)
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, childNode.key)}
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
- }> = ({ node, isOpenState, typeState }) => {
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: ReadonlyPureSelectorToken<
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
- {[...tokenIds.entries()].map(([key, node]) => {
142
- return (
143
- <StateIndexNode
144
- key={key}
145
- node={node}
146
- isOpenState={findInStore(store, viewIsOpenAtoms, node.key)}
147
- typeState={findInStore(store, typeSelectors, node.key)}
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
- .filter((token) => !token.key.startsWith(`👁‍🗨`))
100
- .map((token) => {
101
- return (
102
- <TimelineLog
103
- key={token.key}
104
- token={token}
105
- isOpenState={findInStore(store, viewIsOpenAtoms, token.key)}
106
- timelineState={findInStore(store, timelineSelectors, token.key)}
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
- .filter((token) => !token.key.startsWith(`🔍`))
64
- .map((token) => {
65
- return (
66
- <TransactionLog
67
- key={token.key}
68
- token={token}
69
- isOpenState={findInStore(store, viewIsOpenAtoms, token.key)}
70
- logState={findInStore(store, transactionLogSelectors, token.key)}
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
  }