atom.io 0.46.12 → 0.46.13
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/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/index.js.map +1 -1
- package/dist/react-devtools/index.js +24 -5
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime/index.js +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/package.json +10 -10
- package/src/eslint-plugin/rules/exact-catch-types.ts +1 -1
- package/src/react-devtools/StateIndex.tsx +8 -1
- package/src/react-devtools/json-editor/editors-by-type/non-json.tsx +17 -10
- package/src/react-devtools/json-editor/json-editor-internal.tsx +8 -1
- package/src/realtime/shared-room-store.ts +1 -1
|
@@ -100,7 +100,7 @@ const exactCatchTypes = createRule$1({
|
|
|
100
100
|
}
|
|
101
101
|
const errorSymbolsToRepresent = new Set(acceptableErrorSymbols);
|
|
102
102
|
for (const element of catchArray.elements) {
|
|
103
|
-
if (
|
|
103
|
+
if (element?.type !== AST_NODE_TYPES.Identifier) continue;
|
|
104
104
|
const constructorTsNode = parserServices.esTreeNodeToTSNodeMap.get(element);
|
|
105
105
|
const constructorType = checker.getTypeAtLocation(constructorTsNode);
|
|
106
106
|
const constructorName = element.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["createRule","exactCatchTypes: ESLintUtils.RuleModule<\n\t`extraneousErrorTypes` | `invalidCatchProperty` | `missingCatchProperty`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n>","functionName: string | null","typeArguments: TSESTree.TSTypeParameterInstantiation | undefined","catchProperty: TSESTree.Property | undefined","acceptableErrorSymbols: TsSymbol[]","instanceType: Type | undefined","explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin","Rules.exactCatchTypes","Rules.explicitStateTypes"],"sources":["../../src/eslint-plugin/rules/exact-catch-types.ts","../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":["import type { TSESTree } from \"@typescript-eslint/utils\"\nimport { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\"\nimport type {\n\tInterfaceType,\n\tSymbol as TsSymbol,\n\tType,\n\tTypeNode,\n} from \"typescript\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS_WITH_CATCH = [\n\t`atom`,\n\t`atomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\nconst FAMILY_FUNCTIONS = [`atomFamily`, `selectorFamily`]\n\nexport const exactCatchTypes: ESLintUtils.RuleModule<\n\t`extraneousErrorTypes` | `invalidCatchProperty` | `missingCatchProperty`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `catch-constructor-type`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `Ensures that when an error type (E) is provided to an atom, the 'catch' property is set and all constructors in it are assignable to E.`,\n\t\t},\n\t\tmessages: {\n\t\t\tmissingCatchProperty:\n\t\t\t\t`This {{functionName}} was provided the error type \\`{{errorTypeName}}\\` ` +\n\t\t\t\t`but the required 'catch' property is missing from its options. ` +\n\t\t\t\t`Either remove \\`{{errorTypeName}}\\`, or add \\`catch: [{{errorTypeName}}]\\` to the options object.`,\n\t\t\tinvalidCatchProperty:\n\t\t\t\t`This {{functionName}} was provided a catch array containing the class \\`{{constructorName}}\\`. ` +\n\t\t\t\t`However, that class is not represented in the {{functionName}}'s error type, \\`{{errorTypeName}}\\`. ` +\n\t\t\t\t`As a result, it might catch errors that the {{functionName}} is not designed to handle. ` +\n\t\t\t\t`Either include \\`{{constructorName}}\\` in the {{functionName}}'s error type, or remove it from the 'catch' array.`,\n\t\t\textraneousErrorTypes:\n\t\t\t\t`This {{functionName}} was provided an error type including the class \\`{{errorTypeName}}\\`, ` +\n\t\t\t\t`but its 'catch' property doesn't include a constructor for that class. ` +\n\t\t\t\t`Either include a constructor for \\`{{errorTypeName}}\\` in the 'catch' array, or remove \\`{{errorTypeName}}\\` as a possible error type.`,\n\t\t},\n\t\tschema: [],\n\t},\n\tdefaultOptions: [],\n\tcreate(context) {\n\t\tconst parserServices = ESLintUtils.getParserServices(context)\n\t\tconst checker = parserServices.program.getTypeChecker()\n\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst {\n\t\t\t\t\tcallee,\n\t\t\t\t\ttypeArguments: directTypeArguments,\n\t\t\t\t\targuments: callArguments,\n\t\t\t\t} = node\n\n\t\t\t\tlet errorParamIndex = 1\n\n\t\t\t\t// Check if the function call is one of the targeted state functions\n\t\t\t\tlet functionName: string | null = null\n\t\t\t\tif (callee.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\tif (STATE_FUNCTIONS_WITH_CATCH.includes(callee.name)) {\n\t\t\t\t\t\tfunctionName = callee.name\n\t\t\t\t\t}\n\t\t\t\t} else if (callee.type === AST_NODE_TYPES.MemberExpression) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcallee.property.type === AST_NODE_TYPES.Identifier &&\n\t\t\t\t\t\tSTATE_FUNCTIONS_WITH_CATCH.includes(callee.property.name)\n\t\t\t\t\t) {\n\t\t\t\t\t\tfunctionName = callee.property.name\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!functionName) return\n\n\t\t\t\t// Where do the type arguments come from?\n\t\t\t\tlet typeArguments: TSESTree.TSTypeParameterInstantiation | undefined\n\t\t\t\tif (directTypeArguments) {\n\t\t\t\t\ttypeArguments = directTypeArguments\n\t\t\t\t} else {\n\t\t\t\t\tconst parent = node.parent\n\t\t\t\t\tif (\n\t\t\t\t\t\tparent?.type === AST_NODE_TYPES.VariableDeclarator &&\n\t\t\t\t\t\tparent.init === node\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Check if the VariableDeclarator has an id with a TypeAnnotation\n\t\t\t\t\t\tconst declaratorId = parent.id\n\t\t\t\t\t\tif (declaratorId.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t\t// Check for 'const myAtom: AtomToken<string> = ...'\n\t\t\t\t\t\t\tconst typeAnnotation = declaratorId.typeAnnotation?.typeAnnotation\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeAnnotation &&\n\t\t\t\t\t\t\t\t`typeArguments` in typeAnnotation &&\n\t\t\t\t\t\t\t\ttypeAnnotation.typeArguments\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttypeArguments = typeAnnotation.typeArguments\n\t\t\t\t\t\t\t\terrorParamIndex = 2 // AtomToken<T, K, E>\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\n\t\t\t\tconst optionsObject = callArguments[0]\n\n\t\t\t\tif (optionsObject?.type !== AST_NODE_TYPES.ObjectExpression) return\n\n\t\t\t\tconst isFamilyDeclaration = FAMILY_FUNCTIONS.includes(functionName)\n\t\t\t\tif (isFamilyDeclaration) {\n\t\t\t\t\terrorParamIndex = 2 // atomFamily<T, K, E>\n\t\t\t\t}\n\n\t\t\t\tconst errorTypeNode = typeArguments\n\t\t\t\t\t? typeArguments.params[errorParamIndex]\n\t\t\t\t\t: undefined\n\t\t\t\tif (!errorTypeNode) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlet catchProperty: TSESTree.Property | undefined\n\t\t\t\toptionsObject.properties.forEach((property) => {\n\t\t\t\t\tif (property.type === AST_NODE_TYPES.Property) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(property.key.type === AST_NODE_TYPES.Identifier &&\n\t\t\t\t\t\t\t\tproperty.key.name === `catch`) ||\n\t\t\t\t\t\t\t(property.key.type === AST_NODE_TYPES.Literal &&\n\t\t\t\t\t\t\t\tproperty.key.value === `catch`)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcatchProperty = property\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tconst typeNode = parserServices.esTreeNodeToTSNodeMap.get(\n\t\t\t\t\terrorTypeNode,\n\t\t\t\t) as TypeNode\n\t\t\t\t// Get the TypeScript Type object for E\n\t\t\t\tconst errorTypeTs = checker.getTypeFromTypeNode(typeNode)\n\t\t\t\tconst errorTypeName = checker.typeToString(errorTypeTs)\n\n\t\t\t\tif (!catchProperty) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: optionsObject,\n\t\t\t\t\t\tmessageId: `missingCatchProperty`,\n\t\t\t\t\t\tdata: { functionName, errorTypeName },\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// --- New Validation: Check Constructor Types ---\n\t\t\t\tconst catchArray = catchProperty.value\n\t\t\t\tif (catchArray.type !== AST_NODE_TYPES.ArrayExpression) {\n\t\t\t\t\t// We only check array literals (e.g., [Ctor1, Ctor2])\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// 3. Collect all acceptable nominal symbols from E\n\t\t\t\tconst acceptableErrorSymbols: TsSymbol[] = []\n\n\t\t\t\t// Check if E is a Union Type\n\t\t\t\tif (errorTypeTs.isUnion()) {\n\t\t\t\t\t// Add the symbol of every member of the union (e.g., Symbol(SpecialError), Symbol(FancyError))\n\t\t\t\t\tfor (const memberType of errorTypeTs.types) {\n\t\t\t\t\t\tconst symbol = memberType.getSymbol()\n\t\t\t\t\t\tif (symbol) {\n\t\t\t\t\t\t\tacceptableErrorSymbols.push(symbol)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// E is a single type, add its symbol\n\t\t\t\t\tconst symbol = errorTypeTs.getSymbol()\n\t\t\t\t\tif (symbol) {\n\t\t\t\t\t\tacceptableErrorSymbols.push(symbol)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (catchArray.elements.length === 0) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: catchProperty,\n\t\t\t\t\t\tmessageId: `missingCatchProperty`,\n\t\t\t\t\t\tdata: { functionName, errorTypeName },\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst errorSymbolsToRepresent = new Set(acceptableErrorSymbols)\n\n\t\t\t\t// Iterate over each constructor reference in the 'catch' array\n\t\t\t\tfor (const element of catchArray.elements) {\n\t\t\t\t\tif (!element || element.type !== AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t// Only check simple identifier references (e.g., [ClientError])\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get the type of the constructor identifier (e.g., the Type of 'Error')\n\t\t\t\t\tconst constructorTsNode =\n\t\t\t\t\t\tparserServices.esTreeNodeToTSNodeMap.get(element)\n\t\t\t\t\tconst constructorType = checker.getTypeAtLocation(constructorTsNode)\n\t\t\t\t\tconst constructorName = element.name\n\n\t\t\t\t\t// console.log(`constructorName`, constructorName)\n\n\t\t\t\t\t// Extract the instance type from the constructor type.\n\t\t\t\t\t// e.g., turn 'typeof ClientError' into 'ClientError'\n\t\t\t\t\tlet instanceType: Type | undefined\n\t\t\t\t\tif (\n\t\t\t\t\t\t(constructorType as InterfaceType).getConstructSignatures().length >\n\t\t\t\t\t\t0\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Get the return type of the constructor signature\n\t\t\t\t\t\tconst signature = (\n\t\t\t\t\t\t\tconstructorType as InterfaceType\n\t\t\t\t\t\t).getConstructSignatures()[0]\n\t\t\t\t\t\tinstanceType = signature.getReturnType()\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we couldn't get the instance type, skip the check\n\n\t\t\t\t\tconst constructorInstanceSymbol = instanceType?.getSymbol()\n\t\t\t\t\tif (!constructorInstanceSymbol) continue\n\n\t\t\t\t\t// Check for symbol identity\n\t\t\t\t\tif (acceptableErrorSymbols.includes(constructorInstanceSymbol)) {\n\t\t\t\t\t\terrorSymbolsToRepresent.delete(constructorInstanceSymbol)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tnode: element,\n\t\t\t\t\t\t\tmessageId: `invalidCatchProperty`,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tfunctionName,\n\t\t\t\t\t\t\t\tconstructorName: constructorName,\n\t\t\t\t\t\t\t\terrorTypeName: errorTypeName,\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\n\t\t\t\tfor (const errorSymbol of errorSymbolsToRepresent) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: catchProperty,\n\t\t\t\t\t\tmessageId: `extraneousErrorTypes`,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\terrorTypeName: checker.symbolToString(errorSymbol),\n\t\t\t\t\t\t\tfunctionName,\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","/* eslint-disable @typescript-eslint/switch-exhaustiveness-check */\nimport { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS = [\n\t`atom`,\n\t`atomFamily`,\n\t`mutableAtom`,\n\t`mutableAtomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\n\ntype Options = [\n\t{\n\t\tpermitAnnotation?: boolean\n\t},\n]\n\nexport const explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `explicit-state-types`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `State declarations must have generic type arguments directly passed to them`,\n\t\t},\n\t\tmessages: {\n\t\t\tnoTypeArgument: `State declarations must have generic type arguments directly passed to them.`,\n\t\t\tnoTypeArgumentOrAnnotation: `State declarations must have generic type arguments directly passed to them, or a top-level type annotation.`,\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: `object`,\n\t\t\t\tproperties: {\n\t\t\t\t\tpermitAnnotation: {\n\t\t\t\t\t\ttype: `boolean`,\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t],\n\t},\n\tdefaultOptions: [\n\t\t{\n\t\t\tpermitAnnotation: false,\n\t\t},\n\t],\n\tcreate(context) {\n\t\tconst options = context.options[0]\n\t\tconst permitAnnotation = options?.permitAnnotation ?? false\n\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst callee = node.callee\n\n\t\t\t\tswitch (callee.type) {\n\t\t\t\t\tcase `Identifier`:\n\t\t\t\t\t\tif (STATE_FUNCTIONS.includes(callee.name) === false) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase `MemberExpression`:\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(callee.property.type === `Identifier` &&\n\t\t\t\t\t\t\t\tSTATE_FUNCTIONS.includes(callee.property.name)) === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Check for the *required* generic type argument first\n\t\t\t\tif (node.typeArguments) {\n\t\t\t\t\treturn // Generic type argument is present, no error\n\t\t\t\t}\n\n\t\t\t\t// If generic arguments are missing, check if the top-level annotation exception is enabled AND present\n\t\t\t\tif (permitAnnotation) {\n\t\t\t\t\tlet hasAnnotation = false\n\t\t\t\t\t// Check if the CallExpression is the initializer of a variable declarator\n\t\t\t\t\tconst parent = node.parent\n\t\t\t\t\tif (\n\t\t\t\t\t\tparent?.type === AST_NODE_TYPES.VariableDeclarator &&\n\t\t\t\t\t\tparent.init === node\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Check if the VariableDeclarator has an id with a TypeAnnotation\n\t\t\t\t\t\tconst declaratorId = parent.id\n\t\t\t\t\t\tif (declaratorId.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t\t// Check for 'const myAtom: AtomToken<string> = ...'\n\t\t\t\t\t\t\thasAnnotation = Boolean(declaratorId.typeAnnotation)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (hasAnnotation) {\n\t\t\t\t\t\treturn // Exception met: type annotation is on the variable declaration\n\t\t\t\t\t}\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tmessageId: `noTypeArgumentOrAnnotation`,\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: `noTypeArgument`,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t},\n})\n","export * from \"./exact-catch-types\"\nexport * from \"./explicit-state-types\"\n","import type { ESLint } from \"eslint\"\n\nimport * as Rules from \"./rules\"\n\nexport { Rules }\n\nconst plugin: ESLint.Plugin = {\n\trules: {\n\t\t\"exact-catch-types\": Rules.exactCatchTypes as any,\n\t\t\"explicit-state-types\": Rules.explicitStateTypes as any,\n\t},\n} satisfies ESLint.Plugin\n\nexport default plugin\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["createRule","exactCatchTypes: ESLintUtils.RuleModule<\n\t`extraneousErrorTypes` | `invalidCatchProperty` | `missingCatchProperty`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n>","functionName: string | null","typeArguments: TSESTree.TSTypeParameterInstantiation | undefined","catchProperty: TSESTree.Property | undefined","acceptableErrorSymbols: TsSymbol[]","instanceType: Type | undefined","explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n>","plugin: ESLint.Plugin","Rules.exactCatchTypes","Rules.explicitStateTypes"],"sources":["../../src/eslint-plugin/rules/exact-catch-types.ts","../../src/eslint-plugin/rules/explicit-state-types.ts","../../src/eslint-plugin/rules/index.ts","../../src/eslint-plugin/index.ts"],"sourcesContent":["import type { TSESTree } from \"@typescript-eslint/utils\"\nimport { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\"\nimport type {\n\tInterfaceType,\n\tSymbol as TsSymbol,\n\tType,\n\tTypeNode,\n} from \"typescript\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS_WITH_CATCH = [\n\t`atom`,\n\t`atomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\nconst FAMILY_FUNCTIONS = [`atomFamily`, `selectorFamily`]\n\nexport const exactCatchTypes: ESLintUtils.RuleModule<\n\t`extraneousErrorTypes` | `invalidCatchProperty` | `missingCatchProperty`,\n\t[],\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `catch-constructor-type`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `Ensures that when an error type (E) is provided to an atom, the 'catch' property is set and all constructors in it are assignable to E.`,\n\t\t},\n\t\tmessages: {\n\t\t\tmissingCatchProperty:\n\t\t\t\t`This {{functionName}} was provided the error type \\`{{errorTypeName}}\\` ` +\n\t\t\t\t`but the required 'catch' property is missing from its options. ` +\n\t\t\t\t`Either remove \\`{{errorTypeName}}\\`, or add \\`catch: [{{errorTypeName}}]\\` to the options object.`,\n\t\t\tinvalidCatchProperty:\n\t\t\t\t`This {{functionName}} was provided a catch array containing the class \\`{{constructorName}}\\`. ` +\n\t\t\t\t`However, that class is not represented in the {{functionName}}'s error type, \\`{{errorTypeName}}\\`. ` +\n\t\t\t\t`As a result, it might catch errors that the {{functionName}} is not designed to handle. ` +\n\t\t\t\t`Either include \\`{{constructorName}}\\` in the {{functionName}}'s error type, or remove it from the 'catch' array.`,\n\t\t\textraneousErrorTypes:\n\t\t\t\t`This {{functionName}} was provided an error type including the class \\`{{errorTypeName}}\\`, ` +\n\t\t\t\t`but its 'catch' property doesn't include a constructor for that class. ` +\n\t\t\t\t`Either include a constructor for \\`{{errorTypeName}}\\` in the 'catch' array, or remove \\`{{errorTypeName}}\\` as a possible error type.`,\n\t\t},\n\t\tschema: [],\n\t},\n\tdefaultOptions: [],\n\tcreate(context) {\n\t\tconst parserServices = ESLintUtils.getParserServices(context)\n\t\tconst checker = parserServices.program.getTypeChecker()\n\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst {\n\t\t\t\t\tcallee,\n\t\t\t\t\ttypeArguments: directTypeArguments,\n\t\t\t\t\targuments: callArguments,\n\t\t\t\t} = node\n\n\t\t\t\tlet errorParamIndex = 1\n\n\t\t\t\t// Check if the function call is one of the targeted state functions\n\t\t\t\tlet functionName: string | null = null\n\t\t\t\tif (callee.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\tif (STATE_FUNCTIONS_WITH_CATCH.includes(callee.name)) {\n\t\t\t\t\t\tfunctionName = callee.name\n\t\t\t\t\t}\n\t\t\t\t} else if (callee.type === AST_NODE_TYPES.MemberExpression) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tcallee.property.type === AST_NODE_TYPES.Identifier &&\n\t\t\t\t\t\tSTATE_FUNCTIONS_WITH_CATCH.includes(callee.property.name)\n\t\t\t\t\t) {\n\t\t\t\t\t\tfunctionName = callee.property.name\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!functionName) return\n\n\t\t\t\t// Where do the type arguments come from?\n\t\t\t\tlet typeArguments: TSESTree.TSTypeParameterInstantiation | undefined\n\t\t\t\tif (directTypeArguments) {\n\t\t\t\t\ttypeArguments = directTypeArguments\n\t\t\t\t} else {\n\t\t\t\t\tconst parent = node.parent\n\t\t\t\t\tif (\n\t\t\t\t\t\tparent?.type === AST_NODE_TYPES.VariableDeclarator &&\n\t\t\t\t\t\tparent.init === node\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Check if the VariableDeclarator has an id with a TypeAnnotation\n\t\t\t\t\t\tconst declaratorId = parent.id\n\t\t\t\t\t\tif (declaratorId.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t\t// Check for 'const myAtom: AtomToken<string> = ...'\n\t\t\t\t\t\t\tconst typeAnnotation = declaratorId.typeAnnotation?.typeAnnotation\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\ttypeAnnotation &&\n\t\t\t\t\t\t\t\t`typeArguments` in typeAnnotation &&\n\t\t\t\t\t\t\t\ttypeAnnotation.typeArguments\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttypeArguments = typeAnnotation.typeArguments\n\t\t\t\t\t\t\t\terrorParamIndex = 2 // AtomToken<T, K, E>\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\n\t\t\t\tconst optionsObject = callArguments[0]\n\n\t\t\t\tif (optionsObject?.type !== AST_NODE_TYPES.ObjectExpression) return\n\n\t\t\t\tconst isFamilyDeclaration = FAMILY_FUNCTIONS.includes(functionName)\n\t\t\t\tif (isFamilyDeclaration) {\n\t\t\t\t\terrorParamIndex = 2 // atomFamily<T, K, E>\n\t\t\t\t}\n\n\t\t\t\tconst errorTypeNode = typeArguments\n\t\t\t\t\t? typeArguments.params[errorParamIndex]\n\t\t\t\t\t: undefined\n\t\t\t\tif (!errorTypeNode) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tlet catchProperty: TSESTree.Property | undefined\n\t\t\t\toptionsObject.properties.forEach((property) => {\n\t\t\t\t\tif (property.type === AST_NODE_TYPES.Property) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(property.key.type === AST_NODE_TYPES.Identifier &&\n\t\t\t\t\t\t\t\tproperty.key.name === `catch`) ||\n\t\t\t\t\t\t\t(property.key.type === AST_NODE_TYPES.Literal &&\n\t\t\t\t\t\t\t\tproperty.key.value === `catch`)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcatchProperty = property\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tconst typeNode = parserServices.esTreeNodeToTSNodeMap.get(\n\t\t\t\t\terrorTypeNode,\n\t\t\t\t) as TypeNode\n\t\t\t\t// Get the TypeScript Type object for E\n\t\t\t\tconst errorTypeTs = checker.getTypeFromTypeNode(typeNode)\n\t\t\t\tconst errorTypeName = checker.typeToString(errorTypeTs)\n\n\t\t\t\tif (!catchProperty) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: optionsObject,\n\t\t\t\t\t\tmessageId: `missingCatchProperty`,\n\t\t\t\t\t\tdata: { functionName, errorTypeName },\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// --- New Validation: Check Constructor Types ---\n\t\t\t\tconst catchArray = catchProperty.value\n\t\t\t\tif (catchArray.type !== AST_NODE_TYPES.ArrayExpression) {\n\t\t\t\t\t// We only check array literals (e.g., [Ctor1, Ctor2])\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// 3. Collect all acceptable nominal symbols from E\n\t\t\t\tconst acceptableErrorSymbols: TsSymbol[] = []\n\n\t\t\t\t// Check if E is a Union Type\n\t\t\t\tif (errorTypeTs.isUnion()) {\n\t\t\t\t\t// Add the symbol of every member of the union (e.g., Symbol(SpecialError), Symbol(FancyError))\n\t\t\t\t\tfor (const memberType of errorTypeTs.types) {\n\t\t\t\t\t\tconst symbol = memberType.getSymbol()\n\t\t\t\t\t\tif (symbol) {\n\t\t\t\t\t\t\tacceptableErrorSymbols.push(symbol)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// E is a single type, add its symbol\n\t\t\t\t\tconst symbol = errorTypeTs.getSymbol()\n\t\t\t\t\tif (symbol) {\n\t\t\t\t\t\tacceptableErrorSymbols.push(symbol)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (catchArray.elements.length === 0) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: catchProperty,\n\t\t\t\t\t\tmessageId: `missingCatchProperty`,\n\t\t\t\t\t\tdata: { functionName, errorTypeName },\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst errorSymbolsToRepresent = new Set(acceptableErrorSymbols)\n\n\t\t\t\t// Iterate over each constructor reference in the 'catch' array\n\t\t\t\tfor (const element of catchArray.elements) {\n\t\t\t\t\tif (element?.type !== AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t// Only check simple identifier references (e.g., [ClientError])\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// Get the type of the constructor identifier (e.g., the Type of 'Error')\n\t\t\t\t\tconst constructorTsNode =\n\t\t\t\t\t\tparserServices.esTreeNodeToTSNodeMap.get(element)\n\t\t\t\t\tconst constructorType = checker.getTypeAtLocation(constructorTsNode)\n\t\t\t\t\tconst constructorName = element.name\n\n\t\t\t\t\t// console.log(`constructorName`, constructorName)\n\n\t\t\t\t\t// Extract the instance type from the constructor type.\n\t\t\t\t\t// e.g., turn 'typeof ClientError' into 'ClientError'\n\t\t\t\t\tlet instanceType: Type | undefined\n\t\t\t\t\tif (\n\t\t\t\t\t\t(constructorType as InterfaceType).getConstructSignatures().length >\n\t\t\t\t\t\t0\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Get the return type of the constructor signature\n\t\t\t\t\t\tconst signature = (\n\t\t\t\t\t\t\tconstructorType as InterfaceType\n\t\t\t\t\t\t).getConstructSignatures()[0]\n\t\t\t\t\t\tinstanceType = signature.getReturnType()\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we couldn't get the instance type, skip the check\n\n\t\t\t\t\tconst constructorInstanceSymbol = instanceType?.getSymbol()\n\t\t\t\t\tif (!constructorInstanceSymbol) continue\n\n\t\t\t\t\t// Check for symbol identity\n\t\t\t\t\tif (acceptableErrorSymbols.includes(constructorInstanceSymbol)) {\n\t\t\t\t\t\terrorSymbolsToRepresent.delete(constructorInstanceSymbol)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.report({\n\t\t\t\t\t\t\tnode: element,\n\t\t\t\t\t\t\tmessageId: `invalidCatchProperty`,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tfunctionName,\n\t\t\t\t\t\t\t\tconstructorName: constructorName,\n\t\t\t\t\t\t\t\terrorTypeName: errorTypeName,\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\n\t\t\t\tfor (const errorSymbol of errorSymbolsToRepresent) {\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode: catchProperty,\n\t\t\t\t\t\tmessageId: `extraneousErrorTypes`,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\terrorTypeName: checker.symbolToString(errorSymbol),\n\t\t\t\t\t\t\tfunctionName,\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","/* eslint-disable @typescript-eslint/switch-exhaustiveness-check */\nimport { AST_NODE_TYPES, ESLintUtils } from \"@typescript-eslint/utils\"\n\nconst createRule = ESLintUtils.RuleCreator(\n\t(name) => `https://atom.io.fyi/docs/eslint-plugin#${name}`,\n)\n\nconst STATE_FUNCTIONS = [\n\t`atom`,\n\t`atomFamily`,\n\t`mutableAtom`,\n\t`mutableAtomFamily`,\n\t`selector`,\n\t`selectorFamily`,\n]\n\ntype Options = [\n\t{\n\t\tpermitAnnotation?: boolean\n\t},\n]\n\nexport const explicitStateTypes: ESLintUtils.RuleModule<\n\t`noTypeArgument` | `noTypeArgumentOrAnnotation`,\n\tOptions,\n\tunknown,\n\tESLintUtils.RuleListener\n> = createRule({\n\tname: `explicit-state-types`,\n\tmeta: {\n\t\ttype: `problem`,\n\t\tdocs: {\n\t\t\tdescription: `State declarations must have generic type arguments directly passed to them`,\n\t\t},\n\t\tmessages: {\n\t\t\tnoTypeArgument: `State declarations must have generic type arguments directly passed to them.`,\n\t\t\tnoTypeArgumentOrAnnotation: `State declarations must have generic type arguments directly passed to them, or a top-level type annotation.`,\n\t\t},\n\t\tschema: [\n\t\t\t{\n\t\t\t\ttype: `object`,\n\t\t\t\tproperties: {\n\t\t\t\t\tpermitAnnotation: {\n\t\t\t\t\t\ttype: `boolean`,\n\t\t\t\t\t\tdefault: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t],\n\t},\n\tdefaultOptions: [\n\t\t{\n\t\t\tpermitAnnotation: false,\n\t\t},\n\t],\n\tcreate(context) {\n\t\tconst options = context.options[0]\n\t\tconst permitAnnotation = options?.permitAnnotation ?? false\n\n\t\treturn {\n\t\t\tCallExpression(node) {\n\t\t\t\tconst callee = node.callee\n\n\t\t\t\tswitch (callee.type) {\n\t\t\t\t\tcase `Identifier`:\n\t\t\t\t\t\tif (STATE_FUNCTIONS.includes(callee.name) === false) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase `MemberExpression`:\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(callee.property.type === `Identifier` &&\n\t\t\t\t\t\t\t\tSTATE_FUNCTIONS.includes(callee.property.name)) === false\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Check for the *required* generic type argument first\n\t\t\t\tif (node.typeArguments) {\n\t\t\t\t\treturn // Generic type argument is present, no error\n\t\t\t\t}\n\n\t\t\t\t// If generic arguments are missing, check if the top-level annotation exception is enabled AND present\n\t\t\t\tif (permitAnnotation) {\n\t\t\t\t\tlet hasAnnotation = false\n\t\t\t\t\t// Check if the CallExpression is the initializer of a variable declarator\n\t\t\t\t\tconst parent = node.parent\n\t\t\t\t\tif (\n\t\t\t\t\t\tparent?.type === AST_NODE_TYPES.VariableDeclarator &&\n\t\t\t\t\t\tparent.init === node\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Check if the VariableDeclarator has an id with a TypeAnnotation\n\t\t\t\t\t\tconst declaratorId = parent.id\n\t\t\t\t\t\tif (declaratorId.type === AST_NODE_TYPES.Identifier) {\n\t\t\t\t\t\t\t// Check for 'const myAtom: AtomToken<string> = ...'\n\t\t\t\t\t\t\thasAnnotation = Boolean(declaratorId.typeAnnotation)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (hasAnnotation) {\n\t\t\t\t\t\treturn // Exception met: type annotation is on the variable declaration\n\t\t\t\t\t}\n\t\t\t\t\tcontext.report({\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\tmessageId: `noTypeArgumentOrAnnotation`,\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcontext.report({\n\t\t\t\t\tnode,\n\t\t\t\t\tmessageId: `noTypeArgument`,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t},\n})\n","export * from \"./exact-catch-types\"\nexport * from \"./explicit-state-types\"\n","import type { ESLint } from \"eslint\"\n\nimport * as Rules from \"./rules\"\n\nexport { Rules }\n\nconst plugin: ESLint.Plugin = {\n\trules: {\n\t\t\"exact-catch-types\": Rules.exactCatchTypes as any,\n\t\t\"explicit-state-types\": Rules.explicitStateTypes as any,\n\t},\n} satisfies ESLint.Plugin\n\nexport default plugin\n"],"mappings":"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"}
|
|
@@ -454,13 +454,20 @@ const TextInput = ({ value, set, label, placeholder, autoSize = false, testid })
|
|
|
454
454
|
//#endregion
|
|
455
455
|
//#region src/react-devtools/json-editor/editors-by-type/non-json.tsx
|
|
456
456
|
const NonJsonEditor = ({ data, testid }) => {
|
|
457
|
-
|
|
457
|
+
if (data === void 0) return /* @__PURE__ */ jsx(ElasticInput, {
|
|
458
458
|
disabled: true,
|
|
459
459
|
value: "undefined",
|
|
460
460
|
"data-testid": `${testid}-undefined`
|
|
461
|
-
})
|
|
461
|
+
});
|
|
462
|
+
let stringified$1;
|
|
463
|
+
try {
|
|
464
|
+
stringified$1 = JSON.stringify(data);
|
|
465
|
+
} catch (_) {
|
|
466
|
+
stringified$1 = `?`;
|
|
467
|
+
}
|
|
468
|
+
return /* @__PURE__ */ jsx(ElasticInput, {
|
|
462
469
|
disabled: true,
|
|
463
|
-
value: Object.getPrototypeOf(data).constructor.name + ` ` +
|
|
470
|
+
value: Object.getPrototypeOf(data).constructor.name + ` ` + stringified$1,
|
|
464
471
|
"data-testid": `${testid}-non-json-${Object.getPrototypeOf(data).constructor.name}`
|
|
465
472
|
});
|
|
466
473
|
};
|
|
@@ -478,6 +485,12 @@ const JsonEditor_INTERNAL = ({ data, set, name, rename, remove, recast, path = [
|
|
|
478
485
|
const disabled = isReadonly(path);
|
|
479
486
|
const dataIsTree = refined.type === `array` || refined.type === `object`;
|
|
480
487
|
const dataIsExpandable = dataIsTree && isOpen !== void 0 && setIsOpen;
|
|
488
|
+
let stringified$1;
|
|
489
|
+
try {
|
|
490
|
+
stringified$1 = JSON.stringify(data);
|
|
491
|
+
} catch (_) {
|
|
492
|
+
stringified$1 = `?`;
|
|
493
|
+
}
|
|
481
494
|
return isHidden(path) ? null : /* @__PURE__ */ jsx(Components.ErrorBoundary, { children: /* @__PURE__ */ jsxs(Components.EditorWrapper, {
|
|
482
495
|
className,
|
|
483
496
|
style,
|
|
@@ -503,7 +516,7 @@ const JsonEditor_INTERNAL = ({ data, set, name, rename, remove, recast, path = [
|
|
|
503
516
|
}) }),
|
|
504
517
|
dataIsTree ? /* @__PURE__ */ jsxs(Fragment$1, { children: [isOpen !== void 0 && setIsOpen ? /* @__PURE__ */ jsx("span", {
|
|
505
518
|
className: "json_viewer",
|
|
506
|
-
children:
|
|
519
|
+
children: stringified$1
|
|
507
520
|
}) : null, recast ? /* @__PURE__ */ jsx("select", {
|
|
508
521
|
onChange: (e) => {
|
|
509
522
|
recast(e.target.value);
|
|
@@ -1052,6 +1065,12 @@ const StateIndexLeafNode = ({ node, isOpenState, typeState, dispose }) => {
|
|
|
1052
1065
|
const stateType = stateTypeLoadable instanceof Promise ? `Promise` : stateTypeLoadable;
|
|
1053
1066
|
const isPrimitive = Boolean(primitiveRefinery.refine(state));
|
|
1054
1067
|
const path = node.family ? [node.family.key, node.family.subKey] : [node.key];
|
|
1068
|
+
let stringified$1;
|
|
1069
|
+
try {
|
|
1070
|
+
stringified$1 = JSON.stringify(state);
|
|
1071
|
+
} catch (_) {
|
|
1072
|
+
stringified$1 = `?`;
|
|
1073
|
+
}
|
|
1055
1074
|
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("header", { children: [/* @__PURE__ */ jsxs("main", {
|
|
1056
1075
|
onClick: () => {
|
|
1057
1076
|
console.log(node, getFromStore(store, node));
|
|
@@ -1082,7 +1101,7 @@ const StateIndexLeafNode = ({ node, isOpenState, typeState, dispose }) => {
|
|
|
1082
1101
|
]
|
|
1083
1102
|
}), /* @__PURE__ */ jsxs("footer", { children: [isPrimitive ? /* @__PURE__ */ jsx(StoreEditor, { token: node }) : /* @__PURE__ */ jsx("div", {
|
|
1084
1103
|
className: "json_viewer",
|
|
1085
|
-
children:
|
|
1104
|
+
children: stringified$1
|
|
1086
1105
|
}), dispose ? /* @__PURE__ */ jsx(DEFAULT_JSON_EDITOR_COMPONENTS.Button, {
|
|
1087
1106
|
onClick: () => {
|
|
1088
1107
|
dispose?.();
|
|
@@ -1 +1 @@
|
|
|
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| ReadonlyTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| ReadonlyTokenIndex<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>>","Cast.arrayToBoolean","Cast.arrayToNumber","Cast.arrayToObject","Cast.arrayToString","Cast.booleanToArray","Cast.booleanToNumber","Cast.booleanToObject","Cast.booleanToString","Cast.numberToArray","Cast.numberToBoolean","Cast.numberToObject","Cast.numberToString","Cast.objectToArray","Cast.objectToBoolean","Cast.objectToNumber","Cast.objectToString","Cast.stringToArray","Cast.stringToBoolean","Cast.stringToNumber","Cast.stringToObject","Cast.nullToArray","Cast.nullToBoolean","Cast.nullToNumber","Cast.nullToObject","Cast.nullToString","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\treadonly TransactionOutcomeEvent<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\tReadonlyTokenIndex,\n} from \"atom.io/introspection\"\nimport { attachIntrospectionStates, isPlainObject } from \"atom.io/introspection\"\nimport { storageSync } 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\tstorageSync(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: [storageSync(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: [storageSync(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: [storageSync(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: [storageSync(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| ReadonlyTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| ReadonlyTokenIndex<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\treadonly TransactionOutcomeEvent<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| ReadonlyTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| ReadonlyTokenIndex<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>>","stringified: string","stringified","stringified: string","stringified","Cast.arrayToBoolean","Cast.arrayToNumber","Cast.arrayToObject","Cast.arrayToString","Cast.booleanToArray","Cast.booleanToNumber","Cast.booleanToObject","Cast.booleanToString","Cast.numberToArray","Cast.numberToBoolean","Cast.numberToObject","Cast.numberToString","Cast.objectToArray","Cast.objectToBoolean","Cast.objectToNumber","Cast.objectToString","Cast.stringToArray","Cast.stringToBoolean","Cast.stringToNumber","Cast.stringToObject","Cast.nullToArray","Cast.nullToBoolean","Cast.nullToNumber","Cast.nullToObject","Cast.nullToString","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}>","stringified: string","stringified","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\treadonly TransactionOutcomeEvent<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\tReadonlyTokenIndex,\n} from \"atom.io/introspection\"\nimport { attachIntrospectionStates, isPlainObject } from \"atom.io/introspection\"\nimport { storageSync } 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\tstorageSync(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: [storageSync(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: [storageSync(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: [storageSync(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: [storageSync(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| ReadonlyTokenIndex<AtomToken<unknown, any, any>>\n\t\t\t\t| ReadonlyTokenIndex<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\tif (data === undefined) {\n\t\treturn (\n\t\t\t<ElasticInput\n\t\t\t\tdisabled\n\t\t\t\tvalue=\"undefined\"\n\t\t\t\tdata-testid={`${testid}-undefined`}\n\t\t\t/>\n\t\t)\n\t}\n\tlet stringified: string\n\ttry {\n\t\tstringified = JSON.stringify(data)\n\t} catch (_) {\n\t\tstringified = `?`\n\t}\n\treturn (\n\t\t<ElasticInput\n\t\t\tdisabled\n\t\t\tvalue={Object.getPrototypeOf(data).constructor.name + ` ` + stringified}\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\tlet stringified: string\n\ttry {\n\t\tstringified = JSON.stringify(data)\n\t} catch (_) {\n\t\tstringified = `?`\n\t}\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\">{stringified}</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\tlet stringified: string\n\ttry {\n\t\tstringified = JSON.stringify(state)\n\t} catch (_) {\n\t\tstringified = `?`\n\t}\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\">{stringified}</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\treadonly TransactionOutcomeEvent<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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"}
|
package/dist/realtime/index.js
CHANGED
|
@@ -161,7 +161,7 @@ const mutualUsersSelector = selectorFamily({
|
|
|
161
161
|
const [usersOfRoomsAtoms, roomsOfUsersAtoms] = getInternalRelations(usersInRooms, `split`);
|
|
162
162
|
const rooms = get(roomsOfUsersAtoms, userKey);
|
|
163
163
|
for (const room of rooms) return [...get(usersOfRoomsAtoms, room)];
|
|
164
|
-
return [];
|
|
164
|
+
return [userKey];
|
|
165
165
|
}
|
|
166
166
|
});
|
|
167
167
|
const ownersOfRooms = join({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["mutexAtoms: AtomFamilyToken<boolean, Canonical>","roomKeysAtom: MutableAtomToken<UList<RoomKey>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","visibleUsersInRoomsSelector: PureSelectorFamilyToken<\n\t[self: UserKey, ...RoomKey[]],\n\tUserKey\n>","visibilityFromRoomSelector: PureSelectorFamilyToken<\n\t[self: RoomKey, ...UserKey[]],\n\tRoomKey\n>","mutualUsersSelector: ReadonlyPureSelectorFamilyToken<\n\tUserKey[],\n\tUserKey\n>","ownersOfRooms: JoinToken<`user`, UserKey, `room`, RoomKey, `1:n`>"],"sources":["../../src/realtime/cast-socket.ts","../../src/realtime/employ-socket.ts","../../src/realtime/mutex-store.ts","../../src/realtime/realtime-continuity.ts","../../src/realtime/realtime-key-types.ts","../../src/realtime/shared-room-store.ts"],"sourcesContent":["import type { Loadable } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { EventsMap, Socket, TypedSocket } from \"./socket-interface\"\nimport type { StandardSchemaV1 } from \"./standard-schema\"\n\nexport type SocketListeners<T extends TypedSocket> =\n\tT extends TypedSocket<infer ListenEvents> ? ListenEvents : never\n\nexport type SocketGuard<L extends EventsMap> = {\n\t[K in keyof L]: StandardSchemaV1<Json.Array, Parameters<L[K]>>\n}\n\nexport type Loaded<L extends Loadable<any>> =\n\tL extends Loadable<infer T> ? T : never\n\nfunction onLoad<L extends Loadable<any>>(\n\tloadable: L,\n\tfn: (loaded: Loaded<L>) => any,\n): void {\n\tif (loadable instanceof Promise) {\n\t\tvoid loadable.then(fn)\n\t} else {\n\t\tfn(loadable as Loaded<L>)\n\t}\n}\n\nexport function castSocket<T extends TypedSocket>(\n\tsocket: Socket,\n\tguard: SocketGuard<SocketListeners<T>> | `TRUST`,\n\tlogError?: (error: unknown) => void,\n): T {\n\tif (guard === `TRUST`) {\n\t\treturn socket as T\n\t}\n\tconst guardedSocket: Socket = {\n\t\tid: socket.id,\n\t\ton: (event, listener) => {\n\t\t\tconst schema = guard[event] as StandardSchemaV1<Json.Array, Json.Array>\n\t\t\tsocket.on(event, (...args) => {\n\t\t\t\tconst loadableResult = schema[`~standard`].validate(args)\n\t\t\t\tonLoad(loadableResult, (result) => {\n\t\t\t\t\tif (result.issues) {\n\t\t\t\t\t\tlogError?.(result.issues)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener(...result.value)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tonAny: (listener) => {\n\t\t\tsocket.onAny((event, ...args) => {\n\t\t\t\tconst schema = guard[event] as StandardSchemaV1<unknown, Json.Array>\n\t\t\t\tconst loadableResult = schema[`~standard`].validate(args)\n\t\t\t\tonLoad(loadableResult, (result) => {\n\t\t\t\t\tif (result.issues) {\n\t\t\t\t\t\tlogError?.(result.issues)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener(event, ...result.value)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tonAnyOutgoing: socket.onAnyOutgoing.bind(socket),\n\t\toff: socket.off.bind(socket),\n\t\toffAny: socket.offAny.bind(socket),\n\t\temit: socket.emit.bind(socket),\n\t}\n\treturn guardedSocket as T\n}\n","import type { EventsMap, Socket, TypedSocket } from \"atom.io/realtime\"\nimport type { Events } from \"atom.io/realtime-server\"\n\nexport function employSocket<I extends EventsMap, K extends string & keyof I>(\n\tsocket: TypedSocket<I, any>,\n\tevent: K,\n\thandleEvent: (...data: Parameters<I[K]>) => void,\n): () => void\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket | TypedSocket<any, any>,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void {\n\tsocket.on(event, handleEvent)\n\tconst retireSocket = () => {\n\t\tsocket.off(event, handleEvent)\n\t}\n\treturn retireSocket\n}\n","import type { AtomFamilyToken } from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily({\n\tkey: `mutex`,\n\tdefault: false,\n})\n","import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tTokenType,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tassignTransactionToContinuity,\n\tIMPLICIT,\n\tsetEpochNumberOfContinuity,\n} from \"atom.io/internal\"\nimport type { Canonical, Json, JsonIO } from \"atom.io/json\"\n\nimport type { UserKey } from \"./realtime-key-types\"\n\n/* eslint-disable no-console */\n\nexport class InvariantMap<K, V> extends Map<K, V> implements ReadonlyMap<K, V> {\n\tpublic set(key: K, value: V): this {\n\t\tif (this.has(key)) {\n\t\t\tconsole.warn(`Tried to set a key that already exists in an InvariantMap`, {\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t})\n\t\t\treturn this\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n}\n\nexport type PerspectiveToken<F extends AtomFamilyToken<any>> = {\n\ttype: `realtime_perspective`\n\tresourceAtoms: F\n\tviewAtoms: ReadableFamilyToken<ReadableToken<TokenType<F>>[], UserKey>\n}\n\nexport type ContinuityToken = {\n\treadonly type: `continuity`\n\treadonly key: string\n\treadonly globals: AtomToken<any>[]\n\treadonly actions: (Json.Serializable & TransactionToken<JsonIO>)[]\n\treadonly perspectives: PerspectiveToken<AtomFamilyToken<any, Canonical>>[]\n}\n\nexport class SyncGroup {\n\tpublic type = `continuity` as const\n\n\tprotected globals: AtomToken<any>[] = []\n\tprotected actions: TransactionToken<any>[] = []\n\tprotected perspectives: PerspectiveToken<any>[] = []\n\tprotected readonly key: string\n\n\tprotected constructor(key: string) {\n\t\tthis.key = key\n\t}\n\n\tpublic static existing: InvariantMap<string, ContinuityToken> =\n\t\tnew InvariantMap()\n\tpublic static create(\n\t\tkey: string,\n\t\tbuilder: (group: SyncGroup) => SyncGroup,\n\t): ContinuityToken {\n\t\tconst group = new SyncGroup(key)\n\t\tconst { type, globals, actions, perspectives } = builder(group)\n\t\tconst token = { type, key, globals, actions, perspectives }\n\t\tSyncGroup.existing.set(key, token)\n\t\treturn token\n\t}\n\n\tpublic add(...atoms: AtomToken<any>[]): SyncGroup\n\tpublic add(...args: TransactionToken<any>[]): SyncGroup\n\tpublic add<\n\t\tF extends AtomFamilyToken<any>,\n\t\tT extends F extends AtomFamilyToken<infer U> ? U : never,\n\t>(\n\t\tfamily: AtomFamilyToken<T, any>,\n\t\tindex: ReadableFamilyToken<Iterable<AtomToken<T>>, string>,\n\t): SyncGroup\n\tpublic add(\n\t\t...args:\n\t\t\t| readonly AtomToken<any>[]\n\t\t\t| readonly TransactionToken<any>[]\n\t\t\t| [AtomFamilyToken<any, any>, ReadableFamilyToken<Iterable<any>, string>]\n\t): this {\n\t\tconst zeroth = args[0]\n\t\tswitch (zeroth.type) {\n\t\t\tcase `atom`:\n\t\t\tcase `mutable_atom`:\n\t\t\t\tthis.globals.push(...(args as AtomToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\tthis.actions.push(...(args as TransactionToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `atom_family`:\n\t\t\tcase `mutable_atom_family`:\n\t\t\t\t{\n\t\t\t\t\tconst [family, index] = args as [\n\t\t\t\t\t\tAtomFamilyToken<any, any>,\n\t\t\t\t\t\tReadableFamilyToken<ReadableToken<any>[], UserKey>,\n\t\t\t\t\t]\n\t\t\t\t\tthis.perspectives.push({\n\t\t\t\t\t\ttype: `realtime_perspective`,\n\t\t\t\t\t\tresourceAtoms: family,\n\t\t\t\t\t\tviewAtoms: index,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn this\n\t}\n}\n\nexport type ContinuityOptions = {\n\tkey: string\n\tconfig: (group: SyncGroup) => SyncGroup\n}\n\nexport function continuity(options: ContinuityOptions): ContinuityToken {\n\tconst { key, config } = options\n\tconst token = SyncGroup.create(key, config)\n\tconst { actions } = token\n\tfor (const action of actions) {\n\t\tassignTransactionToContinuity(IMPLICIT.STORE, key, action.key)\n\t}\n\tsetEpochNumberOfContinuity(IMPLICIT.STORE, key, -1)\n\treturn token\n}\n\n// const counterStates = atomFamily<number, { c: string }>({\n// \tkey: `counter`,\n// \tdefault: 0,\n// })\n// const counterIndices = atomFamily<{ c: string }[], string>({\n// \tkey: `counterIndex`,\n// \tdefault: [],\n// })\n// const nameStates = atomFamily<number, { n: string }>({\n// \tkey: `name`,\n// \tdefault: 0,\n// })\n// const nameIndices = atomFamily<{ n: string }[], string>({\n// \tkey: `nameIndex`,\n// \tdefault: [],\n// })\n\n// const counterContinuity = continuity({\n// \tkey: `counter`,\n// \tconfig: (group) =>\n// \t\tgroup\n// \t\t\t.add(counterStates, counterIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices),\n// })\n","export type SocketKey = `socket::${string}`\nexport const isSocketKey = (key: string): key is SocketKey =>\n\tkey.startsWith(`socket::`)\n\nexport type UserKey = `user::${string}`\nexport const isUserKey = (key: string): key is UserKey =>\n\tkey.startsWith(`user::`)\n\nexport type RoomKey = `room::${string}`\nexport const isRoomKey = (key: string): key is RoomKey =>\n\tkey.startsWith(`room::`)\n","import type {\n\tJoinToken,\n\tMutableAtomToken,\n\tPureSelectorFamilyToken,\n\tReadonlyPureSelectorFamilyToken,\n} from \"atom.io\"\nimport { getInternalRelations, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport {\n\tisRoomKey,\n\tisUserKey,\n\ttype RoomKey,\n\ttype UserKey,\n} from \"./realtime-key-types\"\n\nexport type RoomSocketInterface<RoomNames extends string> = {\n\tcreateRoom: (roomName: RoomNames) => void\n\tjoinRoom: (roomKey: RoomKey) => void\n\tdeleteRoom: (roomKey: RoomKey) => void\n\tleaveRoom: () => void\n\t// [leaveRoom: `leaveRoom:${string}`]: () => void\n}\n\nexport const roomKeysAtom: MutableAtomToken<UList<RoomKey>> = mutableAtom({\n\tkey: `roomKeys`,\n\tclass: UList,\n})\n\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`> =\n\tjoin({\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isRoomKey,\n\t\tisBType: isUserKey,\n\t})\n\nexport const visibleUsersInRoomsSelector: PureSelectorFamilyToken<\n\t[self: UserKey, ...RoomKey[]],\n\tUserKey\n> = selectorFamily({\n\tkey: `visibleUsersInRooms`,\n\tget:\n\t\t(userKey) =>\n\t\t({ get }) => {\n\t\t\tconst [, roomsOfUsersAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst rooms = get(roomsOfUsersAtoms, userKey)\n\t\t\treturn [userKey, ...rooms]\n\t\t},\n})\n\nexport const visibilityFromRoomSelector: PureSelectorFamilyToken<\n\t[self: RoomKey, ...UserKey[]],\n\tRoomKey\n> = selectorFamily({\n\tkey: `visibilityFromRoom`,\n\tget:\n\t\t(roomKey) =>\n\t\t({ get }) => {\n\t\t\tconst [usersOfRoomsAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst users = get(usersOfRoomsAtoms, roomKey)\n\t\t\treturn [roomKey, ...users]\n\t\t},\n})\n\nexport const mutualUsersSelector: ReadonlyPureSelectorFamilyToken<\n\tUserKey[],\n\tUserKey\n> = selectorFamily({\n\tkey: `mutualUsers`,\n\tget:\n\t\t(userKey) =>\n\t\t({ get }) => {\n\t\t\tconst [usersOfRoomsAtoms, roomsOfUsersAtoms] = getInternalRelations(\n\t\t\t\tusersInRooms,\n\t\t\t\t`split`,\n\t\t\t)\n\t\t\tconst rooms = get(roomsOfUsersAtoms, userKey)\n\t\t\tfor (const room of rooms) {\n\t\t\t\tconst users = get(usersOfRoomsAtoms, room)\n\t\t\t\treturn [...users]\n\t\t\t}\n\t\t\treturn []\n\t\t},\n})\n\nexport const ownersOfRooms: JoinToken<`user`, UserKey, `room`, RoomKey, `1:n`> =\n\tjoin({\n\t\tkey: `ownersOfRooms`,\n\t\tbetween: [`user`, `room`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isUserKey,\n\t\tisBType: isRoomKey,\n\t})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["mutexAtoms: AtomFamilyToken<boolean, Canonical>","roomKeysAtom: MutableAtomToken<UList<RoomKey>>","DEFAULT_USER_IN_ROOM_META: UserInRoomMeta","usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`>","visibleUsersInRoomsSelector: PureSelectorFamilyToken<\n\t[self: UserKey, ...RoomKey[]],\n\tUserKey\n>","visibilityFromRoomSelector: PureSelectorFamilyToken<\n\t[self: RoomKey, ...UserKey[]],\n\tRoomKey\n>","mutualUsersSelector: ReadonlyPureSelectorFamilyToken<\n\tUserKey[],\n\tUserKey\n>","ownersOfRooms: JoinToken<`user`, UserKey, `room`, RoomKey, `1:n`>"],"sources":["../../src/realtime/cast-socket.ts","../../src/realtime/employ-socket.ts","../../src/realtime/mutex-store.ts","../../src/realtime/realtime-continuity.ts","../../src/realtime/realtime-key-types.ts","../../src/realtime/shared-room-store.ts"],"sourcesContent":["import type { Loadable } from \"atom.io\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { EventsMap, Socket, TypedSocket } from \"./socket-interface\"\nimport type { StandardSchemaV1 } from \"./standard-schema\"\n\nexport type SocketListeners<T extends TypedSocket> =\n\tT extends TypedSocket<infer ListenEvents> ? ListenEvents : never\n\nexport type SocketGuard<L extends EventsMap> = {\n\t[K in keyof L]: StandardSchemaV1<Json.Array, Parameters<L[K]>>\n}\n\nexport type Loaded<L extends Loadable<any>> =\n\tL extends Loadable<infer T> ? T : never\n\nfunction onLoad<L extends Loadable<any>>(\n\tloadable: L,\n\tfn: (loaded: Loaded<L>) => any,\n): void {\n\tif (loadable instanceof Promise) {\n\t\tvoid loadable.then(fn)\n\t} else {\n\t\tfn(loadable as Loaded<L>)\n\t}\n}\n\nexport function castSocket<T extends TypedSocket>(\n\tsocket: Socket,\n\tguard: SocketGuard<SocketListeners<T>> | `TRUST`,\n\tlogError?: (error: unknown) => void,\n): T {\n\tif (guard === `TRUST`) {\n\t\treturn socket as T\n\t}\n\tconst guardedSocket: Socket = {\n\t\tid: socket.id,\n\t\ton: (event, listener) => {\n\t\t\tconst schema = guard[event] as StandardSchemaV1<Json.Array, Json.Array>\n\t\t\tsocket.on(event, (...args) => {\n\t\t\t\tconst loadableResult = schema[`~standard`].validate(args)\n\t\t\t\tonLoad(loadableResult, (result) => {\n\t\t\t\t\tif (result.issues) {\n\t\t\t\t\t\tlogError?.(result.issues)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener(...result.value)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tonAny: (listener) => {\n\t\t\tsocket.onAny((event, ...args) => {\n\t\t\t\tconst schema = guard[event] as StandardSchemaV1<unknown, Json.Array>\n\t\t\t\tconst loadableResult = schema[`~standard`].validate(args)\n\t\t\t\tonLoad(loadableResult, (result) => {\n\t\t\t\t\tif (result.issues) {\n\t\t\t\t\t\tlogError?.(result.issues)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlistener(event, ...result.value)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t},\n\t\tonAnyOutgoing: socket.onAnyOutgoing.bind(socket),\n\t\toff: socket.off.bind(socket),\n\t\toffAny: socket.offAny.bind(socket),\n\t\temit: socket.emit.bind(socket),\n\t}\n\treturn guardedSocket as T\n}\n","import type { EventsMap, Socket, TypedSocket } from \"atom.io/realtime\"\nimport type { Events } from \"atom.io/realtime-server\"\n\nexport function employSocket<I extends EventsMap, K extends string & keyof I>(\n\tsocket: TypedSocket<I, any>,\n\tevent: K,\n\thandleEvent: (...data: Parameters<I[K]>) => void,\n): () => void\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void\nexport function employSocket<I extends Events, K extends string & keyof I>(\n\tsocket: Socket | TypedSocket<any, any>,\n\tevent: K,\n\thandleEvent: (...data: I[K]) => void,\n): () => void {\n\tsocket.on(event, handleEvent)\n\tconst retireSocket = () => {\n\t\tsocket.off(event, handleEvent)\n\t}\n\treturn retireSocket\n}\n","import type { AtomFamilyToken } from \"atom.io\"\nimport { atomFamily } from \"atom.io\"\nimport type { Canonical } from \"atom.io/json\"\n\nexport const mutexAtoms: AtomFamilyToken<boolean, Canonical> = atomFamily({\n\tkey: `mutex`,\n\tdefault: false,\n})\n","import type {\n\tAtomFamilyToken,\n\tAtomToken,\n\tReadableFamilyToken,\n\tReadableToken,\n\tTokenType,\n\tTransactionToken,\n} from \"atom.io\"\nimport {\n\tassignTransactionToContinuity,\n\tIMPLICIT,\n\tsetEpochNumberOfContinuity,\n} from \"atom.io/internal\"\nimport type { Canonical, Json, JsonIO } from \"atom.io/json\"\n\nimport type { UserKey } from \"./realtime-key-types\"\n\n/* eslint-disable no-console */\n\nexport class InvariantMap<K, V> extends Map<K, V> implements ReadonlyMap<K, V> {\n\tpublic set(key: K, value: V): this {\n\t\tif (this.has(key)) {\n\t\t\tconsole.warn(`Tried to set a key that already exists in an InvariantMap`, {\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t})\n\t\t\treturn this\n\t\t}\n\t\treturn super.set(key, value)\n\t}\n}\n\nexport type PerspectiveToken<F extends AtomFamilyToken<any>> = {\n\ttype: `realtime_perspective`\n\tresourceAtoms: F\n\tviewAtoms: ReadableFamilyToken<ReadableToken<TokenType<F>>[], UserKey>\n}\n\nexport type ContinuityToken = {\n\treadonly type: `continuity`\n\treadonly key: string\n\treadonly globals: AtomToken<any>[]\n\treadonly actions: (Json.Serializable & TransactionToken<JsonIO>)[]\n\treadonly perspectives: PerspectiveToken<AtomFamilyToken<any, Canonical>>[]\n}\n\nexport class SyncGroup {\n\tpublic type = `continuity` as const\n\n\tprotected globals: AtomToken<any>[] = []\n\tprotected actions: TransactionToken<any>[] = []\n\tprotected perspectives: PerspectiveToken<any>[] = []\n\tprotected readonly key: string\n\n\tprotected constructor(key: string) {\n\t\tthis.key = key\n\t}\n\n\tpublic static existing: InvariantMap<string, ContinuityToken> =\n\t\tnew InvariantMap()\n\tpublic static create(\n\t\tkey: string,\n\t\tbuilder: (group: SyncGroup) => SyncGroup,\n\t): ContinuityToken {\n\t\tconst group = new SyncGroup(key)\n\t\tconst { type, globals, actions, perspectives } = builder(group)\n\t\tconst token = { type, key, globals, actions, perspectives }\n\t\tSyncGroup.existing.set(key, token)\n\t\treturn token\n\t}\n\n\tpublic add(...atoms: AtomToken<any>[]): SyncGroup\n\tpublic add(...args: TransactionToken<any>[]): SyncGroup\n\tpublic add<\n\t\tF extends AtomFamilyToken<any>,\n\t\tT extends F extends AtomFamilyToken<infer U> ? U : never,\n\t>(\n\t\tfamily: AtomFamilyToken<T, any>,\n\t\tindex: ReadableFamilyToken<Iterable<AtomToken<T>>, string>,\n\t): SyncGroup\n\tpublic add(\n\t\t...args:\n\t\t\t| readonly AtomToken<any>[]\n\t\t\t| readonly TransactionToken<any>[]\n\t\t\t| [AtomFamilyToken<any, any>, ReadableFamilyToken<Iterable<any>, string>]\n\t): this {\n\t\tconst zeroth = args[0]\n\t\tswitch (zeroth.type) {\n\t\t\tcase `atom`:\n\t\t\tcase `mutable_atom`:\n\t\t\t\tthis.globals.push(...(args as AtomToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `transaction`:\n\t\t\t\tthis.actions.push(...(args as TransactionToken<any>[]))\n\t\t\t\tbreak\n\t\t\tcase `atom_family`:\n\t\t\tcase `mutable_atom_family`:\n\t\t\t\t{\n\t\t\t\t\tconst [family, index] = args as [\n\t\t\t\t\t\tAtomFamilyToken<any, any>,\n\t\t\t\t\t\tReadableFamilyToken<ReadableToken<any>[], UserKey>,\n\t\t\t\t\t]\n\t\t\t\t\tthis.perspectives.push({\n\t\t\t\t\t\ttype: `realtime_perspective`,\n\t\t\t\t\t\tresourceAtoms: family,\n\t\t\t\t\t\tviewAtoms: index,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn this\n\t}\n}\n\nexport type ContinuityOptions = {\n\tkey: string\n\tconfig: (group: SyncGroup) => SyncGroup\n}\n\nexport function continuity(options: ContinuityOptions): ContinuityToken {\n\tconst { key, config } = options\n\tconst token = SyncGroup.create(key, config)\n\tconst { actions } = token\n\tfor (const action of actions) {\n\t\tassignTransactionToContinuity(IMPLICIT.STORE, key, action.key)\n\t}\n\tsetEpochNumberOfContinuity(IMPLICIT.STORE, key, -1)\n\treturn token\n}\n\n// const counterStates = atomFamily<number, { c: string }>({\n// \tkey: `counter`,\n// \tdefault: 0,\n// })\n// const counterIndices = atomFamily<{ c: string }[], string>({\n// \tkey: `counterIndex`,\n// \tdefault: [],\n// })\n// const nameStates = atomFamily<number, { n: string }>({\n// \tkey: `name`,\n// \tdefault: 0,\n// })\n// const nameIndices = atomFamily<{ n: string }[], string>({\n// \tkey: `nameIndex`,\n// \tdefault: [],\n// })\n\n// const counterContinuity = continuity({\n// \tkey: `counter`,\n// \tconfig: (group) =>\n// \t\tgroup\n// \t\t\t.add(counterStates, counterIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices)\n// \t\t\t.add(nameStates, nameIndices),\n// })\n","export type SocketKey = `socket::${string}`\nexport const isSocketKey = (key: string): key is SocketKey =>\n\tkey.startsWith(`socket::`)\n\nexport type UserKey = `user::${string}`\nexport const isUserKey = (key: string): key is UserKey =>\n\tkey.startsWith(`user::`)\n\nexport type RoomKey = `room::${string}`\nexport const isRoomKey = (key: string): key is RoomKey =>\n\tkey.startsWith(`room::`)\n","import type {\n\tJoinToken,\n\tMutableAtomToken,\n\tPureSelectorFamilyToken,\n\tReadonlyPureSelectorFamilyToken,\n} from \"atom.io\"\nimport { getInternalRelations, join, mutableAtom, selectorFamily } from \"atom.io\"\nimport { UList } from \"atom.io/transceivers/u-list\"\n\nimport {\n\tisRoomKey,\n\tisUserKey,\n\ttype RoomKey,\n\ttype UserKey,\n} from \"./realtime-key-types\"\n\nexport type RoomSocketInterface<RoomNames extends string> = {\n\tcreateRoom: (roomName: RoomNames) => void\n\tjoinRoom: (roomKey: RoomKey) => void\n\tdeleteRoom: (roomKey: RoomKey) => void\n\tleaveRoom: () => void\n\t// [leaveRoom: `leaveRoom:${string}`]: () => void\n}\n\nexport const roomKeysAtom: MutableAtomToken<UList<RoomKey>> = mutableAtom({\n\tkey: `roomKeys`,\n\tclass: UList,\n})\n\nexport type UserInRoomMeta = {\n\tenteredAtEpoch: number\n}\nexport const DEFAULT_USER_IN_ROOM_META: UserInRoomMeta = {\n\tenteredAtEpoch: 0,\n}\nexport const usersInRooms: JoinToken<`room`, RoomKey, `user`, UserKey, `1:n`> =\n\tjoin({\n\t\tkey: `usersInRooms`,\n\t\tbetween: [`room`, `user`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isRoomKey,\n\t\tisBType: isUserKey,\n\t})\n\nexport const visibleUsersInRoomsSelector: PureSelectorFamilyToken<\n\t[self: UserKey, ...RoomKey[]],\n\tUserKey\n> = selectorFamily({\n\tkey: `visibleUsersInRooms`,\n\tget:\n\t\t(userKey) =>\n\t\t({ get }) => {\n\t\t\tconst [, roomsOfUsersAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst rooms = get(roomsOfUsersAtoms, userKey)\n\t\t\treturn [userKey, ...rooms]\n\t\t},\n})\n\nexport const visibilityFromRoomSelector: PureSelectorFamilyToken<\n\t[self: RoomKey, ...UserKey[]],\n\tRoomKey\n> = selectorFamily({\n\tkey: `visibilityFromRoom`,\n\tget:\n\t\t(roomKey) =>\n\t\t({ get }) => {\n\t\t\tconst [usersOfRoomsAtoms] = getInternalRelations(usersInRooms, `split`)\n\t\t\tconst users = get(usersOfRoomsAtoms, roomKey)\n\t\t\treturn [roomKey, ...users]\n\t\t},\n})\n\nexport const mutualUsersSelector: ReadonlyPureSelectorFamilyToken<\n\tUserKey[],\n\tUserKey\n> = selectorFamily({\n\tkey: `mutualUsers`,\n\tget:\n\t\t(userKey) =>\n\t\t({ get }) => {\n\t\t\tconst [usersOfRoomsAtoms, roomsOfUsersAtoms] = getInternalRelations(\n\t\t\t\tusersInRooms,\n\t\t\t\t`split`,\n\t\t\t)\n\t\t\tconst rooms = get(roomsOfUsersAtoms, userKey)\n\t\t\tfor (const room of rooms) {\n\t\t\t\tconst users = get(usersOfRoomsAtoms, room)\n\t\t\t\treturn [...users]\n\t\t\t}\n\t\t\treturn [userKey]\n\t\t},\n})\n\nexport const ownersOfRooms: JoinToken<`user`, UserKey, `room`, RoomKey, `1:n`> =\n\tjoin({\n\t\tkey: `ownersOfRooms`,\n\t\tbetween: [`user`, `room`],\n\t\tcardinality: `1:n`,\n\t\tisAType: isUserKey,\n\t\tisBType: isRoomKey,\n\t})\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io",
|
|
3
|
-
"version": "0.46.
|
|
3
|
+
"version": "0.46.13",
|
|
4
4
|
"description": "Composable and testable reactive data library.",
|
|
5
5
|
"homepage": "https://atom.io.fyi",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -60,9 +60,9 @@
|
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@storybook/addon-docs": "10.1.
|
|
64
|
-
"@storybook/addon-onboarding": "10.1.
|
|
65
|
-
"@storybook/react-vite": "10.1.
|
|
63
|
+
"@storybook/addon-docs": "10.1.11",
|
|
64
|
+
"@storybook/addon-onboarding": "10.1.11",
|
|
65
|
+
"@storybook/react-vite": "10.1.11",
|
|
66
66
|
"@testing-library/react": "16.3.1",
|
|
67
67
|
"@types/eslint": "9.6.1",
|
|
68
68
|
"@types/estree": "1.0.8",
|
|
@@ -70,10 +70,10 @@
|
|
|
70
70
|
"@types/node": "25.0.3",
|
|
71
71
|
"@types/react": "19.2.7",
|
|
72
72
|
"@types/tmp": "0.2.6",
|
|
73
|
-
"@typescript-eslint/parser": "8.
|
|
74
|
-
"@typescript-eslint/rule-tester": "8.
|
|
75
|
-
"@typescript-eslint/utils": "8.
|
|
76
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
73
|
+
"@typescript-eslint/parser": "8.51.0",
|
|
74
|
+
"@typescript-eslint/rule-tester": "8.51.0",
|
|
75
|
+
"@typescript-eslint/utils": "8.51.0",
|
|
76
|
+
"@typescript/native-preview": "7.0.0-dev.20251230.1",
|
|
77
77
|
"@vitest/coverage-v8": "4.0.16",
|
|
78
78
|
"@vitest/ui": "4.0.16",
|
|
79
79
|
"arktype": "2.1.29",
|
|
@@ -92,9 +92,9 @@
|
|
|
92
92
|
"recoverage": "0.1.13",
|
|
93
93
|
"socket.io": "4.8.3",
|
|
94
94
|
"socket.io-client": "4.8.3",
|
|
95
|
-
"storybook": "10.1.
|
|
95
|
+
"storybook": "10.1.11",
|
|
96
96
|
"tmp": "0.2.5",
|
|
97
|
-
"tsdown": "0.18.
|
|
97
|
+
"tsdown": "0.18.4",
|
|
98
98
|
"vite": "7.3.0",
|
|
99
99
|
"vite-tsconfig-paths": "6.0.3",
|
|
100
100
|
"vitest": "4.0.16",
|
|
@@ -192,7 +192,7 @@ export const exactCatchTypes: ESLintUtils.RuleModule<
|
|
|
192
192
|
|
|
193
193
|
// Iterate over each constructor reference in the 'catch' array
|
|
194
194
|
for (const element of catchArray.elements) {
|
|
195
|
-
if (
|
|
195
|
+
if (element?.type !== AST_NODE_TYPES.Identifier) {
|
|
196
196
|
// Only check simple identifier references (e.g., [ClientError])
|
|
197
197
|
continue
|
|
198
198
|
}
|
|
@@ -44,6 +44,13 @@ export const StateIndexLeafNode: FC<{
|
|
|
44
44
|
|
|
45
45
|
const path = node.family ? [node.family.key, node.family.subKey] : [node.key]
|
|
46
46
|
|
|
47
|
+
let stringified: string
|
|
48
|
+
try {
|
|
49
|
+
stringified = JSON.stringify(state)
|
|
50
|
+
} catch (_) {
|
|
51
|
+
stringified = `?`
|
|
52
|
+
}
|
|
53
|
+
|
|
47
54
|
return (
|
|
48
55
|
<>
|
|
49
56
|
<header>
|
|
@@ -72,7 +79,7 @@ export const StateIndexLeafNode: FC<{
|
|
|
72
79
|
{isPrimitive ? (
|
|
73
80
|
<StoreEditor token={node} />
|
|
74
81
|
) : (
|
|
75
|
-
<div className="json_viewer">{
|
|
82
|
+
<div className="json_viewer">{stringified}</div>
|
|
76
83
|
)}
|
|
77
84
|
{dispose ? (
|
|
78
85
|
<DEFAULT_JSON_EDITOR_COMPONENTS.Button
|
|
@@ -5,18 +5,25 @@ export const NonJsonEditor: React.FC<JsonEditorProps<never>> = ({
|
|
|
5
5
|
data,
|
|
6
6
|
testid,
|
|
7
7
|
}) => {
|
|
8
|
-
|
|
8
|
+
if (data === undefined) {
|
|
9
|
+
return (
|
|
10
|
+
<ElasticInput
|
|
11
|
+
disabled
|
|
12
|
+
value="undefined"
|
|
13
|
+
data-testid={`${testid}-undefined`}
|
|
14
|
+
/>
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
let stringified: string
|
|
18
|
+
try {
|
|
19
|
+
stringified = JSON.stringify(data)
|
|
20
|
+
} catch (_) {
|
|
21
|
+
stringified = `?`
|
|
22
|
+
}
|
|
23
|
+
return (
|
|
9
24
|
<ElasticInput
|
|
10
25
|
disabled
|
|
11
|
-
value=
|
|
12
|
-
data-testid={`${testid}-undefined`}
|
|
13
|
-
/>
|
|
14
|
-
) : (
|
|
15
|
-
<ElasticInput
|
|
16
|
-
disabled
|
|
17
|
-
value={
|
|
18
|
-
Object.getPrototypeOf(data).constructor.name + ` ` + JSON.stringify(data)
|
|
19
|
-
}
|
|
26
|
+
value={Object.getPrototypeOf(data).constructor.name + ` ` + stringified}
|
|
20
27
|
data-testid={`${testid}-non-json-${Object.getPrototypeOf(data).constructor.name}`}
|
|
21
28
|
/>
|
|
22
29
|
)
|
|
@@ -69,6 +69,13 @@ export const JsonEditor_INTERNAL = <T,>({
|
|
|
69
69
|
const dataIsTree = refined.type === `array` || refined.type === `object`
|
|
70
70
|
const dataIsExpandable = dataIsTree && isOpen !== undefined && setIsOpen
|
|
71
71
|
|
|
72
|
+
let stringified: string
|
|
73
|
+
try {
|
|
74
|
+
stringified = JSON.stringify(data)
|
|
75
|
+
} catch (_) {
|
|
76
|
+
stringified = `?`
|
|
77
|
+
}
|
|
78
|
+
|
|
72
79
|
return isHidden(path) ? null : (
|
|
73
80
|
<Components.ErrorBoundary>
|
|
74
81
|
<Components.EditorWrapper
|
|
@@ -105,7 +112,7 @@ export const JsonEditor_INTERNAL = <T,>({
|
|
|
105
112
|
{dataIsTree ? (
|
|
106
113
|
<>
|
|
107
114
|
{isOpen !== undefined && setIsOpen ? (
|
|
108
|
-
<span className="json_viewer">{
|
|
115
|
+
<span className="json_viewer">{stringified}</span>
|
|
109
116
|
) : null}
|
|
110
117
|
{recast ? (
|
|
111
118
|
<select
|