@revisium/schema-toolkit-ui 0.1.2 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["React","ChakraTooltip","createDefaultRegistry","Menu","ForeignKeyValue","NodeFactory"],"sources":["../src/components/Tooltip/Tooltip.tsx","../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/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/schema-editor/types.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/schema-editor/model/node/NodeType.ts","../src/schema-editor/model/node/NodeMetadata.ts","../src/schema-editor/model/node/NullNode.ts","../src/schema-editor/model/node/ObjectNode.ts","../src/schema-editor/model/node/ArrayNode.ts","../src/schema-editor/model/node/StringNode.ts","../src/schema-editor/model/node/NumberNode.ts","../src/schema-editor/model/node/BooleanNode.ts","../src/schema-editor/model/node/RefNode.ts","../src/schema-editor/model/node/NodeFactory.ts","../src/schema-editor/model/path/PathSegment.ts","../src/schema-editor/model/path/Path.ts","../src/schema-editor/model/path/PathParser.ts","../src/schema-editor/model/formula/core/FormulaDependency.ts","../src/schema-editor/model/formula/core/FormulaError.ts","../src/schema-editor/model/formula/parsing/RelativePath.ts","../src/schema-editor/model/formula/parsing/ParsedFormula.ts","../src/schema-editor/model/formula/serialization/RelativePathBuilder.ts","../src/schema-editor/model/formula/serialization/FormulaSerializer.ts","../src/schema-editor/model/formula/store/FormulaDependencyIndex.ts","../src/schema-editor/model/tree/TreeNodeIndex.ts","../src/schema-editor/model/tree/TreeMutator.ts","../src/schema-editor/model/tree/SchemaTree.ts","../src/schema-editor/model/parsing/descriptors/TypeRegistry.ts","../src/schema-editor/model/parsing/descriptors/TypeCapabilities.ts","../src/schema-editor/model/parsing/descriptors/StringDescriptor.ts","../src/schema-editor/model/parsing/descriptors/NumberDescriptor.ts","../src/schema-editor/model/parsing/descriptors/BooleanDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ObjectDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ArrayDescriptor.ts","../src/schema-editor/model/parsing/descriptors/RefDescriptor.ts","../src/schema-editor/model/parsing/descriptors/index.ts","../src/schema-editor/model/schema/SchemaParser.ts","../src/schema-editor/model/schema/SchemaSerializer.ts","../src/schema-editor/model/diff/SchemaComparator.ts","../src/schema-editor/model/diff/index/NodePathIndex.ts","../src/schema-editor/model/diff/changes/ChangeCollector.ts","../src/schema-editor/model/diff/changes/ChangeCoalescer.ts","../src/schema-editor/model/diff/changes/PatchGenerator.ts","../src/schema-editor/model/diff/changes/FormulaChangeDetector.ts","../src/schema-editor/model/diff/enricher/NodeMetadataExtractor.ts","../src/schema-editor/model/diff/enricher/PatchEnricher.ts","../src/schema-editor/model/diff/PatchBuilder.ts","../src/schema-editor/model/diff/SchemaDiff.ts","../src/schema-editor/model/validation/FieldNameValidator.ts","../src/schema-editor/model/validation/SchemaValidator.ts","../src/schema-editor/model/validation/FormulaValidator.ts","../src/schema-editor/model/validation/DefaultValueParser.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/engine/SchemaEngine.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/config/system-schemas.ts","../src/schema-editor/vm/createNodeVM.ts","../src/schema-editor/vm/BaseNodeVM.ts","../src/schema-editor/vm/PrimitiveNodeVM.ts","../src/schema-editor/vm/ArrayNodeVM.ts","../src/schema-editor/vm/ForeignKeyNodeVM.ts","../src/schema-editor/vm/RefNodeVM.ts","../src/schema-editor/vm/SchemaEditorVM.ts","../src/schema-editor/vm/ObjectNodeVM.ts","../src/schema-editor/ui/NodeWrapper/NodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/hooks/useDragAndDrop.ts","../src/schema-editor/ui/FieldEditor/FieldEditor.tsx","../src/schema-editor/ui/NodeIndicators/NodeIndicators.tsx","../src/schema-editor/ui/hooks/useFixZagNestedMenuDismiss.ts","../src/schema-editor/ui/NodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/UsedByFormulasSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/NodeContextMenu.tsx","../src/schema-editor/ui/NodeRightContent/NodeRightContent.tsx","../src/schema-editor/ui/CollapsibleNodeView/CollapsibleNodeView.tsx","../src/schema-editor/ui/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/LeafNodeView/LeafNodeView.tsx","../src/schema-editor/ui/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/NodeView/NodeView.tsx","../src/schema-editor/ui/ChangesPreviewDialog/ChangesPreviewDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.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 { 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","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, {\n DependencyList,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { useUpdateEffect } from 'react-use';\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#039;');\n}\n\ninterface ContentEditableBoxProps {\n initValue: string;\n placeholder?: string;\n autoFocus?: boolean;\n onBlur?: () => void;\n onFocus?: () => void;\n onChange?: (value: string) => void;\n onEscape?: () => void;\n onEnter?: () => void;\n focusIfDependencyList?: DependencyList;\n restrict?: RegExp;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport const ContentEditable: React.FC<ContentEditableBoxProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusIfDependencyList,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n\n useEffect(() => {\n if (autoFocus) {\n ref.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && ref.current) {\n const maxPosition = (ref.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 = ref.current.childNodes[0];\n const node: Node = firstChild ?? ref.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 useUpdateEffect(() => {\n if (focusIfDependencyList) {\n ref.current?.focus();\n const selection = globalThis.getSelection();\n\n if (ref.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(ref.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [...(focusIfDependencyList ?? [])]);\n\n const handleChange: React.FormEventHandler<HTMLDivElement> = useCallback(\n (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 onChange?.(textValue === '\\n' ? '' : textValue);\n },\n [onChange],\n );\n\n const handleBlur: React.FormEventHandler<HTMLDivElement> = useCallback(() => {\n onBlur?.();\n cursorPosition.current = null;\n }, [onBlur]);\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = useCallback(\n (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (initValue) {\n ref.current?.blur();\n onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n if (initValue) {\n ref.current?.blur();\n }\n onEscape?.();\n }\n\n if (restrict && !allowed.has(event.key) && !restrict.test(event.key)) {\n event.preventDefault();\n }\n },\n [initValue, onEnter, onEscape, restrict],\n );\n\n const handleParentClick = useCallback(() => {\n ref.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 onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={ref}\n contentEditable\n spellCheck={'false'}\n dangerouslySetInnerHTML={{ __html: escapeHtml(initValue) }}\n outline={0}\n width=\"100%\"\n onBlur={handleBlur}\n onFocus={onFocus}\n onInput={handleChange}\n onKeyDown={handleKeyDown}\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 size=\"md\">\n <PiX />\n </Icon>\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 boxSize={4} color=\"gray.500\">\n <PiCaretLeft />\n </Icon>\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 { 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","export type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport enum JsonSchemaTypeName {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n}\n\nexport type JsonPatch =\n | { op: 'add'; path: string; value: JsonValue }\n | { op: 'remove'; path: string }\n | { op: 'replace'; path: string; value: JsonValue }\n | { op: 'move'; from: string; path: string }\n | { op: 'copy'; from: string; path: string }\n | { op: 'test'; path: string; value: JsonValue };\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n\nexport enum SystemSchemaIds {\n RowId = 'urn:jsonschema:io:revisium:row-id-schema:1.0.0',\n RowCreatedId = 'urn:jsonschema:io:revisium:row-created-id-schema:1.0.0',\n RowVersionId = 'urn:jsonschema:io:revisium:row-version-id-schema:1.0.0',\n RowCreatedAt = 'urn:jsonschema:io:revisium:row-created-at-schema:1.0.0',\n RowPublishedAt = 'urn:jsonschema:io:revisium:row-published-at-schema:1.0.0',\n RowUpdatedAt = 'urn:jsonschema:io:revisium:row-updated-at-schema:1.0.0',\n RowHash = 'urn:jsonschema:io:revisium:row-hash-schema:1.0.0',\n RowSchemaHash = 'urn:jsonschema:io:revisium:row-schema-hash-schema:1.0.0',\n File = 'urn:jsonschema:io:revisium:file-schema:1.0.0',\n}\n\nexport const getLabelByRef = (ref: string): string => {\n const refMap: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\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 return refMap[ref] ?? ref;\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.ReactNode;\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 boxSize={4}>{currentMode.icon}</Icon>\n <Icon\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n >\n <PiCaretDownLight />\n </Icon>\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 boxSize={4} mr=\"8px\">\n {item.icon}\n </Icon>\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","export enum NodeType {\n Object = 'object',\n Array = 'array',\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Ref = 'ref',\n}\n","export interface NodeMetadata {\n title?: string;\n description?: string;\n deprecated?: boolean;\n}\n\nexport const EMPTY_METADATA: NodeMetadata = {};\n","import type { SchemaNode } from './SchemaNode';\nimport type { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\n\nclass NullNodeImpl implements SchemaNode {\n id(): string {\n return '';\n }\n\n name(): string {\n throw new Error('Null node has no name');\n }\n\n nodeType(): NodeType {\n throw new Error('Null node has no type');\n }\n\n metadata(): NodeMetadata {\n return EMPTY_METADATA;\n }\n\n property(): SchemaNode {\n return this;\n }\n\n items(): SchemaNode {\n return this;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return true;\n }\n\n ref(): string {\n throw new Error('Null node has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(): void {\n throw new Error('Cannot modify null node');\n }\n\n setMetadata(): void {\n throw new Error('Cannot modify null node');\n }\n\n addProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removeProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removePropertyById(): void {\n throw new Error('Cannot modify null node');\n }\n\n replaceProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n setItems(): void {\n throw new Error('Cannot modify null node');\n }\n\n setFormula(): void {\n throw new Error('Cannot modify null node');\n }\n\n setDefaultValue(): void {\n throw new Error('Cannot modify null node');\n }\n\n clone(): SchemaNode {\n return this;\n }\n}\n\nexport const NULL_NODE: SchemaNode = new NullNodeImpl();\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ObjectNode implements SchemaNode {\n private _name: string;\n private _children: SchemaNode[];\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n children: SchemaNode[] = [],\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ObjectNode requires nodeId');\n }\n this._name = name;\n this._children = children;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Object;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(name: string): SchemaNode {\n for (const prop of this._children) {\n if (prop.name() === name) {\n return prop;\n }\n }\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return this._children;\n }\n\n isObject(): boolean {\n return true;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ObjectNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(node: SchemaNode): void {\n this._children.push(node);\n }\n\n removeProperty(name: string): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n removePropertyById(id: string): void {\n const index = this._children.findIndex((c) => c.id() === id);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n replaceProperty(name: string, node: SchemaNode): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children[index] = node;\n }\n }\n\n setItems(): void {\n // No-op for ObjectNode\n }\n\n setFormula(): void {\n // No-op for ObjectNode\n }\n\n setDefaultValue(): void {\n // No-op for ObjectNode\n }\n\n setChildren(children: SchemaNode[]): void {\n this._children = children;\n }\n\n clone(): ObjectNode {\n const clonedChildren = this._children.map((child) => child.clone());\n return new ObjectNode(this._id, this._name, clonedChildren, {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ArrayNode implements SchemaNode {\n private _name: string;\n private _items: SchemaNode;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n items: SchemaNode,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ArrayNode requires nodeId');\n }\n this._name = name;\n this._items = items;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Array;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return this._items;\n }\n\n properties(): readonly SchemaNode[] {\n return [this._items];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return true;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ArrayNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(): void {\n // No-op for ArrayNode\n }\n\n removeProperty(): void {\n // No-op for ArrayNode\n }\n\n removePropertyById(): void {\n // No-op for ArrayNode\n }\n\n replaceProperty(): void {\n // No-op for ArrayNode\n }\n\n setItems(node: SchemaNode): void {\n this._items = node;\n }\n\n setFormula(): void {\n // No-op for ArrayNode\n }\n\n setDefaultValue(): void {\n // No-op for ArrayNode\n }\n\n clone(): ArrayNode {\n return new ArrayNode(this._id, this._name, this._items.clone(), {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport type StringFormat = 'date-time' | 'date' | 'time' | 'email' | 'regex';\n\nexport type ContentMediaType =\n | 'text/plain'\n | 'text/markdown'\n | 'text/html'\n | 'application/json'\n | 'application/schema+json'\n | 'application/yaml';\n\nexport interface StringNodeOptions {\n defaultValue?: string;\n foreignKey?: string;\n format?: StringFormat;\n contentMediaType?: ContentMediaType;\n enumValues?: string[];\n formula?: Formula;\n}\n\nexport class StringNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: string | undefined;\n private _foreignKey: string | undefined;\n private _format: StringFormat | undefined;\n private _contentMediaType: ContentMediaType | undefined;\n private _enumValues: string[] | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: StringNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('StringNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._foreignKey = options.foreignKey;\n this._format = options.format;\n this._contentMediaType = options.contentMediaType;\n this._enumValues = options.enumValues;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.String;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): string | undefined {\n return this._defaultValue;\n }\n\n foreignKey(): string | undefined {\n return this._foreignKey;\n }\n\n format(): StringFormat | undefined {\n return this._format;\n }\n\n contentMediaType(): ContentMediaType | undefined {\n return this._contentMediaType;\n }\n\n enumValues(): string[] | undefined {\n return this._enumValues;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('StringNode has no ref');\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: string | undefined): void {\n this._defaultValue = value;\n }\n\n setForeignKey(value: string | undefined): void {\n this._foreignKey = value;\n }\n\n setFormat(value: StringFormat | undefined): void {\n this._format = value;\n }\n\n setContentMediaType(value: ContentMediaType | undefined): void {\n this._contentMediaType = value;\n }\n\n setEnumValues(values: string[] | undefined): void {\n this._enumValues = values;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for StringNode\n }\n\n removeProperty(): void {\n // No-op for StringNode\n }\n\n removePropertyById(): void {\n // No-op for StringNode\n }\n\n replaceProperty(): void {\n // No-op for StringNode\n }\n\n setItems(): void {\n // No-op for StringNode\n }\n\n clone(): StringNode {\n return new StringNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n foreignKey: this._foreignKey,\n format: this._format,\n contentMediaType: this._contentMediaType,\n enumValues: this._enumValues ? [...this._enumValues] : undefined,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface NumberNodeOptions {\n defaultValue?: number;\n formula?: Formula;\n}\n\nexport class NumberNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: number | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: NumberNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('NumberNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Number;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): number | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('NumberNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: number | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for NumberNode\n }\n\n removeProperty(): void {\n // No-op for NumberNode\n }\n\n removePropertyById(): void {\n // No-op for NumberNode\n }\n\n replaceProperty(): void {\n // No-op for NumberNode\n }\n\n setItems(): void {\n // No-op for NumberNode\n }\n\n clone(): NumberNode {\n return new NumberNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface BooleanNodeOptions {\n defaultValue?: boolean;\n formula?: Formula;\n}\n\nexport class BooleanNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: boolean | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: BooleanNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('BooleanNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Boolean;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): boolean | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('BooleanNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: boolean | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for BooleanNode\n }\n\n removeProperty(): void {\n // No-op for BooleanNode\n }\n\n removePropertyById(): void {\n // No-op for BooleanNode\n }\n\n replaceProperty(): void {\n // No-op for BooleanNode\n }\n\n setItems(): void {\n // No-op for BooleanNode\n }\n\n clone(): BooleanNode {\n return new BooleanNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class RefNode implements SchemaNode {\n private _name: string;\n private _ref: string;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n ref: string,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('RefNode requires nodeId');\n }\n if (!ref) {\n throw new Error('RefNode requires ref');\n }\n this._name = name;\n this._ref = ref;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Ref;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n ref(): string {\n return this._ref;\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return true;\n }\n\n isNull(): boolean {\n return false;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setRef(ref: string): void {\n this._ref = ref;\n }\n\n addProperty(): void {\n // No-op for RefNode\n }\n\n removeProperty(): void {\n // No-op for RefNode\n }\n\n removePropertyById(): void {\n // No-op for RefNode\n }\n\n replaceProperty(): void {\n // No-op for RefNode\n }\n\n setItems(): void {\n // No-op for RefNode\n }\n\n setFormula(): void {\n // No-op for RefNode\n }\n\n setDefaultValue(): void {\n // No-op for RefNode\n }\n\n clone(): RefNode {\n return new RefNode(this._id, this._name, this._ref, { ...this._metadata });\n }\n}\n","import { nanoid } from 'nanoid';\nimport { StringNode, type ContentMediaType } from './StringNode';\nimport { NumberNode } from './NumberNode';\nimport { BooleanNode } from './BooleanNode';\nimport { ObjectNode } from './ObjectNode';\nimport { ArrayNode } from './ArrayNode';\nimport { RefNode } from './RefNode';\nimport type { SchemaNode } from './SchemaNode';\n\nexport interface StringNodeFactoryOptions {\n foreignKey?: string;\n contentMediaType?: ContentMediaType;\n}\n\nexport interface RefNodeOptions {\n $ref: string;\n}\n\nexport class NodeFactory {\n static string(name: string, options?: StringNodeFactoryOptions): StringNode {\n const node = new StringNode(nanoid(), name);\n if (options?.foreignKey !== undefined) {\n node.setForeignKey(options.foreignKey);\n }\n if (options?.contentMediaType !== undefined) {\n node.setContentMediaType(options.contentMediaType);\n }\n return node;\n }\n\n static number(name: string): NumberNode {\n return new NumberNode(nanoid(), name);\n }\n\n static boolean(name: string): BooleanNode {\n return new BooleanNode(nanoid(), name);\n }\n\n static object(name: string, children: SchemaNode[] = []): ObjectNode {\n return new ObjectNode(nanoid(), name, children);\n }\n\n static array(name: string, items: SchemaNode): ArrayNode {\n return new ArrayNode(nanoid(), name, items);\n }\n\n static ref(name: string, options: RefNodeOptions): RefNode {\n return new RefNode(nanoid(), name, options.$ref);\n }\n}\n","import type { PathSegment } from './types';\n\nexport class PropertySegment implements PathSegment {\n constructor(private readonly name: string) {}\n\n isProperty(): boolean {\n return true;\n }\n\n isItems(): boolean {\n return false;\n }\n\n propertyName(): string {\n return this.name;\n }\n\n equals(other: PathSegment): boolean {\n return other.isProperty() && other.propertyName() === this.name;\n }\n}\n\nexport class ItemsSegment implements PathSegment {\n isProperty(): boolean {\n return false;\n }\n\n isItems(): boolean {\n return true;\n }\n\n propertyName(): string {\n throw new Error('Items segment has no property name');\n }\n\n equals(other: PathSegment): boolean {\n return other.isItems();\n }\n}\n","import type { Path, PathSegment } from './types';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nclass PathImpl implements Path {\n constructor(private readonly segs: readonly PathSegment[]) {}\n\n segments(): readonly PathSegment[] {\n return this.segs;\n }\n\n asJsonPointer(): string {\n return this.segs\n .map((seg) =>\n seg.isProperty() ? `/properties/${seg.propertyName()}` : '/items',\n )\n .join('');\n }\n\n asSimple(): string {\n const parts: string[] = [];\n\n for (const seg of this.segs) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n parts[parts.length - 1] += '[*]';\n }\n }\n\n return parts.join('.');\n }\n\n parent(): Path {\n if (this.segs.length <= 1) {\n return EMPTY_PATH;\n }\n return new PathImpl(this.segs.slice(0, -1));\n }\n\n child(name: string): Path {\n return new PathImpl([...this.segs, new PropertySegment(name)]);\n }\n\n childItems(): Path {\n return new PathImpl([...this.segs, new ItemsSegment()]);\n }\n\n equals(other: Path): boolean {\n const otherSegs = other.segments();\n if (this.segs.length !== otherSegs.length) {\n return false;\n }\n for (let i = 0; i < this.segs.length; i++) {\n const a = this.segs[i];\n const b = otherSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n isEmpty(): boolean {\n return this.segs.length === 0;\n }\n\n length(): number {\n return this.segs.length;\n }\n\n isChildOf(parent: Path): boolean {\n const parentSegs = parent.segments();\n if (this.segs.length <= parentSegs.length) {\n return false;\n }\n for (let i = 0; i < parentSegs.length; i++) {\n const a = this.segs[i];\n const b = parentSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport const EMPTY_PATH: Path = new PathImpl([]);\n\nexport function createPath(segments: readonly PathSegment[]): Path {\n return segments.length === 0 ? EMPTY_PATH : new PathImpl(segments);\n}\n","import type { Path, PathSegment } from './types';\nimport { createPath } from './Path';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nexport function jsonPointerToSegments(pointer: string): PathSegment[] {\n if (pointer === '' || pointer === '/') {\n return [];\n }\n\n const parts = pointer.split('/').filter(Boolean);\n const segments: PathSegment[] = [];\n\n let i = 0;\n while (i < parts.length) {\n const part = parts[i];\n if (part === 'properties') {\n if (i + 1 < parts.length) {\n const name = parts[i + 1];\n if (name !== undefined) {\n segments.push(new PropertySegment(name));\n }\n i += 2;\n } else {\n i += 1;\n }\n } else if (part === 'items') {\n segments.push(new ItemsSegment());\n i += 1;\n } else {\n throw new Error(`Invalid path segment: ${part} in path ${pointer}`);\n }\n }\n\n return segments;\n}\n\nexport function jsonPointerToPath(pointer: string): Path {\n return createPath(jsonPointerToSegments(pointer));\n}\n\nexport function jsonPointerToSimplePath(pointer: string): string {\n return jsonPointerToPath(pointer).asSimple();\n}\n","export interface FormulaDependency {\n targetNodeId(): string;\n}\n\nexport class ResolvedDependency implements FormulaDependency {\n constructor(private readonly nodeId: string) {\n if (!nodeId) {\n throw new Error('FormulaDependency requires targetNodeId');\n }\n }\n\n targetNodeId(): string {\n return this.nodeId;\n }\n}\n","export class FormulaError extends Error {\n constructor(\n message: string,\n private readonly nodeId: string,\n private readonly details?: string,\n ) {\n super(message);\n this.name = 'FormulaError';\n }\n\n formulaNodeId(): string {\n return this.nodeId;\n }\n\n errorDetails(): string | undefined {\n return this.details;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nconst ARRAY_NOTATION_REGEX = /^([^[]+)\\[(?:\\d+|\\*)?\\]$/;\n\nexport class RelativePath {\n constructor(\n private readonly basePath: Path,\n private readonly relativePath: string,\n ) {}\n\n resolve(): Path | null {\n let ast: ASTNode;\n try {\n const parseResult = parseFormula(this.relativePath);\n ast = parseResult.ast;\n } catch {\n return null;\n }\n\n return this.astToPath(ast, this.basePath);\n }\n\n private astToPath(ast: ASTNode, base: Path): Path | null {\n switch (ast.type) {\n case 'Identifier':\n return base.child(ast.name);\n\n case 'MemberExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.child(ast.property);\n }\n\n case 'IndexExpression':\n case 'WildcardExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.childItems();\n }\n\n case 'RelativePath':\n return this.resolveRelativePathString(base, ast.path);\n\n case 'RootPath':\n return this.resolveRootPath(ast.path);\n\n default:\n return null;\n }\n }\n\n private resolveRelativePathString(base: Path, path: string): Path | null {\n const parts = path.split('/');\n let result = base;\n\n for (const part of parts) {\n if (part === '..') {\n if (result.isEmpty()) {\n return null;\n }\n result = result.parent();\n } else if (part === '.') {\n continue;\n } else if (part) {\n result = result.child(part);\n }\n }\n\n return result;\n }\n\n private resolveRootPath(rootPath: string): Path | null {\n const path = rootPath.startsWith('/') ? rootPath.slice(1) : rootPath;\n if (!path) {\n return EMPTY_PATH;\n }\n\n try {\n return this.parseFormulaPath(path);\n } catch {\n return null;\n }\n }\n\n private parseFormulaPath(formulaPath: string): Path {\n const parts = formulaPath.split('.');\n let result: Path = EMPTY_PATH;\n\n for (const part of parts) {\n if (!part) {\n throw new Error(`Invalid path: empty segment`);\n }\n\n const match = ARRAY_NOTATION_REGEX.exec(part);\n if (match?.[1]) {\n result = result.child(match[1]).childItems();\n } else {\n result = result.child(part);\n }\n }\n\n return result;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { FormulaDependency } from '../core/FormulaDependency';\nimport { ResolvedDependency } from '../core/FormulaDependency';\nimport { FormulaError } from '../core/FormulaError';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport type { Path } from '../../path';\nimport { RelativePath } from './RelativePath';\n\nexport class ParsedFormula implements Formula {\n private readonly astNode: ASTNode;\n private readonly deps: readonly FormulaDependency[];\n private readonly astPathToNodeId: ReadonlyMap<string, string>;\n\n constructor(tree: NodeTree, formulaNodeId: string, expression: string) {\n const parseResult = parseFormula(expression);\n this.astNode = parseResult.ast;\n\n const formulaPath = tree.pathOf(formulaNodeId);\n if (formulaPath.isEmpty() && tree.root().id() !== formulaNodeId) {\n throw new FormulaError('Formula node not found in tree', formulaNodeId);\n }\n\n const deps: FormulaDependency[] = [];\n const astPathToNodeId = new Map<string, string>();\n\n for (const depPath of parseResult.dependencies) {\n const targetNodeId = this.resolveDependencyPath(\n tree,\n formulaPath,\n depPath,\n );\n if (!targetNodeId) {\n throw new FormulaError(\n `Cannot resolve formula dependency: ${depPath}`,\n formulaNodeId,\n 'Path not found in schema',\n );\n }\n if (targetNodeId === formulaNodeId) {\n throw new FormulaError(\n 'Formula cannot reference itself',\n formulaNodeId,\n 'Self-reference detected',\n );\n }\n deps.push(new ResolvedDependency(targetNodeId));\n astPathToNodeId.set(depPath, targetNodeId);\n }\n\n this.deps = deps;\n this.astPathToNodeId = astPathToNodeId;\n }\n\n version(): number {\n return 1;\n }\n\n ast(): ASTNode {\n return this.astNode;\n }\n\n dependencies(): readonly FormulaDependency[] {\n return this.deps;\n }\n\n getNodeIdForAstPath(astPath: string): string | null {\n return this.astPathToNodeId.get(astPath) ?? null;\n }\n\n astPaths(): readonly string[] {\n return Array.from(this.astPathToNodeId.keys());\n }\n\n private resolveDependencyPath(\n tree: NodeTree,\n formulaPath: Path,\n depPath: string,\n ): string | null {\n const basePath = this.getFormulaBasePath(formulaPath);\n const relativePath = new RelativePath(basePath, depPath);\n const targetPath = relativePath.resolve();\n\n if (!targetPath) {\n return null;\n }\n\n const targetNode = tree.nodeAt(targetPath);\n if (targetNode.isNull()) {\n return null;\n }\n\n return targetNode.id();\n }\n\n private getFormulaBasePath(formulaPath: Path): Path {\n let basePath = formulaPath;\n\n while (!basePath.isEmpty()) {\n const segs = basePath.segments();\n const lastSeg = segs[segs.length - 1];\n basePath = basePath.parent();\n if (!lastSeg?.isItems()) {\n break;\n }\n }\n\n return basePath;\n }\n}\n","import type { Path, PathSegment } from '../../path';\n\nexport class RelativePathBuilder {\n public buildWithArrayNotation(fromPath: Path, toPath: Path): string {\n const fromSegments = fromPath.parent().segments();\n const toSegments = toPath.segments();\n\n const commonLength = this.findCommonPrefixLength(fromSegments, toSegments);\n const upCount = fromSegments.length - commonLength;\n\n const parts = this.buildPartsWithArrayNotation(\n upCount,\n toSegments,\n commonLength,\n );\n\n return this.formatPartsWithArrayNotation(parts, toSegments);\n }\n\n private findCommonPrefixLength(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n ): number {\n const minLen = Math.min(fromSegments.length, toSegments.length);\n let commonPrefixLen = 0;\n\n for (let i = 0; i < minLen; i++) {\n const fromSeg = fromSegments[i];\n const toSeg = toSegments[i];\n\n if (!fromSeg || !toSeg) {\n break;\n }\n\n if (fromSeg.isItems() && toSeg.isItems()) {\n commonPrefixLen++;\n } else if (\n fromSeg.isProperty() &&\n toSeg.isProperty() &&\n fromSeg.propertyName() === toSeg.propertyName()\n ) {\n commonPrefixLen++;\n } else {\n break;\n }\n }\n\n return commonPrefixLen;\n }\n\n private buildPartsWithArrayNotation(\n upCount: number,\n toSegments: readonly PathSegment[],\n startIndex: number,\n ): string[] {\n const parts: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n parts.push('..');\n }\n\n for (let i = startIndex; i < toSegments.length; i++) {\n const seg = toSegments[i];\n if (seg) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n const lastPart = parts.at(-1);\n if (lastPart && lastPart !== '..') {\n parts[parts.length - 1] = lastPart + '[*]';\n }\n }\n }\n }\n\n return parts;\n }\n\n private formatPartsWithArrayNotation(\n parts: string[],\n toSegments: readonly PathSegment[],\n ): string {\n if (parts.length === 0) {\n const lastSeg = toSegments.at(-1);\n if (lastSeg?.isProperty()) {\n return lastSeg.propertyName();\n }\n return '';\n }\n\n if (parts[0] === '..') {\n return parts.join('/');\n }\n\n return parts.join('.');\n }\n}\n","import { serializeAst, replaceDependencies } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaError } from '../core/FormulaError';\nimport type { XFormula } from '../../schema/JsonSchema';\nimport { RelativePathBuilder } from './RelativePathBuilder';\n\nexport class FormulaSerializer {\n private readonly relativePathBuilder = new RelativePathBuilder();\n\n constructor(\n private readonly tree: NodeTree,\n private readonly formulaNodeId: string,\n private readonly formula: Formula,\n ) {}\n\n static toXFormula(\n tree: NodeTree,\n formulaNodeId: string,\n formula: Formula,\n ): XFormula {\n const serializer = new FormulaSerializer(tree, formulaNodeId, formula);\n return {\n version: 1,\n expression: serializer.serialize(),\n };\n }\n\n serialize(): string {\n const replacements = this.buildPathReplacements();\n const updatedAst = replaceDependencies(this.formula.ast(), replacements);\n return serializeAst(updatedAst);\n }\n\n private buildPathReplacements(): Record<string, string> {\n const replacements: Record<string, string> = {};\n const formulaPath = this.tree.pathOf(this.formulaNodeId);\n\n for (const astPath of this.formula.astPaths()) {\n const nodeId = this.formula.getNodeIdForAstPath(astPath);\n if (!nodeId) {\n continue;\n }\n\n const targetNode = this.tree.nodeById(nodeId);\n if (targetNode.isNull()) {\n throw new FormulaError(\n `Cannot serialize formula: target node not found`,\n this.formulaNodeId,\n `Target nodeId: ${nodeId}`,\n );\n }\n\n const targetPath = this.tree.pathOf(nodeId);\n const newPath = this.relativePathBuilder.buildWithArrayNotation(\n formulaPath,\n targetPath,\n );\n\n if (this.needsReplacement(astPath, newPath)) {\n replacements[astPath] = newPath;\n }\n }\n\n return replacements;\n }\n\n private needsReplacement(astPath: string, newPath: string): boolean {\n if (astPath === newPath) {\n return false;\n }\n\n const normalizedAstPath = this.normalizeArrayNotation(astPath);\n const normalizedNewPath = this.normalizeArrayNotation(newPath);\n\n return normalizedAstPath !== normalizedNewPath;\n }\n\n private normalizeArrayNotation(path: string): string {\n return path.replaceAll(/\\[\\d+\\]/g, '[*]');\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { Formula } from '../core/Formula';\n\nexport interface FormulaDependent {\n formulaNodeId: string;\n fieldName: string;\n expression: string;\n}\n\nexport class FormulaDependencyIndex {\n private readonly dependentsMap = observable.map<string, Set<string>>();\n private readonly formulasByNodeId = observable.map<string, Formula>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n registerFormula(formulaNodeId: string, formula: Formula): void {\n this.unregisterFormula(formulaNodeId);\n\n this.formulasByNodeId.set(formulaNodeId, formula);\n\n for (const dep of formula.dependencies()) {\n const targetId = dep.targetNodeId();\n let dependents = this.dependentsMap.get(targetId);\n if (!dependents) {\n dependents = observable.set<string>();\n this.dependentsMap.set(targetId, dependents);\n }\n dependents.add(formulaNodeId);\n }\n }\n\n unregisterFormula(formulaNodeId: string): void {\n this.formulasByNodeId.delete(formulaNodeId);\n\n for (const [targetId, dependents] of this.dependentsMap) {\n dependents.delete(formulaNodeId);\n if (dependents.size === 0) {\n this.dependentsMap.delete(targetId);\n }\n }\n }\n\n getDependents(nodeId: string): readonly string[] {\n const dependents = this.dependentsMap.get(nodeId);\n return dependents ? Array.from(dependents) : [];\n }\n\n getFormula(nodeId: string): Formula | null {\n return this.formulasByNodeId.get(nodeId) ?? null;\n }\n\n clear(): void {\n this.dependentsMap.clear();\n this.formulasByNodeId.clear();\n }\n\n forEachFormula(callback: (nodeId: string, formula: Formula) => void): void {\n for (const [nodeId, formula] of this.formulasByNodeId) {\n callback(nodeId, formula);\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path } from '../path';\nimport { EMPTY_PATH } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeNodeIndex {\n private readonly nodeIndex = new Map<string, SchemaNode>();\n private readonly pathIndex = new Map<string, Path>();\n\n public rebuild(rootNode: SchemaNode): void {\n this.nodeIndex.clear();\n this.pathIndex.clear();\n this.collectNodes(rootNode, EMPTY_PATH);\n }\n\n public getNode(id: string): SchemaNode {\n return this.nodeIndex.get(id) ?? NULL_NODE;\n }\n\n public getPath(id: string): Path {\n return this.pathIndex.get(id) ?? EMPTY_PATH;\n }\n\n public countNodes(): number {\n return this.nodeIndex.size;\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.keys();\n }\n\n private collectNodes(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIndex.set(node.id(), node);\n this.pathIndex.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodes(child, path.child(child.name()));\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodes(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeMutator {\n public setNodeAt(\n rootNode: SchemaNode,\n path: Path,\n newNode: SchemaNode,\n ): void {\n if (path.isEmpty()) {\n throw new Error('Cannot replace root node');\n }\n this.updateNodeAt(rootNode, path.segments(), 0, newNode);\n }\n\n public removeNodeAt(rootNode: SchemaNode, path: Path): void {\n if (path.isEmpty()) {\n throw new Error('Cannot remove root node');\n }\n this.removeNodeAtInternal(rootNode, path.segments(), 0);\n }\n\n public removeNodeAtInternal(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n ): void {\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.removePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.removeItemsSegment(current, segments, index, isLastSegment);\n }\n }\n\n private removePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.removeProperty(childName);\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.removeNodeAtInternal(existingChild, segments, index + 1);\n }\n }\n\n private removeItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(NULL_NODE);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.removeNodeAtInternal(existingItems, segments, index + 1);\n }\n }\n\n private updateNodeAt(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n ): void {\n if (index >= segments.length) {\n return;\n }\n\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.updatePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n newNode,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.updateItemsSegment(current, segments, index, newNode, isLastSegment);\n }\n }\n\n private updatePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n newNode.setName(childName);\n const existingChild = current.property(childName);\n if (existingChild.isNull()) {\n current.addProperty(newNode);\n } else {\n current.replaceProperty(childName, newNode);\n }\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.updateNodeAt(existingChild, segments, index + 1, newNode);\n }\n }\n\n private updateItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(newNode);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.updateNodeAt(existingItems, segments, index + 1, newNode);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { NodeTree } from './NodeTree';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\nimport {\n FormulaDependencyIndex,\n FormulaSerializer,\n type FormulaDependent,\n type Formula,\n} from '../formula';\nimport { TreeNodeIndex } from './TreeNodeIndex';\nimport { TreeMutator } from './TreeMutator';\n\nexport class SchemaTree implements NodeTree {\n private readonly nodeIndex: TreeNodeIndex;\n private readonly mutator: TreeMutator;\n private readonly formulaIndex: FormulaDependencyIndex;\n private _rootNode: SchemaNode;\n\n constructor(rootNode: SchemaNode) {\n this._rootNode = rootNode;\n this.nodeIndex = new TreeNodeIndex();\n this.mutator = new TreeMutator();\n this.formulaIndex = new FormulaDependencyIndex();\n this.rebuildIndex();\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public root(): SchemaNode {\n return this._rootNode;\n }\n\n public countNodes(): number {\n return this.nodeIndex.countNodes();\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.nodeIds();\n }\n\n public nodeById(id: string): SchemaNode {\n return this.nodeIndex.getNode(id);\n }\n\n public pathOf(id: string): Path {\n return this.nodeIndex.getPath(id);\n }\n\n public nodeAt(path: Path): SchemaNode {\n if (path.isEmpty()) {\n return this._rootNode;\n }\n\n let current: SchemaNode = this._rootNode;\n for (const segment of path.segments()) {\n if (segment.isProperty()) {\n current = current.property(segment.propertyName());\n } else {\n current = current.items();\n }\n if (current.isNull()) {\n return NULL_NODE;\n }\n }\n return current;\n }\n\n public replaceRoot(newRoot: SchemaNode): void {\n this._rootNode = newRoot;\n this.rebuildIndex();\n }\n\n public setNodeAt(path: Path, node: SchemaNode): void {\n this.mutator.setNodeAt(this._rootNode, path, node);\n this.rebuildIndex();\n }\n\n public removeNodeAt(path: Path): void {\n this.mutator.removeNodeAt(this._rootNode, path);\n this.rebuildIndex();\n }\n\n public renameNode(id: string, newName: string): void {\n const node = this.nodeById(id);\n if (node.isNull()) {\n return;\n }\n\n node.setName(newName);\n this.rebuildIndex();\n }\n\n public addChildTo(parentId: string, node: SchemaNode): void {\n const parent = this.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return;\n }\n parent.addProperty(node);\n this.rebuildIndex();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n if (fromNodeId === toNodeId) {\n return false;\n }\n const fromNode = this.nodeById(fromNodeId);\n const toNode = this.nodeById(toNodeId);\n if (fromNode.isNull() || toNode.isNull()) {\n return false;\n }\n if (!toNode.isObject()) {\n return false;\n }\n const toPath = this.pathOf(toNodeId);\n const fromPath = this.pathOf(fromNodeId);\n if (toPath.equals(fromPath) || toPath.isChildOf(fromPath)) {\n return false;\n }\n if (fromPath.parent().equals(toPath)) {\n return false;\n }\n if (this.isMovingOutOfArray(fromPath, toPath)) {\n return false;\n }\n return true;\n }\n\n private isMovingOutOfArray(fromPath: Path, toPath: Path): boolean {\n const fromSegments = fromPath.segments();\n const toSegments = toPath.segments();\n\n for (let i = 0; i < fromSegments.length; i++) {\n const fromSeg = fromSegments[i];\n if (fromSeg?.isItems()) {\n if (!toSegments[i]?.isItems()) {\n return true;\n }\n if (this.hasPathPrefixMismatch(fromSegments, toSegments, i)) {\n return true;\n }\n }\n }\n return false;\n }\n\n private hasPathPrefixMismatch(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n endIndex: number,\n ): boolean {\n for (let j = 0; j < endIndex; j++) {\n const fromSeg = fromSegments[j];\n const toSeg = toSegments[j];\n if (!fromSeg || !toSeg || !fromSeg.equals(toSeg)) {\n return true;\n }\n }\n return false;\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this.findValidDropTarget(this._rootNode, nodeId);\n }\n\n private findValidDropTarget(current: SchemaNode, nodeId: string): boolean {\n if (current.isObject() && this.canMoveNode(nodeId, current.id())) {\n return true;\n }\n\n if (current.isObject()) {\n for (const child of current.properties()) {\n if (this.findValidDropTarget(child, nodeId)) {\n return true;\n }\n }\n }\n\n if (current.isArray()) {\n const items = current.items();\n if (!items.isNull() && this.findValidDropTarget(items, nodeId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public moveNode(nodeId: string, targetParentId: string): void {\n const node = this.nodeById(nodeId);\n const targetParent = this.nodeById(targetParentId);\n if (node.isNull() || targetParent.isNull() || !targetParent.isObject()) {\n return;\n }\n\n const sourcePath = this.pathOf(nodeId);\n if (sourcePath.isEmpty()) {\n return;\n }\n\n this.mutator.removeNodeAtInternal(this._rootNode, sourcePath.segments(), 0);\n targetParent.addProperty(node);\n this.rebuildIndex();\n }\n\n public registerFormula(formulaNodeId: string, formula: Formula): void {\n const node = this.nodeById(formulaNodeId);\n if (node.isNull()) {\n return;\n }\n this.formulaIndex.registerFormula(formulaNodeId, formula);\n }\n\n public unregisterFormula(formulaNodeId: string): void {\n this.formulaIndex.unregisterFormula(formulaNodeId);\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectFormulaDependents(nodeId, result, new Set());\n return result;\n }\n\n public getDirectFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectDirectDependents(nodeId, result, new Set());\n return result;\n }\n\n public hasFormulaDependents(nodeId: string): boolean {\n return this.getFormulaDependents(nodeId).length > 0;\n }\n\n public getFormulaByNodeId(nodeId: string): Formula | null {\n return this.formulaIndex.getFormula(nodeId);\n }\n\n public clearFormulaIndex(): void {\n this.formulaIndex.clear();\n }\n\n public forEachFormula(callback: (nodeId: string) => void): void {\n this.formulaIndex.forEachFormula(callback);\n }\n\n private rebuildIndex(): void {\n this.nodeIndex.rebuild(this._rootNode);\n }\n\n public clone(): SchemaTree {\n const clonedRoot = this._rootNode.clone();\n const clonedTree = new SchemaTree(clonedRoot);\n this.cloneFormulas(clonedTree);\n return clonedTree;\n }\n\n private cloneFormulas(targetTree: SchemaTree): void {\n this.formulaIndex.forEachFormula((nodeId) => {\n const targetNode = targetTree.nodeById(nodeId);\n const formula = targetNode.formula();\n if (!targetNode.isNull() && formula) {\n targetTree.registerFormula(nodeId, formula);\n }\n });\n }\n\n private collectFormulaDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n this.collectDirectDependents(nodeId, result, seen);\n this.collectChildDependents(nodeId, result, seen);\n }\n\n private collectDirectDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const directDependentIds = this.formulaIndex.getDependents(nodeId);\n\n for (const formulaNodeId of directDependentIds) {\n if (seen.has(formulaNodeId)) {\n continue;\n }\n seen.add(formulaNodeId);\n\n const dependent = this.createFormulaDependent(formulaNodeId);\n if (dependent) {\n result.push(dependent);\n }\n }\n }\n\n private createFormulaDependent(\n formulaNodeId: string,\n ): FormulaDependent | null {\n const formulaNode = this.nodeById(formulaNodeId);\n const formula = this.formulaIndex.getFormula(formulaNodeId);\n\n if (formulaNode.isNull() || !formula) {\n return null;\n }\n\n const expression = new FormulaSerializer(\n this,\n formulaNodeId,\n formula,\n ).serialize();\n\n return {\n formulaNodeId,\n fieldName: formulaNode.name(),\n expression,\n };\n }\n\n private collectChildDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const node = this.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectFormulaDependents(child.id(), result, seen);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectFormulaDependents(items.id(), result, seen);\n }\n }\n }\n}\n","import type { JsonSchemaType } from '../../schema/JsonSchema';\nimport type { TypeDescriptor } from './TypeDescriptor';\n\nexport class TypeRegistry {\n private readonly descriptors: Map<string, TypeDescriptor> = new Map();\n private readonly parseOrder: TypeDescriptor[] = [];\n\n register(descriptor: TypeDescriptor): void {\n if (this.descriptors.has(descriptor.type)) {\n throw new Error(`Type \"${descriptor.type}\" is already registered`);\n }\n this.descriptors.set(descriptor.type, descriptor);\n this.parseOrder.push(descriptor);\n }\n\n getDescriptor(type: string): TypeDescriptor | undefined {\n return this.descriptors.get(type);\n }\n\n findDescriptorForSchema(schema: JsonSchemaType): TypeDescriptor | undefined {\n for (const descriptor of this.parseOrder) {\n if (descriptor.canParse(schema)) {\n return descriptor;\n }\n }\n return undefined;\n }\n\n getAllDescriptors(): readonly TypeDescriptor[] {\n return this.parseOrder;\n }\n\n getTypes(): readonly string[] {\n return Array.from(this.descriptors.keys());\n }\n}\n","export interface TypeCapabilities {\n readonly hasChildren: boolean;\n readonly hasItems: boolean;\n readonly hasFormula: boolean;\n readonly isPrimitive: boolean;\n readonly isContainer: boolean;\n}\n\nexport const PRIMITIVE_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: true,\n isPrimitive: true,\n isContainer: false,\n};\n\nexport const OBJECT_CAPABILITIES: TypeCapabilities = {\n hasChildren: true,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const ARRAY_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: true,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const REF_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: false,\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonStringSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport {\n StringNode,\n type StringNodeOptions,\n type StringFormat,\n type ContentMediaType,\n} from '../../node/StringNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isStringSchema(schema: JsonSchemaType): schema is JsonStringSchema {\n return 'type' in schema && schema.type === 'string';\n}\n\nexport const stringDescriptor: TypeDescriptor<JsonStringSchema, StringNode> = {\n type: 'string',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isStringSchema,\n\n parse(\n schema: JsonStringSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): StringNode {\n const options: StringNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n if (schema.foreignKey) {\n options.foreignKey = schema.foreignKey;\n }\n if (schema.format) {\n options.format = schema.format as StringFormat;\n }\n if (schema.contentMediaType) {\n options.contentMediaType = schema.contentMediaType as ContentMediaType;\n }\n if (schema.enum && schema.enum.length > 0) {\n options.enumValues = schema.enum;\n }\n\n const node = new StringNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: StringNode, context: SerializeContext): JsonStringSchema {\n const result: JsonStringSchema = {\n type: 'string',\n default: node.defaultValue() ?? '',\n };\n\n if (node.foreignKey()) {\n result.foreignKey = node.foreignKey();\n }\n if (node.format()) {\n result.format = node.format();\n }\n if (node.contentMediaType()) {\n result.contentMediaType = node.contentMediaType();\n }\n const enumValues = node.enumValues();\n if (enumValues && enumValues.length > 0) {\n result.enum = [...enumValues];\n }\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonStringSchema): string {\n return 'default' in schema ? schema.default : '';\n },\n\n parseDefaultValueString(valueStr: string): string {\n return valueStr;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonNumberSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { NumberNode, type NumberNodeOptions } from '../../node/NumberNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isNumberSchema(schema: JsonSchemaType): schema is JsonNumberSchema {\n return 'type' in schema && schema.type === 'number';\n}\n\nexport const numberDescriptor: TypeDescriptor<JsonNumberSchema, NumberNode> = {\n type: 'number',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isNumberSchema,\n\n parse(\n schema: JsonNumberSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): NumberNode {\n const options: NumberNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new NumberNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: NumberNode, context: SerializeContext): JsonNumberSchema {\n const result: JsonNumberSchema = {\n type: 'number',\n default: node.defaultValue() ?? 0,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonNumberSchema): number {\n return 'default' in schema ? schema.default : 0;\n },\n\n parseDefaultValueString(valueStr: string): number | undefined {\n if (!valueStr) {\n return undefined;\n }\n const num = Number(valueStr);\n if (!Number.isNaN(num)) {\n return num;\n }\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type {\n JsonBooleanSchema,\n JsonSchemaType,\n} from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { BooleanNode, type BooleanNodeOptions } from '../../node/BooleanNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isBooleanSchema(schema: JsonSchemaType): schema is JsonBooleanSchema {\n return 'type' in schema && schema.type === 'boolean';\n}\n\nexport const booleanDescriptor: TypeDescriptor<JsonBooleanSchema, BooleanNode> =\n {\n type: 'boolean',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isBooleanSchema,\n\n parse(\n schema: JsonBooleanSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): BooleanNode {\n const options: BooleanNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new BooleanNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: BooleanNode, context: SerializeContext): JsonBooleanSchema {\n const result: JsonBooleanSchema = {\n type: 'boolean',\n default: node.defaultValue() ?? false,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonBooleanSchema): boolean {\n return 'default' in schema ? schema.default : false;\n },\n\n parseDefaultValueString(valueStr: string): boolean | undefined {\n if (!valueStr) {\n return undefined;\n }\n const lower = valueStr.toLowerCase();\n if (lower === 'true') {\n return true;\n }\n if (lower === 'false') {\n return false;\n }\n return undefined;\n },\n };\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonObjectSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport type { SchemaNode } from '../../node/SchemaNode';\nimport { ObjectNode } from '../../node/ObjectNode';\nimport { OBJECT_CAPABILITIES } from './TypeCapabilities';\n\nfunction isObjectSchema(schema: JsonSchemaType): schema is JsonObjectSchema {\n return 'type' in schema && schema.type === 'object';\n}\n\nexport const objectDescriptor: TypeDescriptor<JsonObjectSchema, ObjectNode> = {\n type: 'object',\n\n capabilities: OBJECT_CAPABILITIES,\n\n canParse: isObjectSchema,\n\n parse(\n schema: JsonObjectSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ObjectNode {\n const children: SchemaNode[] = [];\n\n const orderedKeys = schema.required ?? Object.keys(schema.properties);\n\n for (const propName of orderedKeys) {\n const propSchema = schema.properties[propName];\n if (propSchema) {\n children.push(context.parseNode(propSchema, propName));\n }\n }\n\n const node = new ObjectNode(context.generateId(), name, children);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ObjectNode, context: SerializeContext): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n const childName = child.name();\n properties[childName] = context.serialize(child);\n required.push(childName);\n }\n\n return {\n type: 'object',\n required,\n properties,\n additionalProperties: false,\n };\n },\n\n getDefaultValue(_schema: JsonObjectSchema): Record<string, unknown> {\n return {};\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonArraySchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { ArrayNode } from '../../node/ArrayNode';\nimport { ARRAY_CAPABILITIES } from './TypeCapabilities';\n\nfunction isArraySchema(schema: JsonSchemaType): schema is JsonArraySchema {\n return 'type' in schema && schema.type === 'array';\n}\n\nexport const arrayDescriptor: TypeDescriptor<JsonArraySchema, ArrayNode> = {\n type: 'array',\n\n capabilities: ARRAY_CAPABILITIES,\n\n canParse: isArraySchema,\n\n parse(\n schema: JsonArraySchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ArrayNode {\n const items = context.parseNode(schema.items, '');\n const node = new ArrayNode(context.generateId(), name, items);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ArrayNode, context: SerializeContext): JsonArraySchema {\n const items = node.items();\n\n return {\n type: 'array',\n items: items.isNull()\n ? { type: 'string', default: '' }\n : context.serialize(items),\n };\n },\n\n getDefaultValue(_schema: JsonArraySchema): unknown[] {\n return [];\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonRefSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { RefNode } from '../../node/RefNode';\nimport { REF_CAPABILITIES } from './TypeCapabilities';\n\nfunction isRefSchema(schema: JsonSchemaType): schema is JsonRefSchema {\n return '$ref' in schema;\n}\n\nexport const refDescriptor: TypeDescriptor<JsonRefSchema, RefNode> = {\n type: 'ref',\n\n capabilities: REF_CAPABILITIES,\n\n canParse: isRefSchema,\n\n parse(\n schema: JsonRefSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): RefNode {\n const node = new RefNode(context.generateId(), name, schema.$ref);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: RefNode, _context: SerializeContext): JsonRefSchema {\n const result: JsonRefSchema = {\n $ref: node.ref(),\n };\n\n const meta = node.metadata();\n if (meta.title) {\n result.title = meta.title;\n }\n if (meta.description) {\n result.description = meta.description;\n }\n if (meta.deprecated) {\n result.deprecated = meta.deprecated;\n }\n\n return result;\n },\n\n getDefaultValue(_schema: JsonRefSchema): null {\n return null;\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","export { TypeRegistry } from './TypeRegistry';\nexport type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nexport type { TypeCapabilities } from './TypeCapabilities';\nexport {\n PRIMITIVE_CAPABILITIES,\n OBJECT_CAPABILITIES,\n ARRAY_CAPABILITIES,\n REF_CAPABILITIES,\n} from './TypeCapabilities';\n\nexport { stringDescriptor } from './StringDescriptor';\nexport { numberDescriptor } from './NumberDescriptor';\nexport { booleanDescriptor } from './BooleanDescriptor';\nexport { objectDescriptor } from './ObjectDescriptor';\nexport { arrayDescriptor } from './ArrayDescriptor';\nexport { refDescriptor } from './RefDescriptor';\n\nimport { TypeRegistry } from './TypeRegistry';\nimport { refDescriptor } from './RefDescriptor';\nimport { objectDescriptor } from './ObjectDescriptor';\nimport { arrayDescriptor } from './ArrayDescriptor';\nimport { stringDescriptor } from './StringDescriptor';\nimport { numberDescriptor } from './NumberDescriptor';\nimport { booleanDescriptor } from './BooleanDescriptor';\n\nexport function createDefaultRegistry(): TypeRegistry {\n const registry = new TypeRegistry();\n\n registry.register(refDescriptor);\n registry.register(objectDescriptor);\n registry.register(arrayDescriptor);\n registry.register(stringDescriptor);\n registry.register(numberDescriptor);\n registry.register(booleanDescriptor);\n\n return registry;\n}\n\nexport const defaultRegistry = createDefaultRegistry();\n","import type { JsonSchemaType } from './JsonSchema';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeMetadata } from '../node/NodeMetadata';\nimport {\n type TypeRegistry,\n type ParseContext,\n defaultRegistry,\n} from '../parsing/index';\n\nlet idCounter = 0;\n\nfunction generateId(): string {\n idCounter++;\n return `node-${idCounter}`;\n}\n\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\ninterface PendingFormula {\n nodeId: string;\n expression: string;\n}\n\nexport class SchemaParser {\n private pendingFormulas: PendingFormula[] = [];\n private readonly registry: TypeRegistry;\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n parse(schema: JsonSchemaType): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, '');\n }\n\n parseWithRootName(schema: JsonSchemaType, name: string): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, name);\n }\n\n getPendingFormulas(): PendingFormula[] {\n return this.pendingFormulas;\n }\n\n private parseNode(schema: JsonSchemaType, name: string): SchemaNode {\n const metadata = this.extractMetadata(schema);\n const descriptor = this.registry.findDescriptorForSchema(schema);\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for schema: ${JSON.stringify(schema)}`,\n );\n }\n\n const context: ParseContext = {\n generateId,\n parseNode: (s, n) => this.parseNode(s, n),\n addPendingFormula: (nodeId, expression) => {\n this.pendingFormulas.push({ nodeId, expression });\n },\n };\n\n return descriptor.parse(schema, name, metadata, context);\n }\n\n private extractMetadata(schema: JsonSchemaType): NodeMetadata {\n return {\n title: 'title' in schema ? schema.title : undefined,\n description: 'description' in schema ? schema.description : undefined,\n deprecated: 'deprecated' in schema ? schema.deprecated : undefined,\n };\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeTree } from '../tree/NodeTree';\nimport type { JsonSchemaType, JsonObjectSchema } from './JsonSchema';\nimport {\n type TypeRegistry,\n type SerializeContext,\n defaultRegistry,\n} from '../parsing/index';\nimport { FormulaSerializer } from '../formula';\n\nexport interface SerializeOptions {\n excludeNodeIds?: Set<string>;\n}\n\nexport class SchemaSerializer {\n private readonly registry: TypeRegistry;\n private tree: NodeTree | null = null;\n private excludeNodeIds: Set<string> = new Set();\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n serializeWithTree(\n node: SchemaNode,\n tree: NodeTree,\n options?: SerializeOptions,\n ): JsonSchemaType {\n this.tree = tree;\n this.excludeNodeIds = options?.excludeNodeIds ?? new Set();\n try {\n return this.serialize(node);\n } finally {\n this.tree = null;\n this.excludeNodeIds = new Set();\n }\n }\n\n serialize(node: SchemaNode): JsonSchemaType {\n if (node.isNull()) {\n throw new Error('Cannot serialize null node');\n }\n\n if (this.excludeNodeIds.size > 0 && node.isObject()) {\n return this.serializeObjectWithExclusions(node);\n }\n\n const descriptor = this.registry.getDescriptor(node.nodeType());\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for node type: ${node.nodeType()}`,\n );\n }\n\n const context: SerializeContext = {\n serialize: (n) => this.serialize(n),\n serializeFormula: (nodeId, formula) => {\n if (!this.tree) {\n throw new Error(\n 'Cannot serialize formula without tree context. Use serializeWithTree.',\n );\n }\n return FormulaSerializer.toXFormula(this.tree, nodeId, formula);\n },\n };\n\n const result = descriptor.serialize(node, context);\n return this.addMetadata(result, node);\n }\n\n private serializeObjectWithExclusions(node: SchemaNode): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n if (this.excludeNodeIds.has(child.id())) {\n continue;\n }\n properties[child.name()] = this.serialize(child);\n required.push(child.name());\n }\n\n const result: JsonObjectSchema = {\n type: 'object',\n properties,\n additionalProperties: false,\n required,\n };\n\n return this.addMetadata(result, node);\n }\n\n private addMetadata<\n T extends { title?: string; description?: string; deprecated?: boolean },\n >(schema: T, node: SchemaNode): T {\n const meta = node.metadata();\n\n if (meta.title) {\n schema.title = meta.title;\n }\n if (meta.description) {\n schema.description = meta.description;\n }\n if (meta.deprecated) {\n schema.deprecated = meta.deprecated;\n }\n\n return schema;\n }\n}\n","export class SchemaComparator {\n public areEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (\n a === null ||\n b === null ||\n typeof a !== 'object' ||\n typeof b !== 'object'\n ) {\n return a === b;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return this.arraysEqual(a, b);\n }\n\n return this.objectsEqual(\n a as Record<string, unknown>,\n b as Record<string, unknown>,\n );\n }\n\n private arraysEqual(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, i) => this.areEqual(item, b[i]));\n }\n\n private objectsEqual(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n ): boolean {\n const aKeys = Object.keys(a).sort((x, y) => x.localeCompare(y));\n const bKeys = Object.keys(b).sort((x, y) => x.localeCompare(y));\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n if (!aKeys.every((k, i) => k === bKeys[i])) {\n return false;\n }\n\n return aKeys.every((key) => this.areEqual(a[key], b[key]));\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nexport class NodePathIndex {\n private readonly nodeIdToPath = new Map<string, Path>();\n private readonly oldToNewNodeId = new Map<string, string>();\n private readonly newToOldNodeId = new Map<string, string>();\n private readonly replacedPaths = new Set<Path>();\n private tree: SchemaTree;\n\n constructor(tree: SchemaTree) {\n this.tree = tree;\n this.rebuild();\n }\n\n public rebuild(): void {\n this.nodeIdToPath.clear();\n this.oldToNewNodeId.clear();\n this.newToOldNodeId.clear();\n this.replacedPaths.clear();\n this.collectNodePaths(this.tree.root(), EMPTY_PATH);\n }\n\n public rebuildFrom(tree: SchemaTree): void {\n this.tree = tree;\n this.rebuild();\n }\n\n public getPath(nodeId: string): Path | undefined {\n return this.nodeIdToPath.get(nodeId);\n }\n\n public hasNode(nodeId: string): boolean {\n return this.nodeIdToPath.has(nodeId);\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIdToPath.keys();\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n const basePath = this.nodeIdToPath.get(oldNodeId);\n if (basePath !== undefined) {\n this.removeChildPaths(basePath);\n this.nodeIdToPath.delete(oldNodeId);\n this.nodeIdToPath.set(newNodeId, basePath);\n this.replacedPaths.add(basePath);\n }\n this.oldToNewNodeId.set(oldNodeId, newNodeId);\n this.newToOldNodeId.set(newNodeId, oldNodeId);\n }\n\n public getOriginalNodeId(newNodeId: string): string | undefined {\n return this.newToOldNodeId.get(newNodeId);\n }\n\n public isChildOfReplacedPath(path: Path): boolean {\n for (const replacedPath of this.replacedPaths) {\n if (path.isChildOf(replacedPath)) {\n return true;\n }\n }\n return false;\n }\n\n private removeChildPaths(parentPath: Path): void {\n for (const [nodeId, path] of this.nodeIdToPath) {\n if (path.isChildOf(parentPath)) {\n this.nodeIdToPath.delete(nodeId);\n }\n }\n }\n\n private collectNodePaths(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIdToPath.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodePaths(child, path.child(child.name()));\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodePaths(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport class ChangeCollector {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public collect(): RawChange[] {\n const changes: RawChange[] = [];\n const processedBaseNodeIds = new Set<string>();\n\n this.collectCurrentTreeChanges(changes, processedBaseNodeIds);\n this.collectRemovedNodes(changes, processedBaseNodeIds);\n\n return changes;\n }\n\n private collectCurrentTreeChanges(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.currentTree.nodeIds()) {\n const currentPath = this.currentTree.pathOf(nodeId);\n const currentNode = this.currentTree.nodeById(nodeId);\n\n if (this.baseIndex.hasNode(nodeId)) {\n this.collectExistingNodeChange(\n nodeId,\n currentNode,\n currentPath,\n changes,\n processedBaseNodeIds,\n );\n } else {\n changes.push({\n type: 'added',\n baseNode: null,\n currentNode,\n });\n }\n }\n }\n\n private collectExistingNodeChange(\n nodeId: string,\n currentNode: ReturnType<SchemaTree['nodeById']>,\n currentPath: ReturnType<SchemaTree['pathOf']>,\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n processedBaseNodeIds.add(nodeId);\n\n const originalNodeId = this.baseIndex.getOriginalNodeId(nodeId);\n const baseNodeId = originalNodeId ?? nodeId;\n const baseNode = this.baseTree.nodeById(baseNodeId);\n\n if (originalNodeId) {\n processedBaseNodeIds.add(originalNodeId);\n }\n\n const basePath = this.baseIndex.getPath(nodeId);\n const isMoved = !basePath || !currentPath.equals(basePath);\n\n changes.push({\n type: isMoved ? 'moved' : 'modified',\n baseNode,\n currentNode,\n });\n }\n\n private collectRemovedNodes(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.baseIndex.nodeIds()) {\n if (processedBaseNodeIds.has(nodeId)) {\n continue;\n }\n\n const baseNode = this.baseTree.nodeById(nodeId);\n changes.push({\n type: 'removed',\n baseNode,\n currentNode: null,\n });\n }\n }\n}\n","import { type Path, EMPTY_PATH } from '../../path';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport interface CoalescedChanges {\n moved: RawChange[];\n added: RawChange[];\n removed: RawChange[];\n modified: RawChange[];\n}\n\nexport class ChangeCoalescer {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public coalesce(changes: RawChange[]): CoalescedChanges {\n const moved = changes.filter((c) => c.type === 'moved');\n const added = changes.filter((c) => c.type === 'added');\n const removed = changes.filter((c) => c.type === 'removed');\n const modified = changes.filter((c) => c.type === 'modified');\n\n const topLevelMoves = this.filterTopLevelMoves(moved);\n const movedBaseNodes = new Set(moved.map((c) => c.baseNode));\n const moveAffectedTopLevelNodeIds =\n this.collectMoveAffectedTopLevelNodeIds(topLevelMoves);\n\n return {\n moved: topLevelMoves,\n added: this.filterTopLevelAdds(added),\n removed: this.filterTopLevelRemoves(removed, movedBaseNodes),\n modified: this.filterModified(modified, moveAffectedTopLevelNodeIds),\n };\n }\n\n private collectMoveAffectedTopLevelNodeIds(\n topLevelMoves: RawChange[],\n ): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of topLevelMoves) {\n if (change.baseNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.baseTree,\n change.baseNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n if (change.currentNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n }\n return nodeIds;\n }\n\n private getTopLevelNodeId(tree: SchemaTree, nodeId: string): string | null {\n const path = tree.pathOf(nodeId);\n const firstSeg = path.segments()[0];\n if (!firstSeg?.isProperty()) {\n return null;\n }\n const topLevelNode = tree.nodeAt(EMPTY_PATH.child(firstSeg.propertyName()));\n return topLevelNode.isNull() ? null : topLevelNode.id();\n }\n\n private filterTopLevelMoves(moved: RawChange[]): RawChange[] {\n return moved.filter((change) => !this.isChildOfMovedPath(change, moved));\n }\n\n private isChildOfMovedPath(\n change: RawChange,\n allMoved: RawChange[],\n ): boolean {\n if (!change.baseNode) {\n return false;\n }\n const changeBaseNodeId = change.baseNode.id();\n const basePath = this.baseTree.pathOf(changeBaseNodeId);\n return allMoved.some(\n (other) =>\n other.baseNode &&\n other.baseNode.id() !== changeBaseNodeId &&\n basePath.isChildOf(this.baseTree.pathOf(other.baseNode.id())),\n );\n }\n\n private filterTopLevelAdds(added: RawChange[]): RawChange[] {\n const changesWithPaths = added\n .flatMap((change) => {\n if (!change.currentNode) {\n return [];\n }\n return [\n {\n change,\n path: this.currentTree.pathOf(change.currentNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const addedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.baseIndex.isChildOfReplacedPath(path)) {\n continue;\n }\n\n if (this.isChildOfAnyPath(path, addedPaths)) {\n continue;\n }\n\n result.push(change);\n addedPaths.push(path);\n }\n\n return result;\n }\n\n private filterTopLevelRemoves(\n removed: RawChange[],\n movedBaseNodes: Set<RawChange['baseNode']>,\n ): RawChange[] {\n const changesWithPaths = removed\n .flatMap((change) => {\n if (!change.baseNode || movedBaseNodes.has(change.baseNode)) {\n return [];\n }\n return [\n {\n change,\n path: this.baseTree.pathOf(change.baseNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const removedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.isChildOfAnyPath(path, removedPaths)) {\n continue;\n }\n\n result.push(change);\n removedPaths.push(path);\n }\n\n return result;\n }\n\n private filterModified(\n modified: RawChange[],\n moveAffectedTopLevelNodeIds: Set<string>,\n ): RawChange[] {\n return modified.filter((change) => {\n if (!change.currentNode) {\n return false;\n }\n\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId && moveAffectedTopLevelNodeIds.has(topLevelNodeId)) {\n return false;\n }\n\n return true;\n });\n }\n\n private isChildOfAnyPath(path: Path, parents: Path[]): boolean {\n for (const parent of parents) {\n if (path.isChildOf(parent)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { jsonPointerToPath } from '../../path';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport { SchemaComparator } from '../SchemaComparator';\nimport type { JsonPatch } from '../SchemaPatch';\nimport type { RawChange } from './RawChange';\nimport type { CoalescedChanges } from './ChangeCoalescer';\n\nexport class PatchGenerator {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public generate(coalesced: CoalescedChanges): JsonPatch[] {\n const movedNodeIds = this.collectMovedNodeIds(coalesced.moved);\n const movePatches = this.generateMovePatches(coalesced.moved);\n const addPatches = this.generateAddPatches(coalesced.added, movedNodeIds);\n const removePatches = this.generateRemovePatches(coalesced.removed);\n\n const { prerequisiteAdds, regularAdds } = this.partitionAddPatches(\n addPatches,\n movePatches,\n );\n\n const childChangePaths = new Set([\n ...addPatches.map((p) => p.path),\n ...removePatches.map((p) => p.path),\n ...movePatches.flatMap((p) => [p.path, p.from ?? '']).filter(Boolean),\n ]);\n\n const replacePatches = this.generateReplacePatches(\n coalesced.modified,\n childChangePaths,\n );\n\n return [\n ...prerequisiteAdds,\n ...movePatches,\n ...replacePatches,\n ...regularAdds,\n ...removePatches,\n ];\n }\n\n private collectMovedNodeIds(moved: RawChange[]): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of moved) {\n if (change.currentNode) {\n nodeIds.add(change.currentNode.id());\n }\n }\n return nodeIds;\n }\n\n private partitionAddPatches(\n addPatches: JsonPatch[],\n movePatches: JsonPatch[],\n ): { prerequisiteAdds: JsonPatch[]; regularAdds: JsonPatch[] } {\n const moveDestinations = movePatches.map((p) => jsonPointerToPath(p.path));\n\n const prerequisiteAdds: JsonPatch[] = [];\n const regularAdds: JsonPatch[] = [];\n\n for (const addPatch of addPatches) {\n const addPath = jsonPointerToPath(addPatch.path);\n const isPrerequisite = moveDestinations.some((moveDest) =>\n moveDest.isChildOf(addPath),\n );\n\n if (isPrerequisite) {\n prerequisiteAdds.push(addPatch);\n } else {\n regularAdds.push(addPatch);\n }\n }\n\n return { prerequisiteAdds, regularAdds };\n }\n\n private generateMovePatches(moved: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of moved) {\n if (!change.baseNode || !change.currentNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n patches.push({\n op: 'move',\n from: basePath.asJsonPointer(),\n path: currentPath.asJsonPointer(),\n });\n\n const modifyPatch = this.generateModifyAfterMove(\n change.baseNode,\n change.currentNode,\n currentPath.asJsonPointer(),\n );\n if (modifyPatch) {\n patches.push(modifyPatch);\n }\n }\n\n return patches;\n }\n\n private generateModifyAfterMove(\n baseNode: SchemaNode,\n currentNode: SchemaNode,\n currentPath: string,\n ): JsonPatch | null {\n const currentSchema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n baseNode,\n this.baseTree,\n );\n\n if (!this.comparator.areEqual(currentSchema, baseSchema)) {\n return {\n op: 'replace',\n path: currentPath,\n value: currentSchema,\n };\n }\n\n return null;\n }\n\n private generateAddPatches(\n added: RawChange[],\n movedNodeIds: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of added) {\n if (!change.currentNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n { excludeNodeIds: movedNodeIds },\n );\n patches.push({\n op: 'add',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n }\n\n return patches;\n }\n\n private generateRemovePatches(removed: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of removed) {\n if (!change.baseNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n patches.push({\n op: 'remove',\n path: basePath.asJsonPointer(),\n });\n }\n\n return patches;\n }\n\n private generateReplacePatches(\n modified: RawChange[],\n childChangePaths: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n const replacedPaths: Path[] = [];\n const childChangePathObjects = [...childChangePaths].map(jsonPointerToPath);\n\n for (const change of modified) {\n if (!change.currentNode || !change.baseNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n if (this.isChildOfAny(currentPath, replacedPaths)) {\n continue;\n }\n\n if (this.hasChildIn(currentPath, childChangePathObjects)) {\n continue;\n }\n\n if (!this.isActuallyModified(change)) {\n continue;\n }\n\n if (change.currentNode.isArray()) {\n const arrayPatches = this.generateArrayReplacePatches(\n change.currentNode,\n change.baseNode,\n currentPath,\n );\n patches.push(...arrayPatches);\n replacedPaths.push(currentPath);\n continue;\n }\n\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n replacedPaths.push(currentPath);\n }\n\n return patches;\n }\n\n private generateArrayReplacePatches(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n currentPath: Path,\n ): JsonPatch[] {\n if (!baseNode.isArray()) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n return [\n {\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n },\n ];\n }\n\n const patches: JsonPatch[] = [];\n const metadataChanged = this.hasMetadataChanged(currentNode, baseNode);\n const itemsChanged = this.hasItemsChanged(currentNode, baseNode);\n\n if (metadataChanged) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n }\n\n if (itemsChanged) {\n const items = currentNode.items();\n if (!items.isNull()) {\n const itemsPath = currentPath.childItems();\n const itemsSchema = this.serializer.serializeWithTree(\n items,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: itemsPath.asJsonPointer(),\n value: itemsSchema,\n });\n }\n }\n\n return patches;\n }\n\n private hasItemsChanged(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n const items = currentNode.items();\n const baseItems = baseNode.items();\n\n if (items.isNull() && baseItems.isNull()) {\n return false;\n }\n if (items.isNull() || baseItems.isNull()) {\n return true;\n }\n\n const currentItemsSchema = this.serializer.serializeWithTree(\n items,\n this.currentTree,\n );\n const baseItemsSchema = this.serializer.serializeWithTree(\n baseItems,\n this.baseTree,\n );\n\n return !this.comparator.areEqual(currentItemsSchema, baseItemsSchema);\n }\n\n private isChildOfAny(path: Path, parents: Path[]): boolean {\n return parents.some((parent) => path.isChildOf(parent));\n }\n\n private hasChildIn(path: Path, candidates: Path[]): boolean {\n return candidates.some((candidate) => candidate.isChildOf(path));\n }\n\n private isActuallyModified(change: RawChange): boolean {\n if (!change.currentNode || !change.baseNode) {\n return false;\n }\n\n const currentSchema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n change.baseNode,\n this.baseTree,\n );\n\n if (this.comparator.areEqual(currentSchema, baseSchema)) {\n return false;\n }\n\n if (\n change.currentNode.isObject() &&\n this.hasOnlyChildChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n if (\n change.currentNode.isArray() &&\n this.hasOnlyItemsChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n return true;\n }\n\n private hasOnlyChildChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isObject()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n return true;\n }\n\n private hasMetadataChanged(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n const currentMeta = currentNode.metadata();\n const baseMeta = baseNode.metadata();\n\n return (\n currentMeta.title !== baseMeta.title ||\n currentMeta.description !== baseMeta.description ||\n currentMeta.deprecated !== baseMeta.deprecated\n );\n }\n\n private hasOnlyItemsChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isArray()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n const items = currentNode.items();\n const baseItems = baseNode.items();\n\n if (items.isNull() || baseItems.isNull()) {\n return false;\n }\n\n return items.id() === baseItems.id();\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport { FormulaSerializer } from '../../formula';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport type { JsonPatch } from '../SchemaPatch';\n\nexport class FormulaChangeDetector {\n private readonly serializer = new SchemaSerializer();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public detectIndirectFormulaChanges(\n existingPatches: JsonPatch[],\n ): JsonPatch[] {\n const patchedPaths = new Set(existingPatches.map((p) => p.path));\n const result: JsonPatch[] = [];\n\n this.baseTree.forEachFormula((formulaNodeId) => {\n const currentNode = this.currentTree.nodeById(formulaNodeId);\n if (currentNode.isNull()) {\n return;\n }\n\n const currentPath = this.currentTree\n .pathOf(formulaNodeId)\n .asJsonPointer();\n if (patchedPaths.has(currentPath)) {\n return;\n }\n\n const baseFormula = this.baseTree.getFormulaByNodeId(formulaNodeId);\n const currentFormula = currentNode.formula();\n\n if (!baseFormula || !currentFormula) {\n return;\n }\n\n const baseExpression = new FormulaSerializer(\n this.baseTree,\n formulaNodeId,\n baseFormula,\n ).serialize();\n\n const currentExpression = new FormulaSerializer(\n this.currentTree,\n formulaNodeId,\n currentFormula,\n ).serialize();\n\n if (baseExpression !== currentExpression) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n result.push({\n op: 'replace',\n path: currentPath,\n value: schema,\n });\n }\n });\n\n return result;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaSerializer } from '../../formula/serialization/FormulaSerializer';\nimport type {\n DefaultValueType,\n MetadataChangeType,\n MetadataChangesResult,\n} from '../SchemaPatch';\n\nexport class NodeMetadataExtractor {\n public getNodeType(node: SchemaNode | null): string {\n if (!node || node.isNull()) {\n return 'unknown';\n }\n\n if (node.isRef()) {\n return node.ref();\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsType = this.getNodeType(items);\n return `array<${itemsType}>`;\n }\n return 'array';\n }\n\n return node.nodeType();\n }\n\n public getFormulaExpression(\n tree: NodeTree,\n node: SchemaNode | null,\n ): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n const formula = node.formula();\n if (!formula) {\n return undefined;\n }\n return new FormulaSerializer(tree, node.id(), formula).serialize();\n }\n\n public getDefaultValue(node: SchemaNode | null): DefaultValueType {\n if (!node || node.isNull()) {\n return undefined;\n }\n const def = node.defaultValue();\n if (\n typeof def === 'string' ||\n typeof def === 'number' ||\n typeof def === 'boolean'\n ) {\n return def;\n }\n return undefined;\n }\n\n public getDescription(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().description;\n }\n\n public getDeprecated(node: SchemaNode | null): boolean | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().deprecated;\n }\n\n public getForeignKey(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.foreignKey();\n }\n\n public getContentMediaType(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.contentMediaType?.();\n }\n\n public computeMetadataChanges(\n baseTree: NodeTree,\n baseNode: SchemaNode | null,\n currentTree: NodeTree,\n currentNode: SchemaNode | null,\n ): MetadataChangesResult {\n const changes: MetadataChangeType[] = [];\n let formulaChange: MetadataChangesResult['formulaChange'];\n let defaultChange: MetadataChangesResult['defaultChange'];\n let descriptionChange: MetadataChangesResult['descriptionChange'];\n let deprecatedChange: MetadataChangesResult['deprecatedChange'];\n let foreignKeyChange: MetadataChangesResult['foreignKeyChange'];\n let contentMediaTypeChange: MetadataChangesResult['contentMediaTypeChange'];\n\n const effectiveCurrentNode = this.getEffectiveNodeForComparison(\n baseNode,\n currentNode,\n );\n\n const baseDesc = this.getDescription(baseNode);\n const currentDesc = this.getDescription(effectiveCurrentNode);\n if (baseDesc !== currentDesc) {\n changes.push('description');\n descriptionChange = {\n fromDescription: baseDesc,\n toDescription: currentDesc,\n };\n }\n\n const baseDeprecated = this.getDeprecated(baseNode);\n const currentDeprecated = this.getDeprecated(effectiveCurrentNode);\n if (baseDeprecated !== currentDeprecated) {\n changes.push('deprecated');\n deprecatedChange = {\n fromDeprecated: baseDeprecated,\n toDeprecated: currentDeprecated,\n };\n }\n\n const baseFormula = this.getFormulaExpression(baseTree, baseNode);\n const currentFormula = this.getFormulaExpression(\n currentTree,\n effectiveCurrentNode,\n );\n if (baseFormula !== currentFormula) {\n changes.push('formula');\n formulaChange = { fromFormula: baseFormula, toFormula: currentFormula };\n }\n\n const baseForeignKey = this.getForeignKey(baseNode);\n const currentForeignKey = this.getForeignKey(effectiveCurrentNode);\n if (baseForeignKey !== currentForeignKey) {\n changes.push('foreignKey');\n foreignKeyChange = {\n fromForeignKey: baseForeignKey,\n toForeignKey: currentForeignKey,\n };\n }\n\n const baseDefault = this.getDefaultValue(baseNode);\n const currentDefault = this.getDefaultValue(effectiveCurrentNode);\n if (baseDefault !== currentDefault) {\n changes.push('default');\n defaultChange = { fromDefault: baseDefault, toDefault: currentDefault };\n }\n\n const baseContentMediaType = this.getContentMediaType(baseNode);\n const currentContentMediaType =\n this.getContentMediaType(effectiveCurrentNode);\n if (baseContentMediaType !== currentContentMediaType) {\n changes.push('contentMediaType');\n contentMediaTypeChange = {\n fromContentMediaType: baseContentMediaType,\n toContentMediaType: currentContentMediaType,\n };\n }\n\n return {\n metadataChanges: changes,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private getEffectiveNodeForComparison(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): SchemaNode | null {\n if (\n baseNode &&\n !baseNode.isNull() &&\n baseNode.isPrimitive() &&\n currentNode &&\n !currentNode.isNull() &&\n currentNode.isArray()\n ) {\n const items = currentNode.items();\n return items.isNull() ? null : items;\n }\n return currentNode;\n }\n\n public hasTypeChanged(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n const baseType = this.getNodeType(baseNode);\n const currentType = this.getNodeType(currentNode);\n return baseType !== currentType;\n }\n\n public hasTypeChangedIgnoringItems(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n const baseType = this.getBaseNodeType(baseNode);\n const currentType = this.getBaseNodeType(currentNode);\n return baseType !== currentType;\n }\n\n private getBaseNodeType(node: SchemaNode | null): string {\n if (!node || node.isNull()) {\n return 'unknown';\n }\n\n if (node.isRef()) {\n return node.ref();\n }\n\n if (node.isArray()) {\n return 'array';\n }\n\n return node.nodeType();\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport { jsonPointerToPath } from '../../path';\nimport { NodeMetadataExtractor } from './NodeMetadataExtractor';\nimport type { JsonPatch, SchemaPatch } from '../SchemaPatch';\n\nexport class PatchEnricher {\n private readonly metadataExtractor = new NodeMetadataExtractor();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public enrich(patch: JsonPatch): SchemaPatch {\n const fieldName = this.getFieldNameFromPath(patch.path);\n\n if (patch.op === 'add') {\n return this.enrichAddPatch(patch, fieldName);\n }\n\n if (patch.op === 'remove') {\n return { patch, fieldName, metadataChanges: [] };\n }\n\n if (patch.op === 'move') {\n return this.enrichMovePatch(patch, fieldName);\n }\n\n return this.enrichReplacePatch(patch, fieldName);\n }\n\n private enrichAddPatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n null,\n this.currentTree,\n currentNode,\n );\n\n return {\n patch,\n fieldName,\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private enrichMovePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const fromPath = patch.from || '';\n const isRename = this.isRenameMove(fromPath, patch.path);\n const movesIntoArray = this.movesIntoArrayBoundary(fromPath, patch.path);\n\n const baseNode = this.getNodeAtPath(this.baseTree, fromPath);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const baseFormula = this.metadataExtractor.getFormulaExpression(\n this.baseTree,\n baseNode,\n );\n const currentFormula = this.metadataExtractor.getFormulaExpression(\n this.currentTree,\n currentNode,\n );\n\n const formulaChange =\n baseFormula !== currentFormula\n ? { fromFormula: baseFormula, toFormula: currentFormula }\n : undefined;\n\n return {\n patch,\n fieldName,\n metadataChanges: formulaChange ? ['formula'] : [],\n isRename: isRename || undefined,\n movesIntoArray: movesIntoArray || undefined,\n formulaChange,\n };\n }\n\n private enrichReplacePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const baseNode = this.getNodeAtPath(this.baseTree, patch.path);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n baseNode,\n this.currentTree,\n currentNode,\n );\n\n const isArrayMetadataPatch = this.isArrayMetadataOnlyPatch(\n baseNode,\n currentNode,\n );\n\n const typeChanged = isArrayMetadataPatch\n ? this.metadataExtractor.hasTypeChangedIgnoringItems(\n baseNode,\n currentNode,\n )\n : this.metadataExtractor.hasTypeChanged(baseNode, currentNode);\n\n return {\n patch,\n fieldName,\n metadataChanges,\n typeChange: typeChanged\n ? {\n fromType: this.metadataExtractor.getNodeType(baseNode),\n toType: this.metadataExtractor.getNodeType(currentNode),\n }\n : undefined,\n formulaChange,\n defaultChange: isArrayMetadataPatch ? undefined : defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private isArrayMetadataOnlyPatch(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n return Boolean(baseNode?.isArray() && currentNode?.isArray());\n }\n\n private getFieldNameFromPath(jsonPointer: string): string {\n try {\n return jsonPointerToPath(jsonPointer).asSimple();\n } catch {\n return '';\n }\n }\n\n private isRenameMove(fromPointer: string, toPointer: string): boolean {\n try {\n const fromParent = jsonPointerToPath(fromPointer).parent();\n const toParent = jsonPointerToPath(toPointer).parent();\n return fromParent.equals(toParent);\n } catch {\n return false;\n }\n }\n\n private movesIntoArrayBoundary(\n fromPointer: string,\n toPointer: string,\n ): boolean {\n try {\n const fromPath = jsonPointerToPath(fromPointer);\n const toPath = jsonPointerToPath(toPointer);\n const fromArrayDepth = this.countArrayDepth(fromPath);\n const toArrayDepth = this.countArrayDepth(toPath);\n return toArrayDepth > fromArrayDepth;\n } catch {\n return false;\n }\n }\n\n private countArrayDepth(path: import('../../path').Path): number {\n return path.segments().filter((seg) => seg.isItems()).length;\n }\n\n private getNodeAtPath(\n tree: SchemaTree,\n jsonPointer: string,\n ): SchemaNode | null {\n try {\n const path = jsonPointerToPath(jsonPointer);\n const node = tree.nodeAt(path);\n return node.isNull() ? null : node;\n } catch {\n return null;\n }\n }\n}\n","import type { SchemaTree } from '../tree/SchemaTree';\nimport type { NodePathIndex } from './index/NodePathIndex';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { ChangeCollector } from './changes/ChangeCollector';\nimport { ChangeCoalescer } from './changes/ChangeCoalescer';\nimport { PatchGenerator } from './changes/PatchGenerator';\nimport { FormulaChangeDetector } from './changes/FormulaChangeDetector';\nimport { PatchEnricher } from './enricher/PatchEnricher';\n\nexport class PatchBuilder {\n private readonly collector: ChangeCollector;\n private readonly coalescer: ChangeCoalescer;\n private readonly generator: PatchGenerator;\n private readonly formulaDetector: FormulaChangeDetector;\n private readonly enricher: PatchEnricher;\n\n constructor(\n currentTree: SchemaTree,\n baseTree: SchemaTree,\n baseIndex: NodePathIndex,\n ) {\n this.collector = new ChangeCollector(currentTree, baseTree, baseIndex);\n this.coalescer = new ChangeCoalescer(currentTree, baseTree, baseIndex);\n this.generator = new PatchGenerator(currentTree, baseTree);\n this.formulaDetector = new FormulaChangeDetector(currentTree, baseTree);\n this.enricher = new PatchEnricher(currentTree, baseTree);\n }\n\n public build(): SchemaPatch[] {\n const rawChanges = this.collector.collect();\n const coalesced = this.coalescer.coalesce(rawChanges);\n const jsonPatches = this.generator.generate(coalesced);\n const formulaPatches =\n this.formulaDetector.detectIndirectFormulaChanges(jsonPatches);\n const allPatches = [...jsonPatches, ...formulaPatches];\n return allPatches.map((patch) => this.enricher.enrich(patch));\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { SchemaTree } from '../tree/SchemaTree';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport { SchemaSerializer } from '../schema/SchemaSerializer';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { SchemaComparator } from './SchemaComparator';\nimport { NodePathIndex } from './index/NodePathIndex';\nimport { PatchBuilder } from './PatchBuilder';\n\nexport class SchemaDiff {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n private readonly baseIndex: NodePathIndex;\n private baseTree: SchemaTree;\n\n constructor(private readonly tree: SchemaTree) {\n this.baseTree = tree.clone();\n this.baseIndex = new NodePathIndex(this.baseTree);\n makeAutoObservable<SchemaDiff, 'baseTree'>(\n this,\n { baseTree: observable.ref },\n { autoBind: true },\n );\n }\n\n public markAsSaved(): void {\n this.baseTree = this.tree.clone();\n this.baseIndex.rebuildFrom(this.baseTree);\n }\n\n public getBaseSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.baseTree.root(),\n this.baseTree,\n ) as JsonObjectSchema;\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n this.baseIndex.trackReplacement(oldNodeId, newNodeId);\n }\n\n public getPatches(): SchemaPatch[] {\n return this.createPatchBuilder().build();\n }\n\n public isDirty(): boolean {\n const currentSchema = this.getCurrentSchema();\n const baseSchema = this.getBaseSchema();\n return !this.comparator.areEqual(currentSchema, baseSchema);\n }\n\n public getCurrentSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.tree.root(),\n this.tree,\n ) as JsonObjectSchema;\n }\n\n private createPatchBuilder(): PatchBuilder {\n return new PatchBuilder(this.tree, this.baseTree, this.baseIndex);\n }\n}\n","const FIELD_NAME_PATTERN = /^(?!__)[a-zA-Z_][a-zA-Z0-9-_]*$/;\nconst FIELD_NAME_MAX_LENGTH = 64;\n\nexport const FIELD_NAME_ERROR_MESSAGE =\n 'Must start with a letter or underscore, cannot start with __, and can only include letters, numbers, hyphens, and underscores (max 64 chars)';\n\nexport function isValidFieldName(name: string): boolean {\n if (name.length < 1 || name.length > FIELD_NAME_MAX_LENGTH) {\n return false;\n }\n return FIELD_NAME_PATTERN.test(name);\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from './FieldNameValidator';\n\nexport type ValidationErrorType =\n | 'empty-name'\n | 'duplicate-name'\n | 'invalid-name';\n\nexport interface ValidationError {\n nodeId: string;\n type: ValidationErrorType;\n message: string;\n}\n\nexport class SchemaValidator {\n validate(root: SchemaNode): ValidationError[] {\n const errors: ValidationError[] = [];\n this.collectValidationErrors(root, errors);\n return errors;\n }\n\n private collectValidationErrors(\n node: SchemaNode,\n errors: ValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const children = node.properties();\n const nameSet = new Set<string>();\n for (const child of children) {\n const name = child.name();\n if (!name) {\n errors.push({\n nodeId: child.id(),\n type: 'empty-name',\n message: 'Field name is required',\n });\n } else if (nameSet.has(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'duplicate-name',\n message: `Duplicate field name: ${name}`,\n });\n } else if (!isValidFieldName(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'invalid-name',\n message: FIELD_NAME_ERROR_MESSAGE,\n });\n }\n nameSet.add(name);\n this.collectValidationErrors(child, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectValidationErrors(items, errors);\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { SchemaTree } from '../tree/SchemaTree';\n\nexport interface FormulaValidationError {\n nodeId: string;\n message: string;\n fieldPath?: string;\n}\n\nexport class FormulaValidator {\n constructor(private readonly tree: SchemaTree) {}\n\n validate(): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n this.collectErrors(this.tree.root(), '', errors);\n return errors;\n }\n\n validateNode(\n nodeId: string,\n fieldPath?: string,\n ): FormulaValidationError | null {\n const formula = this.tree.getFormulaByNodeId(nodeId);\n if (!formula) {\n return null;\n }\n\n for (const dep of formula.dependencies()) {\n const targetNode = this.tree.nodeById(dep.targetNodeId());\n if (targetNode.isNull()) {\n return {\n nodeId,\n message: `Cannot resolve formula dependency: target node not found`,\n fieldPath: fieldPath || undefined,\n };\n }\n }\n\n return null;\n }\n\n private collectErrors(\n node: SchemaNode,\n currentPath: string,\n errors: FormulaValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isPrimitive()) {\n const error = this.validateNode(node.id(), currentPath);\n if (error) {\n errors.push(error);\n }\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n const childPath = currentPath\n ? `${currentPath}.${child.name()}`\n : child.name();\n this.collectErrors(child, childPath, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsPath = `${currentPath}[*]`;\n this.collectErrors(items, itemsPath, errors);\n }\n }\n }\n}\n","import { NodeType } from '../node/NodeType';\nimport { defaultRegistry } from '../parsing/index';\n\nexport type ParsedDefaultValue = string | number | boolean | undefined;\n\nexport function parseDefaultValue(\n valueStr: string,\n nodeType: NodeType,\n): ParsedDefaultValue {\n if (!valueStr) {\n return undefined;\n }\n\n const descriptor = defaultRegistry.getDescriptor(nodeType);\n if (descriptor) {\n return descriptor.parseDefaultValueString(valueStr) as ParsedDefaultValue;\n }\n\n return undefined;\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 { JsonSchemaType } from '../schema/JsonSchema';\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\nfunction getTypeFromSchema(schema: JsonSchemaType): SchemaType {\n if ('$ref' in schema) {\n return 'ref';\n }\n if ('type' in schema) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: JsonSchemaType): string | undefined {\n if ('type' in schema && schema.type === 'string' && 'foreignKey' in schema) {\n const fk = (schema as { foreignKey?: string }).foreignKey;\n return fk || undefined;\n }\n return undefined;\n}\n\nfunction getDefaultForPrimitive(\n schema: JsonSchemaType,\n fallback: unknown,\n): unknown {\n return 'default' in schema ? schema.default : fallback;\n}\n\nfunction getDefaultForArray(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const arrSchema = schema as { items?: JsonSchemaType };\n if (arrSchema.items) {\n return [getDefaultValueFromSchema(arrSchema.items)];\n }\n return [];\n}\n\nfunction getDefaultForObject(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const objSchema = schema as { properties?: Record<string, JsonSchemaType> };\n if (!objSchema.properties) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(objSchema.properties).map(([key, propSchema]) => [\n key,\n getDefaultValueFromSchema(propSchema),\n ]),\n );\n}\n\nconst typeHandlers: Record<string, (schema: JsonSchemaType) => unknown> = {\n string: (schema) => getDefaultForPrimitive(schema, ''),\n number: (schema) => getDefaultForPrimitive(schema, 0),\n boolean: (schema) => getDefaultForPrimitive(schema, false),\n array: getDefaultForArray,\n object: getDefaultForObject,\n};\n\nexport function getDefaultValueFromSchema(schema: JsonSchemaType): unknown {\n if ('$ref' in schema) {\n return null;\n }\n\n if (!('type' in schema)) {\n return null;\n }\n\n const handler = typeHandlers[schema.type];\n return handler ? handler(schema) : null;\n}\n\ninterface AddPatch {\n op: 'add';\n path: string;\n value: JsonSchemaType;\n}\n\nexport function getDefaultValueExample(\n patch: AddPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add') {\n return null;\n }\n\n const value = getDefaultValueFromSchema(patch.value);\n const type = getTypeFromSchema(patch.value);\n const foreignKeyTableId = getForeignKeyTableId(patch.value);\n\n return { value, type, foreignKeyTableId };\n}\n","import { makeAutoObservable } from 'mobx';\nimport { SchemaTree } from '../tree/SchemaTree';\nimport { SchemaDiff } from '../diff/SchemaDiff';\nimport { SchemaParser } from '../schema/SchemaParser';\nimport { SchemaValidator } from '../validation/SchemaValidator';\nimport { FormulaValidator } from '../validation/FormulaValidator';\nimport { ParsedFormula, FormulaError } from '../formula';\nimport { NodeFactory } from '../node/NodeFactory';\nimport { NodeType } from '../node/NodeType';\nimport { NULL_NODE } from '../node/NullNode';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport type { SchemaPatch } from '../diff/index';\nimport type { ValidationError } from '../validation/SchemaValidator';\nimport type { FormulaValidationError } from '../validation/FormulaValidator';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { FormulaDependent } from '../formula';\nimport type { StringNode } from '../node/StringNode';\n\nexport interface ReplaceResult {\n replacedNodeId: string;\n newNodeId: string;\n}\n\nexport interface FormulaUpdateResult {\n success: boolean;\n error?: string;\n}\n\ninterface FormulaParseError {\n nodeId: string;\n expression: string;\n message: string;\n}\n\nexport class SchemaEngine {\n private readonly _tree: SchemaTree;\n private readonly _diff: SchemaDiff;\n private readonly _schemaValidator = new SchemaValidator();\n private readonly _formulaValidator: FormulaValidator;\n private _formulaParseErrors: FormulaParseError[] = [];\n\n constructor(jsonSchema: JsonObjectSchema) {\n const parser = new SchemaParser();\n const root = parser.parse(jsonSchema);\n this._tree = new SchemaTree(root);\n this._formulaValidator = new FormulaValidator(this._tree);\n\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff = new SchemaDiff(this._tree);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private applyPendingFormulas(\n pending: { nodeId: string; expression: string }[],\n ): FormulaParseError[] {\n const errors: FormulaParseError[] = [];\n\n for (const { nodeId, expression } of pending) {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n continue;\n }\n\n try {\n const formula = new ParsedFormula(this._tree, nodeId, expression);\n node.setFormula(formula);\n this._tree.registerFormula(nodeId, formula);\n } catch (error) {\n const message = this.extractErrorMessage(error);\n errors.push({ nodeId, expression, message });\n }\n }\n\n return errors;\n }\n\n private extractErrorMessage(error: unknown): string {\n if (error instanceof FormulaError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Unknown formula error';\n }\n\n public get tree(): SchemaTree {\n return this._tree;\n }\n\n public get diff(): SchemaDiff {\n return this._diff;\n }\n\n public root(): SchemaNode {\n return this._tree.root();\n }\n\n public nodeById(nodeId: string): SchemaNode {\n return this._tree.nodeById(nodeId);\n }\n\n public countNodes(): number {\n return this._tree.countNodes();\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n return this._tree.getDirectFormulaDependents(nodeId);\n }\n\n public get isDirty(): boolean {\n return this._diff.isDirty();\n }\n\n public get isValid(): boolean {\n const root = this._tree.root();\n if (root.isNull()) {\n return false;\n }\n if (root.isObject()) {\n return root.properties().length > 0;\n }\n return true;\n }\n\n public get validationErrors(): readonly ValidationError[] {\n return this._schemaValidator.validate(this._tree.root());\n }\n\n public validateFormulas(): FormulaValidationError[] {\n const validatorErrors = this._formulaValidator.validate();\n const parseErrors: FormulaValidationError[] = this._formulaParseErrors.map(\n (e) => ({\n nodeId: e.nodeId,\n message: e.message,\n }),\n );\n return [...parseErrors, ...validatorErrors];\n }\n\n public markAsSaved(): void {\n this._diff.markAsSaved();\n }\n\n public revert(): void {\n const baseSchema = this._diff.getBaseSchema();\n const parser = new SchemaParser();\n const root = parser.parse(baseSchema);\n\n this._tree.clearFormulaIndex();\n this._tree.replaceRoot(root);\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff.markAsSaved();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._diff.getPatches();\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._diff.getCurrentSchema();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n return this._tree.canMoveNode(fromNodeId, toNodeId);\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this._tree.hasValidDropTarget(nodeId);\n }\n\n public moveNode(nodeId: string, targetObjectId: string): void {\n if (!this.canMoveNode(nodeId, targetObjectId)) {\n return;\n }\n this._tree.moveNode(nodeId, targetObjectId);\n }\n\n public renameNode(nodeId: string, newName: string): void {\n this._tree.renameNode(nodeId, newName);\n }\n\n public updateNodeMetadata(\n nodeId: string,\n metadata: { description?: string; deprecated?: boolean },\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n const currentMeta = node.metadata();\n node.setMetadata({\n description:\n 'description' in metadata\n ? metadata.description || undefined\n : currentMeta.description,\n deprecated:\n 'deprecated' in metadata ? metadata.deprecated : currentMeta.deprecated,\n });\n }\n\n public updateDefaultValue(\n nodeId: string,\n value: string | number | boolean | undefined,\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n node.setDefaultValue(value);\n }\n\n public addChild(parentId: string, name: string): SchemaNode {\n const parent = this._tree.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return NULL_NODE;\n }\n const newNode = NodeFactory.string(name);\n this._tree.addChildTo(parentId, newNode);\n return newNode;\n }\n\n public removeNode(nodeId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return false;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return false;\n }\n this._tree.removeNodeAt(path);\n return true;\n }\n\n public replaceNode(\n nodeId: string,\n newNode: SchemaNode,\n ): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n this._tree.setNodeAt(path, newNode);\n this._diff.trackReplacement(nodeId, newNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapInArray(nodeId: string): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n if (currentNode.isArray()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n const name = currentNode.name();\n const arrayNode = NodeFactory.array(name, currentNode);\n this._tree.setNodeAt(path, arrayNode);\n currentNode.setName('');\n this._diff.trackReplacement(nodeId, arrayNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public replaceRootWith(newNode: SchemaNode): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull()) {\n return null;\n }\n const oldId = currentRoot.id();\n newNode.setName(currentRoot.name());\n this._tree.replaceRoot(newNode);\n this._diff.trackReplacement(oldId, newNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapRootInArray(): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull() || currentRoot.isArray()) {\n return null;\n }\n const oldId = currentRoot.id();\n const name = currentRoot.name();\n const arrayNode = NodeFactory.array(name, currentRoot);\n currentRoot.setName('');\n this._tree.replaceRoot(arrayNode);\n this._diff.trackReplacement(oldId, arrayNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public updateForeignKey(nodeId: string, tableId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull() || node.nodeType() !== NodeType.String) {\n return false;\n }\n (node as StringNode).setForeignKey(tableId || undefined);\n return true;\n }\n\n public updateFormula(\n nodeId: string,\n expression: string | undefined,\n ): FormulaUpdateResult {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return { success: false, error: 'Node not found' };\n }\n try {\n const formula = expression\n ? new ParsedFormula(this._tree, nodeId, expression)\n : undefined;\n node.setFormula(formula);\n if (formula) {\n this._tree.registerFormula(nodeId, formula);\n } else {\n this._tree.unregisterFormula(nodeId);\n }\n this._formulaParseErrors = this._formulaParseErrors.filter(\n (e) => e.nodeId !== nodeId,\n );\n return { success: true };\n } catch (error) {\n const errorMessage =\n error instanceof FormulaError ? error.message : String(error);\n return { success: false, error: errorMessage };\n }\n }\n\n public createStringNode(name: string): SchemaNode {\n return NodeFactory.string(name);\n }\n\n public createNumberNode(name: string): SchemaNode {\n return NodeFactory.number(name);\n }\n}\n","import { SystemSchemaIds, getLabelByRef } from '../types';\nimport { NodeFactory, type SchemaNode } from '../model';\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\nexport function createNodeByTypeId(\n typeId: SchemaTypeIds | string,\n name: string,\n): SchemaNode | null {\n switch (typeId as SchemaTypeIds) {\n case SchemaTypeIds.String:\n return NodeFactory.string(name);\n case SchemaTypeIds.Number:\n return NodeFactory.number(name);\n case SchemaTypeIds.Boolean:\n return NodeFactory.boolean(name);\n case SchemaTypeIds.Object:\n return NodeFactory.object(name);\n case SchemaTypeIds.Array:\n return NodeFactory.array(name, NodeFactory.string(''));\n case SchemaTypeIds.ForeignKeyString:\n return NodeFactory.string(name, { foreignKey: '' });\n case SchemaTypeIds.File:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.File });\n case SchemaTypeIds.RowId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowId });\n case SchemaTypeIds.RowVersionId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowVersionId });\n case SchemaTypeIds.RowCreatedId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedId });\n case SchemaTypeIds.RowCreatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedAt });\n case SchemaTypeIds.RowPublishedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowPublishedAt });\n case SchemaTypeIds.RowUpdatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowUpdatedAt });\n case SchemaTypeIds.RowHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowHash });\n case SchemaTypeIds.RowSchemaHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowSchemaHash });\n case SchemaTypeIds.Markdown:\n return NodeFactory.string(name, { contentMediaType: 'text/markdown' });\n default:\n return null;\n }\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\ntype MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\ntype 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\nexport type { MenuOptionItem, MenuGroup };\n","import { JsonSchemaTypeName, SystemSchemaIds } from '../types';\nimport type { JsonObjectSchema } from '../model';\n\nexport const fileSchema: JsonObjectSchema = {\n type: JsonSchemaTypeName.Object,\n properties: {\n status: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileId: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n url: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileName: { type: JsonSchemaTypeName.String, default: '' },\n hash: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n extension: {\n type: JsonSchemaTypeName.String,\n default: '',\n readOnly: true,\n },\n mimeType: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n size: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n width: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n height: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n },\n required: [\n 'status',\n 'fileId',\n 'url',\n 'fileName',\n 'hash',\n 'extension',\n 'mimeType',\n 'size',\n 'width',\n 'height',\n ],\n additionalProperties: false,\n};\n\nexport const systemSchemaRegistry: Record<string, JsonObjectSchema> = {\n [SystemSchemaIds.File]: fileSchema,\n};\n\nexport const getResolvedSchema = (ref: string): JsonObjectSchema | null => {\n if (Object.hasOwn(systemSchemaRegistry, ref)) {\n return systemSchemaRegistry[ref] ?? null;\n }\n return null;\n};\n\nexport const isResolvableRef = (ref: string): boolean => {\n return Object.hasOwn(systemSchemaRegistry, ref);\n};\n","import type { SchemaNode } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM as ObjectNodeVMType } from './ObjectNodeVM';\nimport type { ArrayNodeVM as ArrayNodeVMType } from './ArrayNodeVM';\nimport type { PrimitiveNodeVM as PrimitiveNodeVMType } from './PrimitiveNodeVM';\nimport type { RefNodeVM as RefNodeVMType } from './RefNodeVM';\nimport type { ForeignKeyNodeVM as ForeignKeyNodeVMType } from './ForeignKeyNodeVM';\n\nexport type NodeVM =\n | ObjectNodeVMType\n | ArrayNodeVMType\n | PrimitiveNodeVMType\n | RefNodeVMType\n | ForeignKeyNodeVMType;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NodeVMClass = new (...args: any[]) => NodeVM;\n\ninterface VMRegistry {\n ObjectNodeVM?: NodeVMClass;\n ArrayNodeVM?: NodeVMClass;\n PrimitiveNodeVM?: NodeVMClass;\n RefNodeVM?: NodeVMClass;\n ForeignKeyNodeVM?: NodeVMClass;\n}\n\nconst registry: VMRegistry = {};\n\nexport function registerVMClass(\n name: keyof VMRegistry,\n VMClass: NodeVMClass,\n): void {\n registry[name] = VMClass;\n}\n\nexport function createNodeVM(\n node: SchemaNode,\n editor: SchemaEditorVM,\n parent: ObjectNodeVMType | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n): NodeVM {\n if (node.isObject()) {\n const VMClass = registry.ObjectNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ObjectNodeVM not registered. Import ObjectNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isArray()) {\n const VMClass = registry.ArrayNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ArrayNodeVM not registered. Import ArrayNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isRef()) {\n const VMClass = registry.RefNodeVM;\n if (!VMClass) {\n throw new Error(\n 'RefNodeVM not registered. Import RefNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n if (node.foreignKey() !== undefined) {\n const VMClass = registry.ForeignKeyNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ForeignKeyNodeVM not registered. Import ForeignKeyNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n const VMClass = registry.PrimitiveNodeVM;\n if (!VMClass) {\n throw new Error(\n 'PrimitiveNodeVM not registered. Import PrimitiveNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { getLabelByRef } from '../types';\nimport { NodeType, type SchemaNode, type FormulaDependent } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport abstract class BaseNodeVM {\n public isFocusedState = false;\n public isMenuOpenState = false;\n public isSettingsOpenState = false;\n\n constructor(\n protected readonly _node: SchemaNode,\n protected readonly _editor: SchemaEditorVM,\n protected readonly _isRoot: boolean = false,\n protected readonly _isReadonly: boolean = false,\n ) {\n makeObservable(this, {\n isFocusedState: observable,\n isMenuOpenState: observable,\n isSettingsOpenState: observable,\n nodeId: computed,\n name: computed,\n path: computed,\n type: computed,\n label: computed,\n isFocused: computed,\n isMenuOpen: computed,\n isSettingsOpen: computed,\n shouldApplyFieldStyles: computed,\n isCollapsible: computed,\n isObject: computed,\n isArray: computed,\n isPrimitive: computed,\n isString: computed,\n isNumber: computed,\n isBoolean: computed,\n showTypeSelector: computed,\n showMenu: computed,\n hasDescription: computed,\n isDeprecated: computed,\n description: computed,\n hasFormula: computed,\n formula: computed,\n formulaDependents: computed,\n canDelete: computed,\n deleteBlockedReason: computed,\n defaultValue: computed,\n defaultValueAsString: computed,\n validationError: computed,\n hasError: computed,\n errorMessage: computed,\n canDrag: computed,\n isValidDropTarget: computed,\n isReadonly: computed,\n setFocused: action.bound,\n setMenuOpen: action.bound,\n setSettingsOpen: action.bound,\n rename: action.bound,\n setDescription: action.bound,\n setDeprecated: action.bound,\n setFormula: action.bound,\n setDefault: action.bound,\n handleFieldBlur: action.bound,\n });\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get node(): SchemaNode {\n return this._node;\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 name(): string {\n if (this._isRoot) {\n return this._editor.tableId;\n }\n return this._node.name();\n }\n\n public get path(): string {\n return this._node.name();\n }\n\n public get type(): string {\n if (this._node.isRef()) {\n return 'ref';\n }\n return this._node.nodeType();\n }\n\n public get label(): string {\n if (this._node.isRef()) {\n const ref = this._node.ref();\n return getLabelByRef(ref) ?? ref;\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n return this._node.nodeType();\n }\n\n public get isFocused(): boolean {\n return this.isFocusedState;\n }\n\n public get isMenuOpen(): boolean {\n return this.isMenuOpenState;\n }\n\n public get isSettingsOpen(): boolean {\n return this.isSettingsOpenState;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.isFocusedState && !this.isMenuOpenState && !this.isSettingsOpenState\n );\n }\n\n public setFocused(value: boolean): void {\n this.isFocusedState = value;\n }\n\n public setMenuOpen(value: boolean): void {\n this.isMenuOpenState = value;\n }\n\n public setSettingsOpen(value: boolean): void {\n this.isSettingsOpenState = value;\n }\n\n public get isCollapsible(): boolean {\n return false;\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 isString(): boolean {\n return this._node.nodeType() === NodeType.String;\n }\n\n public get isNumber(): boolean {\n return this._node.nodeType() === NodeType.Number;\n }\n\n public get isBoolean(): boolean {\n return this._node.nodeType() === NodeType.Boolean;\n }\n\n public get showTypeSelector(): boolean {\n return !this._isReadonly;\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public get hasDescription(): boolean {\n return Boolean(this._node.metadata().description);\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get description(): string {\n return this._node.metadata().description ?? '';\n }\n\n public get hasFormula(): boolean {\n return false;\n }\n\n public get formula(): string {\n return '';\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return [];\n }\n\n public get canDelete(): boolean {\n return true;\n }\n\n public get deleteBlockedReason(): string | null {\n return null;\n }\n\n public get defaultValue(): unknown {\n return undefined;\n }\n\n public get defaultValueAsString(): string {\n return '';\n }\n\n public get validationError(): string | null {\n if (this._isRoot && this._editor.tableIdError) {\n return this._editor.tableIdError;\n }\n const errors = this._editor.engine.validationErrors;\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public get hasError(): boolean {\n return this.validationError !== null;\n }\n\n public get errorMessage(): string | null {\n return this.validationError;\n }\n\n public get canDrag(): boolean {\n if (this._isReadonly || this._isRoot || !this._node.name()) {\n return false;\n }\n return this._editor.engine.hasValidDropTarget(this.nodeId);\n }\n\n public get isValidDropTarget(): boolean {\n return false;\n }\n\n public rename(newName: string): void {\n if (newName !== this.name) {\n if (this._isRoot) {\n this._editor.setTableId(newName);\n } else {\n this._editor.engine.renameNode(this.nodeId, newName);\n }\n }\n }\n\n public setDescription(value: string): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { description: value });\n }\n\n public setDeprecated(value: boolean): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { deprecated: value });\n }\n\n public setFormula(_expression: string): void {\n // Override in subclasses that support formulas\n }\n\n public setDefault(_value: string): void {\n // Override in subclasses that support default values\n }\n\n public handleFieldBlur(): void {\n this.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.removeSelf();\n }\n }\n\n public canAcceptDrop(fromNodeId: string): boolean {\n return this._editor.engine.canMoveNode(fromNodeId, this.nodeId);\n }\n\n public remove(): void {\n this.removeSelf();\n }\n\n public abstract removeSelf(): void;\n public abstract changeType(typeId: string): void;\n}\n","import { makeObservable, observable, computed, action, override } from 'mobx';\nimport {\n parseDefaultValue,\n FormulaSerializer,\n type SchemaNode,\n type FormulaDependent,\n} from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\ntype PrimitiveValue = string | number | boolean | undefined;\n\nexport class PrimitiveNodeVM extends BaseNodeVM {\n public formulaInputValue: string | null = null;\n public formulaErrorValue: string | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n formulaInputValue: observable,\n formulaErrorValue: observable,\n hasFormula: override,\n formula: override,\n defaultValue: override,\n defaultValueAsString: override,\n formulaError: computed,\n formulaDependents: override,\n canDelete: override,\n deleteBlockedReason: override,\n setFormula: override,\n setDefault: override,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get formula(): string {\n if (this.formulaInputValue !== null) {\n return this.formulaInputValue;\n }\n const formula = this._node.formula();\n if (!formula) {\n return '';\n }\n return new FormulaSerializer(\n this._editor.engine.tree,\n this.nodeId,\n formula,\n ).serialize();\n }\n\n public get defaultValue(): PrimitiveValue {\n return this._node.defaultValue() as PrimitiveValue;\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined) {\n return '';\n }\n return String(value);\n }\n\n public get formulaError(): string | null {\n if (this.formulaErrorValue) {\n return this.formulaErrorValue;\n }\n const errors = this._editor.engine.validateFormulas();\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public override get hasError(): boolean {\n return this.validationError !== null || this.formulaError !== null;\n }\n\n public override get errorMessage(): string | null {\n return this.validationError ?? this.formulaError ?? null;\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return this._editor.engine.getFormulaDependents(this.nodeId);\n }\n\n public get canDelete(): boolean {\n return this._parent !== null && this.formulaDependents.length === 0;\n }\n\n public get deleteBlockedReason(): string | null {\n const dependents = this.formulaDependents;\n if (dependents.length === 0) {\n return null;\n }\n const fieldNames = dependents.map((d) => d.fieldName).join(', ');\n return `Used by formulas: ${fieldNames}`;\n }\n\n public setFormula(expression: string): void {\n this.formulaInputValue = expression || null;\n const result = this._editor.engine.updateFormula(\n this.nodeId,\n expression || undefined,\n );\n if (result.success) {\n this.formulaErrorValue = null;\n } else if (result.error) {\n this.formulaErrorValue = result.error;\n }\n }\n\n public setDefault(valueStr: string): void {\n const value = parseDefaultValue(valueStr, this._node.nodeType());\n this._editor.engine.updateDefaultValue(this.nodeId, value);\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('PrimitiveNodeVM', PrimitiveNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ArrayNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public itemsVMRef: NodeVM | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n itemsVMRef: observable.ref,\n isCollapsed: computed,\n itemsVM: computed,\n toggleCollapsed: action.bound,\n changeItemsType: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initItemsVM();\n }\n\n private initItemsVM(): void {\n const items = this._node.items();\n if (!items.isNull()) {\n this.itemsVMRef = createNodeVM(items, this._editor, null);\n }\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get itemsVM(): NodeVM | null {\n return this.itemsVMRef;\n }\n\n public changeItemsType(typeId: string): void {\n if (!this.itemsVMRef) {\n return;\n }\n\n const currentItems = this._node.items();\n if (currentItems.isNull()) {\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, '');\n if (!newNode) {\n return;\n }\n\n const result = this._editor.engine.replaceNode(currentItems.id(), newNode);\n if (result) {\n this.itemsVMRef = createNodeVM(newNode, this._editor, null);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ArrayNodeVM', ArrayNodeVM);\n","import { makeObservable, computed, action, override } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ForeignKeyNodeVM extends BaseNodeVM {\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n label: override,\n foreignKeyValue: computed,\n setForeignKey: action.bound,\n selectForeignKey: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public override get label(): string {\n return 'foreign key';\n }\n\n public get foreignKeyValue(): string {\n return this._node.foreignKey() ?? '';\n }\n\n public setForeignKey(tableId: string | null): void {\n this._editor.engine.updateForeignKey(this.nodeId, tableId ?? '');\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._editor.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ForeignKeyNodeVM', ForeignKeyNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode, SchemaParser } from '../model';\nimport { isResolvableRef, getResolvedSchema } from '../config/system-schemas';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class RefNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean = true;\n public childrenList: NodeVM[] = [];\n private readonly _isResolvable: boolean;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this._isResolvable = isResolvableRef(node.ref());\n\n makeObservable(this, {\n isCollapsedState: observable,\n childrenList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n toggleCollapsed: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n if (this._isResolvable) {\n this.initResolvedChildren();\n }\n }\n\n private initResolvedChildren(): void {\n const resolvedSchema = getResolvedSchema(this._node.ref());\n if (!resolvedSchema) {\n return;\n }\n\n const parser = new SchemaParser();\n const resolvedRoot = parser.parse(resolvedSchema);\n\n this.childrenList = resolvedRoot\n .properties()\n .map((child) => createNodeVM(child, this._editor, null, false, true));\n }\n\n public get ref(): string {\n return this._node.ref();\n }\n\n public override get isCollapsible(): boolean {\n return this._isResolvable;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.childrenList;\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('RefNodeVM', RefNodeVM);\n","import { makeAutoObservable } from 'mobx';\nimport { ViewerSwitcherMode } from '../types';\nimport {\n SchemaEngine,\n getDefaultValueFromSchema,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type ValidationError,\n type FormulaValidationError,\n type SchemaNode,\n} from '../model';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '../model/validation/FieldNameValidator';\nimport { createNodeByTypeId, SchemaTypeIds } from '../config';\nimport { createNodeVM, type NodeVM } from './createNodeVM';\nimport { PrimitiveNodeVM } from './PrimitiveNodeVM';\n\n// Import all VM classes to ensure they are registered\nimport './ArrayNodeVM';\nimport './ForeignKeyNodeVM';\nimport './RefNodeVM';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type SchemaEditorMode = 'creating' | 'updating';\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorOptions {\n tableId?: string;\n mode?: SchemaEditorMode;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onApprove?: () => Promise<boolean>;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorVM {\n private readonly _engine: SchemaEngine;\n private _rootNodeVM: NodeVM;\n\n private _tableId: string;\n private _initialTableId: string;\n private readonly _shouldCollapseAll: boolean;\n private readonly _mode: SchemaEditorMode;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n private _loading = false;\n private _viewMode: ViewerSwitcherMode = ViewerSwitcherMode.Tree;\n private _isChangesDialogOpen = false;\n private _createDialogViewMode: 'Example' | 'Schema' = 'Example';\n\n constructor(jsonSchema: JsonObjectSchema, options: SchemaEditorOptions = {}) {\n this._engine = new SchemaEngine(jsonSchema);\n\n this._tableId = options.tableId ?? '';\n this._initialTableId = this._tableId;\n this._mode = options.mode ?? 'creating';\n this._onApprove = options.onApprove ?? null;\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n const nodeCount = this._engine.countNodes();\n this._shouldCollapseAll = shouldCollapse && nodeCount >= complexity;\n\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get mode(): SchemaEditorMode {\n return this._mode;\n }\n\n public get engine(): SchemaEngine {\n return this._engine;\n }\n\n public get shouldCollapseAll(): boolean {\n return this._shouldCollapseAll;\n }\n\n public get tableId(): string {\n return this._tableId;\n }\n\n public get initialTableId(): string {\n return this._initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableId !== this._initialTableId;\n }\n\n public get tableIdError(): string | null {\n if (!isValidFieldName(this._tableId)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableId = value;\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 public get viewMode(): ViewerSwitcherMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewerSwitcherMode): void {\n this._viewMode = mode;\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 createDialogViewMode(): 'Example' | 'Schema' {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: 'Example' | 'Schema'): void {\n this._createDialogViewMode = mode;\n }\n\n public get rootNodeVM(): NodeVM {\n return this._rootNodeVM;\n }\n\n public get isDirty(): boolean {\n return this._engine.isDirty || this.isTableIdChanged;\n }\n\n public get isValid(): boolean {\n return this._engine.isValid;\n }\n\n public get isApproveDisabled(): boolean {\n return !this.isValid || !this.isDirty;\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 get validationErrors(): readonly ValidationError[] {\n return this._engine.validationErrors;\n }\n\n public get formulaErrors(): FormulaValidationError[] {\n const engineErrors = this._engine.validateFormulas();\n const inputErrors = this.collectFormulaInputErrors(this._rootNodeVM);\n return [...engineErrors, ...inputErrors];\n }\n\n private collectFormulaInputErrors(nodeVM: NodeVM): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n\n if (nodeVM instanceof PrimitiveNodeVM && nodeVM.formulaErrorValue) {\n errors.push({\n nodeId: nodeVM.nodeId,\n fieldPath: nodeVM.name || undefined,\n message: nodeVM.formulaErrorValue,\n });\n }\n\n if ('children' in nodeVM && Array.isArray(nodeVM.children)) {\n for (const child of nodeVM.children as NodeVM[]) {\n errors.push(...this.collectFormulaInputErrors(child));\n }\n }\n\n if ('itemsVM' in nodeVM && nodeVM.itemsVM) {\n errors.push(...this.collectFormulaInputErrors(nodeVM.itemsVM));\n }\n\n return errors;\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 markAsSaved(): void {\n this._engine.markAsSaved();\n this._initialTableId = this._tableId;\n }\n\n public revert(): void {\n this._engine.revert();\n this._tableId = this._initialTableId;\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._engine.root();\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentRoot.isArray()) {\n const result = this._engine.wrapRootInArray();\n if (result) {\n const arrayNode = this._engine.nodeById(result.newNodeId);\n this._rootNodeVM = createNodeVM(arrayNode, this, null, true);\n }\n return;\n }\n\n const newNode = this.createNodeByTypeId(typeId, currentRoot.name());\n if (newNode) {\n const result = this._engine.replaceRootWith(newNode);\n if (result) {\n this._rootNodeVM = createNodeVM(newNode, this, null, true);\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 async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._loading = true;\n try {\n const success = await this._onApprove();\n if (success) {\n this.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._loading = false;\n }\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._engine.getPatches();\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._engine.getPatches().map((p) => p.patch);\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._engine.getPlainSchema() as unknown as JsonObjectSchema;\n }\n\n public getExampleData(): unknown {\n return getDefaultValueFromSchema(this.getPlainSchema());\n }\n\n public createNodeByTypeId(typeId: string, name: string): SchemaNode | null {\n return createNodeByTypeId(typeId, name);\n }\n\n public dispose(): void {\n // Nothing to clean up now\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { SchemaTypeIds } from '../config';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport class ObjectNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public propertyList: NodeVM[] = [];\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n propertyList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n showAddButton: computed,\n toggleCollapsed: action.bound,\n addProperty: action.bound,\n removeProperty: action.bound,\n replaceProperty: action.bound,\n moveNodeHere: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initChildren();\n }\n\n private initChildren(): void {\n this.propertyList = this._node\n .properties()\n .map((child) => createNodeVM(child, this._editor, this));\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.propertyList;\n }\n\n public get showAddButton(): boolean {\n return this._node.isObject();\n }\n\n public override get isValidDropTarget(): boolean {\n return true;\n }\n\n public addProperty(name: string): void {\n const newNode = this._editor.engine.addChild(this.nodeId, name);\n if (!newNode.isNull()) {\n const childVM = createNodeVM(newNode, this._editor, this);\n this.propertyList.push(childVM);\n }\n }\n\n public removeProperty(childVM: NodeVM): void {\n const removed = this._editor.engine.removeNode(childVM.nodeId);\n if (removed) {\n const index = this.propertyList.indexOf(childVM);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n }\n }\n }\n\n public replaceProperty(childVM: NodeVM, typeId: string): void {\n const currentNode = childVM.node;\n if (currentNode.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentNode.isArray()) {\n const result = this._editor.engine.wrapInArray(childVM.nodeId);\n if (result) {\n const arrayNode = this._editor.engine.nodeById(result.newNodeId);\n const newVM = createNodeVM(arrayNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, currentNode.name());\n if (newNode) {\n const result = this._editor.engine.replaceNode(childVM.nodeId, newNode);\n if (result) {\n const newVM = createNodeVM(newNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n }\n }\n\n private replacePropertyVM(oldVM: NodeVM, newVM: NodeVM): void {\n const index = this.propertyList.indexOf(oldVM);\n if (index >= 0) {\n this.propertyList[index] = newVM;\n }\n }\n\n public moveNodeHere(fromNodeId: string): void {\n const fromNode = this._editor.engine.nodeById(fromNodeId);\n if (fromNode.isNull()) {\n return;\n }\n\n this._editor.engine.moveNode(fromNodeId, this.nodeId);\n\n const movedNode = this._editor.engine.nodeById(fromNodeId);\n if (!movedNode.isNull()) {\n const rootVM = this._editor.rootNodeVM;\n if (rootVM instanceof ObjectNodeVM) {\n rootVM.removePropertyVMByNodeId(fromNodeId);\n }\n const movedVM = createNodeVM(movedNode, this._editor, this);\n this.propertyList.push(movedVM);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n\n public removePropertyVMByNodeId(nodeId: string): boolean {\n const index = this.propertyList.findIndex((vm) => vm.nodeId === nodeId);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n return true;\n }\n for (const child of this.propertyList) {\n if (child instanceof ObjectNodeVM) {\n const found = child.removePropertyVMByNodeId(nodeId);\n if (found) {\n return true;\n }\n }\n }\n return false;\n }\n}\n\nregisterVMClass('ObjectNodeVM', ObjectNodeVM);\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 { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeWrapperProps {\n viewModel: BaseNodeVM;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n children?: ReactNode;\n}\n\nexport const NodeWrapper: FC<NodeWrapperProps> = observer(\n ({\n viewModel,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${viewModel.nodeId}`;\n const collapseButtonClass = `collapse-button-${viewModel.nodeId}`;\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n }\n : {};\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\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 >\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 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/index';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\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 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 {\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, useState } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\n\ntype DragAndDropData = Record<string, unknown> & {\n viewModel: BaseNodeVM;\n};\n\nconst getDragData = (data: Record<string, unknown>): BaseNodeVM | null => {\n const viewModel = data.viewModel;\n if (viewModel && typeof viewModel === 'object' && 'nodeId' in viewModel) {\n return viewModel as BaseNodeVM;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n viewModel: BaseNodeVM;\n onDrop?: (fromNodeId: string) => void;\n}\n\nexport const useDragAndDrop = ({\n viewModel,\n onDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n const [isDrop, setIsDrop] = useState(false);\n const [isDisabledDrop, setIsDisabledDrop] = useState(false);\n const [isDraggedOver, setIsDraggedOver] = useState(false);\n\n const isDraggable = viewModel.canDrag;\n const isDropTarget = viewModel.isValidDropTarget;\n\n useEffect(() => {\n if (!isDraggable || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ viewModel }),\n });\n\n return () => cleanup();\n }, [viewModel, isDraggable]);\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 draggingViewModel = getDragData(e.source.data);\n\n if (\n draggingViewModel &&\n viewModel.canAcceptDrop(draggingViewModel.nodeId)\n ) {\n if (onDrop) {\n onDrop(draggingViewModel.nodeId);\n } else if ('moveNodeHere' in viewModel) {\n (viewModel as ObjectNodeVM).moveNodeHere(draggingViewModel.nodeId);\n }\n }\n\n setIsDraggedOver(false);\n setIsDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingViewModel = getDragData(e.source.data);\n if (draggingViewModel) {\n setIsDraggedOver(viewModel.canAcceptDrop(draggingViewModel.nodeId));\n }\n },\n onDragLeave: () => setIsDraggedOver(false),\n });\n\n return () => cleanup();\n }, [viewModel, isDropTarget, onDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingViewModel = getDragData(e.source.data);\n\n if (!draggingViewModel) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = viewModel.canAcceptDrop(draggingViewModel.nodeId);\n\n if (canAccept) {\n setIsDrop(true);\n } else {\n setIsDisabledDrop(true);\n }\n } else {\n setIsDisabledDrop(true);\n }\n },\n onDrop: () => {\n setIsDrop(false);\n setIsDisabledDrop(false);\n },\n });\n }, [viewModel, isDropTarget]);\n\n return {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDisabledDrop,\n isDraggedOver,\n };\n};\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport {\n PiDotsSixVerticalBold,\n PiWarningCircle,\n PiWarning,\n PiFunction,\n} from 'react-icons/pi';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { ContentEditable } from '../../../components/ContentEditable';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\n\ninterface FieldEditorProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const FieldEditor: FC<FieldEditorProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, onChangeType, rightContent }) => {\n const applyHoverStyles = viewModel.shouldApplyFieldStyles;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(viewModel.name);\n const showTypeAndMenu = hasName || viewModel.isRoot;\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({ viewModel });\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 <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 size=\"md\" color=\"gray.300\">\n <PiDotsSixVerticalBold />\n </Icon>\n </Flex>\n </Tooltip>\n )}\n {viewModel.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {viewModel.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!viewModel.name}\n initValue={viewModel.name}\n placeholder={\n viewModel.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={viewModel.handleFieldBlur}\n onFocus={() => viewModel.setFocused(true)}\n onChange={viewModel.rename}\n />\n )}\n {hasName && viewModel.hasError && (\n <Tooltip\n content={viewModel.errorMessage ?? ''}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\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 </Flex>\n {showTypeAndMenu && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.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 {viewModel.hasFormula && (\n <Tooltip\n content={`Formula: ${viewModel.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 <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={viewModel.isMenuOpen}\n onOpenChange={viewModel.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {viewModel.label}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {viewModel.label}\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 } from 'react-icons/pi';\nimport { Tooltip } from '../../../components';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeIndicatorsProps {\n viewModel: BaseNodeVM;\n}\n\nexport const NodeIndicators: FC<NodeIndicatorsProps> = observer(\n ({ viewModel }) => {\n if (!viewModel.hasDescription) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\" color=\"gray.400\">\n <Tooltip\n content={viewModel.description}\n positioning={{ placement: 'top' }}\n >\n <Box cursor=\"default\">\n <PiTextT />\n </Box>\n </Tooltip>\n </Flex>\n );\n },\n);\n","import { RefObject, useCallback } from 'react';\n\n/**\n * Workaround for zag-js dismissable layer race condition bug.\n *\n * When a submenu closes, focus can briefly move to submenu content element.\n * The parent menu's onFocusOutside handler sees this as \"focus outside\"\n * and incorrectly closes the parent menu.\n *\n * This hook provides an onInteractOutside handler that prevents the parent\n * menu from closing when the interaction target is a submenu content element.\n *\n * @see https://github.com/chakra-ui/zag/commit/9817e4cb3b18d93408b95e7c827d35801b01a267\n * @see https://github.com/chakra-ui/zag/blob/main/.changeset/fix-nested-layer-dismissal.md\n *\n * This workaround can be removed when @zag-js/dismissable >= 1.34.0 is released\n * and included in @chakra-ui/react (current: 1.31.1). The fix adds recentlyRemoved\n * tracking to layerStack.isInNestedLayer() to ignore focus events during layer cleanup.\n *\n * @param contentRef - Ref to the parent menu content element\n * @returns onInteractOutside handler to pass to Menu.Root\n */\nexport function useFixZagNestedMenuDismiss(\n contentRef: RefObject<HTMLDivElement | null>,\n) {\n return useCallback(\n (e: { preventDefault: () => void }) => {\n const target = (e as unknown as { detail?: { originalEvent?: Event } })\n .detail?.originalEvent?.target;\n\n if (target instanceof Element) {\n const isSubmenuContent =\n target.closest('[data-scope=\"menu\"][data-part=\"content\"]') &&\n !contentRef.current?.contains(target);\n\n if (isSubmenuContent) {\n e.preventDefault();\n }\n }\n },\n [contentRef],\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 { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DescriptionSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.description);\n\n const handleBlur = () => {\n viewModel.setDescription(localValue);\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>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {viewModel.hasDescription && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.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 data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface FormulaSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.formula);\n\n const handleBlur = () => {\n viewModel.setFormula(localValue);\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>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {viewModel.hasFormula && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Input\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\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}-formula-input`}\n />\n {localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt=\"1\">\n Field will be readOnly\n </Box>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\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 { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DefaultValueSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n viewModel.defaultValueAsString,\n );\n\n const handleBlur = () => {\n viewModel.setDefault(localValue);\n };\n\n const handleBooleanChange = (checked: boolean) => {\n viewModel.setDefault(checked ? 'true' : 'false');\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>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {viewModel.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {viewModel.isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={viewModel.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(viewModel.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={viewModel.isNumber ? 'number' : 'text'}\n placeholder={viewModel.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 { FC } from 'react';\nimport { PiCaretRight } from 'react-icons/pi';\nimport type { FormulaDependent } from '../../model';\n\ninterface UsedByFormulasSubmenuProps {\n formulaDependents: FormulaDependent[];\n}\n\nexport const UsedByFormulasSubmenu: FC<UsedByFormulasSubmenuProps> = ({\n formulaDependents,\n}) => {\n if (formulaDependents.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <Box w=\"16px\" />\n <Box flex=\"1\">Used by formulas</Box>\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n bg=\"gray.100\"\n px=\"1.5\"\n borderRadius=\"full\"\n >\n {formulaDependents.length}\n </Box>\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"240px\">\n {formulaDependents.map((dep) => (\n <Box\n key={dep.formulaNodeId}\n py=\"1\"\n borderBottomWidth={1}\n borderColor=\"gray.100\"\n _last={{ borderBottomWidth: 0 }}\n >\n <Box fontSize=\"sm\" fontWeight=\"medium\">\n {dep.fieldName}\n </Box>\n <Box fontSize=\"xs\" color=\"gray.500\" fontFamily=\"mono\">\n {dep.expression}\n </Box>\n </Box>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\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 { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { useFixZagNestedMenuDismiss } from '../hooks/useFixZagNestedMenuDismiss';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\nimport { UsedByFormulasSubmenu } from './UsedByFormulasSubmenu';\n\ninterface NodeContextMenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeContextMenu: FC<NodeContextMenuProps> = observer(\n ({\n viewModel,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const handleInteractOutside = useFixZagNestedMenuDismiss(contentRef);\n\n const handleOpenChange = (details: { open: boolean }) => {\n viewModel.setSettingsOpen(details.open);\n };\n\n return (\n <Menu.Root\n open={viewModel.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n onInteractOutside={handleInteractOutside}\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\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n\n {showFormula && (\n <FormulaSubmenu viewModel={viewModel} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() => viewModel.setDeprecated(!viewModel.isDeprecated)}\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {viewModel.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n <UsedByFormulasSubmenu\n formulaDependents={viewModel.formulaDependents}\n />\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={viewModel.canDelete ? 'fg.error' : 'gray.400'}\n disabled={!viewModel.canDelete}\n onClick={viewModel.canDelete ? onDelete : undefined}\n title={viewModel.deleteBlockedReason ?? undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n viewModel.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 { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface NodeRightContentProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeRightContent: FC<NodeRightContentProps> = observer(\n ({ viewModel, dataTestId, showDelete = true, onDelete }) => {\n return (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface CollapsibleNodeViewProps {\n viewModel: BaseNodeVM & {\n isCollapsible: boolean;\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n children: readonly NodeVM[];\n };\n dataTestId: string;\n footer?: ReactNode;\n}\n\nexport const CollapsibleNodeView: FC<CollapsibleNodeViewProps> = observer(\n ({ viewModel, dataTestId, footer }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n showDelete={!viewModel.isRoot}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {viewModel.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {footer}\n </Flex>\n </NodeWrapper>\n );\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../components';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface ObjectNodeViewProps {\n viewModel: ObjectNodeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <CollapsibleNodeView\n viewModel={viewModel}\n dataTestId={dataTestId}\n footer={\n viewModel.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => viewModel.addProperty('')}\n />\n </Box>\n )\n }\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { CreateButton } from '../../../components';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface ArrayNodeViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n {viewModel.itemsVM && (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={viewModel} dataTestId={dataTestId} />\n </Flex>\n )}\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const hoverTargetClass = `hover-target-${itemsVm.nodeId}`;\n const applyHoverStyles = itemsVm.shouldApplyFieldStyles;\n\n return (\n <NodeWrapper\n viewModel={itemsVm}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <ArrayItemsField\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n applyHoverStyles={applyHoverStyles}\n />\n }\n >\n <ArrayItemsChildren itemsVm={itemsVm} dataTestId={`${dataTestId}-0`} />\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsFieldProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n hoverTargetClass: string;\n applyHoverStyles: boolean;\n}\n\ninterface ArrayItemsChildrenProps {\n itemsVm: NodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ itemsVm, dataTestId }) => {\n if (itemsVm instanceof ObjectNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {itemsVm.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {itemsVm.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => itemsVm.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (itemsVm instanceof ArrayNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={itemsVm} dataTestId={dataTestId} />\n </Flex>\n );\n }\n\n if (itemsVm instanceof ForeignKeyNodeVM) {\n return <ForeignKeyValue viewModel={itemsVm} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\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={viewModel.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\nconst ArrayItemsField: FC<ArrayItemsFieldProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, applyHoverStyles }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const { dragAndDropRef, isDrop, isDraggedOver, isDisabledDrop } =\n useDragAndDrop({ viewModel: itemsVm });\n\n return (\n <Flex\n ref={dragAndDropRef}\n data-testid={isDrop ? `${dataTestId}-items-drop` : undefined}\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 gap=\"0.5rem\"\n alignItems=\"center\"\n >\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={viewModel.changeItemsType}\n open={itemsVm.isMenuOpen}\n onOpenChange={itemsVm.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 {itemsVm.label}\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 <NodeIndicators viewModel={itemsVm} />\n {itemsVm.showMenu && (\n <NodeContextMenu\n viewModel={itemsVm}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface PrimitiveNodeViewProps {\n viewModel: PrimitiveNodeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n showFormula\n showDefault\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface LeafNodeViewProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n children?: ReactNode;\n}\n\nexport const LeafNodeView: FC<LeafNodeViewProps> = observer(\n ({ viewModel, dataTestId, children }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n >\n {children}\n </NodeWrapper>\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\n\ninterface ForeignKeyNodeViewProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <LeafNodeView viewModel={viewModel} dataTestId={dataTestId}>\n <ForeignKeyValue viewModel={viewModel} dataTestId={dataTestId} />\n </LeafNodeView>\n );\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\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={viewModel.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 { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { RefNodeVM } from '../../vm/RefNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface RefNodeViewProps {\n viewModel: RefNodeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (!viewModel.isCollapsible) {\n return <LeafNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n return (\n <CollapsibleNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { RefNodeVM } from '../../vm/RefNodeVM';\nimport { ObjectNodeView } from '../ObjectNodeView/ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView/ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView/PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView/ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView/RefNodeView';\n\ninterface NodeViewProps {\n viewModel: NodeVM;\n dataTestId: string;\n}\n\nexport const NodeView: FC<NodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (viewModel instanceof ObjectNodeVM) {\n return <ObjectNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ArrayNodeVM) {\n return <ArrayNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ForeignKeyNodeVM) {\n return (\n <ForeignKeyNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n if (viewModel instanceof RefNodeVM) {\n return <RefNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof PrimitiveNodeVM) {\n return (\n <PrimitiveNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n return null;\n },\n);\n","import {\n Badge,\n Box,\n Button,\n Flex,\n Icon,\n IconButton,\n Portal,\n SegmentGroup,\n Text,\n VStack,\n} 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 { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport {\n PiArrowCounterClockwiseBold,\n PiArrowRight,\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n PiWarningCircle,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport type {\n SchemaPatch,\n MetadataChangeType,\n TransformationInfo,\n DataLossSeverity,\n DefaultValueExample,\n SchemaValidationError,\n FormulaErrorInfo,\n} from '../../model';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n jsonPointerToSimplePath,\n} from '../../model';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { JsonValue } from '../../types';\n\ninterface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\ninterface ChangesPreviewDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onApprove: () => void;\n onRevert: () => void;\n patches: SchemaPatch[];\n isLoading?: boolean;\n tableId: string;\n tableIdChange?: TableIdChangeInfo;\n tableIdError?: string | null;\n validationErrors?: SchemaValidationError[];\n formulaErrors?: FormulaErrorInfo[];\n mode: 'creating' | 'updating';\n createDialogViewMode?: 'Example' | 'Schema';\n onCreateDialogViewModeChange?: (mode: 'Example' | 'Schema') => void;\n exampleData?: JsonValue;\n schemaData?: JsonValue;\n}\n\ntype PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nconst operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nconst Highlight: FC<{ children: React.ReactNode }> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n\nconst DataLossBadge: FC<{ severity: DataLossSeverity }> = ({ 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\nconst TransformationInfoRow: FC<{ info: TransformationInfo }> = ({ info }) => {\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 <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.before)}\n </Box>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.after)}\n </Box>\n </Flex>\n </VStack>\n );\n};\n\nconst 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\nconst DefaultValueRow: FC<{ example: DefaultValueExample }> = ({ 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\nconst MetadataChangesRow: FC<{ changes: MetadataChangeType[] }> = ({\n changes,\n}) => {\n const filteredChanges = changes.filter(\n (change) =>\n change !== 'formula' &&\n change !== 'default' &&\n change !== 'description' &&\n change !== 'deprecated' &&\n change !== 'foreignKey' &&\n change !== 'contentMediaType',\n );\n\n if (filteredChanges.length === 0) {\n return null;\n }\n\n return (\n <Flex align=\"center\" gap={2} fontSize=\"xs\" pl={2} flexWrap=\"wrap\">\n {filteredChanges.map((change) => (\n <Badge key={change} size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {change}\n </Badge>\n ))}\n </Flex>\n );\n};\n\nconst CodeBox: FC<{ children: React.ReactNode }> = ({ 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\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nconst 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\nconst formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '(none)';\n }\n return JSON.stringify(value);\n};\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nconst getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nconst OperationDescription: FC<{ schemaPatch: SchemaPatch }> = ({\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\nconst PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const {\n patch,\n metadataChanges,\n typeChange,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = 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) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\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 {formulaChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"formula\"\n fromValue={formatChangeValue(formulaChange.fromFormula)}\n toValue={formatChangeValue(formulaChange.toFormula)}\n />\n </Box>\n )}\n\n {defaultChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"default\"\n fromValue={formatChangeValue(defaultChange.fromDefault)}\n toValue={formatChangeValue(defaultChange.toDefault)}\n />\n </Box>\n )}\n\n {descriptionChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"description\"\n fromValue={formatChangeValue(descriptionChange.fromDescription)}\n toValue={formatChangeValue(descriptionChange.toDescription)}\n />\n </Box>\n )}\n\n {deprecatedChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"deprecated\"\n fromValue={formatChangeValue(deprecatedChange.fromDeprecated)}\n toValue={formatChangeValue(deprecatedChange.toDeprecated)}\n />\n </Box>\n )}\n\n {foreignKeyChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"foreignKey\"\n fromValue={formatChangeValue(foreignKeyChange.fromForeignKey)}\n toValue={formatChangeValue(foreignKeyChange.toForeignKey)}\n />\n </Box>\n )}\n\n {contentMediaTypeChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"contentMediaType\"\n fromValue={formatChangeValue(\n contentMediaTypeChange.fromContentMediaType,\n )}\n toValue={formatChangeValue(\n contentMediaTypeChange.toContentMediaType,\n )}\n />\n </Box>\n )}\n\n {!transformationInfo && metadataChanges.length > 0 && (\n <Box mt={2} ml={8}>\n <MetadataChangesRow changes={metadataChanges} />\n </Box>\n )}\n </Box>\n );\n});\n\nconst TableIdChangeRow: FC<{ change: TableIdChangeInfo }> = ({ 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\ninterface ErrorItemProps {\n message: string;\n type?: 'validation' | 'formula' | 'tableId';\n fieldPath?: string;\n}\n\nconst 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\ninterface ErrorsListProps {\n validationErrors: SchemaValidationError[];\n formulaErrors: FormulaErrorInfo[];\n tableIdError?: string | null;\n}\n\nconst ErrorsList: FC<ErrorsListProps> = ({\n validationErrors,\n formulaErrors,\n tableIdError,\n}) => (\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 align=\"stretch\" gap={0} divideY=\"1px\" divideColor=\"gray.100\">\n {tableIdError && (\n <ErrorItem key=\"tableId-error\" message={tableIdError} type=\"tableId\" />\n )}\n {validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {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);\n\nexport const ChangesPreviewDialog: FC<ChangesPreviewDialogProps> = observer(\n ({\n isOpen,\n onClose,\n onApprove,\n onRevert,\n patches,\n isLoading,\n tableId,\n tableIdChange,\n tableIdError,\n validationErrors = [],\n formulaErrors = [],\n mode,\n createDialogViewMode = 'Example',\n onCreateDialogViewModeChange,\n exampleData,\n schemaData,\n }) => {\n const isCreating = mode === 'creating';\n const hasSchemaChanges = patches.length > 0;\n const hasTableIdChange = Boolean(tableIdChange);\n const hasChanges = hasSchemaChanges || hasTableIdChange;\n const hasErrors =\n validationErrors.length > 0 ||\n formulaErrors.length > 0 ||\n Boolean(tableIdError);\n const canCreate = !hasErrors;\n const canUpdate = hasChanges && !hasErrors;\n const canApply = isCreating ? canCreate : canUpdate;\n const totalChangesCount = patches.length + (hasTableIdChange ? 1 : 0);\n const applyButtonText = isCreating\n ? 'Create Table'\n : `Apply Changes (${totalChangesCount})`;\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=\"700px\">\n <DialogHeader>\n <DialogTitle>\n {isCreating\n ? `Create Table \"${tableId}\"`\n : `Review Changes for \"${tableId}\"`}\n </DialogTitle>\n </DialogHeader>\n\n <DialogBody>\n <VStack align=\"stretch\" gap={4}>\n {hasErrors && (\n <ErrorsList\n validationErrors={validationErrors}\n formulaErrors={formulaErrors}\n tableIdError={tableIdError}\n />\n )}\n\n {!hasErrors && hasChanges && !isCreating && (\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 {tableIdChange && (\n <TableIdChangeRow change={tableIdChange} />\n )}\n {patches.map((schemaPatch) => (\n <PatchRow\n key={schemaPatch.patch.path}\n schemaPatch={schemaPatch}\n />\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 {!hasErrors && !hasChanges && !isCreating && (\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 {!hasErrors && isCreating && (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={createDialogViewMode}\n onValueChange={(details) =>\n onCreateDialogViewModeChange?.(\n details.value as 'Example' | 'Schema',\n )\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 {createDialogViewMode === 'Example' ? (\n <JsonCard readonly data={exampleData ?? null} />\n ) : (\n <JsonCard readonly data={schemaData ?? null} />\n )}\n </Box>\n </>\n )}\n </VStack>\n </DialogBody>\n\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {isCreating ? (\n <Box />\n ) : (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRevert}\n disabled={!hasChanges && !hasErrors}\n title=\"Revert all changes\"\n >\n <PiArrowCounterClockwiseBold />\n </IconButton>\n )}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n {!hasErrors && (\n <Button\n variant=\"outline\"\n onClick={onApprove}\n disabled={!canApply}\n loading={isLoading}\n >\n {applyButtonText}\n </Button>\n )}\n </Flex>\n </Flex>\n </DialogFooter>\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { ViewerSwitcherMode, type JsonValue } from '../../types';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { CloseButton } from '../../../components';\nimport { BackButton } from '../../../components/BackButton';\nimport { JsonCard } from '../../../components/JsonCard';\nimport { SchemaEditorVM } from '../../vm';\nimport { NodeView } from '../NodeView/NodeView';\nimport { ChangesPreviewDialog } from '../ChangesPreviewDialog/ChangesPreviewDialog';\n\nexport interface SchemaEditorProps {\n model: SchemaEditorVM;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(({ model }) => {\n const handleApproveClick = () => {\n model.openChangesDialog();\n };\n\n const handleRevert = () => {\n model.revert();\n model.closeChangesDialog();\n };\n\n const editorHoverStyles = {\n '&:hover .editor-hover-target': { opacity: 1 },\n };\n\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={editorHoverStyles}\n data-testid=\"schema-editor-v2\"\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {model.mode === 'creating' ? (\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={model.cancel}\n />\n ) : (\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={model.cancel}\n />\n )}\n {model.mode === 'creating' ? (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-create-button\"\n >\n {model.hasErrors ? 'Review Errors' : 'Create Table'}\n </Button>\n ) : (\n (model.isDirty || model.hasErrors) && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-approve-button\"\n >\n {model.hasErrors\n ? 'Review Errors'\n : `Apply Changes (${model.totalChangesCount})`}\n </Button>\n )\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={model.viewMode}\n onChange={model.setViewMode}\n />\n </Box>\n </Flex>\n {model.viewMode === ViewerSwitcherMode.Tree && (\n <Box paddingBottom=\"4rem\">\n <NodeView viewModel={model.rootNodeVM} dataTestId=\"root\" />\n </Box>\n )}\n {model.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={model.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ChangesPreviewDialog\n isOpen={model.isChangesDialogOpen}\n onClose={model.closeChangesDialog}\n onApprove={model.approve}\n onRevert={handleRevert}\n patches={model.getPatches()}\n isLoading={model.loading}\n tableId={model.tableId}\n tableIdChange={\n model.isTableIdChanged\n ? {\n initialTableId: model.initialTableId,\n currentTableId: model.tableId,\n }\n : undefined\n }\n tableIdError={model.tableIdError}\n validationErrors={model.validationErrors as never}\n formulaErrors={model.formulaErrors as never}\n mode={model.mode}\n createDialogViewMode={model.createDialogViewMode}\n onCreateDialogViewModeChange={model.setCreateDialogViewMode}\n exampleData={model.getExampleData() as JsonValue}\n schemaData={model.getPlainSchema() as unknown as JsonValue}\n />\n </Flex>\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.mjs","names":["React","ChakraTooltip","Menu"],"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 _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('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#039;');\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":";;;;;;;;;;;;;;;;;;;;;AAEA,IAAa,YAAb,MAAuB;CACrB,AAAiB,iBAAiB,WAAW,KAAsB;CACnE,AAAiB,gBAAgB,WAAW,KAAsB;CAClE,AAAiB,iBAAiB,WAAW,KAAsB;CACnE,AAAiB,qBAAqB,WAAW,KAAsB;CACvE,AAAiB,aAAa,WAAW,KAAsB;CAC/D,AAAiB,qBAAqB,WAAW,KAAsB;CACvE,AAAiB,oBAAoB,WAAW,KAAsB;CACtE,AAAiB,sBAAsB,WAAW,KAAqB;CACvE,AAAQ,gBAA+B;CAEvC,cAAc;AACZ,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,eAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,gBAAgB,QAA6B;AAClD,OAAK,gBAAgB;;CAGvB,AAAO,SAAS,QAAyB;AACvC,SAAO,KAAK,kBAAkB;;CAGhC,AAAO,qBAAqB,QAAwB;AAClD,SAAO,KAAK,oBAAoB,IAAI,OAAO,IAAI;;CAGjD,AAAO,aAAa,QAAsB;EACxC,MAAM,UAAU,KAAK,oBAAoB,IAAI,OAAO,IAAI;AACxD,OAAK,oBAAoB,IAAI,QAAQ,UAAU,EAAE;;CAGnD,AAAO,WAAW,QAAyB;AACzC,SAAO,KAAK,eAAe,IAAI,OAAO,IAAI;;CAG5C,AAAO,YAAY,QAAgB,OAAsB;AACvD,OAAK,eAAe,IAAI,QAAQ,MAAM;;CAGxC,AAAO,eAAe,QAAsB;AAC1C,OAAK,eAAe,IAAI,QAAQ,CAAC,KAAK,WAAW,OAAO,CAAC;;CAG3D,AAAO,UAAU,QAAyB;AACxC,SAAO,KAAK,cAAc,IAAI,OAAO,IAAI;;CAG3C,AAAO,WAAW,QAAgB,OAAsB;AACtD,OAAK,cAAc,IAAI,QAAQ,MAAM;;CAGvC,AAAO,WAAW,QAAyB;AACzC,SAAO,KAAK,eAAe,IAAI,OAAO,IAAI;;CAG5C,AAAO,YAAY,QAAgB,OAAsB;AACvD,OAAK,eAAe,IAAI,QAAQ,MAAM;;CAGxC,AAAO,eAAe,QAAyB;AAC7C,SAAO,KAAK,mBAAmB,IAAI,OAAO,IAAI;;CAGhD,AAAO,gBAAgB,QAAgB,OAAsB;AAC3D,OAAK,mBAAmB,IAAI,QAAQ,MAAM;;CAG5C,AAAO,OAAO,QAAyB;AACrC,SAAO,KAAK,WAAW,IAAI,OAAO,IAAI;;CAGxC,AAAO,QAAQ,QAAgB,OAAsB;AACnD,OAAK,WAAW,IAAI,QAAQ,MAAM;;CAGpC,AAAO,eAAe,QAAyB;AAC7C,SAAO,KAAK,mBAAmB,IAAI,OAAO,IAAI;;CAGhD,AAAO,gBAAgB,QAAgB,OAAsB;AAC3D,OAAK,mBAAmB,IAAI,QAAQ,MAAM;;CAG5C,AAAO,cAAc,QAAyB;AAC5C,SAAO,KAAK,kBAAkB,IAAI,OAAO,IAAI;;CAG/C,AAAO,eAAe,QAAgB,OAAsB;AAC1D,OAAK,kBAAkB,IAAI,QAAQ,MAAM;;CAG3C,AAAO,UAAU,QAAsB;AACrC,OAAK,eAAe,OAAO,OAAO;AAClC,OAAK,cAAc,OAAO,OAAO;AACjC,OAAK,eAAe,OAAO,OAAO;AAClC,OAAK,mBAAmB,OAAO,OAAO;AACtC,OAAK,WAAW,OAAO,OAAO;AAC9B,OAAK,mBAAmB,OAAO,OAAO;AACtC,OAAK,kBAAkB,OAAO,OAAO;AACrC,OAAK,oBAAoB,OAAO,OAAO;;CAGzC,AAAO,YAAY,SAAmB,kBAAiC;AACrE,OAAK,MAAM,UAAU,QACnB,MAAK,eAAe,IAAI,QAAQ,MAAM;AAExC,MAAI,kBAAkB;GACpB,MAAM,cAAc,QAAQ;AAC5B,OAAI,gBAAgB,OAClB,MAAK,eAAe,IAAI,aAAa,KAAK;;;CAKhD,AAAO,UAAU,SAAyB;AACxC,OAAK,MAAM,UAAU,QACnB,MAAK,eAAe,IAAI,QAAQ,KAAK;;CAIzC,AAAO,QAAc;AACnB,OAAK,eAAe,OAAO;AAC3B,OAAK,cAAc,OAAO;AAC1B,OAAK,eAAe,OAAO;AAC3B,OAAK,mBAAmB,OAAO;AAC/B,OAAK,WAAW,OAAO;AACvB,OAAK,mBAAmB,OAAO;AAC/B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,oBAAoB,OAAO;AAChC,OAAK,gBAAgB;;;;;;ACxHzB,IAAa,eAAb,MAA0B;CACxB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAEhB,YACE,AAAiB,OACjB,MACA,AAAiB,UAAmB,OACpC,AAAiB,cAAuB,OACxC;EAJiB;EAEA;EACA;AAEjB,OAAK,QAAQ,KAAK;AAClB,OAAK,QAAQ,KAAK;AAClB,OAAK,UAAU,KAAK;AACpB,OAAK,aAAa,KAAK;AACvB,OAAK,UAAU,KAAK;AAEpB,qBACE,MACA;GACE,OAAO;GACP,OAAO;GACP,SAAS;GACT,YAAY;GACZ,SAAS;GACV,EACD,EAAE,UAAU,MAAM,CACnB;;CAGH,IAAW,SAAiB;AAC1B,SAAO,KAAK,MAAM,IAAI;;CAGxB,IAAW,SAAkB;AAC3B,SAAO,KAAK;;CAGd,IAAW,aAAsB;AAC/B,SAAO,KAAK;;CAGd,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,SAAS;;CAG7B,IAAW,cAAuB;AAChC,SAAO,KAAK,MAAM,aAAa;;CAGjC,IAAW,QAAiB;AAC1B,SAAO,KAAK,MAAM,OAAO;;CAG3B,IAAW,MAA0B;AACnC,MAAI,KAAK,MAAM,OAAO,CACpB,QAAO,KAAK,MAAM,KAAK;;CAK3B,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM;;CAGpB,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM,cAAc;;CAGlC,IAAW,uBAA+B;EACxC,MAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,UAAa,UAAU,KACnC,QAAO;AAET,UAAQ,OAAO,OAAf;GACE,KAAK,SACH,QAAO;GACT,KAAK;GACL,KAAK,UACH,QAAO,OAAO,MAAM;GACtB,QACE,QAAO,KAAK,UAAU,MAAM;;;CAIlC,IAAW,mBAA2B;AACpC,SAAO,gBAAgB,KAAK;;CAG9B,IAAW,yBAAkC;AAC3C,SACE,CAAC,KAAK,MAAM,aACZ,CAAC,KAAK,MAAM,cACZ,CAAC,KAAK,MAAM;;CAIhB,IAAW,WAAoB;AAC7B,SAAO,CAAC,KAAK;;CAGf,AAAO,kBAAwB;AAC7B,OAAK,MAAM,WAAW,MAAM;AAC5B,MAAI,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,QAC9B,MAAK,QAAQ,QAAQ;;;;;;AC3H3B,IAAa,YAAb,MAAuB;CACrB,YACE,AAAiB,SACjB,AAAiB,YACjB;EAFiB;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,aAAsB;AAC/B,SAAO,KAAK,WAAW,WAAW,KAAK,QAAQ;;CAGjD,AAAO,iBAAuB;AAC5B,OAAK,WAAW,eAAe,KAAK,QAAQ;;CAG9C,IAAW,YAAqB;AAC9B,SAAO,KAAK,WAAW,UAAU,KAAK,QAAQ;;CAGhD,AAAO,WAAW,OAAsB;AACtC,MAAI,MACF,MAAK,WAAW,gBAAgB,KAAK,QAAQ;AAE/C,OAAK,WAAW,WAAW,KAAK,SAAS,MAAM;;CAGjD,IAAW,aAAsB;AAC/B,SAAO,KAAK,WAAW,WAAW,KAAK,QAAQ;;CAGjD,AAAO,YAAY,OAAsB;AACvC,MAAI,MACF,MAAK,WAAW,gBAAgB,KAAK,QAAQ;AAE/C,OAAK,WAAW,YAAY,KAAK,SAAS,MAAM;;CAGlD,IAAW,iBAA0B;AACnC,SAAO,KAAK,WAAW,eAAe,KAAK,QAAQ;;CAGrD,AAAO,gBAAgB,OAAsB;AAC3C,MAAI,MACF,MAAK,WAAW,gBAAgB,KAAK,QAAQ;AAE/C,OAAK,WAAW,gBAAgB,KAAK,SAAS,MAAM;;CAGtD,IAAW,SAAkB;AAC3B,SAAO,KAAK,WAAW,OAAO,KAAK,QAAQ;;CAG7C,AAAO,QAAQ,OAAsB;AACnC,OAAK,WAAW,QAAQ,KAAK,SAAS,MAAM;;CAG9C,IAAW,iBAA0B;AACnC,SAAO,KAAK,WAAW,eAAe,KAAK,QAAQ;;CAGrD,AAAO,gBAAgB,OAAsB;AAC3C,OAAK,WAAW,gBAAgB,KAAK,SAAS,MAAM;;CAGtD,IAAW,gBAAyB;AAClC,SAAO,KAAK,WAAW,cAAc,KAAK,QAAQ;;CAGpD,AAAO,eAAe,OAAsB;AAC1C,OAAK,WAAW,eAAe,KAAK,SAAS,MAAM;;CAGrD,IAAW,WAAoB;AAC7B,SAAO,KAAK,WAAW,SAAS,KAAK,QAAQ;;CAG/C,AAAO,WAAiB;AACtB,OAAK,WAAW,gBAAgB,KAAK,QAAQ;;CAG/C,IAAW,oBAA4B;AACrC,SAAO,KAAK,WAAW,qBAAqB,KAAK,QAAQ;;CAG3D,AAAO,eAAqB;AAC1B,OAAK,WAAW,aAAa,KAAK,QAAQ;;;;;;ACvF9C,MAAM,uBAA+C;EAClD,gBAAgB,QAAQ;EACxB,gBAAgB,eAAe;EAC/B,gBAAgB,eAAe;EAC/B,gBAAgB,eAAe;EAC/B,gBAAgB,iBAAiB;EACjC,gBAAgB,eAAe;EAC/B,gBAAgB,UAAU;EAC1B,gBAAgB,gBAAgB;EAChC,gBAAgB,OAAO;CACzB;AAED,MAAa,iBAAiB,QAAwB;AACpD,QAAO,qBAAqB,QAAQ;;AAGtC,IAAY,wDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAyBF,MAAM,eAAiC;CACrC;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAS,OAAO;EAAW;CAC/C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAO,OAAO;EAAS;CAC3C;EAAE,IAAI,cAAc;EAAkB,OAAO;EAAe;CAC7D;AAED,MAAM,iBAAmC,CACvC;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO,CACL;EAAE,IAAI,cAAc;EAAM,OAAO,cAAc,gBAAgB,KAAK;EAAE,EACtE;EAAE,IAAI,cAAc;EAAU,OAAO;EAAY,CAClD;CACF,CACF;AAED,MAAM,sBAAwC,CAC5C;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO;EACL;GAAE,IAAI,cAAc;GAAO,OAAO,cAAc,gBAAgB,MAAM;GAAE;EACxE;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,eAAe;GACrD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,QAAQ;GAC9C;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,cAAc;GACpD;EACF;CACF,CACF;AAED,MAAa,iBAA8B;CACzC;EAAE,IAAI;EAAS,SAAS;EAAc,iBAAiB;EAAM;CAC7D;EAAE,IAAI;EAAW,SAAS;EAAgB,iBAAiB;EAAM;CACjE;EAAE,IAAI;EAAiB,SAAS;EAAqB;CACtD;;;;ACzHD,IAAa,YAAb,MAAuB;CACrB,YACE,AAAiB,OACjB,AAAiB,aACjB,AAAiB,SACjB;EAHiB;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,OAAe;AACxB,MAAI,KAAK,QACP,QAAO,KAAK,aAAa;AAE3B,SAAO,KAAK,MAAM,MAAM;;CAG1B,IAAW,WAAmB;AAC5B,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,YAAoB;AAC7B,MAAI,KAAK,MAAM,OAAO,CACpB,QAAO,KAAK,aAAa;AAE3B,MAAI,KAAK,MAAM,UAAU,CACvB,QAAO;AAET,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO;AAET,MAAI,KAAK,MAAM,YAAY,KAAK,OAC9B,QAAO;AAET,MAAI,KAAK,MAAM,oBAAoB,KAAK,gBACtC,QAAO;AAET,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,cAAkC;AAC3C,SAAO,KAAK,MAAM,UAAU,CAAC;;CAG/B,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM,UAAU,CAAC,cAAc;;CAG7C,IAAW,kBAAsC;AAC/C,SAAO,KAAK,MAAM,YAAY;;CAGhC,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM,YAAY,KAAK;;CAGrC,AAAQ,cAAsB;EAC5B,MAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,MAAI,CAAC,IACH,QAAO;AAET,SAAO,cAAc,IAAI;;;;;;ACzD7B,IAAa,cAAb,MAAyB;CACvB,AAAQ,cAA6B;CACrC,AAAQ,cAA6B;CAErC,YACE,AAAiB,OACjB,AAAiB,cACjB;EAFiB;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,aAAsB;AAC/B,SAAO,KAAK,MAAM,YAAY;;CAGhC,IAAW,cAAgC;AACzC,SAAO,KAAK,aAAa;;CAG3B,IAAW,gBAAwB;AAEjC,SADgB,KAAK,MAAM,SAAS,EACpB,YAAY,IAAI;;CAGlC,IAAW,UAAkB;AAC3B,MAAI,KAAK,gBAAgB,KACvB,QAAO,KAAK;AAEd,MAAI,CAAC,KAAK,WACR,QAAO;EAET,MAAM,aAAa,KAAK,aAAa,iBAAiB,KAAK,MAAM,IAAI,CAAC;AACtE,MAAI,WACF,QAAO;AAET,SAAO,KAAK;;CAGd,IAAW,aAA4B;AACrC,SAAO,KAAK;;CAGd,IAAW,aAA4B;AACrC,SAAO,KAAK;;CAGd,IAAW,cAAkC;AAG3C,SAFe,KAAK,aAAa,cACZ,MAAM,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC,EAChD;;CAGhB,IAAW,WAAoB;AAC7B,SAAO,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB;;CAG3D,IAAW,eAAmC;AAC5C,SAAO,KAAK,eAAe,KAAK;;CAGlC,AAAO,cAAc,OAAqB;AACxC,OAAK,cAAc;AACnB,OAAK,cAAc;;CAGrB,AAAO,aAAmB;AACxB,OAAK,cAAc;AACnB,OAAK,cAAc;;CAGrB,AAAQ,yBAAkC;AAExC,SADe,KAAK,aAAa,cACnB,MAAM,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;;CAGzD,AAAO,eAAwB;AAC7B,MAAI,KAAK,gBAAgB,KACvB,QAAO;EAGT,MAAM,UAAU,KAAK,YAAY,MAAM;AAEvC,MAAI;AACF,QAAK,aAAa,cAAc,KAAK,MAAM,IAAI,EAAE,WAAW,OAAU;AAEtE,OAAI,KAAK,wBAAwB,CAC/B,QAAO;AAGT,QAAK,YAAY;AACjB,UAAO;WACA,OAAO;AACd,qBAAkB;AAChB,SAAK,cACH,iBAAiB,QAAQ,MAAM,UAAU;KAC3C;AACF,UAAO;;;;;;;ACnGb,IAAa,iBAAb,MAA4B;CAC1B,YACE,AAAiB,OACjB,AAAiB,cACjB,AAAiB,UACjB,AAAiB,kBACjB,AAAiB,SACjB;EALiB;EACA;EACA;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,cAAkC;AAG3C,SAFe,KAAK,aAAa,iBACZ,MAAM,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC,EAChD;;CAGhB,IAAW,eAA8B;AACvC,MAAI,KAAK,QACP,QAAO,KAAK,kBAAkB;AAEhC,SAAO;;CAGT,IAAW,eAAmC;AAC5C,SAAO,KAAK,SAAS;;CAGvB,IAAW,WAAoB;AAC7B,SACE,KAAK,gBAAgB,UACrB,KAAK,iBAAiB,QACtB,KAAK,iBAAiB;;CAI1B,IAAW,eAAmC;AAC5C,SAAO,KAAK,eAAe,KAAK,gBAAgB,KAAK;;;;;;ACvCzD,MAAM,wBAAmD;CACvD,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,OAAO;CACR;AAED,SAAgB,kBAAkB,QAAkC;AAClE,QAAO,sBAAsB,WAAW;;;;;ACK1C,IAAa,cAAb,MAAyB;CACvB,YACE,AAAiB,OACjB,AAAiB,cACjB,AAAiB,YACjB,AAAiB,SACjB,AAAiB,aACjB;EALiB;EACA;EACA;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,YAAqB;AAC9B,SAAO,CAAC,KAAK,eAAe,CAAC,KAAK;;CAGpC,IAAW,iBAA0B;AACnC,SAAO,CAAC,KAAK,eAAe,KAAK,MAAM,UAAU;;CAGnD,AAAO,OAAO,SAAuB;AACnC,MAAI,KAAK,YACP;AAGF,MAAI,KAAK,SAAS;AAChB,QAAK,WAAW,YAAY,QAAQ;AACpC;;AAGF,MAAI,YAAY,KAAK,MAAM,MAAM,CAC/B,MAAK,aAAa,YAAY,KAAK,MAAM,IAAI,EAAE,QAAQ;;CAI3D,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,eAAe,KAAK,QAC3B;AAGF,MAAI,WAAW,oBAAoB;AACjC,QAAK,oBAAoB;AACzB;;AAGF,MAAI,WAAW,YAAY;AACzB,QAAK,kBAAkB;AACvB;;EAGF,MAAM,SAAS,KAAK,eAAe,OAAO;AAC1C,MAAI,QAAQ;GACV,MAAM,YAAY,KAAK,MAAM,IAAI;GACjC,MAAM,UAAU,KAAK,aAAa,gBAAgB,WAAW,EAC3D,MAAM,QACP,CAAC;AAEF,OAAI,CAAC,QAAQ,QAAQ,CACnB,MAAK,WAAW,eAAe,WAAW,QAAQ,IAAI,CAAC;AAEzD;;EAGF,MAAM,YAAY,kBAAkB,OAAO;AAC3C,MAAI,CAAC,UACH;EAGF,MAAM,YAAY,KAAK,MAAM,IAAI;EACjC,MAAM,UAAU,KAAK,aAAa,gBAAgB,WAAW,UAAU;AAEvE,MAAI,CAAC,QAAQ,QAAQ,EAAE;AACrB,QAAK,aAAa,iBAAiB,QAAQ,IAAI,EAAE,OAAU;AAC3D,QAAK,WAAW,eAAe,WAAW,QAAQ,IAAI,CAAC;;;CAI3D,AAAQ,qBAA2B;EACjC,MAAM,YAAY,KAAK,MAAM,IAAI;EACjC,IAAI,SAAS;AAEb,MAAI,KAAK,MAAM,UAAU,KAAK,SAE5B,UADgB,KAAK,aAAa,gBAAgB,WAAW,SAAS,CACrD,IAAI;AAGvB,OAAK,aAAa,iBAAiB,QAAQ,GAAG;AAC9C,OAAK,WAAW,eAAe,WAAW,OAAO;;CAGnD,AAAQ,mBAAyB;EAC/B,MAAM,YAAY,KAAK,MAAM,IAAI;EACjC,IAAI,OAAO,KAAK;AAEhB,MAAI,KAAK,UAAU,KAAK,SACtB,QAAO,KAAK,aAAa,gBAAgB,WAAW,SAAS;AAG/D,OAAK,oBAAoB,gBAAgB;AACzC,OAAK,WAAW,eAAe,WAAW,KAAK,IAAI,CAAC;;CAGtD,AAAO,SAAe;AACpB,MAAI,KAAK,eAAe,KAAK,QAC3B;EAGF,MAAM,SAAS,KAAK,MAAM,IAAI;AAG9B,MAFgB,KAAK,aAAa,YAAY,OAAO,CAGnD,MAAK,WAAW,cAAc,OAAO;;CAIzC,AAAO,YAAY,OAAe,IAAuB;AACvD,MAAI,KAAK,eAAe,CAAC,KAAK,MAAM,UAAU,CAC5C,QAAO;EAGT,MAAM,UAAU,KAAK,aAAa,SAAS,KAAK,MAAM,IAAI,EAAE,MAAM,SAAS;AAE3E,MAAI,CAAC,QAAQ,QAAQ,EAAE;AACrB,QAAK,WAAW,YAAY,QAAQ,IAAI,CAAC;AACzC,UAAO;;AAGT,SAAO;;CAGT,AAAO,cAAc,OAAe,MAAiC;AACnE,MAAI,KAAK,eAAe,CAAC,KAAK,MAAM,UAAU,CAC5C,QAAO;EAGT,MAAM,UAAU,KAAK,aAAa,cAChC,KAAK,MAAM,IAAI,EACf,OACA,MACA,SACD;AAED,MAAI,CAAC,QAAQ,QAAQ,EAAE;AACrB,QAAK,WAAW,YAAY,QAAQ,IAAI,CAAC;AACzC,UAAO;;AAGT,SAAO;;CAGT,AAAO,eAAe,aAAuC;AAC3D,MAAI,KAAK,YACP;AAEF,OAAK,aAAa,eAAe,KAAK,MAAM,IAAI,EAAE,EAChD,aAAa,eAAe,QAC7B,CAAC;;CAGJ,AAAO,cAAc,YAA2B;AAC9C,MAAI,KAAK,YACP;AAEF,OAAK,aAAa,eAAe,KAAK,MAAM,IAAI,EAAE,EAChD,YAAY,cAAc,QAC3B,CAAC;;CAGJ,AAAO,gBAAgB,OAAsB;AAC3C,MAAI,KAAK,YACP;AAEF,OAAK,aAAa,mBAAmB,KAAK,MAAM,IAAI,EAAE,MAAM;;CAG9D,AAAO,cAAc,SAAmC;AACtD,MAAI,KAAK,YACP;AAGF,MAAI,YAAY,QAAW;AACzB,QAAK,aAAa,iBAAiB,KAAK,MAAM,IAAI,EAAE,OAAU;AAC9D;;AAGF,MAAI,KAAK,MAAM,YAAY,KAAK,QAAW;GACzC,MAAM,YAAY,KAAK,MAAM,IAAI;AACjC,OAAI,KAAK,MAAM,UAAU,KAAK,UAAU;IACtC,MAAM,UAAU,KAAK,aAAa,gBAAgB,WAAW,SAAS;AACtE,SAAK,aAAa,iBAAiB,QAAQ,IAAI,EAAE,QAAQ;AACzD,SAAK,WAAW,eAAe,WAAW,QAAQ,IAAI,CAAC;SAEvD,MAAK,aAAa,iBAAiB,WAAW,QAAQ;QAGxD,MAAK,aAAa,iBAAiB,KAAK,MAAM,IAAI,EAAE,QAAQ;;CAIhE,AAAO,gBAAgB,QAAsB;AAC3C,MAAI,KAAK,eAAe,CAAC,KAAK,MAAM,SAAS,CAC3C;EAGF,MAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,MAAM,QAAQ,CAChB;EAGF,MAAM,YAAY,MAAM,IAAI;AAE5B,MAAI,WAAW,oBAAoB;AACjC,QAAK,wBAAwB,OAAO,UAAU;AAC9C;;AAGF,MAAI,WAAW,YAAY;AACzB,QAAK,sBAAsB,OAAO,UAAU;AAC5C;;EAGF,MAAM,SAAS,KAAK,eAAe,OAAO;AAC1C,MAAI,QAAQ;GACV,MAAM,UAAU,KAAK,aAAa,gBAAgB,WAAW,EAC3D,MAAM,QACP,CAAC;AAEF,OAAI,CAAC,QAAQ,QAAQ,CACnB,MAAK,WAAW,eAAe,WAAW,QAAQ,IAAI,CAAC;AAEzD;;EAGF,MAAM,YAAY,kBAAkB,OAAO;AAC3C,MAAI,CAAC,UACH;EAGF,MAAM,UAAU,KAAK,aAAa,gBAAgB,WAAW,UAAU;AAEvE,MAAI,CAAC,QAAQ,QAAQ,EAAE;AACrB,QAAK,aAAa,iBAAiB,QAAQ,IAAI,EAAE,OAAU;AAC3D,QAAK,WAAW,eAAe,WAAW,QAAQ,IAAI,CAAC;;;CAI3D,AAAQ,wBAAwB,OAAmB,WAAyB;EAC1E,IAAI,SAAS;AAEb,MAAI,MAAM,UAAU,KAAK,SAEvB,UADgB,KAAK,aAAa,gBAAgB,WAAW,SAAS,CACrD,IAAI;AAGvB,OAAK,aAAa,iBAAiB,QAAQ,GAAG;AAC9C,OAAK,WAAW,eAAe,WAAW,OAAO;;CAGnD,AAAQ,sBAAsB,OAAmB,WAAyB;EACxE,IAAI,OAAO;AAEX,MAAI,MAAM,UAAU,KAAK,SACvB,QAAO,KAAK,aAAa,gBAAgB,WAAW,SAAS;AAG/D,OAAK,oBAAoB,gBAAgB;AACzC,OAAK,WAAW,eAAe,WAAW,KAAK,IAAI,CAAC;;CAGtD,MAAa,mBAAkC;EAC7C,MAAM,UAAU,MAAM,KAAK,WAAW,kBAAkB;AACxD,MAAI,YAAY,KACd,MAAK,cAAc,QAAQ;;CAI/B,AAAQ,eAAe,QAA+B;AAYpD,SAXwC;GACtC,MAAM,gBAAgB;GACtB,OAAO,gBAAgB;GACvB,cAAc,gBAAgB;GAC9B,cAAc,gBAAgB;GAC9B,cAAc,gBAAgB;GAC9B,gBAAgB,gBAAgB;GAChC,cAAc,gBAAgB;GAC9B,SAAS,gBAAgB;GACzB,eAAe,gBAAgB;GAChC,CACc,WAAW;;;;;;ACtR9B,IAAa,sBAAb,MAAiC;CAC/B,AAAO,OACL,MACA,SACA,SAAkB,OAClB,aAAsB,OACR;EACd,MAAM,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,QAAQ,UAAU;EACzD,MAAM,QAAQ,IAAI,UAAU,MAAM,QAAQ,YAAY,OAAO;EAC7D,MAAM,UAAU,IAAI,YAAY,MAAM,QAAQ,YAAY;AAgB1D,SAAO,IAAI,aACT,MACA;GAAE;GAAO;GAAO;GAAS,YAjBR,IAAI,eACrB,MACA,QAAQ,aACR,SACA,QAAQ,iBACR,OACD;GAWsC,SAVvB,IAAI,YAClB,MACA,QAAQ,aACR,QAAQ,WACR,QACA,WACD;GAI+C,EAC9C,QACA,WACD;;;;;;AChDL,IAAa,gBAAb,MAA2B;CACzB,AAAiB,yBAAS,IAAI,KAA2B;CAEzD,YACE,AAAiB,iBACjB,AAAiB,aACjB,AAAiB,kBACjB;EAHiB;EACA;EACA;;CAGnB,AAAO,IACL,QACA,SAAkB,OAClB,aAAsB,OACR;EACd,MAAM,SAAS,KAAK,OAAO,IAAI,OAAO;AACtC,MAAI,OACF,QAAO;EAGT,MAAM,OAAO,KAAK,iBAAiB,CAAC,SAAS,OAAO;EACpD,MAAM,WAAW,KAAK,iBAAiB,OACrC,MACA,KAAK,aAAa,EAClB,QACA,WACD;AACD,OAAK,OAAO,IAAI,QAAQ,SAAS;AACjC,SAAO;;CAGT,AAAO,YACL,cACA,mBAA4B,OACZ;EAChB,MAAM,aAAa,KAAK,iBAAiB,CAAC,SAAS,aAAa;AAChE,MAAI,WAAW,QAAQ,CACrB,QAAO,EAAE;EAGX,MAAM,mBAAmB,oBAAoB,WAAW,OAAO;AAE/D,MAAI,WAAW,UAAU,CACvB,QAAO,WACJ,YAAY,CACZ,KAAK,UAAU,KAAK,IAAI,MAAM,IAAI,EAAE,OAAO,iBAAiB,CAAC;AAGlE,MAAI,WAAW,SAAS,EAAE;GACxB,MAAM,QAAQ,WAAW,OAAO;AAChC,OAAI,CAAC,MAAM,QAAQ,CACjB,QAAO,CAAC,KAAK,IAAI,MAAM,IAAI,EAAE,OAAO,iBAAiB,CAAC;;AAI1D,SAAO,EAAE;;CAGX,AAAO,OAAO,QAAsB;AAClC,OAAK,OAAO,OAAO,OAAO;;CAG5B,AAAO,QAAc;AACnB,OAAK,OAAO,OAAO;;CAGrB,AAAO,UAAoD;AACzD,SAAO,KAAK,OAAO,SAAS;;;;;;ACjEhC,IAAa,oBAAb,MAA+B;CAC7B,YACE,AAAiB,aACjB,AAAiB,gBACjB,AAAiB,kBACjB;EAHiB;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,mBAAqD;AAC9D,SAAO,KAAK,YAAY,OAAO;;CAGjC,IAAW,gBAA8C;EACvD,MAAM,eAAe,KAAK,YAAY,OAAO;EAC7C,MAAM,cAAc,KAAK,2BAA2B;AACpD,SAAO,CAAC,GAAG,cAAc,GAAG,YAAY;;CAG1C,IAAW,eAA8B;AACvC,SAAO,KAAK,kBAAkB;;CAGhC,IAAW,YAAqB;AAC9B,SACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,cAAc,SAAS,KAC5B,KAAK,iBAAiB;;CAI1B,IAAW,cAAsB;EAC/B,IAAI,QAAQ,KAAK,iBAAiB,SAAS,KAAK,cAAc;AAC9D,MAAI,KAAK,iBAAiB,KACxB,UAAS;AAEX,SAAO;;CAGT,AAAO,4BAA0D;EAC/D,MAAM,SAAuC,EAAE;AAC/C,OAAK,MAAM,CAAC,QAAQ,aAAa,KAAK,eAAe,SAAS,EAAE;GAC9D,MAAM,QAAQ,SAAS,QAAQ;AAC/B,OAAI,MACF,QAAO,KAAK;IACV;IACA,WAAW,SAAS,MAAM,QAAQ;IAClC,SAAS;IACV,CAAC;;AAGN,SAAO;;;;;;ACvDX,IAAa,YAAb,MAAuB;CACrB,AAAQ,YAAsB;CAC9B,AAAQ,WAAW;CAEnB,cAAc;AACZ,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,WAAqB;AAC9B,SAAO,KAAK;;CAGd,AAAO,YAAY,MAAsB;AACvC,OAAK,YAAY;;CAGnB,IAAW,UAAmB;AAC5B,SAAO,KAAK;;CAGd,AAAO,WAAW,OAAsB;AACtC,OAAK,WAAW;;;;;;ACcpB,MAAM,sBAA4C;CAChD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAO;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAQ;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAG;EACnC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAO,OAAO;GAAK;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO;GAAM;EACzC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO;GAAM;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAI;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAG;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAO;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,KAAK,IAAI;GAAE,OAAO;GAAK;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO;GAAG;EACrC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,MAAM,MAAM;GAAE,OAAO;GAAM;EAC/C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,EAAE;GAAE;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,EAAE;GAAE;EAClC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,EAAE;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,CAAC,QAAQ;GAAE;EAC9C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,CAAC,GAAG;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,CAAC,KAAK;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO,EAAE;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO,EAAE;GAAE;EACtC,kBAAkB;EAClB,UAAU;EACX;CACF;AAED,MAAM,eAA4C;CAChD,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ,EAAE,GAAG,GAAG;CAChB,OAAO,CAAC,GAAG,EAAE;CACb,KAAK;CACL,SAAS;CACV;AAED,MAAM,mBAAmB,IAAI,IAAgB;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,aAAa,SAA6B;AACjD,QAAO,iBAAiB,IAAI,QAAsB,GAC7C,UACD;;AAGN,SAAS,gBAAgB,SAGvB;CACA,MAAM,aAAa,gBAAgB,KAAK,QAAQ;AAChD,KAAI,aAAa,GACf,QAAO;EAAE,UAAU;EAAS,WAAW,aAAa,WAAW,GAAG;EAAE;AAEtE,QAAO,EAAE,UAAU,aAAa,QAAQ,EAAE;;AAG5C,SAAS,uBACP,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;AAET,QACE,oBAAoB,MACjB,SAAS,KAAK,aAAa,YAAY,KAAK,WAAW,OACzD,IAAI;;AAIT,SAAS,eACP,OACA,UACA,QACS;AACT,KAAI,aAAa,OACf,QAAO;AAET,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,OAAO,MAAM;EACtB,KAAK;AACH,OAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AAErB,UAAO,OAAO,UAAU,WAAW,QAAQ;EAC7C,KAAK,UACH,QAAO,QAAQ,MAAM;EACvB,QACE,QAAO;;;AAIb,SAAS,sBACP,UACA,QACkB;AAClB,KAAI,aAAa,OACf,QAAO;CAET,MAAM,OAAO,uBAAuB,UAAU,OAAO;AACrD,QAAO,OAAO,KAAK,mBAAmB;;AAGxC,SAAS,YACP,GACA,GACkB;CAClB,MAAM,QAA4B;EAAC;EAAQ;EAAY;EAAU;AACjE,QAAO,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,KAAK;;AAGhE,SAAS,uBAAuB,OAA+C;AAC7E,QAAO,MAAM,QACV,KAAK,SAAS,YAAY,KAAK,KAAK,iBAAiB,EACtD,OACD;;AAGH,SAAS,yBACP,KACsB;CACtB,MAAM,EAAE,UAAU,QAAQ,eAAe,gBAAgB;CACzD,MAAM,QAA8B,EAAE;AAEtC,KACE,WAAW,WACX,gBAAgB,UAChB,aAAa,WACb,aAAa,UACb;AACA,QAAM,KAAK;GAAE,MAAM;GAAiB,kBAAkB;GAAQ,CAAC;AAC/D,MAAI,aAAa,aAAa;GAC5B,MAAM,WAAW,sBAAsB,UAAU,YAAY;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,SAAS,KAAK;IACvB,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,WACb,kBAAkB,UAClB,WAAW,WACX,WAAW,UACX;AACA,QAAM,KAAK;GACT,MAAM;GACN,kBAAkB;GACnB,CAAC;AACF,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,WAAW,sBAAsB,eAAe,OAAO;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,cAAc,KAAK;IAC5B,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,YACb,WAAW,YACX,aAAa,WACb,WAAW,QAEX,OAAM,KAAK;EACT,MAAM,GAAG,SAAS,KAAK;EACvB,kBAAkB;EACnB,CAAC;MACG;EACL,MAAM,WAAW,sBAAsB,UAAU,OAAO;AACxD,QAAM,KAAK;GAAE,MAAM,GAAG,SAAS,KAAK;GAAU,kBAAkB;GAAU,CAAC;;AAG7E,QAAO;;AAGT,SAAS,kCACP,UACA,WACqC;CACrC,MAAM,SAAS,aAAa;AAE5B,QAAO;EAAE;EAAQ,OAAO,CADC,eAAe,QAAQ,UAAU,UAAU,CAC1B;EAAE;;AAG9C,SAAS,+BACP,eACA,QACqC;CACrC,MAAM,YAAY,aAAa;AAG/B,QAAO;EAAE,QAFM,CAAC,WAAW,UAAU;EAEpB,OADH,eAAe,WAAW,eAAe,OAAO;EACtC;;AAG1B,SAAgB,oCACd,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;CAGT,MAAM,OAAO,gBAAgB,SAAS;CACtC,MAAM,KAAK,gBAAgB,OAAO;AAElC,KAAI,KAAK,aAAa,aAAa,GAAG,aAAa,UACjD,QAAO;AAGT,KACE,GAAG,aAAa,WAChB,GAAG,aACH,KAAK,aAAa,WAClB,KAAK,aAAa,UAClB;EACA,MAAM,UAAU,kCACd,KAAK,UACL,GAAG,UACJ;EACD,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,aAAa,GAAG;GACjB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;AAGH,KACE,KAAK,aAAa,WAClB,KAAK,aACL,GAAG,aAAa,WAChB,GAAG,aAAa,UAChB;EACA,MAAM,UAAU,+BAA+B,KAAK,WAAW,GAAG,SAAS;EAC3E,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,eAAe,KAAK;GACrB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;CAGH,MAAM,OAAO,uBAAuB,KAAK,UAAU,GAAG,SAAS;AAC/D,KAAI,MAAM;EACR,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACZ,CAAC;AACF,SAAO;GACL;GACA;GACA,SAAS,KAAK;GACd,kBAAkB,KAAK;GACvB;GACD;;AAGH,QAAO;EACL;EACA;EACA,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAK;EACpC,kBAAkB;EAClB,OAAO,CACL;GACE,MAAM,GAAG,KAAK,SAAS,KAAK,GAAG;GAC/B,kBAAkB;GACnB,CACF;EACF;;;;;AClaH,SAAS,kBAAkB,QAAgC;AACzD,KAAI,OAAO,KACT,QAAO;AAET,KAAI,OAAO,KACT,QAAO,OAAO;AAEhB,QAAO;;AAGT,SAAS,qBAAqB,QAAwC;AACpE,KAAI,OAAO,SAAS,YAAY,OAAO,WACrC,QAAO,OAAO,cAAc;;AAKhC,SAAgB,uBACd,OAC4B;AAC5B,KAAI,MAAM,OAAO,SAAS,MAAM,UAAU,OACxC,QAAO;CAGT,MAAM,SAAS,MAAM;AAKrB,QAAO;EAAE,OAJK,qBAAqB,MAAM,OAAO,EAAE,gBAAgB,GAAG,CAAC;EAItD,MAHH,kBAAkB,OAAO;EAGhB,mBAFI,qBAAqB,OAAO;EAEb;;;;;ACnD3C,SAAgB,aACd,MACA,SACM;AACN,KAAI,KAAK,QAAQ,CACf;AAEF,SAAQ,KAAK;AACb,KAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,cAAa,OAAO,QAAQ;UAErB,KAAK,SAAS,EAAE;EACzB,MAAM,QAAQ,KAAK,OAAO;AAC1B,MAAI,CAAC,MAAM,QAAQ,CACjB,cAAa,OAAO,QAAQ;;;;;;ACdlC,IAAa,gBAAb,MAA2B;CACzB,YACE,AAAiB,iBACjB,AAAiB,YACjB;EAFiB;EACA;;CAGnB,AAAO,iBAA2B;EAChC,MAAM,OAAO,KAAK,iBAAiB,CAAC;AACpC,MAAI,KAAK,QAAQ,CACf,QAAO,EAAE;EAEX,MAAM,MAAgB,EAAE;AACxB,OAAK,oBAAoB,MAAM,KAAK,KAAK;AACzC,SAAO;;CAGT,AAAO,aAAa,QAA+B;EACjD,MAAM,OAAO,KAAK,iBAAiB,CAAC;AACpC,MAAI,KAAK,QAAQ,CACf,QAAO;AAET,SAAO,KAAK,iBAAiB,MAAM,OAAO;;CAG5C,AAAO,SAAS,QAAyB;AACvC,SAAO,KAAK,iBAAiB,CAAC,KAAK,IAAI,KAAK;;CAG9C,AAAO,QAAQ,QAA4B;AACzC,SAAO,KAAK,iBAAiB,CAAC,SAAS,OAAO;;CAGhD,AAAO,gBAAgB,MAA2B;AAChD,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,YAAY,CAAC,SAAS;AAEpC,MAAI,KAAK,SAAS,CAChB,QAAO,CAAC,KAAK,OAAO,CAAC,QAAQ;AAE/B,SAAO;;CAGT,AAAO,gBAAgB,MAAiC;AACtD,MAAI,KAAK,UAAU,EAAE;GACnB,MAAM,QAAQ,KAAK,YAAY,CAAC;AAChC,OAAI,MACF,QAAO,MAAM,IAAI;aAEV,KAAK,SAAS,EAAE;GACzB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,QAAO,MAAM,IAAI;;AAGrB,SAAO;;CAGT,AAAQ,oBACN,MACA,KACA,QACM;AACN,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,KAAK,IAAI,CAAC;AAEnB,MAAI,CAAC,UAAU,CAAC,KAAK,WAAW,WAAW,KAAK,IAAI,CAAC,CACnD;AAGF,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,oBAAoB,OAAO,KAAK,MAAM;WAEpC,KAAK,SAAS,EAAE;GACzB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,oBAAoB,OAAO,KAAK,MAAM;;;CAKjD,AAAQ,iBAAiB,MAAkB,UAAiC;AAC1E,MAAI,KAAK,QAAQ,CACf,QAAO;AAGT,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,mBAAmB,MAAM,SAAS;AAGhD,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK,kBAAkB,MAAM,SAAS;AAG/C,SAAO;;CAGT,AAAQ,mBACN,MACA,UACe;AACf,OAAK,MAAM,SAAS,KAAK,YAAY,EAAE;AACrC,OAAI,MAAM,IAAI,KAAK,SACjB,QAAO,KAAK,IAAI;GAElB,MAAM,QAAQ,KAAK,iBAAiB,OAAO,SAAS;AACpD,OAAI,MACF,QAAO;;AAGX,SAAO;;CAGT,AAAQ,kBAAkB,MAAkB,UAAiC;EAC3E,MAAM,QAAQ,KAAK,OAAO;AAC1B,MAAI,MAAM,QAAQ,CAChB,QAAO;AAET,MAAI,MAAM,IAAI,KAAK,SACjB,QAAO,KAAK,IAAI;AAElB,SAAO,KAAK,iBAAiB,OAAO,SAAS;;;;;;AC1HjD,IAAa,kBAAb,MAA6B;CAC3B,YACE,AAAiB,YACjB,AAAiB,iBACjB;EAFiB;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,AAAO,cAAoB;EACzB,MAAM,UAAU,KAAK,mBAAmB;AACxC,OAAK,WAAW,YAAY,SAAS,KAAK;;CAG5C,AAAO,YAAkB;EACvB,MAAM,UAAU,KAAK,mBAAmB;AACxC,OAAK,WAAW,UAAU,QAAQ;;CAGpC,AAAO,kBAAkB,WAAyB;AAEhD,MADkB,KAAK,iBAAiB,CAAC,aACxB,UACf,MAAK,aAAa;;CAItB,AAAO,mBAAyB;EAC9B,MAAM,aAAa,KAAK,mBAAmB;AAC3C,OAAK,MAAM,UAAU,WACnB,MAAK,WAAW,YAAY,QAAQ,MAAM;;CAI9C,AAAQ,oBAA8B;EACpC,MAAM,MAAgB,EAAE;AACxB,eAAa,KAAK,iBAAiB,CAAC,OAAO,SAAS;AAClD,OAAI,KAAK,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,SAAS,EACpD,KAAI,KAAK,KAAK,IAAI,CAAC;IAErB;AACF,SAAO;;CAGT,AAAQ,oBAA8B;EACpC,MAAM,MAAgB,EAAE;AACxB,eAAa,KAAK,iBAAiB,CAAC,OAAO,SAAS;AAClD,OAAI,KAAK,KAAK,IAAI,CAAC;IACnB;AACF,SAAO;;;;;;ACvCX,IAAa,qBAAb,MAAgC;CAC9B,AAAQ,QAAsB;CAC9B,AAAQ,kBAAkB;CAC1B,AAAQ,2BAA2B;CACnC,AAAQ,gBAAoC;CAC5C,AAAiB,aAAkC,EAAE;CAErD,YACE,AAAiB,YACjB,AAAiB,YACjB,AAAiB,YACjB;EAHiB;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;AAEhD,OAAK,WAAW,KACd,eACQ;GACJ,MAAM,WAAW,KAAK,WAAW;AACjC,OAAI,CAAC,SACH,QAAO;AAET,UAAO,KAAK,WAAW,UAAU,SAAS;MAE3C,WAAW,eAAe;AACzB,OAAI,aAAa,CAAC,WAChB,MAAK,QAAQ;AAEf,OAAI,CAAC,aAAa,YAAY;AAC5B,SAAK,QAAQ;AACb,SAAK,kBAAkB;AACvB,QAAI,KAAK,yBACP,MAAK,2BAA2B;QAEhC,MAAK,kBAAkB;;IAI9B,CACF;;CAGH,IAAW,OAAqB;AAC9B,SAAO,KAAK;;CAGd,IAAW,iBAA2B;AACpC,SAAO,KAAK,WAAW,gBAAgB;;CAGzC,AAAO,cAAc,OAA4B;AAC/C,MAAI,KAAK,UAAU,WACjB;AAGF,MAAI,MAAM,QAAQ,SAChB,MAAK,kBAAkB;AAGzB,MAAI,MAAM,QAAQ,SAAS,MAAM,UAAU;AACzC,SAAM,gBAAgB;AACtB,QAAK,YAAY;AACjB;;AAGF,UAAQ,MAAM,KAAd;GACE,KAAK;GACL,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,YAAY;AACjB;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,YAAY;AACjB;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,qBAAqB;AAC1B;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,wBAAwB;AAC7B;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,cAAc;AACnB;GACF,KAAK;GACL,KAAK;GACL,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,eAAe;AACpB;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,aAAa;AAClB;GACF,KAAK;GACL,KAAK;AACH,UAAM,gBAAgB;AACtB,SAAK,YAAY;AACjB;GACF,KAAK;AACH,UAAM,gBAAgB;AACtB,QAAI,KAAK,iBAAiB;AACxB,UAAK,kBAAkB;AACvB;;AAEF,SAAK,yBAAyB;AAC9B;;;CAIN,AAAO,gBAAgB,IAA8B;AACnD,MAAI,KAAK,iBAAiB,CAAC,GACzB,UAAS,oBAAoB,aAAa,KAAK,sBAAsB;AAEvE,OAAK,gBAAgB;AACrB,MAAI,KAAK,cACP,UAAS,iBAAiB,aAAa,KAAK,sBAAsB;;CAItE,AAAO,cAAoB;AACzB,MACE,KAAK,iBACL,CAAC,KAAK,cAAc,SAAS,SAAS,cAAc,CAEpD,MAAK,cAAc,OAAO;;CAI9B,AAAO,aAAmB;AACxB,OAAK,WAAW,gBAAgB,KAAK;;CAGvC,AAAiB,yBAAyB,UAAuB;AAC/D,OAAK,kBAAkB;EACvB,MAAM,SAAS,MAAM;AACrB,MAAI,EAAE,kBAAkB,aACtB;AAEF,MAAI,KAAK,eAAe,SAAS,OAAO,EAAE;AACxC,QAAK,2BAA2B;AAChC,OAAI,CAAC,OAAO,QAAQ,iBAAiB,CACnC,MAAK,WAAW,gBAAgB,KAAK;AAEvC;;AAKF,MAHwB,OAAO,QAC7B,yDACD,CAEC,MAAK,2BAA2B;MAEhC,MAAK,WAAW,gBAAgB,KAAK;;CAIzC,AAAO,kBAAwB;AAC7B,OAAK,aAAa;;CAGpB,AAAO,gBAAgB,QAAsB;AAC3C,OAAK,WAAW,gBAAgB,OAAO;;CAGzC,AAAO,mBAAmB,OAAe,OAAqB;AAC5D,MAAI,KAAK,WAAW,iBAAiB,OAAO;AAC1C,QAAK,WAAW,gBAAgB,MAAM;AACtC,OAAI,KAAK,UAAU,YACjB,MAAK,QAAQ;AAEf,QAAK,kBAAkB;;;CAI3B,AAAQ,mBAAyB;AAC/B,mBAAiB,KAAK,aAAa,EAAE,EAAE;;CAGzC,AAAO,UAAgB;AACrB,OAAK,MAAM,YAAY,KAAK,WAC1B,WAAU;AAEZ,OAAK,WAAW,SAAS;AACzB,OAAK,gBAAgB,KAAK;;CAG5B,AAAQ,aAAmB;EACzB,MAAM,MAAM,KAAK;AACjB,MAAI,IAAI,WAAW,EACjB;EAGF,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,UAAU;GACb,MAAM,UAAU,IAAI;AACpB,OAAI,YAAY,QAAW;AACzB,SAAK,WAAW,gBAAgB,QAAQ;AACxC,SAAK,aAAa,QAAQ;;AAE5B;;EAGF,MAAM,eAAe,IAAI,QAAQ,SAAS;AAC1C,MAAI,iBAAiB,MAAM,gBAAgB,IAAI,SAAS,EACtD;EAGF,MAAM,SAAS,IAAI,eAAe;AAClC,MAAI,WAAW,QAAW;AACxB,QAAK,WAAW,gBAAgB,OAAO;AACvC,QAAK,aAAa,OAAO;;;CAI7B,AAAQ,aAAmB;EACzB,MAAM,MAAM,KAAK;AACjB,MAAI,IAAI,WAAW,EACjB;EAGF,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,UAAU;GACb,MAAM,SAAS,IAAI,GAAG,GAAG;AACzB,OAAI,WAAW,QAAW;AACxB,SAAK,WAAW,gBAAgB,OAAO;AACvC,SAAK,aAAa,OAAO;;AAE3B;;EAGF,MAAM,eAAe,IAAI,QAAQ,SAAS;AAC1C,MAAI,gBAAgB,EAClB;EAGF,MAAM,SAAS,IAAI,eAAe;AAClC,MAAI,WAAW,QAAW;AACxB,QAAK,WAAW,gBAAgB,OAAO;AACvC,QAAK,aAAa,OAAO;;;CAI7B,AAAQ,sBAA4B;EAClC,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,OAAO,KAAK,WAAW,QAAQ,SAAS;AAC9C,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,CAAC,KAAK,WAAW,gBAAgB,KAAK,CACxC;AAKF,MAAI,CAFW,KAAK,WAAW,SAAS,SAAS,IAElC,CAAC,KAAK,WAAW,WAAW,SAAS,EAAE;AACpD,QAAK,WAAW,YAAY,UAAU,KAAK;AAC3C;;EAGF,MAAM,aAAa,KAAK,WAAW,gBAAgB,KAAK;AACxD,MAAI,YAAY;AACd,QAAK,WAAW,gBAAgB,WAAW;AAC3C,QAAK,aAAa,WAAW;;;CAIjC,AAAQ,yBAA+B;EACrC,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,OAAO,KAAK,WAAW,QAAQ,SAAS;AAC9C,MAAI,KAAK,QAAQ,CACf;AAKF,MACE,CAHa,KAAK,WAAW,SAAS,SAAS,IAI/C,KAAK,WAAW,gBAAgB,KAAK,IACrC,KAAK,WAAW,WAAW,SAAS,EACpC;AACA,QAAK,WAAW,YAAY,UAAU,MAAM;AAC5C;;EAGF,MAAM,WAAW,KAAK,WAAW,aAAa,SAAS;AACvD,MAAI,UAAU;AACZ,QAAK,WAAW,gBAAgB,SAAS;AACzC,QAAK,aAAa,SAAS;;;CAI/B,AAAQ,eAAqB;EAC3B,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,OAAO,KAAK,WAAW,QAAQ,SAAS;AAC9C,MAAI,KAAK,QAAQ,CACf;AAKF,MAAI,CAFW,KAAK,WAAW,SAAS,SAAS,IAElC,KAAK,WAAW,gBAAgB,KAAK,CAClD,MAAK,WAAW,eAAe,SAAS;;CAI5C,AAAQ,cAAoB;EAC1B,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,OAAO,KAAK,WAAW,QAAQ,SAAS;AAC9C,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,UAAU,EAAE;AAEnB,GADiB,KAAK,WAAW,IAAI,SAAS,CACrC,QAAQ,cAAc,GAAG,GAAG;AACrC;;EAGF,MAAM,WAAW,KAAK,WAAW,aAAa,SAAS;AACvD,MAAI,CAAC,SACH;EAGF,MAAM,aAAa,KAAK,WAAW,QAAQ,SAAS;AACpD,MAAI,WAAW,QAAQ,IAAI,CAAC,WAAW,UAAU,CAC/C;EAIF,MAAM,eADW,WAAW,YAAY,CACV,WAAW,MAAM,EAAE,IAAI,KAAK,SAAS;AACnE,MAAI,iBAAiB,GACnB;AAIF,EADuB,KAAK,WAAW,IAAI,SAAS,CACrC,QAAQ,cAAc,eAAe,GAAG,GAAG;;CAG5D,AAAQ,gBAAsB;EAC5B,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;AAGF,OAAK,WAAW,aAAa,SAAS;;CAGxC,AAAQ,0BAAgC;EACtC,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,OAAO,KAAK,WAAW,QAAQ,SAAS;AAG9C,MAAI,CAFW,KAAK,WAAW,SAAS,SAAS,IAElC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,MAAM,EAAE;AAC7C,QAAK,YAAY;AACjB;;AAGF,OAAK,WAAW,gBAAgB,KAAK;;CAGvC,AAAQ,aAAmB;EACzB,MAAM,WAAW,KAAK,WAAW;AACjC,MAAI,CAAC,SACH;EAGF,MAAM,WAAW,KAAK,WAAW,IAAI,SAAS;AAC9C,MAAI,CAAC,SAAS,QAAQ,UACpB;EAIF,MAAM,eADM,KAAK,eACQ,QAAQ,SAAS;AAE1C,WAAS,QAAQ,QAAQ;EAEzB,MAAM,aAAa,KAAK;AACxB,MAAI,WAAW,WAAW,GAAG;AAC3B,QAAK,WAAW,gBAAgB,KAAK;AACrC;;EAIF,MAAM,SAAS,WADG,KAAK,IAAI,cAAc,WAAW,SAAS,EAAE;AAE/D,MAAI,WAAW,OACb,MAAK,WAAW,gBAAgB,OAAO;;CAI3C,AAAQ,aAAa,QAAsB;AACzC,MAAI,CAAC,KAAK,cACR;EAEF,MAAM,KAAK,KAAK,cAAc,cAAc,kBAAkB,OAAO,IAAI;AACzE,MAAI,GACF,IAAG,eAAe;GAAE,OAAO;GAAW,UAAU;GAAU,CAAC;;;;;;ACjajE,MAAa,oBAAgC;EAC1C,gBAAgB,OAAO;EACvB,gBAAgB,QAAQ;EACxB,gBAAgB,eAAe;EAC/B,gBAAgB,eAAe;EAC/B,gBAAgB,eAAe;EAC/B,gBAAgB,iBAAiB;EACjC,gBAAgB,eAAe;EAC/B,gBAAgB,UAAU;EAC1B,gBAAgB,gBAAgB;CAClC;;;;AClBD,IAAI,cAAc;AAElB,SAAgB,2BAAiC;AAC/C,KAAI,YACF;AAEF,eAAc;AACd,uBAAsB,mBAAmB,KAAK,CAAC;;;;;ACejD,MAAM,8BAA8B;AAapC,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAEhB,YACE,YACA,UAAmC,EAAE,EACrC,kBAAuC,IAAI,qBAAqB,EAChE;AACA,4BAA0B;AAE1B,OAAK,cAAc,iBAAiB;GAClC,SAAS,QAAQ,WAAW;GAC5B,QAAQ;GACR,YAAY,QAAQ,cAAc;GACnC,CAAC;AAEF,OAAK,aAAa,IAAI,WAAW;AACjC,OAAK,YAAY,QAAQ,YAAY;AACrC,OAAK,sBAAsB,QAAQ,sBAAsB;EAEzD,MAAM,YAAkC;GACtC,cAAc,SAAS,KAAK,WAAW,KAAK;GAC5C,gBAAgB,WAAW,KAAK,kBAAkB,OAAO;GACzD,cAAc,WAAW,KAAK,gBAAgB,OAAO;GACrD,iBAAiB,OAAO,UAAU,KAAK,mBAAmB,OAAO,MAAM;GACvE,wBAAwB,KAAK,kBAAkB;GAChD;AAED,OAAK,YAAY,IAAI,oBACb,KAAK,YAAY,eAChB;GACL,aAAa,KAAK,YAAY;GAC9B,WAAW,KAAK;GAChB,kBAAkB,KAAK,YAAY;GACnC,uBAAuB,KAAK;GAC5B;GACD,GACD,gBACD;AAED,OAAK,aAAa,IAAI,kBACpB,KAAK,aACL,KAAK,iBACC,KAAK,aACZ;AAED,OAAK,OAAO,IAAI,WAAW;AAC3B,OAAK,WAAW,IAAI,gBAClB,KAAK,kBACC,KAAK,YAAY,OACxB;AACD,OAAK,WAAW,IAAI,mBAClB,KAAK,YACL,IAAI,oBAAoB,KAAK,YAAY,QAAQ,KAAK,WAAW,EACjE,KAAK,UACN;EAED,MAAM,iBAAiB,QAAQ,0BAA0B;EACzD,MAAM,aACJ,QAAQ,sBAAsB;AAChC,MAAI,eACF,MAAK,SAAS,kBAAkB,WAAW;AAG7C,OAAK,SAAS,kBAAkB;AAEhC,qBACE,MACA;GACE,WAAW;GACX,YAAY;GACZ,MAAM;GACN,UAAU;GACV,UAAU;GACX,EACD,EAAE,UAAU,MAAM,CACnB;;CAGH,IAAW,aAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,cAA2B;AACpC,SAAO,KAAK,YAAY;;CAG1B,IAAW,YAAuB;AAChC,SAAO,KAAK;;CAGd,IAAW,UAAkB;AAC3B,SAAO,KAAK,YAAY;;CAG1B,IAAW,iBAAyB;AAClC,SAAO,KAAK,YAAY;;CAG1B,IAAW,mBAA4B;AACrC,SAAO,KAAK,YAAY;;CAG1B,IAAW,eAA8B;EACvC,MAAM,KAAK,KAAK,YAAY;AAC5B,MAAI,MAAM,CAAC,iBAAiB,GAAG,CAC7B,QAAO;AAET,SAAO;;CAGT,AAAO,WAAW,OAAqB;AACrC,OAAK,YAAY,OAAO,MAAM;;CAGhC,IAAW,eAA6B;AACtC,SAAO,KAAK,UAAU,IAAI,KAAK,YAAY,OAAO,KAAK,IAAI,EAAE,KAAK;;CAGpE,IAAW,UAAmB;AAC5B,SAAO,KAAK,YAAY;;CAG1B,IAAW,UAAmB;AAC5B,SACE,KAAK,YAAY,OAAO,WACxB,KAAK,iBAAiB,QACtB,KAAK,YAAY,QAAQ,SAAS;;CAItC,IAAW,eAAuB;AAChC,SAAO,KAAK,YAAY,CAAC;;CAG3B,IAAW,oBAA4B;AACrC,SAAO,KAAK,gBAAgB,KAAK,mBAAmB,IAAI;;CAG1D,AAAO,cAAoB;AACzB,OAAK,YAAY,QAAQ;AACzB,OAAK,UAAU,OAAO;;CAGxB,AAAO,eAAe,QAAsB;EAC1C,MAAM,cAAc,KAAK,YAAY,OAAO;AAC5C,MAAI,YAAY,QAAQ,CACtB;AAGF,MAAI,WAAW,WAAW,CAAC,YAAY,SAAS,EAAE;AAEhD,OADe,KAAK,YAAY,OAAO,iBAAiB,CAEtD,MAAK,UAAU,OAAO;AAExB;;EAGF,MAAM,YAAY,kBAAkB,OAAO;AAC3C,MAAI,WAEF;OADe,KAAK,YAAY,OAAO,YAAY,UAAU,CAE3D,MAAK,UAAU,OAAO;;;CAK5B,MAAa,mBAA2C;AACtD,MAAI,CAAC,KAAK,oBACR,QAAO;AAET,SAAO,KAAK,qBAAqB;;CAGnC,AAAO,SAAe;AACpB,OAAK,aAAa;;CAGpB,AAAO,aAA4B;AACjC,SAAO,KAAK,YAAY,OAAO;;CAGjC,AAAO,iBAA8B;AACnC,SAAO,KAAK,YAAY,OAAO;;CAGjC,AAAO,iBAAmC;AACxC,SAAO,KAAK,YAAY,OAAO;;CAGjC,AAAO,SAAS,YAAoB,YAA0B;AAC5D,OAAK,YAAY,OAAO,SAAS,YAAY,WAAW;AACxD,OAAK,UAAU,OAAO,WAAW;;CAGnC,AAAO,SAAe;AACpB,OAAK,YAAY,QAAQ;AACzB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;;CAGzB,AAAO,UAAgB;AACrB,OAAK,SAAS,SAAS;AACvB,OAAK,UAAU,OAAO;AACtB,OAAK,WAAW,OAAO;;CAGzB,AAAQ,kBAAkB,QAAsB;AAC9C,OAAK,UAAU,OAAO,OAAO;AAC7B,OAAK,WAAW,UAAU,OAAO;AACjC,MAAI,KAAK,WAAW,iBAAiB,OACnC,MAAK,WAAW,gBAAgB,KAAK;;CAIzC,AAAQ,gBAAgB,QAAsB;AAC5C,OAAK,kBAAkB,OAAO;AAC9B,OAAK,SAAS,gBAAgB,OAAO;;CAGvC,AAAQ,mBAAmB,WAAmB,WAAyB;AACrE,OAAK,UAAU,OAAO,UAAU;AAEhC,MAAI,cAAc,UAChB,MAAK,WAAW,UAAU,UAAU;AAGtC,OAAK,WAAW,YAAY,WAAW,MAAM;AAC7C,OAAK,SAAS,mBAAmB,WAAW,UAAU;AACtD,OAAK,kBAAkB,UAAU;;CAGnC,AAAQ,kBAAkB,QAAsB;EAC9C,MAAM,OAAO,KAAK,YAAY,OAAO,SAAS,OAAO;AACrD,MAAI,KAAK,OAAO,KAAK,KAAK,UAAU,IAAI,KAAK,SAAS,EACpD,MAAK,WAAW,YAAY,QAAQ,MAAM;;;;;;ACvRhD,IAAa,eAAb,MAA0B;CACxB,YAAY,AAAiB,OAAyB;EAAzB;AAC3B,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,eAA6B;AACtC,SAAO,KAAK,MAAM;;CAGpB,IAAW,cAA2B;AACpC,SAAO,KAAK,MAAM;;CAGpB,AAAO,kBACL,QACA,mBAA4B,OACZ;AAChB,SAAO,KAAK,MAAM,UAAU,YAAY,QAAQ,iBAAiB;;CAGnE,AAAO,eAAe,QAAsB;AAC1C,OAAK,MAAM,eAAe,OAAO;;CAGnC,AAAO,eAAe,UAAwB,QAAsB;AAClE,MAAI,SAAS,OACX,MAAK,MAAM,eAAe,OAAO;MAEjC,UAAS,QAAQ,WAAW,OAAO;;CAIvC,AAAO,SAAS,YAAoB,YAA0B;AAC5D,OAAK,MAAM,SAAS,YAAY,WAAW;;CAG7C,AAAO,mBAA2C;AAChD,SAAO,KAAK,MAAM,kBAAkB;;CAGtC,IAAW,WAA+B;AACxC,SAAO,KAAK,MAAM;;;;;;ACvCtB,IAAa,sBAAb,MAAiC;CAC/B,AAAQ,YAAiC;CACzC,AAAQ,WAAW;CAEnB,YACE,AAAiB,aACjB,AAAiB,YACjB,AAAiB,UACjB;EAHiB;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,UAAkB;AAC3B,SAAO,KAAK,YAAY;;CAG1B,IAAW,WAAgC;AACzC,SAAO,KAAK;;CAGd,AAAO,YAAY,MAAiC;AAClD,OAAK,YAAY;;CAGnB,IAAW,UAAmB;AAC5B,SAAO,KAAK;;CAGd,IAAW,cAAgC;AACzC,SAAO,KAAK,YAAY,OAAO;;CAGjC,IAAW,cAAuB;AAChC,SAAO,KAAK,YAAY,OAAO,qBAAqB,EAAE,gBAAgB,GAAG,CAAC;;CAG5E,MAAa,UAAyB;AACpC,OAAK,WAAW;AAChB,MAAI;AACF,SAAM,KAAK,YAAY;YACf;AACR,QAAK,WAAW;;;CAIpB,AAAO,QAAc;AACnB,OAAK,UAAU;;;;;;AC/CnB,IAAa,uBAAb,MAAkC;CAChC,YACE,AAAiB,aACjB,AAAiB,kBACjB,AAAiB,wBACjB,AAAiB,WACjB,AAAiB,UACjB;EALiB;EACA;EACA;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,YAAqB;AAC9B,SAAO,KAAK,cAAc;;CAG5B,AAAO,SAAe;AACpB,OAAK,aAAa;AAClB,OAAK,YAAY;;CAGnB,IAAW,UAAkB;AAC3B,SAAO,KAAK,YAAY;;CAG1B,IAAW,eAA8B;AACvC,SAAO,KAAK,kBAAkB;;CAGhC,IAAW,mBAAqD;AAC9D,SAAO,KAAK,YAAY,OAAO;;CAGjC,IAAW,gBAA8C;EACvD,MAAM,eAAe,KAAK,YAAY,OAAO;EAC7C,MAAM,cAAc,KAAK,wBAAwB;AACjD,SAAO,CAAC,GAAG,cAAc,GAAG,YAAY;;CAG1C,IAAW,YAAqB;AAC9B,SACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,cAAc,SAAS,KAC5B,KAAK,iBAAiB;;CAI1B,IAAW,cAAsB;EAC/B,IAAI,QAAQ,KAAK,iBAAiB,SAAS,KAAK,cAAc;AAC9D,MAAI,KAAK,iBAAiB,KACxB,UAAS;AAEX,SAAO;;;;;;ACzCX,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB;CAEjB,AAAgB;CAEhB,AAAQ,sBAAsB;CAC9B,AAAQ,sBAAsB;CAC9B,AAAQ,wBAA8C;CAEtD,YACE,cACA,UAAmC,EAAE,EACrC;AACA,MAAI,wBAAwB,iBAC1B,MAAK,QAAQ;MAEb,MAAK,QAAQ,IAAI,iBAAiB,cAAc,QAAQ;AAE1D,OAAK,aAAa,QAAQ,aAAa;AACvC,OAAK,OAAO,IAAI,aAAa,KAAK,MAAM;AAExC,qBAAmB,MAAM,EAAE,MAAM,OAAO,EAAE,EAAE,UAAU,MAAM,CAAC;;CAK/D,IAAW,OAAmB;AAC5B,SAAO;;CAKT,IAAW,UAAkB;AAC3B,SAAO,KAAK,MAAM;;CAGpB,IAAW,iBAAyB;AAClC,SAAO,KAAK,MAAM;;CAGpB,IAAW,mBAA4B;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAW,eAA8B;AACvC,SAAO,KAAK,MAAM;;CAGpB,AAAO,WAAW,OAAqB;AACrC,OAAK,MAAM,WAAW,MAAM;;CAK9B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM;;CAGpB,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM;;CAGpB,AAAO,cAAoB;AACzB,OAAK,MAAM,aAAa;;CAK1B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,KAAK;;CAGzB,IAAW,WAAqB;AAC9B,SAAO,KAAK,MAAM,KAAK;;CAGzB,AAAO,YAAY,MAAsB;AACvC,OAAK,MAAM,KAAK,YAAY,KAAK;;CAGnC,AAAO,SAAe;AACpB,OAAK,MAAM,QAAQ;;CAGrB,AAAO,cAAoB;AACzB,OAAK,MAAM,SAAS,aAAa;;CAGnC,AAAO,YAAkB;AACvB,OAAK,MAAM,SAAS,WAAW;;CAKjC,IAAW,yBAAkC;AAC3C,SAAO,KAAK,MAAM,WAAW;;CAG/B,IAAW,cAAsB;AAC/B,SAAO,KAAK,MAAM,WAAW;;CAG/B,IAAW,qBAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,mBAAyB;AAC9B,OAAK,sBAAsB;;CAG7B,AAAO,oBAA0B;AAC/B,OAAK,sBAAsB;;CAG7B,IAAW,iBAAuC;AAChD,SAAO,IAAI,qBACT,KAAK,MAAM,kBACL,KAAK,MAAM,oBACX,KAAK,MAAM,WAAW,2BAA2B,CACxD;;CAKH,IAAW,wBAAiC;AAC1C,SAAO,KAAK,MAAM,WAAW,CAAC,KAAK,MAAM,WAAW;;CAGtD,IAAW,qBAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,mBAAyB;AAC9B,OAAK,sBAAsB;;CAG7B,AAAO,oBAA0B;AAC/B,OAAK,sBAAsB;;CAG7B,IAAW,uBAA6C;AACtD,SAAO,KAAK;;CAGd,AAAO,wBAAwB,MAAkC;AAC/D,OAAK,wBAAwB;;CAG/B,IAAW,iBAAsC;AAC/C,SAAO,IAAI,oBACT,KAAK,MAAM,kBACL,KAAK,SAAS,QACd,KAAK,mBAAmB,CAC/B;;CAKH,MAAa,UAAyB;AACpC,MAAI,CAAC,KAAK,WACR;AAEF,OAAK,MAAM,KAAK,WAAW,KAAK;AAChC,MAAI;AAEF,OADgB,MAAM,KAAK,YAAY,EAC1B;AACX,SAAK,MAAM,aAAa;AACxB,SAAK,mBAAmB;;YAElB;AACR,QAAK,MAAM,KAAK,WAAW,MAAM;;;CAMrC,AAAO,iBAAmC;AACxC,SAAO,KAAK,MAAM,gBAAgB;;CAGpC,AAAO,UAAgB;AACrB,OAAK,MAAM,SAAS;;;;;;ACzLxB,IAAa,wBAAb,MAAmC;CACjC,AAAQ,YAAmC;CAC3C,AAAQ,WAAW;CAEnB,YACE,AAAiB,aACjB,AAAiB,YACjB,AAAiB,WACjB,AAAiB,UACjB;EAJiB;EACA;EACA;EACA;AAEjB,qBAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,UAAkB;AAC3B,SAAO,KAAK,YAAY;;CAG1B,IAAW,iBAAyB;AAClC,SAAO,KAAK,YAAY;;CAG1B,IAAW,mBAA4B;AACrC,SAAO,KAAK,YAAY;;CAG1B,IAAW,gBAA0C;AACnD,MAAI,CAAC,KAAK,iBACR,QAAO;AAET,SAAO;GACL,gBAAgB,KAAK;GACrB,gBAAgB,KAAK;GACtB;;CAGH,IAAW,UAAyB;AAClC,SAAO,KAAK,YAAY,OAAO;;CAGjC,IAAW,cAA2B;AACpC,SAAO,KAAK,YAAY,OAAO;;CAGjC,IAAW,eAAuB;AAChC,SAAO,KAAK,QAAQ;;CAGtB,IAAW,oBAA4B;AACrC,SAAO,KAAK,gBAAgB,KAAK,mBAAmB,IAAI;;CAG1D,IAAW,aAAsB;AAC/B,SAAO,KAAK,eAAe,KAAK,KAAK;;CAGvC,IAAW,WAAkC;AAC3C,SAAO,KAAK;;CAGd,AAAO,YAAY,MAAmC;AACpD,OAAK,YAAY;;CAGnB,IAAW,UAAmB;AAC5B,SAAO,KAAK;;CAGd,MAAa,UAAyB;AACpC,OAAK,WAAW;AAChB,MAAI;AACF,SAAM,KAAK,YAAY;YACf;AACR,qBAAkB;AAChB,SAAK,WAAW;KAChB;;;CAIN,AAAO,SAAe;AACpB,OAAK,WAAW;AAChB,OAAK,UAAU;;CAGjB,AAAO,QAAc;AACnB,OAAK,UAAU;;;;;;ACjFnB,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB;CAEjB,AAAgB;CAEhB,AAAQ,sBAAsB;CAC9B,AAAQ,uBAAuB;CAC/B,AAAQ,wBAA8C;CAEtD,YACE,cACA,UAAmC,EAAE,EACrC;AACA,MAAI,wBAAwB,iBAC1B,MAAK,QAAQ;MAEb,MAAK,QAAQ,IAAI,iBAAiB,cAAc,QAAQ;AAE1D,OAAK,aAAa,QAAQ,aAAa;AACvC,OAAK,OAAO,IAAI,aAAa,KAAK,MAAM;AAExC,qBAAmB,MAAM,EAAE,MAAM,OAAO,EAAE,EAAE,UAAU,MAAM,CAAC;;CAK/D,IAAW,OAAmB;AAC5B,SAAO;;CAKT,IAAW,UAAkB;AAC3B,SAAO,KAAK,MAAM;;CAGpB,IAAW,iBAAyB;AAClC,SAAO,KAAK,MAAM;;CAGpB,IAAW,mBAA4B;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAW,eAA8B;AACvC,SAAO,KAAK,MAAM;;CAGpB,AAAO,WAAW,OAAqB;AACrC,OAAK,MAAM,WAAW,MAAM;;CAK9B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM;;CAGpB,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM;;CAGpB,AAAO,cAAoB;AACzB,OAAK,MAAM,aAAa;;CAK1B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,KAAK;;CAGzB,IAAW,WAAqB;AAC9B,SAAO,KAAK,MAAM,KAAK;;CAGzB,AAAO,YAAY,MAAsB;AACvC,OAAK,MAAM,KAAK,YAAY,KAAK;;CAGnC,AAAO,SAAe;AACpB,OAAK,MAAM,QAAQ;;CAGrB,AAAO,cAAoB;AACzB,OAAK,MAAM,SAAS,aAAa;;CAGnC,AAAO,YAAkB;AACvB,OAAK,MAAM,SAAS,WAAW;;CAKjC,IAAW,yBAAkC;AAC3C,SAAO,KAAK,MAAM,WAAW;;CAG/B,IAAW,cAAsB;AAC/B,SAAO,KAAK,MAAM,WAAW;;CAG/B,IAAW,qBAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,mBAAyB;AAC9B,OAAK,sBAAsB;;CAG7B,AAAO,oBAA0B;AAC/B,OAAK,sBAAsB;;CAG7B,IAAW,iBAAuC;AAChD,SAAO,IAAI,qBACT,KAAK,MAAM,kBACL,KAAK,MAAM,oBACX,KAAK,MAAM,WAAW,2BAA2B,QACjD,KAAK,QAAQ,QACb,KAAK,mBAAmB,CAC/B;;CAKH,IAAW,yBAAkC;AAC3C,SACE,KAAK,MAAM,WACX,CAAC,KAAK,MAAM,WAAW,cACtB,KAAK,MAAM,WAAW,KAAK,MAAM;;CAItC,IAAW,oBAA4B;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAW,sBAA+B;AACxC,SAAO,KAAK;;CAGd,AAAO,oBAA0B;AAC/B,OAAK,uBAAuB;;CAG9B,AAAO,qBAA2B;AAChC,OAAK,uBAAuB;;CAG9B,IAAW,uBAA6C;AACtD,SAAO,KAAK;;CAGd,AAAO,wBAAwB,MAAkC;AAC/D,OAAK,wBAAwB;;CAG/B,IAAW,kBAAyC;AAClD,SAAO,IAAI,sBACT,KAAK,MAAM,kBACL,KAAK,SAAS,QACd,KAAK,QAAQ,QACb,KAAK,oBAAoB,CAChC;;CAKH,AAAO,SAAe;AACpB,OAAK,MAAM,QAAQ;;CAGrB,MAAa,UAAyB;AACpC,MAAI,CAAC,KAAK,WACR;AAEF,OAAK,MAAM,KAAK,WAAW,KAAK;AAChC,MAAI;AAEF,OADgB,MAAM,KAAK,YAAY,EAC1B;AACX,SAAK,MAAM,aAAa;AACxB,SAAK,oBAAoB;;YAEnB;AACR,QAAK,MAAM,KAAK,WAAW,MAAM;;;CAMrC,AAAO,iBAAmC;AACxC,SAAO,KAAK,MAAM,gBAAgB;;CAGpC,AAAO,aAAa;AAClB,SAAO,KAAK,MAAM,YAAY;;CAGhC,AAAO,iBAAiB;AACtB,SAAO,KAAK,MAAM,gBAAgB;;CAGpC,AAAO,UAAgB;AACrB,OAAK,MAAM,SAAS;;;;;;AClNxB,MAAa,UAAUA,QAAM,WAC3B,SAAS,QAAQ,OAAO,KAAK;CAC3B,MAAM,EACJ,WACA,UACA,UACA,YAAY,MACZ,SACA,cACA,WACA,GAAG,SACD;AAEJ,KAAI,SACF,QAAO,kCAAG,WAAY;AAGxB,QACE,qBAACC,UAAc;EAAK,GAAI;aACtB,oBAACA,UAAc;GAAQ;GAAS;IAAiC,EACjE,oBAAC;GAAO,UAAU,CAAC;GAAW,WAAW;aACvC,oBAACA,UAAc,wBACb,qBAACA,UAAc;IAAa;IAAK,GAAI;eAClC,aACC,oBAACA,UAAc,mBACb,oBAACA,UAAc,aAAW,GACN,EAEvB;KACqB,GACC;IACpB;GACU;EAG1B;;;;ACPD,IAAY,kEAAL;AACL;AACA;AACA;;;;;;AChCF,MAAM,QAKA;CACJ;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM;EACN,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM;EACN,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM;EACN,YAAY;EACb;CACF;AAQD,MAAa,kBAAiD,EAC5D,MACA,UACA,yBACI;CACJ,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CAErD,MAAM,eAAe,cAEjB,MAAM,QACH,SACC,EAAE,KAAK,SAAS,mBAAmB,SAAS,CAAC,oBAChD,EACH,CAAC,mBAAmB,CACrB;CAGD,MAAM,cAAc,MAAM,MAAM,MAAM,EAAE,SAAS,KAAK,IAAI,MAAM;CAEhE,MAAM,qBAAqB,YAA+B;EACxD,MAAM,eAAe,MAAM,MACxB,MAAM,EAAE,SAAU,QAAQ,MAC5B;AACD,MAAI,aACF,YAAW,aAAa,KAAK;;AAIjC,QACE,qBAAC,KAAK;EAAK,eAAe,EAAE,WAAW,YAAY,KAAK;aACtD,oBAAC,KAAK;GAAQ;aACZ,oBAAC;IACC,SAAQ;IACR,MAAK;IACL,QAAO;IACP,OAAM;IACN,QAAQ;KAAE,iBAAiB;KAAW,YAAY,EAAE,SAAS,GAAG;KAAE;IAClE,QAAQ;KAAE,SAAS;KAAQ,WAAW;KAAQ;IAC9C,eAAe;KAAE,SAAS;KAAQ,WAAW;KAAQ;IACrD,eAAY;IACZ,IAAG;IACH,KAAI;cAEJ,oBAAC;KACC,MAAM,CAAC,YAAY;KACnB,eAAe,YAAY,eAAe,QAAQ,KAAK;KACvD,SAAQ;KACR,WAAW;KACX,YAAY;eAEZ,qBAAC;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO;iBAChE,oBAAC;OAAK,IAAI,YAAY;OAAM,SAAS;QAAK,EAC1C,oBAAC;OACC,IAAI;OACJ,SAAS;OACT,OAAM;OACN,WAAU;OACV,SAAS;OACT,YAAW;QACX;OACG;MACC;KACH;IACI,EACf,oBAAC,oBACC,oBAAC,KAAK,wBACJ,oBAAC,KAAK;GAAQ,UAAS;aACrB,oBAAC,KAAK;IAAe,OAAO;IAAM,eAAe;cAC9C,aAAa,KAAK,SACjB,qBAAC,KAAK;KAEJ,OAAO,KAAK;KACZ,eAAa,KAAK;KAClB,QAAO;;MAEP,oBAAC,KAAK,kBAAgB;MACtB,oBAAC;OAAK,IAAI,KAAK;OAAM,SAAS;OAAG,IAAG;QAAQ;MAC3C,KAAK;;OAPD,KAAK,KAQK,CACjB;KACkB;IACT,GACC,GACX;GACC;;;;;ACxHhB,MAAa,cAAmC,EAAE,YAAY,GAAG,YAAY;AAC3E,QACE,oBAAC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,YAAY;EACvC,OAAM;EACN,SAAQ;EACR,GAAI;YAEJ,oBAAC,WAAS;GACC;;;;;ACKjB,MAAa,YAAqC,EAChD,MACA,UACA,UACA,QACA,aACI;CACJ,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CACtC,MAAM,eAAe,KAAK,UAAU,MAAM,MAAM,EAAE;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAS,aAAa;CAC9D,MAAM,eAAe,OAAO,MAAM;CAElC,MAAM,cAAc,aAAa,UAAU,eAAe;CAE1D,MAAM,cAAc,kBAAkB;AACpC,EAAK,UAAU,UAAU,UAAU,YAAY,CAAC,WAAW;AACzD,aAAU;IACV;IACD,CAAC,aAAa,OAAO,CAAC;CAEzB,MAAM,eAAe,aAClB,UAAkB;AACjB,kBAAgB,MAAM;AAEtB,MAAI;GACF,MAAM,aAAa,KAAK,MAAM,MAAM;AACpC,YAAS,GAAG;AACZ,cAAW,WAAW;WACf,GAAG;AACV,WAAQ,MAAM,EAAE;AAChB,YAAS,eAAe;;IAG5B,CAAC,SAAS,CACX;CAED,MAAM,cAAc,kBAAkB;AACpC,eAAa,UAAU;AACvB,kBAAgB,aAAa;IAC5B,CAAC,aAAa,CAAC;CAElB,MAAM,aAAa,kBAAkB;AACnC,eAAa,UAAU;AACvB,kBAAgB,aAAa;AAC7B,YAAU;IACT,CAAC,QAAQ,aAAa,CAAC;AAM1B,QACE,qBAAC;EACC,UAAS;EACT,OAAM;EACN,MAAM;EACN,WAAU;EACV,KAAI;EACJ,KAXgB,EAClB,wBAAwB,EAAE,YAAY,WAAoB,EAC3D;aAWG,qBAAC;GAAI,GAAG;GAAG,MAAM;cACf,oBAAC;IACC,OAAO;IACP,YAAY,CAAC,WAAW,cAAc,MAAM,CAAC;IAC7C,UAAU,CAAC;IACX,OAAO;IACP,UAAS;IACT,YAAY;KACV,aAAa;KACb,YAAY;KACb;IACD,UAAU;IACV,SAAS;IACT,QAAQ;KACR,EACF,oBAAC;IACC,YAAW;IACX,cAAW;IACX,UAAS;IACT,KAAI;IACJ,OAAM;IACN,WAAU;IACV,YAAW;IACX,SAAS;KACT;IACE,EACN,oBAAC;GACC,QAAO;GACP,eAAc;GACd,YAAW;GACX,iBAAgB;GAChB,OAAM;GACN,UAAS;GACT,QAAQ;GACR,gBAAe;aAEf,oBAAC;IAAK,OAAM;cAAQ;KAAa;IAC5B;GACF;;;;;ACvFX,SAAS,WAAW,MAAsB;AACxC,QAAO,KACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,SAAS;;AAG9B,MAAM,UAAU,IAAI,IAAI;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,mBACd,SAC0B;CAC1B,MAAM,EAAE,OAAO,WAAW,iBAAiB;CAE3C,MAAM,aAAa,OAA2B,KAAK;CACnD,MAAM,iBAAiB,OAAsB,KAAK;CAClD,MAAM,gBAAgB,OAAO,KAAK;CAElC,MAAM,aAAa,OAAO,QAAQ;AAClC,YAAW,UAAU;CAErB,MAAM,MAAgC,aAAa,SAAS;AAC1D,aAAW,UAAU;IACpB,EAAE,CAAC;AAEN,iBAAgB;AACd,MAAI,UACF,YAAW,SAAS,OAAO;IAE5B,CAAC,UAAU,CAAC;AAEf,uBAAsB;AAEpB,MADkB,WAAW,cAAc,IAC1B,eAAe,YAAY,QAAQ,WAAW,SAAS;GACtE,MAAM,eAAe,WAAW,QAAQ,eAAe,IAAI;GAC3D,MAAM,WAAW,KAAK,IAAI,aAAa,eAAe,QAAQ;GAE9D,MAAM,QAAQ,SAAS,aAAa;GACpC,MAAM,MAAM,WAAW,cAAc;GAErC,MAAM,OADa,WAAW,QAAQ,WAAW,MAChB,WAAW;AAC5C,SAAM,SAAS,MAAM,SAAS;AAC9B,SAAM,SAAS,KAAK;AAEpB,OAAI,KAAK;AACP,QAAI,iBAAiB;AACrB,QAAI,SAAS,MAAM;;;GAGvB;AAEF,iBAAgB;AACd,MAAI,cAAc,SAAS;AACzB,iBAAc,UAAU;AACxB;;AAGF,aAAW,SAAS,OAAO;EAC3B,MAAM,YAAY,WAAW,cAAc;AAE3C,MAAI,WAAW,WAAW,WAAW;GACnC,MAAM,QAAQ,SAAS,aAAa;AACpC,SAAM,mBAAmB,WAAW,QAAQ;AAC5C,SAAM,SAAS,MAAM;AACrB,aAAU,iBAAiB;AAC3B,aAAU,SAAS,MAAM;;IAE1B,CAAC,aAAa,CAAC;CAElB,MAAM,cAA6C,aAAa,UAAU;EACxE,MAAM,YAAY,WAAW,cAAc;AAC3C,MAAI,aAAa,UAAU,aAAa,EACtC,gBAAe,UAAU,UAAU,WAAW,EAAE,CAAC;EAGnD,MAAM,YAAY,MAAM,cAAc;EACtC,MAAM,MAAM,cAAc,OAAO,KAAK;AACtC,aAAW,QAAQ,WAAW,IAAI;IACjC,EAAE,CAAC;CAEN,MAAM,aAA4C,kBAAkB;AAClE,aAAW,QAAQ,UAAU;AAC7B,iBAAe,UAAU;IACxB,EAAE,CAAC;CAEN,MAAM,cAA8C,kBAAkB;AACpE,aAAW,QAAQ,WAAW;IAC7B,EAAE,CAAC;CAEN,MAAM,gBAAmD,aACtD,UAAU;EACT,MAAM,OAAO,WAAW;AAExB,MAAI,MAAM,QAAQ,SAAS;AACzB,SAAM,gBAAgB;AAEtB,OAAI,KAAK,OAAO;AACd,eAAW,SAAS,MAAM;AAC1B,SAAK,WAAW;;;AAGpB,MAAI,MAAM,QAAQ,UAAU;AAC1B,SAAM,gBAAgB;AACtB,cAAW,SAAS,MAAM;AAC1B,QAAK,YAAY;;AAGnB,MACE,KAAK,YACL,CAAC,MAAM,WACP,CAAC,MAAM,WACP,CAAC,QAAQ,IAAI,MAAM,IAAI,IACvB,CAAC,KAAK,SAAS,KAAK,MAAM,IAAI,CAE9B,OAAM,gBAAgB;IAG1B,EAAE,CACH;AAED,QAAO;EACL;EACA,iBAAiB;EACjB,YAAY;EACZ,yBAAyB,EAAE,QAAQ,WAAW,MAAM,EAAE;EACtD,SAAS;EACT,QAAQ;EACR,SAAS;EACT,WAAW;EACZ;;;;;AClJH,MAAa,mBAAmD,EAC9D,WACA,aACA,WACA,QACA,UACA,UACA,SACA,SACA,cACA,UACA,QACA,SACA,YACA,qBACI;CACJ,MAAM,aAAa,OAA2B,KAAK;CAEnD,MAAM,gBAAgB,mBAAmB;EACvC,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,UAAU,cAAc;CAC9B,MAAM,cAAc,aACjB,SAA6B;AAC5B,aAAW,UAAU;AACrB,UAAQ,KAAK;IAEf,CAAC,QAAQ,CACV;CAED,MAAM,oBAAoB,kBAAkB;AAC1C,aAAW,SAAS,OAAO;IAC1B,EAAE,CAAC;CAEN,MAAM,kBAAkB,CAAC,aAAa;AAEtC,QACE,qBAAC;EACC,UAAU;EACV,OAAO,kBAAkB,SAAS;EAClC,UAAS;EACT,QAAO;EACP,SAAS;;GAER,CAAC,mBAAmB;GACrB,oBAAC;IACC,OAAM;IACU;IAChB,eAAa;IACb,KAAK;IACL,iBAAiB,cAAc;IAC/B,YAAY,cAAc;IAC1B,yBAAyB,cAAc;IACvC,SAAS;IACT,OAAM;IACN,QAAQ,cAAc;IACtB,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,WAAW,cAAc;KACpB;GACN,CAAC,mBAAmB;GACpB,mBACC,oBAAC;IACC,QAAO;IACP,YAAW;IACX,eAAc;IACd,YAAW;IACX,OAAM;IACN,UAAS;cAER;KACI;;GAEJ;;;;;AC9FX,MAAa,cAAyC,EACpD,SAAS,UACT,OACA,SACA,UACA,YACA,WACA,MACA,iBACI;AACJ,QACE,oBAAC;EACC,eAAa;EACb,QAAQ;GAAE,OAAO;GAAY,iBAAiB;GAAS;EACvD,WACE,aACI;GAAE,iBAAiB;GAAW,QAAQ;GAAe,GACrD;EAEN,WAAU;EACV,OAAM;EACN,YAAW;EACX,UAAU;EACF;EACR,UAAU,YAAY;EACtB,SAAS;EACT,SAAQ;EACC;YAET,qBAAC;GAAK,YAAW;GAAS,KAAI;cAC3B,QAAQ,oBAAC;IAAI,UAAS;cAAM;KAAW,EACxC,oBAAC,kBAAM,QAAa;IACf;GACA;;;;;ACnCb,MAAa,gBAA6C,UAAU;AAClE,QAAO,oBAAC;EAAW,GAAI;EAAO,MAAM,oBAAC,eAAa;GAAI;;;;;ACFxD,MAAa,eAA2C,EACtD,SAAS,UACT,SACA,UACA,iBACI;AACJ,QACE,oBAAC;EACC,eAAa;EACH;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACV,OAAM;EACE;EACR,SAAQ;EACC;EACT,OAAM;YAEN,oBAAC;GAAK,IAAI;GAAK,MAAK;IAAO;GACpB;;;;;ACnBb,MAAa,cAAyC,EACpD,SAAS,UACT,SACA,YACA,iBACI;AACJ,QACE,oBAAC;EACC,eAAa;EACb,UAAU;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACF;EACR,SAAQ;EACC;YAET,oBAAC;GAAK,IAAI;GAAa,SAAS;GAAG,OAAM;IAAa;GAC/C;;;;;ACpBb,MAAa,kBAA2C,EACtD,YACA,GAAG,YACC;AACJ,QACE,oBAAC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,WAAW;EACtC,OAAM;EACN,SAAQ;EACR,MAAK;EACL,GAAI;YAEJ,oBAAC,WAAS;GACC;;;;;ACJjB,MAAa,kBAA4C,UACtD,EACC,UACA,eACA,aACA,kBACA,OACA,kBACA,YACA,eACI;CACJ,MAAM,kBAAkB,eAAe,SAAS;CAChD,MAAM,sBAAsB,mBAAmB,SAAS;CAExD,MAAM,mBACJ,SAAS,MAAM,YAAY,QAAQ,SAAS,MAAM,KAAK;CAEzD,MAAM,sBACJ,iBAAiB,CAAC,cACd;GACG,MAAM,oBAAoB,EAAE,YAAY,UAAU;GAClD,MAAM,wBAAwB,EAAE,YAAY,WAAW;EACzD,GACD,EAAE;CAER,MAAM,uBACJ,oBAAoB,iBAAiB,CAAC,cAClC;GACG,MAAM,oBAAoB,EAAE,YAAY,UAAmB;GAC3D,MAAM,wBAAwB,EAAE,YAAY,WAAoB;EAClE,GACD,EAAE;CAER,MAAM,mBAAmB,mBACrB;GACG,YAAY,qBAAqB,EAAE,SAAS,GAAG;EAChD,GAAI,mBACA,GAAG,MAAM,qBAAqB,EAAE,SAAS,GAAG,EAAE,GAC9C,EAAE;EACP,GACD,EAAE;CAEN,MAAM,gCAAoD;AACxD,MAAI,CAAC,WACH;AAEF,SAAO,cACH,GAAG,WAAW,kBACd,GAAG,WAAW;;AAGpB,QACE,qBAAC;EACC,eAAc;EACd,WAAU;EACV,OAAM;EACN,QAAQ;EACR,KAAK;EACL,gBAAc,SAAS;EACvB,eAAa,SAAS,MAAM,YAAY;aAExC,qBAAC;GACC,KAAI;GACJ,YAAW;GACX,QAAO;GACP,IAAG;GACH,IAAG;GACH,UAAS;GACT,KAAK;GACL,iBAAiB,SAAS,MAAM,WAAW,aAAa;GACxD,cAAa;GACb,QAAO;;IAEP,oBAAC;KAAI,UAAS;KAAW,IAAG;KAAQ,QAAO;KAAO,OAAM;MAAS;IACjE,oBAAC;KACC,WAAW;KACX,OAAM;KACN,YAAY,cAAc,WAAW;eAErC,oBAAC,qBAAmB;MAChB;IACL,iBACC,oBAAC;KACC,eAAa,yBAAyB;KACtC,WAAW;KACX,YAAY,cAAc,YAAY;KACtC,QAAQ,EAAE,iBAAiB,eAAe;KAC1C,IAAG;KACH,UAAS;KACT,MAAK;KACL,OAAM;KACN,SAAQ;KACR,SAAS;KACT,OAAM;KACN,QAAO;eAEP,oBAAC;MAAI,QAAQ,cAAc,MAAM;gBAC/B,oBAAC,0BAAwB;OACrB;MACK;IAEd;;IACI,EACN,YAAY,CAAC,eACZ,oBAAC;GACC,IAAG;GACH,IAAG;GACH,iBAAiB;GACjB,iBAAgB;GAChB,iBAAgB;GAChB,QAAQ,EAAE,iBAAiB,kBAAkB;GAE5C;IACI;GAEJ;EAGZ;;;;AC1HD,MAAM,WAA6B,EACjC,OACA,SACA,UACA,kBACA,gBACI;AACJ,QACE,qBAACC,OAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,qBAACA,OAAK;GAAY,eAAa;cAC7B,oBAAC;IAAI,MAAK;cAAK;KAAY,EAC3B,oBAAC,mBAAiB;IACD,EACnB,oBAAC,oBACC,oBAACA,OAAK,wBACJ,oBAACA,OAAK,qBACH,QAAQ,KAAK,WACZ,qBAAC,uBACC,oBAACA,OAAK;GACJ,OAAO,OAAO;GACd,eAAa,GAAG,iBAAiB,GAAG,OAAO;GAC3C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;IACE,EACX,OAAO,SAAS,aAAa,OAAO,mBACnC,oBAACA,OAAK,cAAY,KATP,OAAO,GAWX,CACX,GACW,GACC,GACX;GACC;;AAYhB,MAAa,YAA+B,EAC1C,YACA,UACA,YACA,MACA,mBACI;CACJ,MAAM,oBAAoB,YAA+B;AACvD,iBAAe,QAAQ,KAAK;;AAG9B,QACE,qBAACA,OAAK;EAAW;EAAM,cAAc;aACnC,oBAACA,OAAK;GAAQ;aAAS;IAA0B,EACjD,oBAAC,oBACC,oBAACA,OAAK,wBACJ,oBAACA,OAAK,qBACH,eAAe,KAAK,UACnB,qBAAC,uBACE,MAAM,QAAQ,KAAK,WAClB,OAAO,SAAS,YACd,oBAAC;GAEC,OAAO,OAAO;GACd,SAAS,OAAO;GACN;GACV,WAAW,GAAG,WAAW,gBAAgB,OAAO;GAChD,kBAAkB,GAAG,WAAW;KAL3B,OAAO,GAMZ,GAEF,oBAACA,OAAK;GAEJ,OAAO,OAAO;GACd,eAAa,GAAG,WAAW,aAAa,OAAO;GAC/C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;KALH,OAAO,GAMF,CAEf,EACA,MAAM,mBAAmB,oBAACA,OAAK,cAAY,KAtB/B,MAAM,GAuBV,CACX,GACW,GACC,GACX;GACC;;;;;AC9FhB,MAAa,cAAmC,EAC9C,YACA,YACA,uBAEA,oBAAC;CACC,SAAQ;CACR,aAAa,EAAE,WAAW,QAAQ;WAElC,oBAAC;EACC,eAAa,GAAG,WAAW;EAC3B,WAAW;EACX,UAAS;EACT,MAAK;EACL,SAAS,mBAAmB,IAAI;EAChC,QAAO;EACP,QAAQ,EAAE,iBAAiB,WAAW;EACtC,QAAO;EACP,YAAW;EACX,gBAAe;EACf,cAAa;EACb,YAAW;YAEX,oBAAC;GAAK,IAAI;GAAuB,MAAK;GAAK,OAAM;IAAa;GACzD;EACC;;;;AC1BZ,MAAa,kBAA2C,EACtD,YACA,mBAEA,oBAAC;CACC,SAAS;CACT,aAAa,EAAE,WAAW,OAAO;CACjC,cAAc,EAAE,UAAU,SAAS;WAEnC,oBAAC;EACC,eAAa,GAAG,WAAW;EAC3B,OAAM;EACN,QAAO;EACP,SAAQ;EACR,YAAW;EACX,IAAG;YAEH,oBAAC,oBAAkB;GACf;EACE;;;;ACdZ,MAAM,eAAe,SAAuD;CAC1E,MAAM,WAAW,KAAK;AACtB,KAAI,YAAY,OAAO,aAAa,YAAY,YAAY,SAC1D,QAAO;AAET,QAAO;;AAWT,MAAa,kBAAkB,EAC7B,UACA,QACA,SACA,cACA,oBAC2B;CAC3B,MAAM,iBAAiB,OAA8B,KAAK;AAE1D,iBAAgB;AACd,MAAI,CAAC,WAAW,CAAC,eAAe,QAC9B;EAGF,MAAM,UAAqB,UAAU;GACnC,SAAS,eAAe;GACxB,uBAAwC,EAAE,UAAU;GACrD,CAAC;AAEF,eAAa,SAAS;IACrB,CAAC,UAAU,QAAQ,CAAC;AAEvB,iBAAgB;AACd,MAAI,CAAC,gBAAgB,CAAC,eAAe,QACnC;EAGF,MAAM,UAAqB,sBAAsB;GAC/C,SAAS,eAAe;GACxB,SAAS,MAAkD;IACzD,MAAM,mBAAmB,YAAY,EAAE,OAAO,KAAK;AAEnD,QAAI,oBAAoB,cAAc,iBAAiB,OAAO,EAC5D;SAAI,OACF,QAAO,iBAAiB,OAAO;;AAInC,aAAS,MAAM,eAAe,MAAM;AACpC,aAAS,MAAM,QAAQ,MAAM;;GAE/B,cAAc,MAAuD;IACnE,MAAM,mBAAmB,YAAY,EAAE,OAAO,KAAK;AACnD,QAAI,iBACF,UAAS,MAAM,eAAe,cAAc,iBAAiB,OAAO,CAAC;;GAGzE,mBAAmB,SAAS,MAAM,eAAe,MAAM;GACxD,CAAC;AAEF,eAAa,SAAS;IACrB;EAAC;EAAU;EAAc;EAAQ;EAAc,CAAC;AAEnD,iBAAgB;AACd,SAAO,mBAAmB;GACxB,cAAc,MAA+B;IAC3C,MAAM,mBAAmB,YAAY,EAAE,OAAO,KAAK;AAEnD,QAAI,CAAC,iBACH;AAGF,QAAI,aAGF,KAFkB,cAAc,iBAAiB,OAAO,CAGtD,UAAS,MAAM,QAAQ,KAAK;QAE5B,UAAS,MAAM,gBAAgB,KAAK;QAGtC,UAAS,MAAM,gBAAgB,KAAK;;GAGxC,cAAc;AACZ,aAAS,MAAM,QAAQ,MAAM;AAC7B,aAAS,MAAM,gBAAgB,MAAM;;GAExC,CAAC;IACD;EAAC;EAAU;EAAc;EAAc,CAAC;AAE3C,QAAO;EACL;EACA,aAAa;EACb,QAAQ,SAAS,MAAM;EACvB,gBAAgB,SAAS,MAAM;EAC/B,eAAe,SAAS,MAAM;EAC/B;;;;;AClGH,MAAa,gBAAwC,UAClD,EACC,UACA,QACA,YACA,kBACA,cACA,mBACI;CACJ,MAAM,mBACJ,SAAS,MAAM,YAAY,QAAQ,SAAS,MAAM,KAAK;CACzD,MAAM,mBAAmB,CAAC,SAAS,MAAM,aAAa,CAAC;CACvD,MAAM,aACJ,oBAAoB,mBAAmB,mBAAmB;CAC5D,MAAM,UAAU,QAAQ,SAAS,MAAM,KAAK;CAE5C,MAAM,gBAAgB,OAAO,YAAY,mBACvC,SAAS,OACV;CAmBD,MAAM,EACJ,gBACA,aACA,QACA,eACA,mBACE,eAAe;EACjB;EACA,SAzBA,CAAC,SAAS,UAAU,CAAC,SAAS,cAAc,WAAW;EA0BvD,cAzBmB,SAAS,YAAY,CAAC,SAAS;EA0BlD,eAxBoB,aACnB,eAAuB;AACtB,UAAO,OAAO,YAAY,YAAY,YAAY,SAAS,OAAO;KAEpE,CAAC,SAAS,QAAQ,OAAO,YAAY,CACtC;EAoBC,QAlBiB,aAChB,eAAuB;AACtB,UAAO,SAAS,YAAY,SAAS,OAAO;KAE9C,CAAC,QAAQ,SAAS,OAAO,CAC1B;EAcA,CAAC;CAEF,MAAM,mBAAmB,CAAC,SAAS;AAEnC,QACE,qBAAC;EAAK,KAAI;EAAS,OAAM;EAAO,gBAAe;EAAa,SAAS;aACnE,qBAAC;GACC,eAAa,SAAS,GAAG,WAAW,SAAS;GAC7C,KAAK;GACL,MAAM,UAAU,IAAI;GACpB,UAAS;GACT,YAAW;GACX,aAAa;GACb,aAAY;GACZ,aAAa,SAAS,aAAa;GACnC,iBAAiB,gBAAgB,aAAa;GAC9C,OAAO,iBAAiB,aAAa;;IAEpC,eACC,oBAAC;KACa;KACA;KACM;MAClB;IAEH,SAAS,aACR,oBAAC;KAAK,OAAM;KAAW,eAAa;eACjC,SAAS,MAAM;MACX,GAEP,oBAAC;KACa;KACZ,WAAW,CAAC,SAAS,MAAM;KAC3B,WAAW,SAAS,MAAM;KAC1B,aACE,SAAS,SACL,gCACA;KAEN,QAAQ,SAAS;KACjB,eAAe,SAAS,MAAM,WAAW,KAAK;KAC9C,UAAU,SAAS,QAAQ;KAC3B,SAAS,OAAO,SAAS;KACzB,cAAc,SAAS,MAAM;MAC7B;IAEH,WAAW,SAAS,WAAW,YAC9B,oBAAC;KACa;KACZ,cAAc,SAAS,WAAW,gBAAgB;MAClD;;IAEC,EACN,WACC,oBAAC;GAAK,KAAI;GAAS,YAAW;aAC5B,oBAAC;IAAI,WAAW;IAAY,SAAS,mBAAmB,IAAI;cAC1D,qBAAC;KAAK,KAAI;KAAS,YAAW;gBAC3B,mBACC,oBAAC;MACa;MACZ,UAAU;MACV,MAAM,SAAS,MAAM;MACrB,cAAc,SAAS,MAAM;MAC7B,YACE,oBAAC;OACC,eAAa,GAAG,WAAW;OAC3B,OAAM;OACN,gBAAe;OACf,QAAO;iBAEN,SAAS,MAAM;QACX;OAET,GAEF,oBAAC;MACC,eAAa,GAAG,WAAW;MAC3B,OAAM;gBAEL,SAAS,MAAM;OACX,EAER;MACI;KACH;IACD;GAEJ;EAGZ;;;;ACpJD,MAAa,qBAAkD,UAC5D,EAAE,eAAe;CAChB,MAAM,cAAc,SAAS,MAAM;CACnC,MAAM,aAAa,SAAS,QAAQ;CACpC,MAAM,UAAU,SAAS,QAAQ;CACjC,MAAM,eAAe,SAAS,MAAM;AAIpC,KAAI,EAFoB,eAAe,cAAc,cAGnD,QAAO;AAGT,QACE,qBAAC;EAAK,KAAI;EAAM,YAAW;;GACxB,gBACC,oBAAC;IAAQ,SAAQ;IAAa,aAAa,EAAE,WAAW,OAAO;cAC7D,oBAAC;KACC,OAAM;KACN,QAAO;KACP,SAAQ;KACR,YAAW;eAEX,oBAAC,cAAY;MACT;KACE;GAEX,cACC,oBAAC;IACC,SAAS,YAAY;IACrB,aAAa,EAAE,WAAW,OAAO;cAEjC,oBAAC;KACC,OAAM;KACN,QAAO;KACP,SAAQ;KACR,YAAW;eAEX,oBAAC,eAAa;MACV;KACE;GAEX,eACC,oBAAC;IAAQ,SAAS;IAAa,aAAa,EAAE,WAAW,OAAO;cAC9D,oBAAC;KACC,OAAM;KACN,QAAO;KACP,SAAQ;KACR,YAAW;eAEX,oBAAC,YAAU;MACP;KACE;;GAEP;EAGZ;;;;ACzDD,MAAa,qBAAkD,UAC5D,EAAE,UAAU,iBAAiB;CAC5B,MAAM,CAAC,YAAY,iBAAiB,SAClC,SAAS,MAAM,eAAe,GAC/B;CAED,MAAM,mBAAmB;AACvB,WAAS,QAAQ,eAAe,cAAc,OAAU;;CAG1D,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,qBAAC,KAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,qBAAC,KAAK;GAAY,eAAa,GAAG,WAAW;;IAC3C,oBAAC,YAAU;IACX,oBAAC;KAAI,MAAK;eAAI;MAAiB;IAC9B,SAAS,MAAM,eACd,oBAAC;KACC,OAAM;KACN,UAAS;KACT,MAAK;KACL,UAAS;KACT,cAAa;KACb,YAAW;eAEV,SAAS,MAAM;MACZ;IAER,oBAAC,iBAAe;;IACC,EACnB,oBAAC,oBACC,oBAAC,KAAK,wBACJ,oBAAC,KAAK;GAAQ,GAAE;GAAI,MAAK;aACvB,oBAAC;IACC,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT,MAAM;IACN;IACA,UAAU,MAAM;KACd,MAAM,MAAM,EAAE,cAAc,MAAM;AAClC,OAAE,cAAc,kBAAkB,KAAK,IAAI;;IAE7C,eAAa,GAAG,WAAW;KAC3B;IACW,GACC,GACX;GACC;EAGjB;;;;ACvDD,MAAM,mBACJ,OACA,WACA,gBACkB;CAClB,MAAM,UAAU,MAAM,MAAM;AAC5B,KAAI,CAAC,QACH,QAAO;AAET,KAAI;EACF,MAAM,QAAQ,6BAA6B,SAAS,WAAW,YAAY;AAC3E,SAAO,QAAQ,MAAM,QAAQ;SACvB;AACN,SAAO;;;AAIX,MAAM,eAGD,UAAU,EAAE,UAAU,iBAAiB;CAC1C,MAAM,eAAe,SAAS,QAAQ;CACtC,MAAM,eAAe,SAAS,QAAQ,gBAAgB;CACtD,MAAM,CAAC,YAAY,iBAAiB,SAAS,aAAa;CAC1D,MAAM,CAAC,YAAY,iBAAiB,SAAwB,aAAa;CACzE,MAAM,gBAAgB,OAAO,WAAW;CACxC,MAAM,kBAAkB,OAAO,aAAa;CAE5C,MAAM,gBAAgB,MAA8C;EAClE,MAAM,QAAQ,EAAE,OAAO;AACvB,gBAAc,MAAM;AACpB,gBAAc,UAAU;AAMxB,gBALc,gBACZ,OACA,SAAS,MAAM,MACf,SAAS,QAAQ,YAClB,CACmB;;AAGtB,iBAAgB;EACd,MAAM,cAAc;EACpB,MAAM,aAAa;AACnB,eAAa;GACX,MAAM,QAAQ,cAAc;AAC5B,OAAI,UAAU,WAAW,QACvB;AAEF,eAAY,QAAQ,cAAc,MAAM;AACxC,eAAY,QAAQ,cAAc;;IAEnC,CAAC,SAAS,CAAC;CAEd,MAAM,WAAW,eAAe;CAEhC,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE;EACE,oBAAC;GACC,MAAK;GACL,aAAY;GACZ,OAAO;GACP,UAAU;GACV,WAAW;GACX,SAAS;GACT;GACA,UAAU,MAAM;IACd,MAAM,MAAM,EAAE,cAAc,MAAM;AAClC,MAAE,cAAc,kBAAkB,KAAK,IAAI;;GAE7C,MAAM;GACN,aAAa,WAAW,YAAY;GACpC,eAAa,GAAG,WAAW;IAC3B;EACD,YACC,oBAAC;GACC,UAAS;GACT,OAAM;GACN,IAAI;GACJ,eAAa,GAAG,WAAW;aAE1B;IACG;EAEP,CAAC,YAAY,cACZ,oBAAC;GAAI,UAAS;GAAK,OAAM;GAAW,IAAI;aAAG;IAErC;KAEP;EAEL;AAEF,MAAa,iBAA0C,UACpD,EAAE,UAAU,iBAAiB;CAC5B,MAAM,WAAW,SAAS,QAAQ;AAElC,QACE,qBAAC,KAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,qBAAC,KAAK;GAAY,eAAa,GAAG,WAAW;;IAC3C,oBAAC,eAAa;IACd,oBAAC;KAAI,MAAK;eAAI;MAAa;IAC1B,SAAS,QAAQ,cAChB,oBAAC;KACC,OAAO,WAAW,YAAY;KAC9B,UAAS;KACT,MAAK;KACL,UAAS;KACT,cAAa;KACb,YAAW;eAEV,SAAS,QAAQ;MACd;IAER,oBAAC,iBAAe;;IACC,EACnB,oBAAC,oBACC,oBAAC,KAAK,wBACJ,oBAAC,KAAK;GAAQ,GAAE;GAAQ,GAAG;aACzB,oBAAC;IAAuB;IAAsB;KAAc;IAC/C,GACC,GACX;GACC;EAGjB;;;;AC/ID,SAAgB,kBACd,OACA,UACS;CACT,MAAM,WAAW,SAAS,MAAM;AAChC,KAAI,aAAa,UAAU;EACzB,MAAM,MAAM,OAAO,MAAM;AACzB,SAAO,OAAO,MAAM,IAAI,GAAG,IAAI;;AAEjC,KAAI,aAAa,UACf,QAAO,UAAU;AAEnB,QAAO;;;;;ACFT,MAAa,sBAAoD,UAC9D,EAAE,UAAU,iBAAiB;CAC5B,MAAM,CAAC,YAAY,iBAAiB,SAAS,SAAS,qBAAqB;CAE3E,MAAM,mBAAmB;AACvB,WAAS,QAAQ,gBAAgB,kBAAkB,YAAY,SAAS,CAAC;;CAG3E,MAAM,uBAAuB,YAAqB;AAChD,WAAS,QAAQ,gBAAgB,QAAQ;;CAG3C,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;CAG1C,MAAM,YAAY,SAAS,MAAM,aAAa;CAC9C,MAAM,WAAW,SAAS,MAAM,aAAa;AAE7C,QACE,qBAAC,KAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,qBAAC,KAAK;GAAY,eAAa,GAAG,WAAW;;IAC3C,oBAAC,aAAW;IACZ,oBAAC;KAAI,MAAK;eAAI;MAAmB;IAChC,SAAS,wBACR,oBAAC;KACC,OAAM;KACN,UAAS;KACT,MAAK;KACL,UAAS;KACT,cAAa;KACb,YAAW;eAEV,SAAS;MACN;IAER,oBAAC,iBAAe;;IACC,EACnB,oBAAC,oBACC,oBAAC,KAAK,wBACJ,oBAAC,KAAK;GAAQ,GAAE;GAAI,MAAK;aACtB,YACC,qBAAC,KAAK;IACJ,OAAM;IACN,SAAS,SAAS,iBAAiB;IACnC,uBACE,oBAAoB,SAAS,iBAAiB,KAAK;IAErD,eAAa,GAAG,WAAW;eAC5B,QAEC,oBAAC,KAAK,kBAAgB;KACJ,GAEpB,oBAAC;IACC,MAAK;IACL,MAAM,WAAW,WAAW;IAC5B,aAAa,WAAW,MAAM;IAC9B,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT;IACA,eAAa,GAAG,WAAW;KAC3B;IAES,GACC,GACX;GACC;EAGjB;;;;ACnED,MAAa,sBAAoD,UAC9D,EACC,UACA,YACA,aAAa,MACb,cAAc,OACd,cAAc,OACd,eACI;CACJ,MAAM,aAAa,OAAuB,KAAK;CAE/C,MAAM,oBAAoB,YAA+B;AACvD,WAAS,MAAM,gBAAgB,QAAQ,KAAK;;CAG9C,MAAM,YAAY,SAAS,QAAQ;AAEnC,QACE,qBAAC,KAAK;EACJ,MAAM,SAAS,MAAM;EACrB,cAAc;EACd,aAAa,EAAE,WAAW,gBAAgB;aAE1C,oBAAC,KAAK;GAAQ;aACZ,oBAAC;IACC,QAAO;IACP,OAAM;IACN,QAAQ,EAAE,OAAO,YAAY;IACjB;KACZ;IACW,EACf,oBAAC,oBACC,oBAAC,KAAK,wBACJ,qBAAC,KAAK;GAAQ,KAAK;GAAY,MAAK;;IAClC,oBAAC;KAA6B;KAAsB;MAAc;IAEjE,eACC,oBAAC;KAAyB;KAAsB;MAAc;IAG/D,eACC,oBAAC;KACW;KACE;MACZ;IAGJ,oBAAC,KAAK,cAAY;IAElB,qBAAC,KAAK;KACJ,OAAM;KACN,eACE,SAAS,QAAQ,cAAc,CAAC,SAAS,MAAM,aAAa;KAE9D,eAAa,GAAG,WAAW;gBAE3B,oBAAC,OAAI,GAAE,SAAS,EACf,SAAS,MAAM,eACZ,sBACA;MACM;IAEX,cACC,8CACE,oBAAC,KAAK,cAAY,EAClB,qBAAC,KAAK;KACJ,OAAM;KACN,OAAO,YAAY,aAAa;KAChC,UAAU,CAAC;KACX,SAAS,YAAY,WAAW;KAChC,eAAa,GAAG,WAAW;KAC3B,QACE,YACI;MAAE,IAAI;MAAY,OAAO;MAAY,GACrC;gBAGN,oBAAC,YAAU,EACX,oBAAC;MAAI,MAAK;gBAAI;OAAkB;MACtB,IACX;;IAEQ,GACC,GACX;GACC;EAGjB;;;;AC5FD,MAAa,uBAAsD,UAChE,EACC,UACA,YACA,aAAa,MACb,cAAc,OACd,cAAc,OACd,eACI;CACJ,MAAM,WAAW,CAAC,SAAS;AAE3B,QACE,8CACE,oBAAC,sBAA6B,WAAY,EACzC,YACC,oBAAC;EACW;EACV,YAAY,GAAG,WAAW;EACd;EACC;EACA;EACH;GACV,IAEH;EAGR;;;;ACxBD,MAAa,iBAA0C,UACpD,EACC,UACA,QACA,YACA,cAAc,OACd,aACA,aACA,eACI;CACJ,MAAM,mBAAmB,SAAS;CAClC,MAAM,gBAAgB,eAAe,CAAC,SAAS;AAG/C,QACE,oBAAC;EACW;EACK;EACf,aANgB,iBAAiB,CAAC,SAAS,MAAM;EAOjD,kBACE,gBAAgB,SAAS,MAAM,iBAAiB;EAEhC;EACN;EACZ,OACE,oBAAC;GACW;GACF;GACI;GACM;GAClB,eAAe,WAAW,OAAO,eAAe,UAAU,OAAO;GACjE,cACE,oBAAC;IACW;IACE;IACZ,YAAY,CAAC,SAAS;IACT;IACA;IACb,UAAU,SAAS,QAAQ;KAC3B;IAEJ;EAGH;GACe;EAGvB;;;;ACnDD,MAAa,iBAA0C,UACpD,EAAE,UAAU,QAAQ,iBAAiB;CACpC,MAAM,cAAc,SAAS,UAAU,CAAC,SAAS,MAAM;CACvD,MAAM,WAAW,OAAO,kBACtB,SAAS,QACT,SAAS,WACV;CACD,MAAM,gBAAgB,CAAC,SAAS,cAAc,CAAC;AAE/C,QACE,oBAAC;EACW;EACF;EACI;EACZ;YAEC,CAAC,eACA,qBAAC;GAAK,eAAc;GAAS,OAAM;cAChC,SAAS,KAAK,eAAe,UAC5B,oBAAC;IAEC,UAAU;IACF;IACR,YAAY,GAAG,WAAW,GAAG;MAHxB,cAAc,OAInB,CACF,EACD,iBACC,oBAAC;IAAI,IAAG;cACN,oBAAC;KACC,YAAY,GAAG,WAAW;KAC1B,OAAM;KACN,eAAe,SAAS,QAAQ,YAAY,GAAG;MAC/C;KACE;IAEH;GAEM;EAGtB;;;;AC7CD,MAAa,kBAA4C,UACtD,EAAE,UAAU,iBAAiB;CAC5B,MAAM,QAAQ,SAAS,MAAM;AAE7B,QACE,oBAAC;EAAK,KAAI;EAAM,YAAW;EAAS,QAAO;EAAO,IAAG;EAAM,IAAG;YAC5D,oBAAC;GACC,KAAI;GACJ,OAAM;GACN,gBAAe;GACf,SAAS;GACT,QAAQ;IACN,gBAAgB;IAChB,qBAAqB;IACtB;GACD,SAAS,SAAS,QAAQ;GAC1B,QAAO;aAEP,oBAAC;IACC,OAAM;IACN,eAAa,GAAG,WAAW;cAE1B,SAAS;KACL;IACF;GACF;EAGZ;;;;ACtBD,MAAa,qBAAkD,UAC5D,EAAE,UAAU,QAAQ,iBAAiB;AACpC,KAAI,SAAS,SAKX,QACE,qBAAC;EAAK,eAAc;EAAS,OAAM;aALpB,OAAO,kBACtB,SAAS,QACT,SAAS,WACV,CAGa,KAAK,eAAe,UAC5B,oBAAC;GAEC,UAAU;GACF;GACR,YAAY,GAAG,WAAW,GAAG;KAHxB,cAAc,OAInB,CACF,EACD,SAAS,QAAQ,kBAChB,oBAAC;GAAI,IAAG;aACN,oBAAC;IACC,YAAY,GAAG,WAAW;IAC1B,OAAM;IACN,eAAe,SAAS,QAAQ,YAAY,GAAG;KAC/C;IACE;GAEH;AAIX,KAAI,SAAS,SAAS;EACpB,MAAM,WAAW,OAAO,kBACtB,SAAS,QACT,SAAS,WACV;AACD,MAAI,SAAS,SAAS,KAAK,SAAS,GAClC,QACE,oBAAC;GACW;GACV,eAAe,SAAS;GAChB;GACI;IACZ;;AAKR,KAAI,SAAS,aACX,QAAO,oBAAC;EAA0B;EAAsB;GAAc;AAGxE,QAAO;EAEV;;;;ACnDD,MAAa,iBAA0C,UACpD,EAAE,UAAU,eAAe,QAAQ,iBAAiB;CACnD,MAAM,mBAAmB,cAAc;CACvC,MAAM,mBAAmB,cAAc;CAEvC,MAAM,yBAAyB,WAAmB;AAChD,WAAS,QAAQ,gBAAgB,OAAO;;AAG1C,QACE,oBAAC;EACC,UAAU;EACV,eAAe;EACf,aAAa;EACK;EAClB,OACE,qBAAC;GAAK,KAAI;GAAS,YAAW;cAC5B,oBAAC;IACa;IACZ,UAAU;IACV,MAAM,cAAc,MAAM;IAC1B,cAAc,cAAc,MAAM;IAClC,YACE,oBAAC;KACC,eAAa,GAAG,WAAW;KAC3B,OAAM;KACN,QAAO;KACP,gBAAe;KACf,SAAS;eAER,cAAc,MAAM;MAChB;KAET,EACF,oBAAC;IACC,WAAW,mBAAmB,mBAAmB;IACjD,SAAS,mBAAmB,IAAI;cAEhC,qBAAC;KAAK,KAAI;KAAS,YAAW;gBAC5B,oBAAC,sBAAmB,UAAU,gBAAiB,EAC9C,cAAc,YACb,oBAAC;MACC,UAAU;MACV,YAAY,GAAG,WAAW;MAC1B,YAAY;MACZ,aAAa,cAAc;MAC3B,aAAa,cAAc;OAC3B;MAEC;KACH;IACD;YAGT,oBAAC;GACC,UAAU;GACF;GACR,YAAY,GAAG,WAAW;IAC1B;GACc;EAGvB;;;;AClED,MAAa,gBAAwC,UAClD,EAAE,UAAU,QAAQ,iBAAiB;CACpC,MAAM,WAAW,OAAO,kBACtB,SAAS,QACT,SAAS,WACV;AAED,QACE,oBAAC;EACW;EACF;EACI;EACZ;YAEA,oBAAC;GAAK,eAAc;GAAS,OAAM;aAChC,SAAS,SAAS,KAAK,SAAS,KAC/B,oBAAC;IACW;IACV,eAAe,SAAS;IAChB;IACI;KACZ,GAEF,oBAAC;IAAK,OAAM;IAAW,UAAS;IAAK,IAAG;cAAM;KAEvC;IAEJ;GACQ;EAGtB;;;;ACjCD,MAAa,oBAAgD,UAC1D,EAAE,UAAU,QAAQ,iBAAiB;AACpC,QACE,oBAAC;EACW;EACF;EACI;EACZ,aAAa,SAAS;EACtB,aAAa,SAAS;GACtB;EAGP;;;;ACVD,MAAa,qBAAkD,UAC5D,EAAE,UAAU,QAAQ,iBAAiB;CACpC,MAAM,yBAAyB,YAAY,YAAY;EACrD,MAAM,UAAU,MAAM,OAAO,kBAAkB;AAC/C,MAAI,YAAY,KACd,UAAS,QAAQ,cAAc,QAAQ;IAExC,CAAC,QAAQ,SAAS,QAAQ,CAAC;CAE9B,MAAM,kBAAkB,SAAS,MAAM;AAEvC,QACE,oBAAC;EACW;EACF;EACI;YAEZ,qBAAC;GAAK,KAAI;GAAM,YAAW;GAAS,QAAO;GAAO,IAAG;GAAM,IAAG;cAC5D,oBAAC;IAAI,OAAM;cACT,oBAAC,qBAAmB;KAChB,EACN,oBAAC;IACC,KAAI;IACJ,OAAM;IACN,gBAAe;IACf,SAAS;IACT,QAAQ;KACN,gBAAgB;KAChB,qBAAqB;KACtB;IACD,SAAS;IACT,QAAO;cAEP,oBAAC;KACC,OAAM;KACN,eAAa,GAAG,WAAW;eAE1B,mBAAmB;MACf;KACF;IACF;GACQ;EAGtB;;;;AC9CD,MAAa,cAAoC,UAC9C,EAAE,UAAU,QAAQ,iBAAiB;AACpC,QACE,oBAAC;EACW;EACF;EACI;GACZ;EAGP;;;;ACJD,MAAa,eAAsC,UAChD,EAAE,UAAU,QAAQ,YAAY,qBAAqB;CACpD,MAAM,mBAAmB;AACvB,MAAI,SAAS,SACX,QACE,oBAAC;GACW;GACF;GACI;IACZ;AAIN,MAAI,SAAS,QACX,QACE,oBAAC;GACW;GACF;GACI;IACZ;AAIN,MAAI,SAAS,aACX,QACE,oBAAC;GACW;GACF;GACI;IACZ;AAIN,MAAI,SAAS,MACX,QACE,oBAAC;GACW;GACF;GACI;IACZ;AAIN,MAAI,SAAS,YACX,QACE,oBAAC;GACW;GACF;GACI;IACZ;AAIN,SAAO;;AAGT,KAAI,eACF,QACE,qBAAC,kBACC,oBAAC;EAAK,OAAM;EAAW,UAAS;EAAK,IAAG;EAAO,IAAG;YAAO;GAElD,EACN,YAAY,IACT;AAIV,QAAO,YAAY;EAEtB;;;;AChFD,MAAa,aAAiC,EAAE,eAC9C,oBAAC;CAAI,IAAG;CAAO,IAAG;CAAI,IAAG;CAAW,cAAa;CAAK,YAAW;CAC9D;EACG;;;;ACHR,MAAa,WAA6B,EAAE,eAC1C,oBAAC;CACC,IAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAG;CACH,cAAa;CACb,YAAW;CAEV;EACG;;;;ACMR,MAAa,gBAAuC,EAClD,QACA,SACA,OACA,UACA,QACA,WAAW,cACP;AACJ,QACE,oBAAC;EACC,MAAM;EACN,eAAe,EAAE,WAAW,CAAC,QAAQ,SAAS;EAC9C,MAAK;YAEL,qBAAC,qBACC,oBAAC,mBAAiB,EAClB,oBAAC,8BACC,qBAAC;GAAwB;;IACvB,oBAAC,0BACC,oBAAC,yBAAa,QAAoB,GACrB;IAEf,oBAAC,cAAY,WAAsB;IAElC,UACC,oBAAC,0BACC,oBAAC;KAAK,SAAQ;KAAgB,OAAM;eACjC;MACI,GACM;IAGjB,oBAAC,uBAAqB;;IACR,GACC,IACZ;GACE;;;;;AC9CjB,MAAa,uBAAqD,EAChE,aACA,UACA,WACA,eAAe,WACf,kBAAkB,OAClB,iBAAiB,OACjB,cAAc,WACV;AACJ,QACE,8CACG,eAAe,oBAAC,UAAM,EACvB,qBAAC;EAAK,KAAK;aACT,oBAAC;GAAO,SAAQ;GAAU,SAAS;aAAU;IAEpC,EACR,eAAe,aACd,oBAAC;GACC,SAAQ;GACR,SAAS;GACT,UAAU;GACV,SAAS;aAER;IACM;GAEN,IACN;;;;;AC3BP,MAAa,iBAA4C;CACvD,KAAK;CACL,QAAQ;CACR,MAAM;CACN,SAAS;CACV;AAED,MAAa,sBAAsB,UAA2B;AAC5D,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAEvC,QAAO,KAAK,UAAU,MAAM;;AAG9B,MAAa,qBAAqB,UAA2B;AAC3D,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO,SAAS;AAElB,QAAO,KAAK,UAAU,MAAM;;AAG9B,MAAa,oBAAoB,UAAwC;AACvE,KAAI,MAAM,OAAO,UAAU,MAAM,KAC/B,QAAO,wBAAwB,MAAM,KAAK;AAE5C,QAAO;;AAGT,MAAa,8BACX,IACA,iBACA,mBACqB;AACrB,KAAI,OAAO,SACT,QAAO,EAAE;AAEX,KAAI,OAAO,SAAS,eAClB,QAAO,gBAAgB,QAAQ,MAAM,EAAE,aAAa,UAAU;AAEhE,QAAO;;;;;AC5CT,MAAa,wBAAuD,EAClE,kBACI;CACJ,MAAM,EAAE,OAAO,cAAc;CAC7B,MAAM,gBAAgB,eAAe,MAAM;AAE3C,SAAQ,MAAM,IAAd;EACE,KAAK,MACH,QACE,qBAAC;GAAK,OAAM;GAAS,KAAK;cACxB,oBAAC;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,qBAAC;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,oBAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,SACH,QACE,qBAAC;GAAK,OAAM;GAAS,KAAK;cACxB,oBAAC;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,qBAAC;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,oBAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,QAAQ;GACX,MAAM,YAAY,iBAAiB,MAAM;AACzC,OAAI,YAAY,SACd,QACE,qBAAC;IAAK,OAAM;IAAS,KAAK;eACxB,oBAAC;KACC,IAAI;KACJ,OAAM;KACN,SAAS;KACT,YAAY;MACZ,EACF,qBAAC;KAAK,UAAS;KAAK,OAAM;;MAAW;MACrB,oBAAC,uBAAW,YAAsB;;MAAI;MACpD,oBAAC,uBAAW,YAAsB;;MAC7B;KACF;AAGX,UACE,qBAAC;IAAK,OAAM;IAAS,KAAK;;KACxB,oBAAC;MACC,IAAI;MACJ,OAAM;MACN,SAAS;MACT,YAAY;OACZ;KACF,qBAAC;MAAK,UAAS;MAAK,OAAM;;OAAW;OACvB,oBAAC,uBAAW,YAAsB;;OAAI;OAClD,oBAAC,uBAAW,YAAsB;;OAC7B;KACN,YAAY,kBACX,oBAAC;MAAM,MAAK;MAAK,cAAa;MAAS,SAAQ;gBAAS;OAEhD;;KAEL;;EAGX,KAAK,UACH,QACE,qBAAC;GAAK,OAAM;GAAS,KAAK;cACxB,oBAAC;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,qBAAC;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,oBAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,QACE,QACE,qBAAC;GAAK,OAAM;GAAS,KAAK;cACxB,oBAAC;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,qBAAC;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,oBAAC,uBAAW,YAAsB;;;KACnC;IACF;;;;;;ACrGf,MAAa,mBAA6C,EAAE,cAAc;CACxE,MAAM,EAAE,OAAO,MAAM,sBAAsB;AAE3C,KAAI,kBACF,QAAO;CAGT,MAAM,iBAAiB,mBAAmB,MAAM;CAChD,MAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,QACE,qBAAC;EACC,OAAO,cAAc,eAAe;EACpC,KAAK;EACL,UAAS;EACT,OAAM;EACN,IAAI;;GAEJ,oBAAC;IAAK,OAAM;cAAW;KAAe;GACtC,oBAAC;IACC,IAAG;IACH,IAAI,cAAc,IAAI;IACtB,IAAI,cAAc,MAAM;IACxB,IAAG;IACH,cAAa;IACb,YAAW;IACX,YAAY,cAAc,QAAQ;cAEjC;KACG;GACN,qBAAC;IAAK,OAAM;;KAAW;KAAE;KAAK;;KAAQ;;GACjC;;;;;AChCX,MAAa,iBAAyC,EAAE,eAAe;AACrE,KAAI,aAAa,OACf,QAAO;AAGT,KAAI,aAAa,WACf,QACE,oBAAC;EAAM,MAAK;EAAK,cAAa;EAAS,SAAQ;YAAS;GAEhD;AAIZ,QACE,oBAAC;EAAM,MAAK;EAAK,cAAa;EAAM,SAAQ;YAAS;GAE7C;;;;;ACbZ,MAAa,yBAAyD,EACpE,WACI;AACJ,QACE,qBAAC;EAAO,OAAM;EAAU,KAAK;EAAG,IAAI;aAClC,qBAAC;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,UAAS;cACjD,KAAK,MAAM,KAAK,MAAM,cACrB,qBAAC;IAAqB,OAAM;IAAS,KAAK;eACvC,YAAY,KAAK,oBAAC;KAAK,OAAM;eAAW;MAAQ,EACjD,oBAAC;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;eAC1C,KAAK;MACA;MAJC,KAAK,KAKT,CACP,EACF,oBAAC,iBAAc,UAAU,KAAK,mBAAoB;IAC7C,EAEP,qBAAC;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,OAAM;;IAC/C,oBAAC;KAAK,OAAM;eAAW;MAAe;IACtC,oBAAC,qBAAS,KAAK,UAAU,KAAK,QAAQ,OAAO,GAAW;IACxD,oBAAC;KAAK,IAAI;KAAc,OAAM;KAAW,YAAY;MAAK;IAC1D,oBAAC,qBAAS,KAAK,UAAU,KAAK,QAAQ,MAAM,GAAW;;IAClD;GACA;;;;;ACvBb,MAAa,kBAA2C,EACtD,OACA,WACA,cAEA,qBAAC;CACC,OAAM;CACN,KAAK;CACL,UAAS;CACT,OAAM;CACN,IAAI;CACJ,UAAS;;EAET,qBAAC;GAAK,OAAM;cAAY,OAAM;IAAQ;EACtC,oBAAC,qBAAS,YAAoB;EAC9B,oBAAC;GAAK,IAAI;GAAc,OAAM;GAAW,YAAY;IAAK;EAC1D,oBAAC,qBAAS,UAAkB;;EACvB;;;;ACVT,MAAa,WAA8B,UAAU,EAAE,kBAAkB;CACvE,MAAM,EAAE,OAAO,YAAY,oBAAoB;CAE/C,MAAM,qBAAqB,cAEvB,aACI,oCACE,WAAW,UACX,WAAW,OACZ,GACD,MACN,CAAC,WAAW,CACb;CACD,MAAM,iBAAiB,cAAc;AACnC,MAAI,MAAM,OAAO,SAAS,MAAM,UAAU,OACxC,QAAO,uBAAuB;GAC5B,IAAI;GACJ,MAAM,MAAM;GACZ,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;IACN,CAAC,MAAM,CAAC;CAEX,MAAM,kBAAkB,cAChB,2BAA2B,MAAM,IAAI,iBAAiB,eAAe,EAC3E;EAAC,MAAM;EAAI;EAAiB;EAAe,CAC5C;AAED,QACE,qBAAC;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;;GAEzB,oBAAC,wBAAkC,cAAe;GAEjD,kBACC,oBAAC;IAAI,IAAI;IAAG,IAAI;cACd,oBAAC,mBAAgB,SAAS,iBAAkB;KACxC;GAGP,sBACC,oBAAC;IAAI,IAAI;IAAG,IAAI;cACd,oBAAC,yBAAsB,MAAM,qBAAsB;KAC/C;GAGP,gBAAgB,KAAK,WACpB,oBAAC;IAA0B,IAAI;IAAG,IAAI;cACpC,oBAAC;KACC,OAAO,OAAO;KACd,WAAW,kBAAkB,OAAO,KAAK;KACzC,SAAS,kBAAkB,OAAO,GAAG;MACrC;MALM,OAAO,SAMX,CACN;;GACE;EAER;;;;ACvEF,MAAa,oBAA+C,EAAE,aAAa;AACzE,QACE,oBAAC;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;YAEzB,qBAAC;GAAK,OAAM;GAAS,KAAK;cACxB,oBAAC;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,qBAAC;IAAK,UAAS;IAAK,OAAM;;KAAW;KAChB,oBAAC,uBAAW,OAAO,iBAA2B;;KAAI;KACrE,oBAAC,uBAAW,OAAO,iBAA2B;;KACzC;IACF;GACH;;;;;ACpBV,MAAa,aAAiC,EAAE,SAAS,MAAM,gBAC7D,oBAAC;CAAI,IAAI;CAAG,IAAI;WACd,qBAAC;EAAK,OAAM;EAAS,KAAK;aACxB,oBAAC;GAAK,IAAI;GAAiB,OAAM;GAAW,SAAS;GAAG,YAAY;IAAK,EACzE,qBAAC;GAAK,UAAS;GAAK,OAAM;;IACvB,SAAS,aACR,oBAAC;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,SAAS,aACR,oBAAC;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,aACC,qBAAC;KAAI,IAAG;KAAO,YAAW;;MACvB;MAAU;MAAE;;MACT;IAEP;;IACI;GACF;EACH;;;;AC1BR,MAAa,gBAAuC,EAAE,UAAU,eAAe;AAC7E,QACE,qBAAC,QAAQ,mBACP,oBAAC,QAAQ;EAAQ;YACf,qBAAC;GAAO,SAAQ;GAAQ,MAAK;GAAK,OAAM;GAAqB;cAC3D,oBAAC,QAAK,IAAI,8BAA+B;IAElC;GACO,EAClB,oBAAC,QAAQ,wBACP,qBAAC,QAAQ,sBACP,oBAAC,QAAQ,UAAQ,EACjB,qBAAC,QAAQ,mBACP,oBAAC;EAAK,UAAS;EAAK,IAAI;YAAG;GAEpB,EACP,qBAAC;EAAK,KAAK;EAAG,SAAQ;aACpB,oBAAC,QAAQ;GAAa;aACpB,oBAAC;IAAO,SAAQ;IAAU,MAAK;cAAK;KAE3B;IACY,EACvB,oBAAC,QAAQ;GAAa;aACpB,oBAAC;IACC,SAAQ;IACR,MAAK;IACL,cAAa;IACb,SAAS;cACV;KAEQ;IACY;GAClB,IACM,IACC,GACC,IACR;;;;;AC5BnB,MAAa,qBAAkD,UAC5D,EAAE,QAAQ,SAAS,SAAS;AAC3B,QACE,oBAAC;EACS;EACC;EACT,OAAO,sBAAsB,GAAG,QAAQ;EACxC,QACE,oBAAC;GACC,aACE,GAAG,YAAY,oBAAC,gBAAa,UAAU,GAAG,SAAU,GAAG;GAEzD,UAAU;GACV,aAAa;IACb;YAGJ,oBAAC;GAAO,OAAM;GAAU,KAAK;aAC3B,qBAAC;IACC,QAAO;IACP,aAAY;IACZ,cAAa;IACb,IAAG;IACH,UAAS;eAET,oBAAC;KACC,IAAI;KACJ,IAAI;KACJ,IAAG;KACH,cAAa;KACb,aAAY;eAEZ,oBAAC;MAAK,UAAS;MAAK,YAAW;MAAS,OAAM;gBAAW;OAElD;MACH,EACN,qBAAC;KACC,OAAM;KACN,KAAK;KACL,SAAQ;KACR,aAAY;;MAEX,GAAG,gBACF,oBAAC;OAEC,SAAS,GAAG;OACZ,MAAK;SAFD,gBAGJ;MAEH,GAAG,iBAAiB,KAAK,UACxB,oBAAC;OAEC,SAAS,MAAM;OACf,MAAK;SAFA,cAAc,MAAM,SAGzB,CACF;MACD,GAAG,cAAc,KAAK,UACrB,oBAAC;OAEC,SAAS,MAAM;OACf,MAAK;OACL,WAAW,MAAM;SAHZ,WAAW,MAAM,aAAa,GAAG,GAAG,MAAM,UAI/C,CACF;;MACK;KACL;IACC;GACI;EAGpB;;;;ACpED,MAAa,sBAAoD,UAC9D,EAAE,QAAQ,SAAS,SAAS;CAC3B,MAAM,kBAAkB,kBAAkB,GAAG,kBAAkB;AAE/D,QACE,oBAAC;EACS;EACC;EACT,OAAO,uBAAuB,GAAG,QAAQ;EACzC,QACE,oBAAC;GACC,aACE,oBAAC;IAAa,UAAU,GAAG;IAAQ,UAAU,CAAC,GAAG;KAAc;GAEjE,UAAU;GACV,WAAW,GAAG;GACd,cAAc;GACd,iBAAiB,CAAC,GAAG;GACrB,gBAAgB,GAAG;IACnB;YAGJ,oBAAC;GAAO,OAAM;GAAU,KAAK;aAC1B,GAAG,aACF;IACE,qBAAC,aAAa;KACZ,MAAK;KACL,OAAO,GAAG;KACV,gBAAgB,YACd,GAAG,YAAY,QAAQ,MAA+B;gBAGxD,oBAAC,aAAa,cAAY,EAC1B,oBAAC,aAAa,SAAM,OAAO,CAAC,WAAW,UAAU,GAAI;MACnC;IAEpB,oBAAC;KACC,QAAO;KACP,aAAY;KACZ,cAAa;KACb,UAAS;KACT,WAAU;KACV,WAAU;eAET,GAAG,aAAa,YACf,8CACG,GAAG,iBACF,oBAAC,oBAAiB,QAAQ,GAAG,gBAAiB,EAE/C,GAAG,QAAQ,KAAK,gBACf,oBAAC,YAEc,eADR,GAAG,YAAY,MAAM,GAAG,GAAG,YAAY,MAAM,OAElD,CACF,IACD,GAEH,oBAAC;MAAS;MAAS,MAAM,GAAG,QAAQ,KAAK,MAAM,EAAE,MAAM;OAAI;MAEzD;IAEN,oBAAC;KAAK,UAAS;KAAK,OAAM;eAAW;MAG9B;OACN,GAEH,oBAAC;IAAK,SAAQ;IAAS,OAAM;IAAS,WAAU;cAC9C,oBAAC;KAAK,OAAM;KAAW,UAAS;eAAK;MAE9B;KACF;IAEF;GACI;EAGpB;;;;AClFD,MAAa,oBAAgD,UAC1D,EAAE,QAAQ,SAAS,SAAS;AAC3B,QACE,oBAAC;EACS;EACC;EACT,OAAO,iBAAiB,GAAG,QAAQ;EACnC,QACE,oBAAC;GACC,UAAU;GACV,WAAW,GAAG;GACd,cAAa;GACb,gBAAgB,GAAG;IACnB;YAGJ,qBAAC;GAAO,OAAM;GAAU,KAAK;cAC3B,qBAAC,aAAa;IACZ,MAAK;IACL,OAAO,GAAG;IACV,gBAAgB,YACd,GAAG,YAAY,QAAQ,MAA8B;eAGvD,oBAAC,aAAa,cAAY,EAC1B,oBAAC,aAAa,SAAM,OAAO,CAAC,WAAW,SAAS,GAAI;KAClC,EACpB,oBAAC;IACC,QAAO;IACP,aAAY;IACZ,cAAa;IACb,UAAS;IACT,WAAU;IACV,WAAU;cAET,GAAG,aAAa,YACf,oBAAC;KAAS;KAAS,MAAO,GAAG,eAAe;MAAsB,GAElE,oBAAC;KAAS;KAAS,MAAO,GAAG,eAAe;MAAsB;KAEhE;IACC;GACI;EAGpB;;;;ACnCD,MAAa,eAAsC,UAChD,EAAE,IAAI,YAAY,YAAY,eAAe,cAAc;AAC1D,QACE,qBAAC;EACC,MAAM;EACN,eAAc;EACd,KAAI;EACJ,KAAK,EACH,gCAAgC,EAAE,SAAS,GAAG,EAC/C;EACD,eAAa;;GAEb,qBAAC;IACC,gBAAe;IACf,OAAM;IACN,YAAW;IACX,eAAc;eAEd,qBAAC;KACE;KACA,GAAG,0BACF,qBAAC;MACC,MAAK;MACL,SAAQ;MACR,SAAS,GAAG;MACZ,eAAY;;OACb;OACiB,GAAG;OAAY;;OACxB;KAEV,eAAe,QACd,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,SAAS,cAAc;MACvB,SAAS,GAAG;MACZ,eAAa,cAAc;gBAE1B,cAAc;OACR;QAEP,EACN,oBAAC;KAAI,WAAU;KAAsB,SAAS;eAC5C,oBAAC;MACC,oBAAoB;MACpB,MAAM,GAAG;MACT,WAAW,SAAS,GAAG,YAAY,KAAK;OACxC;MACE;KACD;GAEN,GAAG,aAAa,mBAAmB,QAClC,oBAAC;IACC,MAAM,OACJ,GAAG,KAAK,SAAS,gBAAgB,GAAG;IAEtC,UAAU;IACV,WAAW,GAAG,KAAK,SAAS;IAC5B,SAAS;IACT,eAAc;cAEd,oBAAC;KACC,UAAU,GAAG,KAAK;KAClB,QAAQ,GAAG;KACX,YAAW;MACX;KACE;GAGP,GAAG,aAAa,mBAAmB,QAClC,oBAAC;IACC;IACA,MAAM,GAAG,gBAAgB;KACzB;GAGJ,oBAAC;IACC,QAAQ,GAAG;IACX,SAAS,GAAG;IACZ,IAAI,GAAG;KACP;GAED;;GACI;EAGZ;;;;ACnGD,MAAa,uBAAsD,UAChE,EAAE,SAAS;AACV,QACE,oBAAC;EACK;EACJ,YAAW;EACX,YACE,oBAAC;GACC,YAAW;GACX,SAAS,GAAG;IACZ;EAEJ,eAAe;GACb,MAAM,GAAG;GACT,OAAO;GACP,QAAQ;GACR,SAAS,GAAG;GACb;EACD,SACE,oBAAC;GACC,QAAQ,GAAG;GACX,SAAS,GAAG;GACZ,IAAI,GAAG;IACP;GAEJ;EAGP;;;;AC5BD,MAAa,uBAAsD,UAChE,EAAE,SAAS;AACV,QACE,oBAAC;EACK;EACJ,YAAW;EACX,YACE,oBAAC;GACC,YAAW;GACX,SAAS,GAAG;IACZ;EAEJ,eAAe;GACb,MAAM,GAAG;GACT,OAAO,kBAAkB,GAAG,kBAAkB;GAC9C,QAAQ;GACR,SAAS,GAAG;GACb;EACD,SACE,oBAAC;GACC,QAAQ,GAAG;GACX,SAAS,GAAG;GACZ,IAAI,GAAG;IACP;GAEJ;EAGP;;;;AC/BD,IAAI,gBAAgB;AAEpB,SAAgB,iBAAyB;AACvC,QAAO,QAAQ,EAAE;;AAOnB,IAAsB,gBAAtB,MAAyD;CACvD,AAAS;CAET,AAAS;CAET,AAAQ,UAA4B;CACpC,AAAiB;CAEjB,YAAY,IAAwB,MAAc,QAA0B;AAC1E,OAAK,KAAK,MAAM,gBAAgB;AAChC,OAAK,QAAQ;AACb,OAAK,SAAS;;CAGhB,IAAI,SAA2B;AAC7B,SAAO,KAAK;;CAGd,IAAI,OAAO,OAAyB;AAClC,OAAK,UAAU;;CAGjB,IAAI,OAAe;AACjB,SAAO,KAAK;;CAMd,WAAoC;AAClC,SAAO;;CAGT,UAAkC;AAChC,SAAO;;CAGT,cAA0C;AACxC,SAAO;;CAGT,IAAI,SAAgC;AAClC,SAAO,EAAE;;CAGX,IAAI,WAAkC;AACpC,SAAO,EAAE;;CAGX,IAAI,UAAmB;AACrB,SAAO,KAAK,OAAO,WAAW;;CAGhC,IAAI,cAAuB;AACzB,SAAO,KAAK,SAAS,SAAS;;;;;;AC9DlC,IAAsB,yBAAtB,cAGU,cAEV;CACE,AAAU;CACV,AAAU;CACV,AAAU,kBAAyC;CAEnD,YACE,IACA,MACA,QACA,OACA,cACA;AACA,QAAM,IAAI,MAAM,OAAO;EACvB,MAAM,eAAe,SAAU,OAAO,WAAiB;AACvD,OAAK,SAAS;AACd,OAAK,aAAa;;CAGpB,AAAU,iBAAuB;AAC/B,iBAGE,MAAM;GACN,QAAQ;GACR,YAAY;GACZ,iBAAiB;GACjB,OAAO;GACP,WAAW;GACX,SAAS;GACT,QAAQ;GACR,UAAU;GACV,UAAU;GACV,mBAAmB;GACnB,QAAQ;GACR,QAAQ;GACT,CAAC;;CAGJ,IAAI,QAAW;AACb,SAAO,KAAK;;CAGd,IAAI,MAAM,UAAa;AACrB,MAAI,KAAK,WACP,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS;;CAGhB,IAAI,YAAe;AACjB,SAAO,KAAK;;CAGd,IAAI,UAAmB;AACrB,SAAO,KAAK,WAAW,KAAK;;CAK9B,IAAI,UAAyC;EAC3C,MAAM,WAAW,KAAK,OAAO;AAC7B,MAAI,SACF,QAAO;GAAE,YAAY,SAAS;GAAY,SAAS,SAAS;GAAS;;CAKzE,IAAI,iBAAwC;AAC1C,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,OAAO,aAAa,QAAQ,KAAK,YAAY;;CAG3D,gBAAmB;AACjB,SAAO,KAAK;;CAGd,SAAS,OAAgB,SAAwC;AAC/D,MAAI,KAAK,cAAc,CAAC,SAAS,SAC/B,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS,KAAK,YAAY,MAAM;;CAKvC,kBAAkB,SAAsC;AACtD,OAAK,kBAAkB;;CAGzB,SAAe;AACb,OAAK,aAAa,KAAK;;CAGzB,SAAe;AACb,OAAK,SAAS,KAAK;;CAGrB,AAAS,cAA0C;AACjD,SAAO;;CAGT,IAAa,SAAgC;AAC3C,SAAO,KAAK,eAAe;;CAG7B,AAAU,gBAAuC;AAC/C,SAAO,EAAE;;CAGX,IAAa,WAAkC;AAC7C,MAAI,CAAC,KAAK,gBACR,QAAO,EAAE;AAGX,SAAO,CACL;GACE,UAAU;GACV,MAAM,KAAK,gBAAgB;GAC3B,SAAS,KAAK,gBAAgB;GAC9B,MAAM,KAAK;GACX,QAAQ;IACN,YAAY,KAAK,gBAAgB;IACjC,eAAe,KAAK,gBAAgB;IACrC;GACF,CACF;;;;;;ACjHL,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;AChCF,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,GAAG;AAClC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,SAAO,OAAO,MAAM;;CAGtB,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;AAE/B,OAAK,iBAAiB,OAAO;AAC7B,OAAK,mBAAmB,OAAO;AAC/B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,aAAa,OAAO;AAEzB,SAAO;;CAGT,AAAQ,iBAAiB,QAA4B;AACnD,MAAI,KAAK,OAAO,YAAY,KAAK,WAAW,GAC1C,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACZ,CAAC;;CAIN,AAAQ,mBAAmB,QAA4B;EACrD,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,cAAc,KAAK,WAAW,GAChC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,gBAAgB,WAAW;GACpC,MAAM,KAAK;GACX,QAAQ,EAAE,OAAO,YAAY;GAC9B,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MACE,cAAc,UACd,KAAK,OAAO,SAAS,KACrB,KAAK,OAAO,SAAS,UAErB,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MAAI,cAAc,UAAa,KAAK,OAAO,SAAS,UAClD,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,gBAAgB,QAA4B;EAClD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,CAAC,WAAW,KAAK,OAAO,WAAW,EACrC;AAGF,MAAI;AACF,OAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,OAAO,CACxC,QAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;UAEE;AACN,UAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;;;CAIN,AAAQ,aAAa,QAA4B;EAC/C,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;;;;;;ACvIR,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,EAAE;AACjC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,SAAO,OAAO,MAAM,IAAI;;CAG1B,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;EAE/B,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,0BAA0B;GACnC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,yBAAyB;GAClC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;AAGJ,SAAO;;;;;;AChEX,IAAa,mBAAb,cAAsC,uBAAgC;CACpE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,MAAM;AACrC,OAAK,gBAAgB;;CAGvB,IAAI,eAAwB;AAC1B,SAAQ,KAAK,OAAO,WAAuB;;CAG7C,AAAU,YAAY,OAAyB;AAC7C,MAAI,OAAO,UAAU,UACnB,QAAO;AAET,SAAO,QAAQ,MAAM;;;;;;ACnBzB,IAAa,kBAAb,cAAqC,cAA0C;CAC7E,AAAS,OAAO,UAAU;CAE1B,AAAQ,4BAAoC,IAAI,KAAK;CACrD,AAAQ,gCAAwC,IAAI,KAAK;CAEzD,YACE,IACA,MACA,QACA,UACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,SACF,MAAK,MAAM,SAAS,UAAU;AAC5B,QAAK,UAAU,IAAI,MAAM,MAAM,MAAM;AACrC,SAAM,SAAS;;AAInB,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAE5C,iBAA+D,MAAM;GACnE,WAAW;GACX,eAAe;GACf,OAAO;GACP,UAAU;GACV,SAAS;GACT,QAAQ;GACR,UAAU;GACV,UAAU;GACV,aAAa;GACb,QAAQ;GACR,QAAQ;GACT,CAAC;;CAGJ,IAAI,QAAmC;AACrC,SAAO,OAAO,YAAY,KAAK,UAAU;;CAG3C,IAAI,WAAiC;AACnC,SAAO,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;;CAG5C,gBAAyC;EACvC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,SAAS,KAAK,UAC7B,QAAO,OAAO,KAAK,eAAe;AAEpC,SAAO;;CAGT,MAAM,MAAqC;AACzC,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;AAC9B,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;EAC9B,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK,KAAK;AAC9C,MAAI,SACF,UAAS,SAAS;AAEpB,OAAK,SAAS;AACd,OAAK,UAAU,IAAI,KAAK,MAAM,KAAK;;CAGrC,YAAY,MAAoB;EAC9B,MAAM,OAAO,KAAK,UAAU,IAAI,KAAK;AACrC,MAAI,MAAM;AACR,QAAK,SAAS;AACd,QAAK,UAAU,OAAO,KAAK;;;CAI/B,IAAI,UAAmB;AACrB,MAAI,KAAK,UAAU,SAAS,KAAK,cAAc,KAC7C,QAAO;AAGT,OAAK,MAAM,CAAC,KAAK,UAAU,KAAK,UAC9B,KAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAClC,QAAO;AAIX,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,aAAa,SAAU,MAA+B,QACxD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAC5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;CAKhD,SAAe;AACb,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,OAAM,SAAS;AAGjB,OAAK,YAAY,IAAI,IAAI,KAAK,cAAc;AAE5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,EAAE;AAC3C,SAAM,SAAS;AACf,OAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;;CAKhD,AAAS,WAAqC;AAC5C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,QAAO,KAAK,GAAG,MAAM,OAAO;AAG9B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,UAAS,KAAK,GAAG,MAAM,SAAS;AAGlC,SAAO;;;;;;AC/IX,IAAa,iBAAb,cAAoC,cAAyC;CAC3E,AAAS,OAAO,UAAU;CAE1B,AAAQ,SAAsB,EAAE;CAChC,AAAQ,aAA0B,EAAE;CACpC,AAAQ,eAAmC;CAE3C,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,MACF,MAAK,MAAM,QAAQ,OAAO;AACxB,QAAK,SAAS;AACd,QAAK,OAAO,KAAK,KAAK;;AAI1B,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAElC,iBAAwD,MAAM;GAC5D,QAAQ;GACR,YAAY;GACZ,OAAO;GACP,QAAQ;GACR,SAAS;GACT,QAAQ;GACR,UAAU;GACV,MAAM;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,WAAW;GACX,OAAO;GACP,QAAQ;GACR,QAAQ;GACR,WAAW;GACX,eAAe;GAChB,CAAC;;CAGJ,IAAI,QAA8B;AAChC,SAAO,KAAK;;CAGd,IAAI,SAAiB;AACnB,SAAO,KAAK,OAAO;;CAGrB,gBAA2B;AACzB,SAAO,KAAK,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC;;CAGxD,GAAG,OAAsC;AACvC,MAAI,QAAQ,EACV,QAAO,KAAK,OAAO,KAAK,OAAO,SAAS;AAE1C,SAAO,KAAK,OAAO;;CAGrB,KAAK,MAAuB;AAC1B,OAAK,SAAS;AACd,OAAK,OAAO,KAAK,KAAK;;CAGxB,SAAS,OAAe,MAAuB;AAC7C,MAAI,QAAQ,KAAK,QAAQ,KAAK,OAAO,OACnC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;AAElD,OAAK,SAAS;AACd,OAAK,OAAO,OAAO,OAAO,GAAG,KAAK;;CAGpC,SAAS,OAAqB;AAC5B,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC;AAC7C,MAAI,QACF,SAAQ,SAAS;;CAIrB,KAAK,WAAmB,SAAuB;AAC7C,MAAI,YAAY,KAAK,aAAa,KAAK,OAAO,OAC5C,OAAM,IAAI,MAAM,+BAA+B,YAAY;AAE7D,MAAI,UAAU,KAAK,WAAW,KAAK,OAAO,OACxC,OAAM,IAAI,MAAM,+BAA+B,UAAU;AAE3D,MAAI,cAAc,QAChB;EAGF,MAAM,CAAC,QAAQ,KAAK,OAAO,OAAO,WAAW,EAAE;AAC/C,MAAI,KACF,MAAK,OAAO,OAAO,SAAS,GAAG,KAAK;;CAIxC,UAAU,OAAe,MAAuB;AAC9C,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,QACF,SAAQ,SAAS;AAEnB,OAAK,SAAS;AACd,OAAK,OAAO,SAAS;;CAGvB,QAAc;AACZ,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAEhB,OAAK,OAAO,SAAS;;CAGvB,eAAe,SAA4B;AACzC,OAAK,eAAe;;CAGtB,UAAU,OAAuB;EAC/B,MAAM,OAAO,KAAK,eAAe,KAAK,OAAO,QAAQ,MAAM;AAC3D,OAAK,KAAK,KAAK;;CAGjB,cAAc,OAAe,OAAuB;EAClD,MAAM,OAAO,KAAK,eAAe,OAAO,MAAM;AAC9C,OAAK,SAAS,OAAO,KAAK;;CAG5B,AAAQ,eAAe,OAAe,OAA4B;AAChE,MAAI,CAAC,KAAK,aACR,OAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,YAAY,UAAU,SAAY,WAAW,UAAU;EAC7D,MAAM,OAAO,KAAK,aAAa,OAAO,OAAO,MAAM,EAAE,YAAY,UAAU;AAE3E,OAAK,iBAAiB,KAAK;AAE3B,SAAO;;CAGT,AAAQ,iBAAiB,MAAuB;AAC9C,MAAI,CAAC,KAAK,aACR;AAGF,MAAI,KAAK,SAAS,EAAE;AAClB,QAAK,eAAe,KAAK,aAAa;AACtC,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,iBAAiB,KAAK;aAEpB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,iBAAiB,MAAM;;CAKlC,IAAI,UAAmB;AACrB,MAAI,KAAK,OAAO,WAAW,KAAK,WAAW,OACzC,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,IACtC,KAAI,KAAK,OAAO,OAAO,KAAK,WAAW,GACrC,QAAO;AAIX,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,aAAa,QAAS,KAA8B,QACtD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAClC,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;CAK/C,SAAe;AACb,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAGhB,OAAK,SAAS,CAAC,GAAG,KAAK,WAAW;AAElC,OAAK,MAAM,QAAQ,KAAK,QAAQ;AAC9B,QAAK,SAAS;AACd,OAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;;CAK/C,AAAS,UAAmC;AAC1C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,QAAQ,KAAK,OACtB,QAAO,KAAK,GAAG,KAAK,OAAO;AAG7B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,QAAQ,KAAK,OACtB,UAAS,KAAK,GAAG,KAAK,SAAS;AAGjC,SAAO;;;;;;ACrOX,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,4BAAY,IAAI,KAA4B;CAE7D,SAAS,YAAoB,SAA8B;AACzD,OAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,SAAO;;CAGT,IAAI,YAA+C;AACjD,SAAO,KAAK,UAAU,IAAI,WAAW;;CAGvC,IAAI,YAA6B;AAC/B,SAAO,KAAK,UAAU,IAAI,WAAW;;;AAIzC,IAAa,cAAb,MAAyB;CACvB,YAAY,AAAiB,UAA+B;EAA/B;;CAE7B,OACE,MACA,QACA,OACA,IACW;EACX,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,UAAU,KAAK,SAAS,IAAI,WAAW;AAE7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,wBAAwB,aAAa;AAGvD,SAAO,QAAQ,MAAM,QAAQ,OAAO,GAAG;;CAGzC,WAAW,QAA0B,OAA2B;AAC9D,SAAO,KAAK,OAAO,IAAI,QAAQ,MAAM;;;AAIzC,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,kBAAiC,MAAM,QAAQ,OAAO,OAAO;AACjE,QAAO,IAAI,iBAAiB,IAAI,MAAM,QAAQ,MAA6B;;AAG7E,SAAS,oBAAoB,aAAyC;AACpE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,WAAwB,EAAE;EAEhC,MAAM,aAAa,OAAO,cAAc,EAAE;AAC1C,OAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAAQ,WAAW,EAAE;GAC/D,MAAM,YAAY,SAAS;GAC3B,MAAM,YAAY,YAAY,OAAO,UAAU,YAAY,UAAU;AACrE,YAAS,KAAK,UAAU;;AAG1B,SAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,SAAS;;;AAI1D,SAAS,mBAAmB,aAAyC;AACnE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,aAAa,OAAO,SAAS,EAAE,MAAM,UAAU;EACrD,MAAM,QAAqB,EAAE;AAE7B,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,YAAY,SAAS;GAC3B,MAAM,WAAW,YAAY,OAAO,OAAO,EAAE,EAAE,YAAY,UAAU;AACrE,SAAM,KAAK,SAAS;;AAGtB,SAAO,IAAI,eAAe,IAAI,MAAM,QAAQ,MAAM;;;AAItD,SAAgB,wBAA6C;CAC3D,MAAM,WAAW,IAAI,qBAAqB;AAE1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,WAAW,eAAe;AAE5C,QAAO;;AAGT,SAAgB,oBAAiC;CAC/C,MAAM,WAAW,uBAAuB;CACxC,MAAM,UAAU,IAAI,YAAY,SAAS;AAEzC,UAAS,SAAS,UAAU,oBAAoB,QAAQ,CAAC;AACzD,UAAS,SAAS,SAAS,mBAAmB,QAAQ,CAAC;AAEvD,QAAO;;;;;AChHT,IAAa,OAAb,MAAa,KAAK;CAChB,AAAQ,YAAY,AAAiB,WAAmC;EAAnC;;CAErC,OAAO,QAAc;AACnB,SAAO,IAAI,KAAK,EAAE,CAAC;;CAGrB,OAAwB,cAAc;CACtC,OAAwB,aAAa;CAErC,OAAO,WAAW,MAAoB;AACpC,MAAI,CAAC,QAAQ,SAAS,GACpB,QAAO,KAAK,OAAO;EAGrB,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,KAAK,YAAY,KAAK,QAAQ;AACjD,OAAI,aAAa,OAAO,QAAW;AACjC,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;AAGF,OAAI,QAAQ,WAAW,MAAM,EAAE;AAC7B,aAAS,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,cAAU,QAAQ,MAAM,EAAE;AAC1B;;GAGF,MAAM,YAAY,KAAK,WAAW,KAAK,QAAQ;AAC/C,OAAI,YAAY,OAAO,QAAW;AAChC,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF,SAAM,IAAI,MAAM,yBAAyB,UAAU;;AAGrD,SAAO,IAAI,KAAK,SAAS;;CAG3B,OAAO,aAAa,UAAwC;AAC1D,SAAO,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC;;CAGhC,WAAmC;AACjC,SAAO,KAAK;;CAGd,UAAmB;AACjB,SAAO,KAAK,UAAU,WAAW;;CAGnC,SAAiB;AACf,SAAO,KAAK,UAAU;;CAGxB,QAAiC;AAC/B,SAAO,KAAK,UAAU;;CAGxB,OAAgC;AAC9B,SAAO,KAAK,UAAU,GAAG,GAAG;;CAG9B,SAAe;AACb,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;AAET,SAAO,IAAI,KAAK,KAAK,UAAU,MAAM,GAAG,GAAG,CAAC;;CAG9C,MAAM,MAAoB;AACxB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAY;GAAM,CAAC,CAAC;;CAGlE,WAAW,OAAqB;AAC9B,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAS;GAAO,CAAC,CAAC;;CAGhE,aAAmB;AACjB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC;;CAGzD,UAAU,QAAuB;AAC/B,MAAI,OAAO,UAAU,UAAU,KAAK,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,QAAQ,KAAK;GAChD,MAAM,YAAY,OAAO,UAAU;GACnC,MAAM,UAAU,KAAK,UAAU;AAC/B,OAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,cAAc,WAAW,QAAQ,CACnE,QAAO;;AAIX,SAAO;;CAGT,OAAO,OAAsB;AAC3B,MAAI,KAAK,UAAU,WAAW,MAAM,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;GAC9C,MAAM,UAAU,KAAK,UAAU;GAC/B,MAAM,WAAW,MAAM,UAAU;AACjC,OAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,cAAc,SAAS,SAAS,CACjE,QAAO;;AAIX,SAAO;;CAGT,WAAmB;EACjB,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,YAAY;AAC/B,OAAI,OAAO,SAAS,EAClB,WAAU;AAEZ,aAAU,QAAQ;aACT,QAAQ,SAAS,QAC1B,WAAU,IAAI,QAAQ,MAAM;WACnB,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,gBAAwB;AACtB,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;EAGT,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,WACnB,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,AAAQ,cAAc,GAAgB,GAAyB;AAC7D,MAAI,EAAE,SAAS,EAAE,KACf,QAAO;AAGT,MAAI,EAAE,SAAS,cAAc,EAAE,SAAS,WACtC,QAAO,EAAE,SAAS,EAAE;AAGtB,MAAI,EAAE,SAAS,WAAW,EAAE,SAAS,QACnC,QAAO,EAAE,UAAU,EAAE;AAGvB,SAAO;;;;;;ACjLX,IAAa,YAAb,MAAuB;CACrB,AAAiB,4BAAY,IAAI,KAAwB;CACzD,AAAiB,4BAAY,IAAI,KAAmB;CAEpD,YAAY,AAAiB,MAAiB;EAAjB;AAC3B,OAAK,SAAS;;CAGhB,SAAS,IAAmC;EAC1C,MAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,MAAI,KACF,QAAO;AAGT,OAAK,SAAS;AACd,SAAO,KAAK,UAAU,IAAI,GAAG;;CAG/B,OAAO,MAAuB;AAC5B,MAAI,KAAK,cAAc,KAAK,CAC1B,QAAO,KAAK,YAAY,KAAK;EAG/B,MAAM,SAAS,KAAK,UAAU,IAAI,KAAK,GAAG;AAC1C,MAAI,OACF,QAAO;EAGT,MAAM,OAAO,KAAK,YAAY,KAAK;AACnC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AACjC,SAAO;;CAGT,AAAQ,cAAc,MAA0B;EAC9C,IAAI,UAA4B,KAAK;AACrC,SAAO,SAAS;AACd,OAAI,QAAQ,SAAS,CACnB,QAAO;AAET,aAAU,QAAQ;;AAEpB,SAAO;;CAGT,UAAgB;AACd,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,KAAK,KAAK;;CAG3B,aAAa,MAAuB;AAClC,OAAK,UAAU,KAAK;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,OAAK,qBAAqB,KAAK;;CAGjC,AAAQ,UAAU,MAAuB;AACvC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AAEjC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,UAAU,MAAM;WAEd,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,UAAU,KAAK;;CAK1B,AAAQ,YAAY,MAAuB;EACzC,MAAM,WAEF,EAAE;EACN,IAAI,UAA4B;AAEhC,SAAO,SAAS,QAAQ;GACtB,MAAM,SAAoB,QAAQ;AAElC,OAAI,OAAO,UAAU,CACnB,UAAS,QAAQ;IAAE,MAAM;IAAY,MAAM,QAAQ;IAAM,CAAC;YACjD,OAAO,SAAS,EAAE;IAC3B,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ;AAC3C,QAAI,SAAS,EACX,UAAS,QAAQ;KAAE,MAAM;KAAS;KAAO,CAAC;;AAI9C,aAAU;;AAGZ,SAAO,KAAK,aAAa,SAAS;;CAGpC,AAAQ,qBAAqB,MAAuB;AAClD,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,UAAU;AACjC,QAAK,UAAU,OAAO,MAAM,GAAG;AAC/B,QAAK,qBAAqB,MAAM;;WAEzB,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,QAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,QAAK,qBAAqB,KAAK;;;;;;;AC3GvC,IAAa,gBAAb,MAA2B;CACzB,AAAQ,WAAqB,EAAE;CAE/B,IAAI,UAA6B;AAC/B,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,SAAS,SAAS;;CAGhC,MAAM,QAAsB;AAC1B,OAAK,SAAS,KAAK,OAAO;;CAG5B,QAAc;AACZ,OAAK,WAAW,EAAE;;CAGpB,YAAkC;EAChC,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,KAAK,UAAU;GAClC,MAAM,QAAQ,KAAK,gBAAgB,OAAO;AAC1C,WAAQ,KAAK,GAAG,MAAM;;AAGxB,SAAO;;CAGT,AAAQ,gBAAgB,QAA6B;EACnD,MAAM,OAAO,OAAO,KAAK,eAAe;AAExC,UAAQ,OAAO,MAAf;GACE,KAAK,WACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,OAAO;IAAO,CAAC;GAEvD,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAO;IAAM,OAAO,OAAO;IAAO,CAAC;GAEnD,KAAK,iBACH,QAAO,CAAC;IAAE,IAAI;IAAU;IAAM,CAAC;GAEjC,KAAK,YACH,QAAO,CAAC;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK;IAAK,OAAO,OAAO;IAAO,CAAC;GAEhE,KAAK,cACH,QAAO,CACL;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,OAAO,OAAO;IAAO,CACpE;GAEH,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAU,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,CAAC;GAE5D,KAAK,aAAa;IAChB,MAAM,YAAY,OAAO,aAAa;IACtC,MAAM,UAAU,OAAO,WAAW;AAClC,WAAO,CACL;KACE,IAAI;KACJ,MAAM,GAAG,KAAK,GAAG;KACjB,MAAM,GAAG,KAAK,GAAG;KAClB,CACF;;GAGH,KAAK,eACH,QAAO,CACL;IACE,IAAI;IACJ,MAAM,GAAG,KAAK,GAAG,OAAO;IACxB,OAAO,OAAO;IACf,CACF;GAEH,KAAK,aACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,EAAE;IAAE,CAAC;GAE7C,QACE,QAAO,EAAE;;;;;;;ACxEjB,IAAa,YAAb,MAAuB;CACrB,AAAiB;CACjB,AAAiB;CACjB,AAAQ,iBAAuC;CAE/C,YAAY,AAAiB,OAAkB;EAAlB;AAC3B,OAAK,QAAQ,IAAI,UAAU,MAAM;AACjC,OAAK,gBAAgB,IAAI,eAAe;AAExC,iBAAe,MAAM;GACnB,WAAW;GACX,aAAa;GACb,gBAAgB;GAChB,SAAS;GACT,gBAAgB;GAChB,SAAS;GACT,QAAQ;GACR,QAAQ;GACT,CAAC;;CAGJ,IAAI,OAAkB;AACpB,SAAO,KAAK;;CAGd,SAAS,IAAmC;AAC1C,SAAO,KAAK,MAAM,SAAS,GAAG;;CAGhC,IAAI,MAAqC;AACvC,SAAO,KAAK,UAAU,KAAK,WAAW,KAAK,CAAC;;CAG9C,UAAU,MAAmC;AAC3C,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK;EAGd,IAAI,UAAiC,KAAK;AAE1C,OAAK,MAAM,WAAW,KAAK,UAAU,EAAE;AACrC,OAAI,CAAC,QACH;AAGF,aAAU,KAAK,eAAe,SAAS,QAAQ;;AAGjD,SAAO;;CAGT,AAAQ,eACN,MACA,SACuB;AACvB,MAAI,QAAQ,SAAS,cAAc,KAAK,UAAU,CAChD,QAAO,KAAK,MAAM,QAAQ,KAAK;AAEjC,MAAI,QAAQ,SAAS,WAAW,KAAK,SAAS,CAC5C,QAAO,KAAK,GAAG,QAAQ,MAAM;;CAKjC,OAAO,UAAoC;EACzC,MAAM,OACJ,OAAO,aAAa,WAAW,KAAK,SAAS,SAAS,GAAG;AAC3D,MAAI,CAAC,KACH,QAAO,KAAK,OAAO;AAErB,SAAO,KAAK,MAAM,OAAO,KAAK;;CAGhC,IAAI,YAAmC;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAI,cAAqC;AACvC,SAAO,KAAK,MAAM;;CAGpB,IAAI,iBAAwC;AAC1C,SAAO,CAAC,GAAG,KAAK,WAAW,GAAG,KAAK,YAAY;;CAGjD,IAAI,UAAmB;AACrB,SAAO,KAAK,UAAU,WAAW;;CAGnC,IAAI,iBAA0B;AAC5B,SAAO,KAAK,eAAe,SAAS;;CAGtC,IAAI,eAA2D;EAC7D,MAAM,sBAAM,IAAI,KAA2B;AAC3C,OAAK,MAAM,SAAS,KAAK,WAAW;GAClC,MAAM,OAAO,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;AACtC,QAAK,KAAK,MAAM;AAChB,OAAI,IAAI,MAAM,MAAM,KAAK;;AAE3B,SAAO;;CAGT,SAAS,MAAuB;AAC9B,SAAO,KAAK,IAAI,KAAK,EAAE,eAAe;;CAGxC,SAAS,MAAc,OAAsB;EAC3C,MAAM,aAAa,KAAK,WAAW,KAAK;EACxC,MAAM,OAAO,KAAK,UAAU,WAAW;AACvC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,mBAAmB,OAAO;AAE5C,MAAI,CAAC,KAAK,aAAa,CACrB,OAAM,IAAI,MAAM,2CAA2C,OAAO;EAGpE,MAAM,WAAW,KAAK;AACtB,OAAK,SAAS,MAAM;AAEpB,OAAK,cAAc,MAAM;GACvB,MAAM;GACN,MAAM;GACN;GACA;GACD,CAAC;;CAGJ,gBAAyB;AACvB,SAAO,KAAK,MAAM,eAAe;;CAGnC,IAAI,UAA6B;AAC/B,SAAO,KAAK,cAAc;;CAG5B,IAAI,aAAsB;AACxB,SAAO,KAAK,cAAc;;CAG5B,eAAqB;AACnB,OAAK,cAAc,OAAO;;CAG5B,aAAmC;AACjC,SAAO,KAAK,cAAc,WAAW;;CAGvC,YAAY,QAAsB;AAChC,OAAK,cAAc,MAAM,OAAO;;CAGlC,eAAqB;AACnB,OAAK,MAAM,SAAS;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,MAAM,qBAAqB,KAAK;;CAGvC,IAAI,UAAmB;EACrB,MAAM,OAAO,KAAK;AAClB,MAAI,aAAa,KACf,QAAO,KAAK;AAEd,SAAO;;CAGT,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,iBAAiB,QAA6B;AAC5C,OAAK,iBAAiB;;CAGxB,IAAI,gBAAsC;AACxC,SAAO,KAAK;;CAGd,UAAgB;AACd,OAAK,gBAAgB,SAAS;AAC9B,OAAK,iBAAiB;;;;;;AC1L1B,MAAM,cAAc;AACpB,MAAM,aAAa;AAEnB,IAAa,mBAAb,MAA8B;CAC5B,AAAQ,OAAyB;CAEjC,QAAQ,MAAiC;AACvC,OAAK,OAAO;EACZ,MAAM,WAA2B,EAAE;AACnC,OAAK,SAAS,MAAM;GAAE,QAAQ;GAAM,aAAa,EAAE;GAAE,EAAE,SAAS;AAChE,SAAO;;CAGT,AAAQ,SACN,MACA,SACA,UACM;AACN,MAAI,KAAK,aAAa,CACpB,MAAK,iBAAiB,MAAM,SAAS,SAAS;WACrC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,SAAS,OAAO;GAAE,GAAG;GAAS,QAAQ;GAAM,EAAE,SAAS;WAErD,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,SACH,MACA;IACE,GAAG;IACH,aAAa,CAAC,GAAG,QAAQ,aAAa;KAAE,OAAO;KAAM,OAAO;KAAG,CAAC;IACjE,EACD,SACD;;;CAMT,AAAQ,iBACN,MACA,SACA,UACM;EACN,MAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QACH;EAGF,MAAM,kBAAkB,KAAK,oBAAoB,QAAQ,WAAW;EACpE,MAAM,kBAAkB,KAAK,oBAC3B,iBACA,MACA,QACD;AAED,WAAS,KAAK;GACZ;GACA,YAAY,QAAQ;GACpB,QAAQ,QAAQ;GAChB;GACA,aAAa,QAAQ;GACtB,CAAC;;CAGJ,AAAQ,oBAAoB,YAAuC;AACjE,MAAI;AAEF,UADe,gBAAgB,WAAW,CAC5B;UACR;AACN,UAAO,EAAE;;;CAIb,AAAQ,oBACN,SACA,aACA,SACsB;EACtB,MAAM,QAA8B,EAAE;AAEtC,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,OAAO,KAAK,qBAAqB,KAAK,aAAa,QAAQ;AACjE,OAAI,KACF,MAAK,sBAAsB,MAAM,MAAM;;AAI3C,SAAO;;CAGT,AAAQ,sBACN,MACA,QACM;AACN,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK,KAAK;WACR,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,sBAAsB,MAAM,OAAO;;WAGnC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,sBAAsB,OAAO,OAAO;;CAK/C,AAAQ,qBACN,KACA,cACA,SACkB;AAClB,MAAI,IAAI,WAAW,IAAI,CACrB,QAAO,KAAK,gBAAgB,IAAI,MAAM,EAAE,CAAC;AAG3C,MAAI,IAAI,WAAW,MAAM,CACvB,QAAO,KAAK,gBAAgB,KAAK,QAAQ;AAG3C,MAAI,QAAQ,OACV,QAAO,KAAK,gBAAgB,QAAQ,QAAQ,IAAI;AAGlD,SAAO,KAAK,gBAAgB,IAAI;;CAGlC,AAAQ,gBAAgB,SAAmC;AACzD,MAAI,CAAC,KAAK,KACR,QAAO;AAET,SAAO,KAAK,gBAAgB,KAAK,MAAM,QAAQ;;CAGjD,AAAQ,gBACN,WACA,SACkB;EAClB,MAAM,WAAW,KAAK,kBAAkB,QAAQ;EAChD,IAAI,UAA4B;AAEhC,OAAK,MAAM,WAAW,UAAU;AAC9B,OAAI,CAAC,QACH,QAAO;AAGT,OAAI,QAAQ,SAAS,WACnB,KAAI,QAAQ,UAAU,CACpB,WACE,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,QAAQ,KAAK,IAAI;OAE3D,QAAO;YAEA,QAAQ,SAAS,QAC1B,KAAI,QAAQ,SAAS,CACnB,WAAU,QAAQ,GAAG,QAAQ,MAAM,IAAI;OAEvC,QAAO;;AAKb,SAAO;;CAGT,AAAQ,gBACN,KACA,SACkB;EAClB,IAAI,WAAW;EACf,IAAI,YAAY;AAEhB,SAAO,UAAU,WAAW,MAAM,EAAE;AAClC;AACA,eAAY,UAAU,MAAM,EAAE;;EAGhC,IAAI,UAA4B,QAAQ;AAExC,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,SAAS,KAAK;AAC5C,aAAU,KAAK,WAAW,QAAQ;AAClC,OAAI,SAAS,SAAS,CACpB,WAAU,KAAK,WAAW,QAAQ;;AAItC,MAAI,CAAC,QACH,QAAO;AAGT,MAAI,UACF,QAAO,KAAK,gBAAgB,SAAS,UAAU;AAGjD,SAAO;;CAGT,AAAQ,WAAW,MAAmC;AACpD,MAAI,CAAC,KAAK,QAAQ,SAAS,KAAK,KAC9B,QAAO;AAGT,SAAO,KAAK,oBAAoB,KAAK,MAAM,KAAK;;CAGlD,AAAQ,oBACN,SACA,QACkB;EAClB,MAAM,WAAW,KAAK,cAAc,QAAQ;AAE5C,OAAK,MAAM,SAAS,UAAU;AAC5B,OAAI,UAAU,OACZ,QAAO;GAET,MAAM,QAAQ,KAAK,oBAAoB,OAAO,OAAO;AACrD,OAAI,MACF,QAAO;;AAIX,SAAO;;CAGT,AAAQ,cAAc,MAA8B;AAClD,MAAI,KAAK,UAAU,CACjB,QAAO,CAAC,GAAG,KAAK,SAAS;AAE3B,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAqB,EAAE;AAC7B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,OAAM,KAAK,KAAK;;AAGpB,UAAO;;AAET,SAAO,EAAE;;CAGX,AAAQ,kBAAkB,SAAgC;EACxD,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,YAAY,KAAK,QAAQ;AAC5C,OAAI,aAAa,IAAI;AACnB,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;GAGF,MAAM,YAAY,WAAW,KAAK,QAAQ;AAC1C,OAAI,YAAY,IAAI;AAClB,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF;;AAGF,SAAO;;;;;;AC9RX,IAAa,kBAAb,MAA6B;CAC3B,mBAAmB,UAAkD;EACnE,MAAM,sBAAqB,IAAI,KAAK;AAEpC,OAAK,MAAM,SAAS,SAClB,MAAK,MAAM,WAAW,MAAM,iBAAiB;GAC3C,IAAI,SAAS,IAAI,IAAI,QAAQ;AAC7B,OAAI,CAAC,QAAQ;AACX,6BAAS,IAAI,KAAK;AAClB,QAAI,IAAI,SAAS,OAAO;;AAE1B,UAAO,IAAI,MAAM;;AAIrB,SAAO;;CAGT,qBACE,UACyB;EACzB,MAAM,eAAe,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC;EACzD,MAAM,0BAAU,IAAI,KAAyB;EAC7C,MAAM,QAAwB,EAAE;EAEhC,MAAM,gCAAgB,IAAI,KAAuC;AACjE,OAAK,MAAM,SAAS,SAClB,eAAc,IAAI,MAAM,MAAM,MAAM;EAGtC,MAAM,SACJ,OACA,UACS;AACT,OAAI,QAAQ,IAAI,MAAM,KAAK,CACzB;AAGF,OAAI,MAAM,IAAI,MAAM,KAAK,CACvB;AAGF,SAAM,IAAI,MAAM,KAAK;AAErB,QAAK,MAAM,WAAW,MAAM,gBAC1B,KAAI,aAAa,IAAI,QAAQ,EAAE;IAC7B,MAAM,aAAa,cAAc,IAAI,QAAQ;AAC7C,QAAI,WACF,OAAM,YAAY,MAAM;;AAK9B,SAAM,OAAO,MAAM,KAAK;AACxB,WAAQ,IAAI,MAAM,KAAK;AACvB,SAAM,KAAK,MAAM;;AAGnB,OAAK,MAAM,SAAS,SAClB,OAAM,uBAAO,IAAI,KAAK,CAAC;AAGzB,SAAO;;CAGT,oBACE,aACA,eACA,iBACyB;EACzB,MAAM,2BAAW,IAAI,KAAmB;EACxC,MAAM,QAA8B,CAAC,YAAY;AAEjD,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,UAAU,MAAM,OAAO;AAC7B,OAAI,CAAC,QACH;GAEF,MAAM,aAAa,cAAc,IAAI,QAAQ;AAE7C,OAAI,YACF;SAAK,MAAM,SAAS,WAClB,KAAI,CAAC,SAAS,IAAI,MAAM,EAAE;AACxB,cAAS,IAAI,MAAM;AACnB,WAAM,KAAK,MAAM,KAAK;;;;AAM9B,SAAO,gBAAgB,QAAQ,UAAU,SAAS,IAAI,MAAM,CAAC;;;;;;ACxFjE,IAAa,mBAAb,MAA8B;CAC5B,YACE,AAAiB,MACjB,AAAiB,UAAgC,EAAE,EACnD;EAFiB;EACA;;CAGnB,SAAS,OAA2B;AAClC,MAAI;GACF,MAAM,UAAU,KAAK,aAAa,MAAM;GACxC,MAAM,SAAS,oBAAoB,MAAM,YAAY,QAAQ;AAE7D,QAAK,aAAa,OAAO,OAAO;AAChC,QAAK,iBAAiB,OAAO,OAAO;WAC7B,OAAO;AACd,QAAK,YAAY,OAAO,MAAe;;;CAI3C,YAAY,QAAsC;AAChD,OAAK,MAAM,SAAS,OAClB,MAAK,SAAS,MAAM;;CAIxB,AAAQ,aAAa,OAAqB;EAGxC,MAAM,UAYF,EAAE,UAdW,KAAK,KAAK,eAAe,EAc1B;AAEhB,MAAI,MAAM,QAAQ;GAChB,MAAM,WAAW,KAAK,oBAAoB,MAAM,OAAO;AACvD,OAAI,SACF,SAAQ,WAAW;;AAIvB,MAAI,MAAM,YAAY,SAAS,EAC7B,SAAQ,eAAe,EAAE,QAAQ,KAAK,iBAAiB,MAAM,EAAE;AAGjE,SAAO;;CAGT,AAAQ,iBAAiB,OAAqB;EAC5C,MAAM,SAKD,EAAE;AAIP,OAAK,IAAI,IAAI,MAAM,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;GACtD,MAAM,QAAQ,MAAM,YAAY;AAChC,OAAI,CAAC,MACH;GAEF,MAAM,EAAE,OAAO,UAAU;AAEzB,UAAO,KAAK;IACV;IACA,QAAQ,MAAM;IACd,MAAM,KAAK,iBAAiB,OAAO,MAAM;IACzC,MAAM,KAAK,iBAAiB,OAAO,MAAM;IAC1C,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,EACX,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,MAAM,SAAS,EAC1B,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,oBAAoB,MAAgD;EAC1E,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,SAAS,KAAK,SACvB,QAAO,MAAM,QAAQ,KAAK,kBAAkB,MAAM;AAEpD,SAAO;;CAGT,AAAQ,kBAAkB,MAA0B;AAClD,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK;AAEd,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,oBAAoB,KAAK;AAEvC,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,SAAoB,EAAE;AAC5B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,QAAO,KAAK,KAAK,kBAAkB,KAAK,CAAC;;AAG7C,UAAO;;AAET,SAAO;;CAGT,AAAQ,aAAa,OAAqB,QAAuB;EAC/D,MAAM,EAAE,SAAS;EACjB,MAAM,eAAe,KAAK;AAE1B,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,MACE,OAAO,WAAW,aACjB,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO,SAAS,OAAO,GACjD;AACA,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,OAAK,SAAS,QAAQ,EAAE,UAAU,MAAM,CAAC;;CAG3C,AAAQ,iBAAiB,OAAqB,QAAuB;EACnE,MAAM,EAAE,SAAS;AAEjB,MAAI,OAAO,WAAW,UAAU;AAC9B,OAAI,OAAO,MAAM,OAAO,EAAE;AACxB,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;AAGF,OAAI,CAAC,OAAO,SAAS,OAAO,EAAE;AAC5B,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;;AAIJ,OAAK,kBAAkB,KAAK;;CAG9B,AAAQ,YAAY,OAAqB,OAAoB;EAC3D,MAAM,EAAE,SAAS;AAEjB,OAAK,SAAS,KAAK,cAAc,EAAE,UAAU,MAAM,CAAC;AAEpD,OAAK,kBAAkB;GACrB,MAAM;GACN,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,eAAe;GAChB,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ,QAAQ,MAAM,MAAM;;;;;;AC3LvC,IAAa,gBAAb,MAA2B;CACzB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,WAA2B,EAAE;CACrC,AAAQ,gCAA+B,IAAI,KAAK;CAChD,AAAQ,kBAA2C,EAAE;CACrD,AAAQ,YAAiC,EAAE;CAE3C,YACE,AAAiB,MACjB,UAAgC,EAAE,EAClC;EAFiB;AAGjB,OAAK,YAAY,IAAI,kBAAkB;AACvC,OAAK,QAAQ,IAAI,iBAAiB;AAClC,OAAK,YAAY,IAAI,iBAAiB,MAAM,QAAQ;AAEpD,OAAK,YAAY;;CAGnB,eAAqB;AACnB,OAAK,kBAAkB;AACvB,OAAK,YAAY;;CAGnB,UAAgB;AACd,OAAK,kBAAkB;AACvB,OAAK,WAAW,EAAE;AAClB,OAAK,gCAAgB,IAAI,KAAK;AAC9B,OAAK,kBAAkB,EAAE;;CAG3B,cAAuC;AACrC,SAAO,KAAK;;CAGd,qBAA8C;AAC5C,SAAO,KAAK;;CAGd,AAAQ,aAAmB;AACzB,OAAK,WAAW,KAAK,UAAU,QAAQ,KAAK,KAAK,KAAK;AAEtD,OAAK,gBAAgB,KAAK,MAAM,mBAAmB,KAAK,SAAS;AACjE,OAAK,kBAAkB,KAAK,MAAM,qBAAqB,KAAK,SAAS;AAErE,OAAK,aAAa;AAElB,OAAK,gBAAgB;;CAGvB,AAAQ,cAAoB;AAC1B,oBAAkB;AAChB,QAAK,MAAM,SAAS,KAAK,gBACvB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,iBAAuB;EAC7B,MAAM,+BAAe,IAAI,KAAyB;AAElD,OAAK,MAAM,CAAC,YAAY,KAAK,eAAe;AAC1C,OAAI,aAAa,IAAI,QAAQ,CAC3B;AAEF,gBAAa,IAAI,QAAQ;GAEzB,MAAM,WAAW,eACT,QAAQ,aACR,KAAK,uBAAuB,QAAQ,CAC3C;AACD,QAAK,UAAU,KAAK,SAAS;;AAG/B,OAAK,oBAAoB,KAAK,KAAK,KAAK;;CAG1C,AAAQ,oBAAoB,MAAuB;AACjD,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,WAAW,eACT,KAAK,cACL,KAAK,uBAAuB,CACnC;AACD,QAAK,UAAU,KAAK,SAAS;AAE7B,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,oBAAoB,KAAK;aAEvB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,oBAAoB,MAAM;;CAKrC,AAAQ,uBAAuB,aAAuC;EACpE,MAAM,WAAW,KAAK,MAAM,oBAC1B,aACA,KAAK,eACL,KAAK,gBACN;AAED,oBAAkB;AAChB,QAAK,MAAM,SAAS,SAClB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,wBAA8B;AACpC,OAAK,cAAc;;CAGrB,AAAQ,mBAAyB;AAC/B,OAAK,MAAM,YAAY,KAAK,UAC1B,WAAU;AAEZ,OAAK,YAAY,EAAE;;;;;;ACvHvB,SAAgB,iBACd,QACA,cACA,SACW;CACX,MAAM,cAAc,SAAS,eAAe,mBAAmB;CAC/D,MAAM,WAAW,YAAY,WAAW,QAAQ,aAAa;AAE7D,0BAAyB,UAAU,YAAY;CAE/C,MAAM,OAAO,IAAI,UAAU,SAAS;AAEpC,KAAI,SAAS,kBAAkB,OAAO;EAGpC,MAAM,SAAS,IAAI,cAAc,MAD/B,OAAO,SAAS,kBAAkB,WAAW,QAAQ,gBAAgB,EAAE,CACnB;AACtD,OAAK,iBAAiB,OAAO;;AAG/B,QAAO;;AAGT,SAAS,yBAAyB,MAAiB,SAA4B;AAC7E,KAAI,KAAK,SAAS,EAAE;AAClB,OAAK,eAAe,QAAQ;AAC5B,OAAK,MAAM,QAAQ,KAAK,MACtB,0BAAyB,MAAM,QAAQ;YAEhC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,0BAAyB,OAAO,QAAQ;;AAK9C,SAAgB,sBACd,QACA,SACW;AACX,QAAO,iBAAiB,QAAQ,QAAW,QAAQ"}