@flowgram.ai/form-materials 0.4.5 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/esm/chunk-727SU246.js +13 -0
  2. package/dist/esm/chunk-727SU246.js.map +1 -0
  3. package/dist/esm/chunk-DEZUEMUM.js +284 -0
  4. package/dist/esm/chunk-DEZUEMUM.js.map +1 -0
  5. package/dist/esm/chunk-MFDEE4HB.js +440 -0
  6. package/dist/esm/chunk-MFDEE4HB.js.map +1 -0
  7. package/dist/esm/editor-2YHACGQ2.js +282 -0
  8. package/dist/esm/editor-2YHACGQ2.js.map +1 -0
  9. package/dist/esm/editor-6UMULJYB.js +180 -0
  10. package/dist/esm/editor-6UMULJYB.js.map +1 -0
  11. package/dist/esm/editor-E2BQTPCD.js +388 -0
  12. package/dist/esm/editor-E2BQTPCD.js.map +1 -0
  13. package/dist/esm/editor-G63XGWH2.js +249 -0
  14. package/dist/esm/editor-G63XGWH2.js.map +1 -0
  15. package/dist/esm/editor-OXPGKPF5.js +167 -0
  16. package/dist/esm/editor-OXPGKPF5.js.map +1 -0
  17. package/dist/esm/index.js +607 -2300
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/index.d.mts +141 -51
  20. package/dist/index.d.ts +141 -51
  21. package/dist/index.js +3545 -2825
  22. package/dist/index.js.map +1 -1
  23. package/package.json +8 -8
  24. package/src/components/code-editor/editor.tsx +96 -0
  25. package/src/components/code-editor/index.tsx +5 -89
  26. package/src/components/code-editor-mini/index.tsx +2 -2
  27. package/src/components/condition-row/index.tsx +4 -0
  28. package/src/components/db-condition-row/hooks/use-left.tsx +66 -0
  29. package/src/components/db-condition-row/hooks/use-op.tsx +59 -0
  30. package/src/components/db-condition-row/index.tsx +93 -0
  31. package/src/components/db-condition-row/styles.tsx +43 -0
  32. package/src/components/db-condition-row/types.ts +34 -0
  33. package/src/components/display-inputs-values/index.tsx +1 -1
  34. package/src/components/dynamic-value-input/hooks.ts +1 -1
  35. package/src/components/index.ts +1 -0
  36. package/src/components/inputs-values-tree/hooks/use-child-list.tsx +1 -1
  37. package/src/components/json-editor-with-variables/editor.tsx +69 -0
  38. package/src/components/json-editor-with-variables/extensions/variable-tag.tsx +1 -1
  39. package/src/components/json-editor-with-variables/index.tsx +5 -60
  40. package/src/components/json-schema-editor/hooks.tsx +1 -1
  41. package/src/components/prompt-editor/editor.tsx +81 -0
  42. package/src/components/prompt-editor/index.tsx +5 -69
  43. package/src/components/prompt-editor-with-inputs/editor.tsx +25 -0
  44. package/src/components/prompt-editor-with-inputs/index.tsx +5 -15
  45. package/src/components/prompt-editor-with-inputs/inputs-picker.tsx +1 -1
  46. package/src/components/prompt-editor-with-variables/editor.tsx +22 -0
  47. package/src/components/prompt-editor-with-variables/extensions/variable-tag.tsx +1 -1
  48. package/src/components/prompt-editor-with-variables/index.tsx +5 -13
  49. package/src/effects/validate-when-variable-sync/index.ts +1 -1
  50. package/src/form-plugins/infer-assign-plugin/index.ts +1 -1
  51. package/src/form-plugins/infer-inputs-plugin/index.ts +1 -1
  52. package/src/hooks/use-object-list/index.tsx +1 -1
  53. package/src/shared/flow-value/utils.ts +1 -1
  54. package/src/shared/format-legacy-refs/index.ts +1 -1
  55. package/src/shared/index.ts +1 -0
  56. package/src/shared/lazy-suspense/index.tsx +28 -0
  57. package/src/validate/validate-flow-value/index.tsx +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/prompt-editor-with-variables/editor.tsx","../../src/components/prompt-editor-with-variables/extensions/variable-tree.tsx","../../src/components/prompt-editor-with-variables/extensions/variable-tag.tsx","../../src/components/prompt-editor-with-variables/styles.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { PromptEditor, PromptEditorPropsType } from '@/components/prompt-editor';\n\nimport { VariableTree } from './extensions/variable-tree';\nimport { VariableTagInject } from './extensions/variable-tag';\n\nexport interface PromptEditorWithVariablesProps extends PromptEditorPropsType {}\n\nexport function PromptEditorWithVariables(props: PromptEditorWithVariablesProps) {\n return (\n <PromptEditor {...props}>\n <VariableTree />\n <VariableTagInject />\n </PromptEditor>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useEffect, useState } from 'react';\n\nimport { Popover, Tree } from '@douyinfe/semi-ui';\nimport {\n Mention,\n MentionOpenChangeEvent,\n getCurrentMentionReplaceRange,\n useEditor,\n PositionMirror,\n} from '@coze-editor/editor/react';\nimport { EditorAPI } from '@coze-editor/editor/preset-prompt';\n\nimport { useVariableTree } from '@/components/variable-selector';\n\nexport function VariableTree() {\n const [posKey, setPosKey] = useState('');\n const [visible, setVisible] = useState(false);\n const [position, setPosition] = useState(-1);\n const editor = useEditor<EditorAPI>();\n\n function insert(variablePath: string) {\n const range = getCurrentMentionReplaceRange(editor.$view.state);\n\n if (!range) {\n return;\n }\n\n /**\n * When user input {{xxxx}}, {{{xxx}}}(more brackets if possible), replace all brackets with {{xxxx}}\n */\n let { from, to } = range;\n while (editor.$view.state.doc.sliceString(from - 1, from) === '{') {\n from--;\n }\n while (editor.$view.state.doc.sliceString(to, to + 1) === '}') {\n to++;\n }\n\n editor.replaceText({\n from,\n to,\n text: '{{' + variablePath + '}}',\n });\n\n setVisible(false);\n }\n\n function handleOpenChange(e: MentionOpenChangeEvent) {\n setPosition(e.state.selection.main.head);\n setVisible(e.value);\n }\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n }, [editor, visible]);\n\n const treeData = useVariableTree({});\n\n return (\n <>\n <Mention triggerCharacters={['{', '{}', '@']} onOpenChange={handleOpenChange} />\n\n <Popover\n visible={visible}\n trigger=\"custom\"\n position=\"topLeft\"\n rePosKey={posKey}\n content={\n <div style={{ width: 300 }}>\n <Tree\n treeData={treeData}\n onSelect={(v) => {\n insert(v);\n }}\n />\n </div>\n }\n >\n {/* PositionMirror allows the Popover to appear at the specified cursor position */}\n <PositionMirror\n position={position}\n // When Doc scroll, update position\n onChange={() => setPosKey(String(Math.random()))}\n />\n </Popover>\n </>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useLayoutEffect } from 'react';\n\nimport { isEqual, last } from 'lodash-es';\nimport {\n BaseVariableField,\n Disposable,\n DisposableCollection,\n Scope,\n useCurrentScope,\n} from '@flowgram.ai/editor';\nimport { Popover } from '@douyinfe/semi-ui';\nimport { IconIssueStroked } from '@douyinfe/semi-icons';\nimport { useInjector } from '@coze-editor/editor/react';\nimport {\n Decoration,\n DecorationSet,\n EditorView,\n MatchDecorator,\n ViewPlugin,\n WidgetType,\n} from '@codemirror/view';\n\nimport { IPolyfillRoot, polyfillCreateRoot } from '@/shared';\n\nimport { UIPopoverContent, UIRootTitle, UITag, UIVarName } from '../styles';\n\nclass VariableTagWidget extends WidgetType {\n keyPath?: string[];\n\n toDispose = new DisposableCollection();\n\n scope: Scope;\n\n root: IPolyfillRoot;\n\n constructor({ keyPath, scope }: { keyPath?: string[]; scope: Scope }) {\n super();\n\n this.keyPath = keyPath;\n this.scope = scope;\n }\n\n renderIcon = (icon: string | JSX.Element) => {\n if (typeof icon === 'string') {\n return <img style={{ marginRight: 8 }} width={12} height={12} src={icon} />;\n }\n\n return icon;\n };\n\n renderVariable(v?: BaseVariableField) {\n if (!v) {\n this.root.render(\n <UITag prefixIcon={<IconIssueStroked />} color=\"amber\">\n Unknown\n </UITag>\n );\n return;\n }\n\n const rootField = last(v.parentFields);\n\n const rootTitle = (\n <UIRootTitle>{rootField?.meta.title ? `${rootField.meta.title} -` : ''}</UIRootTitle>\n );\n const rootIcon = this.renderIcon(rootField?.meta.icon);\n\n this.root.render(\n <Popover\n content={\n <UIPopoverContent>\n {rootIcon}\n {rootTitle}\n <UIVarName>{v?.keyPath.slice(1).join('.')}</UIVarName>\n </UIPopoverContent>\n }\n >\n <UITag prefixIcon={rootIcon}>\n {rootTitle}\n <UIVarName>{v?.key}</UIVarName>\n </UITag>\n </Popover>\n );\n }\n\n toDOM(view: EditorView): HTMLElement {\n const dom = document.createElement('span');\n\n this.root = polyfillCreateRoot(dom);\n\n this.toDispose.push(\n Disposable.create(() => {\n this.root.unmount();\n })\n );\n\n this.toDispose.push(\n this.scope.available.trackByKeyPath(\n this.keyPath,\n (v) => {\n this.renderVariable(v);\n },\n { triggerOnInit: false }\n )\n );\n\n this.renderVariable(this.scope.available.getByKeyPath(this.keyPath));\n\n return dom;\n }\n\n eq(other: VariableTagWidget) {\n return isEqual(this.keyPath, other.keyPath);\n }\n\n ignoreEvent(): boolean {\n return false;\n }\n\n destroy(dom: HTMLElement): void {\n this.toDispose.dispose();\n }\n}\n\nexport function VariableTagInject() {\n const injector = useInjector();\n\n const scope = useCurrentScope();\n\n // 基于 {{var}} 的正则进行匹配,匹配后进行自定义渲染\n useLayoutEffect(() => {\n const atMatcher = new MatchDecorator({\n regexp: /\\{\\{([^\\}\\{]+)\\}\\}/g,\n decoration: (match) =>\n Decoration.replace({\n widget: new VariableTagWidget({\n keyPath: match[1]?.split('.') ?? [],\n scope,\n }),\n }),\n });\n\n return injector.inject([\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(private view: EditorView) {\n this.decorations = atMatcher.createDeco(view);\n }\n\n update() {\n this.decorations = atMatcher.createDeco(this.view);\n }\n },\n {\n decorations: (p) => p.decorations,\n provide(p) {\n return EditorView.atomicRanges.of(\n (view) => view.plugin(p)?.decorations ?? Decoration.none\n );\n },\n }\n ),\n ]);\n }, [injector]);\n\n return null;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport styled from 'styled-components';\nimport { Tag } from '@douyinfe/semi-ui';\n\nexport const UIRootTitle = styled.div`\n margin-right: 4px;\n min-width: 20px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--semi-color-text-2);\n`;\n\nexport const UIVarName = styled.div`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const UITag = styled(Tag)`\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n max-width: 300px;\n\n & .semi-tag-content-center {\n justify-content: flex-start;\n }\n\n &.semi-tag {\n margin: 0 5px;\n }\n`;\n\nexport const UIPopoverContent = styled.div`\n padding: 10px;\n display: inline-flex;\n align-items: center;\n justify-content: flex-start;\n`;\n"],"mappings":"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","names":["React","React","Popover","React","Popover","React"]}
