@flowdrop/flowdrop 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/adapters/WorkflowAdapter.d.ts +167 -0
- package/dist/adapters/WorkflowAdapter.js +368 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
- package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
- package/dist/adapters/agentspec/agentAdapter.js +91 -0
- package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
- package/dist/adapters/agentspec/autoLayout.js +127 -0
- package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
- package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
- package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
- package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
- package/dist/adapters/agentspec/index.d.ts +37 -0
- package/dist/adapters/agentspec/index.js +39 -0
- package/dist/adapters/agentspec/validator.d.ts +34 -0
- package/dist/adapters/agentspec/validator.js +169 -0
- package/dist/api/enhanced-client.d.ts +183 -0
- package/dist/api/enhanced-client.js +430 -0
- package/dist/components/App.svelte +981 -0
- package/dist/components/App.svelte.d.ts +54 -0
- package/dist/components/CanvasBanner.stories.svelte +29 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +57 -0
- package/dist/components/CanvasBanner.svelte.d.ts +8 -0
- package/dist/components/ConfigForm.svelte +1138 -0
- package/dist/components/ConfigForm.svelte.d.ts +44 -0
- package/dist/components/ConfigModal.svelte +188 -0
- package/dist/components/ConfigModal.svelte.d.ts +13 -0
- package/dist/components/ConfigPanel.stories.svelte +47 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +182 -0
- package/dist/components/ConfigPanel.svelte.d.ts +32 -0
- package/dist/components/ConnectionLine.svelte +32 -0
- package/dist/components/ConnectionLine.svelte.d.ts +3 -0
- package/dist/components/EdgeRefresher.svelte +41 -0
- package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
- package/dist/components/FlowDropZone.svelte +83 -0
- package/dist/components/FlowDropZone.svelte.d.ts +13 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/LoadingSpinner.svelte +36 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +102 -0
- package/dist/components/Logo.svelte.d.ts +26 -0
- package/dist/components/LogsSidebar.svelte +563 -0
- package/dist/components/LogsSidebar.svelte.d.ts +17 -0
- package/dist/components/MarkdownDisplay.stories.svelte +36 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +29 -0
- package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
- package/dist/components/Navbar.stories.svelte +53 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +726 -0
- package/dist/components/Navbar.svelte.d.ts +29 -0
- package/dist/components/NodeSidebar.svelte +762 -0
- package/dist/components/NodeSidebar.svelte.d.ts +9 -0
- package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/NodeStatusOverlay.svelte +327 -0
- package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
- package/dist/components/PipelineStatus.svelte +314 -0
- package/dist/components/PipelineStatus.svelte.d.ts +20 -0
- package/dist/components/PortCoordinateTracker.svelte +58 -0
- package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
- package/dist/components/ReadOnlyDetails.svelte +170 -0
- package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
- package/dist/components/SchemaForm.stories.svelte +116 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +536 -0
- package/dist/components/SchemaForm.svelte.d.ts +83 -0
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +638 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +119 -0
- package/dist/components/StatusIcon.svelte.d.ts +10 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/StatusLabel.svelte +33 -0
- package/dist/components/StatusLabel.svelte.d.ts +7 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +185 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/UniversalNode.svelte +155 -0
- package/dist/components/UniversalNode.svelte.d.ts +15 -0
- package/dist/components/WorkflowEditor.svelte +1035 -0
- package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
- package/dist/components/form/FormArray.svelte +1049 -0
- package/dist/components/form/FormArray.svelte.d.ts +22 -0
- package/dist/components/form/FormAutocomplete.svelte +1009 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormCheckboxGroup.svelte +155 -0
- package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
- package/dist/components/form/FormCodeEditor.svelte +458 -0
- package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
- package/dist/components/form/FormField.svelte +417 -0
- package/dist/components/form/FormField.svelte.d.ts +29 -0
- package/dist/components/form/FormFieldLight.svelte +425 -0
- package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldWrapper.svelte +125 -0
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldset.svelte +142 -0
- package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
- package/dist/components/form/FormMarkdownEditor.svelte +752 -0
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
- package/dist/components/form/FormNumberField.stories.svelte +36 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormNumberField.svelte +112 -0
- package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
- package/dist/components/form/FormRangeField.stories.svelte +31 -0
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormRangeField.svelte +246 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
- package/dist/components/form/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormSelect.svelte +129 -0
- package/dist/components/form/FormSelect.svelte.d.ts +20 -0
- package/dist/components/form/FormTemplateEditor.svelte +825 -0
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextField.svelte +91 -0
- package/dist/components/form/FormTextField.svelte.d.ts +19 -0
- package/dist/components/form/FormTextarea.stories.svelte +34 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.svelte +97 -0
- package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
- package/dist/components/form/FormToggle.stories.svelte +30 -0
- package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormToggle.svelte +126 -0
- package/dist/components/form/FormToggle.svelte.d.ts +19 -0
- package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
- package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
- package/dist/components/form/index.d.ts +50 -0
- package/dist/components/form/index.js +54 -0
- package/dist/components/form/templateAutocomplete.d.ts +29 -0
- package/dist/components/form/templateAutocomplete.js +254 -0
- package/dist/components/form/types.d.ts +485 -0
- package/dist/components/form/types.js +73 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
- package/dist/components/interrupt/FormPrompt.svelte +236 -0
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/InterruptBubble.svelte +601 -0
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/index.d.ts +13 -0
- package/dist/components/interrupt/index.js +15 -0
- package/dist/components/layouts/MainLayout.svelte +718 -0
- package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
- package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +591 -0
- package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
- package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +455 -0
- package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
- package/dist/components/nodes/NotesNode.stories.svelte +76 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +378 -0
- package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
- package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +451 -0
- package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
- package/dist/components/nodes/SquareNode.stories.svelte +82 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +407 -0
- package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/TerminalNode.svelte +690 -0
- package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
- package/dist/components/nodes/ToolNode.stories.svelte +189 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +471 -0
- package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +571 -0
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
- package/dist/components/playground/ChatPanel.svelte +905 -0
- package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
- package/dist/components/playground/ExecutionLogs.svelte +488 -0
- package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
- package/dist/components/playground/InputCollector.svelte +444 -0
- package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
- package/dist/components/playground/MessageBubble.stories.svelte +62 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +633 -0
- package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
- package/dist/components/playground/Playground.svelte +1075 -0
- package/dist/components/playground/Playground.svelte.d.ts +25 -0
- package/dist/components/playground/PlaygroundModal.svelte +220 -0
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
- package/dist/components/playground/SessionManager.svelte +538 -0
- package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
- package/dist/config/agentSpecEndpoints.d.ts +70 -0
- package/dist/config/agentSpecEndpoints.js +65 -0
- package/dist/config/constants.d.ts +43 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/defaultCategories.d.ts +7 -0
- package/dist/config/defaultCategories.js +126 -0
- package/dist/config/defaultPortConfig.d.ts +6 -0
- package/dist/config/defaultPortConfig.js +201 -0
- package/dist/config/endpoints.d.ts +160 -0
- package/dist/config/endpoints.js +146 -0
- package/dist/config/runtimeConfig.d.ts +47 -0
- package/dist/config/runtimeConfig.js +80 -0
- package/dist/core/index.d.ts +75 -0
- package/dist/core/index.js +92 -0
- package/dist/display/index.d.ts +29 -0
- package/dist/display/index.js +36 -0
- package/dist/editor/index.d.ts +95 -0
- package/dist/editor/index.js +138 -0
- package/dist/form/code.d.ts +101 -0
- package/dist/form/code.js +168 -0
- package/dist/form/fieldRegistry.d.ts +169 -0
- package/dist/form/fieldRegistry.js +152 -0
- package/dist/form/full.d.ts +56 -0
- package/dist/form/full.js +80 -0
- package/dist/form/index.d.ts +77 -0
- package/dist/form/index.js +91 -0
- package/dist/form/markdown.d.ts +69 -0
- package/dist/form/markdown.js +103 -0
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/proximityConnect.d.ts +94 -0
- package/dist/helpers/proximityConnect.js +314 -0
- package/dist/helpers/workflowEditorHelper.d.ts +183 -0
- package/dist/helpers/workflowEditorHelper.js +595 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +64 -0
- package/dist/mocks/app-environment.d.ts +8 -0
- package/dist/mocks/app-environment.js +16 -0
- package/dist/mocks/app-forms.d.ts +2 -0
- package/dist/mocks/app-forms.js +22 -0
- package/dist/mocks/app-navigation.d.ts +5 -0
- package/dist/mocks/app-navigation.js +36 -0
- package/dist/mocks/app-stores.d.ts +14 -0
- package/dist/mocks/app-stores.js +26 -0
- package/dist/playground/index.d.ts +131 -0
- package/dist/playground/index.js +172 -0
- package/dist/playground/mount.d.ts +203 -0
- package/dist/playground/mount.js +235 -0
- package/dist/registry/BaseRegistry.d.ts +92 -0
- package/dist/registry/BaseRegistry.js +124 -0
- package/dist/registry/builtinFormats.d.ts +23 -0
- package/dist/registry/builtinFormats.js +70 -0
- package/dist/registry/builtinNodes.d.ts +77 -0
- package/dist/registry/builtinNodes.js +211 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/nodeComponentRegistry.d.ts +276 -0
- package/dist/registry/nodeComponentRegistry.js +262 -0
- package/dist/registry/plugin.d.ts +215 -0
- package/dist/registry/plugin.js +249 -0
- package/dist/registry/workflowFormatRegistry.d.ts +122 -0
- package/dist/registry/workflowFormatRegistry.js +96 -0
- package/dist/schema/index.d.ts +23 -0
- package/dist/schema/index.js +23 -0
- package/dist/schemas/v1/workflow.schema.json +1078 -0
- package/dist/services/agentSpecExecutionService.d.ts +106 -0
- package/dist/services/agentSpecExecutionService.js +334 -0
- package/dist/services/api.d.ts +115 -0
- package/dist/services/api.js +214 -0
- package/dist/services/apiVariableService.d.ts +114 -0
- package/dist/services/apiVariableService.js +338 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +227 -0
- package/dist/services/categoriesApi.d.ts +14 -0
- package/dist/services/categoriesApi.js +49 -0
- package/dist/services/draftStorage.d.ts +171 -0
- package/dist/services/draftStorage.js +299 -0
- package/dist/services/dynamicSchemaService.d.ts +108 -0
- package/dist/services/dynamicSchemaService.js +444 -0
- package/dist/services/globalSave.d.ts +69 -0
- package/dist/services/globalSave.js +248 -0
- package/dist/services/historyService.d.ts +208 -0
- package/dist/services/historyService.js +321 -0
- package/dist/services/interruptService.d.ts +133 -0
- package/dist/services/interruptService.js +280 -0
- package/dist/services/nodeExecutionService.d.ts +63 -0
- package/dist/services/nodeExecutionService.js +266 -0
- package/dist/services/playgroundService.d.ts +130 -0
- package/dist/services/playgroundService.js +321 -0
- package/dist/services/portConfigApi.d.ts +14 -0
- package/dist/services/portConfigApi.js +54 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +196 -0
- package/dist/services/toastService.d.ts +156 -0
- package/dist/services/toastService.js +265 -0
- package/dist/services/variableService.d.ts +141 -0
- package/dist/services/variableService.js +463 -0
- package/dist/services/workflowStorage.d.ts +37 -0
- package/dist/services/workflowStorage.js +116 -0
- package/dist/settings/index.d.ts +25 -0
- package/dist/settings/index.js +33 -0
- package/dist/stores/categoriesStore.svelte.d.ts +32 -0
- package/dist/stores/categoriesStore.svelte.js +77 -0
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/historyStore.svelte.d.ts +136 -0
- package/dist/stores/historyStore.svelte.js +207 -0
- package/dist/stores/interruptStore.svelte.d.ts +179 -0
- package/dist/stores/interruptStore.svelte.js +346 -0
- package/dist/stores/playgroundStore.svelte.d.ts +230 -0
- package/dist/stores/playgroundStore.svelte.js +515 -0
- package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
- package/dist/stores/portCoordinateStore.svelte.js +186 -0
- package/dist/stores/settingsStore.svelte.d.ts +158 -0
- package/dist/stores/settingsStore.svelte.js +544 -0
- package/dist/stores/workflowStore.svelte.d.ts +260 -0
- package/dist/stores/workflowStore.svelte.js +649 -0
- package/dist/stories/CanvasDecorator.svelte +49 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +73 -0
- package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
- package/dist/stories/utils.d.ts +93 -0
- package/dist/stories/utils.js +122 -0
- package/dist/styles/base.css +1300 -0
- package/dist/styles/toast.css +35 -0
- package/dist/styles/tokens.css +475 -0
- package/dist/svelte-app.d.ts +150 -0
- package/dist/svelte-app.js +295 -0
- package/dist/types/agentspec.d.ts +318 -0
- package/dist/types/agentspec.js +48 -0
- package/dist/types/auth.d.ts +263 -0
- package/dist/types/auth.js +229 -0
- package/dist/types/config.d.ts +151 -0
- package/dist/types/config.js +7 -0
- package/dist/types/events.d.ts +190 -0
- package/dist/types/events.js +30 -0
- package/dist/types/index.d.ts +1234 -0
- package/dist/types/index.js +27 -0
- package/dist/types/interrupt.d.ts +390 -0
- package/dist/types/interrupt.js +145 -0
- package/dist/types/interruptState.d.ts +211 -0
- package/dist/types/interruptState.js +308 -0
- package/dist/types/playground.d.ts +351 -0
- package/dist/types/playground.js +95 -0
- package/dist/types/settings.d.ts +189 -0
- package/dist/types/settings.js +97 -0
- package/dist/types/uischema.d.ts +144 -0
- package/dist/types/uischema.js +51 -0
- package/dist/utils/colors.d.ts +288 -0
- package/dist/utils/colors.js +548 -0
- package/dist/utils/config.d.ts +37 -0
- package/dist/utils/config.js +226 -0
- package/dist/utils/connections.d.ts +125 -0
- package/dist/utils/connections.js +414 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.js +44 -0
- package/dist/utils/fetchWithAuth.d.ts +25 -0
- package/dist/utils/fetchWithAuth.js +34 -0
- package/dist/utils/handleIds.d.ts +35 -0
- package/dist/utils/handleIds.js +58 -0
- package/dist/utils/handlePositioning.d.ts +31 -0
- package/dist/utils/handlePositioning.js +35 -0
- package/dist/utils/icons.d.ts +106 -0
- package/dist/utils/icons.js +157 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeStatus.d.ts +53 -0
- package/dist/utils/nodeStatus.js +183 -0
- package/dist/utils/nodeTypes.d.ts +117 -0
- package/dist/utils/nodeTypes.js +244 -0
- package/dist/utils/nodeWrapper.d.ts +39 -0
- package/dist/utils/nodeWrapper.js +62 -0
- package/dist/utils/performanceUtils.d.ts +30 -0
- package/dist/utils/performanceUtils.js +108 -0
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/uischema.d.ts +52 -0
- package/dist/utils/uischema.js +88 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +292 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
FormUISchemaRenderer Component
|
|
3
|
+
Recursively renders UISchema elements: VerticalLayout, Group, and Control.
|
|
4
|
+
|
|
5
|
+
This component bridges the UISchema tree and the existing FormField components.
|
|
6
|
+
It resolves Control scopes to property keys and delegates field rendering to FormField.
|
|
7
|
+
|
|
8
|
+
Rendering logic:
|
|
9
|
+
- Control -> resolve scope to key, render FormField
|
|
10
|
+
- VerticalLayout -> vertical flex container with recursive children
|
|
11
|
+
- Group -> FormFieldset wrapping recursive children
|
|
12
|
+
-->
|
|
13
|
+
|
|
14
|
+
<script lang="ts">
|
|
15
|
+
import type { UISchemaElement } from '../../types/uischema.js';
|
|
16
|
+
import type { ConfigSchema, WorkflowNode, WorkflowEdge, AuthProvider } from '../../types/index.js';
|
|
17
|
+
import type { FieldSchema } from './types.js';
|
|
18
|
+
import { resolveScopeToKey } from '../../utils/uischema.js';
|
|
19
|
+
import FormField from './FormField.svelte';
|
|
20
|
+
import FormFieldset from './FormFieldset.svelte';
|
|
21
|
+
import Self from './FormUISchemaRenderer.svelte';
|
|
22
|
+
|
|
23
|
+
interface Props {
|
|
24
|
+
/** The UISchema element to render */
|
|
25
|
+
element: UISchemaElement;
|
|
26
|
+
/** The data schema (for resolving field definitions) */
|
|
27
|
+
schema: ConfigSchema;
|
|
28
|
+
/** Current form values */
|
|
29
|
+
values: Record<string, unknown>;
|
|
30
|
+
/** Required field keys from the schema */
|
|
31
|
+
requiredFields?: string[];
|
|
32
|
+
/** Base animation index for staggered animations */
|
|
33
|
+
animationIndexBase?: number;
|
|
34
|
+
/** Callback when a field value changes */
|
|
35
|
+
onFieldChange: (key: string, value: unknown) => void;
|
|
36
|
+
/** Convert a property to FieldSchema (handles template variable injection etc.) */
|
|
37
|
+
toFieldSchema: (property: Record<string, unknown>) => FieldSchema;
|
|
38
|
+
/** Current workflow node (optional, passed through to FormField) */
|
|
39
|
+
node?: WorkflowNode;
|
|
40
|
+
/** All workflow nodes (optional, passed through to FormField) */
|
|
41
|
+
nodes?: WorkflowNode[];
|
|
42
|
+
/** All workflow edges (optional, passed through to FormField) */
|
|
43
|
+
edges?: WorkflowEdge[];
|
|
44
|
+
/** Workflow ID (optional, passed through to FormField) */
|
|
45
|
+
workflowId?: string;
|
|
46
|
+
/** Auth provider (optional, passed through to FormField) */
|
|
47
|
+
authProvider?: AuthProvider;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let {
|
|
51
|
+
element,
|
|
52
|
+
schema,
|
|
53
|
+
values,
|
|
54
|
+
requiredFields = [],
|
|
55
|
+
animationIndexBase = 0,
|
|
56
|
+
onFieldChange,
|
|
57
|
+
toFieldSchema,
|
|
58
|
+
node,
|
|
59
|
+
nodes,
|
|
60
|
+
edges,
|
|
61
|
+
workflowId,
|
|
62
|
+
authProvider
|
|
63
|
+
}: Props = $props();
|
|
64
|
+
|
|
65
|
+
function isRequired(key: string): boolean {
|
|
66
|
+
return requiredFields.includes(key);
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
{#if element.type === 'Control'}
|
|
71
|
+
{@const key = resolveScopeToKey(element.scope)}
|
|
72
|
+
{#if key && schema.properties[key]}
|
|
73
|
+
{@const fieldSchema = toFieldSchema(schema.properties[key] as Record<string, unknown>)}
|
|
74
|
+
<FormField
|
|
75
|
+
fieldKey={key}
|
|
76
|
+
schema={fieldSchema}
|
|
77
|
+
value={values[key]}
|
|
78
|
+
required={isRequired(key)}
|
|
79
|
+
animationIndex={animationIndexBase}
|
|
80
|
+
{node}
|
|
81
|
+
{nodes}
|
|
82
|
+
{edges}
|
|
83
|
+
{workflowId}
|
|
84
|
+
{authProvider}
|
|
85
|
+
onChange={(val) => onFieldChange(key, val)}
|
|
86
|
+
/>
|
|
87
|
+
{/if}
|
|
88
|
+
{:else if element.type === 'VerticalLayout'}
|
|
89
|
+
<div class="form-uischema-layout form-uischema-layout--vertical">
|
|
90
|
+
{#each element.elements as child, idx (idx)}
|
|
91
|
+
<Self
|
|
92
|
+
element={child}
|
|
93
|
+
{schema}
|
|
94
|
+
{values}
|
|
95
|
+
{requiredFields}
|
|
96
|
+
animationIndexBase={animationIndexBase + idx}
|
|
97
|
+
{onFieldChange}
|
|
98
|
+
{toFieldSchema}
|
|
99
|
+
{node}
|
|
100
|
+
{nodes}
|
|
101
|
+
{edges}
|
|
102
|
+
{workflowId}
|
|
103
|
+
{authProvider}
|
|
104
|
+
/>
|
|
105
|
+
{/each}
|
|
106
|
+
</div>
|
|
107
|
+
{:else if element.type === 'Group'}
|
|
108
|
+
<FormFieldset group={element}>
|
|
109
|
+
<div class="form-uischema-layout form-uischema-layout--vertical">
|
|
110
|
+
{#each element.elements as child, idx (idx)}
|
|
111
|
+
<Self
|
|
112
|
+
element={child}
|
|
113
|
+
{schema}
|
|
114
|
+
{values}
|
|
115
|
+
{requiredFields}
|
|
116
|
+
animationIndexBase={animationIndexBase + idx}
|
|
117
|
+
{onFieldChange}
|
|
118
|
+
{toFieldSchema}
|
|
119
|
+
{node}
|
|
120
|
+
{nodes}
|
|
121
|
+
{edges}
|
|
122
|
+
{workflowId}
|
|
123
|
+
{authProvider}
|
|
124
|
+
/>
|
|
125
|
+
{/each}
|
|
126
|
+
</div>
|
|
127
|
+
</FormFieldset>
|
|
128
|
+
{/if}
|
|
129
|
+
|
|
130
|
+
<style>
|
|
131
|
+
.form-uischema-layout--vertical {
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
gap: var(--fd-space-2xl);
|
|
135
|
+
}
|
|
136
|
+
</style>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { UISchemaElement } from '../../types/uischema.js';
|
|
2
|
+
import type { ConfigSchema, WorkflowNode, WorkflowEdge, AuthProvider } from '../../types/index.js';
|
|
3
|
+
import type { FieldSchema } from './types.js';
|
|
4
|
+
interface Props {
|
|
5
|
+
/** The UISchema element to render */
|
|
6
|
+
element: UISchemaElement;
|
|
7
|
+
/** The data schema (for resolving field definitions) */
|
|
8
|
+
schema: ConfigSchema;
|
|
9
|
+
/** Current form values */
|
|
10
|
+
values: Record<string, unknown>;
|
|
11
|
+
/** Required field keys from the schema */
|
|
12
|
+
requiredFields?: string[];
|
|
13
|
+
/** Base animation index for staggered animations */
|
|
14
|
+
animationIndexBase?: number;
|
|
15
|
+
/** Callback when a field value changes */
|
|
16
|
+
onFieldChange: (key: string, value: unknown) => void;
|
|
17
|
+
/** Convert a property to FieldSchema (handles template variable injection etc.) */
|
|
18
|
+
toFieldSchema: (property: Record<string, unknown>) => FieldSchema;
|
|
19
|
+
/** Current workflow node (optional, passed through to FormField) */
|
|
20
|
+
node?: WorkflowNode;
|
|
21
|
+
/** All workflow nodes (optional, passed through to FormField) */
|
|
22
|
+
nodes?: WorkflowNode[];
|
|
23
|
+
/** All workflow edges (optional, passed through to FormField) */
|
|
24
|
+
edges?: WorkflowEdge[];
|
|
25
|
+
/** Workflow ID (optional, passed through to FormField) */
|
|
26
|
+
workflowId?: string;
|
|
27
|
+
/** Auth provider (optional, passed through to FormField) */
|
|
28
|
+
authProvider?: AuthProvider;
|
|
29
|
+
}
|
|
30
|
+
declare const FormUISchemaRenderer: import("svelte").Component<Props, {}, "">;
|
|
31
|
+
type FormUISchemaRenderer = ReturnType<typeof FormUISchemaRenderer>;
|
|
32
|
+
export default FormUISchemaRenderer;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form Components Module
|
|
3
|
+
*
|
|
4
|
+
* Modular form components for dynamic form rendering based on JSON Schema.
|
|
5
|
+
* Designed for extensibility to support complex types like arrays and objects.
|
|
6
|
+
*
|
|
7
|
+
* @module form
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```svelte
|
|
11
|
+
* <script>
|
|
12
|
+
* import { FormField } from "./";
|
|
13
|
+
* import type { FieldSchema } from "./";
|
|
14
|
+
*
|
|
15
|
+
* const schema: FieldSchema = {
|
|
16
|
+
* type: "string",
|
|
17
|
+
* title: "Name",
|
|
18
|
+
* description: "Enter your name"
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* let value = $state("");
|
|
22
|
+
* </script>
|
|
23
|
+
*
|
|
24
|
+
* <FormField
|
|
25
|
+
* fieldKey="name"
|
|
26
|
+
* {schema}
|
|
27
|
+
* {value}
|
|
28
|
+
* onChange={(v) => value = v}
|
|
29
|
+
* />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export type { FieldType, FieldFormat, FieldOption, OneOfItem, BaseFieldProps, TextFieldProps, TextareaFieldProps, NumberFieldProps, ToggleFieldProps, RangeFieldProps, SelectFieldProps, CheckboxGroupFieldProps, ArrayFieldProps, CodeEditorFieldProps, MarkdownEditorFieldProps, TemplateEditorFieldProps, AutocompleteFieldProps, FieldSchema, FormFieldFactoryProps, FormFieldWrapperProps, SchemaFormProps, AutocompleteConfig } from './types.js';
|
|
33
|
+
export { isFieldOptionArray, isOneOfArray, oneOfToOptions, normalizeOptions, getSchemaOptions } from './types.js';
|
|
34
|
+
export { default as FormField } from './FormField.svelte';
|
|
35
|
+
export { default as FormFieldWrapper } from './FormFieldWrapper.svelte';
|
|
36
|
+
export { default as FormTextField } from './FormTextField.svelte';
|
|
37
|
+
export { default as FormTextarea } from './FormTextarea.svelte';
|
|
38
|
+
export { default as FormNumberField } from './FormNumberField.svelte';
|
|
39
|
+
export { default as FormRangeField } from './FormRangeField.svelte';
|
|
40
|
+
export { default as FormToggle } from './FormToggle.svelte';
|
|
41
|
+
export { default as FormSelect } from './FormSelect.svelte';
|
|
42
|
+
export { default as FormCheckboxGroup } from './FormCheckboxGroup.svelte';
|
|
43
|
+
export { default as FormArray } from './FormArray.svelte';
|
|
44
|
+
export { default as FormCodeEditor } from './FormCodeEditor.svelte';
|
|
45
|
+
export { default as FormMarkdownEditor } from './FormMarkdownEditor.svelte';
|
|
46
|
+
export { default as FormTemplateEditor } from './FormTemplateEditor.svelte';
|
|
47
|
+
export { default as FormAutocomplete } from './FormAutocomplete.svelte';
|
|
48
|
+
export { default as FormFieldset } from './FormFieldset.svelte';
|
|
49
|
+
export { default as FormUISchemaRenderer } from './FormUISchemaRenderer.svelte';
|
|
50
|
+
export { createTemplateAutocomplete } from './templateAutocomplete.js';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form Components Module
|
|
3
|
+
*
|
|
4
|
+
* Modular form components for dynamic form rendering based on JSON Schema.
|
|
5
|
+
* Designed for extensibility to support complex types like arrays and objects.
|
|
6
|
+
*
|
|
7
|
+
* @module form
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```svelte
|
|
11
|
+
* <script>
|
|
12
|
+
* import { FormField } from "./";
|
|
13
|
+
* import type { FieldSchema } from "./";
|
|
14
|
+
*
|
|
15
|
+
* const schema: FieldSchema = {
|
|
16
|
+
* type: "string",
|
|
17
|
+
* title: "Name",
|
|
18
|
+
* description: "Enter your name"
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* let value = $state("");
|
|
22
|
+
* </script>
|
|
23
|
+
*
|
|
24
|
+
* <FormField
|
|
25
|
+
* fieldKey="name"
|
|
26
|
+
* {schema}
|
|
27
|
+
* {value}
|
|
28
|
+
* onChange={(v) => value = v}
|
|
29
|
+
* />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export { isFieldOptionArray, isOneOfArray, oneOfToOptions, normalizeOptions, getSchemaOptions } from './types.js';
|
|
33
|
+
// Main factory component
|
|
34
|
+
export { default as FormField } from './FormField.svelte';
|
|
35
|
+
// Wrapper component
|
|
36
|
+
export { default as FormFieldWrapper } from './FormFieldWrapper.svelte';
|
|
37
|
+
// Individual field components
|
|
38
|
+
export { default as FormTextField } from './FormTextField.svelte';
|
|
39
|
+
export { default as FormTextarea } from './FormTextarea.svelte';
|
|
40
|
+
export { default as FormNumberField } from './FormNumberField.svelte';
|
|
41
|
+
export { default as FormRangeField } from './FormRangeField.svelte';
|
|
42
|
+
export { default as FormToggle } from './FormToggle.svelte';
|
|
43
|
+
export { default as FormSelect } from './FormSelect.svelte';
|
|
44
|
+
export { default as FormCheckboxGroup } from './FormCheckboxGroup.svelte';
|
|
45
|
+
export { default as FormArray } from './FormArray.svelte';
|
|
46
|
+
export { default as FormCodeEditor } from './FormCodeEditor.svelte';
|
|
47
|
+
export { default as FormMarkdownEditor } from './FormMarkdownEditor.svelte';
|
|
48
|
+
export { default as FormTemplateEditor } from './FormTemplateEditor.svelte';
|
|
49
|
+
export { default as FormAutocomplete } from './FormAutocomplete.svelte';
|
|
50
|
+
// UISchema rendering components
|
|
51
|
+
export { default as FormFieldset } from './FormFieldset.svelte';
|
|
52
|
+
export { default as FormUISchemaRenderer } from './FormUISchemaRenderer.svelte';
|
|
53
|
+
// Template autocomplete utilities
|
|
54
|
+
export { createTemplateAutocomplete } from './templateAutocomplete.js';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Variable Autocomplete Extension for CodeMirror
|
|
3
|
+
* Provides autocomplete suggestions for {{ variable }} syntax in template editors.
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Triggers on `{{` to show top-level variables
|
|
7
|
+
* - Triggers on `.` to show child properties for objects
|
|
8
|
+
* - Triggers on `[` to show array index options
|
|
9
|
+
* - Supports deep nesting (e.g., `user.address.city`)
|
|
10
|
+
*
|
|
11
|
+
* @module components/form/templateAutocomplete
|
|
12
|
+
*/
|
|
13
|
+
import type { Extension } from '@codemirror/state';
|
|
14
|
+
import type { VariableSchema } from '../../types/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Creates a CodeMirror extension for template variable autocomplete.
|
|
17
|
+
*
|
|
18
|
+
* @param schema - The variable schema containing available variables
|
|
19
|
+
* @returns A CodeMirror extension that provides autocomplete
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const extensions = [
|
|
24
|
+
* // ... other extensions
|
|
25
|
+
* createTemplateAutocomplete(variableSchema)
|
|
26
|
+
* ];
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function createTemplateAutocomplete(schema: VariableSchema): Extension;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Variable Autocomplete Extension for CodeMirror
|
|
3
|
+
* Provides autocomplete suggestions for {{ variable }} syntax in template editors.
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Triggers on `{{` to show top-level variables
|
|
7
|
+
* - Triggers on `.` to show child properties for objects
|
|
8
|
+
* - Triggers on `[` to show array index options
|
|
9
|
+
* - Supports deep nesting (e.g., `user.address.city`)
|
|
10
|
+
*
|
|
11
|
+
* @module components/form/templateAutocomplete
|
|
12
|
+
*/
|
|
13
|
+
import { autocompletion } from '@codemirror/autocomplete';
|
|
14
|
+
import { getChildVariables, getArrayIndexSuggestions, isArrayVariable, hasChildren } from '../../services/variableService.js';
|
|
15
|
+
/**
|
|
16
|
+
* Icon type hints for different variable types in autocomplete dropdown.
|
|
17
|
+
*/
|
|
18
|
+
const TYPE_ICONS = {
|
|
19
|
+
string: '𝑆',
|
|
20
|
+
number: '#',
|
|
21
|
+
integer: '#',
|
|
22
|
+
float: '#',
|
|
23
|
+
boolean: '☑',
|
|
24
|
+
array: '[]',
|
|
25
|
+
object: '{}',
|
|
26
|
+
mixed: '⋯'
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Extracts the current variable path being typed inside {{ }}.
|
|
30
|
+
* Returns null if cursor is not inside a template expression.
|
|
31
|
+
*
|
|
32
|
+
* @param text - The full document text
|
|
33
|
+
* @param pos - Current cursor position
|
|
34
|
+
* @returns Object with the path and start position, or null
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* For text "Hello {{ user.name }}" with cursor after "user."
|
|
38
|
+
* Returns { path: "user.", startPos: 9 }
|
|
39
|
+
*/
|
|
40
|
+
function extractVariablePath(text, pos) {
|
|
41
|
+
// Look backwards from cursor to find the opening {{
|
|
42
|
+
let openBracePos = -1;
|
|
43
|
+
let searchPos = pos - 1;
|
|
44
|
+
while (searchPos >= 0) {
|
|
45
|
+
// Check for opening {{
|
|
46
|
+
if (text[searchPos] === '{' && searchPos > 0 && text[searchPos - 1] === '{') {
|
|
47
|
+
openBracePos = searchPos - 1;
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
// Check for closing }} - means we're outside an expression
|
|
51
|
+
if (text[searchPos] === '}' && searchPos > 0 && text[searchPos - 1] === '}') {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
searchPos--;
|
|
55
|
+
}
|
|
56
|
+
if (openBracePos === -1) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
// Check if there's a closing }} after cursor (still inside expression)
|
|
60
|
+
const afterCursor = text.slice(pos);
|
|
61
|
+
const closingMatch = afterCursor.match(/^\s*\}\}/);
|
|
62
|
+
const hasClosing = closingMatch !== null;
|
|
63
|
+
// Extract the content between {{ and cursor
|
|
64
|
+
const contentStart = openBracePos + 2;
|
|
65
|
+
const content = text.slice(contentStart, pos).trimStart();
|
|
66
|
+
return {
|
|
67
|
+
path: content,
|
|
68
|
+
startPos: contentStart +
|
|
69
|
+
(text.slice(contentStart, pos).length - text.slice(contentStart, pos).trimStart().length),
|
|
70
|
+
isInsideExpression: true
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Determines the completion type based on the current input.
|
|
75
|
+
*
|
|
76
|
+
* @param path - The current variable path being typed
|
|
77
|
+
* @returns The type of completion to provide
|
|
78
|
+
*/
|
|
79
|
+
function getCompletionType(path) {
|
|
80
|
+
// Empty or only whitespace - show top-level variables
|
|
81
|
+
if (path.trim() === '') {
|
|
82
|
+
return { type: 'top-level' };
|
|
83
|
+
}
|
|
84
|
+
// Ends with [ - show array indices
|
|
85
|
+
if (path.endsWith('[')) {
|
|
86
|
+
const parentPath = path.slice(0, -1);
|
|
87
|
+
return { type: 'array-index', parentPath };
|
|
88
|
+
}
|
|
89
|
+
// Ends with . - show child properties
|
|
90
|
+
if (path.endsWith('.')) {
|
|
91
|
+
const parentPath = path.slice(0, -1);
|
|
92
|
+
return { type: 'property', parentPath };
|
|
93
|
+
}
|
|
94
|
+
// Otherwise, we're typing a variable name - show matching options
|
|
95
|
+
const lastDotIndex = path.lastIndexOf('.');
|
|
96
|
+
const lastBracketIndex = path.lastIndexOf('[');
|
|
97
|
+
const lastSeparator = Math.max(lastDotIndex, lastBracketIndex);
|
|
98
|
+
if (lastSeparator === -1) {
|
|
99
|
+
// Typing at top level
|
|
100
|
+
return { type: 'top-level' };
|
|
101
|
+
}
|
|
102
|
+
// Extract parent path based on separator
|
|
103
|
+
if (lastDotIndex > lastBracketIndex) {
|
|
104
|
+
// Last separator was a dot
|
|
105
|
+
return { type: 'property', parentPath: path.slice(0, lastDotIndex) };
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Last separator was a bracket
|
|
109
|
+
return { type: 'array-index', parentPath: path.slice(0, lastBracketIndex) };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Converts a TemplateVariable to a CodeMirror Completion object.
|
|
114
|
+
*
|
|
115
|
+
* @param variable - The template variable
|
|
116
|
+
* @param prefix - Prefix to add to the completion label
|
|
117
|
+
* @returns A CodeMirror Completion object
|
|
118
|
+
*/
|
|
119
|
+
function variableToCompletion(variable, prefix = '') {
|
|
120
|
+
const icon = TYPE_ICONS[variable.type] ?? TYPE_ICONS.mixed;
|
|
121
|
+
const hasChildProps = variable.properties && Object.keys(variable.properties).length > 0;
|
|
122
|
+
const isArray = variable.type === 'array';
|
|
123
|
+
// Add indicator if variable can be drilled into
|
|
124
|
+
let suffix = '';
|
|
125
|
+
if (hasChildProps)
|
|
126
|
+
suffix = '.';
|
|
127
|
+
else if (isArray)
|
|
128
|
+
suffix = '[';
|
|
129
|
+
return {
|
|
130
|
+
label: `${prefix}${variable.name}`,
|
|
131
|
+
displayLabel: `${icon} ${variable.label ?? variable.name}${suffix ? ' ' + suffix : ''}`,
|
|
132
|
+
detail: variable.type,
|
|
133
|
+
info: variable.description,
|
|
134
|
+
type: 'variable',
|
|
135
|
+
boost: hasChildProps || isArray ? 1 : 0 // Boost drillable variables
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Creates the completion source function for template variables.
|
|
140
|
+
*
|
|
141
|
+
* @param schema - The variable schema containing available variables
|
|
142
|
+
* @returns A completion source function for CodeMirror
|
|
143
|
+
*/
|
|
144
|
+
function createTemplateCompletionSource(schema) {
|
|
145
|
+
return (context) => {
|
|
146
|
+
const { state, pos } = context;
|
|
147
|
+
const text = state.doc.toString();
|
|
148
|
+
// Check if we're inside a {{ }} expression
|
|
149
|
+
const pathInfo = extractVariablePath(text, pos);
|
|
150
|
+
if (!pathInfo) {
|
|
151
|
+
// Check if user just typed {{
|
|
152
|
+
const beforeCursor = text.slice(Math.max(0, pos - 2), pos);
|
|
153
|
+
if (beforeCursor === '{{') {
|
|
154
|
+
// Show top-level variables
|
|
155
|
+
const options = Object.values(schema.variables).map((v) => variableToCompletion(v));
|
|
156
|
+
return {
|
|
157
|
+
from: pos,
|
|
158
|
+
options,
|
|
159
|
+
validFor: /^[\w.[\]]*$/
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const { path, startPos } = pathInfo;
|
|
165
|
+
const completionType = getCompletionType(path);
|
|
166
|
+
let options = [];
|
|
167
|
+
let from = pos;
|
|
168
|
+
switch (completionType.type) {
|
|
169
|
+
case 'top-level': {
|
|
170
|
+
// Show all top-level variables
|
|
171
|
+
const currentWord = path.trim();
|
|
172
|
+
options = Object.values(schema.variables)
|
|
173
|
+
.filter((v) => currentWord === '' || v.name.toLowerCase().startsWith(currentWord.toLowerCase()))
|
|
174
|
+
.map((v) => variableToCompletion(v));
|
|
175
|
+
// Calculate from position for replacement
|
|
176
|
+
from = startPos + (path.length - path.trimStart().length);
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case 'property': {
|
|
180
|
+
// Show child properties of the parent
|
|
181
|
+
const children = getChildVariables(schema, completionType.parentPath);
|
|
182
|
+
const currentWord = path.slice(path.lastIndexOf('.') + 1);
|
|
183
|
+
options = children
|
|
184
|
+
.filter((v) => currentWord === '' || v.name.toLowerCase().startsWith(currentWord.toLowerCase()))
|
|
185
|
+
.map((v) => variableToCompletion(v));
|
|
186
|
+
// From should be right after the last dot
|
|
187
|
+
from = startPos + path.lastIndexOf('.') + 1;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
case 'array-index': {
|
|
191
|
+
// Check if the parent is actually an array
|
|
192
|
+
if (isArrayVariable(schema, completionType.parentPath)) {
|
|
193
|
+
const indices = getArrayIndexSuggestions(5);
|
|
194
|
+
const currentIndex = path.slice(path.lastIndexOf('[') + 1);
|
|
195
|
+
options = indices
|
|
196
|
+
.filter((idx) => currentIndex === '' || idx.startsWith(currentIndex))
|
|
197
|
+
.map((idx) => ({
|
|
198
|
+
label: idx,
|
|
199
|
+
displayLabel: idx === '*]' ? '* (all items)' : `[${idx}`,
|
|
200
|
+
detail: idx === '*]' ? 'Iterate all items' : `Index ${idx.slice(0, -1)}`,
|
|
201
|
+
type: 'keyword'
|
|
202
|
+
}));
|
|
203
|
+
// From should be right after the [
|
|
204
|
+
from = startPos + path.lastIndexOf('[') + 1;
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (options.length === 0) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
from,
|
|
214
|
+
options,
|
|
215
|
+
validFor: /^[\w\]*]*$/
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Creates a CodeMirror extension for template variable autocomplete.
|
|
221
|
+
*
|
|
222
|
+
* @param schema - The variable schema containing available variables
|
|
223
|
+
* @returns A CodeMirror extension that provides autocomplete
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```typescript
|
|
227
|
+
* const extensions = [
|
|
228
|
+
* // ... other extensions
|
|
229
|
+
* createTemplateAutocomplete(variableSchema)
|
|
230
|
+
* ];
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
export function createTemplateAutocomplete(schema) {
|
|
234
|
+
return autocompletion({
|
|
235
|
+
override: [createTemplateCompletionSource(schema)],
|
|
236
|
+
activateOnTyping: true,
|
|
237
|
+
defaultKeymap: true,
|
|
238
|
+
optionClass: () => 'cm-template-autocomplete-option',
|
|
239
|
+
icons: false, // We use our own icons in displayLabel
|
|
240
|
+
addToOptions: [
|
|
241
|
+
{
|
|
242
|
+
render: (completion) => {
|
|
243
|
+
const el = document.createElement('span');
|
|
244
|
+
el.className = 'cm-template-autocomplete-info';
|
|
245
|
+
if (completion.info) {
|
|
246
|
+
el.textContent = String(completion.info);
|
|
247
|
+
}
|
|
248
|
+
return el;
|
|
249
|
+
},
|
|
250
|
+
position: 100
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
});
|
|
254
|
+
}
|