atom.io 0.40.0 ā 0.40.2
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.d.ts +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/internal/index.d.ts +205 -196
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +145 -107
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +6 -6
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/main/index.d.ts +93 -66
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +16 -13
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.d.ts +14 -14
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.js +1 -1
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +3 -3
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js +3 -4
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +2 -2
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/data/struct.ts +2 -2
- package/src/internal/atom/create-regular-atom.ts +11 -9
- package/src/internal/atom/dispose-atom.ts +11 -8
- package/src/internal/atom/has-role.ts +1 -1
- package/src/internal/caching.ts +15 -15
- package/src/internal/events/ingest-creation-disposal.ts +1 -1
- package/src/internal/families/create-readonly-held-selector-family.ts +3 -4
- package/src/internal/families/create-readonly-pure-selector-family.ts +25 -23
- package/src/internal/families/create-regular-atom-family.ts +21 -15
- package/src/internal/families/create-selector-family.ts +15 -15
- package/src/internal/families/create-writable-held-selector-family.ts +2 -2
- package/src/internal/families/create-writable-pure-selector-family.ts +25 -21
- package/src/internal/families/dispose-from-store.ts +17 -7
- package/src/internal/families/find-in-store.ts +23 -23
- package/src/internal/families/get-family-of-token.ts +17 -17
- package/src/internal/families/mint-in-store.ts +10 -10
- package/src/internal/families/seek-in-store.ts +26 -26
- package/src/internal/get-state/get-fallback.ts +8 -8
- package/src/internal/get-state/get-from-store.ts +20 -8
- package/src/internal/get-state/read-or-compute-value.ts +78 -14
- package/src/internal/get-state/reduce-reference.ts +10 -10
- package/src/internal/index.ts +65 -60
- package/src/internal/install-into-store.ts +2 -1
- package/src/internal/join/create-join.ts +2 -2
- package/src/internal/join/find-relations-in-store.ts +2 -2
- package/src/internal/join/get-internal-relations-from-store.ts +2 -2
- package/src/internal/join/get-join.ts +5 -2
- package/src/internal/join/join-internal.ts +30 -26
- package/src/internal/lineage.ts +12 -1
- package/src/internal/molecule.ts +64 -36
- package/src/internal/mutable/create-mutable-atom-family.ts +5 -5
- package/src/internal/mutable/create-mutable-atom.ts +2 -2
- package/src/internal/mutable/get-json-family.ts +3 -2
- package/src/internal/mutable/get-update-family.ts +7 -5
- package/src/internal/mutable/tracker-family.ts +8 -4
- package/src/internal/mutable/tracker.ts +5 -1
- package/src/internal/operation.ts +4 -2
- package/src/internal/selector/create-readonly-held-selector.ts +2 -2
- package/src/internal/selector/create-readonly-pure-selector.ts +10 -8
- package/src/internal/selector/create-standalone-selector.ts +10 -10
- package/src/internal/selector/create-writable-held-selector.ts +2 -2
- package/src/internal/selector/create-writable-pure-selector.ts +11 -9
- package/src/internal/selector/dispose-selector.ts +2 -2
- package/src/internal/selector/register-selector.ts +2 -2
- package/src/internal/selector/trace-selector-atoms.ts +3 -3
- package/src/internal/selector/update-selector-atoms.ts +1 -1
- package/src/internal/set-state/become.ts +1 -3
- package/src/internal/set-state/dispatch-state-update.ts +10 -6
- package/src/internal/set-state/evict-downstream.ts +4 -1
- package/src/internal/set-state/operate-on-store.ts +16 -10
- package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
- package/src/internal/set-state/reset-in-store.ts +17 -16
- package/src/internal/set-state/set-atom-or-selector.ts +1 -1
- package/src/internal/set-state/set-atom.ts +1 -1
- package/src/internal/set-state/set-into-store.ts +34 -7
- package/src/internal/set-state/set-selector.ts +1 -1
- package/src/internal/store/deposit.ts +38 -30
- package/src/internal/store/mint-or-counterfeit.ts +23 -23
- package/src/internal/store/store.ts +23 -21
- package/src/internal/store/withdraw.ts +68 -62
- package/src/internal/subscribe/recall-state.ts +4 -1
- package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
- package/src/internal/subscribe/subscribe-to-state.ts +4 -4
- package/src/internal/timeline/create-timeline.ts +11 -10
- package/src/internal/timeline/time-travel.ts +4 -3
- package/src/internal/transaction/abort-transaction.ts +3 -15
- package/src/internal/transaction/act-upon-store.ts +1 -5
- package/src/internal/transaction/apply-transaction.ts +3 -15
- package/src/internal/transaction/assign-transaction-to-continuity.ts +2 -7
- package/src/internal/transaction/build-transaction.ts +2 -3
- package/src/internal/transaction/create-transaction.ts +5 -6
- package/src/internal/transaction/get-epoch-number.ts +1 -7
- package/src/internal/transaction/set-epoch-number.ts +4 -12
- package/src/introspection/attach-atom-index.ts +2 -2
- package/src/introspection/attach-introspection-states.ts +4 -2
- package/src/introspection/attach-selector-index.ts +4 -2
- package/src/introspection/attach-timeline-family.ts +15 -13
- package/src/introspection/attach-timeline-index.ts +1 -1
- package/src/introspection/attach-transaction-index.ts +1 -1
- package/src/introspection/attach-transaction-logs.ts +6 -4
- package/src/introspection/attach-type-selectors.ts +4 -3
- package/src/introspection/index.ts +3 -5
- package/src/main/atom.ts +14 -8
- package/src/main/dispose-state.ts +1 -5
- package/src/main/events.ts +26 -26
- package/src/main/get-state.ts +10 -11
- package/src/main/realm.ts +36 -12
- package/src/main/reset-state.ts +5 -9
- package/src/main/selector.ts +40 -24
- package/src/main/set-state.ts +8 -11
- package/src/main/silo.ts +4 -3
- package/src/main/timeline.ts +5 -3
- package/src/main/tokens.ts +72 -44
- package/src/main/validators.ts +4 -4
- package/src/react/parse-state-overloads.ts +10 -10
- package/src/react/store-context.tsx +3 -3
- package/src/react/use-i.ts +6 -6
- package/src/react/use-loadable.ts +15 -15
- package/src/react/use-o.ts +9 -9
- package/src/react-devtools/Button.tsx +3 -2
- package/src/react-devtools/StateEditor.tsx +5 -3
- package/src/react-devtools/StateIndex.tsx +6 -4
- package/src/react-devtools/TimelineIndex.tsx +0 -2
- package/src/react-devtools/Updates.tsx +1 -1
- package/src/react-devtools/store.ts +18 -9
- package/src/realtime-client/continuity/register-and-attempt-confirmed-update.ts +4 -8
- package/src/realtime-client/sync-continuity.ts +2 -2
- package/src/realtime-server/index.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["OpenClose: FC<{\n\tisOpen: boolean\n\tsetIsOpen?: ((next: Modify<boolean> | boolean) => void) | undefined\n\tonShiftClick?: (\n\t\tevent: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n\t) => boolean\n\tdisabled?: boolean\n\ttestid: string\n}>","button: {\n\tOpenClose: typeof OpenClose\n}","DefaultFallback: FC<FallbackProps>","DEFAULT_JSON_EDITOR_COMPONENTS: JsonEditorComponents","openCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>","states:\n\t\t\t\t| WritableTokenIndex<AtomToken<unknown>>\n\t\t\t\t| WritableTokenIndex<SelectorToken<unknown>>","value: unknown","segments: (number | string)[]","DevtoolsContext: Context<\n\tDevtoolsStates & IntrospectionStates & { store: Store }\n>","ElasticInput: ForwardRefExoticComponent<\n\tDetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> & {\n\t\twidthPadding?: number\n\t}\n>","VALID_NON_NUMBER_INTERPRETATIONS: Readonly<\n\tRecord<ValidNonNumber, number | null>\n>","DEFAULT_NUMBER_CONSTRAINTS: NumberConstraints","NumberInput: FC<NumberInputProps>","TextInput: FC<TextInputProps>","NonJsonEditor: React.FC<JsonEditorProps<never>>","next: T","SubEditors: Record<\n\tkeyof JsonTypes,\n\tFC<JsonEditorProps_INTERNAL<any>>\n>","StateEditor: FC<{\n\ttoken: WritableToken<unknown>\n}>","ReadonlySelectorViewer: FC<{\n\ttoken: ReadonlySelectorToken<unknown>\n}>","StoreEditor: FC<{\n\ttoken: ReadonlySelectorToken<unknown> | WritableToken<unknown>\n}>","StateIndexLeafNode: FC<{\n\tnode: ReadableToken<unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: (() => void) | undefined\n}>","StateIndexTreeNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown>>\n\tisOpenState: RegularAtomToken<boolean>\n}>","StateIndexNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown>> | ReadableToken<unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: () => void\n}>","StateIndex: FC<{\n\ttokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown>>>\n}>","AtomUpdateFC: React.FC<{\n\tserialNumber: number\n\tatomUpdate: AtomUpdateEvent<AtomToken<unknown>>\n}>","TransactionUpdateFC: React.FC<{\n\tserialNumber: number\n\ttransactionUpdate: TransactionOutcomeEvent<TransactionToken<any>>\n}>","TimelineUpdateFC: React.FC<{\n\ttimelineUpdate: TimelineEvent<any>\n\tserialNumber: number\n}>","article: {\n\tAtomUpdate: typeof AtomUpdateFC\n\tTransactionUpdate: typeof TransactionUpdateFC\n\tTimelineUpdate: typeof TimelineUpdateFC\n}","YouAreHere: FC","TimelineLog: FC<{\n\ttoken: TimelineToken<any>\n\tisOpenState: RegularAtomToken<boolean>\n\ttimelineState: ReadonlyPureSelectorToken<Timeline<any>>\n}>","TimelineIndex: FC","TransactionLog: FC<{\n\ttoken: TransactionToken<Fn>\n\tisOpenState: RegularAtomToken<boolean>\n\tlogState: ReadonlyPureSelectorToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[]\n\t>\n}>","TransactionIndex: FC","AtomIODevtools: React.FC<{ hideByDefault?: boolean }>"],"sources":["../../src/react-devtools/Button.tsx","../../src/react-devtools/error-boundary/DefaultFallback.tsx","../../src/react-devtools/error-boundary/ReactErrorBoundary.tsx","../../src/react-devtools/json-editor/default-components.tsx","../../src/react-devtools/store.ts","../../src/react-devtools/elastic-input/ElasticInput.tsx","../../src/react-devtools/elastic-input/NumberInput.tsx","../../src/react-devtools/elastic-input/TextInput.tsx","../../src/react-devtools/json-editor/editors-by-type/non-json.tsx","../../src/react-devtools/json-editor/json-editor-internal.tsx","../../src/react-devtools/json-editor/editors-by-type/utilities/array-elements.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/cast-json.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/cast-to-json.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/object-properties.ts","../../src/react-devtools/json-editor/editors-by-type/array-editor.tsx","../../src/react-devtools/json-editor/editors-by-type/object-editor.tsx","../../src/react-devtools/json-editor/editors-by-type/primitive-editors.tsx","../../src/react-devtools/json-editor/developer-interface.tsx","../../src/react-devtools/StateEditor.tsx","../../src/react-devtools/StateIndex.tsx","../../src/react-devtools/Updates.tsx","../../src/react-devtools/TimelineIndex.tsx","../../src/react-devtools/TransactionIndex.tsx","../../src/react-devtools/AtomIODevtools.tsx"],"sourcesContent":["import type { Modify } from \"atom.io/internal\"\nimport type { FC } from \"react\"\n\nexport const OpenClose: FC<{\n\tisOpen: boolean\n\tsetIsOpen?: ((next: Modify<boolean> | boolean) => void) | undefined\n\tonShiftClick?: (\n\t\tevent: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n\t) => boolean\n\tdisabled?: boolean\n\ttestid: string\n}> = ({ isOpen, setIsOpen, onShiftClick, disabled, testid }) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-testid={testid}\n\t\t\tclassName={`carat ${isOpen ? `open` : `closed`}`}\n\t\t\tonClick={(event) => {\n\t\t\t\tif (onShiftClick && event.shiftKey) {\n\t\t\t\t\tif (!onShiftClick(event)) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetIsOpen?.((prev) => !prev)\n\t\t\t}}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t<span className=\"json_editor_icon json_editor_carat\">ā¶</span>\n\t\t</button>\n\t)\n}\n\nexport const button: {\n\tOpenClose: typeof OpenClose\n} = {\n\tOpenClose,\n}\n","import type { ErrorInfo, FC } from \"react\"\n\nexport type FallbackProps = {\n\terror?: Error | string | undefined\n\terrorInfo?: ErrorInfo | undefined\n}\n\nexport const DefaultFallback: FC<FallbackProps> = ({ error, errorInfo }) => {\n\tconst component = errorInfo?.componentStack?.split(` `).filter(Boolean)[2]\n\tconst message =\n\t\terror?.toString() ?? errorInfo?.componentStack ?? `Unknown error`\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"error-boundary\"\n\t\t\tstyle={{\n\t\t\t\tflex: `1`,\n\t\t\t\tbackground: `black`,\n\t\t\t\tbackgroundImage: `url(./src/assets/kablooey.gif)`,\n\t\t\t\tbackgroundPosition: `center`,\n\t\t\t\t// backgroundRepeat: `no-repeat`,\n\t\t\t\tbackgroundSize: `overlay`,\n\t\t\t}}\n\t\t>\n\t\t\t{/* <img src=\"./src/assets/kablooey.gif\" alt=\"error\" /> */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tmargin: `50px`,\n\t\t\t\t\tmarginTop: `0`,\n\t\t\t\t\tpadding: `50px`,\n\t\t\t\t\tborder: `1px solid dashed`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: `black`,\n\t\t\t\t\t\tcolor: `white`,\n\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\tpaddingTop: 5,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{`ā ļø `}\n\t\t\t\t\t<span style={{ color: `#fc0`, fontWeight: 700 }}>{component}</span>\n\t\t\t\t\t{` ā ļø `}\n\t\t\t\t\t{message}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import type { ErrorInfo, FC, ReactNode } from \"react\"\nimport { Component } from \"react\"\n\nimport type { FallbackProps } from \"./DefaultFallback\"\nimport { DefaultFallback } from \"./DefaultFallback\"\n\nexport type ErrorBoundaryState = {\n\terror?: Error | string\n\terrorInfo?: ErrorInfo\n}\n\nexport type ErrorBoundaryProps = {\n\tchildren: ReactNode\n\tonError?: ((error: Error | string, errorInfo: ErrorInfo) => void) | undefined\n\tFallback?: FC<FallbackProps> | undefined\n\tresetErrorState?: () => void\n\tuseErrorState?: () => [\n\t\tErrorBoundaryState,\n\t\t(\n\t\t\tnewState:\n\t\t\t\t| ErrorBoundaryState\n\t\t\t\t| ((currState: ErrorBoundaryState) => ErrorBoundaryState),\n\t\t) => void,\n\t]\n}\n\nexport class ErrorBoundary extends Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tpublic constructor(props: ErrorBoundaryProps) {\n\t\tsuper(props)\n\t\tthis.state = {}\n\t\t// We can filter or add information\n\t\t// to airbrake notifications here:\n\t}\n\n\tpublic override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n\t\tthis.props.onError?.(error, errorInfo)\n\t\tthis.setState({\n\t\t\terror,\n\t\t\terrorInfo,\n\t\t})\n\t}\n\n\tpublic override render(): ReactNode {\n\t\tconst { error, errorInfo } = this.state\n\t\tconst { children, Fallback = DefaultFallback } = this.props\n\n\t\treturn errorInfo ? (\n\t\t\t<Fallback error={error} errorInfo={errorInfo} />\n\t\t) : (\n\t\t\tchildren\n\t\t)\n\t}\n}\n","import type { CSSProperties, FC, ReactNode } from \"react\"\n\nimport { ErrorBoundary } from \"../error-boundary\"\n\nexport type Dict<T> = Record<string, T>\n\nexport type WrapperComponent<T extends Dict<unknown> = Dict<unknown>> = FC<\n\tT & { children: ReactNode; testid?: string | undefined }\n>\n\nexport type WC<T extends Dict<unknown> = Dict<unknown>> = WrapperComponent<T>\n\nexport type JsonEditorComponents = {\n\tErrorBoundary: WC\n\n\tButton: WC<{\n\t\tonClick?: () => void\n\t\tdisabled?: boolean\n\t}>\n\tDeleteIcon: FC\n\tAddIcon: FC\n\n\tEditorWrapper: WC<{\n\t\tstyle?: CSSProperties | undefined\n\t\tclassName?: string | undefined\n\t\ttestid?: string | undefined\n\t}>\n\n\tArrayWrapper: WC\n\tObjectWrapper: WC\n\tStringWrapper: WC\n\tNumberWrapper: WC\n\tBooleanWrapper: WC\n\tNull: FC<{ testid?: string | undefined }>\n\n\tMissingPropertyWrapper: WC\n\tKeyWrapper: WC\n}\n\nexport const DEFAULT_JSON_EDITOR_COMPONENTS: JsonEditorComponents = {\n\tErrorBoundary: ({ children }) => <ErrorBoundary>{children}</ErrorBoundary>,\n\tButton: ({ onClick, children, disabled, testid }) => (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"json_editor_button\"\n\t\t\tonClick={onClick}\n\t\t\tdisabled={disabled}\n\t\t\tdata-testid={testid}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t),\n\tEditorWrapper: ({ children, className, testid }) => (\n\t\t<div\n\t\t\tclassName={`json_editor` + (className ? ` ${className}` : ``)}\n\t\t\tdata-testid={testid}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tArrayWrapper: ({ children, testid }) => (\n\t\t<div className=\"json_editor_array\" data-testid={testid}>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tObjectWrapper: ({ children, testid }) => (\n\t\t<div className=\"json_editor_object\" data-testid={testid}>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tStringWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_string\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tNumberWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_number\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tBooleanWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_boolean\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tNull: ({ testid }) => (\n\t\t<span className=\"json_editor_null\" data-testid={testid} />\n\t),\n\tDeleteIcon: () => (\n\t\t<span className=\"json_editor_icon json_editor_delete\">Ć</span>\n\t),\n\t// big plus\n\tAddIcon: () => <span className=\"json_editor_icon json_editor_add\">ļ¼</span>,\n\tMissingPropertyWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_missing_property\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tKeyWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_key\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n}\n","import type {\n\tAtomToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tSelectorToken,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tcreateRegularAtom,\n\tcreateRegularAtomFamily,\n\tcreateTransaction,\n\ttype Store,\n} from \"atom.io/internal\"\nimport type {\n\tIntrospectionStates,\n\tWritableTokenIndex,\n} from \"atom.io/introspection\"\nimport { attachIntrospectionStates, isPlainObject } from \"atom.io/introspection\"\nimport { persistSync } from \"atom.io/web\"\nimport type { Context } from \"react\"\nimport { createContext } from \"react\"\n\ntype DevtoolsView = `atoms` | `selectors` | `timelines` | `transactions`\n\nexport type DevtoolsStates = {\n\tdevtoolsAreHiddenAtom: RegularAtomToken<boolean>\n\tdevtoolsAreOpenAtom: RegularAtomToken<boolean>\n\tdevtoolsViewSelectionAtom: RegularAtomToken<DevtoolsView>\n\tdevtoolsViewOptionsAtom: RegularAtomToken<DevtoolsView[]>\n\tviewIsOpenAtoms: RegularAtomFamilyToken<boolean, readonly (number | string)[]>\n\topenCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>\n}\n\nexport function attachDevtoolsStates(\n\tstore: Store,\n\thideByDefault = false,\n): DevtoolsStates & IntrospectionStates & { store: Store } {\n\tconst introspectionStates = attachIntrospectionStates(store)\n\n\tconst devtoolsAreHiddenAtom = createRegularAtom<boolean>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools Are Hidden`,\n\t\t\tdefault: hideByDefault,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tpersistSync(window.localStorage, JSON, `š Devtools Are Hidden`),\n\t\t\t\t\t\t\t({ setSelf }) => {\n\t\t\t\t\t\t\t\twindow.addEventListener(`keydown`, (e) => {\n\t\t\t\t\t\t\t\t\tif (e.ctrlKey && e.shiftKey && e.key.toLowerCase() === `a`) {\n\t\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\t\tsetSelf((state) => !state)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsAreOpenAtom = createRegularAtom<boolean>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools Are Open`,\n\t\t\tdefault: true,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools Are Open`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsViewSelectionAtom = createRegularAtom<DevtoolsView>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools View Selection`,\n\t\t\tdefault: `atoms`,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools View`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsViewOptionsAtom = createRegularAtom<DevtoolsView[]>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools View Options`,\n\t\t\tdefault: [`atoms`, `selectors`, `transactions`, `timelines`],\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools View Options`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst viewIsOpenAtoms = createRegularAtomFamily<\n\t\tboolean,\n\t\treadonly (number | string)[]\n\t>(store, {\n\t\tkey: `š Devtools View Is Open`,\n\t\tdefault: false,\n\t\teffects: (key) =>\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `view-is-open:${key.join()}`)],\n\t})\n\n\tconst openCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t> = createTransaction<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>(store, {\n\t\tkey: `š Open Close All`,\n\t\tdo: ({ get, set }, path, current) => {\n\t\t\tconst currentView = get(devtoolsViewSelectionAtom)\n\t\t\tlet states:\n\t\t\t\t| WritableTokenIndex<AtomToken<unknown>>\n\t\t\t\t| WritableTokenIndex<SelectorToken<unknown>>\n\t\t\tswitch (currentView) {\n\t\t\t\tcase `atoms`:\n\t\t\t\t\tstates = get(introspectionStates.atomIndex)\n\t\t\t\t\tbreak\n\t\t\t\tcase `selectors`:\n\t\t\t\t\tstates = get(introspectionStates.selectorIndex)\n\t\t\t\t\tbreak\n\t\t\t\tcase `transactions`:\n\t\t\t\tcase `timelines`:\n\t\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (path.length) {\n\t\t\t\tcase 1:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (const [key] of states) {\n\t\t\t\t\t\t\tset(viewIsOpenAtoms, [key], !current)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tdefault: {\n\t\t\t\t\tconst item = states.get(path[0] as string)\n\t\t\t\t\tlet value: unknown\n\t\t\t\t\tlet segments: (number | string)[]\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\tif (`familyMembers` in item) {\n\t\t\t\t\t\t\tif (path.length === 2) {\n\t\t\t\t\t\t\t\tfor (const [subKey] of item.familyMembers) {\n\t\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [path[0], subKey], !current)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: fine here\n\t\t\t\t\t\t\tconst token = item.familyMembers.get(path[1] as string)!\n\t\t\t\t\t\t\tvalue = get(token)\n\t\t\t\t\t\t\tsegments = path.slice(2, -1)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue = get(item)\n\t\t\t\t\t\t\tsegments = path.slice(1, -1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const segment of segments) {\n\t\t\t\t\t\t\tif (value && typeof value === `object`) {\n\t\t\t\t\t\t\t\tvalue = value[segment as keyof typeof value]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst head = path.slice(0, -1)\n\t\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [...head, i], !current)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (isPlainObject(value)) {\n\t\t\t\t\t\t\t\tfor (const key of Object.keys(value)) {\n\t\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [...head, key], !current)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n\n\treturn {\n\t\t...introspectionStates,\n\t\tdevtoolsAreHiddenAtom,\n\t\tdevtoolsAreOpenAtom,\n\t\tdevtoolsViewSelectionAtom,\n\t\tdevtoolsViewOptionsAtom,\n\t\tviewIsOpenAtoms,\n\t\topenCloseAllTX,\n\t\tstore,\n\t}\n}\n\nexport const DevtoolsContext: Context<\n\tDevtoolsStates & IntrospectionStates & { store: Store }\n> = createContext({})\n","import type {\n\tDetailedHTMLProps,\n\tForwardRefExoticComponent,\n\tInputHTMLAttributes,\n} from \"react\"\nimport {\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\n\nexport type ElasticInputProps = DetailedHTMLProps<\n\tInputHTMLAttributes<HTMLInputElement>,\n\tHTMLInputElement\n> & {\n\twidthPadding?: number\n}\n\nexport const ElasticInput: ForwardRefExoticComponent<\n\tDetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> & {\n\t\twidthPadding?: number\n\t}\n> = forwardRef(function ElasticInputFC(props, ref) {\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\tconst spanRef = useRef<HTMLSpanElement>(null)\n\tconst [inputWidth, setInputWidth] = useState(`auto`)\n\n\tuseImperativeHandle<Partial<HTMLInputElement>, Partial<HTMLInputElement>>(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => {\n\t\t\t\tinputRef.current?.focus()\n\t\t\t},\n\t\t}),\n\t)\n\n\tconst extraWidth = props.type === `number` ? 15 : 0\n\n\tuseLayoutEffect(() => {\n\t\tif (spanRef.current) {\n\t\t\tsetInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`)\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tif (spanRef.current) {\n\t\t\t\t\tsetInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`)\n\t\t\t\t}\n\t\t\t}, 1000)\n\t\t\treturn () => {\n\t\t\t\tclearInterval(interval)\n\t\t\t}\n\t\t}\n\t}, [inputRef.current?.value, props.value])\n\n\treturn (\n\t\t<div style={{ display: `inline-block`, position: `relative` }}>\n\t\t\t<input\n\t\t\t\t{...props}\n\t\t\t\tref={inputRef}\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborderRadius: 0,\n\t\t\t\t\tborder: `none`,\n\t\t\t\t\tfontFamily: `inherit`,\n\t\t\t\t\tfontSize: `inherit`,\n\t\t\t\t\twidth: inputWidth,\n\t\t\t\t\t...props.style,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<span\n\t\t\t\tref={spanRef}\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: props.style?.padding,\n\t\t\t\t\tposition: `absolute`,\n\t\t\t\t\tvisibility: `hidden`,\n\t\t\t\t\t// color: `red`,\n\t\t\t\t\twhiteSpace: `pre`,\n\t\t\t\t\tfontFamily: props.style?.fontFamily ?? `inherit`,\n\t\t\t\t\tfontSize: props.style?.fontSize ?? `inherit`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{props.value}\n\t\t\t</span>\n\t\t</div>\n\t)\n})\n","import type { FC } from \"react\"\nimport { useId, useRef, useState } from \"react\"\n\nimport { ElasticInput } from \".\"\n\nexport function clampInto(min: number, max: number) {\n\treturn (value: number): number =>\n\t\tvalue < min ? min : value > max ? max : value\n}\nfunction round(value: number, decimalPlaces?: number): number {\n\tif (decimalPlaces === undefined) return value\n\tconst factor = 10 ** decimalPlaces\n\treturn Math.round(value * factor) / factor\n}\nfunction _roundAndPad(value: number, decimalPlaces?: number): string {\n\tconst roundedValue = round(value, decimalPlaces)\n\tconst paddedString = roundedValue.toFixed(decimalPlaces)\n\treturn paddedString\n}\n\nexport const VALID_NON_NUMBERS = [``, `-`, `.`, `-.`] as const\nexport type ValidNonNumber = (typeof VALID_NON_NUMBERS)[number]\nexport const isValidNonNumber = (input: string): input is ValidNonNumber =>\n\tVALID_NON_NUMBERS.includes(input as ValidNonNumber)\nexport const VALID_NON_NUMBER_INTERPRETATIONS: Readonly<\n\tRecord<ValidNonNumber, number | null>\n> = {\n\t\"\": null,\n\t\"-\": 0,\n\t\".\": 0,\n\t\"-.\": 0,\n} as const\nexport type DecimalInProgress = `${number | ``}.${number}`\nexport const isDecimalInProgress = (input: string): input is DecimalInProgress =>\n\tinput === `0` || (!Number.isNaN(Number(input)) && input.includes(`.`))\n\nconst textToValue = (input: string, allowDecimal: boolean): number | null => {\n\tif (isValidNonNumber(input)) return VALID_NON_NUMBER_INTERPRETATIONS[input]\n\treturn allowDecimal\n\t\t? Number.parseFloat(input)\n\t\t: Math.round(Number.parseFloat(input))\n}\n\nexport type NumberConstraints = {\n\tmax: number\n\tmin: number\n\tdecimalPlaces: number\n\tnullable: boolean\n}\nexport const DEFAULT_NUMBER_CONSTRAINTS: NumberConstraints = {\n\tmax: Number.POSITIVE_INFINITY,\n\tmin: Number.NEGATIVE_INFINITY,\n\tdecimalPlaces: 100,\n\tnullable: true,\n}\n\nconst initRefinery =\n\t<Constraints extends NumberConstraints>(\n\t\tconstraints: { [K in keyof Constraints]?: Constraints[K] | undefined },\n\t) =>\n\t(\n\t\tinput: number | null,\n\t): Constraints extends { nullable: true | undefined }\n\t\t? number | null\n\t\t: number => {\n\t\tif (input === null && constraints.nullable === true) {\n\t\t\treturn null as Constraints extends { nullable: true }\n\t\t\t\t? number | null\n\t\t\t\t: number\n\t\t}\n\t\tconst { max, min, decimalPlaces } = {\n\t\t\t...DEFAULT_NUMBER_CONSTRAINTS,\n\t\t\t...constraints,\n\t\t}\n\t\tlet constrained = clampInto(min, max)(input ?? 0)\n\t\tif (decimalPlaces) {\n\t\t\tconstrained = round(constrained, decimalPlaces)\n\t\t}\n\t\treturn constrained\n\t}\n\nconst valueToText = (numericValue: number | null): string => {\n\tif (numericValue === null || numericValue === undefined) {\n\t\treturn ``\n\t}\n\treturn numericValue.toString()\n}\n\ntype NumberInputProps = Partial<NumberConstraints> & {\n\tautoSize?: boolean\n\tdisabled?: boolean\n\tid?: string\n\tlabel?: string\n\tname?: string\n\tonChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n\tonClick?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n\tplaceholder?: string\n\tset?: ((newValue: number | null) => void) | undefined\n\ttestid?: string\n\tvalue?: number | null\n}\n\nexport const NumberInput: FC<NumberInputProps> = ({\n\tautoSize = false,\n\tdecimalPlaces,\n\tdisabled = false,\n\tlabel,\n\tmax,\n\tmin,\n\tname,\n\tonChange,\n\tonClick,\n\tplaceholder = ``,\n\tset = () => null,\n\ttestid,\n\tvalue = null,\n}) => {\n\tconst htmlId = useId()\n\tconst [temporaryEntry, setTemporaryEntry] = useState<\n\t\tDecimalInProgress | ValidNonNumber | null\n\t>(null)\n\tconst userHasMadeDeliberateChange = useRef<boolean>(false)\n\n\tconst refine = initRefinery({ max, min, decimalPlaces, nullable: true })\n\n\tconst allowDecimal = decimalPlaces === undefined || decimalPlaces > 0\n\n\tconst handleBlur = () => {\n\t\tif (userHasMadeDeliberateChange.current) {\n\t\t\tset(refine(value ?? null))\n\t\t\tsetTemporaryEntry(null)\n\t\t}\n\t\tuserHasMadeDeliberateChange.current = false\n\t}\n\n\tconst handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tif (onChange) onChange(event)\n\t\tif (set === undefined) return\n\t\tuserHasMadeDeliberateChange.current = true\n\t\tconst input = event.target.value\n\t\tif (isValidNonNumber(input) || isDecimalInProgress(input)) {\n\t\t\tsetTemporaryEntry(input)\n\t\t\tconst textInterpretation = isDecimalInProgress(input)\n\t\t\t\t? input\n\t\t\t\t: (min?.toString() ?? `0`)\n\t\t\tconst newValue = textToValue(textInterpretation, allowDecimal)\n\t\t\tset(refine(newValue))\n\t\t\treturn\n\t\t}\n\t\tsetTemporaryEntry(null)\n\t\tconst inputIsNumeric =\n\t\t\t(!Number.isNaN(Number(input)) && !input.includes(` `)) ||\n\t\t\t(allowDecimal && input === `.`) ||\n\t\t\t(allowDecimal && input === `-.`) ||\n\t\t\tinput === `` ||\n\t\t\tinput === `-`\n\t\tconst numericValue = textToValue(input, allowDecimal)\n\n\t\tif (inputIsNumeric) {\n\t\t\tset(refine(numericValue))\n\t\t}\n\t}\n\n\tconst displayValue =\n\t\ttemporaryEntry ?? valueToText(value ? refine(value) : value)\n\n\treturn (\n\t\t<span>\n\t\t\t{label ? <label htmlFor={htmlId}>{label}</label> : null}\n\t\t\t{autoSize ? (\n\t\t\t\t<ElasticInput\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\tplaceholder={placeholder ?? `-`}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tname={name ?? htmlId}\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\tplaceholder={placeholder ?? `-`}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tname={name ?? htmlId}\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n","import { type FC, useId } from \"react\"\n\nimport { ElasticInput } from \".\"\n\nexport type TextInputProps = {\n\tvalue: string\n\tset?: ((value: string) => void) | undefined\n\tlabel?: string\n\tplaceholder?: string\n\tautoSize?: boolean\n\treadOnly?: boolean\n\ttestid?: string\n}\n\nexport const TextInput: FC<TextInputProps> = ({\n\tvalue,\n\tset,\n\tlabel,\n\tplaceholder,\n\tautoSize = false,\n\ttestid,\n}) => {\n\tconst htmlId = useId()\n\treturn (\n\t\t<span>\n\t\t\t{label ? <label htmlFor={htmlId}>{label}</label> : null}\n\t\t\t{autoSize ? (\n\t\t\t\t<ElasticInput\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => set?.(e.target.value)}\n\t\t\t\t\tdisabled={set === undefined}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<input\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => set?.(e.target.value)}\n\t\t\t\t\tdisabled={set === undefined}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n","import { ElasticInput } from \"../../elastic-input\"\nimport type { JsonEditorProps } from \"../developer-interface\"\n\nexport const NonJsonEditor: React.FC<JsonEditorProps<never>> = ({\n\tdata,\n\ttestid,\n}) => {\n\treturn data === undefined ? (\n\t\t<ElasticInput\n\t\t\tdisabled\n\t\t\tvalue=\"undefined\"\n\t\t\tdata-testid={`${testid}-undefined`}\n\t\t/>\n\t) : (\n\t\t<ElasticInput\n\t\t\tdisabled\n\t\t\tvalue={\n\t\t\t\tObject.getPrototypeOf(data).constructor.name + ` ` + JSON.stringify(data)\n\t\t\t}\n\t\t\tdata-testid={`${testid}-non-json-${Object.getPrototypeOf(data).constructor.name}`}\n\t\t/>\n\t)\n}\n","import { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { jsonRefinery } from \"atom.io/introspection\"\nimport type { JsonTypes } from \"atom.io/json\"\nimport { isJson } from \"atom.io/json\"\nimport {\n\ttype CSSProperties,\n\ttype FC,\n\ttype ReactElement,\n\tuseContext,\n} from \"react\"\n\nimport { button } from \"../Button\"\nimport { ElasticInput } from \"../elastic-input\"\nimport { DevtoolsContext } from \"../store\"\nimport type { SetterOrUpdater } from \".\"\nimport { SubEditors } from \".\"\nimport type { JsonEditorComponents } from \"./default-components\"\nimport { NonJsonEditor } from \"./editors-by-type/non-json\"\n\nexport type JsonEditorProps_INTERNAL<T> = {\n\tdata: T\n\tset: SetterOrUpdater<T>\n\tname?: string | undefined\n\trename?: ((newKey: string) => void) | undefined\n\tremove?: (() => void) | undefined\n\trecast?: (newType: keyof JsonTypes) => void\n\tpath?: ReadonlyArray<number | string>\n\tisReadonly?: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden?: (path: ReadonlyArray<number | string>) => boolean\n\tclassName?: string | undefined\n\tstyle?: CSSProperties | undefined\n\tHeader?: FC<{ data: T }> | undefined\n\tComponents: JsonEditorComponents\n\tisOpen?: boolean\n\tsetIsOpen?: (newValue: boolean) => void\n\ttestid?: string | undefined\n}\n\nexport const JsonEditor_INTERNAL = <T,>({\n\tdata,\n\tset,\n\tname,\n\trename,\n\tremove,\n\trecast,\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tclassName,\n\tstyle,\n\tComponents,\n\tisOpen,\n\tsetIsOpen,\n\ttestid,\n}: JsonEditorProps_INTERNAL<T>): ReactElement | null => {\n\tconst { openCloseAllTX, store } = useContext(DevtoolsContext)\n\n\tconst dataIsJson = isJson(data)\n\tconst refined = jsonRefinery.refine<unknown>(data) ?? {\n\t\ttype: `non-json`,\n\t\tdata,\n\t}\n\tconst SubEditor = dataIsJson\n\t\t? SubEditors[refined.type as keyof JsonTypes]\n\t\t: NonJsonEditor\n\n\tconst disabled = isReadonly(path)\n\n\tconst dataIsTree = refined.type === `array` || refined.type === `object`\n\tconst dataIsExpandable = dataIsTree && isOpen !== undefined && setIsOpen\n\n\treturn isHidden(path) ? null : (\n\t\t<Components.ErrorBoundary>\n\t\t\t<Components.EditorWrapper\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={style}\n\t\t\t\ttestid={testid}\n\t\t\t>\n\t\t\t\t<header>\n\t\t\t\t\t<main>\n\t\t\t\t\t\t{remove || dataIsExpandable ? (\n\t\t\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\t\t\tisOpen={isOpen ?? false}\n\t\t\t\t\t\t\t\ttestid={`${testid}-open-close`}\n\t\t\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\t\t\tactUponStore(store, openCloseAllTX, arbitrary())(path, isOpen)\n\t\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t\t\t\tdisabled={!dataIsExpandable}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{rename && (\n\t\t\t\t\t\t\t<Components.KeyWrapper>\n\t\t\t\t\t\t\t\t<ElasticInput\n\t\t\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\trename(e.target.value)\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-rename`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Components.KeyWrapper>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{dataIsTree ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{isOpen !== undefined && setIsOpen ? (\n\t\t\t\t\t\t\t\t\t<span className=\"json_viewer\">{JSON.stringify(data)}</span>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{recast ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\trecast(e.target.value as keyof JsonTypes)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tvalue={refined.type}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-recast`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{Object.keys(SubEditors).map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={type} value={type}>\n\t\t\t\t\t\t\t\t\t\t\t\t{type}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<SubEditor\n\t\t\t\t\t\t\t\t\tdata={refined.data as never}\n\t\t\t\t\t\t\t\t\tset={set}\n\t\t\t\t\t\t\t\t\tremove={remove}\n\t\t\t\t\t\t\t\t\trename={rename}\n\t\t\t\t\t\t\t\t\tpath={path}\n\t\t\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{recast && dataIsJson ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tonChange={\n\t\t\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t: (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trecast(e.target.value as keyof JsonTypes)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvalue={refined.type}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-recast`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{Object.keys(SubEditors).map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={type} value={type}>\n\t\t\t\t\t\t\t\t\t\t\t\t{type}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</main>\n\t\t\t\t\t{remove ? (\n\t\t\t\t\t\t<Components.Button\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tremove()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttestid={`${testid}-delete`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Components.DeleteIcon />\n\t\t\t\t\t\t</Components.Button>\n\t\t\t\t\t) : null}\n\t\t\t\t</header>\n\n\t\t\t\t{dataIsTree && isOpen !== false ? (\n\t\t\t\t\t<SubEditor\n\t\t\t\t\t\tdata={refined.data as never}\n\t\t\t\t\t\tset={set}\n\t\t\t\t\t\tremove={remove}\n\t\t\t\t\t\trename={rename}\n\t\t\t\t\t\tpath={path}\n\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</Components.EditorWrapper>\n\t\t</Components.ErrorBoundary>\n\t)\n}\n","import { become } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { SetterOrUpdater } from \"../..\"\n\nexport const makeElementSetters = <T extends Json.Tree.Array>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): SetterOrUpdater<T[number]>[] =>\n\tdata.map((value, index) => (newValue) => {\n\t\tset((): T => {\n\t\t\tconst newData = [...data]\n\t\t\tnewData[index] = become(newValue, value)\n\t\t\treturn newData as unknown as T\n\t\t})\n\t})\n","import type { Json } from \"atom.io/json\"\n\nexport const stringToBoolean = (str: string): boolean => str === `true`\nexport const stringToNumber = (str: string): number => Number(str)\nexport const stringToArray = (str: string): string[] => str.split(`,`)\nexport const stringToObject = (str: string): Json.Tree.Object => {\n\ttry {\n\t\treturn JSON.parse(str)\n\t} catch (_) {\n\t\treturn { [str]: str }\n\t}\n}\n\nexport const objectToString = (obj: Json.Tree.Object): string =>\n\tJSON.stringify(obj)\nexport const objectToBoolean = (obj: Json.Tree.Object): boolean =>\n\tobj[`true`] === true\nexport const objectToNumber = (obj: Json.Tree.Object): number =>\n\tNumber(obj[`number`] ?? obj[`size`] ?? obj[`count`] ?? 0)\nexport const objectToArray = <T>(\n\tobj: Json.Tree.Object<string, T>,\n): [key: string, value: T][] => Object.entries(obj)\n\nexport const booleanToString = (bool: boolean): string => bool.toString()\nexport const booleanToNumber = (bool: boolean): number => +bool\nexport const booleanToObject = (bool: boolean): Json.Tree.Object => ({\n\t[bool.toString()]: bool,\n})\nexport const booleanToArray = (bool: boolean): boolean[] => [bool]\n\nexport const numberToString = (num: number): string => num.toString()\nexport const numberToBoolean = (num: number): boolean => num === 1\nexport const numberToObject = (num: number): Json.Tree.Object => ({\n\tnumber: num,\n})\nexport const numberToArray = (num: number): null[] => Array(num).fill(null)\n\nexport const arrayToString = (arr: Json.Tree.Array): string => arr.join(`,`)\nexport const arrayToNumber = (arr: Json.Tree.Array): number => arr.length\nexport const arrayToBoolean = (arr: Json.Tree.Array): boolean =>\n\ttypeof arr[0] === `boolean` ? arr[0] : arr.length > 0\nexport const arrayToObject = <T>(\n\tarr: Json.Tree.Array<T>,\n): Json.Tree.Object<`${number}`, T> =>\n\tarr.reduce(\n\t\t(acc, cur, idx) => {\n\t\t\tacc[`${idx}`] = cur\n\t\t\treturn acc\n\t\t},\n\t\t{} as Json.Tree.Object<`${number}`, T>,\n\t)\n\nexport const nullToString = (): string => ``\nexport const nullToNumber = (): number => 0\nexport const nullToBoolean = (): boolean => false\nexport const nullToArray = (): Json.Tree.Array => []\nexport const nullToObject = (): Json.Tree.Object => ({})\n","import { jsonRefinery } from \"atom.io/introspection\"\nimport type { Json } from \"atom.io/json\"\n\nimport * as Cast from \"./cast-json\"\n\nexport const castToJson = (\n\tinput: unknown,\n): {\n\tarray: Json.Tree.Array\n\tboolean: boolean\n\tnumber: number\n\tobject: Json.Tree.Object\n\tstring: string\n\tnull: null\n} => {\n\tconst refined = jsonRefinery.refine(input)\n\tswitch (refined?.type) {\n\t\tcase `array`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.arrayToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.arrayToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.arrayToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.arrayToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `boolean`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.booleanToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.booleanToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.booleanToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.booleanToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `number`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.numberToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.numberToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.numberToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.numberToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `object`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.objectToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.objectToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.objectToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.objectToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `string`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.stringToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.stringToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.stringToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.stringToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `null`:\n\t\tcase undefined: {\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.nullToArray()\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.nullToBoolean()\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.nullToNumber()\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.nullToObject()\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.nullToString()\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n}\n","import { become } from \"atom.io/internal\"\nimport type { Json, JsonTypeName } from \"atom.io/json\"\nimport { fromEntries, JSON_DEFAULTS, toEntries } from \"atom.io/json\"\nimport type { RefObject } from \"react\"\n\nimport type { SetterOrUpdater } from \"../..\"\nimport { castToJson } from \"./cast-to-json\"\n\nexport const makePropertySetters = <T extends Json.Tree.Object>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: SetterOrUpdater<T[K]> } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newValue: unknown) => {\n\t\t\t\tset({ ...data, [key]: become(newValue, value) })\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRenamers = <T extends Json.Tree.Object>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n\tstableKeyMapRef: RefObject<{ [Key in keyof T]: keyof T }>,\n): { [K in keyof T]: (newKey: string) => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newKey: string) => {\n\t\t\t\tif (!Object.hasOwn(data, newKey)) {\n\t\t\t\t\tset(() => {\n\t\t\t\t\t\tconst entries = Object.entries(data)\n\t\t\t\t\t\tconst index = entries.findIndex(([k]) => k === key)\n\t\t\t\t\t\tentries[index] = [newKey, value]\n\t\t\t\t\t\tconst stableKeyMap = stableKeyMapRef.current\n\t\t\t\t\t\tstableKeyMapRef.current = {\n\t\t\t\t\t\t\t...stableKeyMap,\n\t\t\t\t\t\t\t[newKey]: stableKeyMap[key],\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Object.fromEntries(entries) as T\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRemovers = <\n\tT extends Json.Tree.Array | Json.Tree.Object,\n>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: () => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key]) => [\n\t\t\tkey,\n\t\t\t() => {\n\t\t\t\tset(() => {\n\t\t\t\t\tlet next: T\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tconst copy = [...data]\n\t\t\t\t\t\tcopy.splice(key as number, 1)\n\t\t\t\t\t\tnext = copy as unknown as T\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { [key]: _, ...rest } = data\n\t\t\t\t\t\tnext = rest as T\n\t\t\t\t\t}\n\t\t\t\t\treturn next\n\t\t\t\t})\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRecasters = <\n\tT extends Json.Tree.Array | Json.Tree.Object,\n>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: (newType: JsonTypeName) => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newType: JsonTypeName) => {\n\t\t\t\tset(() => {\n\t\t\t\t\tlet next: T\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tconst copy = [...data]\n\t\t\t\t\t\tcopy[key as number] = castToJson(value)[newType]\n\t\t\t\t\t\tnext = copy as unknown as T\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext = {\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t[key]: castToJson(value)[newType],\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn next\n\t\t\t\t})\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyCreationInterface =\n\t<T extends Json.Tree.Object>(\n\t\tdata: T,\n\t\tset: SetterOrUpdater<T>,\n\t): ((\n\t\tkey: string,\n\t\ttype: JsonTypeName,\n\t) => (value?: Json.Serializable) => void) =>\n\t(key, type) =>\n\t(value) => {\n\t\tset({ ...data, [key]: value ?? JSON_DEFAULTS[type] })\n\t}\n\nexport const makePropertySorter =\n\t<T extends Json.Tree.Object>(\n\t\tdata: T,\n\t\tset: SetterOrUpdater<T>,\n\t\tsortFn?: (a: string, b: string) => number,\n\t): (() => void) =>\n\t() => {\n\t\tconst sortedKeys = Object.keys(data).sort(sortFn)\n\t\tconst sortedObj = {} as Record<string, unknown>\n\t\tfor (const key of sortedKeys) {\n\t\t\tsortedObj[key] = data[key]\n\t\t}\n\t\tset(sortedObj as T)\n\t}\n","import type { RegularAtomToken } from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json, JsonTypes } from \"atom.io/json\"\nimport { JSON_DEFAULTS } from \"atom.io/json\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type ReactElement, useContext } from \"react\"\n\nimport { DevtoolsContext } from \"../../store\"\nimport type { JsonEditorComponents, SetterOrUpdater } from \"..\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"../json-editor-internal\"\nimport { makeElementSetters } from \"./utilities/array-elements\"\nimport {\n\tmakePropertyRecasters,\n\tmakePropertyRemovers,\n} from \"./utilities/object-properties\"\n\ntype ArrayElementProps = {\n\tpath: ReadonlyArray<number | string>\n\tisReadonly: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden: (path: ReadonlyArray<number | string>) => boolean\n\tdata: unknown\n\tset: SetterOrUpdater<Json.Tree.Array>\n\tremove: (() => void) | undefined\n\trecast: (newType: keyof JsonTypes) => void\n\tComponents: JsonEditorComponents\n\ttestid?: string | undefined\n\tviewIsOpenAtom: RegularAtomToken<boolean, readonly (number | string)[]>\n}\nconst ArrayElement = ({\n\tpath,\n\tisReadonly,\n\tisHidden,\n\tdata,\n\tset,\n\tremove,\n\trecast,\n\tComponents,\n\ttestid,\n\tviewIsOpenAtom,\n}: ArrayElementProps): ReactElement => {\n\tconst index = path[path.length - 1]\n\tconst viewIsOpen = useO(viewIsOpenAtom)\n\tconst setViewIsOpen = useI(viewIsOpenAtom)\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tpath={path}\n\t\t\tname={`${index}`}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tremove={remove}\n\t\t\trecast={recast}\n\t\t\tclassName=\"json_editor_element\"\n\t\t\tComponents={Components}\n\t\t\tisOpen={viewIsOpen}\n\t\t\tsetIsOpen={setViewIsOpen}\n\t\t\ttestid={`${testid}-element-${index}`}\n\t\t/>\n\t)\n}\n\nexport const ArrayEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<Json.Tree.Array>): ReactElement => {\n\tconst { viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\tconst disabled = isReadonly(path)\n\n\tconst setElement = makeElementSetters(data, set)\n\tconst removeElement = makePropertyRemovers(data, set)\n\tconst recastElement = makePropertyRecasters(data, set)\n\n\treturn (\n\t\t<Components.ArrayWrapper>\n\t\t\t<main className={`json_editor_elements${disabled ? ` readonly` : ``}`}>\n\t\t\t\t{data.map((element, index) => {\n\t\t\t\t\tconst elementPath = [...path, index]\n\t\t\t\t\tconst pathKey = elementPath.join(`,`)\n\t\t\t\t\tconst viewIsOpenAtom = findInStore(store, viewIsOpenAtoms, [\n\t\t\t\t\t\t...path,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t])\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ArrayElement\n\t\t\t\t\t\t\tkey={pathKey}\n\t\t\t\t\t\t\tpath={elementPath}\n\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\tdata={element}\n\t\t\t\t\t\t\tset={setElement[index]}\n\t\t\t\t\t\t\tremove={removeElement[index]}\n\t\t\t\t\t\t\trecast={recastElement[index]}\n\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\tviewIsOpenAtom={viewIsOpenAtom}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</main>\n\t\t\t{!disabled ? (\n\t\t\t\t<footer>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\ttestid={`${testid}-add-element`}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tset((current) => {\n\t\t\t\t\t\t\t\tconst newData = [...current, JSON_DEFAULTS.string]\n\t\t\t\t\t\t\t\treturn newData\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Components.AddIcon />\n\t\t\t\t\t</Components.Button>\n\t\t\t\t</footer>\n\t\t\t) : null}\n\t\t</Components.ArrayWrapper>\n\t)\n}\n","import type { RegularAtomToken } from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json, JsonTypes } from \"atom.io/json\"\nimport { useI, useO } from \"atom.io/react\"\nimport type { FC, ReactElement } from \"react\"\nimport { useContext, useRef } from \"react\"\n\nimport { ElasticInput } from \"../../elastic-input\"\nimport { DevtoolsContext } from \"../../store\"\nimport type { SetterOrUpdater } from \"..\"\nimport type { JsonEditorComponents } from \"../default-components\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"../json-editor-internal\"\nimport {\n\tmakePropertyCreationInterface,\n\tmakePropertyRecasters,\n\tmakePropertyRemovers,\n\tmakePropertyRenamers,\n\tmakePropertySetters,\n\tmakePropertySorter,\n} from \"./utilities/object-properties\"\n\nexport type PropertyAdderProps = {\n\taddProperty: () => void\n\tdisabled: boolean\n\tpropertyKey: string\n\tComponents: JsonEditorComponents\n}\n\nexport const PropertyAdder: FC<PropertyAdderProps> = ({\n\taddProperty,\n\tdisabled,\n\tpropertyKey,\n\tComponents,\n}) => (\n\t<Components.MissingPropertyWrapper>\n\t\t<ElasticInput disabled defaultValue={propertyKey} />\n\t\t{` `}\n\t\t<ElasticInput disabled defaultValue=\"is missing\" />\n\t\t<Components.Button\n\t\t\tonClick={() => {\n\t\t\t\taddProperty()\n\t\t\t}}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t+\n\t\t</Components.Button>\n\t</Components.MissingPropertyWrapper>\n)\n\ntype ObjectPropertyProps = {\n\tpath: ReadonlyArray<number | string>\n\tisReadonly: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden: (path: ReadonlyArray<number | string>) => boolean\n\tdata: unknown\n\tset: SetterOrUpdater<Json.Tree.Object>\n\trename: (newKey: string) => void\n\tremove: (() => void) | undefined\n\trecast: (newType: keyof JsonTypes) => void\n\tComponents: JsonEditorComponents\n\ttestid?: string | undefined\n\tviewIsOpenAtom: RegularAtomToken<boolean, readonly (number | string)[]>\n}\nconst ObjectProperty = ({\n\tpath,\n\tisReadonly,\n\tisHidden,\n\tdata,\n\tset,\n\trename,\n\tremove,\n\trecast,\n\tComponents,\n\ttestid,\n\tviewIsOpenAtom,\n}: ObjectPropertyProps): ReactElement => {\n\tconst key = path[path.length - 1]\n\tconst viewIsOpen = useO(viewIsOpenAtom)\n\tconst setViewIsOpen = useI(viewIsOpenAtom)\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tpath={path}\n\t\t\tname={`${key}`}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\trename={rename}\n\t\t\tremove={remove}\n\t\t\trecast={recast}\n\t\t\tclassName=\"json_editor_property\"\n\t\t\tComponents={Components}\n\t\t\tisOpen={viewIsOpen}\n\t\t\tsetIsOpen={setViewIsOpen}\n\t\t\ttestid={`${testid}-property-${key}`}\n\t\t/>\n\t)\n}\n\nexport const ObjectEditor = <T extends Json.Tree.Object>({\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<T>): ReactElement => {\n\tconst { viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\n\tconst disabled = isReadonly(path)\n\n\tconst stableKeyMap = useRef<Record<keyof T, keyof T>>(\n\t\tObject.keys(data).reduce(\n\t\t\t(acc, key: keyof T) => {\n\t\t\t\tacc[key] = key\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<keyof T, keyof T>,\n\t\t),\n\t)\n\n\tconst setProperty = makePropertySetters(data, set)\n\tconst renameProperty = makePropertyRenamers(data, set, stableKeyMap)\n\tconst removeProperty = makePropertyRemovers(data, set)\n\tconst recastProperty = makePropertyRecasters(data, set)\n\tconst sortProperties = makePropertySorter(data, set)\n\tconst makePropertyAdder = makePropertyCreationInterface(data, set)\n\n\treturn (\n\t\t<Components.ObjectWrapper>\n\t\t\t<div className={`json_editor_properties${disabled ? ` readonly` : ``}`}>\n\t\t\t\t{Object.keys(data).map((key) => {\n\t\t\t\t\tconst originalKey = stableKeyMap.current[key]\n\t\t\t\t\tconst propertyPath = [...path, key]\n\t\t\t\t\tconst originalPropertyPath = [...path, originalKey]\n\t\t\t\t\tconst stablePathKey = originalPropertyPath.join(`.`)\n\t\t\t\t\tconst viewIsOpenAtom = findInStore(store, viewIsOpenAtoms, [\n\t\t\t\t\t\t...path,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t])\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ObjectProperty\n\t\t\t\t\t\t\tkey={stablePathKey}\n\t\t\t\t\t\t\tpath={propertyPath}\n\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\tdata={data[key]}\n\t\t\t\t\t\t\tset={setProperty[key]}\n\t\t\t\t\t\t\trename={renameProperty[key]}\n\t\t\t\t\t\t\tremove={removeProperty[key]}\n\t\t\t\t\t\t\trecast={recastProperty[key]}\n\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\tviewIsOpenAtom={viewIsOpenAtom}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t{disabled ? null : (\n\t\t\t\t<footer>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\ttestid={`${testid}-add-property`}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tmakePropertyAdder(`new_property`, `string`)()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Components.AddIcon />\n\t\t\t\t\t</Components.Button>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\ttestid={`${testid}-sort-properties`}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsortProperties()\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t>\n\t\t\t\t\t\tSort\n\t\t\t\t\t</Components.Button>\n\t\t\t\t</footer>\n\t\t\t)}\n\t\t</Components.ObjectWrapper>\n\t)\n}\n","import type { ReactElement } from \"react\"\n\nimport { NumberInput, TextInput } from \"../../elastic-input\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\n\nexport const BooleanEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<boolean>): ReactElement => (\n\t<Components.BooleanWrapper>\n\t\t<input\n\t\t\tdisabled={isReadonly(path)}\n\t\t\tdata-testid={`${testid}-boolean-input`}\n\t\t\ttype=\"checkbox\"\n\t\t\tchecked={data}\n\t\t\tonChange={(event) => {\n\t\t\t\tset(event.target.checked)\n\t\t\t}}\n\t\t/>\n\t</Components.BooleanWrapper>\n)\n\nexport const NullEditor = ({\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<null>): ReactElement => (\n\t<Components.Null testid={`${testid}-null`} />\n)\n\nexport const NumberEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<number>): ReactElement => (\n\t<Components.NumberWrapper>\n\t\t<NumberInput\n\t\t\tdisabled={isReadonly(path)}\n\t\t\ttestid={`${testid}-number-input`}\n\t\t\tvalue={data}\n\t\t\tset={\n\t\t\t\tisReadonly(path)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: (newValue) => {\n\t\t\t\t\t\t\tset(Number(newValue))\n\t\t\t\t\t\t}\n\t\t\t}\n\t\t\tautoSize={true}\n\t\t/>\n\t</Components.NumberWrapper>\n)\n\nexport const StringEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<string>): ReactElement => {\n\treturn (\n\t\t<Components.StringWrapper>\n\t\t\t<TextInput\n\t\t\t\treadOnly={isReadonly(path)}\n\t\t\t\ttestid={`${testid}-string-input`}\n\t\t\t\tvalue={data}\n\t\t\t\tset={isReadonly(path) ? undefined : set}\n\t\t\t\tautoSize={true}\n\t\t\t/>\n\t\t</Components.StringWrapper>\n\t)\n}\n","import type { JsonTypes } from \"atom.io/json\"\nimport type { CSSProperties, FC, ReactElement } from \"react\"\n\nimport type { JsonEditorComponents } from \"./default-components\"\nimport { DEFAULT_JSON_EDITOR_COMPONENTS } from \"./default-components\"\nimport { ArrayEditor } from \"./editors-by-type/array-editor\"\nimport { ObjectEditor } from \"./editors-by-type/object-editor\"\nimport {\n\tBooleanEditor,\n\tNullEditor,\n\tNumberEditor,\n\tStringEditor,\n} from \"./editors-by-type/primitive-editors\"\nimport type { JsonEditorProps_INTERNAL } from \"./json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"./json-editor-internal\"\n\nexport const SubEditors: Record<\n\tkeyof JsonTypes,\n\tFC<JsonEditorProps_INTERNAL<any>>\n> = {\n\tarray: ArrayEditor,\n\tboolean: BooleanEditor,\n\tnull: NullEditor,\n\tnumber: NumberEditor,\n\tobject: ObjectEditor,\n\tstring: StringEditor,\n}\n\nexport type JsonEditorProps<T> = {\n\tdata: T\n\tset: (valOrUpdater: T | ((currVal: T) => T)) => void\n\tname?: string | undefined\n\trename?: ((newKey: string) => void) | undefined\n\tremove?: (() => void) | undefined\n\tpath?: ReadonlyArray<number | string>\n\tisReadonly?: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden?: (path: ReadonlyArray<number | string>) => boolean\n\tclassName?: string\n\tstyle?: CSSProperties\n\tHeader?: FC<{ data: T }>\n\tComponents?: Partial<JsonEditorComponents>\n\ttestid?: string | undefined\n}\n\nexport const JsonEditor = <T,>({\n\tdata,\n\tset,\n\tname,\n\trename,\n\tremove,\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tclassName,\n\tHeader,\n\tstyle,\n\tComponents: CustomComponents = {},\n\ttestid,\n}: JsonEditorProps<T>): ReactElement => {\n\tconst Components = {\n\t\t...DEFAULT_JSON_EDITOR_COMPONENTS,\n\t\t...CustomComponents,\n\t}\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tname={name}\n\t\t\trename={rename}\n\t\t\tremove={remove}\n\t\t\tpath={path}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tclassName={className}\n\t\t\tHeader={Header}\n\t\t\tstyle={style}\n\t\t\tComponents={Components}\n\t\t\ttestid={testid}\n\t\t/>\n\t)\n}\n","import type { ReadonlySelectorToken, WritableToken } from \"atom.io\"\nimport { useI, useO } from \"atom.io/react\"\nimport type { FC } from \"react\"\n\nimport { JsonEditor } from \"./json-editor\"\n\nexport const StateEditor: FC<{\n\ttoken: WritableToken<unknown>\n}> = ({ token }) => {\n\tconst set = useI(token)\n\tconst data = useO(token)\n\tconst metaPath = token.family\n\t\t? [token.family.key, token.family.subKey]\n\t\t: [token.key]\n\treturn (\n\t\t<JsonEditor\n\t\t\ttestid={`${token.key}-state-editor`}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tpath={metaPath}\n\t\t/>\n\t)\n}\n\nexport const ReadonlySelectorViewer: FC<{\n\ttoken: ReadonlySelectorToken<unknown>\n}> = ({ token }) => {\n\tconst data = useO(token)\n\tconst metaPath = token.family\n\t\t? [token.family.key, token.family.subKey]\n\t\t: [token.key]\n\treturn (\n\t\t<JsonEditor\n\t\t\ttestid={`${token.key}-state-editor`}\n\t\t\tdata={data}\n\t\t\tset={() => null}\n\t\t\tisReadonly={() => true}\n\t\t\tpath={metaPath}\n\t\t/>\n\t)\n}\n\nexport const StoreEditor: FC<{\n\ttoken: ReadonlySelectorToken<unknown> | WritableToken<unknown>\n}> = ({ token }) => {\n\tswitch (token.type) {\n\t\tcase `readonly_pure_selector`:\n\t\tcase `readonly_held_selector`:\n\t\t\treturn <ReadonlySelectorViewer token={token} />\n\t\tcase `writable_pure_selector`:\n\t\tcase `writable_held_selector`:\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\t\treturn <StateEditor token={token} />\n\t}\n}\n","import type {\n\tAtomToken,\n\tLoadable,\n\tReadableToken,\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n} from \"atom.io\"\nimport {\n\tactUponStore,\n\tarbitrary,\n\tdisposeFromStore,\n\tfindInStore,\n\tgetFromStore,\n} from \"atom.io/internal\"\nimport type { FamilyNode, WritableTokenIndex } from \"atom.io/introspection\"\nimport { primitiveRefinery } from \"atom.io/introspection\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DEFAULT_JSON_EDITOR_COMPONENTS } from \"./json-editor\"\nimport { StoreEditor } from \"./StateEditor\"\nimport { DevtoolsContext } from \"./store\"\n\n/* eslint-disable no-console */\n\nexport const StateIndexLeafNode: FC<{\n\tnode: ReadableToken<unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: (() => void) | undefined\n}> = ({ node, isOpenState, typeState, dispose }) => {\n\tconst { openCloseAllTX, store } = useContext(DevtoolsContext)\n\n\tconst setIsOpen = useI(isOpenState)\n\tconst isOpen = useO(isOpenState)\n\n\tconst state = useO(node)\n\tconst stateTypeLoadable = useO(typeState)\n\tconst stateType =\n\t\tstateTypeLoadable instanceof Promise ? `Promise` : stateTypeLoadable\n\n\tconst isPrimitive = Boolean(primitiveRefinery.refine(state))\n\n\tconst path = node.family ? [node.family.key, node.family.subKey] : [node.key]\n\n\treturn (\n\t\t<>\n\t\t\t<header>\n\t\t\t\t<main\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tconsole.log(node, getFromStore(store, node))\n\t\t\t\t\t}}\n\t\t\t\t\tonKeyUp={() => {\n\t\t\t\t\t\tconsole.log(node, getFromStore(store, node))\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen && !isPrimitive}\n\t\t\t\t\t\ttestid={`open-close-state-${node.key}`}\n\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\tactUponStore(store, openCloseAllTX, arbitrary())(path, isOpen)\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t\tdisabled={isPrimitive}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{node.family?.subKey ?? node.key}</h2>\n\t\t\t\t\t<span className=\"type detail\">({stateType})</span>\n\t\t\t\t</main>\n\t\t\t\t<footer>\n\t\t\t\t\t{isPrimitive ? (\n\t\t\t\t\t\t<StoreEditor token={node} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"json_viewer\">{JSON.stringify(state)}</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{dispose ? (\n\t\t\t\t\t\t<DEFAULT_JSON_EDITOR_COMPONENTS.Button\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tdispose?.()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttestid={`${node.key}-dispose`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DEFAULT_JSON_EDITOR_COMPONENTS.DeleteIcon />\n\t\t\t\t\t\t</DEFAULT_JSON_EDITOR_COMPONENTS.Button>\n\t\t\t\t\t) : null}\n\t\t\t\t</footer>\n\t\t\t</header>\n\t\t\t{isOpen && !isPrimitive ? (\n\t\t\t\t<main>\n\t\t\t\t\t<StoreEditor token={node} />\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</>\n\t)\n}\nexport const StateIndexTreeNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown>>\n\tisOpenState: RegularAtomToken<boolean>\n}> = ({ node, isOpenState }) => {\n\tconst setIsOpen = useI(isOpenState)\n\tconst isOpen = useO(isOpenState)\n\n\tconst { typeSelectors, viewIsOpenAtoms, openCloseAllTX, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tfor (const [key, childNode] of node.familyMembers) {\n\t\tfindInStore(store, viewIsOpenAtoms, [key])\n\t\tfindInStore(store, typeSelectors, childNode.key)\n\t}\n\treturn (\n\t\t<>\n\t\t\t<header>\n\t\t\t\t<main>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\t\ttestid={`open-close-state-family-${node.key}`}\n\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\tactUponStore(\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\topenCloseAllTX,\n\t\t\t\t\t\t\t\tarbitrary(),\n\t\t\t\t\t\t\t)([node.key], isOpen)\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{node.key}</h2>\n\t\t\t\t\t<span className=\"type detail\"> (family)</span>\n\t\t\t\t</main>\n\t\t\t</header>\n\t\t\t{isOpen\n\t\t\t\t? [...node.familyMembers.entries()].map(([key, childNode]) => (\n\t\t\t\t\t\t<StateIndexNode\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tnode={childNode}\n\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [node.key, key])}\n\t\t\t\t\t\t\ttypeState={findInStore(store, typeSelectors, childNode.key)}\n\t\t\t\t\t\t\tdispose={() => {\n\t\t\t\t\t\t\t\tdisposeFromStore(store, childNode)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))\n\t\t\t\t: null}\n\t\t</>\n\t)\n}\n\nexport const StateIndexNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown>> | ReadableToken<unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: () => void\n}> = ({ node, isOpenState, typeState, dispose }) => {\n\treturn (\n\t\t<section className=\"node state\" data-testid={`state-${node.key}`}>\n\t\t\t{`type` in node ? (\n\t\t\t\t<StateIndexLeafNode\n\t\t\t\t\tnode={node}\n\t\t\t\t\tisOpenState={isOpenState}\n\t\t\t\t\ttypeState={typeState}\n\t\t\t\t\tdispose={dispose}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<StateIndexTreeNode node={node} isOpenState={isOpenState} />\n\t\t\t)}\n\t\t</section>\n\t)\n}\n\nexport const StateIndex: FC<{\n\ttokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown>>>\n}> = ({ tokenIndex }) => {\n\tconst tokenIds = useO(tokenIndex)\n\n\tconst { typeSelectors, viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\tconst statesName = tokenIndex.key.includes(`Atom`) ? `atoms` : `selectors`\n\n\treturn (\n\t\t<article className=\"index state_index\" data-testid=\"state-index\">\n\t\t\t{tokenIds.size === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no {statesName})</p>\n\t\t\t) : (\n\t\t\t\t[...tokenIds.entries()].map(([key, node]) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StateIndexNode\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tnode={node}\n\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [node.key])}\n\t\t\t\t\t\t\ttypeState={findInStore(store, typeSelectors, node.key)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import type {\n\tAtomToken,\n\tAtomUpdateEvent,\n\tTimelineEvent,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport { discoverType, prettyJson } from \"atom.io/introspection\"\nimport { stringifyJson } from \"atom.io/json\"\nimport * as React from \"react\"\n\n/* eslint-disable no-console */\n\nconst AtomUpdateFC: React.FC<{\n\tserialNumber: number\n\tatomUpdate: AtomUpdateEvent<AtomToken<unknown>>\n}> = ({ atomUpdate }) => {\n\treturn (\n\t\t<article\n\t\t\tkey={atomUpdate.token.key}\n\t\t\tclassName=\"node atom_update\"\n\t\t\tonClick={() => {\n\t\t\t\tconsole.log(atomUpdate)\n\t\t\t}}\n\t\t\tonKeyUp={() => {\n\t\t\t\tconsole.log(atomUpdate)\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"detail\">{atomUpdate.token.key}: </span>\n\t\t\t<span>\n\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t{\n\t\t\t\t\t\tprettyJson.diff(\n\t\t\t\t\t\t\tatomUpdate.update.oldValue,\n\t\t\t\t\t\t\tatomUpdate.update.newValue,\n\t\t\t\t\t\t).summary\n\t\t\t\t\t}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t</article>\n\t)\n}\n\nconst TransactionUpdateFC: React.FC<{\n\tserialNumber: number\n\ttransactionUpdate: TransactionOutcomeEvent<TransactionToken<any>>\n}> = ({ serialNumber, transactionUpdate }) => {\n\treturn (\n\t\t<article\n\t\t\tclassName=\"node transaction_update\"\n\t\t\tdata-testid={`transaction-update-${transactionUpdate.token.key}-${serialNumber}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<h4>{serialNumber}</h4>\n\t\t\t</header>\n\t\t\t<main>\n\t\t\t\t<section className=\"transaction_params\">\n\t\t\t\t\t<span className=\"detail\">params: </span>\n\t\t\t\t\t{transactionUpdate.params.map((param, index) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<article\n\t\t\t\t\t\t\t\tkey={`param` + index}\n\t\t\t\t\t\t\t\tclassName=\"node transaction_param\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tconsole.log(transactionUpdate)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyUp={() => {\n\t\t\t\t\t\t\t\t\tconsole.log(transactionUpdate)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"detail\">{discoverType(param)}: </span>\n\t\t\t\t\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t\t\t\t\t{typeof param === `object` &&\n\t\t\t\t\t\t\t\t\tparam !== null &&\n\t\t\t\t\t\t\t\t\t`type` in param &&\n\t\t\t\t\t\t\t\t\t`target` in param\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify(param.type)\n\t\t\t\t\t\t\t\t\t\t: JSON.stringify(param)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</article>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</section>\n\t\t\t\t<section className=\"node transaction_output\">\n\t\t\t\t\t<span className=\"detail\">output: </span>\n\t\t\t\t\t<span className=\"detail\">\n\t\t\t\t\t\t{discoverType(transactionUpdate.output)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{transactionUpdate.output ? (\n\t\t\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t\t\t: {JSON.stringify(transactionUpdate.output)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</section>\n\t\t\t\t<section className=\"transaction_impact\">\n\t\t\t\t\t<span className=\"detail\">impact: </span>\n\t\t\t\t\t{transactionUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(txSubEvent) =>\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_creation` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_disposal` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_transfer` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `state_creation` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `state_disposal` &&\n\t\t\t\t\t\t\t\t!txSubEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((update, index) => {\n\t\t\t\t\t\t\tswitch (update.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${transactionUpdate.token.key}:${index}:${update.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={update}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `transaction_outcome`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<TransactionUpdateFC\n\t\t\t\t\t\t\t\t\t\t\tkey={`${transactionUpdate.token.key}:${index}:${update.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\ttransactionUpdate={update}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `molecule_creation`:\n\t\t\t\t\t\t\t\tcase `molecule_disposal`:\n\t\t\t\t\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\tcase `state_disposal`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})}\n\t\t\t\t</section>\n\t\t\t</main>\n\t\t</article>\n\t)\n}\n\nexport const TimelineUpdateFC: React.FC<{\n\ttimelineUpdate: TimelineEvent<any>\n\tserialNumber: number\n}> = ({ timelineUpdate, serialNumber }) => {\n\treturn timelineUpdate.type === `atom_update` ||\n\t\ttimelineUpdate.type === `selector_update` ||\n\t\ttimelineUpdate.type === `transaction_outcome` ? (\n\t\t<article\n\t\t\tclassName=\"node timeline_update\"\n\t\t\tdata-testid={`timeline-update-${typeof timelineUpdate.token.key === `string` ? timelineUpdate.token.key : stringifyJson(timelineUpdate.token.key)}-${serialNumber}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<h4>\n\t\t\t\t\t{timelineUpdate.timestamp}: {timelineUpdate.type} (\n\t\t\t\t\t{timelineUpdate.token.key})\n\t\t\t\t</h4>\n\t\t\t</header>\n\t\t\t<main>\n\t\t\t\t{timelineUpdate.type === `transaction_outcome` ? (\n\t\t\t\t\ttimelineUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(subEvent) =>\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_creation` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_disposal` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_transfer` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `state_creation` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `state_disposal` &&\n\t\t\t\t\t\t\t\t!subEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((subEvent, index) => {\n\t\t\t\t\t\t\tswitch (subEvent.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${subEvent.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={subEvent}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `transaction_outcome`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<TransactionUpdateFC\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${subEvent.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\ttransactionUpdate={subEvent}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `molecule_creation`:\n\t\t\t\t\t\t\t\tcase `molecule_disposal`:\n\t\t\t\t\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\tcase `state_disposal`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t) : timelineUpdate.type === `selector_update` ? (\n\t\t\t\t\ttimelineUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(atomUpdateEvent) => !atomUpdateEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((event, index) => {\n\t\t\t\t\t\t\tswitch (event.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${event.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={event}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t) : timelineUpdate.type === `atom_update` ? (\n\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\tserialNumber={timelineUpdate.timestamp}\n\t\t\t\t\t\tatomUpdate={timelineUpdate}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</main>\n\t\t</article>\n\t) : null\n}\n\nexport const article: {\n\tAtomUpdate: typeof AtomUpdateFC\n\tTransactionUpdate: typeof TransactionUpdateFC\n\tTimelineUpdate: typeof TimelineUpdateFC\n} = {\n\tAtomUpdate: AtomUpdateFC,\n\tTransactionUpdate: TransactionUpdateFC,\n\tTimelineUpdate: TimelineUpdateFC,\n}\n","import type {\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n\tTimelineToken,\n} from \"atom.io\"\nimport { redo, undo } from \"atom.io\"\nimport { findInStore, type Timeline } from \"atom.io/internal\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, Fragment, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DevtoolsContext } from \"./store\"\nimport { article } from \"./Updates\"\n\nexport const YouAreHere: FC = () => {\n\treturn <span className=\"you_are_here\">you are here</span>\n}\n\nexport const TimelineLog: FC<{\n\ttoken: TimelineToken<any>\n\tisOpenState: RegularAtomToken<boolean>\n\ttimelineState: ReadonlyPureSelectorToken<Timeline<any>>\n}> = ({ token, isOpenState, timelineState }) => {\n\tconst timeline = useO(timelineState)\n\tconst isOpen = useO(isOpenState)\n\tconst setIsOpen = useI(isOpenState)\n\n\treturn (\n\t\t<section className=\"node timeline_log\" data-testid={`timeline-${token.key}`}>\n\t\t\t<header>\n\t\t\t\t<button.OpenClose\n\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\ttestid={`open-close-timeline-${token.key}`}\n\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t/>\n\t\t\t\t<main>\n\t\t\t\t\t<h2>{token.key}</h2>\n\t\t\t\t\t<span className=\"detail length\">\n\t\t\t\t\t\t({timeline.at}/{timeline.history.length})\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"gap\" />\n\t\t\t\t\t<nav>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tundo(token)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={timeline.at === 0}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tundo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tredo(token)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={timeline.at === timeline.history.length}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tredo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</nav>\n\t\t\t\t</main>\n\t\t\t</header>\n\t\t\t{isOpen ? (\n\t\t\t\t<main>\n\t\t\t\t\t{timeline.history.map((update, index) =>\n\t\t\t\t\t\tupdate.type !== `molecule_creation` &&\n\t\t\t\t\t\tupdate.type !== `molecule_disposal` &&\n\t\t\t\t\t\tupdate.type !== `state_creation` &&\n\t\t\t\t\t\tupdate.type !== `state_disposal` ? (\n\t\t\t\t\t\t\t<Fragment key={update.token.key + index + timeline.at}>\n\t\t\t\t\t\t\t\t{index === timeline.at ? <YouAreHere /> : null}\n\t\t\t\t\t\t\t\t<article.TimelineUpdate\n\t\t\t\t\t\t\t\t\ttimelineUpdate={update}\n\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{index === timeline.history.length - 1 &&\n\t\t\t\t\t\t\t\ttimeline.at === timeline.history.length ? (\n\t\t\t\t\t\t\t\t\t<YouAreHere />\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t)}\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</section>\n\t)\n}\n\nexport const TimelineIndex: FC = () => {\n\tconst { timelineIndex, timelineSelectors, viewIsOpenAtoms, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tconst tokenIds = useO(timelineIndex)\n\n\treturn (\n\t\t<article className=\"index timeline_index\" data-testid=\"timeline-index\">\n\t\t\t{tokenIds.length === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no timelines)</p>\n\t\t\t) : (\n\t\t\t\ttokenIds\n\t\t\t\t\t.filter((token) => !token.key.startsWith(`šāšØ`))\n\t\t\t\t\t.map((token) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TimelineLog\n\t\t\t\t\t\t\t\tkey={token.key}\n\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}\n\t\t\t\t\t\t\t\ttimelineState={findInStore(store, timelineSelectors, token.key)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import type {\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport { findInStore, type Fn } from \"atom.io/internal\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DevtoolsContext } from \"./store\"\nimport { article } from \"./Updates\"\n\nexport const TransactionLog: FC<{\n\ttoken: TransactionToken<Fn>\n\tisOpenState: RegularAtomToken<boolean>\n\tlogState: ReadonlyPureSelectorToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[]\n\t>\n}> = ({ token, isOpenState, logState }) => {\n\tconst log = useO(logState)\n\tconst isOpen = useO(isOpenState)\n\tconst setIsOpen = useI(isOpenState)\n\n\treturn (\n\t\t<section\n\t\t\tclassName=\"node transaction_log\"\n\t\t\tdata-testid={`transaction-${token.key}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<main>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\t\ttestid={`open-close-transaction-${token.key}`}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{token.key}</h2>\n\t\t\t\t</main>\n\t\t\t\t<span className=\"detail length\">({log.length})</span>\n\t\t\t</header>\n\t\t\t{isOpen ? (\n\t\t\t\t<main>\n\t\t\t\t\t{log.map((update, index) => (\n\t\t\t\t\t\t<article.TransactionUpdate\n\t\t\t\t\t\t\tkey={update.token.key + index}\n\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\ttransactionUpdate={update}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</section>\n\t)\n}\n\nexport const TransactionIndex: FC = () => {\n\tconst { transactionIndex, transactionLogSelectors, viewIsOpenAtoms, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tconst tokenIds = useO(transactionIndex)\n\treturn (\n\t\t<article className=\"index transaction_index\" data-testid=\"transaction-index\">\n\t\t\t{tokenIds.length === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no transactions)</p>\n\t\t\t) : (\n\t\t\t\ttokenIds\n\t\t\t\t\t.filter((token) => !token.key.startsWith(`š`))\n\t\t\t\t\t.map((token) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TransactionLog\n\t\t\t\t\t\t\t\tkey={token.key}\n\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}\n\t\t\t\t\t\t\t\tlogState={findInStore(store, transactionLogSelectors, token.key)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import \"./devtools.css\"\n\nimport { StoreContext, useI, useO } from \"atom.io/react\"\nimport { LayoutGroup, motion } from \"motion/react\"\nimport { useContext, useRef } from \"react\"\n\nimport { StateIndex } from \"./StateIndex\"\nimport { attachDevtoolsStates, DevtoolsContext } from \"./store\"\nimport { TimelineIndex } from \"./TimelineIndex\"\nimport { TransactionIndex } from \"./TransactionIndex\"\n\nexport const AtomIODevtools: React.FC<{ hideByDefault?: boolean }> = ({\n\thideByDefault = false,\n}) => {\n\tconst store = useContext(StoreContext)\n\treturn (\n\t\t<DevtoolsContext.Provider value={attachDevtoolsStates(store, hideByDefault)}>\n\t\t\t<AtomIODevtoolsInternal />\n\t\t</DevtoolsContext.Provider>\n\t)\n}\n\nconst AtomIODevtoolsInternal = (): React.ReactNode => {\n\tconst constraintsRef = useRef(null)\n\n\tconst {\n\t\tatomIndex,\n\t\tselectorIndex,\n\t\tdevtoolsAreHiddenAtom,\n\t\tdevtoolsAreOpenAtom,\n\t\tdevtoolsViewSelectionAtom,\n\t\tdevtoolsViewOptionsAtom,\n\t} = useContext(DevtoolsContext)\n\n\tconst devtoolsAreHidden = useO(devtoolsAreHiddenAtom)\n\n\tconst setDevtoolsAreOpen = useI(devtoolsAreOpenAtom)\n\tconst devtoolsAreOpen = useO(devtoolsAreOpenAtom)\n\tconst setDevtoolsView = useI(devtoolsViewSelectionAtom)\n\tconst devtoolsView = useO(devtoolsViewSelectionAtom)\n\tconst devtoolsViewOptions = useO(devtoolsViewOptionsAtom)\n\n\tconst mouseHasMoved = useRef(false)\n\n\treturn (\n\t\t<span\n\t\t\tstyle={{\n\t\t\t\tposition: `fixed`,\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tpointerEvents: `none`,\n\t\t\t}}\n\t\t>\n\t\t\t<motion.span\n\t\t\t\tref={constraintsRef}\n\t\t\t\tdata-css=\"atom_io_devtools_zone\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: `fixed`,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpointerEvents: `none`,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{devtoolsAreHidden ? null : (\n\t\t\t\t<motion.main\n\t\t\t\t\tdrag\n\t\t\t\t\tdragConstraints={constraintsRef}\n\t\t\t\t\tdata-css=\"atom_io_devtools\"\n\t\t\t\t\tdata-testid=\"devtools\"\n\t\t\t\t\ttransition={{ type: `spring`, bounce: 0.25 }}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\tdevtoolsAreOpen\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tbackgroundColor: `#0000`,\n\t\t\t\t\t\t\t\t\tborderColor: `#0000`,\n\t\t\t\t\t\t\t\t\tmaxHeight: 28,\n\t\t\t\t\t\t\t\t\tmaxWidth: 33,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{devtoolsAreOpen ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<motion.header>\n\t\t\t\t\t\t\t\t<h1>atom.io</h1>\n\t\t\t\t\t\t\t\t<nav>\n\t\t\t\t\t\t\t\t\t{devtoolsViewOptions.map((viewOption) => (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={viewOption}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid={`view-${viewOption}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={viewOption === devtoolsView ? `active` : ``}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetDevtoolsView(viewOption)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={viewOption === devtoolsView}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{viewOption}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</nav>\n\t\t\t\t\t\t\t</motion.header>\n\t\t\t\t\t\t\t<motion.main>\n\t\t\t\t\t\t\t\t<LayoutGroup>\n\t\t\t\t\t\t\t\t\t{devtoolsView === `atoms` ? (\n\t\t\t\t\t\t\t\t\t\t<StateIndex tokenIndex={atomIndex} />\n\t\t\t\t\t\t\t\t\t) : devtoolsView === `selectors` ? (\n\t\t\t\t\t\t\t\t\t\t<StateIndex tokenIndex={selectorIndex} />\n\t\t\t\t\t\t\t\t\t) : devtoolsView === `transactions` ? (\n\t\t\t\t\t\t\t\t\t\t<TransactionIndex />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<TimelineIndex />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</LayoutGroup>\n\t\t\t\t\t\t\t</motion.main>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<footer>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonMouseDown={() => (mouseHasMoved.current = false)}\n\t\t\t\t\t\t\tonMouseMove={() => (mouseHasMoved.current = true)}\n\t\t\t\t\t\t\tonMouseUp={() => {\n\t\t\t\t\t\t\t\tif (!mouseHasMoved.current) {\n\t\t\t\t\t\t\t\t\tsetDevtoolsAreOpen((open) => !open)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tš\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</footer>\n\t\t\t\t</motion.main>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["OpenClose: FC<{\n\tisOpen: boolean\n\tsetIsOpen?:\n\t\t| ((next: boolean | ((prev: boolean) => boolean)) => void)\n\t\t| undefined\n\tonShiftClick?: (\n\t\tevent: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n\t) => boolean\n\tdisabled?: boolean\n\ttestid: string\n}>","button: {\n\tOpenClose: typeof OpenClose\n}","DefaultFallback: FC<FallbackProps>","DEFAULT_JSON_EDITOR_COMPONENTS: JsonEditorComponents","openCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>","states:\n\t\t\t\t| WritableTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| WritableTokenIndex<SelectorToken<unknown, any, any>>","value: unknown","segments: (number | string)[]","DevtoolsContext: Context<\n\tDevtoolsStates & IntrospectionStates & { store: Store }\n>","ElasticInput: ForwardRefExoticComponent<\n\tDetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> & {\n\t\twidthPadding?: number\n\t}\n>","VALID_NON_NUMBER_INTERPRETATIONS: Readonly<\n\tRecord<ValidNonNumber, number | null>\n>","DEFAULT_NUMBER_CONSTRAINTS: NumberConstraints","NumberInput: FC<NumberInputProps>","TextInput: FC<TextInputProps>","NonJsonEditor: React.FC<JsonEditorProps<never>>","next: T","SubEditors: Record<\n\tkeyof JsonTypes,\n\tFC<JsonEditorProps_INTERNAL<any>>\n>","StateEditor: FC<{\n\ttoken: WritableToken<unknown, any, unknown>\n}>","ReadonlySelectorViewer: FC<{\n\ttoken: ReadonlySelectorToken<unknown, any, unknown>\n}>","StoreEditor: FC<{\n\ttoken:\n\t\t| ReadonlySelectorToken<unknown, any, unknown>\n\t\t| WritableToken<unknown, any, unknown>\n}>","StateIndexLeafNode: FC<{\n\tnode: ReadableToken<unknown, any, unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: (() => void) | undefined\n}>","StateIndexTreeNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown, any, unknown>>\n\tisOpenState: RegularAtomToken<boolean>\n}>","StateIndexNode: FC<{\n\tnode:\n\t\t| FamilyNode<ReadableToken<unknown, any, unknown>>\n\t\t| ReadableToken<unknown, any, unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: () => void\n}>","StateIndex: FC<{\n\ttokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown, any, unknown>>>\n}>","AtomUpdateFC: React.FC<{\n\tserialNumber: number\n\tatomUpdate: AtomUpdateEvent<AtomToken<unknown, any, any>>\n}>","TransactionUpdateFC: React.FC<{\n\tserialNumber: number\n\ttransactionUpdate: TransactionOutcomeEvent<TransactionToken<any>>\n}>","TimelineUpdateFC: React.FC<{\n\ttimelineUpdate: TimelineEvent<any>\n\tserialNumber: number\n}>","article: {\n\tAtomUpdate: typeof AtomUpdateFC\n\tTransactionUpdate: typeof TransactionUpdateFC\n\tTimelineUpdate: typeof TimelineUpdateFC\n}","YouAreHere: FC","TimelineLog: FC<{\n\ttoken: TimelineToken<any>\n\tisOpenState: RegularAtomToken<boolean>\n\ttimelineState: ReadonlyPureSelectorToken<Timeline<any>>\n}>","TimelineIndex: FC","TransactionLog: FC<{\n\ttoken: TransactionToken<Fn>\n\tisOpenState: RegularAtomToken<boolean>\n\tlogState: ReadonlyPureSelectorToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[]\n\t>\n}>","TransactionIndex: FC","AtomIODevtools: React.FC<{ hideByDefault?: boolean }>"],"sources":["../../src/react-devtools/Button.tsx","../../src/react-devtools/error-boundary/DefaultFallback.tsx","../../src/react-devtools/error-boundary/ReactErrorBoundary.tsx","../../src/react-devtools/json-editor/default-components.tsx","../../src/react-devtools/store.ts","../../src/react-devtools/elastic-input/ElasticInput.tsx","../../src/react-devtools/elastic-input/NumberInput.tsx","../../src/react-devtools/elastic-input/TextInput.tsx","../../src/react-devtools/json-editor/editors-by-type/non-json.tsx","../../src/react-devtools/json-editor/json-editor-internal.tsx","../../src/react-devtools/json-editor/editors-by-type/utilities/array-elements.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/cast-json.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/cast-to-json.ts","../../src/react-devtools/json-editor/editors-by-type/utilities/object-properties.ts","../../src/react-devtools/json-editor/editors-by-type/array-editor.tsx","../../src/react-devtools/json-editor/editors-by-type/object-editor.tsx","../../src/react-devtools/json-editor/editors-by-type/primitive-editors.tsx","../../src/react-devtools/json-editor/developer-interface.tsx","../../src/react-devtools/StateEditor.tsx","../../src/react-devtools/StateIndex.tsx","../../src/react-devtools/Updates.tsx","../../src/react-devtools/TimelineIndex.tsx","../../src/react-devtools/TransactionIndex.tsx","../../src/react-devtools/AtomIODevtools.tsx"],"sourcesContent":["import type { FC } from \"react\"\n\nexport const OpenClose: FC<{\n\tisOpen: boolean\n\tsetIsOpen?:\n\t\t| ((next: boolean | ((prev: boolean) => boolean)) => void)\n\t\t| undefined\n\tonShiftClick?: (\n\t\tevent: React.MouseEvent<HTMLButtonElement, MouseEvent>,\n\t) => boolean\n\tdisabled?: boolean\n\ttestid: string\n}> = ({ isOpen, setIsOpen, onShiftClick, disabled, testid }) => {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-testid={testid}\n\t\t\tclassName={`carat ${isOpen ? `open` : `closed`}`}\n\t\t\tonClick={(event) => {\n\t\t\t\tif (onShiftClick && event.shiftKey) {\n\t\t\t\t\tif (!onShiftClick(event)) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetIsOpen?.((prev) => !prev)\n\t\t\t}}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t<span className=\"json_editor_icon json_editor_carat\">ā¶</span>\n\t\t</button>\n\t)\n}\n\nexport const button: {\n\tOpenClose: typeof OpenClose\n} = {\n\tOpenClose,\n}\n","import type { ErrorInfo, FC } from \"react\"\n\nexport type FallbackProps = {\n\terror?: Error | string | undefined\n\terrorInfo?: ErrorInfo | undefined\n}\n\nexport const DefaultFallback: FC<FallbackProps> = ({ error, errorInfo }) => {\n\tconst component = errorInfo?.componentStack?.split(` `).filter(Boolean)[2]\n\tconst message =\n\t\terror?.toString() ?? errorInfo?.componentStack ?? `Unknown error`\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"error-boundary\"\n\t\t\tstyle={{\n\t\t\t\tflex: `1`,\n\t\t\t\tbackground: `black`,\n\t\t\t\tbackgroundImage: `url(./src/assets/kablooey.gif)`,\n\t\t\t\tbackgroundPosition: `center`,\n\t\t\t\t// backgroundRepeat: `no-repeat`,\n\t\t\t\tbackgroundSize: `overlay`,\n\t\t\t}}\n\t\t>\n\t\t\t{/* <img src=\"./src/assets/kablooey.gif\" alt=\"error\" /> */}\n\t\t\t<div\n\t\t\t\tstyle={{\n\t\t\t\t\tmargin: `50px`,\n\t\t\t\t\tmarginTop: `0`,\n\t\t\t\t\tpadding: `50px`,\n\t\t\t\t\tborder: `1px solid dashed`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: `black`,\n\t\t\t\t\t\tcolor: `white`,\n\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\tpaddingTop: 5,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{`ā ļø `}\n\t\t\t\t\t<span style={{ color: `#fc0`, fontWeight: 700 }}>{component}</span>\n\t\t\t\t\t{` ā ļø `}\n\t\t\t\t\t{message}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import type { ErrorInfo, FC, ReactNode } from \"react\"\nimport { Component } from \"react\"\n\nimport type { FallbackProps } from \"./DefaultFallback\"\nimport { DefaultFallback } from \"./DefaultFallback\"\n\nexport type ErrorBoundaryState = {\n\terror?: Error | string\n\terrorInfo?: ErrorInfo\n}\n\nexport type ErrorBoundaryProps = {\n\tchildren: ReactNode\n\tonError?: ((error: Error | string, errorInfo: ErrorInfo) => void) | undefined\n\tFallback?: FC<FallbackProps> | undefined\n\tresetErrorState?: () => void\n\tuseErrorState?: () => [\n\t\tErrorBoundaryState,\n\t\t(\n\t\t\tnewState:\n\t\t\t\t| ErrorBoundaryState\n\t\t\t\t| ((currState: ErrorBoundaryState) => ErrorBoundaryState),\n\t\t) => void,\n\t]\n}\n\nexport class ErrorBoundary extends Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tpublic constructor(props: ErrorBoundaryProps) {\n\t\tsuper(props)\n\t\tthis.state = {}\n\t\t// We can filter or add information\n\t\t// to airbrake notifications here:\n\t}\n\n\tpublic override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n\t\tthis.props.onError?.(error, errorInfo)\n\t\tthis.setState({\n\t\t\terror,\n\t\t\terrorInfo,\n\t\t})\n\t}\n\n\tpublic override render(): ReactNode {\n\t\tconst { error, errorInfo } = this.state\n\t\tconst { children, Fallback = DefaultFallback } = this.props\n\n\t\treturn errorInfo ? (\n\t\t\t<Fallback error={error} errorInfo={errorInfo} />\n\t\t) : (\n\t\t\tchildren\n\t\t)\n\t}\n}\n","import type { CSSProperties, FC, ReactNode } from \"react\"\n\nimport { ErrorBoundary } from \"../error-boundary\"\n\nexport type Dict<T> = Record<string, T>\n\nexport type WrapperComponent<T extends Dict<unknown> = Dict<unknown>> = FC<\n\tT & { children: ReactNode; testid?: string | undefined }\n>\n\nexport type WC<T extends Dict<unknown> = Dict<unknown>> = WrapperComponent<T>\n\nexport type JsonEditorComponents = {\n\tErrorBoundary: WC\n\n\tButton: WC<{\n\t\tonClick?: () => void\n\t\tdisabled?: boolean\n\t}>\n\tDeleteIcon: FC\n\tAddIcon: FC\n\n\tEditorWrapper: WC<{\n\t\tstyle?: CSSProperties | undefined\n\t\tclassName?: string | undefined\n\t\ttestid?: string | undefined\n\t}>\n\n\tArrayWrapper: WC\n\tObjectWrapper: WC\n\tStringWrapper: WC\n\tNumberWrapper: WC\n\tBooleanWrapper: WC\n\tNull: FC<{ testid?: string | undefined }>\n\n\tMissingPropertyWrapper: WC\n\tKeyWrapper: WC\n}\n\nexport const DEFAULT_JSON_EDITOR_COMPONENTS: JsonEditorComponents = {\n\tErrorBoundary: ({ children }) => <ErrorBoundary>{children}</ErrorBoundary>,\n\tButton: ({ onClick, children, disabled, testid }) => (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"json_editor_button\"\n\t\t\tonClick={onClick}\n\t\t\tdisabled={disabled}\n\t\t\tdata-testid={testid}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t),\n\tEditorWrapper: ({ children, className, testid }) => (\n\t\t<div\n\t\t\tclassName={`json_editor` + (className ? ` ${className}` : ``)}\n\t\t\tdata-testid={testid}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tArrayWrapper: ({ children, testid }) => (\n\t\t<div className=\"json_editor_array\" data-testid={testid}>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tObjectWrapper: ({ children, testid }) => (\n\t\t<div className=\"json_editor_object\" data-testid={testid}>\n\t\t\t{children}\n\t\t</div>\n\t),\n\tStringWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_string\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tNumberWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_number\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tBooleanWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_boolean\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tNull: ({ testid }) => (\n\t\t<span className=\"json_editor_null\" data-testid={testid} />\n\t),\n\tDeleteIcon: () => (\n\t\t<span className=\"json_editor_icon json_editor_delete\">Ć</span>\n\t),\n\t// big plus\n\tAddIcon: () => <span className=\"json_editor_icon json_editor_add\">ļ¼</span>,\n\tMissingPropertyWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_missing_property\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n\tKeyWrapper: ({ children, testid }) => (\n\t\t<span className=\"json_editor_key\" data-testid={testid}>\n\t\t\t{children}\n\t\t</span>\n\t),\n}\n","import type {\n\tAtomToken,\n\tRegularAtomFamilyToken,\n\tRegularAtomToken,\n\tSelectorToken,\n\tTransactionToken,\n} from \"atom.io\"\nimport type { RootStore, Store } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtom,\n\tcreateRegularAtomFamily,\n\tcreateTransaction,\n} from \"atom.io/internal\"\nimport type {\n\tIntrospectionStates,\n\tWritableTokenIndex,\n} from \"atom.io/introspection\"\nimport { attachIntrospectionStates, isPlainObject } from \"atom.io/introspection\"\nimport { persistSync } from \"atom.io/web\"\nimport type { Context } from \"react\"\nimport { createContext } from \"react\"\n\ntype DevtoolsView = `atoms` | `selectors` | `timelines` | `transactions`\n\nexport type DevtoolsStates = {\n\tdevtoolsAreHiddenAtom: RegularAtomToken<boolean>\n\tdevtoolsAreOpenAtom: RegularAtomToken<boolean>\n\tdevtoolsViewSelectionAtom: RegularAtomToken<DevtoolsView>\n\tdevtoolsViewOptionsAtom: RegularAtomToken<DevtoolsView[]>\n\tviewIsOpenAtoms: RegularAtomFamilyToken<boolean, readonly (number | string)[]>\n\topenCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>\n}\n\nexport function attachDevtoolsStates(\n\tstore: RootStore,\n\thideByDefault = false,\n): DevtoolsStates & IntrospectionStates & { store: Store } {\n\tconst introspectionStates = attachIntrospectionStates(store)\n\n\tconst devtoolsAreHiddenAtom = createRegularAtom<boolean, never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools Are Hidden`,\n\t\t\tdefault: hideByDefault,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [\n\t\t\t\t\t\t\tpersistSync(window.localStorage, JSON, `š Devtools Are Hidden`),\n\t\t\t\t\t\t\t({ setSelf }) => {\n\t\t\t\t\t\t\t\twindow.addEventListener(`keydown`, (e) => {\n\t\t\t\t\t\t\t\t\tif (e.ctrlKey && e.shiftKey && e.key.toLowerCase() === `a`) {\n\t\t\t\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\t\t\t\tsetSelf((state) => !state)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsAreOpenAtom = createRegularAtom<boolean, never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools Are Open`,\n\t\t\tdefault: true,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools Are Open`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsViewSelectionAtom = createRegularAtom<\n\t\tDevtoolsView,\n\t\tnever,\n\t\tnever\n\t>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools View Selection`,\n\t\t\tdefault: `atoms`,\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools View`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst devtoolsViewOptionsAtom = createRegularAtom<\n\t\tDevtoolsView[],\n\t\tnever,\n\t\tnever\n\t>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `š Devtools View Options`,\n\t\t\tdefault: [`atoms`, `selectors`, `transactions`, `timelines`],\n\t\t\teffects:\n\t\t\t\ttypeof window === `undefined`\n\t\t\t\t\t? []\n\t\t\t\t\t: [persistSync(window.localStorage, JSON, `š Devtools View Options`)],\n\t\t},\n\t\tundefined,\n\t)\n\n\tconst viewIsOpenAtoms = createRegularAtomFamily<\n\t\tboolean,\n\t\treadonly (number | string)[],\n\t\tnever\n\t>(store, {\n\t\tkey: `š Devtools View Is Open`,\n\t\tdefault: false,\n\t\teffects: (key) =>\n\t\t\ttypeof window === `undefined`\n\t\t\t\t? []\n\t\t\t\t: [persistSync(window.localStorage, JSON, `view-is-open:${key.join()}`)],\n\t})\n\n\tconst openCloseAllTX: TransactionToken<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t> = createTransaction<\n\t\t(path: readonly (number | string)[], current?: boolean) => void\n\t>(store, {\n\t\tkey: `š Open Close All`,\n\t\tdo: ({ get, set }, path, current) => {\n\t\t\tconst currentView = get(devtoolsViewSelectionAtom)\n\t\t\tlet states:\n\t\t\t\t| WritableTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| WritableTokenIndex<SelectorToken<unknown, any, any>>\n\t\t\tswitch (currentView) {\n\t\t\t\tcase `atoms`:\n\t\t\t\t\tstates = get(introspectionStates.atomIndex)\n\t\t\t\t\tbreak\n\t\t\t\tcase `selectors`:\n\t\t\t\t\tstates = get(introspectionStates.selectorIndex)\n\t\t\t\t\tbreak\n\t\t\t\tcase `transactions`:\n\t\t\t\tcase `timelines`:\n\t\t\t\t\treturn\n\t\t\t}\n\n\t\t\tswitch (path.length) {\n\t\t\t\tcase 1:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (const [key] of states) {\n\t\t\t\t\t\t\tset(viewIsOpenAtoms, [key], !current)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tdefault: {\n\t\t\t\t\tconst item = states.get(path[0] as string)\n\t\t\t\t\tlet value: unknown\n\t\t\t\t\tlet segments: (number | string)[]\n\t\t\t\t\tif (item) {\n\t\t\t\t\t\tif (`familyMembers` in item) {\n\t\t\t\t\t\t\tif (path.length === 2) {\n\t\t\t\t\t\t\t\tfor (const [subKey] of item.familyMembers) {\n\t\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [path[0], subKey], !current)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: fine here\n\t\t\t\t\t\t\tconst token = item.familyMembers.get(path[1] as string)!\n\t\t\t\t\t\t\tvalue = get(token)\n\t\t\t\t\t\t\tsegments = path.slice(2, -1)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue = get(item)\n\t\t\t\t\t\t\tsegments = path.slice(1, -1)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const segment of segments) {\n\t\t\t\t\t\t\tif (value && typeof value === `object`) {\n\t\t\t\t\t\t\t\tvalue = value[segment as keyof typeof value]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst head = path.slice(0, -1)\n\t\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [...head, i], !current)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (isPlainObject(value)) {\n\t\t\t\t\t\t\t\tfor (const key of Object.keys(value)) {\n\t\t\t\t\t\t\t\t\tset(viewIsOpenAtoms, [...head, key], !current)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t})\n\n\treturn {\n\t\t...introspectionStates,\n\t\tdevtoolsAreHiddenAtom,\n\t\tdevtoolsAreOpenAtom,\n\t\tdevtoolsViewSelectionAtom,\n\t\tdevtoolsViewOptionsAtom,\n\t\tviewIsOpenAtoms,\n\t\topenCloseAllTX,\n\t\tstore,\n\t}\n}\n\nexport const DevtoolsContext: Context<\n\tDevtoolsStates & IntrospectionStates & { store: Store }\n> = createContext({})\n","import type {\n\tDetailedHTMLProps,\n\tForwardRefExoticComponent,\n\tInputHTMLAttributes,\n} from \"react\"\nimport {\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\n\nexport type ElasticInputProps = DetailedHTMLProps<\n\tInputHTMLAttributes<HTMLInputElement>,\n\tHTMLInputElement\n> & {\n\twidthPadding?: number\n}\n\nexport const ElasticInput: ForwardRefExoticComponent<\n\tDetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> & {\n\t\twidthPadding?: number\n\t}\n> = forwardRef(function ElasticInputFC(props, ref) {\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\tconst spanRef = useRef<HTMLSpanElement>(null)\n\tconst [inputWidth, setInputWidth] = useState(`auto`)\n\n\tuseImperativeHandle<Partial<HTMLInputElement>, Partial<HTMLInputElement>>(\n\t\tref,\n\t\t() => ({\n\t\t\tfocus: () => {\n\t\t\t\tinputRef.current?.focus()\n\t\t\t},\n\t\t}),\n\t)\n\n\tconst extraWidth = props.type === `number` ? 15 : 0\n\n\tuseLayoutEffect(() => {\n\t\tif (spanRef.current) {\n\t\t\tsetInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`)\n\t\t\tconst interval = setInterval(() => {\n\t\t\t\tif (spanRef.current) {\n\t\t\t\t\tsetInputWidth(`${spanRef.current.offsetWidth + extraWidth}px`)\n\t\t\t\t}\n\t\t\t}, 1000)\n\t\t\treturn () => {\n\t\t\t\tclearInterval(interval)\n\t\t\t}\n\t\t}\n\t}, [inputRef.current?.value, props.value])\n\n\treturn (\n\t\t<div style={{ display: `inline-block`, position: `relative` }}>\n\t\t\t<input\n\t\t\t\t{...props}\n\t\t\t\tref={inputRef}\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborderRadius: 0,\n\t\t\t\t\tborder: `none`,\n\t\t\t\t\tfontFamily: `inherit`,\n\t\t\t\t\tfontSize: `inherit`,\n\t\t\t\t\twidth: inputWidth,\n\t\t\t\t\t...props.style,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t<span\n\t\t\t\tref={spanRef}\n\t\t\t\tstyle={{\n\t\t\t\t\tpadding: props.style?.padding,\n\t\t\t\t\tposition: `absolute`,\n\t\t\t\t\tvisibility: `hidden`,\n\t\t\t\t\t// color: `red`,\n\t\t\t\t\twhiteSpace: `pre`,\n\t\t\t\t\tfontFamily: props.style?.fontFamily ?? `inherit`,\n\t\t\t\t\tfontSize: props.style?.fontSize ?? `inherit`,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{props.value}\n\t\t\t</span>\n\t\t</div>\n\t)\n})\n","import type { FC } from \"react\"\nimport { useId, useRef, useState } from \"react\"\n\nimport { ElasticInput } from \".\"\n\nexport function clampInto(min: number, max: number) {\n\treturn (value: number): number =>\n\t\tvalue < min ? min : value > max ? max : value\n}\nfunction round(value: number, decimalPlaces?: number): number {\n\tif (decimalPlaces === undefined) return value\n\tconst factor = 10 ** decimalPlaces\n\treturn Math.round(value * factor) / factor\n}\nfunction _roundAndPad(value: number, decimalPlaces?: number): string {\n\tconst roundedValue = round(value, decimalPlaces)\n\tconst paddedString = roundedValue.toFixed(decimalPlaces)\n\treturn paddedString\n}\n\nexport const VALID_NON_NUMBERS = [``, `-`, `.`, `-.`] as const\nexport type ValidNonNumber = (typeof VALID_NON_NUMBERS)[number]\nexport const isValidNonNumber = (input: string): input is ValidNonNumber =>\n\tVALID_NON_NUMBERS.includes(input as ValidNonNumber)\nexport const VALID_NON_NUMBER_INTERPRETATIONS: Readonly<\n\tRecord<ValidNonNumber, number | null>\n> = {\n\t\"\": null,\n\t\"-\": 0,\n\t\".\": 0,\n\t\"-.\": 0,\n} as const\nexport type DecimalInProgress = `${number | ``}.${number}`\nexport const isDecimalInProgress = (input: string): input is DecimalInProgress =>\n\tinput === `0` || (!Number.isNaN(Number(input)) && input.includes(`.`))\n\nconst textToValue = (input: string, allowDecimal: boolean): number | null => {\n\tif (isValidNonNumber(input)) return VALID_NON_NUMBER_INTERPRETATIONS[input]\n\treturn allowDecimal\n\t\t? Number.parseFloat(input)\n\t\t: Math.round(Number.parseFloat(input))\n}\n\nexport type NumberConstraints = {\n\tmax: number\n\tmin: number\n\tdecimalPlaces: number\n\tnullable: boolean\n}\nexport const DEFAULT_NUMBER_CONSTRAINTS: NumberConstraints = {\n\tmax: Number.POSITIVE_INFINITY,\n\tmin: Number.NEGATIVE_INFINITY,\n\tdecimalPlaces: 100,\n\tnullable: true,\n}\n\nconst initRefinery =\n\t<Constraints extends NumberConstraints>(\n\t\tconstraints: { [K in keyof Constraints]?: Constraints[K] | undefined },\n\t) =>\n\t(\n\t\tinput: number | null,\n\t): Constraints extends { nullable: true | undefined }\n\t\t? number | null\n\t\t: number => {\n\t\tif (input === null && constraints.nullable === true) {\n\t\t\treturn null as Constraints extends { nullable: true }\n\t\t\t\t? number | null\n\t\t\t\t: number\n\t\t}\n\t\tconst { max, min, decimalPlaces } = {\n\t\t\t...DEFAULT_NUMBER_CONSTRAINTS,\n\t\t\t...constraints,\n\t\t}\n\t\tlet constrained = clampInto(min, max)(input ?? 0)\n\t\tif (decimalPlaces) {\n\t\t\tconstrained = round(constrained, decimalPlaces)\n\t\t}\n\t\treturn constrained\n\t}\n\nconst valueToText = (numericValue: number | null): string => {\n\tif (numericValue === null || numericValue === undefined) {\n\t\treturn ``\n\t}\n\treturn numericValue.toString()\n}\n\ntype NumberInputProps = Partial<NumberConstraints> & {\n\tautoSize?: boolean\n\tdisabled?: boolean\n\tid?: string\n\tlabel?: string\n\tname?: string\n\tonChange?: (e: React.ChangeEvent<HTMLInputElement>) => void\n\tonClick?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n\tplaceholder?: string\n\tset?: ((newValue: number | null) => void) | undefined\n\ttestid?: string\n\tvalue?: number | null\n}\n\nexport const NumberInput: FC<NumberInputProps> = ({\n\tautoSize = false,\n\tdecimalPlaces,\n\tdisabled = false,\n\tlabel,\n\tmax,\n\tmin,\n\tname,\n\tonChange,\n\tonClick,\n\tplaceholder = ``,\n\tset = () => null,\n\ttestid,\n\tvalue = null,\n}) => {\n\tconst htmlId = useId()\n\tconst [temporaryEntry, setTemporaryEntry] = useState<\n\t\tDecimalInProgress | ValidNonNumber | null\n\t>(null)\n\tconst userHasMadeDeliberateChange = useRef<boolean>(false)\n\n\tconst refine = initRefinery({ max, min, decimalPlaces, nullable: true })\n\n\tconst allowDecimal = decimalPlaces === undefined || decimalPlaces > 0\n\n\tconst handleBlur = () => {\n\t\tif (userHasMadeDeliberateChange.current) {\n\t\t\tset(refine(value ?? null))\n\t\t\tsetTemporaryEntry(null)\n\t\t}\n\t\tuserHasMadeDeliberateChange.current = false\n\t}\n\n\tconst handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n\t\tif (onChange) onChange(event)\n\t\tif (set === undefined) return\n\t\tuserHasMadeDeliberateChange.current = true\n\t\tconst input = event.target.value\n\t\tif (isValidNonNumber(input) || isDecimalInProgress(input)) {\n\t\t\tsetTemporaryEntry(input)\n\t\t\tconst textInterpretation = isDecimalInProgress(input)\n\t\t\t\t? input\n\t\t\t\t: (min?.toString() ?? `0`)\n\t\t\tconst newValue = textToValue(textInterpretation, allowDecimal)\n\t\t\tset(refine(newValue))\n\t\t\treturn\n\t\t}\n\t\tsetTemporaryEntry(null)\n\t\tconst inputIsNumeric =\n\t\t\t(!Number.isNaN(Number(input)) && !input.includes(` `)) ||\n\t\t\t(allowDecimal && input === `.`) ||\n\t\t\t(allowDecimal && input === `-.`) ||\n\t\t\tinput === `` ||\n\t\t\tinput === `-`\n\t\tconst numericValue = textToValue(input, allowDecimal)\n\n\t\tif (inputIsNumeric) {\n\t\t\tset(refine(numericValue))\n\t\t}\n\t}\n\n\tconst displayValue =\n\t\ttemporaryEntry ?? valueToText(value ? refine(value) : value)\n\n\treturn (\n\t\t<span>\n\t\t\t{label ? <label htmlFor={htmlId}>{label}</label> : null}\n\t\t\t{autoSize ? (\n\t\t\t\t<ElasticInput\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\tplaceholder={placeholder ?? `-`}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tname={name ?? htmlId}\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={displayValue}\n\t\t\t\t\tplaceholder={placeholder ?? `-`}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tname={name ?? htmlId}\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n","import { type FC, useId } from \"react\"\n\nimport { ElasticInput } from \".\"\n\nexport type TextInputProps = {\n\tvalue: string\n\tset?: ((value: string) => void) | undefined\n\tlabel?: string\n\tplaceholder?: string\n\tautoSize?: boolean\n\treadOnly?: boolean\n\ttestid?: string\n}\n\nexport const TextInput: FC<TextInputProps> = ({\n\tvalue,\n\tset,\n\tlabel,\n\tplaceholder,\n\tautoSize = false,\n\ttestid,\n}) => {\n\tconst htmlId = useId()\n\treturn (\n\t\t<span>\n\t\t\t{label ? <label htmlFor={htmlId}>{label}</label> : null}\n\t\t\t{autoSize ? (\n\t\t\t\t<ElasticInput\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => set?.(e.target.value)}\n\t\t\t\t\tdisabled={set === undefined}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<input\n\t\t\t\t\tid={htmlId}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => set?.(e.target.value)}\n\t\t\t\t\tdisabled={set === undefined}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tdata-testid={testid}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n","import { ElasticInput } from \"../../elastic-input\"\nimport type { JsonEditorProps } from \"../developer-interface\"\n\nexport const NonJsonEditor: React.FC<JsonEditorProps<never>> = ({\n\tdata,\n\ttestid,\n}) => {\n\treturn data === undefined ? (\n\t\t<ElasticInput\n\t\t\tdisabled\n\t\t\tvalue=\"undefined\"\n\t\t\tdata-testid={`${testid}-undefined`}\n\t\t/>\n\t) : (\n\t\t<ElasticInput\n\t\t\tdisabled\n\t\t\tvalue={\n\t\t\t\tObject.getPrototypeOf(data).constructor.name + ` ` + JSON.stringify(data)\n\t\t\t}\n\t\t\tdata-testid={`${testid}-non-json-${Object.getPrototypeOf(data).constructor.name}`}\n\t\t/>\n\t)\n}\n","import { actUponStore, arbitrary } from \"atom.io/internal\"\nimport { jsonRefinery } from \"atom.io/introspection\"\nimport type { JsonTypes } from \"atom.io/json\"\nimport { isJson } from \"atom.io/json\"\nimport {\n\ttype CSSProperties,\n\ttype FC,\n\ttype ReactElement,\n\tuseContext,\n} from \"react\"\n\nimport { button } from \"../Button\"\nimport { ElasticInput } from \"../elastic-input\"\nimport { DevtoolsContext } from \"../store\"\nimport type { SetterOrUpdater } from \".\"\nimport { SubEditors } from \".\"\nimport type { JsonEditorComponents } from \"./default-components\"\nimport { NonJsonEditor } from \"./editors-by-type/non-json\"\n\nexport type JsonEditorProps_INTERNAL<T> = {\n\tdata: T\n\tset: SetterOrUpdater<T>\n\tname?: string | undefined\n\trename?: ((newKey: string) => void) | undefined\n\tremove?: (() => void) | undefined\n\trecast?: (newType: keyof JsonTypes) => void\n\tpath?: ReadonlyArray<number | string>\n\tisReadonly?: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden?: (path: ReadonlyArray<number | string>) => boolean\n\tclassName?: string | undefined\n\tstyle?: CSSProperties | undefined\n\tHeader?: FC<{ data: T }> | undefined\n\tComponents: JsonEditorComponents\n\tisOpen?: boolean\n\tsetIsOpen?: (newValue: boolean) => void\n\ttestid?: string | undefined\n}\n\nexport const JsonEditor_INTERNAL = <T,>({\n\tdata,\n\tset,\n\tname,\n\trename,\n\tremove,\n\trecast,\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tclassName,\n\tstyle,\n\tComponents,\n\tisOpen,\n\tsetIsOpen,\n\ttestid,\n}: JsonEditorProps_INTERNAL<T>): ReactElement | null => {\n\tconst { openCloseAllTX, store } = useContext(DevtoolsContext)\n\n\tconst dataIsJson = isJson(data)\n\tconst refined = jsonRefinery.refine<unknown>(data) ?? {\n\t\ttype: `non-json`,\n\t\tdata,\n\t}\n\tconst SubEditor = dataIsJson\n\t\t? SubEditors[refined.type as keyof JsonTypes]\n\t\t: NonJsonEditor\n\n\tconst disabled = isReadonly(path)\n\n\tconst dataIsTree = refined.type === `array` || refined.type === `object`\n\tconst dataIsExpandable = dataIsTree && isOpen !== undefined && setIsOpen\n\n\treturn isHidden(path) ? null : (\n\t\t<Components.ErrorBoundary>\n\t\t\t<Components.EditorWrapper\n\t\t\t\tclassName={className}\n\t\t\t\tstyle={style}\n\t\t\t\ttestid={testid}\n\t\t\t>\n\t\t\t\t<header>\n\t\t\t\t\t<main>\n\t\t\t\t\t\t{remove || dataIsExpandable ? (\n\t\t\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\t\t\tisOpen={isOpen ?? false}\n\t\t\t\t\t\t\t\ttestid={`${testid}-open-close`}\n\t\t\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\t\t\tactUponStore(store, openCloseAllTX, arbitrary())(path, isOpen)\n\t\t\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t\t\t\tdisabled={!dataIsExpandable}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{rename && (\n\t\t\t\t\t\t\t<Components.KeyWrapper>\n\t\t\t\t\t\t\t\t<ElasticInput\n\t\t\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\trename(e.target.value)\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-rename`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</Components.KeyWrapper>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{dataIsTree ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{isOpen !== undefined && setIsOpen ? (\n\t\t\t\t\t\t\t\t\t<span className=\"json_viewer\">{JSON.stringify(data)}</span>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t{recast ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\trecast(e.target.value as keyof JsonTypes)\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tvalue={refined.type}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-recast`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{Object.keys(SubEditors).map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={type} value={type}>\n\t\t\t\t\t\t\t\t\t\t\t\t{type}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<SubEditor\n\t\t\t\t\t\t\t\t\tdata={refined.data as never}\n\t\t\t\t\t\t\t\t\tset={set}\n\t\t\t\t\t\t\t\t\tremove={remove}\n\t\t\t\t\t\t\t\t\trename={rename}\n\t\t\t\t\t\t\t\t\tpath={path}\n\t\t\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{recast && dataIsJson ? (\n\t\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\t\tonChange={\n\t\t\t\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t: (e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trecast(e.target.value as keyof JsonTypes)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvalue={refined.type}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tdata-testid={`${testid}-recast`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{Object.keys(SubEditors).map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t<option key={type} value={type}>\n\t\t\t\t\t\t\t\t\t\t\t\t{type}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</main>\n\t\t\t\t\t{remove ? (\n\t\t\t\t\t\t<Components.Button\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tremove()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttestid={`${testid}-delete`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Components.DeleteIcon />\n\t\t\t\t\t\t</Components.Button>\n\t\t\t\t\t) : null}\n\t\t\t\t</header>\n\n\t\t\t\t{dataIsTree && isOpen !== false ? (\n\t\t\t\t\t<SubEditor\n\t\t\t\t\t\tdata={refined.data as never}\n\t\t\t\t\t\tset={set}\n\t\t\t\t\t\tremove={remove}\n\t\t\t\t\t\trename={rename}\n\t\t\t\t\t\tpath={path}\n\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</Components.EditorWrapper>\n\t\t</Components.ErrorBoundary>\n\t)\n}\n","import { become } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { SetterOrUpdater } from \"../..\"\n\nexport const makeElementSetters = <T extends Json.Tree.Array>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): SetterOrUpdater<T[number]>[] =>\n\tdata.map((value, index) => (newValue) => {\n\t\tset((): T => {\n\t\t\tconst newData = [...data]\n\t\t\tnewData[index] = become(newValue, value)\n\t\t\treturn newData as unknown as T\n\t\t})\n\t})\n","import type { Json } from \"atom.io/json\"\n\nexport const stringToBoolean = (str: string): boolean => str === `true`\nexport const stringToNumber = (str: string): number => Number(str)\nexport const stringToArray = (str: string): string[] => str.split(`,`)\nexport const stringToObject = (str: string): Json.Tree.Object => {\n\ttry {\n\t\treturn JSON.parse(str)\n\t} catch (_) {\n\t\treturn { [str]: str }\n\t}\n}\n\nexport const objectToString = (obj: Json.Tree.Object): string =>\n\tJSON.stringify(obj)\nexport const objectToBoolean = (obj: Json.Tree.Object): boolean =>\n\tobj[`true`] === true\nexport const objectToNumber = (obj: Json.Tree.Object): number =>\n\tNumber(obj[`number`] ?? obj[`size`] ?? obj[`count`] ?? 0)\nexport const objectToArray = <T>(\n\tobj: Json.Tree.Object<string, T>,\n): [key: string, value: T][] => Object.entries(obj)\n\nexport const booleanToString = (bool: boolean): string => bool.toString()\nexport const booleanToNumber = (bool: boolean): number => +bool\nexport const booleanToObject = (bool: boolean): Json.Tree.Object => ({\n\t[bool.toString()]: bool,\n})\nexport const booleanToArray = (bool: boolean): boolean[] => [bool]\n\nexport const numberToString = (num: number): string => num.toString()\nexport const numberToBoolean = (num: number): boolean => num === 1\nexport const numberToObject = (num: number): Json.Tree.Object => ({\n\tnumber: num,\n})\nexport const numberToArray = (num: number): null[] => Array(num).fill(null)\n\nexport const arrayToString = (arr: Json.Tree.Array): string => arr.join(`,`)\nexport const arrayToNumber = (arr: Json.Tree.Array): number => arr.length\nexport const arrayToBoolean = (arr: Json.Tree.Array): boolean =>\n\ttypeof arr[0] === `boolean` ? arr[0] : arr.length > 0\nexport const arrayToObject = <T>(\n\tarr: Json.Tree.Array<T>,\n): Json.Tree.Object<`${number}`, T> =>\n\tarr.reduce(\n\t\t(acc, cur, idx) => {\n\t\t\tacc[`${idx}`] = cur\n\t\t\treturn acc\n\t\t},\n\t\t{} as Json.Tree.Object<`${number}`, T>,\n\t)\n\nexport const nullToString = (): string => ``\nexport const nullToNumber = (): number => 0\nexport const nullToBoolean = (): boolean => false\nexport const nullToArray = (): Json.Tree.Array => []\nexport const nullToObject = (): Json.Tree.Object => ({})\n","import { jsonRefinery } from \"atom.io/introspection\"\nimport type { Json } from \"atom.io/json\"\n\nimport * as Cast from \"./cast-json\"\n\nexport const castToJson = (\n\tinput: unknown,\n): {\n\tarray: Json.Tree.Array\n\tboolean: boolean\n\tnumber: number\n\tobject: Json.Tree.Object\n\tstring: string\n\tnull: null\n} => {\n\tconst refined = jsonRefinery.refine(input)\n\tswitch (refined?.type) {\n\t\tcase `array`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.arrayToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.arrayToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.arrayToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.arrayToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `boolean`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.booleanToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.booleanToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.booleanToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.booleanToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `number`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.numberToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.numberToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.numberToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.numberToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `object`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.objectToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.objectToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.objectToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.objectToString(data)\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `string`: {\n\t\t\tconst data = refined.data\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.stringToArray(data)\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.stringToBoolean(data)\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.stringToNumber(data)\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.stringToObject(data)\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn data\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t\tcase `null`:\n\t\tcase undefined: {\n\t\t\treturn {\n\t\t\t\tget array() {\n\t\t\t\t\treturn Cast.nullToArray()\n\t\t\t\t},\n\t\t\t\tget boolean() {\n\t\t\t\t\treturn Cast.nullToBoolean()\n\t\t\t\t},\n\t\t\t\tget number() {\n\t\t\t\t\treturn Cast.nullToNumber()\n\t\t\t\t},\n\t\t\t\tget object() {\n\t\t\t\t\treturn Cast.nullToObject()\n\t\t\t\t},\n\t\t\t\tget string() {\n\t\t\t\t\treturn Cast.nullToString()\n\t\t\t\t},\n\t\t\t\tget null() {\n\t\t\t\t\treturn null\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n}\n","import { become } from \"atom.io/internal\"\nimport type { Json, JsonTypeName } from \"atom.io/json\"\nimport { fromEntries, JSON_DEFAULTS, toEntries } from \"atom.io/json\"\nimport type { RefObject } from \"react\"\n\nimport type { SetterOrUpdater } from \"../..\"\nimport { castToJson } from \"./cast-to-json\"\n\nexport const makePropertySetters = <T extends Json.Tree.Object>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: SetterOrUpdater<T[K]> } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newValue: unknown) => {\n\t\t\t\tset({ ...data, [key]: become(newValue, value) })\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRenamers = <T extends Json.Tree.Object>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n\tstableKeyMapRef: RefObject<{ [Key in keyof T]: keyof T }>,\n): { [K in keyof T]: (newKey: string) => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newKey: string) => {\n\t\t\t\tif (!Object.hasOwn(data, newKey)) {\n\t\t\t\t\tset(() => {\n\t\t\t\t\t\tconst entries = Object.entries(data)\n\t\t\t\t\t\tconst index = entries.findIndex(([k]) => k === key)\n\t\t\t\t\t\tentries[index] = [newKey, value]\n\t\t\t\t\t\tconst stableKeyMap = stableKeyMapRef.current\n\t\t\t\t\t\tstableKeyMapRef.current = {\n\t\t\t\t\t\t\t...stableKeyMap,\n\t\t\t\t\t\t\t[newKey]: stableKeyMap[key],\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Object.fromEntries(entries) as T\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRemovers = <\n\tT extends Json.Tree.Array | Json.Tree.Object,\n>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: () => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key]) => [\n\t\t\tkey,\n\t\t\t() => {\n\t\t\t\tset(() => {\n\t\t\t\t\tlet next: T\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tconst copy = [...data]\n\t\t\t\t\t\tcopy.splice(key as number, 1)\n\t\t\t\t\t\tnext = copy as unknown as T\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst { [key]: _, ...rest } = data\n\t\t\t\t\t\tnext = rest as T\n\t\t\t\t\t}\n\t\t\t\t\treturn next\n\t\t\t\t})\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyRecasters = <\n\tT extends Json.Tree.Array | Json.Tree.Object,\n>(\n\tdata: T,\n\tset: SetterOrUpdater<T>,\n): { [K in keyof T]: (newType: JsonTypeName) => void } =>\n\tfromEntries(\n\t\ttoEntries(data).map(([key, value]) => [\n\t\t\tkey,\n\t\t\t(newType: JsonTypeName) => {\n\t\t\t\tset(() => {\n\t\t\t\t\tlet next: T\n\t\t\t\t\tif (Array.isArray(data)) {\n\t\t\t\t\t\tconst copy = [...data]\n\t\t\t\t\t\tcopy[key as number] = castToJson(value)[newType]\n\t\t\t\t\t\tnext = copy as unknown as T\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext = {\n\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t[key]: castToJson(value)[newType],\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn next\n\t\t\t\t})\n\t\t\t},\n\t\t]),\n\t)\n\nexport const makePropertyCreationInterface =\n\t<T extends Json.Tree.Object>(\n\t\tdata: T,\n\t\tset: SetterOrUpdater<T>,\n\t): ((\n\t\tkey: string,\n\t\ttype: JsonTypeName,\n\t) => (value?: Json.Serializable) => void) =>\n\t(key, type) =>\n\t(value) => {\n\t\tset({ ...data, [key]: value ?? JSON_DEFAULTS[type] })\n\t}\n\nexport const makePropertySorter =\n\t<T extends Json.Tree.Object>(\n\t\tdata: T,\n\t\tset: SetterOrUpdater<T>,\n\t\tsortFn?: (a: string, b: string) => number,\n\t): (() => void) =>\n\t() => {\n\t\tconst sortedKeys = Object.keys(data).sort(sortFn)\n\t\tconst sortedObj = {} as Record<string, unknown>\n\t\tfor (const key of sortedKeys) {\n\t\t\tsortedObj[key] = data[key]\n\t\t}\n\t\tset(sortedObj as T)\n\t}\n","import type { RegularAtomToken } from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json, JsonTypes } from \"atom.io/json\"\nimport { JSON_DEFAULTS } from \"atom.io/json\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type ReactElement, useContext } from \"react\"\n\nimport { DevtoolsContext } from \"../../store\"\nimport type { JsonEditorComponents, SetterOrUpdater } from \"..\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"../json-editor-internal\"\nimport { makeElementSetters } from \"./utilities/array-elements\"\nimport {\n\tmakePropertyRecasters,\n\tmakePropertyRemovers,\n} from \"./utilities/object-properties\"\n\ntype ArrayElementProps = {\n\tpath: ReadonlyArray<number | string>\n\tisReadonly: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden: (path: ReadonlyArray<number | string>) => boolean\n\tdata: unknown\n\tset: SetterOrUpdater<Json.Tree.Array>\n\tremove: (() => void) | undefined\n\trecast: (newType: keyof JsonTypes) => void\n\tComponents: JsonEditorComponents\n\ttestid?: string | undefined\n\tviewIsOpenAtom: RegularAtomToken<boolean, readonly (number | string)[]>\n}\nconst ArrayElement = ({\n\tpath,\n\tisReadonly,\n\tisHidden,\n\tdata,\n\tset,\n\tremove,\n\trecast,\n\tComponents,\n\ttestid,\n\tviewIsOpenAtom,\n}: ArrayElementProps): ReactElement => {\n\tconst index = path[path.length - 1]\n\tconst viewIsOpen = useO(viewIsOpenAtom)\n\tconst setViewIsOpen = useI(viewIsOpenAtom)\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tpath={path}\n\t\t\tname={`${index}`}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tremove={remove}\n\t\t\trecast={recast}\n\t\t\tclassName=\"json_editor_element\"\n\t\t\tComponents={Components}\n\t\t\tisOpen={viewIsOpen}\n\t\t\tsetIsOpen={setViewIsOpen}\n\t\t\ttestid={`${testid}-element-${index}`}\n\t\t/>\n\t)\n}\n\nexport const ArrayEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<Json.Tree.Array>): ReactElement => {\n\tconst { viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\tconst disabled = isReadonly(path)\n\n\tconst setElement = makeElementSetters(data, set)\n\tconst removeElement = makePropertyRemovers(data, set)\n\tconst recastElement = makePropertyRecasters(data, set)\n\n\treturn (\n\t\t<Components.ArrayWrapper>\n\t\t\t<main className={`json_editor_elements${disabled ? ` readonly` : ``}`}>\n\t\t\t\t{data.map((element, index) => {\n\t\t\t\t\tconst elementPath = [...path, index]\n\t\t\t\t\tconst pathKey = elementPath.join(`,`)\n\t\t\t\t\tconst viewIsOpenAtom = findInStore(store, viewIsOpenAtoms, [\n\t\t\t\t\t\t...path,\n\t\t\t\t\t\tindex,\n\t\t\t\t\t])\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ArrayElement\n\t\t\t\t\t\t\tkey={pathKey}\n\t\t\t\t\t\t\tpath={elementPath}\n\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\tdata={element}\n\t\t\t\t\t\t\tset={setElement[index]}\n\t\t\t\t\t\t\tremove={removeElement[index]}\n\t\t\t\t\t\t\trecast={recastElement[index]}\n\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\tviewIsOpenAtom={viewIsOpenAtom}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</main>\n\t\t\t{!disabled ? (\n\t\t\t\t<footer>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\ttestid={`${testid}-add-element`}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tset((current) => {\n\t\t\t\t\t\t\t\tconst newData = [...current, JSON_DEFAULTS.string]\n\t\t\t\t\t\t\t\treturn newData\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Components.AddIcon />\n\t\t\t\t\t</Components.Button>\n\t\t\t\t</footer>\n\t\t\t) : null}\n\t\t</Components.ArrayWrapper>\n\t)\n}\n","import type { RegularAtomToken } from \"atom.io\"\nimport { findInStore } from \"atom.io/internal\"\nimport type { Json, JsonTypes } from \"atom.io/json\"\nimport { useI, useO } from \"atom.io/react\"\nimport type { FC, ReactElement } from \"react\"\nimport { useContext, useRef } from \"react\"\n\nimport { ElasticInput } from \"../../elastic-input\"\nimport { DevtoolsContext } from \"../../store\"\nimport type { SetterOrUpdater } from \"..\"\nimport type { JsonEditorComponents } from \"../default-components\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"../json-editor-internal\"\nimport {\n\tmakePropertyCreationInterface,\n\tmakePropertyRecasters,\n\tmakePropertyRemovers,\n\tmakePropertyRenamers,\n\tmakePropertySetters,\n\tmakePropertySorter,\n} from \"./utilities/object-properties\"\n\nexport type PropertyAdderProps = {\n\taddProperty: () => void\n\tdisabled: boolean\n\tpropertyKey: string\n\tComponents: JsonEditorComponents\n}\n\nexport const PropertyAdder: FC<PropertyAdderProps> = ({\n\taddProperty,\n\tdisabled,\n\tpropertyKey,\n\tComponents,\n}) => (\n\t<Components.MissingPropertyWrapper>\n\t\t<ElasticInput disabled defaultValue={propertyKey} />\n\t\t{` `}\n\t\t<ElasticInput disabled defaultValue=\"is missing\" />\n\t\t<Components.Button\n\t\t\tonClick={() => {\n\t\t\t\taddProperty()\n\t\t\t}}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t+\n\t\t</Components.Button>\n\t</Components.MissingPropertyWrapper>\n)\n\ntype ObjectPropertyProps = {\n\tpath: ReadonlyArray<number | string>\n\tisReadonly: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden: (path: ReadonlyArray<number | string>) => boolean\n\tdata: unknown\n\tset: SetterOrUpdater<Json.Tree.Object>\n\trename: (newKey: string) => void\n\tremove: (() => void) | undefined\n\trecast: (newType: keyof JsonTypes) => void\n\tComponents: JsonEditorComponents\n\ttestid?: string | undefined\n\tviewIsOpenAtom: RegularAtomToken<boolean, readonly (number | string)[]>\n}\nconst ObjectProperty = ({\n\tpath,\n\tisReadonly,\n\tisHidden,\n\tdata,\n\tset,\n\trename,\n\tremove,\n\trecast,\n\tComponents,\n\ttestid,\n\tviewIsOpenAtom,\n}: ObjectPropertyProps): ReactElement => {\n\tconst key = path[path.length - 1]\n\tconst viewIsOpen = useO(viewIsOpenAtom)\n\tconst setViewIsOpen = useI(viewIsOpenAtom)\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tpath={path}\n\t\t\tname={`${key}`}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\trename={rename}\n\t\t\tremove={remove}\n\t\t\trecast={recast}\n\t\t\tclassName=\"json_editor_property\"\n\t\t\tComponents={Components}\n\t\t\tisOpen={viewIsOpen}\n\t\t\tsetIsOpen={setViewIsOpen}\n\t\t\ttestid={`${testid}-property-${key}`}\n\t\t/>\n\t)\n}\n\nexport const ObjectEditor = <T extends Json.Tree.Object>({\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<T>): ReactElement => {\n\tconst { viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\n\tconst disabled = isReadonly(path)\n\n\tconst stableKeyMap = useRef<Record<keyof T, keyof T>>(\n\t\tObject.keys(data).reduce(\n\t\t\t(acc, key: keyof T) => {\n\t\t\t\tacc[key] = key\n\t\t\t\treturn acc\n\t\t\t},\n\t\t\t{} as Record<keyof T, keyof T>,\n\t\t),\n\t)\n\n\tconst setProperty = makePropertySetters(data, set)\n\tconst renameProperty = makePropertyRenamers(data, set, stableKeyMap)\n\tconst removeProperty = makePropertyRemovers(data, set)\n\tconst recastProperty = makePropertyRecasters(data, set)\n\tconst sortProperties = makePropertySorter(data, set)\n\tconst makePropertyAdder = makePropertyCreationInterface(data, set)\n\n\treturn (\n\t\t<Components.ObjectWrapper>\n\t\t\t<div className={`json_editor_properties${disabled ? ` readonly` : ``}`}>\n\t\t\t\t{Object.keys(data).map((key) => {\n\t\t\t\t\tconst originalKey = stableKeyMap.current[key]\n\t\t\t\t\tconst propertyPath = [...path, key]\n\t\t\t\t\tconst originalPropertyPath = [...path, originalKey]\n\t\t\t\t\tconst stablePathKey = originalPropertyPath.join(`.`)\n\t\t\t\t\tconst viewIsOpenAtom = findInStore(store, viewIsOpenAtoms, [\n\t\t\t\t\t\t...path,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t])\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ObjectProperty\n\t\t\t\t\t\t\tkey={stablePathKey}\n\t\t\t\t\t\t\tpath={propertyPath}\n\t\t\t\t\t\t\tisReadonly={isReadonly}\n\t\t\t\t\t\t\tisHidden={isHidden}\n\t\t\t\t\t\t\tdata={data[key]}\n\t\t\t\t\t\t\tset={setProperty[key]}\n\t\t\t\t\t\t\trename={renameProperty[key]}\n\t\t\t\t\t\t\tremove={removeProperty[key]}\n\t\t\t\t\t\t\trecast={recastProperty[key]}\n\t\t\t\t\t\t\tComponents={Components}\n\t\t\t\t\t\t\ttestid={testid}\n\t\t\t\t\t\t\tviewIsOpenAtom={viewIsOpenAtom}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t{disabled ? null : (\n\t\t\t\t<footer>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\ttestid={`${testid}-add-property`}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tmakePropertyAdder(`new_property`, `string`)()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Components.AddIcon />\n\t\t\t\t\t</Components.Button>\n\t\t\t\t\t<Components.Button\n\t\t\t\t\t\ttestid={`${testid}-sort-properties`}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tsortProperties()\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t>\n\t\t\t\t\t\tSort\n\t\t\t\t\t</Components.Button>\n\t\t\t\t</footer>\n\t\t\t)}\n\t\t</Components.ObjectWrapper>\n\t)\n}\n","import type { ReactElement } from \"react\"\n\nimport { NumberInput, TextInput } from \"../../elastic-input\"\nimport type { JsonEditorProps_INTERNAL } from \"../json-editor-internal\"\n\nexport const BooleanEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<boolean>): ReactElement => (\n\t<Components.BooleanWrapper>\n\t\t<input\n\t\t\tdisabled={isReadonly(path)}\n\t\t\tdata-testid={`${testid}-boolean-input`}\n\t\t\ttype=\"checkbox\"\n\t\t\tchecked={data}\n\t\t\tonChange={(event) => {\n\t\t\t\tset(event.target.checked)\n\t\t\t}}\n\t\t/>\n\t</Components.BooleanWrapper>\n)\n\nexport const NullEditor = ({\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<null>): ReactElement => (\n\t<Components.Null testid={`${testid}-null`} />\n)\n\nexport const NumberEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<number>): ReactElement => (\n\t<Components.NumberWrapper>\n\t\t<NumberInput\n\t\t\tdisabled={isReadonly(path)}\n\t\t\ttestid={`${testid}-number-input`}\n\t\t\tvalue={data}\n\t\t\tset={\n\t\t\t\tisReadonly(path)\n\t\t\t\t\t? undefined\n\t\t\t\t\t: (newValue) => {\n\t\t\t\t\t\t\tset(Number(newValue))\n\t\t\t\t\t\t}\n\t\t\t}\n\t\t\tautoSize={true}\n\t\t/>\n\t</Components.NumberWrapper>\n)\n\nexport const StringEditor = ({\n\tpath = [],\n\tisReadonly = () => false,\n\tdata,\n\tset,\n\tComponents,\n\ttestid,\n}: JsonEditorProps_INTERNAL<string>): ReactElement => {\n\treturn (\n\t\t<Components.StringWrapper>\n\t\t\t<TextInput\n\t\t\t\treadOnly={isReadonly(path)}\n\t\t\t\ttestid={`${testid}-string-input`}\n\t\t\t\tvalue={data}\n\t\t\t\tset={isReadonly(path) ? undefined : set}\n\t\t\t\tautoSize={true}\n\t\t\t/>\n\t\t</Components.StringWrapper>\n\t)\n}\n","import type { JsonTypes } from \"atom.io/json\"\nimport type { CSSProperties, FC, ReactElement } from \"react\"\n\nimport type { JsonEditorComponents } from \"./default-components\"\nimport { DEFAULT_JSON_EDITOR_COMPONENTS } from \"./default-components\"\nimport { ArrayEditor } from \"./editors-by-type/array-editor\"\nimport { ObjectEditor } from \"./editors-by-type/object-editor\"\nimport {\n\tBooleanEditor,\n\tNullEditor,\n\tNumberEditor,\n\tStringEditor,\n} from \"./editors-by-type/primitive-editors\"\nimport type { JsonEditorProps_INTERNAL } from \"./json-editor-internal\"\nimport { JsonEditor_INTERNAL } from \"./json-editor-internal\"\n\nexport const SubEditors: Record<\n\tkeyof JsonTypes,\n\tFC<JsonEditorProps_INTERNAL<any>>\n> = {\n\tarray: ArrayEditor,\n\tboolean: BooleanEditor,\n\tnull: NullEditor,\n\tnumber: NumberEditor,\n\tobject: ObjectEditor,\n\tstring: StringEditor,\n}\n\nexport type JsonEditorProps<T> = {\n\tdata: T\n\tset: (valOrUpdater: T | ((currVal: T) => T)) => void\n\tname?: string | undefined\n\trename?: ((newKey: string) => void) | undefined\n\tremove?: (() => void) | undefined\n\tpath?: ReadonlyArray<number | string>\n\tisReadonly?: (path: ReadonlyArray<number | string>) => boolean\n\tisHidden?: (path: ReadonlyArray<number | string>) => boolean\n\tclassName?: string\n\tstyle?: CSSProperties\n\tHeader?: FC<{ data: T }>\n\tComponents?: Partial<JsonEditorComponents>\n\ttestid?: string | undefined\n}\n\nexport const JsonEditor = <T,>({\n\tdata,\n\tset,\n\tname,\n\trename,\n\tremove,\n\tpath = [],\n\tisReadonly = () => false,\n\tisHidden = () => false,\n\tclassName,\n\tHeader,\n\tstyle,\n\tComponents: CustomComponents = {},\n\ttestid,\n}: JsonEditorProps<T>): ReactElement => {\n\tconst Components = {\n\t\t...DEFAULT_JSON_EDITOR_COMPONENTS,\n\t\t...CustomComponents,\n\t}\n\n\treturn (\n\t\t<JsonEditor_INTERNAL\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tname={name}\n\t\t\trename={rename}\n\t\t\tremove={remove}\n\t\t\tpath={path}\n\t\t\tisReadonly={isReadonly}\n\t\t\tisHidden={isHidden}\n\t\t\tclassName={className}\n\t\t\tHeader={Header}\n\t\t\tstyle={style}\n\t\t\tComponents={Components}\n\t\t\ttestid={testid}\n\t\t/>\n\t)\n}\n","import type { ReadonlySelectorToken, WritableToken } from \"atom.io\"\nimport { useI, useO } from \"atom.io/react\"\nimport type { FC } from \"react\"\n\nimport { JsonEditor } from \"./json-editor\"\n\nexport const StateEditor: FC<{\n\ttoken: WritableToken<unknown, any, unknown>\n}> = ({ token }) => {\n\tconst set = useI(token)\n\tconst data = useO(token)\n\tconst metaPath = token.family\n\t\t? [token.family.key, token.family.subKey]\n\t\t: [token.key]\n\treturn (\n\t\t<JsonEditor\n\t\t\ttestid={`${token.key}-state-editor`}\n\t\t\tdata={data}\n\t\t\tset={set}\n\t\t\tpath={metaPath}\n\t\t/>\n\t)\n}\n\nexport const ReadonlySelectorViewer: FC<{\n\ttoken: ReadonlySelectorToken<unknown, any, unknown>\n}> = ({ token }) => {\n\tconst data = useO(token)\n\tconst metaPath = token.family\n\t\t? [token.family.key, token.family.subKey]\n\t\t: [token.key]\n\treturn (\n\t\t<JsonEditor\n\t\t\ttestid={`${token.key}-state-editor`}\n\t\t\tdata={data}\n\t\t\tset={() => null}\n\t\t\tisReadonly={() => true}\n\t\t\tpath={metaPath}\n\t\t/>\n\t)\n}\n\nexport const StoreEditor: FC<{\n\ttoken:\n\t\t| ReadonlySelectorToken<unknown, any, unknown>\n\t\t| WritableToken<unknown, any, unknown>\n}> = ({ token }) => {\n\tswitch (token.type) {\n\t\tcase `readonly_pure_selector`:\n\t\tcase `readonly_held_selector`:\n\t\t\treturn <ReadonlySelectorViewer token={token} />\n\t\tcase `writable_pure_selector`:\n\t\tcase `writable_held_selector`:\n\t\tcase `atom`:\n\t\tcase `mutable_atom`:\n\t\t\treturn <StateEditor token={token} />\n\t}\n}\n","import type {\n\tAtomToken,\n\tLoadable,\n\tReadableToken,\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n} from \"atom.io\"\nimport {\n\tactUponStore,\n\tarbitrary,\n\tdisposeFromStore,\n\tfindInStore,\n\tgetFromStore,\n} from \"atom.io/internal\"\nimport type { FamilyNode, WritableTokenIndex } from \"atom.io/introspection\"\nimport { primitiveRefinery } from \"atom.io/introspection\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DEFAULT_JSON_EDITOR_COMPONENTS } from \"./json-editor\"\nimport { StoreEditor } from \"./StateEditor\"\nimport { DevtoolsContext } from \"./store\"\n\n/* eslint-disable no-console */\n\nexport const StateIndexLeafNode: FC<{\n\tnode: ReadableToken<unknown, any, unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: (() => void) | undefined\n}> = ({ node, isOpenState, typeState, dispose }) => {\n\tconst { openCloseAllTX, store } = useContext(DevtoolsContext)\n\n\tconst setIsOpen = useI(isOpenState)\n\tconst isOpen = useO(isOpenState)\n\n\tconst state = useO(node)\n\tconst stateTypeLoadable = useO(typeState)\n\tconst stateType =\n\t\tstateTypeLoadable instanceof Promise ? `Promise` : stateTypeLoadable\n\n\tconst isPrimitive = Boolean(primitiveRefinery.refine(state))\n\n\tconst path = node.family ? [node.family.key, node.family.subKey] : [node.key]\n\n\treturn (\n\t\t<>\n\t\t\t<header>\n\t\t\t\t<main\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tconsole.log(node, getFromStore(store, node))\n\t\t\t\t\t}}\n\t\t\t\t\tonKeyUp={() => {\n\t\t\t\t\t\tconsole.log(node, getFromStore(store, node))\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen && !isPrimitive}\n\t\t\t\t\t\ttestid={`open-close-state-${node.key}`}\n\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\tactUponStore(store, openCloseAllTX, arbitrary())(path, isOpen)\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t\tdisabled={isPrimitive}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{node.family?.subKey ?? node.key}</h2>\n\t\t\t\t\t<span className=\"type detail\">({stateType})</span>\n\t\t\t\t</main>\n\t\t\t\t<footer>\n\t\t\t\t\t{isPrimitive ? (\n\t\t\t\t\t\t<StoreEditor token={node} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"json_viewer\">{JSON.stringify(state)}</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{dispose ? (\n\t\t\t\t\t\t<DEFAULT_JSON_EDITOR_COMPONENTS.Button\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tdispose?.()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttestid={`${node.key}-dispose`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DEFAULT_JSON_EDITOR_COMPONENTS.DeleteIcon />\n\t\t\t\t\t\t</DEFAULT_JSON_EDITOR_COMPONENTS.Button>\n\t\t\t\t\t) : null}\n\t\t\t\t</footer>\n\t\t\t</header>\n\t\t\t{isOpen && !isPrimitive ? (\n\t\t\t\t<main>\n\t\t\t\t\t<StoreEditor token={node} />\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</>\n\t)\n}\nexport const StateIndexTreeNode: FC<{\n\tnode: FamilyNode<ReadableToken<unknown, any, unknown>>\n\tisOpenState: RegularAtomToken<boolean>\n}> = ({ node, isOpenState }) => {\n\tconst setIsOpen = useI(isOpenState)\n\tconst isOpen = useO(isOpenState)\n\n\tconst { typeSelectors, viewIsOpenAtoms, openCloseAllTX, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tfor (const [key, childNode] of node.familyMembers) {\n\t\tfindInStore(store, viewIsOpenAtoms, [key])\n\t\tfindInStore(store, typeSelectors, childNode.key)\n\t}\n\treturn (\n\t\t<>\n\t\t\t<header>\n\t\t\t\t<main>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\t\ttestid={`open-close-state-family-${node.key}`}\n\t\t\t\t\t\tonShiftClick={() => {\n\t\t\t\t\t\t\tactUponStore(\n\t\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t\topenCloseAllTX,\n\t\t\t\t\t\t\t\tarbitrary(),\n\t\t\t\t\t\t\t)([node.key], isOpen)\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{node.key}</h2>\n\t\t\t\t\t<span className=\"type detail\"> (family)</span>\n\t\t\t\t</main>\n\t\t\t</header>\n\t\t\t{isOpen\n\t\t\t\t? [...node.familyMembers.entries()].map(([key, childNode]) => (\n\t\t\t\t\t\t<StateIndexNode\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tnode={childNode}\n\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [node.key, key])}\n\t\t\t\t\t\t\ttypeState={findInStore(store, typeSelectors, childNode.key)}\n\t\t\t\t\t\t\tdispose={() => {\n\t\t\t\t\t\t\t\tdisposeFromStore(store, childNode)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))\n\t\t\t\t: null}\n\t\t</>\n\t)\n}\n\nexport const StateIndexNode: FC<{\n\tnode:\n\t\t| FamilyNode<ReadableToken<unknown, any, unknown>>\n\t\t| ReadableToken<unknown, any, unknown>\n\tisOpenState: RegularAtomToken<boolean>\n\ttypeState: ReadonlyPureSelectorToken<Loadable<string>>\n\tdispose?: () => void\n}> = ({ node, isOpenState, typeState, dispose }) => {\n\treturn (\n\t\t<section className=\"node state\" data-testid={`state-${node.key}`}>\n\t\t\t{`type` in node ? (\n\t\t\t\t<StateIndexLeafNode\n\t\t\t\t\tnode={node}\n\t\t\t\t\tisOpenState={isOpenState}\n\t\t\t\t\ttypeState={typeState}\n\t\t\t\t\tdispose={dispose}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<StateIndexTreeNode node={node} isOpenState={isOpenState} />\n\t\t\t)}\n\t\t</section>\n\t)\n}\n\nexport const StateIndex: FC<{\n\ttokenIndex: AtomToken<WritableTokenIndex<ReadableToken<unknown, any, unknown>>>\n}> = ({ tokenIndex }) => {\n\tconst tokenIds = useO(tokenIndex)\n\n\tconst { typeSelectors, viewIsOpenAtoms, store } = useContext(DevtoolsContext)\n\tconst statesName = tokenIndex.key.includes(`Atom`) ? `atoms` : `selectors`\n\n\treturn (\n\t\t<article className=\"index state_index\" data-testid=\"state-index\">\n\t\t\t{tokenIds.size === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no {statesName})</p>\n\t\t\t) : (\n\t\t\t\t[...tokenIds.entries()].map(([key, node]) => {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StateIndexNode\n\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\tnode={node}\n\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [node.key])}\n\t\t\t\t\t\t\ttypeState={findInStore(store, typeSelectors, node.key)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import type {\n\tAtomToken,\n\tAtomUpdateEvent,\n\tTimelineEvent,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport { discoverType, prettyJson } from \"atom.io/introspection\"\nimport { stringifyJson } from \"atom.io/json\"\nimport * as React from \"react\"\n\n/* eslint-disable no-console */\n\nconst AtomUpdateFC: React.FC<{\n\tserialNumber: number\n\tatomUpdate: AtomUpdateEvent<AtomToken<unknown, any, any>>\n}> = ({ atomUpdate }) => {\n\treturn (\n\t\t<article\n\t\t\tkey={atomUpdate.token.key}\n\t\t\tclassName=\"node atom_update\"\n\t\t\tonClick={() => {\n\t\t\t\tconsole.log(atomUpdate)\n\t\t\t}}\n\t\t\tonKeyUp={() => {\n\t\t\t\tconsole.log(atomUpdate)\n\t\t\t}}\n\t\t>\n\t\t\t<span className=\"detail\">{atomUpdate.token.key}: </span>\n\t\t\t<span>\n\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t{\n\t\t\t\t\t\tprettyJson.diff(\n\t\t\t\t\t\t\tatomUpdate.update.oldValue,\n\t\t\t\t\t\t\tatomUpdate.update.newValue,\n\t\t\t\t\t\t).summary\n\t\t\t\t\t}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t</article>\n\t)\n}\n\nconst TransactionUpdateFC: React.FC<{\n\tserialNumber: number\n\ttransactionUpdate: TransactionOutcomeEvent<TransactionToken<any>>\n}> = ({ serialNumber, transactionUpdate }) => {\n\treturn (\n\t\t<article\n\t\t\tclassName=\"node transaction_update\"\n\t\t\tdata-testid={`transaction-update-${transactionUpdate.token.key}-${serialNumber}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<h4>{serialNumber}</h4>\n\t\t\t</header>\n\t\t\t<main>\n\t\t\t\t<section className=\"transaction_params\">\n\t\t\t\t\t<span className=\"detail\">params: </span>\n\t\t\t\t\t{transactionUpdate.params.map((param, index) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<article\n\t\t\t\t\t\t\t\tkey={`param` + index}\n\t\t\t\t\t\t\t\tclassName=\"node transaction_param\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tconsole.log(transactionUpdate)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyUp={() => {\n\t\t\t\t\t\t\t\t\tconsole.log(transactionUpdate)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"detail\">{discoverType(param)}: </span>\n\t\t\t\t\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t\t\t\t\t{typeof param === `object` &&\n\t\t\t\t\t\t\t\t\tparam !== null &&\n\t\t\t\t\t\t\t\t\t`type` in param &&\n\t\t\t\t\t\t\t\t\t`target` in param\n\t\t\t\t\t\t\t\t\t\t? JSON.stringify(param.type)\n\t\t\t\t\t\t\t\t\t\t: JSON.stringify(param)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</article>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</section>\n\t\t\t\t<section className=\"node transaction_output\">\n\t\t\t\t\t<span className=\"detail\">output: </span>\n\t\t\t\t\t<span className=\"detail\">\n\t\t\t\t\t\t{discoverType(transactionUpdate.output)}\n\t\t\t\t\t</span>\n\t\t\t\t\t{transactionUpdate.output ? (\n\t\t\t\t\t\t<span className=\"summary\">\n\t\t\t\t\t\t\t: {JSON.stringify(transactionUpdate.output)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t) : null}\n\t\t\t\t</section>\n\t\t\t\t<section className=\"transaction_impact\">\n\t\t\t\t\t<span className=\"detail\">impact: </span>\n\t\t\t\t\t{transactionUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(txSubEvent) =>\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_creation` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_disposal` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `molecule_transfer` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `state_creation` &&\n\t\t\t\t\t\t\t\ttxSubEvent.type !== `state_disposal` &&\n\t\t\t\t\t\t\t\t!txSubEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((update, index) => {\n\t\t\t\t\t\t\tswitch (update.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${transactionUpdate.token.key}:${index}:${update.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={update}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `transaction_outcome`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<TransactionUpdateFC\n\t\t\t\t\t\t\t\t\t\t\tkey={`${transactionUpdate.token.key}:${index}:${update.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\ttransactionUpdate={update}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `molecule_creation`:\n\t\t\t\t\t\t\t\tcase `molecule_disposal`:\n\t\t\t\t\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\tcase `state_disposal`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})}\n\t\t\t\t</section>\n\t\t\t</main>\n\t\t</article>\n\t)\n}\n\nexport const TimelineUpdateFC: React.FC<{\n\ttimelineUpdate: TimelineEvent<any>\n\tserialNumber: number\n}> = ({ timelineUpdate, serialNumber }) => {\n\treturn timelineUpdate.type === `atom_update` ||\n\t\ttimelineUpdate.type === `selector_update` ||\n\t\ttimelineUpdate.type === `transaction_outcome` ? (\n\t\t<article\n\t\t\tclassName=\"node timeline_update\"\n\t\t\tdata-testid={`timeline-update-${typeof timelineUpdate.token.key === `string` ? timelineUpdate.token.key : stringifyJson(timelineUpdate.token.key)}-${serialNumber}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<h4>\n\t\t\t\t\t{timelineUpdate.timestamp}: {timelineUpdate.type} (\n\t\t\t\t\t{timelineUpdate.token.key})\n\t\t\t\t</h4>\n\t\t\t</header>\n\t\t\t<main>\n\t\t\t\t{timelineUpdate.type === `transaction_outcome` ? (\n\t\t\t\t\ttimelineUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(subEvent) =>\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_creation` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_disposal` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `molecule_transfer` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `state_creation` &&\n\t\t\t\t\t\t\t\tsubEvent.type !== `state_disposal` &&\n\t\t\t\t\t\t\t\t!subEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((subEvent, index) => {\n\t\t\t\t\t\t\tswitch (subEvent.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${subEvent.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={subEvent}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `transaction_outcome`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<TransactionUpdateFC\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${subEvent.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\ttransactionUpdate={subEvent}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `molecule_creation`:\n\t\t\t\t\t\t\t\tcase `molecule_disposal`:\n\t\t\t\t\t\t\t\tcase `molecule_transfer`:\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\tcase `state_disposal`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t) : timelineUpdate.type === `selector_update` ? (\n\t\t\t\t\ttimelineUpdate.subEvents\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(atomUpdateEvent) => !atomUpdateEvent.token.key.startsWith(`šāšØ`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((event, index) => {\n\t\t\t\t\t\t\tswitch (event.type) {\n\t\t\t\t\t\t\t\tcase `atom_update`:\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\t\t\t\t\t\tkey={`${timelineUpdate.token.key}:${index}:${event.token.key}`}\n\t\t\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t\t\t\tatomUpdate={event}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcase `state_creation`:\n\t\t\t\t\t\t\t\t\treturn null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t) : timelineUpdate.type === `atom_update` ? (\n\t\t\t\t\t<article.AtomUpdate\n\t\t\t\t\t\tserialNumber={timelineUpdate.timestamp}\n\t\t\t\t\t\tatomUpdate={timelineUpdate}\n\t\t\t\t\t/>\n\t\t\t\t) : null}\n\t\t\t</main>\n\t\t</article>\n\t) : null\n}\n\nexport const article: {\n\tAtomUpdate: typeof AtomUpdateFC\n\tTransactionUpdate: typeof TransactionUpdateFC\n\tTimelineUpdate: typeof TimelineUpdateFC\n} = {\n\tAtomUpdate: AtomUpdateFC,\n\tTransactionUpdate: TransactionUpdateFC,\n\tTimelineUpdate: TimelineUpdateFC,\n}\n","import type {\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n\tTimelineToken,\n} from \"atom.io\"\nimport { redo, undo } from \"atom.io\"\nimport { findInStore, type Timeline } from \"atom.io/internal\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, Fragment, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DevtoolsContext } from \"./store\"\nimport { article } from \"./Updates\"\n\nexport const YouAreHere: FC = () => {\n\treturn <span className=\"you_are_here\">you are here</span>\n}\n\nexport const TimelineLog: FC<{\n\ttoken: TimelineToken<any>\n\tisOpenState: RegularAtomToken<boolean>\n\ttimelineState: ReadonlyPureSelectorToken<Timeline<any>>\n}> = ({ token, isOpenState, timelineState }) => {\n\tconst timeline = useO(timelineState)\n\tconst isOpen = useO(isOpenState)\n\tconst setIsOpen = useI(isOpenState)\n\n\treturn (\n\t\t<section className=\"node timeline_log\" data-testid={`timeline-${token.key}`}>\n\t\t\t<header>\n\t\t\t\t<button.OpenClose\n\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\ttestid={`open-close-timeline-${token.key}`}\n\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t/>\n\t\t\t\t<main>\n\t\t\t\t\t<h2>{token.key}</h2>\n\t\t\t\t\t<span className=\"detail length\">\n\t\t\t\t\t\t({timeline.at}/{timeline.history.length})\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"gap\" />\n\t\t\t\t\t<nav>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tundo(token)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={timeline.at === 0}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tundo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tredo(token)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdisabled={timeline.at === timeline.history.length}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tredo\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</nav>\n\t\t\t\t</main>\n\t\t\t</header>\n\t\t\t{isOpen ? (\n\t\t\t\t<main>\n\t\t\t\t\t{timeline.history.map((update, index) =>\n\t\t\t\t\t\tupdate.type !== `state_creation` &&\n\t\t\t\t\t\tupdate.type !== `state_disposal` ? (\n\t\t\t\t\t\t\t<Fragment key={update.token.key + index + timeline.at}>\n\t\t\t\t\t\t\t\t{index === timeline.at ? <YouAreHere /> : null}\n\t\t\t\t\t\t\t\t<article.TimelineUpdate\n\t\t\t\t\t\t\t\t\ttimelineUpdate={update}\n\t\t\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{index === timeline.history.length - 1 &&\n\t\t\t\t\t\t\t\ttimeline.at === timeline.history.length ? (\n\t\t\t\t\t\t\t\t\t<YouAreHere />\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t) : null,\n\t\t\t\t\t)}\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</section>\n\t)\n}\n\nexport const TimelineIndex: FC = () => {\n\tconst { timelineIndex, timelineSelectors, viewIsOpenAtoms, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tconst tokenIds = useO(timelineIndex)\n\n\treturn (\n\t\t<article className=\"index timeline_index\" data-testid=\"timeline-index\">\n\t\t\t{tokenIds.length === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no timelines)</p>\n\t\t\t) : (\n\t\t\t\ttokenIds\n\t\t\t\t\t.filter((token) => !token.key.startsWith(`šāšØ`))\n\t\t\t\t\t.map((token) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TimelineLog\n\t\t\t\t\t\t\t\tkey={token.key}\n\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}\n\t\t\t\t\t\t\t\ttimelineState={findInStore(store, timelineSelectors, token.key)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import type {\n\tReadonlyPureSelectorToken,\n\tRegularAtomToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport { findInStore, type Fn } from \"atom.io/internal\"\nimport { useI, useO } from \"atom.io/react\"\nimport { type FC, useContext } from \"react\"\n\nimport { button } from \"./Button\"\nimport { DevtoolsContext } from \"./store\"\nimport { article } from \"./Updates\"\n\nexport const TransactionLog: FC<{\n\ttoken: TransactionToken<Fn>\n\tisOpenState: RegularAtomToken<boolean>\n\tlogState: ReadonlyPureSelectorToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[]\n\t>\n}> = ({ token, isOpenState, logState }) => {\n\tconst log = useO(logState)\n\tconst isOpen = useO(isOpenState)\n\tconst setIsOpen = useI(isOpenState)\n\n\treturn (\n\t\t<section\n\t\t\tclassName=\"node transaction_log\"\n\t\t\tdata-testid={`transaction-${token.key}`}\n\t\t>\n\t\t\t<header>\n\t\t\t\t<main>\n\t\t\t\t\t<button.OpenClose\n\t\t\t\t\t\tisOpen={isOpen}\n\t\t\t\t\t\ttestid={`open-close-transaction-${token.key}`}\n\t\t\t\t\t\tsetIsOpen={setIsOpen}\n\t\t\t\t\t/>\n\t\t\t\t\t<h2>{token.key}</h2>\n\t\t\t\t</main>\n\t\t\t\t<span className=\"detail length\">({log.length})</span>\n\t\t\t</header>\n\t\t\t{isOpen ? (\n\t\t\t\t<main>\n\t\t\t\t\t{log.map((update, index) => (\n\t\t\t\t\t\t<article.TransactionUpdate\n\t\t\t\t\t\t\tkey={update.token.key + index}\n\t\t\t\t\t\t\tserialNumber={index}\n\t\t\t\t\t\t\ttransactionUpdate={update}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</main>\n\t\t\t) : null}\n\t\t</section>\n\t)\n}\n\nexport const TransactionIndex: FC = () => {\n\tconst { transactionIndex, transactionLogSelectors, viewIsOpenAtoms, store } =\n\t\tuseContext(DevtoolsContext)\n\n\tconst tokenIds = useO(transactionIndex)\n\treturn (\n\t\t<article className=\"index transaction_index\" data-testid=\"transaction-index\">\n\t\t\t{tokenIds.length === 0 ? (\n\t\t\t\t<p className=\"index-empty-state\">(no transactions)</p>\n\t\t\t) : (\n\t\t\t\ttokenIds\n\t\t\t\t\t.filter((token) => !token.key.startsWith(`š`))\n\t\t\t\t\t.map((token) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TransactionLog\n\t\t\t\t\t\t\t\tkey={token.key}\n\t\t\t\t\t\t\t\ttoken={token}\n\t\t\t\t\t\t\t\tisOpenState={findInStore(store, viewIsOpenAtoms, [token.key])}\n\t\t\t\t\t\t\t\tlogState={findInStore(store, transactionLogSelectors, token.key)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t})\n\t\t\t)}\n\t\t</article>\n\t)\n}\n","import \"./devtools.css\"\n\nimport { StoreContext, useI, useO } from \"atom.io/react\"\nimport { LayoutGroup, motion } from \"motion/react\"\nimport { useContext, useRef } from \"react\"\n\nimport { StateIndex } from \"./StateIndex\"\nimport { attachDevtoolsStates, DevtoolsContext } from \"./store\"\nimport { TimelineIndex } from \"./TimelineIndex\"\nimport { TransactionIndex } from \"./TransactionIndex\"\n\nexport const AtomIODevtools: React.FC<{ hideByDefault?: boolean }> = ({\n\thideByDefault = false,\n}) => {\n\tconst store = useContext(StoreContext)\n\treturn (\n\t\t<DevtoolsContext.Provider value={attachDevtoolsStates(store, hideByDefault)}>\n\t\t\t<AtomIODevtoolsInternal />\n\t\t</DevtoolsContext.Provider>\n\t)\n}\n\nconst AtomIODevtoolsInternal = (): React.ReactNode => {\n\tconst constraintsRef = useRef(null)\n\n\tconst {\n\t\tatomIndex,\n\t\tselectorIndex,\n\t\tdevtoolsAreHiddenAtom,\n\t\tdevtoolsAreOpenAtom,\n\t\tdevtoolsViewSelectionAtom,\n\t\tdevtoolsViewOptionsAtom,\n\t} = useContext(DevtoolsContext)\n\n\tconst devtoolsAreHidden = useO(devtoolsAreHiddenAtom)\n\n\tconst setDevtoolsAreOpen = useI(devtoolsAreOpenAtom)\n\tconst devtoolsAreOpen = useO(devtoolsAreOpenAtom)\n\tconst setDevtoolsView = useI(devtoolsViewSelectionAtom)\n\tconst devtoolsView = useO(devtoolsViewSelectionAtom)\n\tconst devtoolsViewOptions = useO(devtoolsViewOptionsAtom)\n\n\tconst mouseHasMoved = useRef(false)\n\n\treturn (\n\t\t<span\n\t\t\tstyle={{\n\t\t\t\tposition: `fixed`,\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\tbottom: 0,\n\t\t\t\tpointerEvents: `none`,\n\t\t\t}}\n\t\t>\n\t\t\t<motion.span\n\t\t\t\tref={constraintsRef}\n\t\t\t\tdata-css=\"atom_io_devtools_zone\"\n\t\t\t\tstyle={{\n\t\t\t\t\tposition: `fixed`,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tpointerEvents: `none`,\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{devtoolsAreHidden ? null : (\n\t\t\t\t<motion.main\n\t\t\t\t\tdrag\n\t\t\t\t\tdragConstraints={constraintsRef}\n\t\t\t\t\tdata-css=\"atom_io_devtools\"\n\t\t\t\t\tdata-testid=\"devtools\"\n\t\t\t\t\ttransition={{ type: `spring`, bounce: 0.25 }}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\tdevtoolsAreOpen\n\t\t\t\t\t\t\t? {}\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\tbackgroundColor: `#0000`,\n\t\t\t\t\t\t\t\t\tborderColor: `#0000`,\n\t\t\t\t\t\t\t\t\tmaxHeight: 28,\n\t\t\t\t\t\t\t\t\tmaxWidth: 33,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{devtoolsAreOpen ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<motion.header>\n\t\t\t\t\t\t\t\t<h1>atom.io</h1>\n\t\t\t\t\t\t\t\t<nav>\n\t\t\t\t\t\t\t\t\t{devtoolsViewOptions.map((viewOption) => (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={viewOption}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-testid={`view-${viewOption}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName={viewOption === devtoolsView ? `active` : ``}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsetDevtoolsView(viewOption)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={viewOption === devtoolsView}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{viewOption}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</nav>\n\t\t\t\t\t\t\t</motion.header>\n\t\t\t\t\t\t\t<motion.main>\n\t\t\t\t\t\t\t\t<LayoutGroup>\n\t\t\t\t\t\t\t\t\t{devtoolsView === `atoms` ? (\n\t\t\t\t\t\t\t\t\t\t<StateIndex tokenIndex={atomIndex} />\n\t\t\t\t\t\t\t\t\t) : devtoolsView === `selectors` ? (\n\t\t\t\t\t\t\t\t\t\t<StateIndex tokenIndex={selectorIndex} />\n\t\t\t\t\t\t\t\t\t) : devtoolsView === `transactions` ? (\n\t\t\t\t\t\t\t\t\t\t<TransactionIndex />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<TimelineIndex />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</LayoutGroup>\n\t\t\t\t\t\t\t</motion.main>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null}\n\t\t\t\t\t<footer>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonMouseDown={() => (mouseHasMoved.current = false)}\n\t\t\t\t\t\t\tonMouseMove={() => (mouseHasMoved.current = true)}\n\t\t\t\t\t\t\tonMouseUp={() => {\n\t\t\t\t\t\t\t\tif (!mouseHasMoved.current) {\n\t\t\t\t\t\t\t\t\tsetDevtoolsAreOpen((open) => !open)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tš\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</footer>\n\t\t\t\t</motion.main>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fn, Store, Transceiver } from "atom.io/internal";
|
|
1
|
+
import { Fn, RootStore, Store, Transceiver } from "atom.io/internal";
|
|
2
2
|
import { Json } from "atom.io/json";
|
|
3
3
|
import * as AtomIO from "atom.io";
|
|
4
4
|
import { AtomToken, WritableToken } from "atom.io";
|
|
@@ -7,7 +7,7 @@ import { Socket } from "atom.io/realtime-server";
|
|
|
7
7
|
import { Socket as Socket$1 } from "socket.io-client";
|
|
8
8
|
|
|
9
9
|
//#region src/realtime-client/continuity/register-and-attempt-confirmed-update.d.ts
|
|
10
|
-
declare const useRegisterAndAttemptConfirmedUpdate: (store:
|
|
10
|
+
declare const useRegisterAndAttemptConfirmedUpdate: (store: RootStore, continuityKey: string, socket: Socket, optimisticUpdates: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>[], confirmedUpdates: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>[]) => (confirmed: AtomIO.TransactionOutcomeEvent<AtomIO.TransactionToken<Fn>>) => void;
|
|
11
11
|
//#endregion
|
|
12
12
|
//#region src/realtime-client/continuity/use-conceal-state.d.ts
|
|
13
13
|
declare function useConcealState(store: Store): (concealed: AtomToken<unknown>[]) => void;
|
|
@@ -49,7 +49,7 @@ declare const confirmedUpdateQueue: AtomIO.RegularAtomToken<AtomIO.TransactionOu
|
|
|
49
49
|
declare function serverAction<F extends Fn>(store: Store, socket: Socket$1, token: AtomIO.TransactionToken<F>): () => void;
|
|
50
50
|
//#endregion
|
|
51
51
|
//#region src/realtime-client/sync-continuity.d.ts
|
|
52
|
-
declare function syncContinuity(store:
|
|
52
|
+
declare function syncContinuity(store: RootStore, socket: Socket$1, continuity: ContinuityToken): () => void;
|
|
53
53
|
//#endregion
|
|
54
54
|
export { confirmedUpdateQueue, myIdState, myIdState__INTERNAL, myUsernameState, optimisticUpdateQueue, pullAtom, pullAtomFamilyMember, pullMutableAtom, pullMutableAtomFamilyMember, pullSelector, pullSelectorFamilyMember, pushState, serverAction, syncContinuity, useConcealState, useRegisterAndAttemptConfirmedUpdate, useRevealState };
|
|
55
55
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["myIdState__INTERNAL: AtomIO.RegularAtomToken<string | undefined>","myIdState: AtomIO.ReadonlyPureSelectorToken<string | undefined>","myUsernameState: AtomIO.RegularAtomToken<string | null>","optimisticUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>","confirmedUpdateQueue: AtomIO.RegularAtomToken<\n\tAtomIO.TransactionOutcomeEvent<any>[]\n>"],"sources":["../../src/realtime-client/continuity/register-and-attempt-confirmed-update.ts","../../src/realtime-client/continuity/use-conceal-state.ts","../../src/realtime-client/continuity/use-reveal-state.ts","../../src/realtime-client/pull-atom.ts","../../src/realtime-client/pull-atom-family-member.ts","../../src/realtime-client/pull-mutable-atom.ts","../../src/realtime-client/pull-mutable-atom-family-member.ts","../../src/realtime-client/pull-selector.ts","../../src/realtime-client/pull-selector-family-member.ts","../../src/realtime-client/push-state.ts","../../src/realtime-client/realtime-client-stores/client-main-store.ts","../../src/realtime-client/realtime-client-stores/client-sync-store.ts","../../src/realtime-client/server-action.ts","../../src/realtime-client/sync-continuity.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cAea,8CAEJ,0CAEC,2BACW,MAAA,CAAO,wBACzB,MAAA,CAAO,iBAAiB,0BAEP,MAAA,CAAO,wBACxB,MAAA,CAAO,iBAAiB,uBAId,MAAA,CAAO,wBAAwB,MAAA,CAAO,iBAAiB;;;iBCxBpD,eAAA,QAAuB,oBACnB;;;iBCFJ,cAAA,QAAsB,mBACnB,IAAA,CAAK;;;iBCCR,mBAAmB,IAAA,CAAK,qBAChC,eACC,iBACD,MAAA,CAAO,iBAAiB;;;iBCAhB,+BAA+B,IAAA,CAAK,qBAC5C,eACC,iBACD,MAAA,CAAO,iBAAiB;;;iBCNhB,0BAA0B,mCAClC,eACC,iBACD,MAAA,CAAO,iBAAiB;;;iBCAhB,sCACL,mCACF,eAAe,iBAAe,MAAA,CAAO,iBAAiB;;;iBCH/C,uBACR,eACC,iBACD,MAAA,CAAO,cAAc;;;iBCDb,mCACR,eACC,iBACD,MAAA,CAAO,cAAc;;;iBCNb,oBAAoB,IAAA,CAAK,qBACjC,eACC,iBACD,cAAc;;;cCNTA,qBAAqB,MAAA,CAAO;cAK5BC,WAAW,MAAA,CAAO;cAMlBC,iBAAiB,MAAA,CAAO;;;cCZxBC,uBAAuB,MAAA,CAAO,iBAC1C,MAAA,CAAO;cAMKC,sBAAsB,MAAA,CAAO,iBACzC,MAAA,CAAO;;;iBCLQ,uBAAuB,WAC/B,eACC,iBACD,MAAA,CAAO,iBAAiB;;;iBCahB,cAAA,QACR,mBACC,sBACI"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { actUponStore, assignTransactionToContinuity, disposeAtom, getEpochNumberOfContinuity, getFromStore, getJsonToken, getUpdateToken, ingestTransactionOutcomeEvent,
|
|
1
|
+
import { actUponStore, assignTransactionToContinuity, disposeAtom, getEpochNumberOfContinuity, getFromStore, getJsonToken, getUpdateToken, ingestTransactionOutcomeEvent, setEpochNumberOfContinuity, setIntoStore, subscribeToState, subscribeToTransaction } from "atom.io/internal";
|
|
2
2
|
import { parseJson } from "atom.io/json";
|
|
3
3
|
import * as AtomIO from "atom.io";
|
|
4
4
|
import { persistSync } from "atom.io/web";
|
|
@@ -70,15 +70,14 @@ const useRegisterAndAttemptConfirmedUpdate = (store, continuityKey, socket, opti
|
|
|
70
70
|
}
|
|
71
71
|
} else {
|
|
72
72
|
store.logger.info(`š§āāļø`, `continuity`, continuityKey, `has no optimistic updates to deal with`);
|
|
73
|
-
const isRoot = isRootStore(store);
|
|
74
73
|
let continuityEpoch;
|
|
75
|
-
|
|
74
|
+
continuityEpoch = getEpochNumberOfContinuity(store, continuityKey);
|
|
76
75
|
if (continuityEpoch === confirmed.epoch - 1) {
|
|
77
76
|
store.logger.info(`ā
`, `continuity`, continuityKey, `integrating update #${confirmed.epoch} (${confirmed.token.key} ${confirmed.id})`);
|
|
78
77
|
ingestTransactionOutcomeEvent(store, confirmed, `newValue`);
|
|
79
78
|
socket.emit(`ack:${continuityKey}`, confirmed.epoch);
|
|
80
79
|
setEpochNumberOfContinuity(store, continuityKey, confirmed.epoch);
|
|
81
|
-
} else if (
|
|
80
|
+
} else if (continuityEpoch !== void 0) {
|
|
82
81
|
store.logger.info(`š§āāļø`, `continuity`, continuityKey, `received update #${confirmed.epoch} but still waiting for update #${continuityEpoch + 1}`, {
|
|
83
82
|
clientEpoch: continuityEpoch,
|
|
84
83
|
serverEpoch: confirmed.epoch
|