@revisium/schema-toolkit-ui 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +38 -1519
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -399
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +10 -399
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +29 -1514
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["observable","SystemSchemaIds","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedIdSchema","rowVersionIdSchema","rowCreatedAtSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","FIELD_NAME_ERROR_MESSAGE","React","ChakraTooltip","Portal","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","Flex","Box","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Box","PiWarningCircle","Flex","Text","Box","Flex","Box","PiWarning","PiFunction","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Textarea","Box","Menu","PiFunction","PiCaretRight","Portal","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Text","Flex","Box","Flex","Text","Box","Flex","Text","Flex","Box","PiDotOutlineFill","Text","Box","Text","Box","Box","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","DialogFooter","Flex","DialogCloseTrigger","Flex","Button","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Flex","Icon","Text","Badge","PiPencilSimpleLight","Flex","Text","Box","Badge","VStack","Flex","Text","Badge","Icon","PiArrowRight","Flex","Text","Icon","PiArrowRight","Box","Box","Flex","Icon","PiArrowsLeftRightLight","Text","Box","Flex","Icon","PiWarningCircle","Text","Badge","Popover","Button","Icon","PiArrowCounterClockwiseBold","Text","Flex","VStack","Box","Text","VStack","SegmentGroup","Box","Text","Flex","VStack","SegmentGroup","Box","Flex","Box","Button","observable","computed","action","observable","computed","action","observable","computed","action","computed","action"],"sources":["../src/schema-editor/model/state/TreeState.ts","../src/schema-editor/model/accessor/NodeAccessor.ts","../src/schema-editor/model/accessor/NodeState.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/model/accessor/NodeLabel.ts","../src/schema-editor/model/accessor/NodeFormula.ts","../src/schema-editor/model/accessor/NodeValidation.ts","../src/schema-editor/model/utils/typeIdMapping.ts","../src/schema-editor/model/accessor/NodeActions.ts","../src/schema-editor/model/accessor/NodeAccessorFactory.ts","../src/schema-editor/model/core/AccessorCache.ts","../src/schema-editor/model/core/ValidationTracker.ts","../src/schema-editor/model/core/ViewState.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/utils/traverseTree.ts","../src/schema-editor/model/utils/TreeNavigator.ts","../src/schema-editor/model/core/CollapseManager.ts","../src/schema-editor/model/core/KeyboardNavigation.ts","../src/schema-editor/config/system-schemas.ts","../src/lib/initReactivity.ts","../src/schema-editor/model/core/SchemaEditorCore.ts","../src/schema-editor/model/vm/SchemaTreeVM.ts","../src/schema-editor/model/dialog/CreateTableDialogVM.ts","../src/schema-editor/model/dialog/ReviewErrorsDialogVM.ts","../src/schema-editor/model/vm/CreatingEditorVM.ts","../src/schema-editor/model/dialog/ReviewChangesDialogVM.ts","../src/schema-editor/model/vm/UpdatingEditorVM.ts","../src/components/Tooltip/Tooltip.tsx","../src/schema-editor/types/index.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/hooks/useContentEditable.ts","../src/components/ContentEditable/ContentEditable.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/schema-editor/ui/tree/TreeNodeWrapper/TreeNodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/tree/TreeNodeField/DragHandle.tsx","../src/schema-editor/ui/tree/TreeNodeField/ErrorIndicator.tsx","../src/schema-editor/ui/tree/TreeNodeField/useDragAndDrop.ts","../src/schema-editor/ui/tree/TreeNodeField/TreeNodeField.tsx","../src/schema-editor/ui/tree/TreeNodeIndicators/TreeNodeIndicators.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/parseDefaultValue.ts","../src/schema-editor/ui/tree/TreeNodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/TreeNodeContextMenu.tsx","../src/schema-editor/ui/tree/TreeNodeRightContent/TreeNodeRightContent.tsx","../src/schema-editor/ui/tree/NodeViewLayout/NodeViewLayout.tsx","../src/schema-editor/ui/tree/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ForeignKeyValue.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsChildren.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/tree/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/tree/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/tree/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/tree/TreeNodeView/TreeNodeView.tsx","../src/schema-editor/ui/dialog/shared/Highlight/Highlight.tsx","../src/schema-editor/ui/dialog/shared/CodeBox/CodeBox.tsx","../src/schema-editor/ui/dialog/shared/DialogLayout/DialogLayout.tsx","../src/schema-editor/ui/dialog/shared/DialogFooterActions/DialogFooterActions.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/helpers.ts","../src/schema-editor/ui/dialog/shared/PatchRow/OperationDescription.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DefaultValueRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DataLossBadge.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/TransformationInfoRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/ValueChangeRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/PatchRow.tsx","../src/schema-editor/ui/dialog/shared/TableIdChangeRow/TableIdChangeRow.tsx","../src/schema-editor/ui/dialog/shared/ErrorItem/ErrorItem.tsx","../src/schema-editor/ui/dialog/shared/RevertButton/RevertButton.tsx","../src/schema-editor/ui/dialog/ReviewErrorsDialog/ReviewErrorsDialog.tsx","../src/schema-editor/ui/dialog/ReviewChangesDialog/ReviewChangesDialog.tsx","../src/schema-editor/ui/dialog/CreateTableDialog/CreateTableDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/schema-editor/ui/CreatingSchemaEditor/CreatingSchemaEditor.tsx","../src/schema-editor/ui/UpdatingSchemaEditor/UpdatingSchemaEditor.tsx","../src/value-model/node/BaseValueNode.ts","../src/value-model/node/BasePrimitiveValueNode.ts","../src/value-model/core/types.ts","../src/value-model/node/StringValueNode.ts","../src/value-model/node/NumberValueNode.ts","../src/value-model/node/BooleanValueNode.ts","../src/value-model/node/ObjectValueNode.ts","../src/value-model/node/ArrayValueNode.ts","../src/value-model/node/NodeFactory.ts","../src/value-model/core/Path.ts","../src/value-model/tree/TreeIndex.ts","../src/value-model/tree/ChangeTracker.ts","../src/value-model/tree/ValueTree.ts","../src/value-model/formula/FormulaCollector.ts","../src/value-model/formula/DependencyGraph.ts","../src/value-model/formula/FormulaEvaluator.ts","../src/value-model/formula/FormulaEngine.ts","../src/value-model/factory.ts"],"sourcesContent":["import { makeAutoObservable, observable } from 'mobx';\n\nexport class TreeState {\n private readonly _expandedNodes = observable.map<string, boolean>();\n private readonly _focusedNodes = observable.map<string, boolean>();\n private readonly _menuOpenNodes = observable.map<string, boolean>();\n private readonly _settingsOpenNodes = observable.map<string, boolean>();\n private readonly _dropNodes = observable.map<string, boolean>();\n private readonly _disabledDropNodes = observable.map<string, boolean>();\n private readonly _draggedOverNodes = observable.map<string, boolean>();\n private readonly _focusRequestCounts = observable.map<string, number>();\n private _activeNodeId: string | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get activeNodeId(): string | null {\n return this._activeNodeId;\n }\n\n public setActiveNodeId(nodeId: string | null): void {\n this._activeNodeId = nodeId;\n }\n\n public isActive(nodeId: string): boolean {\n return this._activeNodeId === nodeId;\n }\n\n public getFocusRequestCount(nodeId: string): number {\n return this._focusRequestCounts.get(nodeId) ?? 0;\n }\n\n public requestFocus(nodeId: string): void {\n const current = this._focusRequestCounts.get(nodeId) ?? 0;\n this._focusRequestCounts.set(nodeId, current + 1);\n }\n\n public isExpanded(nodeId: string): boolean {\n return this._expandedNodes.get(nodeId) ?? true;\n }\n\n public setExpanded(nodeId: string, value: boolean): void {\n this._expandedNodes.set(nodeId, value);\n }\n\n public toggleExpanded(nodeId: string): void {\n this._expandedNodes.set(nodeId, !this.isExpanded(nodeId));\n }\n\n public isFocused(nodeId: string): boolean {\n return this._focusedNodes.get(nodeId) ?? false;\n }\n\n public setFocused(nodeId: string, value: boolean): void {\n this._focusedNodes.set(nodeId, value);\n }\n\n public isMenuOpen(nodeId: string): boolean {\n return this._menuOpenNodes.get(nodeId) ?? false;\n }\n\n public setMenuOpen(nodeId: string, value: boolean): void {\n this._menuOpenNodes.set(nodeId, value);\n }\n\n public isSettingsOpen(nodeId: string): boolean {\n return this._settingsOpenNodes.get(nodeId) ?? false;\n }\n\n public setSettingsOpen(nodeId: string, value: boolean): void {\n this._settingsOpenNodes.set(nodeId, value);\n }\n\n public isDrop(nodeId: string): boolean {\n return this._dropNodes.get(nodeId) ?? false;\n }\n\n public setDrop(nodeId: string, value: boolean): void {\n this._dropNodes.set(nodeId, value);\n }\n\n public isDisabledDrop(nodeId: string): boolean {\n return this._disabledDropNodes.get(nodeId) ?? false;\n }\n\n public setDisabledDrop(nodeId: string, value: boolean): void {\n this._disabledDropNodes.set(nodeId, value);\n }\n\n public isDraggedOver(nodeId: string): boolean {\n return this._draggedOverNodes.get(nodeId) ?? false;\n }\n\n public setDraggedOver(nodeId: string, value: boolean): void {\n this._draggedOverNodes.set(nodeId, value);\n }\n\n public clearNode(nodeId: string): void {\n this._expandedNodes.delete(nodeId);\n this._focusedNodes.delete(nodeId);\n this._menuOpenNodes.delete(nodeId);\n this._settingsOpenNodes.delete(nodeId);\n this._dropNodes.delete(nodeId);\n this._disabledDropNodes.delete(nodeId);\n this._draggedOverNodes.delete(nodeId);\n this._focusRequestCounts.delete(nodeId);\n }\n\n public collapseAll(nodeIds: string[], keepRootExpanded: boolean): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, false);\n }\n if (keepRootExpanded) {\n const firstNodeId = nodeIds[0];\n if (firstNodeId !== undefined) {\n this._expandedNodes.set(firstNodeId, true);\n }\n }\n }\n\n public expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, true);\n }\n }\n\n public reset(): void {\n this._expandedNodes.clear();\n this._focusedNodes.clear();\n this._menuOpenNodes.clear();\n this._settingsOpenNodes.clear();\n this._dropNodes.clear();\n this._disabledDropNodes.clear();\n this._draggedOverNodes.clear();\n this._focusRequestCounts.clear();\n this._activeNodeId = null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport type { NodeState } from './NodeState';\nimport type { NodeLabel } from './NodeLabel';\nimport type { NodeFormula } from './NodeFormula';\nimport type { NodeValidation } from './NodeValidation';\nimport type { NodeActions } from './NodeActions';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport class NodeAccessor {\n public readonly state: NodeState;\n public readonly label: NodeLabel;\n public readonly formula: NodeFormula;\n public readonly validation: NodeValidation;\n public readonly actions: NodeActions;\n\n constructor(\n private readonly _node: SchemaNode,\n deps: NodeAccessorDependencies,\n private readonly _isRoot: boolean = false,\n private readonly _isReadonly: boolean = false,\n ) {\n this.state = deps.state;\n this.label = deps.label;\n this.formula = deps.formula;\n this.validation = deps.validation;\n this.actions = deps.actions;\n\n makeAutoObservable(\n this,\n {\n state: false,\n label: false,\n formula: false,\n validation: false,\n actions: false,\n },\n { autoBind: true },\n );\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isRef(): boolean {\n return this._node.isRef();\n }\n\n public get ref(): string | undefined {\n if (this._node.isRef()) {\n return this._node.ref();\n }\n return undefined;\n }\n\n public get isForeignKey(): boolean {\n return this.label.isForeignKey;\n }\n\n public get defaultValue(): unknown {\n return this._node.defaultValue();\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined || value === null) {\n return '';\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n default:\n return JSON.stringify(value);\n }\n }\n\n public get hoverTargetClass(): string {\n return `hover-target-${this.nodeId}`;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.state.isFocused &&\n !this.state.isMenuOpen &&\n !this.state.isSettingsOpen\n );\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public handleFieldBlur(): void {\n this.state.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.actions.remove();\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\n\nexport class NodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: TreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n public toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n public get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n public setFocused(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setFocused(this._nodeId, value);\n }\n\n public get isMenuOpen(): boolean {\n return this._treeState.isMenuOpen(this._nodeId);\n }\n\n public setMenuOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setMenuOpen(this._nodeId, value);\n }\n\n public get isSettingsOpen(): boolean {\n return this._treeState.isSettingsOpen(this._nodeId);\n }\n\n public setSettingsOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setSettingsOpen(this._nodeId, value);\n }\n\n public get isDrop(): boolean {\n return this._treeState.isDrop(this._nodeId);\n }\n\n public setDrop(value: boolean): void {\n this._treeState.setDrop(this._nodeId, value);\n }\n\n public get isDisabledDrop(): boolean {\n return this._treeState.isDisabledDrop(this._nodeId);\n }\n\n public setDisabledDrop(value: boolean): void {\n this._treeState.setDisabledDrop(this._nodeId, value);\n }\n\n public get isDraggedOver(): boolean {\n return this._treeState.isDraggedOver(this._nodeId);\n }\n\n public setDraggedOver(value: boolean): void {\n this._treeState.setDraggedOver(this._nodeId, value);\n }\n\n public get isActive(): boolean {\n return this._treeState.isActive(this._nodeId);\n }\n\n public activate(): void {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n\n public get focusRequestCount(): number {\n return this._treeState.getFocusRequestCount(this._nodeId);\n }\n\n public requestFocus(): void {\n this._treeState.requestFocus(this._nodeId);\n }\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\n\nconst SYSTEM_SCHEMA_LABELS: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n};\n\nexport const getLabelByRef = (ref: string): string => {\n return SYSTEM_SCHEMA_LABELS[ref] ?? ref;\n};\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\nexport type MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\nexport type MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport { getLabelByRef } from '../../config/schema-type-ids';\n\nexport class NodeLabel {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _getTableId: () => string,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._getTableId();\n }\n return this._node.name();\n }\n\n public get nodeType(): string {\n return this._node.nodeType();\n }\n\n public get typeLabel(): string {\n if (this._node.isRef()) {\n return this.getRefLabel();\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n if (this._node.foreignKey() !== undefined) {\n return 'ForeignKey';\n }\n if (this._node.contentMediaType?.() === 'text/markdown') {\n return 'Markdown';\n }\n return this._node.nodeType();\n }\n\n public get description(): string | undefined {\n return this._node.metadata().description;\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get foreignKeyTable(): string | undefined {\n return this._node.foreignKey();\n }\n\n public get isForeignKey(): boolean {\n return this._node.foreignKey() !== undefined;\n }\n\n private getRefLabel(): string {\n const ref = this._node.ref();\n if (!ref) {\n return 'Ref';\n }\n return getLabelByRef(ref);\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n SchemaNode,\n SchemaModel,\n JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport class NodeFormula {\n private _inputValue: string | null = null;\n private _inputError: string | null = null;\n\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._schemaModel.plainSchema;\n }\n\n public get rawExpression(): string {\n const formula = this._node.formula();\n return formula?.expression() ?? '';\n }\n\n public get formula(): string {\n if (this._inputValue !== null) {\n return this._inputValue;\n }\n if (!this.hasFormula) {\n return '';\n }\n const serialized = this._schemaModel.serializeFormula(this._node.id());\n if (serialized) {\n return serialized;\n }\n return this.rawExpression;\n }\n\n public get inputValue(): string | null {\n return this._inputValue;\n }\n\n public get inputError(): string | null {\n return this._inputError;\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.formulaErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get hasError(): boolean {\n return this._inputError !== null || this.schemaError !== undefined;\n }\n\n public get errorMessage(): string | undefined {\n return this._inputError ?? this.schemaError;\n }\n\n public setInputValue(value: string): void {\n this._inputValue = value;\n this._inputError = null;\n }\n\n public clearInput(): void {\n this._inputValue = null;\n this._inputError = null;\n }\n\n private hasFormulaErrorForNode(): boolean {\n const errors = this._schemaModel.formulaErrors;\n return errors.some((e) => e.nodeId === this._node.id());\n }\n\n public applyFormula(): boolean {\n if (this._inputValue === null) {\n return true;\n }\n\n const trimmed = this._inputValue.trim();\n\n try {\n this._schemaModel.updateFormula(this._node.id(), trimmed || undefined);\n\n if (this.hasFormulaErrorForNode()) {\n return false;\n }\n\n this.clearInput();\n return true;\n } catch (error) {\n runInAction(() => {\n this._inputError =\n error instanceof Error ? error.message : 'Invalid formula';\n });\n return false;\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { NodeFormula } from './NodeFormula';\n\nexport class NodeValidation {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _formula: NodeFormula,\n private readonly _getTableIdError: () => string | null,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.validationErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get tableIdError(): string | null {\n if (this._isRoot) {\n return this._getTableIdError();\n }\n return null;\n }\n\n public get formulaError(): string | undefined {\n return this._formula.errorMessage;\n }\n\n public get hasError(): boolean {\n return (\n this.schemaError !== undefined ||\n this.tableIdError !== null ||\n this.formulaError !== undefined\n );\n }\n\n public get errorMessage(): string | undefined {\n return this.schemaError ?? this.tableIdError ?? this.formulaError;\n }\n}\n","import type { FieldType } from '@revisium/schema-toolkit';\n\nconst TYPE_ID_TO_FIELD_TYPE: Record<string, FieldType> = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Object: 'object',\n Array: 'array',\n};\n\nexport function typeIdToFieldType(typeId: string): FieldType | null {\n return TYPE_ID_TO_FIELD_TYPE[typeId] ?? null;\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n SystemSchemaIds,\n type SchemaNode,\n type SchemaModel,\n} from '@revisium/schema-toolkit';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\n\nexport interface NodeActionsCallbacks {\n renameTable: (name: string) => void;\n onNodeRemoved: (nodeId: string) => void;\n onNodeAdded: (nodeId: string) => void;\n onNodeReplaced: (oldNodeId: string, newNodeId: string) => void;\n selectForeignKey: () => Promise<string | null>;\n}\n\nexport class NodeActions {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _callbacks: NodeActionsCallbacks,\n private readonly _isRoot: boolean,\n private readonly _isReadonly: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRemove(): boolean {\n return !this._isReadonly && !this._isRoot;\n }\n\n public get canAddProperty(): boolean {\n return !this._isReadonly && this._node.isObject();\n }\n\n public rename(newName: string): void {\n if (this._isReadonly) {\n return;\n }\n\n if (this._isRoot) {\n this._callbacks.renameTable(newName);\n return;\n }\n\n if (newName !== this._node.name()) {\n this._schemaModel.renameField(this._node.id(), newName);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n if (typeId === 'ForeignKeyString') {\n this.changeToForeignKey();\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeToMarkdown();\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeToForeignKey(): void {\n const oldNodeId = this._node.id();\n let nodeId = oldNodeId;\n\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeToMarkdown(): void {\n const oldNodeId = this._node.id();\n let node = this._node;\n\n if (node.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public remove(): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n const nodeId = this._node.id();\n const removed = this._schemaModel.removeField(nodeId);\n\n if (removed) {\n this._callbacks.onNodeRemoved(nodeId);\n }\n }\n\n public addProperty(name: string = ''): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.addField(this._node.id(), name, 'string');\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public insertFieldAt(index: number, name: string): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.insertFieldAt(\n this._node.id(),\n index,\n name,\n 'string',\n );\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public setDescription(description: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n description: description || undefined,\n });\n }\n\n public setDeprecated(deprecated: boolean): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n deprecated: deprecated || undefined,\n });\n }\n\n public setDefaultValue(value: unknown): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateDefaultValue(this._node.id(), value);\n }\n\n public setForeignKey(tableId: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n\n if (tableId === undefined) {\n this._schemaModel.updateForeignKey(this._node.id(), undefined);\n return;\n }\n\n if (this._node.foreignKey() === undefined) {\n const oldNodeId = this._node.id();\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n this._schemaModel.updateForeignKey(newNode.id(), tableId);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n } else {\n this._schemaModel.updateForeignKey(oldNodeId, tableId);\n }\n } else {\n this._schemaModel.updateForeignKey(this._node.id(), tableId);\n }\n }\n\n public changeItemsType(typeId: string): void {\n if (this._isReadonly || !this._node.isArray()) {\n return;\n }\n\n const items = this._node.items();\n if (items.isNull()) {\n return;\n }\n\n const oldNodeId = items.id();\n\n if (typeId === 'ForeignKeyString') {\n this.changeItemsToForeignKey(items, oldNodeId);\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeItemsToMarkdown(items, oldNodeId);\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeItemsToForeignKey(items: SchemaNode, oldNodeId: string): void {\n let nodeId = oldNodeId;\n\n if (items.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeItemsToMarkdown(items: SchemaNode, oldNodeId: string): void {\n let node = items;\n\n if (items.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._callbacks.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n private typeIdToRefUri(typeId: string): string | null {\n const mapping: Record<string, string> = {\n File: SystemSchemaIds.File,\n RowId: SystemSchemaIds.RowId,\n RowCreatedId: SystemSchemaIds.RowCreatedId,\n RowVersionId: SystemSchemaIds.RowVersionId,\n RowCreatedAt: SystemSchemaIds.RowCreatedAt,\n RowPublishedAt: SystemSchemaIds.RowPublishedAt,\n RowUpdatedAt: SystemSchemaIds.RowUpdatedAt,\n RowHash: SystemSchemaIds.RowHash,\n RowSchemaHash: SystemSchemaIds.RowSchemaHash,\n };\n return mapping[typeId] ?? null;\n }\n}\n","import type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { NodeState } from './NodeState';\nimport { NodeLabel } from './NodeLabel';\nimport { NodeFormula } from './NodeFormula';\nimport { NodeValidation } from './NodeValidation';\nimport { NodeActions, type NodeActionsCallbacks } from './NodeActions';\nimport { NodeAccessor } from './NodeAccessor';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport interface NodeAccessorContext {\n schemaModel: SchemaModel;\n treeState: TreeState;\n getTableId: () => string;\n getTableIdError: () => string | null;\n callbacks: NodeActionsCallbacks;\n}\n\nexport class NodeAccessorFactory {\n public create(\n node: SchemaNode,\n context: NodeAccessorContext,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const state = new NodeState(node.id(), context.treeState);\n const label = new NodeLabel(node, context.getTableId, isRoot);\n const formula = new NodeFormula(node, context.schemaModel);\n const validation = new NodeValidation(\n node,\n context.schemaModel,\n formula,\n context.getTableIdError,\n isRoot,\n );\n const actions = new NodeActions(\n node,\n context.schemaModel,\n context.callbacks,\n isRoot,\n isReadonly,\n );\n\n return new NodeAccessor(\n node,\n { state, label, formula, validation, actions },\n isRoot,\n isReadonly,\n );\n }\n}\n","import type { SchemaModel } from '@revisium/schema-toolkit';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeAccessorContext,\n} from '../accessor';\n\nexport class AccessorCache {\n private readonly _cache = new Map<string, NodeAccessor>();\n\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _getContext: () => NodeAccessorContext,\n private readonly _accessorFactory: NodeAccessorFactory,\n ) {}\n\n public get(\n nodeId: string,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const cached = this._cache.get(nodeId);\n if (cached) {\n return cached;\n }\n\n const node = this._getSchemaModel().nodeById(nodeId);\n const accessor = this._accessorFactory.create(\n node,\n this._getContext(),\n isRoot,\n isReadonly,\n );\n this._cache.set(nodeId, accessor);\n return accessor;\n }\n\n public getChildren(\n parentNodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n const parentNode = this._getSchemaModel().nodeById(parentNodeId);\n if (parentNode.isNull()) {\n return [];\n }\n\n const childrenReadonly = parentIsReadonly || parentNode.isRef();\n\n if (parentNode.isObject()) {\n return parentNode\n .properties()\n .map((child) => this.get(child.id(), false, childrenReadonly));\n }\n\n if (parentNode.isArray()) {\n const items = parentNode.items();\n if (!items.isNull()) {\n return [this.get(items.id(), false, childrenReadonly)];\n }\n }\n\n return [];\n }\n\n public delete(nodeId: string): void {\n this._cache.delete(nodeId);\n }\n\n public clear(): void {\n this._cache.clear();\n }\n\n public entries(): IterableIterator<[string, NodeAccessor]> {\n return this._cache.entries();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\nimport type { AccessorCache } from './AccessorCache';\n\nexport class ValidationTracker {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _accessorCache: AccessorCache,\n private readonly _getTableIdError: () => string | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this.collectFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n\n public collectFormulaInputErrors(): TreeFormulaValidationError[] {\n const errors: TreeFormulaValidationError[] = [];\n for (const [nodeId, accessor] of this._accessorCache.entries()) {\n const error = accessor.formula.inputError;\n if (error) {\n errors.push({\n nodeId,\n fieldPath: accessor.label.name || undefined,\n message: error,\n });\n }\n }\n return errors;\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport type ViewMode = 'Tree' | 'Json' | 'RefBy';\n\nexport class ViewState {\n private _viewMode: ViewMode = 'Tree';\n private _loading = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get viewMode(): ViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonPatch } from '@revisium/schema-toolkit';\nimport { generateDefaultValue } from '@revisium/schema-toolkit';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface SchemaLike {\n $ref?: string;\n type?: string;\n foreignKey?: string;\n}\n\nfunction getTypeFromSchema(schema: SchemaLike): SchemaType {\n if (schema.$ref) {\n return 'ref';\n }\n if (schema.type) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: SchemaLike): string | undefined {\n if (schema.type === 'string' && schema.foreignKey) {\n return schema.foreignKey || undefined;\n }\n return undefined;\n}\n\nexport function getDefaultValueExample(\n patch: JsonPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add' || patch.value === undefined) {\n return null;\n }\n\n const schema = patch.value as SchemaLike;\n const value = generateDefaultValue(patch.value, { arrayItemCount: 1 });\n const type = getTypeFromSchema(schema);\n const foreignKeyTableId = getForeignKeyTableId(schema);\n\n return { value, type, foreignKeyTableId };\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\n\nexport function traverseTree(\n root: SchemaNode,\n visitor: (node: SchemaNode) => void,\n): void {\n if (root.isNull()) {\n return;\n }\n visitor(root);\n if (root.isObject()) {\n for (const child of root.properties()) {\n traverseTree(child, visitor);\n }\n } else if (root.isArray()) {\n const items = root.items();\n if (!items.isNull()) {\n traverseTree(items, visitor);\n }\n }\n}\n","import type { SchemaModel, SchemaNode } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\n\nexport class TreeNavigator {\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _treeState: TreeState,\n ) {}\n\n public visibleNodeIds(): string[] {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return [];\n }\n const ids: string[] = [];\n this.collectVisibleNodes(root, ids, true);\n return ids;\n }\n\n public findParentId(nodeId: string): string | null {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return null;\n }\n return this.findParentInTree(root, nodeId);\n }\n\n public isRootId(nodeId: string): boolean {\n return this._getSchemaModel().root.id() === nodeId;\n }\n\n public getNode(nodeId: string): SchemaNode {\n return this._getSchemaModel().nodeById(nodeId);\n }\n\n public nodeHasChildren(node: SchemaNode): boolean {\n if (node.isObject()) {\n return node.properties().length > 0;\n }\n if (node.isArray()) {\n return !node.items().isNull();\n }\n return false;\n }\n\n public getFirstChildId(node: SchemaNode): string | null {\n if (node.isObject()) {\n const first = node.properties()[0];\n if (first) {\n return first.id();\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n return items.id();\n }\n }\n return null;\n }\n\n private collectVisibleNodes(\n node: SchemaNode,\n ids: string[],\n isRoot: boolean,\n ): void {\n if (node.isNull()) {\n return;\n }\n\n ids.push(node.id());\n\n if (!isRoot && !this._treeState.isExpanded(node.id())) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectVisibleNodes(child, ids, false);\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectVisibleNodes(items, ids, false);\n }\n }\n }\n\n private findParentInTree(node: SchemaNode, targetId: string): string | null {\n if (node.isNull()) {\n return null;\n }\n\n if (node.isObject()) {\n return this.findParentInObject(node, targetId);\n }\n\n if (node.isArray()) {\n return this.findParentInArray(node, targetId);\n }\n\n return null;\n }\n\n private findParentInObject(\n node: SchemaNode,\n targetId: string,\n ): string | null {\n for (const child of node.properties()) {\n if (child.id() === targetId) {\n return node.id();\n }\n const found = this.findParentInTree(child, targetId);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findParentInArray(node: SchemaNode, targetId: string): string | null {\n const items = node.items();\n if (items.isNull()) {\n return null;\n }\n if (items.id() === targetId) {\n return node.id();\n }\n return this.findParentInTree(items, targetId);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { traverseTree } from '../utils';\n\nexport class CollapseManager {\n constructor(\n private readonly _treeState: TreeState,\n private readonly _getSchemaModel: () => SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public collapseAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.collapseAll(nodeIds, true);\n }\n\n public expandAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.expandAll(nodeIds);\n }\n\n public collapseIfComplex(threshold: number): void {\n const nodeCount = this._getSchemaModel().nodeCount;\n if (nodeCount >= threshold) {\n this.collapseAll();\n }\n }\n\n public collapseRefNodes(): void {\n const refNodeIds = this.collectRefNodeIds();\n for (const nodeId of refNodeIds) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n\n private collectRefNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n if (node.isRef() && (node.isObject() || node.isArray())) {\n ids.push(node.id());\n }\n });\n return ids;\n }\n\n private collectAllNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n ids.push(node.id());\n });\n return ids;\n }\n}\n","import { makeAutoObservable, reaction, type IReactionDisposer } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\nimport type { AccessorCache } from './AccessorCache';\nimport type { TreeNavigator } from '../utils/TreeNavigator';\n\nexport type KeyboardMode = 'TREE_NAV' | 'EDIT_NAME';\n\ninterface KeyboardEvent {\n key: string;\n shiftKey: boolean;\n preventDefault: () => void;\n}\n\nexport class KeyboardNavigation {\n private _mode: KeyboardMode = 'TREE_NAV';\n private _skipNextEscape = false;\n private _containerRef: HTMLElement | null = null;\n private readonly _disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly _treeState: TreeState,\n private readonly _navigator: TreeNavigator,\n private readonly _accessors: AccessorCache,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposers.push(\n reaction(\n () => {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return false;\n }\n return this._treeState.isFocused(activeId);\n },\n (isFocused, wasFocused) => {\n if (isFocused && !wasFocused) {\n this._mode = 'EDIT_NAME';\n }\n if (!isFocused && wasFocused) {\n this._mode = 'TREE_NAV';\n this._skipNextEscape = true;\n this.deferReturnFocus();\n }\n },\n ),\n );\n }\n\n public get mode(): KeyboardMode {\n return this._mode;\n }\n\n public get visibleNodeIds(): string[] {\n return this._navigator.visibleNodeIds();\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (this._mode !== 'TREE_NAV') {\n return;\n }\n\n if (event.key !== 'Escape') {\n this._skipNextEscape = false;\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n event.preventDefault();\n this.moveToPrev();\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'Tab':\n event.preventDefault();\n this.moveToNext();\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.moveToPrev();\n return;\n case 'ArrowRight':\n event.preventDefault();\n this.expandOrMoveToChild();\n return;\n case 'ArrowLeft':\n event.preventDefault();\n this.collapseOrMoveToParent();\n return;\n case ' ':\n event.preventDefault();\n this.toggleExpand();\n return;\n case 'Enter':\n case 'F2':\n case 'i':\n event.preventDefault();\n this.enterEditMode();\n return;\n case 'Insert':\n event.preventDefault();\n this.insertField();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeNode();\n return;\n case 'Escape':\n event.preventDefault();\n if (this._skipNextEscape) {\n this._skipNextEscape = false;\n return;\n }\n this.deactivateOrRemoveEmpty();\n return;\n }\n }\n\n public setContainerRef(el: HTMLElement | null): void {\n if (this._containerRef && !el) {\n document.removeEventListener('mousedown', this.handleNativeMouseDown);\n }\n this._containerRef = el;\n if (this._containerRef) {\n document.addEventListener('mousedown', this.handleNativeMouseDown);\n }\n }\n\n public returnFocus(): void {\n if (\n this._containerRef &&\n !this._containerRef.contains(document.activeElement)\n ) {\n this._containerRef.focus();\n }\n }\n\n public deactivate(): void {\n this._treeState.setActiveNodeId(null);\n }\n\n private readonly handleNativeMouseDown = (event: Event): void => {\n this._skipNextEscape = false;\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this._containerRef?.contains(target)) {\n if (!target.closest('[data-node-id]')) {\n this._treeState.setActiveNodeId(null);\n }\n return;\n }\n const isInsideOverlay = target.closest(\n '[role=\"menu\"], [role=\"listbox\"], [role=\"dialog\"]',\n );\n if (!isInsideOverlay) {\n this._treeState.setActiveNodeId(null);\n }\n };\n\n public handleEditEnter(): void {\n this.insertField();\n }\n\n public handleNodeAdded(nodeId: string): void {\n this._treeState.setActiveNodeId(nodeId);\n }\n\n public handleNodeReplaced(oldId: string, newId: string): void {\n if (this._treeState.activeNodeId === oldId) {\n this._treeState.setActiveNodeId(newId);\n if (this._mode === 'EDIT_NAME') {\n this._mode = 'TREE_NAV';\n }\n this.deferReturnFocus();\n }\n }\n\n private deferReturnFocus(): void {\n setTimeout(() => this.returnFocus(), 0);\n }\n\n public dispose(): void {\n for (const disposer of this._disposers) {\n disposer();\n }\n this._disposers.length = 0;\n this.setContainerRef(null);\n }\n\n private moveToNext(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const firstId = ids[0];\n if (firstId !== undefined) {\n this._treeState.setActiveNodeId(firstId);\n this.scrollToNode(firstId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex === -1 || currentIndex >= ids.length - 1) {\n return;\n }\n\n const nextId = ids[currentIndex + 1];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n this.scrollToNode(nextId);\n }\n }\n\n private moveToPrev(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const lastId = ids.at(-1);\n if (lastId !== undefined) {\n this._treeState.setActiveNodeId(lastId);\n this.scrollToNode(lastId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex <= 0) {\n return;\n }\n\n const prevId = ids[currentIndex - 1];\n if (prevId !== undefined) {\n this._treeState.setActiveNodeId(prevId);\n this.scrollToNode(prevId);\n }\n }\n\n private expandOrMoveToChild(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (!this._navigator.nodeHasChildren(node)) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !this._treeState.isExpanded(activeId)) {\n this._treeState.setExpanded(activeId, true);\n return;\n }\n\n const firstChild = this._navigator.getFirstChildId(node);\n if (firstChild) {\n this._treeState.setActiveNodeId(firstChild);\n this.scrollToNode(firstChild);\n }\n }\n\n private collapseOrMoveToParent(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (\n !isRoot &&\n this._navigator.nodeHasChildren(node) &&\n this._treeState.isExpanded(activeId)\n ) {\n this._treeState.setExpanded(activeId, false);\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (parentId) {\n this._treeState.setActiveNodeId(parentId);\n this.scrollToNode(parentId);\n }\n }\n\n private toggleExpand(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && this._navigator.nodeHasChildren(node)) {\n this._treeState.toggleExpanded(activeId);\n }\n }\n\n private insertField(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const accessor = this._accessors.get(activeId);\n accessor.actions.insertFieldAt(0, '');\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (!parentId) {\n return;\n }\n\n const parentNode = this._navigator.getNode(parentId);\n if (parentNode.isNull() || !parentNode.isObject()) {\n return;\n }\n\n const siblings = parentNode.properties();\n const currentIndex = siblings.findIndex((s) => s.id() === activeId);\n if (currentIndex === -1) {\n return;\n }\n\n const parentAccessor = this._accessors.get(parentId);\n parentAccessor.actions.insertFieldAt(currentIndex + 1, '');\n }\n\n private enterEditMode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n this._treeState.requestFocus(activeId);\n }\n\n private deactivateOrRemoveEmpty(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !node.isNull() && !node.name()) {\n this.removeNode();\n return;\n }\n\n this._treeState.setActiveNodeId(null);\n }\n\n private removeNode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const accessor = this._accessors.get(activeId);\n if (!accessor.actions.canRemove) {\n return;\n }\n\n const ids = this.visibleNodeIds;\n const currentIndex = ids.indexOf(activeId);\n\n accessor.actions.remove();\n\n const updatedIds = this.visibleNodeIds;\n if (updatedIds.length === 0) {\n this._treeState.setActiveNodeId(null);\n return;\n }\n\n const nextIndex = Math.min(currentIndex, updatedIds.length - 1);\n const nextId = updatedIds[nextIndex];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n }\n }\n\n private scrollToNode(nodeId: string): void {\n if (!this._containerRef) {\n return;\n }\n const el = this._containerRef.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (el) {\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n}\n","import {\n fileSchema,\n rowIdSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowCreatedAtSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n SystemSchemaIds,\n type RefSchemas,\n} from '@revisium/schema-toolkit';\n\nexport const defaultRefSchemas: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n","import * as mobx from 'mobx';\nimport {\n setReactivityProvider,\n createMobxProvider,\n} from '@revisium/schema-toolkit/core';\n\nlet initialized = false;\n\nexport function ensureReactivityProvider(): void {\n if (initialized) {\n return;\n }\n initialized = true;\n setReactivityProvider(createMobxProvider(mobx));\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n createTableModel,\n type TableModel,\n type SchemaModel,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type RefSchemas,\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '@revisium/schema-toolkit';\nimport { TreeState } from '../state/TreeState';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeActionsCallbacks,\n} from '../accessor';\nimport { AccessorCache } from './AccessorCache';\nimport { ValidationTracker } from './ValidationTracker';\nimport { ViewState } from './ViewState';\nimport { CollapseManager } from './CollapseManager';\nimport { KeyboardNavigation } from './KeyboardNavigation';\nimport { defaultRefSchemas } from '../../config/system-schemas';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\nimport { TreeNavigator } from '../utils/TreeNavigator';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorCoreOptions {\n tableId?: string;\n refSchemas?: RefSchemas;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorCore {\n private readonly _tableModel: TableModel;\n private readonly _treeState: TreeState;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n public readonly accessors: AccessorCache;\n public readonly validation: ValidationTracker;\n public readonly view: ViewState;\n public readonly collapse: CollapseManager;\n public readonly keyboard: KeyboardNavigation;\n\n constructor(\n jsonSchema: JsonObjectSchema,\n options: SchemaEditorCoreOptions = {},\n accessorFactory: NodeAccessorFactory = new NodeAccessorFactory(),\n ) {\n ensureReactivityProvider();\n\n this._tableModel = createTableModel({\n tableId: options.tableId ?? '',\n schema: jsonSchema,\n refSchemas: options.refSchemas ?? defaultRefSchemas,\n });\n\n this._treeState = new TreeState();\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const callbacks: NodeActionsCallbacks = {\n renameTable: (name) => this.setTableId(name),\n onNodeRemoved: (nodeId) => this.handleNodeRemoved(nodeId),\n onNodeAdded: (nodeId) => this.handleNodeAdded(nodeId),\n onNodeReplaced: (oldId, newId) => this.handleNodeReplaced(oldId, newId),\n selectForeignKey: () => this.selectForeignKey(),\n };\n\n this.accessors = new AccessorCache(\n () => this._tableModel.schema,\n () => ({\n schemaModel: this._tableModel.schema,\n treeState: this._treeState,\n getTableId: () => this._tableModel.tableId,\n getTableIdError: () => this.tableIdError,\n callbacks,\n }),\n accessorFactory,\n );\n\n this.validation = new ValidationTracker(\n this._tableModel,\n this.accessors,\n () => this.tableIdError,\n );\n\n this.view = new ViewState();\n this.collapse = new CollapseManager(\n this._treeState,\n () => this._tableModel.schema,\n );\n this.keyboard = new KeyboardNavigation(\n this._treeState,\n new TreeNavigator(() => this._tableModel.schema, this._treeState),\n this.accessors,\n );\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n if (shouldCollapse) {\n this.collapse.collapseIfComplex(complexity);\n }\n\n this.collapse.collapseRefNodes();\n\n makeAutoObservable(\n this,\n {\n accessors: false,\n validation: false,\n view: false,\n collapse: false,\n keyboard: false,\n },\n { autoBind: true },\n );\n }\n\n public get tableModel(): TableModel {\n return this._tableModel;\n }\n\n public get schemaModel(): SchemaModel {\n return this._tableModel.schema;\n }\n\n public get treeState(): TreeState {\n return this._treeState;\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdError(): string | null {\n const id = this._tableModel.tableId;\n if (id && !isValidFieldName(id)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableModel.rename(value);\n }\n\n public get rootAccessor(): NodeAccessor {\n return this.accessors.get(this._tableModel.schema.root.id(), true);\n }\n\n public get isDirty(): boolean {\n return this._tableModel.isDirty;\n }\n\n public get isValid(): boolean {\n return (\n this._tableModel.schema.isValid &&\n this.tableIdError === null &&\n this._tableModel.tableId.length > 0\n );\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public markAsSaved(): void {\n this._tableModel.commit();\n this.accessors.clear();\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._tableModel.schema.root;\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === 'Array' && !currentRoot.isArray()) {\n const result = this._tableModel.schema.wrapRootInArray();\n if (result) {\n this.accessors.clear();\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (fieldType) {\n const result = this._tableModel.schema.replaceRoot(fieldType);\n if (result) {\n this.accessors.clear();\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._tableModel.schema.moveNode(fromNodeId, toParentId);\n this.accessors.delete(fromNodeId);\n }\n\n public revert(): void {\n this._tableModel.revert();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n public dispose(): void {\n this.keyboard.dispose();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n private handleNodeRemoved(nodeId: string): void {\n this.accessors.delete(nodeId);\n this._treeState.clearNode(nodeId);\n if (this._treeState.activeNodeId === nodeId) {\n this._treeState.setActiveNodeId(null);\n }\n }\n\n private handleNodeAdded(nodeId: string): void {\n this.collapseIfRefNode(nodeId);\n this.keyboard.handleNodeAdded(nodeId);\n }\n\n private handleNodeReplaced(oldNodeId: string, newNodeId: string): void {\n this.accessors.delete(oldNodeId);\n\n if (oldNodeId !== newNodeId) {\n this._treeState.clearNode(oldNodeId);\n }\n\n this._treeState.setMenuOpen(newNodeId, false);\n this.keyboard.handleNodeReplaced(oldNodeId, newNodeId);\n this.collapseIfRefNode(newNodeId);\n }\n\n private collapseIfRefNode(nodeId: string): void {\n const node = this._tableModel.schema.nodeById(nodeId);\n if (node.isRef() && (node.isObject() || node.isArray())) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { SchemaEditorCore } from '../core';\nimport type { KeyboardNavigation } from '../core/KeyboardNavigation';\nimport type { NodeAccessor } from '../accessor';\n\nexport class SchemaTreeVM {\n constructor(private readonly _core: SchemaEditorCore) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get rootAccessor(): NodeAccessor {\n return this._core.rootAccessor;\n }\n\n public get schemaModel(): SchemaModel {\n return this._core.schemaModel;\n }\n\n public getChildAccessors(\n nodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n return this._core.accessors.getChildren(nodeId, parentIsReadonly);\n }\n\n public changeRootType(typeId: string): void {\n this._core.changeRootType(typeId);\n }\n\n public changeNodeType(accessor: NodeAccessor, typeId: string): void {\n if (accessor.isRoot) {\n this._core.changeRootType(typeId);\n } else {\n accessor.actions.changeType(typeId);\n }\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._core.moveNode(fromNodeId, toParentId);\n }\n\n public selectForeignKey(): Promise<string | null> {\n return this._core.selectForeignKey();\n }\n\n public get keyboard(): KeyboardNavigation {\n return this._core.keyboard;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n type TableModel,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport type CreateTableViewMode = 'Example' | 'Schema';\n\nexport class CreateTableDialogVM {\n private _viewMode: CreateTableViewMode = 'Example';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get viewMode(): CreateTableViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: CreateTableViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public get exampleData(): unknown {\n return this._tableModel.schema.generateDefaultValue({ arrayItemCount: 1 });\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n this._loading = false;\n }\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\n\nexport class ReviewErrorsDialogVM {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _getTableIdError: () => string | null,\n private readonly _getFormulaInputErrors: () => TreeFormulaValidationError[],\n private readonly _onRevert?: () => void,\n private readonly _onClose?: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRevert(): boolean {\n return this._onRevert !== undefined;\n }\n\n public revert(): void {\n this._onRevert?.();\n this._onClose?.();\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this._getFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { CreateTableDialogVM } from '../dialog/CreateTableDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type CreateDialogViewMode = 'Example' | 'Schema';\n\nexport interface CreatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class CreatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isCreateDialogOpen = false;\n private _createDialogViewMode: CreateDialogViewMode = 'Example';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: CreatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'creating' {\n return 'creating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n );\n }\n\n // ============ Create Dialog ============\n\n public get showCreateTableButton(): boolean {\n return this._core.isValid && !this._core.validation.hasErrors;\n }\n\n public get isCreateDialogOpen(): boolean {\n return this._isCreateDialogOpen;\n }\n\n public openCreateDialog(): void {\n this._isCreateDialogOpen = true;\n }\n\n public closeCreateDialog(): void {\n this._isCreateDialogOpen = false;\n }\n\n public get createDialogViewMode(): CreateDialogViewMode {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: CreateDialogViewMode): void {\n this._createDialogViewMode = mode;\n }\n\n public get createDialogVM(): CreateTableDialogVM {\n return new CreateTableDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.closeCreateDialog(),\n );\n }\n\n // ============ Actions ============\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeCreateDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n TableModel,\n SchemaPatch,\n JsonPatch,\n} from '@revisium/schema-toolkit';\n\nexport type ReviewChangesViewMode = 'Changes' | 'Patches';\n\nexport interface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\nexport class ReviewChangesDialogVM {\n private _viewMode: ReviewChangesViewMode = 'Changes';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onRevert: () => void,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdChange(): TableIdChangeInfo | null {\n if (!this.isTableIdChanged) {\n return null;\n }\n return {\n initialTableId: this.initialTableId,\n currentTableId: this.tableId,\n };\n }\n\n public get patches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public get jsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public get patchesCount(): number {\n return this.patches.length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get hasChanges(): boolean {\n return this.patchesCount > 0 || this.isTableIdChanged;\n }\n\n public get viewMode(): ReviewChangesViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ReviewChangesViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n public revert(): void {\n this._onRevert();\n this._onClose();\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { ReviewChangesDialogVM } from '../dialog/ReviewChangesDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type UpdateDialogViewMode = 'Changes' | 'Patches';\n\nexport interface UpdatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class UpdatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isChangesDialogOpen = false;\n private _updateDialogViewMode: UpdateDialogViewMode = 'Changes';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: UpdatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'updating' {\n return 'updating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n () => this.revert(),\n () => this.closeErrorsDialog(),\n );\n }\n\n // ============ Changes Dialog ============\n\n public get showApplyChangesButton(): boolean {\n return (\n this._core.isValid &&\n !this._core.validation.hasErrors &&\n (this._core.isDirty || this._core.isTableIdChanged)\n );\n }\n\n public get totalChangesCount(): number {\n return this._core.totalChangesCount;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get updateDialogViewMode(): UpdateDialogViewMode {\n return this._updateDialogViewMode;\n }\n\n public setUpdateDialogViewMode(mode: UpdateDialogViewMode): void {\n this._updateDialogViewMode = mode;\n }\n\n public get changesDialogVM(): ReviewChangesDialogVM {\n return new ReviewChangesDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.revert(),\n () => this.closeChangesDialog(),\n );\n }\n\n // ============ Actions ============\n\n public revert(): void {\n this._core.revert();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public getPatches() {\n return this._core.getPatches();\n }\n\n public getJsonPatches() {\n return this._core.getJsonPatches();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","export type {\n SchemaNode,\n SchemaModel,\n FieldType,\n} from '@revisium/schema-toolkit';\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport type NodeType =\n | 'object'\n | 'array'\n | 'string'\n | 'number'\n | 'boolean'\n | 'ref'\n | 'foreignKey';\n\nexport interface NodeUIState {\n isExpanded: boolean;\n isFocused: boolean;\n isMenuOpen: boolean;\n isSettingsOpen: boolean;\n}\n\nexport interface FormulaState {\n inputValue: string | null;\n errorValue: string | null;\n}\n\nexport interface DragState {\n isDragging: boolean;\n isDraggedOver: boolean;\n}\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ElementType;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: PiTreeViewThin,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: PiBracketsCurlyThin,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: PiLinkThin,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon as={currentMode.icon} boxSize={4} />\n <Icon\n as={PiCaretDownLight}\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n />\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon as={item.icon} boxSize={4} mr=\"8px\" />\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","import {\n FocusEventHandler,\n FormEventHandler,\n KeyboardEventHandler,\n RefCallback,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nexport interface UseContentEditableOptions {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: () => void;\n onFocus?: () => void;\n onEscape?: () => void;\n onEnter?: () => void;\n restrict?: RegExp;\n autoFocus?: boolean;\n focusTrigger?: number;\n}\n\nexport type UseContentEditableReturn = {\n ref: RefCallback<HTMLElement>;\n contentEditable: true;\n spellCheck: false;\n dangerouslySetInnerHTML: { __html: string };\n onInput: FormEventHandler<HTMLElement>;\n onBlur: FormEventHandler<HTMLElement>;\n onFocus: FocusEventHandler<HTMLElement>;\n onKeyDown: KeyboardEventHandler<HTMLElement>;\n};\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport function useContentEditable(\n options: UseContentEditableOptions,\n): UseContentEditableReturn {\n const { value, autoFocus, focusTrigger } = options;\n\n const elementRef = useRef<HTMLElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n const isFirstRender = useRef(true);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const ref: RefCallback<HTMLElement> = useCallback((node) => {\n elementRef.current = node;\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n elementRef.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && elementRef.current) {\n const maxPosition = (elementRef.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = elementRef.current.childNodes[0];\n const node: Node = firstChild ?? elementRef.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n\n elementRef.current?.focus();\n const selection = globalThis.getSelection();\n\n if (elementRef.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(elementRef.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }, [focusTrigger]);\n\n const handleInput: FormEventHandler<HTMLElement> = useCallback((event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n const val = textValue === '\\n' ? '' : textValue;\n optionsRef.current.onChange?.(val);\n }, []);\n\n const handleBlur: FormEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onBlur?.();\n cursorPosition.current = null;\n }, []);\n\n const handleFocus: FocusEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onFocus?.();\n }, []);\n\n const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(\n (event) => {\n const opts = optionsRef.current;\n\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (opts.value) {\n elementRef.current?.blur();\n opts.onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n elementRef.current?.blur();\n opts.onEscape?.();\n }\n\n if (\n opts.restrict &&\n !event.metaKey &&\n !event.ctrlKey &&\n !allowed.has(event.key) &&\n !opts.restrict.test(event.key)\n ) {\n event.preventDefault();\n }\n },\n [],\n );\n\n return {\n ref,\n contentEditable: true,\n spellCheck: false,\n dangerouslySetInnerHTML: { __html: escapeHtml(value) },\n onInput: handleInput,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n}\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef } from 'react';\nimport {\n useContentEditable,\n type UseContentEditableOptions,\n} from '../../hooks/useContentEditable';\n\nexport interface ContentEditableProps extends Pick<\n UseContentEditableOptions,\n | 'onChange'\n | 'onBlur'\n | 'onFocus'\n | 'onEscape'\n | 'onEnter'\n | 'restrict'\n | 'autoFocus'\n | 'focusTrigger'\n> {\n initValue: string;\n placeholder?: string;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nexport const ContentEditable: React.FC<ContentEditableProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusTrigger,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const elementRef = useRef<HTMLElement | null>(null);\n\n const editableProps = useContentEditable({\n value: initValue,\n onChange,\n onBlur,\n onFocus,\n onEscape,\n onEnter,\n restrict,\n autoFocus,\n focusTrigger,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n cursor=\"text\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={combinedRef}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n outline={0}\n width=\"100%\"\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onInput={editableProps.onInput}\n onKeyDown={editableProps.onKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon as={PiX} size=\"md\" />\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon as={PiCaretLeft} boxSize={4} color=\"gray.500\" />\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeWrapperProps {\n accessor: NodeAccessor;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const TreeNodeWrapper: FC<TreeNodeWrapperProps> = observer(\n ({\n accessor,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n dataTestId,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${accessor.nodeId}`;\n const collapseButtonClass = `collapse-button-${accessor.nodeId}`;\n\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const activeCollapseStyles =\n isActiveWithName && isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' as const },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' as const },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n ...(isActiveWithName\n ? { [`& .${hoverTargetClass}`]: { opacity: 1 } }\n : {}),\n }\n : {};\n\n const getCollapseButtonTestId = (): string | undefined => {\n if (!dataTestId) {\n return undefined;\n }\n return isCollapsed\n ? `${dataTestId}-expand-button`\n : `${dataTestId}-collapse-button`;\n };\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n css={activeCollapseStyles}\n data-node-id={accessor.nodeId}\n data-active={accessor.state.isActive || undefined}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n backgroundColor={accessor.state.isActive ? 'gray.100' : undefined}\n borderRadius=\"4px\"\n cursor=\"default\"\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n data-testid={getCollapseButtonTestId()}\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n triggerId?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n triggerId,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={triggerId}>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n triggerId={`${dataTestId}-menu-submenu-${option.id}`}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Flex, Icon } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiDotsSixVerticalBold } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface DragHandleProps {\n dataTestId: string;\n hoverClass?: string;\n applyHoverStyles: boolean;\n}\n\nexport const DragHandle: FC<DragHandleProps> = ({\n dataTestId,\n hoverClass,\n applyHoverStyles,\n}) => (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon as={PiDotsSixVerticalBold} size=\"md\" color=\"gray.300\" />\n </Flex>\n </Tooltip>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface ErrorIndicatorProps {\n dataTestId: string;\n errorMessage: string;\n}\n\nexport const ErrorIndicator: FC<ErrorIndicatorProps> = ({\n dataTestId,\n errorMessage,\n}) => (\n <Tooltip\n content={errorMessage}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n data-testid={`${dataTestId}-error-indicator`}\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n);\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ntype DragAndDropData = Record<string, unknown> & {\n accessor: NodeAccessor;\n};\n\nconst getDragData = (data: Record<string, unknown>): NodeAccessor | null => {\n const accessor = data.accessor;\n if (accessor && typeof accessor === 'object' && 'nodeId' in accessor) {\n return accessor as NodeAccessor;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n accessor: NodeAccessor;\n onDrop?: (fromNodeId: string) => void;\n canDrag: boolean;\n isDropTarget: boolean;\n canAcceptDrop: (fromNodeId: string) => boolean;\n}\n\nexport const useDragAndDrop = ({\n accessor,\n onDrop,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!canDrag || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ accessor }),\n });\n\n return () => cleanup();\n }, [accessor, canDrag]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (draggingAccessor && canAcceptDrop(draggingAccessor.nodeId)) {\n if (onDrop) {\n onDrop(draggingAccessor.nodeId);\n }\n }\n\n accessor.state.setDraggedOver(false);\n accessor.state.setDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingAccessor = getDragData(e.source.data);\n if (draggingAccessor) {\n accessor.state.setDraggedOver(canAcceptDrop(draggingAccessor.nodeId));\n }\n },\n onDragLeave: () => accessor.state.setDraggedOver(false),\n });\n\n return () => cleanup();\n }, [accessor, isDropTarget, onDrop, canAcceptDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (!draggingAccessor) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = canAcceptDrop(draggingAccessor.nodeId);\n\n if (canAccept) {\n accessor.state.setDrop(true);\n } else {\n accessor.state.setDisabledDrop(true);\n }\n } else {\n accessor.state.setDisabledDrop(true);\n }\n },\n onDrop: () => {\n accessor.state.setDrop(false);\n accessor.state.setDisabledDrop(false);\n },\n });\n }, [accessor, isDropTarget, canAcceptDrop]);\n\n return {\n dragAndDropRef,\n isDraggable: canDrag,\n isDrop: accessor.state.isDrop,\n isDisabledDrop: accessor.state.isDisabledDrop,\n isDraggedOver: accessor.state.isDraggedOver,\n };\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode, useCallback } from 'react';\nimport { ContentEditable } from '../../../../components/ContentEditable';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { DragHandle } from './DragHandle';\nimport { ErrorIndicator } from './ErrorIndicator';\nimport { useDragAndDrop } from './useDragAndDrop';\n\ninterface TreeNodeFieldProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const TreeNodeField: FC<TreeNodeFieldProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n hoverTargetClass,\n onChangeType,\n rightContent,\n }) => {\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n const applyHoverStyles = !accessor.state.isFocused && !isActiveWithName;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(accessor.label.name);\n\n const hasDropTarget = treeVM.schemaModel.hasValidDropTarget(\n accessor.nodeId,\n );\n const canDrag =\n !accessor.isRoot && !accessor.isReadonly && hasName && hasDropTarget;\n const isDropTarget = accessor.isObject && !accessor.isReadonly;\n\n const canAcceptDrop = useCallback(\n (fromNodeId: string) => {\n return treeVM.schemaModel.canMoveNode(fromNodeId, accessor.nodeId);\n },\n [accessor.nodeId, treeVM.schemaModel],\n );\n\n const handleDrop = useCallback(\n (fromNodeId: string) => {\n treeVM.moveNode(fromNodeId, accessor.nodeId);\n },\n [treeVM, accessor.nodeId],\n );\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({\n accessor,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n onDrop: handleDrop,\n });\n\n const showTypeSelector = !accessor.isReadonly;\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <DragHandle\n dataTestId={dataTestId}\n hoverClass={hoverClass}\n applyHoverStyles={applyHoverStyles}\n />\n )}\n {accessor.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {accessor.label.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!accessor.label.name}\n initValue={accessor.label.name}\n placeholder={\n accessor.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={accessor.handleFieldBlur}\n onFocus={() => accessor.state.setFocused(true)}\n onChange={accessor.actions.rename}\n onEnter={treeVM.keyboard.handleEditEnter}\n focusTrigger={accessor.state.focusRequestCount}\n />\n )}\n {hasName && accessor.validation.hasError && (\n <ErrorIndicator\n dataTestId={dataTestId}\n errorMessage={accessor.validation.errorMessage ?? ''}\n />\n )}\n </Flex>\n {hasName && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={accessor.state.isMenuOpen}\n onOpenChange={accessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {accessor.label.typeLabel}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {accessor.label.typeLabel}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT, PiFunction, PiWarning } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeIndicatorsProps {\n accessor: NodeAccessor;\n}\n\nexport const TreeNodeIndicators: FC<TreeNodeIndicatorsProps> = observer(\n ({ accessor }) => {\n const description = accessor.label.description;\n const hasFormula = accessor.formula.hasFormula;\n const formula = accessor.formula.formula;\n const isDeprecated = accessor.label.isDeprecated;\n\n const hasAnyIndicator = description || hasFormula || isDeprecated;\n\n if (!hasAnyIndicator) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\">\n {isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {hasFormula && (\n <Tooltip\n content={`Formula: ${formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n {description && (\n <Tooltip content={description} positioning={{ placement: 'top' }}>\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiTextT />\n </Box>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface DescriptionSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n accessor.label.description ?? '',\n );\n\n const handleBlur = () => {\n accessor.actions.setDescription(localValue || undefined);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-description-menu`}>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {accessor.label.description && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.label.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n autoFocus\n onFocus={(e) => {\n const len = e.currentTarget.value.length;\n e.currentTarget.setSelectionRange(len, len);\n }}\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport {\n validateFormulaAgainstSchema,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useEffect, useRef, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface FormulaSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nconst validateLocally = (\n value: string,\n fieldName: string,\n plainSchema: JsonObjectSchema,\n): string | null => {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const error = validateFormulaAgainstSchema(trimmed, fieldName, plainSchema);\n return error ? error.error : null;\n } catch {\n return 'Invalid formula';\n }\n};\n\nconst FormulaInput: FC<{\n accessor: NodeAccessor;\n dataTestId: string;\n}> = observer(({ accessor, dataTestId }) => {\n const initialValue = accessor.formula.formula;\n const initialError = accessor.formula.errorMessage ?? null;\n const [localValue, setLocalValue] = useState(initialValue);\n const [localError, setLocalError] = useState<string | null>(initialError);\n const localValueRef = useRef(localValue);\n const initialValueRef = useRef(initialValue);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n localValueRef.current = value;\n const error = validateLocally(\n value,\n accessor.label.name,\n accessor.formula.plainSchema,\n );\n setLocalError(error);\n };\n\n useEffect(() => {\n const accessorRef = accessor;\n const initialRef = initialValueRef;\n return () => {\n const value = localValueRef.current;\n if (value === initialRef.current) {\n return;\n }\n accessorRef.formula.setInputValue(value);\n accessorRef.formula.applyFormula();\n };\n }, [accessor]);\n\n const hasError = localError !== null;\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <>\n <Textarea\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n onFocus={(e) => {\n const len = e.currentTarget.value.length;\n e.currentTarget.setSelectionRange(len, len);\n }}\n rows={2}\n borderColor={hasError ? 'red.300' : undefined}\n data-testid={`${dataTestId}-formula-input`}\n />\n {hasError && (\n <Box\n fontSize=\"xs\"\n color=\"red.500\"\n mt={1}\n data-testid={`${dataTestId}-formula-error`}\n >\n {localError}\n </Box>\n )}\n {!hasError && localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt={1}>\n Field will be readOnly\n </Box>\n )}\n </>\n );\n});\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const hasError = accessor.formula.hasError;\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-formula-menu`}>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {accessor.formula.hasFormula && (\n <Box\n color={hasError ? 'red.400' : 'gray.400'}\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.formula.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content w=\"280px\" p={2}>\n <FormulaInput accessor={accessor} dataTestId={dataTestId} />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import type { NodeAccessor } from '../../../model/accessor';\n\nexport function parseDefaultValue(\n value: string,\n accessor: NodeAccessor,\n): unknown {\n const nodeType = accessor.label.nodeType;\n if (nodeType === 'number') {\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n if (nodeType === 'boolean') {\n return value === 'true';\n }\n return value;\n}\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { parseDefaultValue } from './parseDefaultValue';\n\ninterface DefaultValueSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(accessor.defaultValueAsString);\n\n const handleBlur = () => {\n accessor.actions.setDefaultValue(parseDefaultValue(localValue, accessor));\n };\n\n const handleBooleanChange = (checked: boolean) => {\n accessor.actions.setDefaultValue(checked);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n const isBoolean = accessor.label.nodeType === 'boolean';\n const isNumber = accessor.label.nodeType === 'number';\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-default-menu`}>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {accessor.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={accessor.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(accessor.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={isNumber ? 'number' : 'text'}\n placeholder={isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\n\ninterface TreeNodeContextMenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeContextMenu: FC<TreeNodeContextMenuProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (details: { open: boolean }) => {\n accessor.state.setSettingsOpen(details.open);\n };\n\n const canDelete = accessor.actions.canRemove;\n\n return (\n <Menu.Root\n open={accessor.state.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu accessor={accessor} dataTestId={dataTestId} />\n\n {showFormula && (\n <FormulaSubmenu accessor={accessor} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n accessor={accessor}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() =>\n accessor.actions.setDeprecated(!accessor.label.isDeprecated)\n }\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {accessor.label.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={canDelete ? 'fg.error' : 'gray.400'}\n disabled={!canDelete}\n onClick={canDelete ? onDelete : undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\n\ninterface TreeNodeRightContentProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeRightContent: FC<TreeNodeRightContentProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const showMenu = !accessor.isReadonly;\n\n return (\n <>\n <TreeNodeIndicators accessor={accessor} />\n {showMenu && (\n <TreeNodeContextMenu\n accessor={accessor}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeField } from '../TreeNodeField';\nimport { TreeNodeRightContent } from '../TreeNodeRightContent';\n\ninterface NodeViewLayoutProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n collapsible?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n children?: ReactNode;\n}\n\nexport const NodeViewLayout: FC<NodeViewLayoutProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n collapsible = false,\n showFormula,\n showDefault,\n children,\n }) => {\n const hoverTargetClass = accessor.hoverTargetClass;\n const isCollapsible = collapsible && !accessor.isRoot;\n const isCollapsed = isCollapsible && !accessor.state.isExpanded;\n\n return (\n <TreeNodeWrapper\n accessor={accessor}\n isCollapsible={isCollapsible}\n isCollapsed={isCollapsed}\n onToggleCollapse={\n isCollapsible ? accessor.state.toggleExpanded : undefined\n }\n hoverTargetClass={hoverTargetClass}\n dataTestId={dataTestId}\n field={\n <TreeNodeField\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={(typeId) => treeVM.changeNodeType(accessor, typeId)}\n rightContent={\n <TreeNodeRightContent\n accessor={accessor}\n dataTestId={dataTestId}\n showDelete={!accessor.isRoot}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={accessor.actions.remove}\n />\n }\n />\n }\n >\n {children}\n </TreeNodeWrapper>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { TreeNodeView } from '../TreeNodeView';\n\ninterface ObjectNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const hideContent = accessor.isRoot && !accessor.label.name;\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n const showAddButton = !accessor.isReadonly && !hideContent;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n {!hideContent && (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n )}\n </NodeViewLayout>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface ForeignKeyValueProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ accessor, dataTestId }) => {\n const value = accessor.label.foreignKeyTable;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={accessor.actions.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeView } from '../TreeNodeView';\nimport { ArrayItemsView } from './ArrayItemsView';\nimport { ForeignKeyValue } from './ForeignKeyValue';\n\ninterface ArrayItemsChildrenProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n if (accessor.isObject) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {accessor.actions.canAddProperty && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (accessor.isArray) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n if (children.length > 0 && children[0]) {\n return (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n }\n\n if (accessor.isForeignKey) {\n return <ForeignKeyValue accessor={accessor} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { ArrayItemsChildren } from './ArrayItemsChildren';\n\ninterface ArrayItemsViewProps {\n accessor: NodeAccessor;\n childAccessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ accessor, childAccessor, treeVM, dataTestId }) => {\n const hoverTargetClass = childAccessor.hoverTargetClass;\n const applyHoverStyles = childAccessor.shouldApplyFieldStyles;\n\n const handleChangeItemsType = (typeId: string) => {\n accessor.actions.changeItemsType(typeId);\n };\n\n return (\n <TreeNodeWrapper\n accessor={childAccessor}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={handleChangeItemsType}\n open={childAccessor.state.isMenuOpen}\n onOpenChange={childAccessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {childAccessor.label.typeLabel}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TreeNodeIndicators accessor={childAccessor} />\n {childAccessor.showMenu && (\n <TreeNodeContextMenu\n accessor={childAccessor}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n showFormula={childAccessor.isPrimitive}\n showDefault={childAccessor.isPrimitive}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n }\n >\n <ArrayItemsChildren\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-0`}\n />\n </TreeNodeWrapper>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { ArrayItemsView } from './ArrayItemsView';\n\ninterface ArrayNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.length > 0 && children[0] ? (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n ) : (\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"8px\">\n items\n </Text>\n )}\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface PrimitiveNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n showFormula={accessor.isPrimitive}\n showDefault={accessor.isPrimitive}\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useCallback } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface ForeignKeyNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const handleSelectForeignKey = useCallback(async () => {\n const tableId = await treeVM.selectForeignKey();\n if (tableId !== null) {\n accessor.actions.setForeignKey(tableId);\n }\n }, [treeVM, accessor.actions]);\n\n const foreignKeyValue = accessor.label.foreignKeyTable;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n >\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={handleSelectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {foreignKeyValue || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface RefNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n },\n);\n","import { Box, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { ObjectNodeView } from '../ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView';\n\ninterface TreeNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n showItemsLabel?: boolean;\n}\n\nexport const TreeNodeView: FC<TreeNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId, showItemsLabel }) => {\n const renderNode = () => {\n if (accessor.isObject) {\n return (\n <ObjectNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isArray) {\n return (\n <ArrayNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isForeignKey) {\n return (\n <ForeignKeyNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isRef) {\n return (\n <RefNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isPrimitive) {\n return (\n <PrimitiveNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n return null;\n };\n\n if (showItemsLabel) {\n return (\n <Box>\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"-6px\" mb=\"-4px\">\n items\n </Text>\n {renderNode()}\n </Box>\n );\n }\n\n return renderNode();\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface HighlightProps {\n children: ReactNode;\n}\n\nexport const Highlight: FC<HighlightProps> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface CodeBoxProps {\n children: ReactNode;\n}\n\nexport const CodeBox: FC<CodeBoxProps> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n","import { Flex, Portal } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogLayoutProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n maxWidth?: string;\n}\n\nexport const DialogLayout: FC<DialogLayoutProps> = ({\n isOpen,\n onClose,\n title,\n children,\n footer,\n maxWidth = '700px',\n}) => {\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth={maxWidth}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogBody>{children}</DialogBody>\n\n {footer && (\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {footer}\n </Flex>\n </DialogFooter>\n )}\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import { Button, Flex } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogFooterActionsProps {\n leftContent?: ReactNode;\n onCancel: () => void;\n onConfirm?: () => void;\n confirmLabel?: string;\n confirmDisabled?: boolean;\n confirmLoading?: boolean;\n showConfirm?: boolean;\n}\n\nexport const DialogFooterActions: FC<DialogFooterActionsProps> = ({\n leftContent,\n onCancel,\n onConfirm,\n confirmLabel = 'Confirm',\n confirmDisabled = false,\n confirmLoading = false,\n showConfirm = true,\n}) => {\n return (\n <>\n {leftContent ?? <div />}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n {showConfirm && onConfirm && (\n <Button\n variant=\"outline\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n loading={confirmLoading}\n >\n {confirmLabel}\n </Button>\n )}\n </Flex>\n </>\n );\n};\n","import {\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport { jsonPointerToSimplePath } from '@revisium/schema-toolkit';\nimport type { SchemaPatch, PropertyChange } from '@revisium/schema-toolkit';\nimport type { DefaultValueExample } from '../../../../model/utils';\n\nexport type PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nexport const operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nexport const formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nexport const formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '\"\"';\n }\n return JSON.stringify(value);\n};\n\nexport const getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nexport const getFilteredPropertyChanges = (\n op: string,\n propertyChanges: PropertyChange[],\n defaultExample: DefaultValueExample | null,\n): PropertyChange[] => {\n if (op === 'remove') {\n return [];\n }\n if (op === 'add' && defaultExample) {\n return propertyChanges.filter((c) => c.property !== 'default');\n }\n return propertyChanges;\n};\n","import { Badge, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiPencilSimpleLight } from 'react-icons/pi';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport { Highlight } from '../Highlight';\nimport { operationIcons, getFromFieldName, PatchOp } from './helpers';\n\ninterface OperationDescriptionProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const OperationDescription: FC<OperationDescriptionProps> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DefaultValueExample } from '../../../../model/utils';\nimport { formatDefaultValue } from './helpers';\n\ninterface DefaultValueRowProps {\n example: DefaultValueExample;\n}\n\nexport const DefaultValueRow: FC<DefaultValueRowProps> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n","import { Badge } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DataLossSeverity } from '../../../../model/utils';\n\ninterface DataLossBadgeProps {\n severity: DataLossSeverity;\n}\n\nexport const DataLossBadge: FC<DataLossBadgeProps> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n","import { Badge, Flex, Icon, Text, VStack } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport type { TransformationInfo } from '../../../../model/utils';\nimport { CodeBox } from '../CodeBox';\nimport { DataLossBadge } from './DataLossBadge';\n\ninterface TransformationInfoRowProps {\n info: TransformationInfo;\n}\n\nexport const TransformationInfoRow: FC<TransformationInfoRowProps> = ({\n info,\n}) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <CodeBox>{JSON.stringify(info.example.before)}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{JSON.stringify(info.example.after)}</CodeBox>\n </Flex>\n </VStack>\n );\n};\n","import { Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport { CodeBox } from '../CodeBox';\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nexport const ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n} from '../../../../model/utils';\nimport { OperationDescription } from './OperationDescription';\nimport { DefaultValueRow } from './DefaultValueRow';\nimport { TransformationInfoRow } from './TransformationInfoRow';\nimport { ValueChangeRow } from './ValueChangeRow';\nimport { formatChangeValue, getFilteredPropertyChanges } from './helpers';\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const { patch, typeChange, propertyChanges } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value !== undefined) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n const filteredChanges = useMemo(\n () => getFilteredPropertyChanges(patch.op, propertyChanges, defaultExample),\n [patch.op, propertyChanges, defaultExample],\n );\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {filteredChanges.map((change) => (\n <Box key={change.property} mt={2} ml={8}>\n <ValueChangeRow\n label={change.property}\n fromValue={formatChangeValue(change.from)}\n toValue={formatChangeValue(change.to)}\n />\n </Box>\n ))}\n </Box>\n );\n});\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowsLeftRightLight } from 'react-icons/pi';\nimport type { TableIdChangeInfo } from '../../../../model/dialog';\nimport { Highlight } from '../Highlight';\n\ninterface TableIdChangeRowProps {\n change: TableIdChangeInfo;\n}\n\nexport const TableIdChangeRow: FC<TableIdChangeRowProps> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n","import { Badge, Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\n\nexport type ErrorType = 'validation' | 'formula' | 'tableId';\n\ninterface ErrorItemProps {\n message: string;\n type?: ErrorType;\n fieldPath?: string;\n}\n\nexport const ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n","import { Button, Flex, Icon, Popover, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowCounterClockwiseBold } from 'react-icons/pi';\n\ninterface RevertButtonProps {\n onRevert: () => void;\n disabled?: boolean;\n}\n\nexport const RevertButton: FC<RevertButtonProps> = ({ onRevert, disabled }) => {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button variant=\"ghost\" size=\"sm\" color=\"gray.500\" disabled={disabled}>\n <Icon as={PiArrowCounterClockwiseBold} />\n Revert All\n </Button>\n </Popover.Trigger>\n <Popover.Positioner>\n <Popover.Content>\n <Popover.Arrow />\n <Popover.Body>\n <Text fontSize=\"sm\" mb={3}>\n This will revert all changes. Are you sure?\n </Text>\n <Flex gap={2} justify=\"flex-end\">\n <Popover.CloseTrigger asChild>\n <Button variant=\"outline\" size=\"xs\">\n Cancel\n </Button>\n </Popover.CloseTrigger>\n <Popover.CloseTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"xs\"\n colorPalette=\"red\"\n onClick={onRevert}\n >\n Revert\n </Button>\n </Popover.CloseTrigger>\n </Flex>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Popover.Root>\n );\n};\n","import { Box, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { ReviewErrorsDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n ErrorItem,\n RevertButton,\n} from '../shared';\n\ninterface ReviewErrorsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewErrorsDialogVM;\n}\n\nexport const ReviewErrorsDialog: FC<ReviewErrorsDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Errors for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n vm.canRevert ? <RevertButton onRevert={vm.revert} /> : undefined\n }\n onCancel={onClose}\n showConfirm={false}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack\n align=\"stretch\"\n gap={0}\n divideY=\"1px\"\n divideColor=\"gray.100\"\n >\n {vm.tableIdError && (\n <ErrorItem\n key=\"tableId-error\"\n message={vm.tableIdError}\n type=\"tableId\"\n />\n )}\n {vm.validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {vm.formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Flex, SegmentGroup, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { ReviewChangesDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n PatchRow,\n TableIdChangeRow,\n RevertButton,\n} from '../shared';\n\ninterface ReviewChangesDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewChangesDialogVM;\n}\n\nexport const ReviewChangesDialog: FC<ReviewChangesDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n const applyButtonText = `Apply Changes (${vm.totalChangesCount})`;\n\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Changes for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n <RevertButton onRevert={vm.revert} disabled={!vm.hasChanges} />\n }\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel={applyButtonText}\n confirmDisabled={!vm.hasChanges}\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n {vm.hasChanges ? (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Changes' | 'Patches')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Changes', 'Patches']} />\n </SegmentGroup.Root>\n\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Changes' ? (\n <>\n {vm.tableIdChange && (\n <TableIdChangeRow change={vm.tableIdChange} />\n )}\n {vm.patches.map((schemaPatch) => (\n <PatchRow\n key={`${schemaPatch.patch.op}:${schemaPatch.patch.path}`}\n schemaPatch={schemaPatch}\n />\n ))}\n </>\n ) : (\n <JsonCard readonly data={vm.patches.map((p) => p.patch)} />\n )}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n ) : (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, SegmentGroup, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { CreateTableDialogVM } from '../../../model/dialog';\nimport type { JsonValue } from '../../../types';\nimport { DialogLayout, DialogFooterActions } from '../shared';\n\ninterface CreateTableDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: CreateTableDialogVM;\n}\n\nexport const CreateTableDialog: FC<CreateTableDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Create Table \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel=\"Create Table\"\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Example' | 'Schema')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Example' ? (\n <JsonCard readonly data={(vm.exampleData ?? null) as JsonValue} />\n ) : (\n <JsonCard readonly data={(vm.plainSchema ?? null) as JsonValue} />\n )}\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { ViewerSwitcherMode } from '../../types';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { BaseEditorVM } from '../../model/vm/types';\nimport { TreeNodeView } from '../tree';\nimport { ReviewErrorsDialog } from '../dialog';\nimport type { JsonValue } from '../../types';\n\nexport interface SchemaEditorProps {\n vm: BaseEditorVM;\n dataTestId: string;\n backButton: ReactNode;\n primaryAction?: {\n show: boolean;\n label: string;\n testId: string;\n onClick: () => void;\n };\n dialogs: ReactNode;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(\n ({ vm, dataTestId, backButton, primaryAction, dialogs }) => {\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={{\n '&:hover .editor-hover-target': { opacity: 1 },\n }}\n data-testid={dataTestId}\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {backButton}\n {vm.showReviewErrorsButton && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={vm.openErrorsDialog}\n data-testid=\"schema-editor-review-errors-button\"\n >\n Review Errors ({vm.errorsCount})\n </Button>\n )}\n {primaryAction?.show && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={primaryAction.onClick}\n loading={vm.loading}\n data-testid={primaryAction.testId}\n >\n {primaryAction.label}\n </Button>\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={vm.viewMode as ViewerSwitcherMode}\n onChange={(mode) => vm.setViewMode(mode)}\n />\n </Box>\n </Flex>\n\n {vm.viewMode === ViewerSwitcherMode.Tree && (\n <Box\n ref={(el: HTMLDivElement | null) =>\n vm.tree.keyboard.setContainerRef(el)\n }\n tabIndex={0}\n onKeyDown={vm.tree.keyboard.handleKeyDown}\n outline={0}\n paddingBottom=\"4rem\"\n >\n <TreeNodeView\n accessor={vm.tree.rootAccessor}\n treeVM={vm.tree}\n dataTestId=\"root\"\n />\n </Box>\n )}\n\n {vm.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={vm.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ReviewErrorsDialog\n isOpen={vm.isErrorsDialogOpen}\n onClose={vm.closeErrorsDialog}\n vm={vm.errorsDialogVM}\n />\n\n {dialogs}\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CloseButton } from '../../../components';\nimport type { CreatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { CreateTableDialog } from '../dialog';\n\nexport interface CreatingSchemaEditorProps {\n vm: CreatingEditorVM;\n}\n\nexport const CreatingSchemaEditor: FC<CreatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-creating\"\n backButton={\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showCreateTableButton,\n label: 'Create Table',\n testId: 'schema-editor-create-button',\n onClick: vm.openCreateDialog,\n }}\n dialogs={\n <CreateTableDialog\n isOpen={vm.isCreateDialogOpen}\n onClose={vm.closeCreateDialog}\n vm={vm.createDialogVM}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { BackButton } from '../../../components/BackButton';\nimport type { UpdatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { ReviewChangesDialog } from '../dialog';\n\nexport interface UpdatingSchemaEditorProps {\n vm: UpdatingEditorVM;\n}\n\nexport const UpdatingSchemaEditor: FC<UpdatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-updating\"\n backButton={\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showApplyChangesButton,\n label: `Apply Changes (${vm.totalChangesCount})`,\n testId: 'schema-editor-approve-button',\n onClick: vm.openChangesDialog,\n }}\n dialogs={\n <ReviewChangesDialog\n isOpen={vm.isChangesDialogOpen}\n onClose={vm.closeChangesDialog}\n vm={vm.changesDialogVM}\n />\n }\n />\n );\n },\n);\n","import type { Diagnostic, SchemaDefinition, ValueType } from '../core/types';\nimport type {\n ArrayValueNode,\n ObjectValueNode,\n PrimitiveValueNode,\n ValueNode,\n} from './types';\n\nlet nodeIdCounter = 0;\n\nexport function generateNodeId(): string {\n return `node-${++nodeIdCounter}`;\n}\n\nexport function resetNodeIdCounter(): void {\n nodeIdCounter = 0;\n}\n\nexport abstract class BaseValueNode implements ValueNode {\n readonly id: string;\n abstract readonly type: ValueType;\n readonly schema: SchemaDefinition;\n\n private _parent: ValueNode | null = null;\n private readonly _name: string;\n\n constructor(id: string | undefined, name: string, schema: SchemaDefinition) {\n this.id = id ?? generateNodeId();\n this._name = name;\n this.schema = schema;\n }\n\n get parent(): ValueNode | null {\n return this._parent;\n }\n\n set parent(value: ValueNode | null) {\n this._parent = value;\n }\n\n get name(): string {\n return this._name;\n }\n\n abstract get value(): unknown;\n abstract getPlainValue(): unknown;\n\n isObject(): this is ObjectValueNode {\n return false;\n }\n\n isArray(): this is ArrayValueNode {\n return false;\n }\n\n isPrimitive(): this is PrimitiveValueNode {\n return false;\n }\n\n get errors(): readonly Diagnostic[] {\n return [];\n }\n\n get warnings(): readonly Diagnostic[] {\n return [];\n }\n\n get isValid(): boolean {\n return this.errors.length === 0;\n }\n\n get hasWarnings(): boolean {\n return this.warnings.length > 0;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type {\n Diagnostic,\n FormulaDefinition,\n FormulaWarning,\n SchemaDefinition,\n} from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { PrimitiveValueNode } from './types';\n\nexport abstract class BasePrimitiveValueNode<\n T extends string | number | boolean,\n>\n extends BaseValueNode\n implements PrimitiveValueNode\n{\n protected _value: T;\n protected _baseValue: T;\n protected _formulaWarning: FormulaWarning | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value: T | undefined,\n defaultValue: T,\n ) {\n super(id, name, schema);\n const initialValue = value ?? (schema.default as T) ?? defaultValue;\n this._value = initialValue;\n this._baseValue = initialValue;\n }\n\n protected initObservable(): void {\n makeObservable<\n BasePrimitiveValueNode<T>,\n '_value' | '_baseValue' | '_formulaWarning'\n >(this, {\n _value: observable,\n _baseValue: observable,\n _formulaWarning: observable,\n value: computed,\n baseValue: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n setValue: action,\n setFormulaWarning: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): T {\n return this._value;\n }\n\n set value(newValue: T) {\n if (this.isReadOnly) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = newValue;\n }\n\n get baseValue(): T {\n return this._baseValue;\n }\n\n get isDirty(): boolean {\n return this._value !== this._baseValue;\n }\n\n abstract get defaultValue(): T;\n\n get formula(): FormulaDefinition | undefined {\n const xFormula = this.schema['x-formula'];\n if (xFormula) {\n return { expression: xFormula.expression, version: xFormula.version };\n }\n return undefined;\n }\n\n get formulaWarning(): FormulaWarning | null {\n return this._formulaWarning;\n }\n\n get isReadOnly(): boolean {\n return this.schema.readOnly === true || this.formula !== undefined;\n }\n\n getPlainValue(): T {\n return this._value;\n }\n\n setValue(value: unknown, options?: { internal?: boolean }): void {\n if (this.isReadOnly && !options?.internal) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = this.coerceValue(value);\n }\n\n protected abstract coerceValue(value: unknown): T;\n\n setFormulaWarning(warning: FormulaWarning | null): void {\n this._formulaWarning = warning;\n }\n\n commit(): void {\n this._baseValue = this._value;\n }\n\n revert(): void {\n this._value = this._baseValue;\n }\n\n override isPrimitive(): this is PrimitiveValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n return this.computeErrors();\n }\n\n protected computeErrors(): readonly Diagnostic[] {\n return [];\n }\n\n override get warnings(): readonly Diagnostic[] {\n if (!this._formulaWarning) {\n return [];\n }\n\n return [\n {\n severity: 'warning',\n type: this._formulaWarning.type,\n message: this._formulaWarning.message,\n path: this.name,\n params: {\n expression: this._formulaWarning.expression,\n computedValue: this._formulaWarning.computedValue,\n },\n },\n ];\n }\n}\n","export type DiagnosticSeverity = 'error' | 'warning' | 'info';\n\nexport interface Diagnostic {\n readonly severity: DiagnosticSeverity;\n readonly type: string;\n readonly message: string;\n readonly path: string;\n readonly params?: Record<string, unknown>;\n}\n\nexport interface SchemaDefinition {\n readonly type?: string;\n readonly $ref?: string;\n readonly default?: unknown;\n readonly readOnly?: boolean;\n readonly required?: boolean;\n readonly format?: string;\n readonly properties?: Record<string, SchemaDefinition>;\n readonly items?: SchemaDefinition;\n readonly additionalProperties?: boolean;\n readonly foreignKey?: string;\n readonly 'x-formula'?: { version: number; expression: string };\n readonly minimum?: number;\n readonly maximum?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly pattern?: string;\n readonly enum?: readonly unknown[];\n}\n\nexport enum ValueType {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n Ref = 'ref',\n}\n\nexport interface FormulaDefinition {\n readonly expression: string;\n readonly version?: number;\n}\n\nexport interface FormulaWarning {\n readonly type:\n | 'nan'\n | 'infinity'\n | 'type-coercion'\n | 'division-by-zero'\n | 'null-reference'\n | 'runtime-error';\n readonly message: string;\n readonly expression: string;\n readonly computedValue: unknown;\n}\n\nexport type ChangeType =\n | 'setValue'\n | 'addProperty'\n | 'removeProperty'\n | 'arrayPush'\n | 'arrayInsert'\n | 'arrayRemove'\n | 'arrayMove'\n | 'arrayReplace'\n | 'arrayClear';\n\nimport type { Path } from './Path';\n\nexport interface Change {\n readonly type: ChangeType;\n readonly path: Path;\n readonly value?: unknown;\n readonly oldValue?: unknown;\n readonly fromIndex?: number;\n readonly toIndex?: number;\n readonly index?: number;\n}\n\nexport type JsonPatchOp =\n | 'add'\n | 'remove'\n | 'replace'\n | 'move'\n | 'copy'\n | 'test';\n\nexport interface JsonPatch {\n readonly op: JsonPatchOp;\n readonly path: string;\n readonly value?: unknown;\n readonly from?: string;\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class StringValueNode extends BasePrimitiveValueNode<string> {\n readonly type = ValueType.String;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: string,\n ) {\n super(id, name, schema, value, '');\n this.initObservable();\n }\n\n get defaultValue(): string {\n return (this.schema.default as string) ?? '';\n }\n\n protected coerceValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (value === null || value === undefined) {\n return '';\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n this.validateRequired(errors);\n this.validateForeignKey(errors);\n this.validateMinLength(errors);\n this.validateMaxLength(errors);\n this.validatePattern(errors);\n this.validateEnum(errors);\n\n return errors;\n }\n\n private validateRequired(errors: Diagnostic[]): void {\n if (this.schema.required && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'required',\n message: 'Field is required',\n path: this.name,\n });\n }\n }\n\n private validateForeignKey(errors: Diagnostic[]): void {\n const foreignKey = this.schema.foreignKey;\n if (foreignKey && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'foreignKey',\n message: `Reference to ${foreignKey} is required`,\n path: this.name,\n params: { table: foreignKey },\n });\n }\n }\n\n private validateMinLength(errors: Diagnostic[]): void {\n const minLength = this.schema.minLength;\n if (\n minLength !== undefined &&\n this._value.length > 0 &&\n this._value.length < minLength\n ) {\n errors.push({\n severity: 'error',\n type: 'minLength',\n message: `Minimum length is ${minLength}`,\n path: this.name,\n params: { min: minLength, actual: this._value.length },\n });\n }\n }\n\n private validateMaxLength(errors: Diagnostic[]): void {\n const maxLength = this.schema.maxLength;\n if (maxLength !== undefined && this._value.length > maxLength) {\n errors.push({\n severity: 'error',\n type: 'maxLength',\n message: `Maximum length is ${maxLength}`,\n path: this.name,\n params: { max: maxLength, actual: this._value.length },\n });\n }\n }\n\n private validatePattern(errors: Diagnostic[]): void {\n const pattern = this.schema.pattern;\n if (!pattern || this._value.length === 0) {\n return;\n }\n\n try {\n if (!new RegExp(pattern).test(this._value)) {\n errors.push({\n severity: 'error',\n type: 'pattern',\n message: 'Value does not match pattern',\n path: this.name,\n params: { pattern },\n });\n }\n } catch {\n errors.push({\n severity: 'error',\n type: 'invalidPattern',\n message: 'Invalid regex pattern in schema',\n path: this.name,\n params: { pattern },\n });\n }\n }\n\n private validateEnum(errors: Diagnostic[]): void {\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n }\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class NumberValueNode extends BasePrimitiveValueNode<number> {\n readonly type = ValueType.Number;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: number,\n ) {\n super(id, name, schema, value, 0);\n this.initObservable();\n }\n\n get defaultValue(): number {\n return (this.schema.default as number) ?? 0;\n }\n\n protected coerceValue(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n return Number(value) || 0;\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n const minimum = this.schema.minimum;\n if (minimum !== undefined && this._value < minimum) {\n errors.push({\n severity: 'error',\n type: 'min',\n message: `Value must be at least ${minimum}`,\n path: this.name,\n params: { min: minimum, actual: this._value },\n });\n }\n\n const maximum = this.schema.maximum;\n if (maximum !== undefined && this._value > maximum) {\n errors.push({\n severity: 'error',\n type: 'max',\n message: `Value must be at most ${maximum}`,\n path: this.name,\n params: { max: maximum, actual: this._value },\n });\n }\n\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n\n return errors;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class BooleanValueNode extends BasePrimitiveValueNode<boolean> {\n readonly type = ValueType.Boolean;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: boolean,\n ) {\n super(id, name, schema, value, false);\n this.initObservable();\n }\n\n get defaultValue(): boolean {\n return (this.schema.default as boolean) ?? false;\n }\n\n protected coerceValue(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n return Boolean(value);\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ObjectValueNode as IObjectValueNode, ValueNode } from './types';\n\nexport class ObjectValueNode extends BaseValueNode implements IObjectValueNode {\n readonly type = ValueType.Object;\n\n private _children: Map<string, ValueNode> = new Map();\n private _baseChildren: Map<string, ValueNode> = new Map();\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n children?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (children) {\n for (const child of children) {\n this._children.set(child.name, child);\n child.parent = this;\n }\n }\n\n this._baseChildren = new Map(this._children);\n\n makeObservable<ObjectValueNode, '_children' | '_baseChildren'>(this, {\n _children: observable,\n _baseChildren: observable,\n value: computed,\n children: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n addChild: action,\n removeChild: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): Record<string, ValueNode> {\n return Object.fromEntries(this._children);\n }\n\n get children(): readonly ValueNode[] {\n return Array.from(this._children.values());\n }\n\n getPlainValue(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, node] of this._children) {\n result[key] = node.getPlainValue();\n }\n return result;\n }\n\n child(name: string): ValueNode | undefined {\n return this._children.get(name);\n }\n\n hasChild(name: string): boolean {\n return this._children.has(name);\n }\n\n addChild(node: ValueNode): void {\n const existing = this._children.get(node.name);\n if (existing) {\n existing.parent = null;\n }\n node.parent = this;\n this._children.set(node.name, node);\n }\n\n removeChild(name: string): void {\n const node = this._children.get(name);\n if (node) {\n node.parent = null;\n this._children.delete(name);\n }\n }\n\n get isDirty(): boolean {\n if (this._children.size !== this._baseChildren.size) {\n return true;\n }\n\n for (const [key, child] of this._children) {\n if (this._baseChildren.get(key) !== child) {\n return true;\n }\n }\n\n for (const child of this._children.values()) {\n if ('isDirty' in child && (child as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseChildren = new Map(this._children);\n for (const child of this._children.values()) {\n if ('commit' in child && typeof child.commit === 'function') {\n (child as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const child of this._children.values()) {\n child.parent = null;\n }\n\n this._children = new Map(this._baseChildren);\n\n for (const child of this._children.values()) {\n child.parent = this;\n if ('revert' in child && typeof child.revert === 'function') {\n (child as { revert: () => void }).revert();\n }\n }\n }\n\n override isObject(): this is IObjectValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n errors.push(...child.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n warnings.push(...child.warnings);\n }\n\n return warnings;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ArrayValueNode as IArrayValueNode, ValueNode } from './types';\nimport type { NodeFactory } from './NodeFactory';\n\nexport class ArrayValueNode extends BaseValueNode implements IArrayValueNode {\n readonly type = ValueType.Array;\n\n private _items: ValueNode[] = [];\n private _baseItems: ValueNode[] = [];\n private _nodeFactory: NodeFactory | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n items?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (items) {\n for (const item of items) {\n item.parent = this;\n this._items.push(item);\n }\n }\n\n this._baseItems = [...this._items];\n\n makeObservable<ArrayValueNode, '_items' | '_baseItems'>(this, {\n _items: observable,\n _baseItems: observable,\n value: computed,\n length: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n push: action,\n insertAt: action,\n removeAt: action,\n move: action,\n replaceAt: action,\n clear: action,\n commit: action,\n revert: action,\n pushValue: action,\n insertValueAt: action,\n });\n }\n\n get value(): readonly ValueNode[] {\n return this._items;\n }\n\n get length(): number {\n return this._items.length;\n }\n\n getPlainValue(): unknown[] {\n return this._items.map((item) => item.getPlainValue());\n }\n\n at(index: number): ValueNode | undefined {\n if (index < 0) {\n return this._items[this._items.length + index];\n }\n return this._items[index];\n }\n\n push(node: ValueNode): void {\n node.parent = this;\n this._items.push(node);\n }\n\n insertAt(index: number, node: ValueNode): void {\n if (index < 0 || index > this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n node.parent = this;\n this._items.splice(index, 0, node);\n }\n\n removeAt(index: number): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const removed = this._items.splice(index, 1)[0];\n if (removed) {\n removed.parent = null;\n }\n }\n\n move(fromIndex: number, toIndex: number): void {\n if (fromIndex < 0 || fromIndex >= this._items.length) {\n throw new Error(`Source index out of bounds: ${fromIndex}`);\n }\n if (toIndex < 0 || toIndex >= this._items.length) {\n throw new Error(`Target index out of bounds: ${toIndex}`);\n }\n if (fromIndex === toIndex) {\n return;\n }\n\n const [item] = this._items.splice(fromIndex, 1);\n if (item) {\n this._items.splice(toIndex, 0, item);\n }\n }\n\n replaceAt(index: number, node: ValueNode): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const oldNode = this._items[index];\n if (oldNode) {\n oldNode.parent = null;\n }\n node.parent = this;\n this._items[index] = node;\n }\n\n clear(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n this._items.length = 0;\n }\n\n setNodeFactory(factory: NodeFactory): void {\n this._nodeFactory = factory;\n }\n\n pushValue(value?: unknown): void {\n const node = this.createItemNode(this._items.length, value);\n this.push(node);\n }\n\n insertValueAt(index: number, value?: unknown): void {\n const node = this.createItemNode(index, value);\n this.insertAt(index, node);\n }\n\n private createItemNode(index: number, value?: unknown): ValueNode {\n if (!this._nodeFactory) {\n throw new Error('NodeFactory not set');\n }\n\n const itemSchema = this.schema.items;\n if (!itemSchema) {\n throw new Error('No items schema');\n }\n\n const itemValue = value === undefined ? itemSchema.default : value;\n const node = this._nodeFactory.create(String(index), itemSchema, itemValue);\n\n this.propagateFactory(node);\n\n return node;\n }\n\n private propagateFactory(node: ValueNode): void {\n if (!this._nodeFactory) {\n return;\n }\n\n if (node.isArray()) {\n node.setNodeFactory(this._nodeFactory);\n for (const item of node.value) {\n this.propagateFactory(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.propagateFactory(child);\n }\n }\n }\n\n get isDirty(): boolean {\n if (this._items.length !== this._baseItems.length) {\n return true;\n }\n\n for (let i = 0; i < this._items.length; i++) {\n if (this._items[i] !== this._baseItems[i]) {\n return true;\n }\n }\n\n for (const item of this._items) {\n if ('isDirty' in item && (item as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseItems = [...this._items];\n for (const item of this._items) {\n if ('commit' in item && typeof item.commit === 'function') {\n (item as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n\n this._items = [...this._baseItems];\n\n for (const item of this._items) {\n item.parent = this;\n if ('revert' in item && typeof item.revert === 'function') {\n (item as { revert: () => void }).revert();\n }\n }\n }\n\n override isArray(): this is IArrayValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const item of this._items) {\n errors.push(...item.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const item of this._items) {\n warnings.push(...item.warnings);\n }\n\n return warnings;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport type { ValueNode } from './types';\nimport { StringValueNode } from './StringValueNode';\nimport { NumberValueNode } from './NumberValueNode';\nimport { BooleanValueNode } from './BooleanValueNode';\nimport { ObjectValueNode } from './ObjectValueNode';\nimport { ArrayValueNode } from './ArrayValueNode';\n\nexport type NodeFactoryFn = (\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n) => ValueNode;\n\nexport class NodeFactoryRegistry {\n private readonly factories = new Map<string, NodeFactoryFn>();\n\n register(schemaType: string, factory: NodeFactoryFn): this {\n this.factories.set(schemaType, factory);\n return this;\n }\n\n get(schemaType: string): NodeFactoryFn | undefined {\n return this.factories.get(schemaType);\n }\n\n has(schemaType: string): boolean {\n return this.factories.has(schemaType);\n }\n}\n\nexport class NodeFactory {\n constructor(private readonly registry: NodeFactoryRegistry) {}\n\n create(\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n ): ValueNode {\n const schemaType = schema.type ?? 'object';\n const factory = this.registry.get(schemaType);\n\n if (!factory) {\n throw new Error(`Unknown schema type: ${schemaType}`);\n }\n\n return factory(name, schema, value, id);\n }\n\n createTree(schema: SchemaDefinition, value: unknown): ValueNode {\n return this.create('', schema, value);\n }\n}\n\nconst stringFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new StringValueNode(id, name, schema, value as string | undefined);\n};\n\nconst numberFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new NumberValueNode(id, name, schema, value as number | undefined);\n};\n\nconst booleanFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new BooleanValueNode(id, name, schema, value as boolean | undefined);\n};\n\nfunction createObjectFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const objValue = (value ?? {}) as Record<string, unknown>;\n const children: ValueNode[] = [];\n\n const properties = schema.properties ?? {};\n for (const [propName, propSchema] of Object.entries(properties)) {\n const propValue = objValue[propName];\n const childNode = nodeFactory.create(propName, propSchema, propValue);\n children.push(childNode);\n }\n\n return new ObjectValueNode(id, name, schema, children);\n };\n}\n\nfunction createArrayFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const arrValue = (value ?? []) as unknown[];\n const itemSchema = schema.items ?? { type: 'string' };\n const items: ValueNode[] = [];\n\n for (let i = 0; i < arrValue.length; i++) {\n const itemValue = arrValue[i];\n const itemNode = nodeFactory.create(String(i), itemSchema, itemValue);\n items.push(itemNode);\n }\n\n return new ArrayValueNode(id, name, schema, items);\n };\n}\n\nexport function createDefaultRegistry(): NodeFactoryRegistry {\n const registry = new NodeFactoryRegistry();\n\n registry.register('string', stringFactory);\n registry.register('number', numberFactory);\n registry.register('boolean', booleanFactory);\n\n return registry;\n}\n\nexport function createNodeFactory(): NodeFactory {\n const registry = createDefaultRegistry();\n const factory = new NodeFactory(registry);\n\n registry.register('object', createObjectFactory(factory));\n registry.register('array', createArrayFactory(factory));\n\n return factory;\n}\n","export type PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number }\n | { type: 'items' };\n\nexport class Path {\n private constructor(private readonly _segments: readonly PathSegment[]) {}\n\n static empty(): Path {\n return new Path([]);\n }\n\n private static readonly INDEX_REGEX = /^\\[(\\d+)\\]/;\n private static readonly PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\n static fromString(path: string): Path {\n if (!path || path === '') {\n return Path.empty();\n }\n\n const segments: PathSegment[] = [];\n let current = path;\n\n while (current.length > 0) {\n const indexMatch = Path.INDEX_REGEX.exec(current);\n if (indexMatch?.[1] !== undefined) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n if (current.startsWith('[*]')) {\n segments.push({ type: 'items' });\n current = current.slice(3);\n continue;\n }\n\n const propMatch = Path.PROP_REGEX.exec(current);\n if (propMatch?.[1] !== undefined) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n throw new Error(`Invalid path segment: ${current}`);\n }\n\n return new Path(segments);\n }\n\n static fromSegments(segments: readonly PathSegment[]): Path {\n return new Path([...segments]);\n }\n\n segments(): readonly PathSegment[] {\n return this._segments;\n }\n\n isEmpty(): boolean {\n return this._segments.length === 0;\n }\n\n length(): number {\n return this._segments.length;\n }\n\n first(): PathSegment | undefined {\n return this._segments[0];\n }\n\n last(): PathSegment | undefined {\n return this._segments.at(-1);\n }\n\n parent(): Path {\n if (this._segments.length === 0) {\n return this;\n }\n return new Path(this._segments.slice(0, -1));\n }\n\n child(name: string): Path {\n return new Path([...this._segments, { type: 'property', name }]);\n }\n\n childIndex(index: number): Path {\n return new Path([...this._segments, { type: 'index', index }]);\n }\n\n childItems(): Path {\n return new Path([...this._segments, { type: 'items' }]);\n }\n\n isChildOf(parent: Path): boolean {\n if (parent._segments.length >= this._segments.length) {\n return false;\n }\n\n for (let i = 0; i < parent._segments.length; i++) {\n const parentSeg = parent._segments[i];\n const thisSeg = this._segments[i];\n if (!parentSeg || !thisSeg || !this.segmentEquals(parentSeg, thisSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n equals(other: Path): boolean {\n if (this._segments.length !== other._segments.length) {\n return false;\n }\n\n for (let i = 0; i < this._segments.length; i++) {\n const thisSeg = this._segments[i];\n const otherSeg = other._segments[i];\n if (!thisSeg || !otherSeg || !this.segmentEquals(thisSeg, otherSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n asSimple(): string {\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n if (result.length > 0) {\n result += '.';\n }\n result += segment.name;\n } else if (segment.type === 'index') {\n result += `[${segment.index}]`;\n } else if (segment.type === 'items') {\n result += '[*]';\n }\n }\n\n return result;\n }\n\n asJsonPointer(): string {\n if (this._segments.length === 0) {\n return '';\n }\n\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n result += '/' + segment.name;\n } else if (segment.type === 'index') {\n result += '/' + segment.index;\n } else if (segment.type === 'items') {\n result += '/-';\n }\n }\n\n return result;\n }\n\n private segmentEquals(a: PathSegment, b: PathSegment): boolean {\n if (a.type !== b.type) {\n return false;\n }\n\n if (a.type === 'property' && b.type === 'property') {\n return a.name === b.name;\n }\n\n if (a.type === 'index' && b.type === 'index') {\n return a.index === b.index;\n }\n\n return true;\n }\n}\n","import { Path } from '../core/Path';\nimport type { ValueNode } from '../node/types';\n\nexport class TreeIndex {\n private readonly nodesById = new Map<string, ValueNode>();\n private readonly pathCache = new Map<string, Path>();\n\n constructor(private readonly root: ValueNode) {\n this.rebuild();\n }\n\n nodeById(id: string): ValueNode | undefined {\n const node = this.nodesById.get(id);\n if (node) {\n return node;\n }\n\n this.rebuild();\n return this.nodesById.get(id);\n }\n\n pathOf(node: ValueNode): Path {\n if (this.isInsideArray(node)) {\n return this.computePath(node);\n }\n\n const cached = this.pathCache.get(node.id);\n if (cached) {\n return cached;\n }\n\n const path = this.computePath(node);\n this.pathCache.set(node.id, path);\n return path;\n }\n\n private isInsideArray(node: ValueNode): boolean {\n let current: ValueNode | null = node.parent;\n while (current) {\n if (current.isArray()) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n rebuild(): void {\n this.nodesById.clear();\n this.pathCache.clear();\n this.indexNode(this.root);\n }\n\n registerNode(node: ValueNode): void {\n this.indexNode(node);\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.pathCache.delete(node.id);\n this.invalidateChildPaths(node);\n }\n\n private indexNode(node: ValueNode): void {\n this.nodesById.set(node.id, node);\n\n if (node.isObject()) {\n for (const child of node.children) {\n this.indexNode(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.indexNode(item);\n }\n }\n }\n\n private computePath(node: ValueNode): Path {\n const segments: Array<\n { type: 'property'; name: string } | { type: 'index'; index: number }\n > = [];\n let current: ValueNode | null = node;\n\n while (current?.parent) {\n const parent: ValueNode = current.parent;\n\n if (parent.isObject()) {\n segments.unshift({ type: 'property', name: current.name });\n } else if (parent.isArray()) {\n const index = parent.value.indexOf(current);\n if (index >= 0) {\n segments.unshift({ type: 'index', index });\n }\n }\n\n current = parent;\n }\n\n return Path.fromSegments(segments);\n }\n\n private invalidateChildPaths(node: ValueNode): void {\n if (node.isObject()) {\n for (const child of node.children) {\n this.pathCache.delete(child.id);\n this.invalidateChildPaths(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.pathCache.delete(item.id);\n this.invalidateChildPaths(item);\n }\n }\n }\n}\n","import type { Change, JsonPatch } from '../core/types';\n\nexport class ChangeTracker {\n private _changes: Change[] = [];\n\n get changes(): readonly Change[] {\n return this._changes;\n }\n\n get hasChanges(): boolean {\n return this._changes.length > 0;\n }\n\n track(change: Change): void {\n this._changes.push(change);\n }\n\n clear(): void {\n this._changes = [];\n }\n\n toPatches(): readonly JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of this._changes) {\n const patch = this.changeToPatches(change);\n patches.push(...patch);\n }\n\n return patches;\n }\n\n private changeToPatches(change: Change): JsonPatch[] {\n const path = change.path.asJsonPointer();\n\n switch (change.type) {\n case 'setValue':\n return [{ op: 'replace', path, value: change.value }];\n\n case 'addProperty':\n return [{ op: 'add', path, value: change.value }];\n\n case 'removeProperty':\n return [{ op: 'remove', path }];\n\n case 'arrayPush':\n return [{ op: 'add', path: `${path}/-`, value: change.value }];\n\n case 'arrayInsert':\n return [\n { op: 'add', path: `${path}/${change.index}`, value: change.value },\n ];\n\n case 'arrayRemove':\n return [{ op: 'remove', path: `${path}/${change.index}` }];\n\n case 'arrayMove': {\n const fromIndex = change.fromIndex ?? 0;\n const toIndex = change.toIndex ?? 0;\n return [\n {\n op: 'move',\n from: `${path}/${fromIndex}`,\n path: `${path}/${toIndex}`,\n },\n ];\n }\n\n case 'arrayReplace':\n return [\n {\n op: 'replace',\n path: `${path}/${change.index}`,\n value: change.value,\n },\n ];\n\n case 'arrayClear':\n return [{ op: 'replace', path, value: [] }];\n\n default:\n return [];\n }\n }\n}\n","import { makeObservable, computed, action } from 'mobx';\nimport type { Diagnostic, Change, JsonPatch } from '../core/types';\nimport { Path } from '../core/Path';\nimport type { PathSegment } from '../core/Path';\nimport type { ValueNode, DirtyTrackable } from '../node/types';\nimport { TreeIndex } from './TreeIndex';\nimport { ChangeTracker } from './ChangeTracker';\nimport type { FormulaEngine } from '../formula/FormulaEngine';\n\nexport class ValueTree {\n private readonly index: TreeIndex;\n private readonly changeTracker: ChangeTracker;\n private _formulaEngine: FormulaEngine | null = null;\n\n constructor(private readonly _root: ValueNode) {\n this.index = new TreeIndex(_root);\n this.changeTracker = new ChangeTracker();\n\n makeObservable(this, {\n allErrors: computed,\n allWarnings: computed,\n allDiagnostics: computed,\n isValid: computed,\n hasDiagnostics: computed,\n isDirty: computed,\n commit: action,\n revert: action,\n });\n }\n\n get root(): ValueNode {\n return this._root;\n }\n\n nodeById(id: string): ValueNode | undefined {\n return this.index.nodeById(id);\n }\n\n get(path: string): ValueNode | undefined {\n return this.getByPath(Path.fromString(path));\n }\n\n getByPath(path: Path): ValueNode | undefined {\n if (path.isEmpty()) {\n return this._root;\n }\n\n let current: ValueNode | undefined = this._root;\n\n for (const segment of path.segments()) {\n if (!current) {\n return undefined;\n }\n\n current = this.resolveSegment(current, segment);\n }\n\n return current;\n }\n\n private resolveSegment(\n node: ValueNode,\n segment: PathSegment,\n ): ValueNode | undefined {\n if (segment.type === 'property' && node.isObject()) {\n return node.child(segment.name);\n }\n if (segment.type === 'index' && node.isArray()) {\n return node.at(segment.index);\n }\n return undefined;\n }\n\n pathOf(nodeOrId: ValueNode | string): Path {\n const node =\n typeof nodeOrId === 'string' ? this.nodeById(nodeOrId) : nodeOrId;\n if (!node) {\n return Path.empty();\n }\n return this.index.pathOf(node);\n }\n\n get allErrors(): readonly Diagnostic[] {\n return this._root.errors;\n }\n\n get allWarnings(): readonly Diagnostic[] {\n return this._root.warnings;\n }\n\n get allDiagnostics(): readonly Diagnostic[] {\n return [...this.allErrors, ...this.allWarnings];\n }\n\n get isValid(): boolean {\n return this.allErrors.length === 0;\n }\n\n get hasDiagnostics(): boolean {\n return this.allDiagnostics.length > 0;\n }\n\n get errorsByPath(): ReadonlyMap<string, readonly Diagnostic[]> {\n const map = new Map<string, Diagnostic[]>();\n for (const error of this.allErrors) {\n const list = map.get(error.path) ?? [];\n list.push(error);\n map.set(error.path, list);\n }\n return map;\n }\n\n getValue(path: string): unknown {\n return this.get(path)?.getPlainValue();\n }\n\n setValue(path: string, value: unknown): void {\n const parsedPath = Path.fromString(path);\n const node = this.getByPath(parsedPath);\n if (!node) {\n throw new Error(`Path not found: ${path}`);\n }\n if (!node.isPrimitive()) {\n throw new Error(`Cannot set value on non-primitive node: ${path}`);\n }\n\n const oldValue = node.value;\n node.setValue(value);\n\n this.changeTracker.track({\n type: 'setValue',\n path: parsedPath,\n value,\n oldValue,\n });\n }\n\n getPlainValue(): unknown {\n return this._root.getPlainValue();\n }\n\n get changes(): readonly Change[] {\n return this.changeTracker.changes;\n }\n\n get hasChanges(): boolean {\n return this.changeTracker.hasChanges;\n }\n\n clearChanges(): void {\n this.changeTracker.clear();\n }\n\n getPatches(): readonly JsonPatch[] {\n return this.changeTracker.toPatches();\n }\n\n trackChange(change: Change): void {\n this.changeTracker.track(change);\n }\n\n rebuildIndex(): void {\n this.index.rebuild();\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.index.invalidatePathsUnder(node);\n }\n\n get isDirty(): boolean {\n const root = this._root as unknown as DirtyTrackable;\n if ('isDirty' in root) {\n return root.isDirty;\n }\n return false;\n }\n\n commit(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('commit' in root && typeof root.commit === 'function') {\n root.commit();\n }\n this.changeTracker.clear();\n }\n\n revert(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('revert' in root && typeof root.revert === 'function') {\n root.revert();\n }\n this.changeTracker.clear();\n }\n\n setFormulaEngine(engine: FormulaEngine): void {\n this._formulaEngine = engine;\n }\n\n get formulaEngine(): FormulaEngine | null {\n return this._formulaEngine;\n }\n\n dispose(): void {\n this._formulaEngine?.dispose();\n this._formulaEngine = null;\n }\n}\n","import { parseExpression } from '@revisium/formula';\nimport type {\n ValueNode,\n PrimitiveValueNode,\n ObjectValueNode,\n} from '../node/types';\nimport type { FormulaField, FormulaArrayLevel } from './types';\n\ninterface TraverseContext {\n parent: ObjectValueNode | null;\n arrayLevels: FormulaArrayLevel[];\n}\n\ntype PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number };\n\nconst INDEX_REGEX = /^\\[(-?\\d+)\\]/;\nconst PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\nexport class FormulaCollector {\n private root: ValueNode | null = null;\n\n collect(root: ValueNode): FormulaField[] {\n this.root = root;\n const formulas: FormulaField[] = [];\n this.traverse(root, { parent: null, arrayLevels: [] }, formulas);\n return formulas;\n }\n\n private traverse(\n node: ValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n if (node.isPrimitive()) {\n this.collectPrimitive(node, context, formulas);\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.traverse(child, { ...context, parent: node }, formulas);\n }\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.traverse(\n item,\n {\n ...context,\n arrayLevels: [...context.arrayLevels, { array: node, index: i }],\n },\n formulas,\n );\n }\n }\n }\n }\n\n private collectPrimitive(\n node: PrimitiveValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n const formula = node.formula;\n if (!formula) {\n return;\n }\n\n const rawDependencies = this.extractDependencies(formula.expression);\n const dependencyNodes = this.resolveDependencies(\n rawDependencies,\n node,\n context,\n );\n\n formulas.push({\n node,\n expression: formula.expression,\n parent: context.parent,\n dependencyNodes,\n arrayLevels: context.arrayLevels,\n });\n }\n\n private extractDependencies(expression: string): readonly string[] {\n try {\n const parsed = parseExpression(expression);\n return parsed.dependencies;\n } catch {\n return [];\n }\n }\n\n private resolveDependencies(\n rawDeps: readonly string[],\n formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): PrimitiveValueNode[] {\n const nodes: PrimitiveValueNode[] = [];\n\n for (const dep of rawDeps) {\n const node = this.resolveOneDependency(dep, formulaNode, context);\n if (node) {\n this.collectPrimitiveNodes(node, nodes);\n }\n }\n\n return nodes;\n }\n\n private collectPrimitiveNodes(\n node: ValueNode,\n result: PrimitiveValueNode[],\n ): void {\n if (node.isPrimitive()) {\n result.push(node);\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.collectPrimitiveNodes(item, result);\n }\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.collectPrimitiveNodes(child, result);\n }\n }\n }\n\n private resolveOneDependency(\n dep: string,\n _formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): ValueNode | null {\n if (dep.startsWith('/')) {\n return this.resolveFromRoot(dep.slice(1));\n }\n\n if (dep.startsWith('../')) {\n return this.resolveRelative(dep, context);\n }\n\n if (context.parent) {\n return this.resolveFromNode(context.parent, dep);\n }\n\n return this.resolveFromRoot(dep);\n }\n\n private resolveFromRoot(pathStr: string): ValueNode | null {\n if (!this.root) {\n return null;\n }\n return this.resolveFromNode(this.root, pathStr);\n }\n\n private resolveFromNode(\n startNode: ValueNode,\n pathStr: string,\n ): ValueNode | null {\n const segments = this.parsePathSegments(pathStr);\n let current: ValueNode | null = startNode;\n\n for (const segment of segments) {\n if (!current) {\n return null;\n }\n\n if (segment.type === 'property') {\n if (current.isObject()) {\n current =\n current.children.find((c) => c.name === segment.name) ?? null;\n } else {\n return null;\n }\n } else if (segment.type === 'index') {\n if (current.isArray()) {\n current = current.at(segment.index) ?? null;\n } else {\n return null;\n }\n }\n }\n\n return current;\n }\n\n private resolveRelative(\n dep: string,\n context: TraverseContext,\n ): ValueNode | null {\n let upLevels = 0;\n let remaining = dep;\n\n while (remaining.startsWith('../')) {\n upLevels++;\n remaining = remaining.slice(3);\n }\n\n let current: ValueNode | null = context.parent;\n\n for (let i = 0; i < upLevels && current; i++) {\n current = this.findParent(current);\n if (current?.isArray()) {\n current = this.findParent(current);\n }\n }\n\n if (!current) {\n return null;\n }\n\n if (remaining) {\n return this.resolveFromNode(current, remaining);\n }\n\n return current;\n }\n\n private findParent(node: ValueNode): ValueNode | null {\n if (!this.root || node === this.root) {\n return null;\n }\n\n return this.findParentRecursive(this.root, node);\n }\n\n private findParentRecursive(\n current: ValueNode,\n target: ValueNode,\n ): ValueNode | null {\n const children = this.getChildNodes(current);\n\n for (const child of children) {\n if (child === target) {\n return current;\n }\n const found = this.findParentRecursive(child, target);\n if (found) {\n return found;\n }\n }\n\n return null;\n }\n\n private getChildNodes(node: ValueNode): ValueNode[] {\n if (node.isObject()) {\n return [...node.children];\n }\n if (node.isArray()) {\n const items: ValueNode[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n items.push(item);\n }\n }\n return items;\n }\n return [];\n }\n\n private parsePathSegments(pathStr: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = pathStr;\n\n while (current.length > 0) {\n const indexMatch = INDEX_REGEX.exec(current);\n if (indexMatch?.[1]) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n const propMatch = PROP_REGEX.exec(current);\n if (propMatch?.[1]) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n break;\n }\n\n return segments;\n }\n}\n","import type { PrimitiveValueNode } from '../node/types';\nimport type { FormulaField, DependencyMap } from './types';\n\nexport class DependencyGraph {\n buildDependencyMap(formulas: readonly FormulaField[]): DependencyMap {\n const map: DependencyMap = new Map();\n\n for (const field of formulas) {\n for (const depNode of field.dependencyNodes) {\n let depSet = map.get(depNode);\n if (!depSet) {\n depSet = new Set();\n map.set(depNode, depSet);\n }\n depSet.add(field);\n }\n }\n\n return map;\n }\n\n buildEvaluationOrder(\n formulas: readonly FormulaField[],\n ): readonly FormulaField[] {\n const formulaNodes = new Set(formulas.map((f) => f.node));\n const visited = new Set<PrimitiveValueNode>();\n const order: FormulaField[] = [];\n\n const formulaByNode = new Map<PrimitiveValueNode, FormulaField>();\n for (const field of formulas) {\n formulaByNode.set(field.node, field);\n }\n\n const visit = (\n field: FormulaField,\n stack: Set<PrimitiveValueNode>,\n ): void => {\n if (visited.has(field.node)) {\n return;\n }\n\n if (stack.has(field.node)) {\n return;\n }\n\n stack.add(field.node);\n\n for (const depNode of field.dependencyNodes) {\n if (formulaNodes.has(depNode)) {\n const depFormula = formulaByNode.get(depNode);\n if (depFormula) {\n visit(depFormula, stack);\n }\n }\n }\n\n stack.delete(field.node);\n visited.add(field.node);\n order.push(field);\n };\n\n for (const field of formulas) {\n visit(field, new Set());\n }\n\n return order;\n }\n\n getAffectedFormulas(\n changedNode: PrimitiveValueNode,\n dependencyMap: DependencyMap,\n evaluationOrder: readonly FormulaField[],\n ): readonly FormulaField[] {\n const affected = new Set<FormulaField>();\n const queue: PrimitiveValueNode[] = [changedNode];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const dependents = dependencyMap.get(current);\n\n if (dependents) {\n for (const field of dependents) {\n if (!affected.has(field)) {\n affected.add(field);\n queue.push(field.node);\n }\n }\n }\n }\n\n return evaluationOrder.filter((field) => affected.has(field));\n }\n}\n","import { evaluateWithContext } from '@revisium/formula';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, ObjectValueNode } from '../node/types';\nimport type { FormulaField, FormulaEngineOptions } from './types';\n\nexport class FormulaEvaluator {\n constructor(\n private readonly tree: ValueTree,\n private readonly options: FormulaEngineOptions = {},\n ) {}\n\n evaluate(field: FormulaField): void {\n try {\n const context = this.buildContext(field);\n const result = evaluateWithContext(field.expression, context);\n\n this.setNodeValue(field, result);\n this.checkForWarnings(field, result);\n } catch (error) {\n this.handleError(field, error as Error);\n }\n }\n\n evaluateAll(fields: Iterable<FormulaField>): void {\n for (const field of fields) {\n this.evaluate(field);\n }\n }\n\n private buildContext(field: FormulaField) {\n const rootData = this.tree.getPlainValue() as Record<string, unknown>;\n\n const context: {\n rootData: Record<string, unknown>;\n itemData?: Record<string, unknown>;\n currentPath?: string;\n arrayContext?: {\n levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }>;\n };\n } = { rootData };\n\n if (field.parent) {\n const itemData = this.getPlainObjectValue(field.parent);\n if (itemData) {\n context.itemData = itemData;\n }\n }\n\n if (field.arrayLevels.length > 0) {\n context.arrayContext = { levels: this.buildArrayLevels(field) };\n }\n\n return context;\n }\n\n private buildArrayLevels(field: FormulaField) {\n const levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }> = [];\n\n // Build levels from innermost to outermost (reverse order)\n // levels[0] = current (innermost), levels[1] = parent, levels[2] = root, etc.\n for (let i = field.arrayLevels.length - 1; i >= 0; i--) {\n const level = field.arrayLevels[i];\n if (!level) {\n continue;\n }\n const { array, index } = level;\n\n levels.push({\n index,\n length: array.length,\n prev: this.getPrevItemValue(array, index),\n next: this.getNextItemValue(array, index),\n });\n }\n\n return levels;\n }\n\n private getPrevItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index <= 0) {\n return null;\n }\n const prevItem = array.at(index - 1);\n return prevItem ? this.getPlainNodeValue(prevItem) : null;\n }\n\n private getNextItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index >= array.length - 1) {\n return null;\n }\n const nextItem = array.at(index + 1);\n return nextItem ? this.getPlainNodeValue(nextItem) : null;\n }\n\n private getPlainObjectValue(node: ObjectValueNode): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const child of node.children) {\n result[child.name] = this.getPlainNodeValue(child);\n }\n return result;\n }\n\n private getPlainNodeValue(node: ValueNode): unknown {\n if (node.isPrimitive()) {\n return node.value;\n }\n if (node.isObject()) {\n return this.getPlainObjectValue(node);\n }\n if (node.isArray()) {\n const result: unknown[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n result.push(this.getPlainNodeValue(item));\n }\n }\n return result;\n }\n return null;\n }\n\n private setNodeValue(field: FormulaField, result: unknown): void {\n const { node } = field;\n const defaultValue = node.defaultValue;\n\n if (result === null || result === undefined) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n if (\n typeof result === 'number' &&\n (Number.isNaN(result) || !Number.isFinite(result))\n ) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n node.setValue(result, { internal: true });\n }\n\n private checkForWarnings(field: FormulaField, result: unknown): void {\n const { node } = field;\n\n if (typeof result === 'number') {\n if (Number.isNaN(result)) {\n node.setFormulaWarning({\n type: 'nan',\n message: 'Formula result is NaN',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n\n if (!Number.isFinite(result)) {\n node.setFormulaWarning({\n type: 'infinity',\n message: 'Formula result is Infinity',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n }\n\n node.setFormulaWarning(null);\n }\n\n private handleError(field: FormulaField, error: Error): void {\n const { node } = field;\n\n node.setValue(node.defaultValue, { internal: true });\n\n node.setFormulaWarning({\n type: 'runtime-error',\n message: error.message,\n expression: field.expression,\n computedValue: undefined,\n });\n\n if (this.options.onError) {\n this.options.onError(node, error);\n }\n }\n}\n","import { reaction, runInAction, IReactionDisposer } from 'mobx';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, PrimitiveValueNode } from '../node/types';\nimport type {\n FormulaField,\n DependencyMap,\n FormulaEngineOptions,\n} from './types';\nimport { FormulaCollector } from './FormulaCollector';\nimport { DependencyGraph } from './DependencyGraph';\nimport { FormulaEvaluator } from './FormulaEvaluator';\n\nexport class FormulaEngine {\n private readonly collector: FormulaCollector;\n private readonly graph: DependencyGraph;\n private readonly evaluator: FormulaEvaluator;\n\n private formulas: FormulaField[] = [];\n private dependencyMap: DependencyMap = new Map();\n private evaluationOrder: readonly FormulaField[] = [];\n private disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly tree: ValueTree,\n options: FormulaEngineOptions = {},\n ) {\n this.collector = new FormulaCollector();\n this.graph = new DependencyGraph();\n this.evaluator = new FormulaEvaluator(tree, options);\n\n this.initialize();\n }\n\n reinitialize(): void {\n this.disposeReactions();\n this.initialize();\n }\n\n dispose(): void {\n this.disposeReactions();\n this.formulas = [];\n this.dependencyMap = new Map();\n this.evaluationOrder = [];\n }\n\n getFormulas(): readonly FormulaField[] {\n return this.formulas;\n }\n\n getEvaluationOrder(): readonly FormulaField[] {\n return this.evaluationOrder;\n }\n\n private initialize(): void {\n this.formulas = this.collector.collect(this.tree.root);\n\n this.dependencyMap = this.graph.buildDependencyMap(this.formulas);\n this.evaluationOrder = this.graph.buildEvaluationOrder(this.formulas);\n\n this.evaluateAll();\n\n this.setupReactions();\n }\n\n private evaluateAll(): void {\n runInAction(() => {\n for (const field of this.evaluationOrder) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private setupReactions(): void {\n const watchedNodes = new Set<PrimitiveValueNode>();\n\n for (const [depNode] of this.dependencyMap) {\n if (watchedNodes.has(depNode)) {\n continue;\n }\n watchedNodes.add(depNode);\n\n const disposer = reaction(\n () => depNode.value,\n () => this.handleDependencyChange(depNode),\n );\n this.disposers.push(disposer);\n }\n\n this.setupArrayReactions(this.tree.root);\n }\n\n private setupArrayReactions(node: ValueNode): void {\n if (node.isArray()) {\n const disposer = reaction(\n () => node.length,\n () => this.handleStructureChange(),\n );\n this.disposers.push(disposer);\n\n for (const item of node.value) {\n this.setupArrayReactions(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.setupArrayReactions(child);\n }\n }\n }\n\n private handleDependencyChange(changedNode: PrimitiveValueNode): void {\n const affected = this.graph.getAffectedFormulas(\n changedNode,\n this.dependencyMap,\n this.evaluationOrder,\n );\n\n runInAction(() => {\n for (const field of affected) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private handleStructureChange(): void {\n this.reinitialize();\n }\n\n private disposeReactions(): void {\n for (const disposer of this.disposers) {\n disposer();\n }\n this.disposers = [];\n }\n}\n","import type { SchemaDefinition } from './core/types';\nimport { createNodeFactory, NodeFactory } from './node/NodeFactory';\nimport type { ValueNode } from './node/types';\nimport { ValueTree } from './tree/ValueTree';\nimport { FormulaEngine } from './formula/FormulaEngine';\nimport type { FormulaEngineOptions } from './formula/types';\n\nexport interface CreateValueModelOptions {\n nodeFactory?: NodeFactory;\n formulaEngine?: boolean | FormulaEngineOptions;\n}\n\nexport function createValueModel(\n schema: SchemaDefinition,\n initialValue: unknown,\n options?: CreateValueModelOptions,\n): ValueTree {\n const nodeFactory = options?.nodeFactory ?? createNodeFactory();\n const rootNode = nodeFactory.createTree(schema, initialValue);\n\n propagateFactoryToArrays(rootNode, nodeFactory);\n\n const tree = new ValueTree(rootNode);\n\n if (options?.formulaEngine !== false) {\n const formulaOptions =\n typeof options?.formulaEngine === 'object' ? options.formulaEngine : {};\n const engine = new FormulaEngine(tree, formulaOptions);\n tree.setFormulaEngine(engine);\n }\n\n return tree;\n}\n\nfunction propagateFactoryToArrays(node: ValueNode, factory: NodeFactory): void {\n if (node.isArray()) {\n node.setNodeFactory(factory);\n for (const item of node.value) {\n propagateFactoryToArrays(item, factory);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n propagateFactoryToArrays(child, factory);\n }\n }\n}\n\nexport function createEmptyValueModel(\n schema: SchemaDefinition,\n options?: CreateValueModelOptions,\n): ValueTree {\n return createValueModel(schema, undefined, options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["observable","SystemSchemaIds","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedIdSchema","rowVersionIdSchema","rowCreatedAtSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","FIELD_NAME_ERROR_MESSAGE","React","ChakraTooltip","Portal","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","Flex","Box","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Box","PiWarningCircle","Flex","Text","Box","Flex","Box","PiWarning","PiFunction","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Textarea","Box","Menu","PiFunction","PiCaretRight","Portal","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Text","Flex","Box","Flex","Text","Box","Flex","Text","Flex","Box","PiDotOutlineFill","Text","Box","Text","Box","Box","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","DialogFooter","Flex","DialogCloseTrigger","Flex","Button","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Flex","Icon","Text","Badge","PiPencilSimpleLight","Flex","Text","Box","Badge","VStack","Flex","Text","Badge","Icon","PiArrowRight","Flex","Text","Icon","PiArrowRight","Box","Box","Flex","Icon","PiArrowsLeftRightLight","Text","Box","Flex","Icon","PiWarningCircle","Text","Badge","Popover","Button","Icon","PiArrowCounterClockwiseBold","Text","Flex","VStack","Box","Text","VStack","SegmentGroup","Box","Text","Flex","VStack","SegmentGroup","Box","Flex","Box","Button"],"sources":["../src/schema-editor/model/state/TreeState.ts","../src/schema-editor/model/accessor/NodeAccessor.ts","../src/schema-editor/model/accessor/NodeState.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/model/accessor/NodeLabel.ts","../src/schema-editor/model/accessor/NodeFormula.ts","../src/schema-editor/model/accessor/NodeValidation.ts","../src/schema-editor/model/utils/typeIdMapping.ts","../src/schema-editor/model/accessor/NodeActions.ts","../src/schema-editor/model/accessor/NodeAccessorFactory.ts","../src/schema-editor/model/core/AccessorCache.ts","../src/schema-editor/model/core/ValidationTracker.ts","../src/schema-editor/model/core/ViewState.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/utils/traverseTree.ts","../src/schema-editor/model/utils/TreeNavigator.ts","../src/schema-editor/model/core/CollapseManager.ts","../src/schema-editor/model/core/KeyboardNavigation.ts","../src/schema-editor/config/system-schemas.ts","../src/lib/initReactivity.ts","../src/schema-editor/model/core/SchemaEditorCore.ts","../src/schema-editor/model/vm/SchemaTreeVM.ts","../src/schema-editor/model/dialog/CreateTableDialogVM.ts","../src/schema-editor/model/dialog/ReviewErrorsDialogVM.ts","../src/schema-editor/model/vm/CreatingEditorVM.ts","../src/schema-editor/model/dialog/ReviewChangesDialogVM.ts","../src/schema-editor/model/vm/UpdatingEditorVM.ts","../src/components/Tooltip/Tooltip.tsx","../src/schema-editor/types/index.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/hooks/useContentEditable.ts","../src/components/ContentEditable/ContentEditable.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/schema-editor/ui/tree/TreeNodeWrapper/TreeNodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/tree/TreeNodeField/DragHandle.tsx","../src/schema-editor/ui/tree/TreeNodeField/ErrorIndicator.tsx","../src/schema-editor/ui/tree/TreeNodeField/useDragAndDrop.ts","../src/schema-editor/ui/tree/TreeNodeField/TreeNodeField.tsx","../src/schema-editor/ui/tree/TreeNodeIndicators/TreeNodeIndicators.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/parseDefaultValue.ts","../src/schema-editor/ui/tree/TreeNodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/TreeNodeContextMenu.tsx","../src/schema-editor/ui/tree/TreeNodeRightContent/TreeNodeRightContent.tsx","../src/schema-editor/ui/tree/NodeViewLayout/NodeViewLayout.tsx","../src/schema-editor/ui/tree/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ForeignKeyValue.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsChildren.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/tree/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/tree/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/tree/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/tree/TreeNodeView/TreeNodeView.tsx","../src/schema-editor/ui/dialog/shared/Highlight/Highlight.tsx","../src/schema-editor/ui/dialog/shared/CodeBox/CodeBox.tsx","../src/schema-editor/ui/dialog/shared/DialogLayout/DialogLayout.tsx","../src/schema-editor/ui/dialog/shared/DialogFooterActions/DialogFooterActions.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/helpers.ts","../src/schema-editor/ui/dialog/shared/PatchRow/OperationDescription.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DefaultValueRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DataLossBadge.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/TransformationInfoRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/ValueChangeRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/PatchRow.tsx","../src/schema-editor/ui/dialog/shared/TableIdChangeRow/TableIdChangeRow.tsx","../src/schema-editor/ui/dialog/shared/ErrorItem/ErrorItem.tsx","../src/schema-editor/ui/dialog/shared/RevertButton/RevertButton.tsx","../src/schema-editor/ui/dialog/ReviewErrorsDialog/ReviewErrorsDialog.tsx","../src/schema-editor/ui/dialog/ReviewChangesDialog/ReviewChangesDialog.tsx","../src/schema-editor/ui/dialog/CreateTableDialog/CreateTableDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/schema-editor/ui/CreatingSchemaEditor/CreatingSchemaEditor.tsx","../src/schema-editor/ui/UpdatingSchemaEditor/UpdatingSchemaEditor.tsx"],"sourcesContent":["import { makeAutoObservable, observable } from 'mobx';\n\nexport class TreeState {\n private readonly _expandedNodes = observable.map<string, boolean>();\n private readonly _focusedNodes = observable.map<string, boolean>();\n private readonly _menuOpenNodes = observable.map<string, boolean>();\n private readonly _settingsOpenNodes = observable.map<string, boolean>();\n private readonly _dropNodes = observable.map<string, boolean>();\n private readonly _disabledDropNodes = observable.map<string, boolean>();\n private readonly _draggedOverNodes = observable.map<string, boolean>();\n private readonly _focusRequestCounts = observable.map<string, number>();\n private _activeNodeId: string | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get activeNodeId(): string | null {\n return this._activeNodeId;\n }\n\n public setActiveNodeId(nodeId: string | null): void {\n this._activeNodeId = nodeId;\n }\n\n public isActive(nodeId: string): boolean {\n return this._activeNodeId === nodeId;\n }\n\n public getFocusRequestCount(nodeId: string): number {\n return this._focusRequestCounts.get(nodeId) ?? 0;\n }\n\n public requestFocus(nodeId: string): void {\n const current = this._focusRequestCounts.get(nodeId) ?? 0;\n this._focusRequestCounts.set(nodeId, current + 1);\n }\n\n public isExpanded(nodeId: string): boolean {\n return this._expandedNodes.get(nodeId) ?? true;\n }\n\n public setExpanded(nodeId: string, value: boolean): void {\n this._expandedNodes.set(nodeId, value);\n }\n\n public toggleExpanded(nodeId: string): void {\n this._expandedNodes.set(nodeId, !this.isExpanded(nodeId));\n }\n\n public isFocused(nodeId: string): boolean {\n return this._focusedNodes.get(nodeId) ?? false;\n }\n\n public setFocused(nodeId: string, value: boolean): void {\n this._focusedNodes.set(nodeId, value);\n }\n\n public isMenuOpen(nodeId: string): boolean {\n return this._menuOpenNodes.get(nodeId) ?? false;\n }\n\n public setMenuOpen(nodeId: string, value: boolean): void {\n this._menuOpenNodes.set(nodeId, value);\n }\n\n public isSettingsOpen(nodeId: string): boolean {\n return this._settingsOpenNodes.get(nodeId) ?? false;\n }\n\n public setSettingsOpen(nodeId: string, value: boolean): void {\n this._settingsOpenNodes.set(nodeId, value);\n }\n\n public isDrop(nodeId: string): boolean {\n return this._dropNodes.get(nodeId) ?? false;\n }\n\n public setDrop(nodeId: string, value: boolean): void {\n this._dropNodes.set(nodeId, value);\n }\n\n public isDisabledDrop(nodeId: string): boolean {\n return this._disabledDropNodes.get(nodeId) ?? false;\n }\n\n public setDisabledDrop(nodeId: string, value: boolean): void {\n this._disabledDropNodes.set(nodeId, value);\n }\n\n public isDraggedOver(nodeId: string): boolean {\n return this._draggedOverNodes.get(nodeId) ?? false;\n }\n\n public setDraggedOver(nodeId: string, value: boolean): void {\n this._draggedOverNodes.set(nodeId, value);\n }\n\n public clearNode(nodeId: string): void {\n this._expandedNodes.delete(nodeId);\n this._focusedNodes.delete(nodeId);\n this._menuOpenNodes.delete(nodeId);\n this._settingsOpenNodes.delete(nodeId);\n this._dropNodes.delete(nodeId);\n this._disabledDropNodes.delete(nodeId);\n this._draggedOverNodes.delete(nodeId);\n this._focusRequestCounts.delete(nodeId);\n }\n\n public collapseAll(nodeIds: string[], keepRootExpanded: boolean): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, false);\n }\n if (keepRootExpanded) {\n const firstNodeId = nodeIds[0];\n if (firstNodeId !== undefined) {\n this._expandedNodes.set(firstNodeId, true);\n }\n }\n }\n\n public expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, true);\n }\n }\n\n public reset(): void {\n this._expandedNodes.clear();\n this._focusedNodes.clear();\n this._menuOpenNodes.clear();\n this._settingsOpenNodes.clear();\n this._dropNodes.clear();\n this._disabledDropNodes.clear();\n this._draggedOverNodes.clear();\n this._focusRequestCounts.clear();\n this._activeNodeId = null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport type { NodeState } from './NodeState';\nimport type { NodeLabel } from './NodeLabel';\nimport type { NodeFormula } from './NodeFormula';\nimport type { NodeValidation } from './NodeValidation';\nimport type { NodeActions } from './NodeActions';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport class NodeAccessor {\n public readonly state: NodeState;\n public readonly label: NodeLabel;\n public readonly formula: NodeFormula;\n public readonly validation: NodeValidation;\n public readonly actions: NodeActions;\n\n constructor(\n private readonly _node: SchemaNode,\n deps: NodeAccessorDependencies,\n private readonly _isRoot: boolean = false,\n private readonly _isReadonly: boolean = false,\n ) {\n this.state = deps.state;\n this.label = deps.label;\n this.formula = deps.formula;\n this.validation = deps.validation;\n this.actions = deps.actions;\n\n makeAutoObservable(\n this,\n {\n state: false,\n label: false,\n formula: false,\n validation: false,\n actions: false,\n },\n { autoBind: true },\n );\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isRef(): boolean {\n return this._node.isRef();\n }\n\n public get ref(): string | undefined {\n if (this._node.isRef()) {\n return this._node.ref();\n }\n return undefined;\n }\n\n public get isForeignKey(): boolean {\n return this.label.isForeignKey;\n }\n\n public get defaultValue(): unknown {\n return this._node.defaultValue();\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined || value === null) {\n return '';\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n default:\n return JSON.stringify(value);\n }\n }\n\n public get hoverTargetClass(): string {\n return `hover-target-${this.nodeId}`;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.state.isFocused &&\n !this.state.isMenuOpen &&\n !this.state.isSettingsOpen\n );\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public handleFieldBlur(): void {\n this.state.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.actions.remove();\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\n\nexport class NodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: TreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n public toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n public get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n public setFocused(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setFocused(this._nodeId, value);\n }\n\n public get isMenuOpen(): boolean {\n return this._treeState.isMenuOpen(this._nodeId);\n }\n\n public setMenuOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setMenuOpen(this._nodeId, value);\n }\n\n public get isSettingsOpen(): boolean {\n return this._treeState.isSettingsOpen(this._nodeId);\n }\n\n public setSettingsOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setSettingsOpen(this._nodeId, value);\n }\n\n public get isDrop(): boolean {\n return this._treeState.isDrop(this._nodeId);\n }\n\n public setDrop(value: boolean): void {\n this._treeState.setDrop(this._nodeId, value);\n }\n\n public get isDisabledDrop(): boolean {\n return this._treeState.isDisabledDrop(this._nodeId);\n }\n\n public setDisabledDrop(value: boolean): void {\n this._treeState.setDisabledDrop(this._nodeId, value);\n }\n\n public get isDraggedOver(): boolean {\n return this._treeState.isDraggedOver(this._nodeId);\n }\n\n public setDraggedOver(value: boolean): void {\n this._treeState.setDraggedOver(this._nodeId, value);\n }\n\n public get isActive(): boolean {\n return this._treeState.isActive(this._nodeId);\n }\n\n public activate(): void {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n\n public get focusRequestCount(): number {\n return this._treeState.getFocusRequestCount(this._nodeId);\n }\n\n public requestFocus(): void {\n this._treeState.requestFocus(this._nodeId);\n }\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\n\nconst SYSTEM_SCHEMA_LABELS: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n};\n\nexport const getLabelByRef = (ref: string): string => {\n return SYSTEM_SCHEMA_LABELS[ref] ?? ref;\n};\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\nexport type MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\nexport type MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport { getLabelByRef } from '../../config/schema-type-ids';\n\nexport class NodeLabel {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _getTableId: () => string,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._getTableId();\n }\n return this._node.name();\n }\n\n public get nodeType(): string {\n return this._node.nodeType();\n }\n\n public get typeLabel(): string {\n if (this._node.isRef()) {\n return this.getRefLabel();\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n if (this._node.foreignKey() !== undefined) {\n return 'ForeignKey';\n }\n if (this._node.contentMediaType?.() === 'text/markdown') {\n return 'Markdown';\n }\n return this._node.nodeType();\n }\n\n public get description(): string | undefined {\n return this._node.metadata().description;\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get foreignKeyTable(): string | undefined {\n return this._node.foreignKey();\n }\n\n public get isForeignKey(): boolean {\n return this._node.foreignKey() !== undefined;\n }\n\n private getRefLabel(): string {\n const ref = this._node.ref();\n if (!ref) {\n return 'Ref';\n }\n return getLabelByRef(ref);\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n SchemaNode,\n SchemaModel,\n JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport class NodeFormula {\n private _inputValue: string | null = null;\n private _inputError: string | null = null;\n\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._schemaModel.plainSchema;\n }\n\n public get rawExpression(): string {\n const formula = this._node.formula();\n return formula?.expression() ?? '';\n }\n\n public get formula(): string {\n if (this._inputValue !== null) {\n return this._inputValue;\n }\n if (!this.hasFormula) {\n return '';\n }\n const serialized = this._schemaModel.serializeFormula(this._node.id());\n if (serialized) {\n return serialized;\n }\n return this.rawExpression;\n }\n\n public get inputValue(): string | null {\n return this._inputValue;\n }\n\n public get inputError(): string | null {\n return this._inputError;\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.formulaErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get hasError(): boolean {\n return this._inputError !== null || this.schemaError !== undefined;\n }\n\n public get errorMessage(): string | undefined {\n return this._inputError ?? this.schemaError;\n }\n\n public setInputValue(value: string): void {\n this._inputValue = value;\n this._inputError = null;\n }\n\n public clearInput(): void {\n this._inputValue = null;\n this._inputError = null;\n }\n\n private hasFormulaErrorForNode(): boolean {\n const errors = this._schemaModel.formulaErrors;\n return errors.some((e) => e.nodeId === this._node.id());\n }\n\n public applyFormula(): boolean {\n if (this._inputValue === null) {\n return true;\n }\n\n const trimmed = this._inputValue.trim();\n\n try {\n this._schemaModel.updateFormula(this._node.id(), trimmed || undefined);\n\n if (this.hasFormulaErrorForNode()) {\n return false;\n }\n\n this.clearInput();\n return true;\n } catch (error) {\n runInAction(() => {\n this._inputError =\n error instanceof Error ? error.message : 'Invalid formula';\n });\n return false;\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { NodeFormula } from './NodeFormula';\n\nexport class NodeValidation {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _formula: NodeFormula,\n private readonly _getTableIdError: () => string | null,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.validationErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get tableIdError(): string | null {\n if (this._isRoot) {\n return this._getTableIdError();\n }\n return null;\n }\n\n public get formulaError(): string | undefined {\n return this._formula.errorMessage;\n }\n\n public get hasError(): boolean {\n return (\n this.schemaError !== undefined ||\n this.tableIdError !== null ||\n this.formulaError !== undefined\n );\n }\n\n public get errorMessage(): string | undefined {\n return this.schemaError ?? this.tableIdError ?? this.formulaError;\n }\n}\n","import type { FieldType } from '@revisium/schema-toolkit';\n\nconst TYPE_ID_TO_FIELD_TYPE: Record<string, FieldType> = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Object: 'object',\n Array: 'array',\n};\n\nexport function typeIdToFieldType(typeId: string): FieldType | null {\n return TYPE_ID_TO_FIELD_TYPE[typeId] ?? null;\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n SystemSchemaIds,\n type SchemaNode,\n type SchemaModel,\n} from '@revisium/schema-toolkit';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\n\nexport interface NodeActionsCallbacks {\n renameTable: (name: string) => void;\n onNodeRemoved: (nodeId: string) => void;\n onNodeAdded: (nodeId: string) => void;\n onNodeReplaced: (oldNodeId: string, newNodeId: string) => void;\n selectForeignKey: () => Promise<string | null>;\n}\n\nexport class NodeActions {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _callbacks: NodeActionsCallbacks,\n private readonly _isRoot: boolean,\n private readonly _isReadonly: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRemove(): boolean {\n return !this._isReadonly && !this._isRoot;\n }\n\n public get canAddProperty(): boolean {\n return !this._isReadonly && this._node.isObject();\n }\n\n public rename(newName: string): void {\n if (this._isReadonly) {\n return;\n }\n\n if (this._isRoot) {\n this._callbacks.renameTable(newName);\n return;\n }\n\n if (newName !== this._node.name()) {\n this._schemaModel.renameField(this._node.id(), newName);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n if (typeId === 'ForeignKeyString') {\n this.changeToForeignKey();\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeToMarkdown();\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeToForeignKey(): void {\n const oldNodeId = this._node.id();\n let nodeId = oldNodeId;\n\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeToMarkdown(): void {\n const oldNodeId = this._node.id();\n let node = this._node;\n\n if (node.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public remove(): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n const nodeId = this._node.id();\n const removed = this._schemaModel.removeField(nodeId);\n\n if (removed) {\n this._callbacks.onNodeRemoved(nodeId);\n }\n }\n\n public addProperty(name: string = ''): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.addField(this._node.id(), name, 'string');\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public insertFieldAt(index: number, name: string): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.insertFieldAt(\n this._node.id(),\n index,\n name,\n 'string',\n );\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public setDescription(description: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n description: description || undefined,\n });\n }\n\n public setDeprecated(deprecated: boolean): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n deprecated: deprecated || undefined,\n });\n }\n\n public setDefaultValue(value: unknown): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateDefaultValue(this._node.id(), value);\n }\n\n public setForeignKey(tableId: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n\n if (tableId === undefined) {\n this._schemaModel.updateForeignKey(this._node.id(), undefined);\n return;\n }\n\n if (this._node.foreignKey() === undefined) {\n const oldNodeId = this._node.id();\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n this._schemaModel.updateForeignKey(newNode.id(), tableId);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n } else {\n this._schemaModel.updateForeignKey(oldNodeId, tableId);\n }\n } else {\n this._schemaModel.updateForeignKey(this._node.id(), tableId);\n }\n }\n\n public changeItemsType(typeId: string): void {\n if (this._isReadonly || !this._node.isArray()) {\n return;\n }\n\n const items = this._node.items();\n if (items.isNull()) {\n return;\n }\n\n const oldNodeId = items.id();\n\n if (typeId === 'ForeignKeyString') {\n this.changeItemsToForeignKey(items, oldNodeId);\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeItemsToMarkdown(items, oldNodeId);\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeItemsToForeignKey(items: SchemaNode, oldNodeId: string): void {\n let nodeId = oldNodeId;\n\n if (items.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeItemsToMarkdown(items: SchemaNode, oldNodeId: string): void {\n let node = items;\n\n if (items.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._callbacks.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n private typeIdToRefUri(typeId: string): string | null {\n const mapping: Record<string, string> = {\n File: SystemSchemaIds.File,\n RowId: SystemSchemaIds.RowId,\n RowCreatedId: SystemSchemaIds.RowCreatedId,\n RowVersionId: SystemSchemaIds.RowVersionId,\n RowCreatedAt: SystemSchemaIds.RowCreatedAt,\n RowPublishedAt: SystemSchemaIds.RowPublishedAt,\n RowUpdatedAt: SystemSchemaIds.RowUpdatedAt,\n RowHash: SystemSchemaIds.RowHash,\n RowSchemaHash: SystemSchemaIds.RowSchemaHash,\n };\n return mapping[typeId] ?? null;\n }\n}\n","import type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { NodeState } from './NodeState';\nimport { NodeLabel } from './NodeLabel';\nimport { NodeFormula } from './NodeFormula';\nimport { NodeValidation } from './NodeValidation';\nimport { NodeActions, type NodeActionsCallbacks } from './NodeActions';\nimport { NodeAccessor } from './NodeAccessor';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport interface NodeAccessorContext {\n schemaModel: SchemaModel;\n treeState: TreeState;\n getTableId: () => string;\n getTableIdError: () => string | null;\n callbacks: NodeActionsCallbacks;\n}\n\nexport class NodeAccessorFactory {\n public create(\n node: SchemaNode,\n context: NodeAccessorContext,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const state = new NodeState(node.id(), context.treeState);\n const label = new NodeLabel(node, context.getTableId, isRoot);\n const formula = new NodeFormula(node, context.schemaModel);\n const validation = new NodeValidation(\n node,\n context.schemaModel,\n formula,\n context.getTableIdError,\n isRoot,\n );\n const actions = new NodeActions(\n node,\n context.schemaModel,\n context.callbacks,\n isRoot,\n isReadonly,\n );\n\n return new NodeAccessor(\n node,\n { state, label, formula, validation, actions },\n isRoot,\n isReadonly,\n );\n }\n}\n","import type { SchemaModel } from '@revisium/schema-toolkit';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeAccessorContext,\n} from '../accessor';\n\nexport class AccessorCache {\n private readonly _cache = new Map<string, NodeAccessor>();\n\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _getContext: () => NodeAccessorContext,\n private readonly _accessorFactory: NodeAccessorFactory,\n ) {}\n\n public get(\n nodeId: string,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const cached = this._cache.get(nodeId);\n if (cached) {\n return cached;\n }\n\n const node = this._getSchemaModel().nodeById(nodeId);\n const accessor = this._accessorFactory.create(\n node,\n this._getContext(),\n isRoot,\n isReadonly,\n );\n this._cache.set(nodeId, accessor);\n return accessor;\n }\n\n public getChildren(\n parentNodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n const parentNode = this._getSchemaModel().nodeById(parentNodeId);\n if (parentNode.isNull()) {\n return [];\n }\n\n const childrenReadonly = parentIsReadonly || parentNode.isRef();\n\n if (parentNode.isObject()) {\n return parentNode\n .properties()\n .map((child) => this.get(child.id(), false, childrenReadonly));\n }\n\n if (parentNode.isArray()) {\n const items = parentNode.items();\n if (!items.isNull()) {\n return [this.get(items.id(), false, childrenReadonly)];\n }\n }\n\n return [];\n }\n\n public delete(nodeId: string): void {\n this._cache.delete(nodeId);\n }\n\n public clear(): void {\n this._cache.clear();\n }\n\n public entries(): IterableIterator<[string, NodeAccessor]> {\n return this._cache.entries();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\nimport type { AccessorCache } from './AccessorCache';\n\nexport class ValidationTracker {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _accessorCache: AccessorCache,\n private readonly _getTableIdError: () => string | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this.collectFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n\n public collectFormulaInputErrors(): TreeFormulaValidationError[] {\n const errors: TreeFormulaValidationError[] = [];\n for (const [nodeId, accessor] of this._accessorCache.entries()) {\n const error = accessor.formula.inputError;\n if (error) {\n errors.push({\n nodeId,\n fieldPath: accessor.label.name || undefined,\n message: error,\n });\n }\n }\n return errors;\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport type ViewMode = 'Tree' | 'Json' | 'RefBy';\n\nexport class ViewState {\n private _viewMode: ViewMode = 'Tree';\n private _loading = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get viewMode(): ViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonPatch } from '@revisium/schema-toolkit';\nimport { generateDefaultValue } from '@revisium/schema-toolkit';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface SchemaLike {\n $ref?: string;\n type?: string;\n foreignKey?: string;\n}\n\nfunction getTypeFromSchema(schema: SchemaLike): SchemaType {\n if (schema.$ref) {\n return 'ref';\n }\n if (schema.type) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: SchemaLike): string | undefined {\n if (schema.type === 'string' && schema.foreignKey) {\n return schema.foreignKey || undefined;\n }\n return undefined;\n}\n\nexport function getDefaultValueExample(\n patch: JsonPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add' || patch.value === undefined) {\n return null;\n }\n\n const schema = patch.value as SchemaLike;\n const value = generateDefaultValue(patch.value, { arrayItemCount: 1 });\n const type = getTypeFromSchema(schema);\n const foreignKeyTableId = getForeignKeyTableId(schema);\n\n return { value, type, foreignKeyTableId };\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\n\nexport function traverseTree(\n root: SchemaNode,\n visitor: (node: SchemaNode) => void,\n): void {\n if (root.isNull()) {\n return;\n }\n visitor(root);\n if (root.isObject()) {\n for (const child of root.properties()) {\n traverseTree(child, visitor);\n }\n } else if (root.isArray()) {\n const items = root.items();\n if (!items.isNull()) {\n traverseTree(items, visitor);\n }\n }\n}\n","import type { SchemaModel, SchemaNode } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\n\nexport class TreeNavigator {\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _treeState: TreeState,\n ) {}\n\n public visibleNodeIds(): string[] {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return [];\n }\n const ids: string[] = [];\n this.collectVisibleNodes(root, ids, true);\n return ids;\n }\n\n public findParentId(nodeId: string): string | null {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return null;\n }\n return this.findParentInTree(root, nodeId);\n }\n\n public isRootId(nodeId: string): boolean {\n return this._getSchemaModel().root.id() === nodeId;\n }\n\n public getNode(nodeId: string): SchemaNode {\n return this._getSchemaModel().nodeById(nodeId);\n }\n\n public nodeHasChildren(node: SchemaNode): boolean {\n if (node.isObject()) {\n return node.properties().length > 0;\n }\n if (node.isArray()) {\n return !node.items().isNull();\n }\n return false;\n }\n\n public getFirstChildId(node: SchemaNode): string | null {\n if (node.isObject()) {\n const first = node.properties()[0];\n if (first) {\n return first.id();\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n return items.id();\n }\n }\n return null;\n }\n\n private collectVisibleNodes(\n node: SchemaNode,\n ids: string[],\n isRoot: boolean,\n ): void {\n if (node.isNull()) {\n return;\n }\n\n ids.push(node.id());\n\n if (!isRoot && !this._treeState.isExpanded(node.id())) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectVisibleNodes(child, ids, false);\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectVisibleNodes(items, ids, false);\n }\n }\n }\n\n private findParentInTree(node: SchemaNode, targetId: string): string | null {\n if (node.isNull()) {\n return null;\n }\n\n if (node.isObject()) {\n return this.findParentInObject(node, targetId);\n }\n\n if (node.isArray()) {\n return this.findParentInArray(node, targetId);\n }\n\n return null;\n }\n\n private findParentInObject(\n node: SchemaNode,\n targetId: string,\n ): string | null {\n for (const child of node.properties()) {\n if (child.id() === targetId) {\n return node.id();\n }\n const found = this.findParentInTree(child, targetId);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findParentInArray(node: SchemaNode, targetId: string): string | null {\n const items = node.items();\n if (items.isNull()) {\n return null;\n }\n if (items.id() === targetId) {\n return node.id();\n }\n return this.findParentInTree(items, targetId);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { traverseTree } from '../utils';\n\nexport class CollapseManager {\n constructor(\n private readonly _treeState: TreeState,\n private readonly _getSchemaModel: () => SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public collapseAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.collapseAll(nodeIds, true);\n }\n\n public expandAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.expandAll(nodeIds);\n }\n\n public collapseIfComplex(threshold: number): void {\n const nodeCount = this._getSchemaModel().nodeCount;\n if (nodeCount >= threshold) {\n this.collapseAll();\n }\n }\n\n public collapseRefNodes(): void {\n const refNodeIds = this.collectRefNodeIds();\n for (const nodeId of refNodeIds) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n\n private collectRefNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n if (node.isRef() && (node.isObject() || node.isArray())) {\n ids.push(node.id());\n }\n });\n return ids;\n }\n\n private collectAllNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n ids.push(node.id());\n });\n return ids;\n }\n}\n","import { makeAutoObservable, reaction, type IReactionDisposer } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\nimport type { AccessorCache } from './AccessorCache';\nimport type { TreeNavigator } from '../utils/TreeNavigator';\n\nexport type KeyboardMode = 'TREE_NAV' | 'EDIT_NAME';\n\ninterface KeyboardEvent {\n key: string;\n shiftKey: boolean;\n preventDefault: () => void;\n}\n\nexport class KeyboardNavigation {\n private _mode: KeyboardMode = 'TREE_NAV';\n private _skipNextEscape = false;\n private _suppressNextReturnFocus = false;\n private _containerRef: HTMLElement | null = null;\n private readonly _disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly _treeState: TreeState,\n private readonly _navigator: TreeNavigator,\n private readonly _accessors: AccessorCache,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposers.push(\n reaction(\n () => {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return false;\n }\n return this._treeState.isFocused(activeId);\n },\n (isFocused, wasFocused) => {\n if (isFocused && !wasFocused) {\n this._mode = 'EDIT_NAME';\n }\n if (!isFocused && wasFocused) {\n this._mode = 'TREE_NAV';\n this._skipNextEscape = true;\n if (this._suppressNextReturnFocus) {\n this._suppressNextReturnFocus = false;\n } else {\n this.deferReturnFocus();\n }\n }\n },\n ),\n );\n }\n\n public get mode(): KeyboardMode {\n return this._mode;\n }\n\n public get visibleNodeIds(): string[] {\n return this._navigator.visibleNodeIds();\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (this._mode !== 'TREE_NAV') {\n return;\n }\n\n if (event.key !== 'Escape') {\n this._skipNextEscape = false;\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n event.preventDefault();\n this.moveToPrev();\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'Tab':\n event.preventDefault();\n this.moveToNext();\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.moveToPrev();\n return;\n case 'ArrowRight':\n event.preventDefault();\n this.expandOrMoveToChild();\n return;\n case 'ArrowLeft':\n event.preventDefault();\n this.collapseOrMoveToParent();\n return;\n case ' ':\n event.preventDefault();\n this.toggleExpand();\n return;\n case 'Enter':\n case 'F2':\n case 'i':\n event.preventDefault();\n this.enterEditMode();\n return;\n case 'Insert':\n event.preventDefault();\n this.insertField();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeNode();\n return;\n case 'Escape':\n event.preventDefault();\n if (this._skipNextEscape) {\n this._skipNextEscape = false;\n return;\n }\n this.deactivateOrRemoveEmpty();\n return;\n }\n }\n\n public setContainerRef(el: HTMLElement | null): void {\n if (this._containerRef && !el) {\n document.removeEventListener('mousedown', this.handleNativeMouseDown);\n }\n this._containerRef = el;\n if (this._containerRef) {\n document.addEventListener('mousedown', this.handleNativeMouseDown);\n }\n }\n\n public returnFocus(): void {\n if (\n this._containerRef &&\n !this._containerRef.contains(document.activeElement)\n ) {\n this._containerRef.focus();\n }\n }\n\n public deactivate(): void {\n this._treeState.setActiveNodeId(null);\n }\n\n private readonly handleNativeMouseDown = (event: Event): void => {\n this._skipNextEscape = false;\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this._containerRef?.contains(target)) {\n this._suppressNextReturnFocus = true;\n if (!target.closest('[data-node-id]')) {\n this._treeState.setActiveNodeId(null);\n }\n return;\n }\n const isInsideOverlay = target.closest(\n '[role=\"menu\"], [role=\"listbox\"], [role=\"dialog\"]',\n );\n if (isInsideOverlay) {\n this._suppressNextReturnFocus = true;\n } else {\n this._treeState.setActiveNodeId(null);\n }\n };\n\n public handleEditEnter(): void {\n this.insertField();\n }\n\n public handleNodeAdded(nodeId: string): void {\n this._treeState.setActiveNodeId(nodeId);\n }\n\n public handleNodeReplaced(oldId: string, newId: string): void {\n if (this._treeState.activeNodeId === oldId) {\n this._treeState.setActiveNodeId(newId);\n if (this._mode === 'EDIT_NAME') {\n this._mode = 'TREE_NAV';\n }\n this.deferReturnFocus();\n }\n }\n\n private deferReturnFocus(): void {\n setTimeout(() => this.returnFocus(), 0);\n }\n\n public dispose(): void {\n for (const disposer of this._disposers) {\n disposer();\n }\n this._disposers.length = 0;\n this.setContainerRef(null);\n }\n\n private moveToNext(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const firstId = ids[0];\n if (firstId !== undefined) {\n this._treeState.setActiveNodeId(firstId);\n this.scrollToNode(firstId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex === -1 || currentIndex >= ids.length - 1) {\n return;\n }\n\n const nextId = ids[currentIndex + 1];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n this.scrollToNode(nextId);\n }\n }\n\n private moveToPrev(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const lastId = ids.at(-1);\n if (lastId !== undefined) {\n this._treeState.setActiveNodeId(lastId);\n this.scrollToNode(lastId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex <= 0) {\n return;\n }\n\n const prevId = ids[currentIndex - 1];\n if (prevId !== undefined) {\n this._treeState.setActiveNodeId(prevId);\n this.scrollToNode(prevId);\n }\n }\n\n private expandOrMoveToChild(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (!this._navigator.nodeHasChildren(node)) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !this._treeState.isExpanded(activeId)) {\n this._treeState.setExpanded(activeId, true);\n return;\n }\n\n const firstChild = this._navigator.getFirstChildId(node);\n if (firstChild) {\n this._treeState.setActiveNodeId(firstChild);\n this.scrollToNode(firstChild);\n }\n }\n\n private collapseOrMoveToParent(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (\n !isRoot &&\n this._navigator.nodeHasChildren(node) &&\n this._treeState.isExpanded(activeId)\n ) {\n this._treeState.setExpanded(activeId, false);\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (parentId) {\n this._treeState.setActiveNodeId(parentId);\n this.scrollToNode(parentId);\n }\n }\n\n private toggleExpand(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && this._navigator.nodeHasChildren(node)) {\n this._treeState.toggleExpanded(activeId);\n }\n }\n\n private insertField(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const accessor = this._accessors.get(activeId);\n accessor.actions.insertFieldAt(0, '');\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (!parentId) {\n return;\n }\n\n const parentNode = this._navigator.getNode(parentId);\n if (parentNode.isNull() || !parentNode.isObject()) {\n return;\n }\n\n const siblings = parentNode.properties();\n const currentIndex = siblings.findIndex((s) => s.id() === activeId);\n if (currentIndex === -1) {\n return;\n }\n\n const parentAccessor = this._accessors.get(parentId);\n parentAccessor.actions.insertFieldAt(currentIndex + 1, '');\n }\n\n private enterEditMode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n this._treeState.requestFocus(activeId);\n }\n\n private deactivateOrRemoveEmpty(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !node.isNull() && !node.name()) {\n this.removeNode();\n return;\n }\n\n this._treeState.setActiveNodeId(null);\n }\n\n private removeNode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const accessor = this._accessors.get(activeId);\n if (!accessor.actions.canRemove) {\n return;\n }\n\n const ids = this.visibleNodeIds;\n const currentIndex = ids.indexOf(activeId);\n\n accessor.actions.remove();\n\n const updatedIds = this.visibleNodeIds;\n if (updatedIds.length === 0) {\n this._treeState.setActiveNodeId(null);\n return;\n }\n\n const nextIndex = Math.min(currentIndex, updatedIds.length - 1);\n const nextId = updatedIds[nextIndex];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n }\n }\n\n private scrollToNode(nodeId: string): void {\n if (!this._containerRef) {\n return;\n }\n const el = this._containerRef.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (el) {\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n}\n","import {\n fileSchema,\n rowIdSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowCreatedAtSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n SystemSchemaIds,\n type RefSchemas,\n} from '@revisium/schema-toolkit';\n\nexport const defaultRefSchemas: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n","import * as mobx from 'mobx';\nimport {\n setReactivityProvider,\n createMobxProvider,\n} from '@revisium/schema-toolkit/core';\n\nlet initialized = false;\n\nexport function ensureReactivityProvider(): void {\n if (initialized) {\n return;\n }\n initialized = true;\n setReactivityProvider(createMobxProvider(mobx));\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n createTableModel,\n type TableModel,\n type SchemaModel,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type RefSchemas,\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '@revisium/schema-toolkit';\nimport { TreeState } from '../state/TreeState';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeActionsCallbacks,\n} from '../accessor';\nimport { AccessorCache } from './AccessorCache';\nimport { ValidationTracker } from './ValidationTracker';\nimport { ViewState } from './ViewState';\nimport { CollapseManager } from './CollapseManager';\nimport { KeyboardNavigation } from './KeyboardNavigation';\nimport { defaultRefSchemas } from '../../config/system-schemas';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\nimport { TreeNavigator } from '../utils/TreeNavigator';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorCoreOptions {\n tableId?: string;\n refSchemas?: RefSchemas;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorCore {\n private readonly _tableModel: TableModel;\n private readonly _treeState: TreeState;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n public readonly accessors: AccessorCache;\n public readonly validation: ValidationTracker;\n public readonly view: ViewState;\n public readonly collapse: CollapseManager;\n public readonly keyboard: KeyboardNavigation;\n\n constructor(\n jsonSchema: JsonObjectSchema,\n options: SchemaEditorCoreOptions = {},\n accessorFactory: NodeAccessorFactory = new NodeAccessorFactory(),\n ) {\n ensureReactivityProvider();\n\n this._tableModel = createTableModel({\n tableId: options.tableId ?? '',\n schema: jsonSchema,\n refSchemas: options.refSchemas ?? defaultRefSchemas,\n });\n\n this._treeState = new TreeState();\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const callbacks: NodeActionsCallbacks = {\n renameTable: (name) => this.setTableId(name),\n onNodeRemoved: (nodeId) => this.handleNodeRemoved(nodeId),\n onNodeAdded: (nodeId) => this.handleNodeAdded(nodeId),\n onNodeReplaced: (oldId, newId) => this.handleNodeReplaced(oldId, newId),\n selectForeignKey: () => this.selectForeignKey(),\n };\n\n this.accessors = new AccessorCache(\n () => this._tableModel.schema,\n () => ({\n schemaModel: this._tableModel.schema,\n treeState: this._treeState,\n getTableId: () => this._tableModel.tableId,\n getTableIdError: () => this.tableIdError,\n callbacks,\n }),\n accessorFactory,\n );\n\n this.validation = new ValidationTracker(\n this._tableModel,\n this.accessors,\n () => this.tableIdError,\n );\n\n this.view = new ViewState();\n this.collapse = new CollapseManager(\n this._treeState,\n () => this._tableModel.schema,\n );\n this.keyboard = new KeyboardNavigation(\n this._treeState,\n new TreeNavigator(() => this._tableModel.schema, this._treeState),\n this.accessors,\n );\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n if (shouldCollapse) {\n this.collapse.collapseIfComplex(complexity);\n }\n\n this.collapse.collapseRefNodes();\n\n makeAutoObservable(\n this,\n {\n accessors: false,\n validation: false,\n view: false,\n collapse: false,\n keyboard: false,\n },\n { autoBind: true },\n );\n }\n\n public get tableModel(): TableModel {\n return this._tableModel;\n }\n\n public get schemaModel(): SchemaModel {\n return this._tableModel.schema;\n }\n\n public get treeState(): TreeState {\n return this._treeState;\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdError(): string | null {\n const id = this._tableModel.tableId;\n if (id && !isValidFieldName(id)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableModel.rename(value);\n }\n\n public get rootAccessor(): NodeAccessor {\n return this.accessors.get(this._tableModel.schema.root.id(), true);\n }\n\n public get isDirty(): boolean {\n return this._tableModel.isDirty;\n }\n\n public get isValid(): boolean {\n return (\n this._tableModel.schema.isValid &&\n this.tableIdError === null &&\n this._tableModel.tableId.length > 0\n );\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public markAsSaved(): void {\n this._tableModel.commit();\n this.accessors.clear();\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._tableModel.schema.root;\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === 'Array' && !currentRoot.isArray()) {\n const result = this._tableModel.schema.wrapRootInArray();\n if (result) {\n this.accessors.clear();\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (fieldType) {\n const result = this._tableModel.schema.replaceRoot(fieldType);\n if (result) {\n this.accessors.clear();\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._tableModel.schema.moveNode(fromNodeId, toParentId);\n this.accessors.delete(fromNodeId);\n }\n\n public revert(): void {\n this._tableModel.revert();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n public dispose(): void {\n this.keyboard.dispose();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n private handleNodeRemoved(nodeId: string): void {\n this.accessors.delete(nodeId);\n this._treeState.clearNode(nodeId);\n if (this._treeState.activeNodeId === nodeId) {\n this._treeState.setActiveNodeId(null);\n }\n }\n\n private handleNodeAdded(nodeId: string): void {\n this.collapseIfRefNode(nodeId);\n this.keyboard.handleNodeAdded(nodeId);\n }\n\n private handleNodeReplaced(oldNodeId: string, newNodeId: string): void {\n this.accessors.delete(oldNodeId);\n\n if (oldNodeId !== newNodeId) {\n this._treeState.clearNode(oldNodeId);\n }\n\n this._treeState.setMenuOpen(newNodeId, false);\n this.keyboard.handleNodeReplaced(oldNodeId, newNodeId);\n this.collapseIfRefNode(newNodeId);\n }\n\n private collapseIfRefNode(nodeId: string): void {\n const node = this._tableModel.schema.nodeById(nodeId);\n if (node.isRef() && (node.isObject() || node.isArray())) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { SchemaEditorCore } from '../core';\nimport type { KeyboardNavigation } from '../core/KeyboardNavigation';\nimport type { NodeAccessor } from '../accessor';\n\nexport class SchemaTreeVM {\n constructor(private readonly _core: SchemaEditorCore) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get rootAccessor(): NodeAccessor {\n return this._core.rootAccessor;\n }\n\n public get schemaModel(): SchemaModel {\n return this._core.schemaModel;\n }\n\n public getChildAccessors(\n nodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n return this._core.accessors.getChildren(nodeId, parentIsReadonly);\n }\n\n public changeRootType(typeId: string): void {\n this._core.changeRootType(typeId);\n }\n\n public changeNodeType(accessor: NodeAccessor, typeId: string): void {\n if (accessor.isRoot) {\n this._core.changeRootType(typeId);\n } else {\n accessor.actions.changeType(typeId);\n }\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._core.moveNode(fromNodeId, toParentId);\n }\n\n public selectForeignKey(): Promise<string | null> {\n return this._core.selectForeignKey();\n }\n\n public get keyboard(): KeyboardNavigation {\n return this._core.keyboard;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n type TableModel,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport type CreateTableViewMode = 'Example' | 'Schema';\n\nexport class CreateTableDialogVM {\n private _viewMode: CreateTableViewMode = 'Example';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get viewMode(): CreateTableViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: CreateTableViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public get exampleData(): unknown {\n return this._tableModel.schema.generateDefaultValue({ arrayItemCount: 1 });\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n this._loading = false;\n }\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\n\nexport class ReviewErrorsDialogVM {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _getTableIdError: () => string | null,\n private readonly _getFormulaInputErrors: () => TreeFormulaValidationError[],\n private readonly _onRevert?: () => void,\n private readonly _onClose?: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRevert(): boolean {\n return this._onRevert !== undefined;\n }\n\n public revert(): void {\n this._onRevert?.();\n this._onClose?.();\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this._getFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { CreateTableDialogVM } from '../dialog/CreateTableDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type CreateDialogViewMode = 'Example' | 'Schema';\n\nexport interface CreatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class CreatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isCreateDialogOpen = false;\n private _createDialogViewMode: CreateDialogViewMode = 'Example';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: CreatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'creating' {\n return 'creating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n );\n }\n\n // ============ Create Dialog ============\n\n public get showCreateTableButton(): boolean {\n return this._core.isValid && !this._core.validation.hasErrors;\n }\n\n public get isCreateDialogOpen(): boolean {\n return this._isCreateDialogOpen;\n }\n\n public openCreateDialog(): void {\n this._isCreateDialogOpen = true;\n }\n\n public closeCreateDialog(): void {\n this._isCreateDialogOpen = false;\n }\n\n public get createDialogViewMode(): CreateDialogViewMode {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: CreateDialogViewMode): void {\n this._createDialogViewMode = mode;\n }\n\n public get createDialogVM(): CreateTableDialogVM {\n return new CreateTableDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.closeCreateDialog(),\n );\n }\n\n // ============ Actions ============\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeCreateDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n TableModel,\n SchemaPatch,\n JsonPatch,\n} from '@revisium/schema-toolkit';\n\nexport type ReviewChangesViewMode = 'Changes' | 'Patches';\n\nexport interface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\nexport class ReviewChangesDialogVM {\n private _viewMode: ReviewChangesViewMode = 'Changes';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onRevert: () => void,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdChange(): TableIdChangeInfo | null {\n if (!this.isTableIdChanged) {\n return null;\n }\n return {\n initialTableId: this.initialTableId,\n currentTableId: this.tableId,\n };\n }\n\n public get patches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public get jsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public get patchesCount(): number {\n return this.patches.length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get hasChanges(): boolean {\n return this.patchesCount > 0 || this.isTableIdChanged;\n }\n\n public get viewMode(): ReviewChangesViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ReviewChangesViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n public revert(): void {\n this._onRevert();\n this._onClose();\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { ReviewChangesDialogVM } from '../dialog/ReviewChangesDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type UpdateDialogViewMode = 'Changes' | 'Patches';\n\nexport interface UpdatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class UpdatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isChangesDialogOpen = false;\n private _updateDialogViewMode: UpdateDialogViewMode = 'Changes';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: UpdatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'updating' {\n return 'updating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n () => this.revert(),\n () => this.closeErrorsDialog(),\n );\n }\n\n // ============ Changes Dialog ============\n\n public get showApplyChangesButton(): boolean {\n return (\n this._core.isValid &&\n !this._core.validation.hasErrors &&\n (this._core.isDirty || this._core.isTableIdChanged)\n );\n }\n\n public get totalChangesCount(): number {\n return this._core.totalChangesCount;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get updateDialogViewMode(): UpdateDialogViewMode {\n return this._updateDialogViewMode;\n }\n\n public setUpdateDialogViewMode(mode: UpdateDialogViewMode): void {\n this._updateDialogViewMode = mode;\n }\n\n public get changesDialogVM(): ReviewChangesDialogVM {\n return new ReviewChangesDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.revert(),\n () => this.closeChangesDialog(),\n );\n }\n\n // ============ Actions ============\n\n public revert(): void {\n this._core.revert();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public getPatches() {\n return this._core.getPatches();\n }\n\n public getJsonPatches() {\n return this._core.getJsonPatches();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","export type {\n SchemaNode,\n SchemaModel,\n FieldType,\n} from '@revisium/schema-toolkit';\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport type NodeType =\n | 'object'\n | 'array'\n | 'string'\n | 'number'\n | 'boolean'\n | 'ref'\n | 'foreignKey';\n\nexport interface NodeUIState {\n isExpanded: boolean;\n isFocused: boolean;\n isMenuOpen: boolean;\n isSettingsOpen: boolean;\n}\n\nexport interface FormulaState {\n inputValue: string | null;\n errorValue: string | null;\n}\n\nexport interface DragState {\n isDragging: boolean;\n isDraggedOver: boolean;\n}\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ElementType;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: PiTreeViewThin,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: PiBracketsCurlyThin,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: PiLinkThin,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon as={currentMode.icon} boxSize={4} />\n <Icon\n as={PiCaretDownLight}\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n />\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon as={item.icon} boxSize={4} mr=\"8px\" />\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","import {\n FocusEventHandler,\n FormEventHandler,\n KeyboardEventHandler,\n RefCallback,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nexport interface UseContentEditableOptions {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: () => void;\n onFocus?: () => void;\n onEscape?: () => void;\n onEnter?: () => void;\n restrict?: RegExp;\n autoFocus?: boolean;\n focusTrigger?: number;\n}\n\nexport type UseContentEditableReturn = {\n ref: RefCallback<HTMLElement>;\n contentEditable: true;\n spellCheck: false;\n dangerouslySetInnerHTML: { __html: string };\n onInput: FormEventHandler<HTMLElement>;\n onBlur: FormEventHandler<HTMLElement>;\n onFocus: FocusEventHandler<HTMLElement>;\n onKeyDown: KeyboardEventHandler<HTMLElement>;\n};\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport function useContentEditable(\n options: UseContentEditableOptions,\n): UseContentEditableReturn {\n const { value, autoFocus, focusTrigger } = options;\n\n const elementRef = useRef<HTMLElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n const isFirstRender = useRef(true);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const ref: RefCallback<HTMLElement> = useCallback((node) => {\n elementRef.current = node;\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n elementRef.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && elementRef.current) {\n const maxPosition = (elementRef.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = elementRef.current.childNodes[0];\n const node: Node = firstChild ?? elementRef.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n\n elementRef.current?.focus();\n const selection = globalThis.getSelection();\n\n if (elementRef.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(elementRef.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }, [focusTrigger]);\n\n const handleInput: FormEventHandler<HTMLElement> = useCallback((event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n const val = textValue === '\\n' ? '' : textValue;\n optionsRef.current.onChange?.(val);\n }, []);\n\n const handleBlur: FormEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onBlur?.();\n cursorPosition.current = null;\n }, []);\n\n const handleFocus: FocusEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onFocus?.();\n }, []);\n\n const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(\n (event) => {\n const opts = optionsRef.current;\n\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (opts.value) {\n elementRef.current?.blur();\n opts.onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n elementRef.current?.blur();\n opts.onEscape?.();\n }\n\n if (\n opts.restrict &&\n !event.metaKey &&\n !event.ctrlKey &&\n !allowed.has(event.key) &&\n !opts.restrict.test(event.key)\n ) {\n event.preventDefault();\n }\n },\n [],\n );\n\n return {\n ref,\n contentEditable: true,\n spellCheck: false,\n dangerouslySetInnerHTML: { __html: escapeHtml(value) },\n onInput: handleInput,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n}\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef } from 'react';\nimport {\n useContentEditable,\n type UseContentEditableOptions,\n} from '../../hooks/useContentEditable';\n\nexport interface ContentEditableProps extends Pick<\n UseContentEditableOptions,\n | 'onChange'\n | 'onBlur'\n | 'onFocus'\n | 'onEscape'\n | 'onEnter'\n | 'restrict'\n | 'autoFocus'\n | 'focusTrigger'\n> {\n initValue: string;\n placeholder?: string;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nexport const ContentEditable: React.FC<ContentEditableProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusTrigger,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const elementRef = useRef<HTMLElement | null>(null);\n\n const editableProps = useContentEditable({\n value: initValue,\n onChange,\n onBlur,\n onFocus,\n onEscape,\n onEnter,\n restrict,\n autoFocus,\n focusTrigger,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n cursor=\"text\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={combinedRef}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n outline={0}\n width=\"100%\"\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onInput={editableProps.onInput}\n onKeyDown={editableProps.onKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon as={PiX} size=\"md\" />\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon as={PiCaretLeft} boxSize={4} color=\"gray.500\" />\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeWrapperProps {\n accessor: NodeAccessor;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const TreeNodeWrapper: FC<TreeNodeWrapperProps> = observer(\n ({\n accessor,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n dataTestId,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${accessor.nodeId}`;\n const collapseButtonClass = `collapse-button-${accessor.nodeId}`;\n\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const activeCollapseStyles =\n isActiveWithName && isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' as const },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' as const },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n ...(isActiveWithName\n ? { [`& .${hoverTargetClass}`]: { opacity: 1 } }\n : {}),\n }\n : {};\n\n const getCollapseButtonTestId = (): string | undefined => {\n if (!dataTestId) {\n return undefined;\n }\n return isCollapsed\n ? `${dataTestId}-expand-button`\n : `${dataTestId}-collapse-button`;\n };\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n css={activeCollapseStyles}\n data-node-id={accessor.nodeId}\n data-active={accessor.state.isActive || undefined}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n backgroundColor={accessor.state.isActive ? 'gray.100' : undefined}\n borderRadius=\"4px\"\n cursor=\"default\"\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n data-testid={getCollapseButtonTestId()}\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n triggerId?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n triggerId,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={triggerId}>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n triggerId={`${dataTestId}-menu-submenu-${option.id}`}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Flex, Icon } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiDotsSixVerticalBold } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface DragHandleProps {\n dataTestId: string;\n hoverClass?: string;\n applyHoverStyles: boolean;\n}\n\nexport const DragHandle: FC<DragHandleProps> = ({\n dataTestId,\n hoverClass,\n applyHoverStyles,\n}) => (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon as={PiDotsSixVerticalBold} size=\"md\" color=\"gray.300\" />\n </Flex>\n </Tooltip>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface ErrorIndicatorProps {\n dataTestId: string;\n errorMessage: string;\n}\n\nexport const ErrorIndicator: FC<ErrorIndicatorProps> = ({\n dataTestId,\n errorMessage,\n}) => (\n <Tooltip\n content={errorMessage}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n data-testid={`${dataTestId}-error-indicator`}\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n);\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ntype DragAndDropData = Record<string, unknown> & {\n accessor: NodeAccessor;\n};\n\nconst getDragData = (data: Record<string, unknown>): NodeAccessor | null => {\n const accessor = data.accessor;\n if (accessor && typeof accessor === 'object' && 'nodeId' in accessor) {\n return accessor as NodeAccessor;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n accessor: NodeAccessor;\n onDrop?: (fromNodeId: string) => void;\n canDrag: boolean;\n isDropTarget: boolean;\n canAcceptDrop: (fromNodeId: string) => boolean;\n}\n\nexport const useDragAndDrop = ({\n accessor,\n onDrop,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!canDrag || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ accessor }),\n });\n\n return () => cleanup();\n }, [accessor, canDrag]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (draggingAccessor && canAcceptDrop(draggingAccessor.nodeId)) {\n if (onDrop) {\n onDrop(draggingAccessor.nodeId);\n }\n }\n\n accessor.state.setDraggedOver(false);\n accessor.state.setDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingAccessor = getDragData(e.source.data);\n if (draggingAccessor) {\n accessor.state.setDraggedOver(canAcceptDrop(draggingAccessor.nodeId));\n }\n },\n onDragLeave: () => accessor.state.setDraggedOver(false),\n });\n\n return () => cleanup();\n }, [accessor, isDropTarget, onDrop, canAcceptDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (!draggingAccessor) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = canAcceptDrop(draggingAccessor.nodeId);\n\n if (canAccept) {\n accessor.state.setDrop(true);\n } else {\n accessor.state.setDisabledDrop(true);\n }\n } else {\n accessor.state.setDisabledDrop(true);\n }\n },\n onDrop: () => {\n accessor.state.setDrop(false);\n accessor.state.setDisabledDrop(false);\n },\n });\n }, [accessor, isDropTarget, canAcceptDrop]);\n\n return {\n dragAndDropRef,\n isDraggable: canDrag,\n isDrop: accessor.state.isDrop,\n isDisabledDrop: accessor.state.isDisabledDrop,\n isDraggedOver: accessor.state.isDraggedOver,\n };\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode, useCallback } from 'react';\nimport { ContentEditable } from '../../../../components/ContentEditable';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { DragHandle } from './DragHandle';\nimport { ErrorIndicator } from './ErrorIndicator';\nimport { useDragAndDrop } from './useDragAndDrop';\n\ninterface TreeNodeFieldProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const TreeNodeField: FC<TreeNodeFieldProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n hoverTargetClass,\n onChangeType,\n rightContent,\n }) => {\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n const applyHoverStyles = !accessor.state.isFocused && !isActiveWithName;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(accessor.label.name);\n\n const hasDropTarget = treeVM.schemaModel.hasValidDropTarget(\n accessor.nodeId,\n );\n const canDrag =\n !accessor.isRoot && !accessor.isReadonly && hasName && hasDropTarget;\n const isDropTarget = accessor.isObject && !accessor.isReadonly;\n\n const canAcceptDrop = useCallback(\n (fromNodeId: string) => {\n return treeVM.schemaModel.canMoveNode(fromNodeId, accessor.nodeId);\n },\n [accessor.nodeId, treeVM.schemaModel],\n );\n\n const handleDrop = useCallback(\n (fromNodeId: string) => {\n treeVM.moveNode(fromNodeId, accessor.nodeId);\n },\n [treeVM, accessor.nodeId],\n );\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({\n accessor,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n onDrop: handleDrop,\n });\n\n const showTypeSelector = !accessor.isReadonly;\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <DragHandle\n dataTestId={dataTestId}\n hoverClass={hoverClass}\n applyHoverStyles={applyHoverStyles}\n />\n )}\n {accessor.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {accessor.label.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!accessor.label.name}\n initValue={accessor.label.name}\n placeholder={\n accessor.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={accessor.handleFieldBlur}\n onFocus={() => accessor.state.setFocused(true)}\n onChange={accessor.actions.rename}\n onEnter={treeVM.keyboard.handleEditEnter}\n focusTrigger={accessor.state.focusRequestCount}\n />\n )}\n {hasName && accessor.validation.hasError && (\n <ErrorIndicator\n dataTestId={dataTestId}\n errorMessage={accessor.validation.errorMessage ?? ''}\n />\n )}\n </Flex>\n {hasName && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={accessor.state.isMenuOpen}\n onOpenChange={accessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {accessor.label.typeLabel}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {accessor.label.typeLabel}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT, PiFunction, PiWarning } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeIndicatorsProps {\n accessor: NodeAccessor;\n}\n\nexport const TreeNodeIndicators: FC<TreeNodeIndicatorsProps> = observer(\n ({ accessor }) => {\n const description = accessor.label.description;\n const hasFormula = accessor.formula.hasFormula;\n const formula = accessor.formula.formula;\n const isDeprecated = accessor.label.isDeprecated;\n\n const hasAnyIndicator = description || hasFormula || isDeprecated;\n\n if (!hasAnyIndicator) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\">\n {isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {hasFormula && (\n <Tooltip\n content={`Formula: ${formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n {description && (\n <Tooltip content={description} positioning={{ placement: 'top' }}>\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiTextT />\n </Box>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface DescriptionSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n accessor.label.description ?? '',\n );\n\n const handleBlur = () => {\n accessor.actions.setDescription(localValue || undefined);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-description-menu`}>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {accessor.label.description && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.label.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport {\n validateFormulaAgainstSchema,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface FormulaSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nconst validateLocally = (\n value: string,\n fieldName: string,\n plainSchema: JsonObjectSchema,\n): string | null => {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const error = validateFormulaAgainstSchema(trimmed, fieldName, plainSchema);\n return error ? error.error : null;\n } catch {\n return 'Invalid formula';\n }\n};\n\nconst FormulaInput: FC<{\n accessor: NodeAccessor;\n dataTestId: string;\n}> = observer(({ accessor, dataTestId }) => {\n const initialValue = accessor.formula.formula;\n const initialError = accessor.formula.errorMessage ?? null;\n const [localValue, setLocalValue] = useState(initialValue);\n const [localError, setLocalError] = useState<string | null>(initialError);\n const localValueRef = useRef(localValue);\n const initialValueRef = useRef(initialValue);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n localValueRef.current = value;\n const error = validateLocally(\n value,\n accessor.label.name,\n accessor.formula.plainSchema,\n );\n setLocalError(error);\n };\n\n useEffect(() => {\n const accessorRef = accessor;\n const initialRef = initialValueRef;\n return () => {\n const value = localValueRef.current;\n if (value === initialRef.current) {\n return;\n }\n accessorRef.formula.setInputValue(value);\n accessorRef.formula.applyFormula();\n };\n }, [accessor]);\n\n const hasError = localError !== null;\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <>\n <Textarea\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n rows={2}\n borderColor={hasError ? 'red.300' : undefined}\n data-testid={`${dataTestId}-formula-input`}\n />\n {hasError && (\n <Box\n fontSize=\"xs\"\n color=\"red.500\"\n mt={1}\n data-testid={`${dataTestId}-formula-error`}\n >\n {localError}\n </Box>\n )}\n {!hasError && localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt={1}>\n Field will be readOnly\n </Box>\n )}\n </>\n );\n});\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const hasError = accessor.formula.hasError;\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-formula-menu`}>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {accessor.formula.hasFormula && (\n <Box\n color={hasError ? 'red.400' : 'gray.400'}\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.formula.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content w=\"280px\" p={2}>\n <FormulaInput accessor={accessor} dataTestId={dataTestId} />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import type { NodeAccessor } from '../../../model/accessor';\n\nexport function parseDefaultValue(\n value: string,\n accessor: NodeAccessor,\n): unknown {\n const nodeType = accessor.label.nodeType;\n if (nodeType === 'number') {\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n if (nodeType === 'boolean') {\n return value === 'true';\n }\n return value;\n}\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { parseDefaultValue } from './parseDefaultValue';\n\ninterface DefaultValueSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(accessor.defaultValueAsString);\n\n const handleBlur = () => {\n accessor.actions.setDefaultValue(parseDefaultValue(localValue, accessor));\n };\n\n const handleBooleanChange = (checked: boolean) => {\n accessor.actions.setDefaultValue(checked);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n const isBoolean = accessor.label.nodeType === 'boolean';\n const isNumber = accessor.label.nodeType === 'number';\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-default-menu`}>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {accessor.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={accessor.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(accessor.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={isNumber ? 'number' : 'text'}\n placeholder={isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLInputElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n });\n }\n }, [])}\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\n\ninterface TreeNodeContextMenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeContextMenu: FC<TreeNodeContextMenuProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (details: { open: boolean }) => {\n accessor.state.setSettingsOpen(details.open);\n };\n\n const canDelete = accessor.actions.canRemove;\n\n return (\n <Menu.Root\n open={accessor.state.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu accessor={accessor} dataTestId={dataTestId} />\n\n {showFormula && (\n <FormulaSubmenu accessor={accessor} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n accessor={accessor}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() =>\n accessor.actions.setDeprecated(!accessor.label.isDeprecated)\n }\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {accessor.label.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={canDelete ? 'fg.error' : 'gray.400'}\n disabled={!canDelete}\n onClick={canDelete ? onDelete : undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\n\ninterface TreeNodeRightContentProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeRightContent: FC<TreeNodeRightContentProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const showMenu = !accessor.isReadonly;\n\n return (\n <>\n <TreeNodeIndicators accessor={accessor} />\n {showMenu && (\n <TreeNodeContextMenu\n accessor={accessor}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeField } from '../TreeNodeField';\nimport { TreeNodeRightContent } from '../TreeNodeRightContent';\n\ninterface NodeViewLayoutProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n collapsible?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n children?: ReactNode;\n}\n\nexport const NodeViewLayout: FC<NodeViewLayoutProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n collapsible = false,\n showFormula,\n showDefault,\n children,\n }) => {\n const hoverTargetClass = accessor.hoverTargetClass;\n const isCollapsible = collapsible && !accessor.isRoot;\n const isCollapsed = isCollapsible && !accessor.state.isExpanded;\n\n return (\n <TreeNodeWrapper\n accessor={accessor}\n isCollapsible={isCollapsible}\n isCollapsed={isCollapsed}\n onToggleCollapse={\n isCollapsible ? accessor.state.toggleExpanded : undefined\n }\n hoverTargetClass={hoverTargetClass}\n dataTestId={dataTestId}\n field={\n <TreeNodeField\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={(typeId) => treeVM.changeNodeType(accessor, typeId)}\n rightContent={\n <TreeNodeRightContent\n accessor={accessor}\n dataTestId={dataTestId}\n showDelete={!accessor.isRoot}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={accessor.actions.remove}\n />\n }\n />\n }\n >\n {children}\n </TreeNodeWrapper>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { TreeNodeView } from '../TreeNodeView';\n\ninterface ObjectNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const hideContent = accessor.isRoot && !accessor.label.name;\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n const showAddButton = !accessor.isReadonly && !hideContent;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n {!hideContent && (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n )}\n </NodeViewLayout>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface ForeignKeyValueProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ accessor, dataTestId }) => {\n const value = accessor.label.foreignKeyTable;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={accessor.actions.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeView } from '../TreeNodeView';\nimport { ArrayItemsView } from './ArrayItemsView';\nimport { ForeignKeyValue } from './ForeignKeyValue';\n\ninterface ArrayItemsChildrenProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n if (accessor.isObject) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {accessor.actions.canAddProperty && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (accessor.isArray) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n if (children.length > 0 && children[0]) {\n return (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n }\n\n if (accessor.isForeignKey) {\n return <ForeignKeyValue accessor={accessor} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { ArrayItemsChildren } from './ArrayItemsChildren';\n\ninterface ArrayItemsViewProps {\n accessor: NodeAccessor;\n childAccessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ accessor, childAccessor, treeVM, dataTestId }) => {\n const hoverTargetClass = childAccessor.hoverTargetClass;\n const applyHoverStyles = childAccessor.shouldApplyFieldStyles;\n\n const handleChangeItemsType = (typeId: string) => {\n accessor.actions.changeItemsType(typeId);\n };\n\n return (\n <TreeNodeWrapper\n accessor={childAccessor}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={handleChangeItemsType}\n open={childAccessor.state.isMenuOpen}\n onOpenChange={childAccessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {childAccessor.label.typeLabel}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TreeNodeIndicators accessor={childAccessor} />\n {childAccessor.showMenu && (\n <TreeNodeContextMenu\n accessor={childAccessor}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n showFormula={childAccessor.isPrimitive}\n showDefault={childAccessor.isPrimitive}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n }\n >\n <ArrayItemsChildren\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-0`}\n />\n </TreeNodeWrapper>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { ArrayItemsView } from './ArrayItemsView';\n\ninterface ArrayNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.length > 0 && children[0] ? (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n ) : (\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"8px\">\n items\n </Text>\n )}\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface PrimitiveNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n showFormula={accessor.isPrimitive}\n showDefault={accessor.isPrimitive}\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useCallback } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface ForeignKeyNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const handleSelectForeignKey = useCallback(async () => {\n const tableId = await treeVM.selectForeignKey();\n if (tableId !== null) {\n accessor.actions.setForeignKey(tableId);\n }\n }, [treeVM, accessor.actions]);\n\n const foreignKeyValue = accessor.label.foreignKeyTable;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n >\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={handleSelectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {foreignKeyValue || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface RefNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n },\n);\n","import { Box, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { ObjectNodeView } from '../ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView';\n\ninterface TreeNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n showItemsLabel?: boolean;\n}\n\nexport const TreeNodeView: FC<TreeNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId, showItemsLabel }) => {\n const renderNode = () => {\n if (accessor.isObject) {\n return (\n <ObjectNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isArray) {\n return (\n <ArrayNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isForeignKey) {\n return (\n <ForeignKeyNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isRef) {\n return (\n <RefNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isPrimitive) {\n return (\n <PrimitiveNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n return null;\n };\n\n if (showItemsLabel) {\n return (\n <Box>\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"-6px\" mb=\"-4px\">\n items\n </Text>\n {renderNode()}\n </Box>\n );\n }\n\n return renderNode();\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface HighlightProps {\n children: ReactNode;\n}\n\nexport const Highlight: FC<HighlightProps> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface CodeBoxProps {\n children: ReactNode;\n}\n\nexport const CodeBox: FC<CodeBoxProps> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n","import { Flex, Portal } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogLayoutProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n maxWidth?: string;\n}\n\nexport const DialogLayout: FC<DialogLayoutProps> = ({\n isOpen,\n onClose,\n title,\n children,\n footer,\n maxWidth = '700px',\n}) => {\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth={maxWidth}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogBody>{children}</DialogBody>\n\n {footer && (\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {footer}\n </Flex>\n </DialogFooter>\n )}\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import { Button, Flex } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogFooterActionsProps {\n leftContent?: ReactNode;\n onCancel: () => void;\n onConfirm?: () => void;\n confirmLabel?: string;\n confirmDisabled?: boolean;\n confirmLoading?: boolean;\n showConfirm?: boolean;\n}\n\nexport const DialogFooterActions: FC<DialogFooterActionsProps> = ({\n leftContent,\n onCancel,\n onConfirm,\n confirmLabel = 'Confirm',\n confirmDisabled = false,\n confirmLoading = false,\n showConfirm = true,\n}) => {\n return (\n <>\n {leftContent ?? <div />}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n {showConfirm && onConfirm && (\n <Button\n variant=\"outline\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n loading={confirmLoading}\n >\n {confirmLabel}\n </Button>\n )}\n </Flex>\n </>\n );\n};\n","import {\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport { jsonPointerToSimplePath } from '@revisium/schema-toolkit';\nimport type { SchemaPatch, PropertyChange } from '@revisium/schema-toolkit';\nimport type { DefaultValueExample } from '../../../../model/utils';\n\nexport type PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nexport const operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nexport const formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nexport const formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '\"\"';\n }\n return JSON.stringify(value);\n};\n\nexport const getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nexport const getFilteredPropertyChanges = (\n op: string,\n propertyChanges: PropertyChange[],\n defaultExample: DefaultValueExample | null,\n): PropertyChange[] => {\n if (op === 'remove') {\n return [];\n }\n if (op === 'add' && defaultExample) {\n return propertyChanges.filter((c) => c.property !== 'default');\n }\n return propertyChanges;\n};\n","import { Badge, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiPencilSimpleLight } from 'react-icons/pi';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport { Highlight } from '../Highlight';\nimport { operationIcons, getFromFieldName, PatchOp } from './helpers';\n\ninterface OperationDescriptionProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const OperationDescription: FC<OperationDescriptionProps> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DefaultValueExample } from '../../../../model/utils';\nimport { formatDefaultValue } from './helpers';\n\ninterface DefaultValueRowProps {\n example: DefaultValueExample;\n}\n\nexport const DefaultValueRow: FC<DefaultValueRowProps> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n","import { Badge } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DataLossSeverity } from '../../../../model/utils';\n\ninterface DataLossBadgeProps {\n severity: DataLossSeverity;\n}\n\nexport const DataLossBadge: FC<DataLossBadgeProps> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n","import { Badge, Flex, Icon, Text, VStack } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport type { TransformationInfo } from '../../../../model/utils';\nimport { CodeBox } from '../CodeBox';\nimport { DataLossBadge } from './DataLossBadge';\n\ninterface TransformationInfoRowProps {\n info: TransformationInfo;\n}\n\nexport const TransformationInfoRow: FC<TransformationInfoRowProps> = ({\n info,\n}) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <CodeBox>{JSON.stringify(info.example.before)}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{JSON.stringify(info.example.after)}</CodeBox>\n </Flex>\n </VStack>\n );\n};\n","import { Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport { CodeBox } from '../CodeBox';\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nexport const ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n} from '../../../../model/utils';\nimport { OperationDescription } from './OperationDescription';\nimport { DefaultValueRow } from './DefaultValueRow';\nimport { TransformationInfoRow } from './TransformationInfoRow';\nimport { ValueChangeRow } from './ValueChangeRow';\nimport { formatChangeValue, getFilteredPropertyChanges } from './helpers';\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const { patch, typeChange, propertyChanges } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value !== undefined) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n const filteredChanges = useMemo(\n () => getFilteredPropertyChanges(patch.op, propertyChanges, defaultExample),\n [patch.op, propertyChanges, defaultExample],\n );\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {filteredChanges.map((change) => (\n <Box key={change.property} mt={2} ml={8}>\n <ValueChangeRow\n label={change.property}\n fromValue={formatChangeValue(change.from)}\n toValue={formatChangeValue(change.to)}\n />\n </Box>\n ))}\n </Box>\n );\n});\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowsLeftRightLight } from 'react-icons/pi';\nimport type { TableIdChangeInfo } from '../../../../model/dialog';\nimport { Highlight } from '../Highlight';\n\ninterface TableIdChangeRowProps {\n change: TableIdChangeInfo;\n}\n\nexport const TableIdChangeRow: FC<TableIdChangeRowProps> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n","import { Badge, Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\n\nexport type ErrorType = 'validation' | 'formula' | 'tableId';\n\ninterface ErrorItemProps {\n message: string;\n type?: ErrorType;\n fieldPath?: string;\n}\n\nexport const ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n","import { Button, Flex, Icon, Popover, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowCounterClockwiseBold } from 'react-icons/pi';\n\ninterface RevertButtonProps {\n onRevert: () => void;\n disabled?: boolean;\n}\n\nexport const RevertButton: FC<RevertButtonProps> = ({ onRevert, disabled }) => {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button variant=\"ghost\" size=\"sm\" color=\"gray.500\" disabled={disabled}>\n <Icon as={PiArrowCounterClockwiseBold} />\n Revert All\n </Button>\n </Popover.Trigger>\n <Popover.Positioner>\n <Popover.Content>\n <Popover.Arrow />\n <Popover.Body>\n <Text fontSize=\"sm\" mb={3}>\n This will revert all changes. Are you sure?\n </Text>\n <Flex gap={2} justify=\"flex-end\">\n <Popover.CloseTrigger asChild>\n <Button variant=\"outline\" size=\"xs\">\n Cancel\n </Button>\n </Popover.CloseTrigger>\n <Popover.CloseTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"xs\"\n colorPalette=\"red\"\n onClick={onRevert}\n >\n Revert\n </Button>\n </Popover.CloseTrigger>\n </Flex>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Popover.Root>\n );\n};\n","import { Box, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { ReviewErrorsDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n ErrorItem,\n RevertButton,\n} from '../shared';\n\ninterface ReviewErrorsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewErrorsDialogVM;\n}\n\nexport const ReviewErrorsDialog: FC<ReviewErrorsDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Errors for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n vm.canRevert ? <RevertButton onRevert={vm.revert} /> : undefined\n }\n onCancel={onClose}\n showConfirm={false}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack\n align=\"stretch\"\n gap={0}\n divideY=\"1px\"\n divideColor=\"gray.100\"\n >\n {vm.tableIdError && (\n <ErrorItem\n key=\"tableId-error\"\n message={vm.tableIdError}\n type=\"tableId\"\n />\n )}\n {vm.validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {vm.formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Flex, SegmentGroup, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { ReviewChangesDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n PatchRow,\n TableIdChangeRow,\n RevertButton,\n} from '../shared';\n\ninterface ReviewChangesDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewChangesDialogVM;\n}\n\nexport const ReviewChangesDialog: FC<ReviewChangesDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n const applyButtonText = `Apply Changes (${vm.totalChangesCount})`;\n\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Changes for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n <RevertButton onRevert={vm.revert} disabled={!vm.hasChanges} />\n }\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel={applyButtonText}\n confirmDisabled={!vm.hasChanges}\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n {vm.hasChanges ? (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Changes' | 'Patches')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Changes', 'Patches']} />\n </SegmentGroup.Root>\n\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Changes' ? (\n <>\n {vm.tableIdChange && (\n <TableIdChangeRow change={vm.tableIdChange} />\n )}\n {vm.patches.map((schemaPatch) => (\n <PatchRow\n key={`${schemaPatch.patch.op}:${schemaPatch.patch.path}`}\n schemaPatch={schemaPatch}\n />\n ))}\n </>\n ) : (\n <JsonCard readonly data={vm.patches.map((p) => p.patch)} />\n )}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n ) : (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, SegmentGroup, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { CreateTableDialogVM } from '../../../model/dialog';\nimport type { JsonValue } from '../../../types';\nimport { DialogLayout, DialogFooterActions } from '../shared';\n\ninterface CreateTableDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: CreateTableDialogVM;\n}\n\nexport const CreateTableDialog: FC<CreateTableDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Create Table \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel=\"Create Table\"\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Example' | 'Schema')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Example' ? (\n <JsonCard readonly data={(vm.exampleData ?? null) as JsonValue} />\n ) : (\n <JsonCard readonly data={(vm.plainSchema ?? null) as JsonValue} />\n )}\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { ViewerSwitcherMode } from '../../types';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { BaseEditorVM } from '../../model/vm/types';\nimport { TreeNodeView } from '../tree';\nimport { ReviewErrorsDialog } from '../dialog';\nimport type { JsonValue } from '../../types';\n\nexport interface SchemaEditorProps {\n vm: BaseEditorVM;\n dataTestId: string;\n backButton: ReactNode;\n primaryAction?: {\n show: boolean;\n label: string;\n testId: string;\n onClick: () => void;\n };\n dialogs: ReactNode;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(\n ({ vm, dataTestId, backButton, primaryAction, dialogs }) => {\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={{\n '&:hover .editor-hover-target': { opacity: 1 },\n }}\n data-testid={dataTestId}\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {backButton}\n {vm.showReviewErrorsButton && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={vm.openErrorsDialog}\n data-testid=\"schema-editor-review-errors-button\"\n >\n Review Errors ({vm.errorsCount})\n </Button>\n )}\n {primaryAction?.show && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={primaryAction.onClick}\n loading={vm.loading}\n data-testid={primaryAction.testId}\n >\n {primaryAction.label}\n </Button>\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={vm.viewMode as ViewerSwitcherMode}\n onChange={(mode) => vm.setViewMode(mode)}\n />\n </Box>\n </Flex>\n\n {vm.viewMode === ViewerSwitcherMode.Tree && (\n <Box\n ref={(el: HTMLDivElement | null) =>\n vm.tree.keyboard.setContainerRef(el)\n }\n tabIndex={0}\n onKeyDown={vm.tree.keyboard.handleKeyDown}\n outline={0}\n paddingBottom=\"4rem\"\n >\n <TreeNodeView\n accessor={vm.tree.rootAccessor}\n treeVM={vm.tree}\n dataTestId=\"root\"\n />\n </Box>\n )}\n\n {vm.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={vm.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ReviewErrorsDialog\n isOpen={vm.isErrorsDialogOpen}\n onClose={vm.closeErrorsDialog}\n vm={vm.errorsDialogVM}\n />\n\n {dialogs}\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CloseButton } from '../../../components';\nimport type { CreatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { CreateTableDialog } from '../dialog';\n\nexport interface CreatingSchemaEditorProps {\n vm: CreatingEditorVM;\n}\n\nexport const CreatingSchemaEditor: FC<CreatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-creating\"\n backButton={\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showCreateTableButton,\n label: 'Create Table',\n testId: 'schema-editor-create-button',\n onClick: vm.openCreateDialog,\n }}\n dialogs={\n <CreateTableDialog\n isOpen={vm.isCreateDialogOpen}\n onClose={vm.closeCreateDialog}\n vm={vm.createDialogVM}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { BackButton } from '../../../components/BackButton';\nimport type { UpdatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { ReviewChangesDialog } from '../dialog';\n\nexport interface UpdatingSchemaEditorProps {\n vm: UpdatingEditorVM;\n}\n\nexport const UpdatingSchemaEditor: FC<UpdatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-updating\"\n backButton={\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showApplyChangesButton,\n label: `Apply Changes (${vm.totalChangesCount})`,\n testId: 'schema-editor-approve-button',\n onClick: vm.openChangesDialog,\n }}\n dialogs={\n <ReviewChangesDialog\n isOpen={vm.isChangesDialogOpen}\n onClose={vm.closeChangesDialog}\n vm={vm.changesDialogVM}\n />\n }\n />\n );\n },\n);\n"],"mappings":"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"}
|