@@ -0,0 +1,167 @@
1
+ import {
2
+ PromptEditor
3
+ } from "./chunk-727SU246.js";
4
+ import {
5
+ FlowValueUtils
6
+ } from "./chunk-DEZUEMUM.js";
7
+
8
+ // src/components/prompt-editor-with-inputs/editor.tsx
9
+ import React3 from "react";
10
+
11
+ // src/components/prompt-editor-with-inputs/extensions/inputs-tree.tsx
12
+ import React2, { useEffect, useState } from "react";
13
+ import { Popover } from "@douyinfe/semi-ui";
14
+ import {
15
+ Mention,
16
+ getCurrentMentionReplaceRange,
17
+ useEditor,
18
+ PositionMirror
19
+ } from "@coze-editor/editor/react";
20
+
21
+ // src/components/prompt-editor-with-inputs/inputs-picker.tsx
22
+ import React, { useMemo } from "react";
23
+ import { isPlainObject, last } from "lodash-es";
24
+ import {
25
+ ASTMatch,
26
+ useScopeAvailable
27
+ } from "@flowgram.ai/editor";
28
+ import { Tree } from "@douyinfe/semi-ui";
29
+ function InputsPicker({
30
+ inputsValues,
31
+ onSelect
32
+ }) {
33
+ const available = useScopeAvailable();
34
+ const getArrayDrilldown = (type, depth = 1) => {
35
+ if (ASTMatch.isArray(type.items)) {
36
+ return getArrayDrilldown(type.items, depth + 1);
37
+ }
38
+ return { type: type.items, depth };
39
+ };
40
+ const renderVariable = (variable, keyPath) => {
41
+ let type = variable?.type;
42
+ let children;
43
+ if (ASTMatch.isObject(type)) {
44
+ children = (type.properties || []).map((_property) => renderVariable(_property, [...keyPath, _property.key])).filter(Boolean);
45
+ }
46
+ if (ASTMatch.isArray(type)) {
47
+ const drilldown = getArrayDrilldown(type);
48
+ if (ASTMatch.isObject(drilldown.type)) {
49
+ children = (drilldown.type.properties || []).map(
50
+ (_property) => renderVariable(_property, [
51
+ ...keyPath,
52
+ ...new Array(drilldown.depth).fill("[0]"),
53
+ _property.key
54
+ ])
55
+ ).filter(Boolean);
56
+ }
57
+ }
58
+ const key = keyPath.map((_key, idx) => _key === "[0]" || idx === 0 ? _key : `.${_key}`).join("");
59
+ return {
60
+ key,
61
+ label: last(keyPath),
62
+ value: key,
63
+ children
64
+ };
65
+ };
66
+ const getTreeData = (value, keyPath) => {
67
+ const currKey = keyPath.join(".");
68
+ if (FlowValueUtils.isFlowValue(value)) {
69
+ if (FlowValueUtils.isRef(value)) {
70
+ const variable = available.getByKeyPath(value.content || []);
71
+ if (variable) {
72
+ return renderVariable(variable, keyPath);
73
+ }
74
+ }
75
+ return {
76
+ key: currKey,
77
+ value: currKey,
78
+ label: last(keyPath)
79
+ };
80
+ }
81
+ if (isPlainObject(value)) {
82
+ return {
83
+ key: currKey,
84
+ value: currKey,
85
+ label: last(keyPath),
86
+ children: Object.entries(value).map(([key, value2]) => getTreeData(value2, [...keyPath, key])).filter(Boolean)
87
+ };
88
+ }
89
+ };
90
+ const treeData = useMemo(
91
+ () => Object.entries(inputsValues).map(([key, value]) => getTreeData(value, [key])).filter(Boolean),
92
+ []
93
+ );
94
+ return /* @__PURE__ */ React.createElement(Tree, { treeData, onSelect: (v) => onSelect(v) });
95
+ }
96
+
97
+ // src/components/prompt-editor-with-inputs/extensions/inputs-tree.tsx
98
+ function InputsTree({ inputsValues }) {
99
+ const [posKey, setPosKey] = useState("");
100
+ const [visible, setVisible] = useState(false);
101
+ const [position, setPosition] = useState(-1);
102
+ const editor = useEditor();
103
+ function insert(variablePath) {
104
+ const range = getCurrentMentionReplaceRange(editor.$view.state);
105
+ if (!range) {
106
+ return;
107
+ }
108
+ let { from, to } = range;
109
+ while (editor.$view.state.doc.sliceString(from - 1, from) === "{") {
110
+ from--;
111
+ }
112
+ while (editor.$view.state.doc.sliceString(to, to + 1) === "}") {
113
+ to++;
114
+ }
115
+ editor.replaceText({
116
+ ...range,
117
+ text: "{{" + variablePath + "}}"
118
+ });
119
+ setVisible(false);
120
+ }
121
+ function handleOpenChange(e) {
122
+ setPosition(e.state.selection.main.head);
123
+ setVisible(e.value);
124
+ }
125
+ useEffect(() => {
126
+ if (!editor) {
127
+ return;
128
+ }
129
+ }, [editor, visible]);
130
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(Mention, { triggerCharacters: ["{", "{}", "@"], onOpenChange: handleOpenChange }), /* @__PURE__ */ React2.createElement(
131
+ Popover,
132
+ {
133
+ visible,
134
+ trigger: "custom",
135
+ position: "topLeft",
136
+ rePosKey: posKey,
137
+ content: /* @__PURE__ */ React2.createElement("div", { style: { width: 300 } }, /* @__PURE__ */ React2.createElement(
138
+ InputsPicker,
139
+ {
140
+ inputsValues,
141
+ onSelect: (v) => {
142
+ insert(v);
143
+ }
144
+ }
145
+ ))
146
+ },
147
+ /* @__PURE__ */ React2.createElement(
148
+ PositionMirror,
149
+ {
150
+ position,
151
+ onChange: () => setPosKey(String(Math.random()))
152
+ }
153
+ )
154
+ ));
155
+ }
156
+
157
+ // src/components/prompt-editor-with-inputs/editor.tsx
158
+ function PromptEditorWithInputs({
159
+ inputsValues,
160
+ ...restProps
161
+ }) {
162
+ return /* @__PURE__ */ React3.createElement(PromptEditor, { ...restProps }, /* @__PURE__ */ React3.createElement(InputsTree, { inputsValues }));
163
+ }
164
+ export {
165
+ PromptEditorWithInputs
166
+ };
167
+ //# sourceMappingURL=editor-OXPGKPF5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/prompt-editor-with-inputs/editor.tsx","../../src/components/prompt-editor-with-inputs/extensions/inputs-tree.tsx","../../src/components/prompt-editor-with-inputs/inputs-picker.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { PromptEditor, PromptEditorPropsType } from '@/components/prompt-editor';\n\nimport { InputsTree } from './extensions/inputs-tree';\n\nexport interface PromptEditorWithInputsProps extends PromptEditorPropsType {\n inputsValues: any;\n}\n\nexport function PromptEditorWithInputs({\n inputsValues,\n ...restProps\n}: PromptEditorWithInputsProps) {\n return (\n <PromptEditor {...restProps}>\n <InputsTree inputsValues={inputsValues} />\n </PromptEditor>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useEffect, useState } from 'react';\n\nimport { Popover } from '@douyinfe/semi-ui';\nimport {\n Mention,\n MentionOpenChangeEvent,\n getCurrentMentionReplaceRange,\n useEditor,\n PositionMirror,\n} from '@coze-editor/editor/react';\nimport { EditorAPI } from '@coze-editor/editor/preset-prompt';\n\nimport { IFlowValue } from '@/typings';\n\nimport { InputsPicker } from '../inputs-picker';\n\nexport function InputsTree({ inputsValues }: { inputsValues: Record<string, IFlowValue> }) {\n const [posKey, setPosKey] = useState('');\n const [visible, setVisible] = useState(false);\n const [position, setPosition] = useState(-1);\n const editor = useEditor<EditorAPI>();\n\n function insert(variablePath: string) {\n const range = getCurrentMentionReplaceRange(editor.$view.state);\n\n if (!range) {\n return;\n }\n\n /**\n * When user input {{xxxx}}, {{{xxx}}}(more brackets if possible), replace all brackets with {{xxxx}}\n */\n let { from, to } = range;\n while (editor.$view.state.doc.sliceString(from - 1, from) === '{') {\n from--;\n }\n while (editor.$view.state.doc.sliceString(to, to + 1) === '}') {\n to++;\n }\n\n editor.replaceText({\n ...range,\n text: '{{' + variablePath + '}}',\n });\n\n setVisible(false);\n }\n\n function handleOpenChange(e: MentionOpenChangeEvent) {\n setPosition(e.state.selection.main.head);\n setVisible(e.value);\n }\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n }, [editor, visible]);\n\n return (\n <>\n <Mention triggerCharacters={['{', '{}', '@']} onOpenChange={handleOpenChange} />\n\n <Popover\n visible={visible}\n trigger=\"custom\"\n position=\"topLeft\"\n rePosKey={posKey}\n content={\n <div style={{ width: 300 }}>\n <InputsPicker\n inputsValues={inputsValues}\n onSelect={(v) => {\n insert(v);\n }}\n />\n </div>\n }\n >\n {/* PositionMirror allows the Popover to appear at the specified cursor position */}\n <PositionMirror\n position={position}\n // When Doc scroll, update position\n onChange={() => setPosKey(String(Math.random()))}\n />\n </Popover>\n </>\n );\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useMemo } from 'react';\n\nimport { isPlainObject, last } from 'lodash-es';\nimport {\n type ArrayType,\n ASTMatch,\n type BaseType,\n type BaseVariableField,\n useScopeAvailable,\n} from '@flowgram.ai/editor';\nimport { TreeNodeData } from '@douyinfe/semi-ui/lib/es/tree';\nimport { Tree } from '@douyinfe/semi-ui';\n\nimport { FlowValueUtils } from '@/shared';\n\ntype VariableField = BaseVariableField<{ icon?: string | JSX.Element; title?: string }>;\n\nexport function InputsPicker({\n inputsValues,\n onSelect,\n}: {\n inputsValues: any;\n onSelect: (v: string) => void;\n}) {\n const available = useScopeAvailable();\n\n const getArrayDrilldown = (type: ArrayType, depth = 1): { type: BaseType; depth: number } => {\n if (ASTMatch.isArray(type.items)) {\n return getArrayDrilldown(type.items, depth + 1);\n }\n\n return { type: type.items, depth: depth };\n };\n\n const renderVariable = (variable: VariableField, keyPath: string[]): TreeNodeData => {\n let type = variable?.type;\n\n let children: TreeNodeData[] | undefined;\n\n if (ASTMatch.isObject(type)) {\n children = (type.properties || [])\n .map((_property) => renderVariable(_property as VariableField, [...keyPath, _property.key]))\n .filter(Boolean) as TreeNodeData[];\n }\n\n if (ASTMatch.isArray(type)) {\n const drilldown = getArrayDrilldown(type);\n\n if (ASTMatch.isObject(drilldown.type)) {\n children = (drilldown.type.properties || [])\n .map((_property) =>\n renderVariable(_property as VariableField, [\n ...keyPath,\n ...new Array(drilldown.depth).fill('[0]'),\n _property.key,\n ])\n )\n .filter(Boolean) as TreeNodeData[];\n }\n }\n\n const key = keyPath\n .map((_key, idx) => (_key === '[0]' || idx === 0 ? _key : `.${_key}`))\n .join('');\n\n return {\n key: key,\n label: last(keyPath),\n value: key,\n children,\n };\n };\n\n const getTreeData = (value: any, keyPath: string[]): TreeNodeData | undefined => {\n const currKey = keyPath.join('.');\n\n if (FlowValueUtils.isFlowValue(value)) {\n if (FlowValueUtils.isRef(value)) {\n const variable = available.getByKeyPath(value.content || []);\n if (variable) {\n return renderVariable(variable, keyPath);\n }\n }\n return {\n key: currKey,\n value: currKey,\n label: last(keyPath),\n };\n }\n\n if (isPlainObject(value)) {\n return {\n key: currKey,\n value: currKey,\n label: last(keyPath),\n children: Object.entries(value)\n .map(([key, value]) => getTreeData(value, [...keyPath, key])!)\n .filter(Boolean),\n };\n }\n };\n\n const treeData: TreeNodeData[] = useMemo(\n () =>\n Object.entries(inputsValues)\n .map(([key, value]) => getTreeData(value, [key])!)\n .filter(Boolean),\n []\n );\n\n return <Tree treeData={treeData} onSelect={(v) => onSelect(v)} />;\n}\n"],"mappings":";;;;;;;;AAKA,OAAOA,YAAW;;;ACAlB,OAAOC,UAAS,WAAW,gBAAgB;AAE3C,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTP,OAAO,SAAS,eAAe;AAE/B,SAAS,eAAe,YAAY;AACpC;AAAA,EAEE;AAAA,EAGA;AAAA,OACK;AAEP,SAAS,YAAY;AAMd,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AACF,GAGG;AACD,QAAM,YAAY,kBAAkB;AAEpC,QAAM,oBAAoB,CAAC,MAAiB,QAAQ,MAAyC;AAC3F,QAAI,SAAS,QAAQ,KAAK,KAAK,GAAG;AAChC,aAAO,kBAAkB,KAAK,OAAO,QAAQ,CAAC;AAAA,IAChD;AAEA,WAAO,EAAE,MAAM,KAAK,OAAO,MAAa;AAAA,EAC1C;AAEA,QAAM,iBAAiB,CAAC,UAAyB,YAAoC;AACnF,QAAI,OAAO,UAAU;AAErB,QAAI;AAEJ,QAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,kBAAY,KAAK,cAAc,CAAC,GAC7B,IAAI,CAAC,cAAc,eAAe,WAA4B,CAAC,GAAG,SAAS,UAAU,GAAG,CAAC,CAAC,EAC1F,OAAO,OAAO;AAAA,IACnB;AAEA,QAAI,SAAS,QAAQ,IAAI,GAAG;AAC1B,YAAM,YAAY,kBAAkB,IAAI;AAExC,UAAI,SAAS,SAAS,UAAU,IAAI,GAAG;AACrC,oBAAY,UAAU,KAAK,cAAc,CAAC,GACvC;AAAA,UAAI,CAAC,cACJ,eAAe,WAA4B;AAAA,YACzC,GAAG;AAAA,YACH,GAAG,IAAI,MAAM,UAAU,KAAK,EAAE,KAAK,KAAK;AAAA,YACxC,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,EACC,OAAO,OAAO;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,MAAM,QACT,IAAI,CAAC,MAAM,QAAS,SAAS,SAAS,QAAQ,IAAI,OAAO,IAAI,IAAI,EAAG,EACpE,KAAK,EAAE;AAEV,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,OAAY,YAAgD;AAC/E,UAAM,UAAU,QAAQ,KAAK,GAAG;AAEhC,QAAI,eAAe,YAAY,KAAK,GAAG;AACrC,UAAI,eAAe,MAAM,KAAK,GAAG;AAC/B,cAAM,WAAW,UAAU,aAAa,MAAM,WAAW,CAAC,CAAC;AAC3D,YAAI,UAAU;AACZ,iBAAO,eAAe,UAAU,OAAO;AAAA,QACzC;AAAA,MACF;AACA,aAAO;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,KAAK,OAAO;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,cAAc,KAAK,GAAG;AACxB,aAAO;AAAA,QACL,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO,KAAK,OAAO;AAAA,QACnB,UAAU,OAAO,QAAQ,KAAK,EAC3B,IAAI,CAAC,CAAC,KAAKC,MAAK,MAAM,YAAYA,QAAO,CAAC,GAAG,SAAS,GAAG,CAAC,CAAE,EAC5D,OAAO,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAA2B;AAAA,IAC/B,MACE,OAAO,QAAQ,YAAY,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,YAAY,OAAO,CAAC,GAAG,CAAC,CAAE,EAChD,OAAO,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,SAAO,oCAAC,QAAK,UAAoB,UAAU,CAAC,MAAM,SAAS,CAAC,GAAG;AACjE;;;AD/FO,SAAS,WAAW,EAAE,aAAa,GAAiD;AACzF,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AACvC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAC3C,QAAM,SAAS,UAAqB;AAEpC,WAAS,OAAO,cAAsB;AACpC,UAAM,QAAQ,8BAA8B,OAAO,MAAM,KAAK;AAE9D,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAKA,QAAI,EAAE,MAAM,GAAG,IAAI;AACnB,WAAO,OAAO,MAAM,MAAM,IAAI,YAAY,OAAO,GAAG,IAAI,MAAM,KAAK;AACjE;AAAA,IACF;AACA,WAAO,OAAO,MAAM,MAAM,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK;AAC7D;AAAA,IACF;AAEA,WAAO,YAAY;AAAA,MACjB,GAAG;AAAA,MACH,MAAM,OAAO,eAAe;AAAA,IAC9B,CAAC;AAED,eAAW,KAAK;AAAA,EAClB;AAEA,WAAS,iBAAiB,GAA2B;AACnD,gBAAY,EAAE,MAAM,UAAU,KAAK,IAAI;AACvC,eAAW,EAAE,KAAK;AAAA,EACpB;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,SACE,gBAAAC,OAAA,cAAAA,OAAA,gBACE,gBAAAA,OAAA,cAAC,WAAQ,mBAAmB,CAAC,KAAK,MAAM,GAAG,GAAG,cAAc,kBAAkB,GAE9E,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAQ;AAAA,MACR,UAAS;AAAA,MACT,UAAU;AAAA,MACV,SACE,gBAAAA,OAAA,cAAC,SAAI,OAAO,EAAE,OAAO,IAAI,KACvB,gBAAAA,OAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,MAAM;AACf,mBAAO,CAAC;AAAA,UACV;AAAA;AAAA,MACF,CACF;AAAA;AAAA,IAIF,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QAEA,UAAU,MAAM,UAAU,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA;AAAA,IACjD;AAAA,EACF,CACF;AAEJ;;;AD9EO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE,gBAAAC,OAAA,cAAC,gBAAc,GAAG,aAChB,gBAAAA,OAAA,cAAC,cAAW,cAA4B,CAC1C;AAEJ;","names":["React","React","value","React","React"]}