@nocobase/flow-engine 2.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +30 -0
- package/lib/ContextPathProxy.d.ts +17 -0
- package/lib/ContextPathProxy.js +65 -0
- package/lib/ElementProxy.d.ts +17 -0
- package/lib/ElementProxy.js +93 -0
- package/lib/FlowContextProvider.d.ts +24 -0
- package/lib/FlowContextProvider.js +82 -0
- package/lib/FlowDefinition.d.ts +423 -0
- package/lib/FlowDefinition.js +257 -0
- package/lib/JSRunner.d.ts +32 -0
- package/lib/JSRunner.js +95 -0
- package/lib/ReactView.d.ts +20 -0
- package/lib/ReactView.js +120 -0
- package/lib/ViewScopedFlowEngine.d.ts +23 -0
- package/lib/ViewScopedFlowEngine.js +81 -0
- package/lib/acl/Acl.d.ts +31 -0
- package/lib/acl/Acl.js +115 -0
- package/lib/action-registry/BaseActionRegistry.d.ts +23 -0
- package/lib/action-registry/BaseActionRegistry.js +57 -0
- package/lib/action-registry/EngineActionRegistry.d.ts +20 -0
- package/lib/action-registry/EngineActionRegistry.js +47 -0
- package/lib/action-registry/ModelActionRegistry.d.ts +34 -0
- package/lib/action-registry/ModelActionRegistry.js +79 -0
- package/lib/components/DynamicFlowsEditor.d.ts +17 -0
- package/lib/components/DynamicFlowsEditor.js +49 -0
- package/lib/components/FieldModelRenderer.d.ts +10 -0
- package/lib/components/FieldModelRenderer.js +94 -0
- package/lib/components/FlowContextSelector.d.ts +11 -0
- package/lib/components/FlowContextSelector.js +221 -0
- package/lib/components/FlowErrorFallback.d.ts +25 -0
- package/lib/components/FlowErrorFallback.js +264 -0
- package/lib/components/FlowModelRenderer.d.ts +64 -0
- package/lib/components/FlowModelRenderer.js +254 -0
- package/lib/components/FormItem.d.ts +18 -0
- package/lib/components/FormItem.js +147 -0
- package/lib/components/common/FlowSettingsButton.d.ts +11 -0
- package/lib/components/common/FlowSettingsButton.js +66 -0
- package/lib/components/common/index.d.ts +9 -0
- package/lib/components/common/index.js +30 -0
- package/lib/components/common/withFlowDesignMode.d.ts +26 -0
- package/lib/components/common/withFlowDesignMode.js +61 -0
- package/lib/components/dnd/getMousePositionOnElement.d.ts +50 -0
- package/lib/components/dnd/getMousePositionOnElement.js +95 -0
- package/lib/components/dnd/index.d.ts +24 -0
- package/lib/components/dnd/index.js +164 -0
- package/lib/components/dnd/moveBlock.d.ts +33 -0
- package/lib/components/dnd/moveBlock.js +302 -0
- package/lib/components/index.d.ts +18 -0
- package/lib/components/index.js +48 -0
- package/lib/components/settings/independents/dropdown/FlowsDropdownButton.d.ts +46 -0
- package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +225 -0
- package/lib/components/settings/independents/dropdown/index.d.ts +9 -0
- package/lib/components/settings/independents/dropdown/index.js +30 -0
- package/lib/components/settings/independents/index.d.ts +1 -0
- package/lib/components/settings/independents/index.js +30 -0
- package/lib/components/settings/index.d.ts +10 -0
- package/lib/components/settings/index.js +32 -0
- package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.d.ts +24 -0
- package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +501 -0
- package/lib/components/settings/wrappers/contextual/FlowsContextMenu.d.ts +45 -0
- package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +231 -0
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +111 -0
- package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +484 -0
- package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.d.ts +26 -0
- package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.js +342 -0
- package/lib/components/settings/wrappers/contextual/StepSettings.d.ts +23 -0
- package/lib/components/settings/wrappers/contextual/StepSettings.js +110 -0
- package/lib/components/settings/wrappers/contextual/StepSettingsDialog.d.ts +20 -0
- package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +206 -0
- package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.d.ts +20 -0
- package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.js +47 -0
- package/lib/components/settings/wrappers/contextual/index.d.ts +14 -0
- package/lib/components/settings/wrappers/contextual/index.js +40 -0
- package/lib/components/settings/wrappers/embedded/FlowSettings.d.ts +33 -0
- package/lib/components/settings/wrappers/embedded/FlowSettings.js +207 -0
- package/lib/components/settings/wrappers/embedded/FlowsSettings.d.ts +41 -0
- package/lib/components/settings/wrappers/embedded/FlowsSettings.js +84 -0
- package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.d.ts +16 -0
- package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +88 -0
- package/lib/components/settings/wrappers/embedded/index.d.ts +10 -0
- package/lib/components/settings/wrappers/embedded/index.js +32 -0
- package/lib/components/settings/wrappers/index.d.ts +2 -0
- package/lib/components/settings/wrappers/index.js +32 -0
- package/lib/components/subModel/AddSubModelButton.d.ts +62 -0
- package/lib/components/subModel/AddSubModelButton.js +415 -0
- package/lib/components/subModel/LazyDropdown.d.ts +55 -0
- package/lib/components/subModel/LazyDropdown.js +524 -0
- package/lib/components/subModel/index.d.ts +10 -0
- package/lib/components/subModel/index.js +32 -0
- package/lib/components/subModel/utils.d.ts +34 -0
- package/lib/components/subModel/utils.js +287 -0
- package/lib/components/variables/InlineVariableTag.d.ts +21 -0
- package/lib/components/variables/InlineVariableTag.js +123 -0
- package/lib/components/variables/SlateVariableEditor.d.ts +46 -0
- package/lib/components/variables/SlateVariableEditor.js +302 -0
- package/lib/components/variables/VariableInput.d.ts +11 -0
- package/lib/components/variables/VariableInput.js +322 -0
- package/lib/components/variables/VariableTag.d.ts +11 -0
- package/lib/components/variables/VariableTag.js +148 -0
- package/lib/components/variables/VariableTrigger.d.ts +20 -0
- package/lib/components/variables/VariableTrigger.js +136 -0
- package/lib/components/variables/index.d.ts +15 -0
- package/lib/components/variables/index.js +53 -0
- package/lib/components/variables/types.d.ts +93 -0
- package/lib/components/variables/types.js +24 -0
- package/lib/components/variables/useResolvedMetaTree.d.ts +19 -0
- package/lib/components/variables/useResolvedMetaTree.js +91 -0
- package/lib/components/variables/utils.d.ts +22 -0
- package/lib/components/variables/utils.js +177 -0
- package/lib/data-source/index.d.ts +180 -0
- package/lib/data-source/index.js +733 -0
- package/lib/data-source/jioToJoiSchema.d.ts +19 -0
- package/lib/data-source/jioToJoiSchema.js +114 -0
- package/lib/decorators/index.d.ts +9 -0
- package/lib/decorators/index.js +36 -0
- package/lib/decorators/largeField.d.ts +9 -0
- package/lib/decorators/largeField.js +42 -0
- package/lib/emitter.d.ts +16 -0
- package/lib/emitter.js +58 -0
- package/lib/event-registry/BaseEventRegistry.d.ts +22 -0
- package/lib/event-registry/BaseEventRegistry.js +57 -0
- package/lib/event-registry/EngineEventRegistry.d.ts +19 -0
- package/lib/event-registry/EngineEventRegistry.js +47 -0
- package/lib/event-registry/ModelEventRegistry.d.ts +33 -0
- package/lib/event-registry/ModelEventRegistry.js +79 -0
- package/lib/executor/FlowExecutor.d.ts +26 -0
- package/lib/executor/FlowExecutor.js +262 -0
- package/lib/flow-registry/BaseFlowRegistry.d.ts +46 -0
- package/lib/flow-registry/BaseFlowRegistry.js +86 -0
- package/lib/flow-registry/GlobalFlowRegistry.d.ts +22 -0
- package/lib/flow-registry/GlobalFlowRegistry.js +95 -0
- package/lib/flow-registry/InstanceFlowRegistry.d.ts +21 -0
- package/lib/flow-registry/InstanceFlowRegistry.js +59 -0
- package/lib/flow-registry/index.d.ts +11 -0
- package/lib/flow-registry/index.js +34 -0
- package/lib/flowContext.d.ts +215 -0
- package/lib/flowContext.js +1266 -0
- package/lib/flowEngine.d.ts +340 -0
- package/lib/flowEngine.js +781 -0
- package/lib/flowI18n.d.ts +46 -0
- package/lib/flowI18n.js +117 -0
- package/lib/flowSettings.d.ts +266 -0
- package/lib/flowSettings.js +850 -0
- package/lib/hooks/index.d.ts +14 -0
- package/lib/hooks/index.js +40 -0
- package/lib/hooks/useApplyAutoFlows.d.ts +21 -0
- package/lib/hooks/useApplyAutoFlows.js +62 -0
- package/lib/hooks/useFlowModel.d.ts +29 -0
- package/lib/hooks/useFlowModel.js +72 -0
- package/lib/hooks/useFlowModelById.d.ts +11 -0
- package/lib/hooks/useFlowModelById.js +61 -0
- package/lib/hooks/useFlowSettingsContext.d.ts +20 -0
- package/lib/hooks/useFlowSettingsContext.js +61 -0
- package/lib/hooks/useFlowStep.d.ts +17 -0
- package/lib/hooks/useFlowStep.js +56 -0
- package/lib/hooks/useNiceDropdownMaxHeight.d.ts +13 -0
- package/lib/hooks/useNiceDropdownMaxHeight.js +52 -0
- package/lib/index.d.ts +27 -0
- package/lib/index.js +73 -0
- package/lib/locale/en-US.json +61 -0
- package/lib/locale/index.d.ts +141 -0
- package/lib/locale/index.js +70 -0
- package/lib/locale/zh-CN.json +61 -0
- package/lib/models/CollectionFieldModel.d.ts +50 -0
- package/lib/models/CollectionFieldModel.js +242 -0
- package/lib/models/DisplayItemModel.d.ts +12 -0
- package/lib/models/DisplayItemModel.js +41 -0
- package/lib/models/EditableItemModel.d.ts +12 -0
- package/lib/models/EditableItemModel.js +41 -0
- package/lib/models/FilterableItemModel.d.ts +12 -0
- package/lib/models/FilterableItemModel.js +41 -0
- package/lib/models/flowModel.d.ts +344 -0
- package/lib/models/flowModel.js +1133 -0
- package/lib/models/forkFlowModel.d.ts +83 -0
- package/lib/models/forkFlowModel.js +257 -0
- package/lib/models/index.d.ts +14 -0
- package/lib/models/index.js +40 -0
- package/lib/provider.d.ts +22 -0
- package/lib/provider.js +114 -0
- package/lib/resources/apiResource.d.ts +34 -0
- package/lib/resources/apiResource.js +153 -0
- package/lib/resources/baseRecordResource.d.ts +61 -0
- package/lib/resources/baseRecordResource.js +264 -0
- package/lib/resources/filterItem.d.ts +33 -0
- package/lib/resources/filterItem.js +93 -0
- package/lib/resources/flowResource.d.ts +45 -0
- package/lib/resources/flowResource.js +146 -0
- package/lib/resources/index.d.ts +15 -0
- package/lib/resources/index.js +42 -0
- package/lib/resources/multiRecordResource.d.ts +53 -0
- package/lib/resources/multiRecordResource.js +230 -0
- package/lib/resources/singleRecordResource.d.ts +23 -0
- package/lib/resources/singleRecordResource.js +111 -0
- package/lib/resources/sqlResource.d.ts +73 -0
- package/lib/resources/sqlResource.js +294 -0
- package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +38 -0
- package/lib/runjs-context/contexts/FlowRunJSContext.js +217 -0
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +66 -0
- package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/JSBlockRunJSContext.js +78 -0
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +12 -0
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +59 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.js +70 -0
- package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +16 -0
- package/lib/runjs-context/contexts/JSItemRunJSContext.js +66 -0
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +12 -0
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +61 -0
- package/lib/runjs-context/contexts/LinkageRunJSContext.d.ts +12 -0
- package/lib/runjs-context/contexts/LinkageRunJSContext.js +62 -0
- package/lib/runjs-context/helpers.d.ts +17 -0
- package/lib/runjs-context/helpers.js +79 -0
- package/lib/runjs-context/index.d.ts +19 -0
- package/lib/runjs-context/index.js +57 -0
- package/lib/runjs-context/registry.d.ts +17 -0
- package/lib/runjs-context/registry.js +93 -0
- package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/api-request-get.snippet.js +42 -0
- package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/api-request-post.snippet.js +42 -0
- package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +41 -0
- package/lib/runjs-context/snippets/global/copy-record-json.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/copy-record-json.snippet.js +42 -0
- package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.js +42 -0
- package/lib/runjs-context/snippets/global/log-json-record.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/log-json-record.snippet.js +42 -0
- package/lib/runjs-context/snippets/global/message-error.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/message-error.snippet.js +41 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.js +41 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.js +43 -0
- package/lib/runjs-context/snippets/global/open-view-dialog.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +47 -0
- package/lib/runjs-context/snippets/global/open-view-drawer.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +47 -0
- package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/requireAsync.snippet.js +46 -0
- package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/sleep.snippet.js +43 -0
- package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +44 -0
- package/lib/runjs-context/snippets/global/view-navigation-push.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/view-navigation-push.snippet.js +44 -0
- package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +16 -0
- package/lib/runjs-context/snippets/global/window-open.snippet.js +41 -0
- package/lib/runjs-context/snippets/index.d.ts +11 -0
- package/lib/runjs-context/snippets/index.js +94 -0
- package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/libs/echarts-init.snippet.js +46 -0
- package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.js +44 -0
- package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.js +43 -0
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +43 -0
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +40 -0
- package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.js +46 -0
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +42 -0
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +46 -0
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +41 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +41 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.js +46 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.js +45 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.js +56 -0
- package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.js +42 -0
- package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.js +41 -0
- package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.js +40 -0
- package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.js +44 -0
- package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.js +60 -0
- package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.js +59 -0
- package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.js +60 -0
- package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +15 -0
- package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.js +60 -0
- package/lib/runjs-context/snippets/types.d.ts +16 -0
- package/lib/runjs-context/snippets/types.js +24 -0
- package/lib/types.d.ts +398 -0
- package/lib/types.js +43 -0
- package/lib/utils/autoFlowError.d.ts +16 -0
- package/lib/utils/autoFlowError.js +53 -0
- package/lib/utils/constants.d.ts +29 -0
- package/lib/utils/constants.js +77 -0
- package/lib/utils/context.d.ts +40 -0
- package/lib/utils/context.js +63 -0
- package/lib/utils/createCollectionContextMeta.d.ts +11 -0
- package/lib/utils/createCollectionContextMeta.js +117 -0
- package/lib/utils/exceptions.d.ts +22 -0
- package/lib/utils/exceptions.js +62 -0
- package/lib/utils/flow-definitions.d.ts +11 -0
- package/lib/utils/flow-definitions.js +40 -0
- package/lib/utils/index.d.ts +22 -0
- package/lib/utils/index.js +117 -0
- package/lib/utils/inheritance.d.ts +16 -0
- package/lib/utils/inheritance.js +53 -0
- package/lib/utils/params-resolvers.d.ts +51 -0
- package/lib/utils/params-resolvers.js +309 -0
- package/lib/utils/parsePathnameToViewParams.d.ts +34 -0
- package/lib/utils/parsePathnameToViewParams.js +84 -0
- package/lib/utils/safeGlobals.d.ts +16 -0
- package/lib/utils/safeGlobals.js +179 -0
- package/lib/utils/schema-utils.d.ts +40 -0
- package/lib/utils/schema-utils.js +161 -0
- package/lib/utils/serverContextParams.d.ts +28 -0
- package/lib/utils/serverContextParams.js +106 -0
- package/lib/utils/setupRuntimeContextSteps.d.ts +19 -0
- package/lib/utils/setupRuntimeContextSteps.js +88 -0
- package/lib/utils/translation.d.ts +18 -0
- package/lib/utils/translation.js +58 -0
- package/lib/utils/variablesParams.d.ts +51 -0
- package/lib/utils/variablesParams.js +150 -0
- package/lib/views/DialogComponent.d.ts +22 -0
- package/lib/views/DialogComponent.js +98 -0
- package/lib/views/DrawerComponent.d.ts +11 -0
- package/lib/views/DrawerComponent.js +101 -0
- package/lib/views/FlowView.d.ts +76 -0
- package/lib/views/FlowView.js +81 -0
- package/lib/views/PageComponent.d.ts +10 -0
- package/lib/views/PageComponent.js +167 -0
- package/lib/views/ViewNavigation.d.ts +45 -0
- package/lib/views/ViewNavigation.js +97 -0
- package/lib/views/createViewMeta.d.ts +16 -0
- package/lib/views/createViewMeta.js +171 -0
- package/lib/views/index.d.ts +13 -0
- package/lib/views/index.js +48 -0
- package/lib/views/useDialog.d.ts +32 -0
- package/lib/views/useDialog.js +199 -0
- package/lib/views/useDrawer.d.ts +33 -0
- package/lib/views/useDrawer.js +206 -0
- package/lib/views/usePage.d.ts +32 -0
- package/lib/views/usePage.js +193 -0
- package/lib/views/usePatchElement.d.ts +10 -0
- package/lib/views/usePatchElement.js +54 -0
- package/lib/views/usePopover.d.ts +17 -0
- package/lib/views/usePopover.js +159 -0
- package/package.json +37 -0
- package/src/ContextPathProxy.ts +45 -0
- package/src/ElementProxy.ts +69 -0
- package/src/FlowContextProvider.tsx +40 -0
- package/src/FlowDefinition.ts +275 -0
- package/src/JSRunner.ts +84 -0
- package/src/ReactView.tsx +104 -0
- package/src/ViewScopedFlowEngine.ts +75 -0
- package/src/__tests__/ElementProxy.test.ts +51 -0
- package/src/__tests__/JSRunner.test.ts +92 -0
- package/src/__tests__/ReactView.test.tsx +63 -0
- package/src/__tests__/context-path-proxy.test.ts +35 -0
- package/src/__tests__/flow-engine.test.ts +189 -0
- package/src/__tests__/flowContext.test.ts +2012 -0
- package/src/__tests__/flowEngine.saveModel.test.ts +171 -0
- package/src/__tests__/flowI18n.test.ts +28 -0
- package/src/__tests__/flowModel.getFlows.test.ts +61 -0
- package/src/__tests__/flowModel.openView.navigation.test.ts +78 -0
- package/src/__tests__/flowRuntimeContext.test.ts +187 -0
- package/src/__tests__/flowSettings.open.test.tsx +1920 -0
- package/src/__tests__/flowSettings.test.ts +566 -0
- package/src/__tests__/globalFlowRegistry.test.ts +77 -0
- package/src/__tests__/isFieldInterfaceMatch.test.ts +51 -0
- package/src/__tests__/metaTreeNodeCache.test.ts +234 -0
- package/src/__tests__/path-aggregation.test.ts +85 -0
- package/src/__tests__/provider.test.tsx +28 -0
- package/src/__tests__/renderHiddenInConfig.test.tsx +91 -0
- package/src/__tests__/runjsContext.test.ts +60 -0
- package/src/__tests__/viewScopedFlowEngine.test.ts +212 -0
- package/src/acl/Acl.tsx +109 -0
- package/src/acl/__tests__/Acl.test.tsx +72 -0
- package/src/action-registry/BaseActionRegistry.ts +46 -0
- package/src/action-registry/EngineActionRegistry.ts +32 -0
- package/src/action-registry/ModelActionRegistry.ts +75 -0
- package/src/action-registry/__tests__/engineActionRegistry.test.ts +43 -0
- package/src/action-registry/__tests__/modelActionRegistry.test.ts +107 -0
- package/src/components/DynamicFlowsEditor.tsx +318 -0
- package/src/components/FieldModelRenderer.tsx +62 -0
- package/src/components/FlowContextSelector.tsx +255 -0
- package/src/components/FlowErrorFallback.tsx +316 -0
- package/src/components/FlowModelRenderer.tsx +428 -0
- package/src/components/FormItem.tsx +130 -0
- package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +226 -0
- package/src/components/common/FlowSettingsButton.tsx +30 -0
- package/src/components/common/index.ts +10 -0
- package/src/components/common/withFlowDesignMode.tsx +49 -0
- package/src/components/dnd/getMousePositionOnElement.ts +115 -0
- package/src/components/dnd/index.tsx +128 -0
- package/src/components/dnd/moveBlock.ts +379 -0
- package/src/components/index.ts +20 -0
- package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +279 -0
- package/src/components/settings/independents/dropdown/index.ts +10 -0
- package/src/components/settings/independents/index.ts +2 -0
- package/src/components/settings/index.ts +11 -0
- package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +617 -0
- package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +292 -0
- package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +655 -0
- package/src/components/settings/wrappers/contextual/StepRequiredSettingsDialog.tsx +446 -0
- package/src/components/settings/wrappers/contextual/StepSettings.tsx +109 -0
- package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +217 -0
- package/src/components/settings/wrappers/contextual/StepSettingsDrawer.tsx +32 -0
- package/src/components/settings/wrappers/contextual/index.ts +15 -0
- package/src/components/settings/wrappers/embedded/FlowSettings.tsx +258 -0
- package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +111 -0
- package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +96 -0
- package/src/components/settings/wrappers/embedded/index.ts +11 -0
- package/src/components/settings/wrappers/index.ts +5 -0
- package/src/components/subModel/AddSubModelButton.tsx +575 -0
- package/src/components/subModel/LazyDropdown.tsx +714 -0
- package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +1185 -0
- package/src/components/subModel/__tests__/buildWrapperFieldChildren.test.ts +192 -0
- package/src/components/subModel/__tests__/utils.test.ts +425 -0
- package/src/components/subModel/index.ts +12 -0
- package/src/components/subModel/utils.ts +278 -0
- package/src/components/variables/InlineVariableTag.tsx +97 -0
- package/src/components/variables/SlateVariableEditor.tsx +384 -0
- package/src/components/variables/VariableInput.tsx +342 -0
- package/src/components/variables/VariableTag.tsx +123 -0
- package/src/components/variables/VariableTrigger.tsx +116 -0
- package/src/components/variables/__tests__/FlowContextSelector.test.tsx +553 -0
- package/src/components/variables/__tests__/VariableInput.test.tsx +550 -0
- package/src/components/variables/__tests__/VariableTag.test.tsx +347 -0
- package/src/components/variables/__tests__/test-utils.tsx +62 -0
- package/src/components/variables/__tests__/utils.test.ts +310 -0
- package/src/components/variables/index.ts +16 -0
- package/src/components/variables/types.ts +100 -0
- package/src/components/variables/useResolvedMetaTree.ts +76 -0
- package/src/components/variables/utils.ts +192 -0
- package/src/data-source/__tests__/collection.test.ts +58 -0
- package/src/data-source/__tests__/index.test.ts +82 -0
- package/src/data-source/__tests__/jioToJoiSchema.test.ts +56 -0
- package/src/data-source/index.ts +812 -0
- package/src/data-source/jioToJoiSchema.ts +103 -0
- package/src/decorators/index.ts +10 -0
- package/src/decorators/largeField.ts +14 -0
- package/src/emitter.ts +33 -0
- package/src/event-registry/BaseEventRegistry.ts +40 -0
- package/src/event-registry/EngineEventRegistry.ts +26 -0
- package/src/event-registry/ModelEventRegistry.ts +69 -0
- package/src/event-registry/__tests__/engineEventRegistry.test.ts +48 -0
- package/src/executor/FlowExecutor.ts +256 -0
- package/src/executor/__tests__/eventStep.test.ts +157 -0
- package/src/executor/__tests__/flowExecutor.test.ts +163 -0
- package/src/flow-registry/BaseFlowRegistry.ts +91 -0
- package/src/flow-registry/GlobalFlowRegistry.ts +82 -0
- package/src/flow-registry/InstanceFlowRegistry.ts +39 -0
- package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +141 -0
- package/src/flow-registry/__tests__/instance-and-global-registry.test.ts +67 -0
- package/src/flow-registry/__tests__/instanceFlowRegistry.test.ts +83 -0
- package/src/flow-registry/index.ts +12 -0
- package/src/flowContext.ts +1639 -0
- package/src/flowEngine.ts +905 -0
- package/src/flowI18n.ts +96 -0
- package/src/flowSettings.ts +1045 -0
- package/src/hooks/index.ts +15 -0
- package/src/hooks/useApplyAutoFlows.ts +51 -0
- package/src/hooks/useFlowModel.tsx +59 -0
- package/src/hooks/useFlowModelById.ts +37 -0
- package/src/hooks/useFlowSettingsContext.tsx +37 -0
- package/src/hooks/useFlowStep.tsx +19 -0
- package/src/hooks/useNiceDropdownMaxHeight.ts +34 -0
- package/src/index.ts +38 -0
- package/src/locale/en-US.json +61 -0
- package/src/locale/index.ts +38 -0
- package/src/locale/zh-CN.json +61 -0
- package/src/models/CollectionFieldModel.tsx +269 -0
- package/src/models/DisplayItemModel.tsx +13 -0
- package/src/models/EditableItemModel.tsx +13 -0
- package/src/models/FilterableItemModel.tsx +13 -0
- package/src/models/__tests__/CollectionFieldModel.test.ts +122 -0
- package/src/models/__tests__/defaultParams-on-create.test.ts +83 -0
- package/src/models/__tests__/flow-model-oninit.test.ts +44 -0
- package/src/models/__tests__/flowModel.actions.integration.test.ts +100 -0
- package/src/models/__tests__/flowModel.getFlows.sort.test.ts +100 -0
- package/src/models/__tests__/flowModel.test.ts +2746 -0
- package/src/models/__tests__/flowRegistry.test.ts +512 -0
- package/src/models/__tests__/forkFlowModel.test.ts +1047 -0
- package/src/models/__tests__/model-actions.test.ts +70 -0
- package/src/models/__tests__/model-events.test.ts +69 -0
- package/src/models/flowModel.tsx +1398 -0
- package/src/models/forkFlowModel.ts +287 -0
- package/src/models/index.ts +17 -0
- package/src/provider.tsx +101 -0
- package/src/resources/__tests__/apiResource.test.ts +201 -0
- package/src/resources/__tests__/baseRecordResource.test.ts +262 -0
- package/src/resources/__tests__/filterItem.test.ts +260 -0
- package/src/resources/__tests__/flowResource.test.ts +127 -0
- package/src/resources/apiResource.ts +148 -0
- package/src/resources/baseRecordResource.ts +279 -0
- package/src/resources/filterItem.ts +74 -0
- package/src/resources/flowResource.ts +143 -0
- package/src/resources/index.ts +17 -0
- package/src/resources/multiRecordResource.ts +219 -0
- package/src/resources/singleRecordResource.ts +83 -0
- package/src/resources/sqlResource.ts +299 -0
- package/src/runjs-context/contexts/FlowRunJSContext.ts +190 -0
- package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +39 -0
- package/src/runjs-context/contexts/JSBlockRunJSContext.ts +52 -0
- package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +32 -0
- package/src/runjs-context/contexts/JSFieldRunJSContext.ts +43 -0
- package/src/runjs-context/contexts/JSItemRunJSContext.ts +39 -0
- package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +34 -0
- package/src/runjs-context/contexts/LinkageRunJSContext.ts +35 -0
- package/src/runjs-context/helpers.ts +56 -0
- package/src/runjs-context/index.ts +20 -0
- package/src/runjs-context/registry.ts +65 -0
- package/src/runjs-context/snippets/global/api-request-get.snippet.ts +20 -0
- package/src/runjs-context/snippets/global/api-request-post.snippet.ts +20 -0
- package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +19 -0
- package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +21 -0
- package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +21 -0
- package/src/runjs-context/snippets/global/log-json-record.snippet.ts +21 -0
- package/src/runjs-context/snippets/global/message-error.snippet.ts +20 -0
- package/src/runjs-context/snippets/global/message-success.snippet.ts +20 -0
- package/src/runjs-context/snippets/global/notification-open.snippet.ts +21 -0
- package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +26 -0
- package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +26 -0
- package/src/runjs-context/snippets/global/requireAsync.snippet.ts +24 -0
- package/src/runjs-context/snippets/global/sleep.snippet.ts +21 -0
- package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +22 -0
- package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +23 -0
- package/src/runjs-context/snippets/global/window-open.snippet.ts +19 -0
- package/src/runjs-context/snippets/index.ts +59 -0
- package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +24 -0
- package/src/runjs-context/snippets/scene/actions/collection-selected-count.snippet.ts +22 -0
- package/src/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.ts +21 -0
- package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +21 -0
- package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +18 -0
- package/src/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.ts +29 -0
- package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +20 -0
- package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +24 -0
- package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +19 -0
- package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +24 -0
- package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +24 -0
- package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +30 -0
- package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +34 -0
- package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +20 -0
- package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +19 -0
- package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +18 -0
- package/src/runjs-context/snippets/scene/jsitem/render-basic.snippet.ts +27 -0
- package/src/runjs-context/snippets/scene/linkage/set-disabled.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/linkage/set-field-value.snippet.ts +37 -0
- package/src/runjs-context/snippets/scene/linkage/set-required.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/linkage/toggle-visible.snippet.ts +38 -0
- package/src/runjs-context/snippets/types.ts +17 -0
- package/src/types.ts +474 -0
- package/src/utils/__tests__/context.test.ts +93 -0
- package/src/utils/__tests__/params-resolvers.test.ts +652 -0
- package/src/utils/__tests__/parsePathnameToViewParams.test.ts +104 -0
- package/src/utils/__tests__/safeGlobals.test.ts +29 -0
- package/src/utils/__tests__/utils.test.ts +1021 -0
- package/src/utils/__tests__/variablesParams.test.ts +52 -0
- package/src/utils/autoFlowError.ts +29 -0
- package/src/utils/constants.ts +60 -0
- package/src/utils/context.ts +70 -0
- package/src/utils/createCollectionContextMeta.ts +122 -0
- package/src/utils/exceptions.ts +36 -0
- package/src/utils/flow-definitions.ts +16 -0
- package/src/utils/index.ts +63 -0
- package/src/utils/inheritance.ts +39 -0
- package/src/utils/params-resolvers.ts +482 -0
- package/src/utils/parsePathnameToViewParams.ts +103 -0
- package/src/utils/safeGlobals.ts +188 -0
- package/src/utils/schema-utils.ts +201 -0
- package/src/utils/serverContextParams.ts +111 -0
- package/src/utils/setupRuntimeContextSteps.ts +89 -0
- package/src/utils/translation.ts +37 -0
- package/src/utils/variablesParams.ts +175 -0
- package/src/views/DialogComponent.tsx +79 -0
- package/src/views/DrawerComponent.tsx +72 -0
- package/src/views/FlowView.tsx +103 -0
- package/src/views/PageComponent.tsx +150 -0
- package/src/views/ViewNavigation.ts +122 -0
- package/src/views/__tests__/FlowView.test.ts +31 -0
- package/src/views/__tests__/ViewNavigation.test.ts +191 -0
- package/src/views/__tests__/usePatchElement.test.tsx +28 -0
- package/src/views/createViewMeta.ts +157 -0
- package/src/views/index.tsx +14 -0
- package/src/views/useDialog.tsx +192 -0
- package/src/views/useDrawer.tsx +205 -0
- package/src/views/usePage.tsx +182 -0
- package/src/views/usePatchElement.tsx +27 -0
- package/src/views/usePopover.tsx +131 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
11
|
+
import { FlowContext } from '../flowContext';
|
|
12
|
+
|
|
13
|
+
describe('MetaTreeNode Cache Mechanism', () => {
|
|
14
|
+
describe('Node-level Caching', () => {
|
|
15
|
+
it('should return the same MetaTreeNode instance for the same property', () => {
|
|
16
|
+
const ctx = new FlowContext();
|
|
17
|
+
|
|
18
|
+
ctx.defineProperty('user', {
|
|
19
|
+
meta: {
|
|
20
|
+
type: 'object',
|
|
21
|
+
title: 'User',
|
|
22
|
+
properties: {
|
|
23
|
+
name: { type: 'string', title: 'Name' },
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// 获取两次相同的 meta tree
|
|
29
|
+
const tree1 = ctx.getPropertyMetaTree();
|
|
30
|
+
const tree2 = ctx.getPropertyMetaTree();
|
|
31
|
+
|
|
32
|
+
// 应该返回相同的实例
|
|
33
|
+
expect(tree1[0]).toBe(tree2[0]);
|
|
34
|
+
expect(tree1[0].children?.[0]).toBe(tree2[0].children?.[0]);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should return the same MetaTreeNode for same meta objects', () => {
|
|
38
|
+
const ctx = new FlowContext();
|
|
39
|
+
|
|
40
|
+
// 创建可复用的 meta 对象
|
|
41
|
+
const profileMeta = {
|
|
42
|
+
type: 'object',
|
|
43
|
+
title: 'Profile',
|
|
44
|
+
properties: {
|
|
45
|
+
bio: { type: 'string', title: 'Bio' },
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
ctx.defineProperty('user', {
|
|
50
|
+
meta: {
|
|
51
|
+
type: 'object',
|
|
52
|
+
title: 'User',
|
|
53
|
+
properties: {
|
|
54
|
+
profile: profileMeta,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
ctx.defineProperty('admin', {
|
|
60
|
+
meta: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
title: 'Admin',
|
|
63
|
+
properties: {
|
|
64
|
+
profile: profileMeta, // 复用同一个 meta 对象
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const tree = ctx.getPropertyMetaTree();
|
|
70
|
+
|
|
71
|
+
// 找到 user.profile 和 admin.profile 节点
|
|
72
|
+
const userProfileNode = (tree[0].children as any)?.[0];
|
|
73
|
+
const adminProfileNode = (tree[1].children as any)?.[0];
|
|
74
|
+
|
|
75
|
+
// 应该是同一个实例(因为使用相同的 meta 对象)
|
|
76
|
+
expect(userProfileNode).toBe(adminProfileNode);
|
|
77
|
+
expect(userProfileNode.title).toBe('Profile');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('Async Meta Upgrade', () => {
|
|
82
|
+
it('should upgrade async meta node in-place', async () => {
|
|
83
|
+
const ctx = new FlowContext();
|
|
84
|
+
|
|
85
|
+
const asyncMeta = vi.fn(async () => {
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
87
|
+
return {
|
|
88
|
+
type: 'object',
|
|
89
|
+
title: 'Loaded User',
|
|
90
|
+
properties: {
|
|
91
|
+
name: { type: 'string', title: 'User Name' },
|
|
92
|
+
email: { type: 'string', title: 'Email' },
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
ctx.defineProperty('user', { meta: asyncMeta });
|
|
98
|
+
|
|
99
|
+
const tree = ctx.getPropertyMetaTree();
|
|
100
|
+
const userNode = tree[0];
|
|
101
|
+
|
|
102
|
+
// 初始状态:使用默认值
|
|
103
|
+
expect(userNode.title).toBe('user'); // 默认使用 name
|
|
104
|
+
expect(userNode.type).toBe('object');
|
|
105
|
+
expect(typeof userNode.children).toBe('function');
|
|
106
|
+
|
|
107
|
+
// 异步加载
|
|
108
|
+
const children = await (userNode.children as () => Promise<any>)();
|
|
109
|
+
|
|
110
|
+
// 验证原地更新:节点本身的属性被更新了
|
|
111
|
+
expect(userNode.title).toBe('Loaded User'); // 已被更新
|
|
112
|
+
expect(userNode.type).toBe('object');
|
|
113
|
+
expect(userNode.children).toEqual(children); // children 被替换为实际结果
|
|
114
|
+
|
|
115
|
+
// 验证子节点
|
|
116
|
+
expect(children).toHaveLength(2);
|
|
117
|
+
expect(children[0].name).toBe('name');
|
|
118
|
+
expect(children[1].name).toBe('email');
|
|
119
|
+
|
|
120
|
+
// 再次获取应该返回相同实例
|
|
121
|
+
const tree2 = ctx.getPropertyMetaTree();
|
|
122
|
+
expect(tree2[0]).toBe(userNode);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should handle async meta loading errors gracefully', async () => {
|
|
126
|
+
const ctx = new FlowContext();
|
|
127
|
+
|
|
128
|
+
const errorMeta = vi.fn(async () => {
|
|
129
|
+
throw new Error('Meta loading failed');
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
ctx.defineProperty('errorProp', { meta: errorMeta });
|
|
133
|
+
|
|
134
|
+
const tree = ctx.getPropertyMetaTree();
|
|
135
|
+
const errorNode = tree[0];
|
|
136
|
+
|
|
137
|
+
const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
138
|
+
|
|
139
|
+
// 异步加载应该返回空数组
|
|
140
|
+
const children = await (errorNode.children as () => Promise<any>)();
|
|
141
|
+
expect(children).toEqual([]);
|
|
142
|
+
expect(consoleSpy).toHaveBeenCalledWith('Failed to load meta for errorProp:', expect.any(Error));
|
|
143
|
+
|
|
144
|
+
consoleSpy.mockRestore();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('Cache Invalidation', () => {
|
|
149
|
+
it('should clear cache when property is redefined', () => {
|
|
150
|
+
const ctx = new FlowContext();
|
|
151
|
+
|
|
152
|
+
ctx.defineProperty('user', {
|
|
153
|
+
meta: { type: 'string', title: 'User String' },
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const tree1 = ctx.getPropertyMetaTree();
|
|
157
|
+
expect(tree1[0].title).toBe('User String');
|
|
158
|
+
|
|
159
|
+
// 重新定义属性
|
|
160
|
+
ctx.defineProperty('user', {
|
|
161
|
+
meta: { type: 'object', title: 'User Object' },
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
const tree2 = ctx.getPropertyMetaTree();
|
|
165
|
+
expect(tree2[0].title).toBe('User Object');
|
|
166
|
+
|
|
167
|
+
// 应该是不同的实例(缓存已清除)
|
|
168
|
+
expect(tree1[0]).not.toBe(tree2[0]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should preserve cache when delegate is added/removed', () => {
|
|
172
|
+
const ctx1 = new FlowContext();
|
|
173
|
+
const ctx2 = new FlowContext();
|
|
174
|
+
|
|
175
|
+
ctx2.defineProperty('shared', {
|
|
176
|
+
meta: { type: 'string', title: 'Shared Property' },
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
ctx1.defineProperty('own', {
|
|
180
|
+
meta: { type: 'string', title: 'Own Property' },
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
const tree1 = ctx1.getPropertyMetaTree();
|
|
184
|
+
expect(tree1).toHaveLength(1); // only 'own'
|
|
185
|
+
const ownNode1 = tree1.find((n) => n.name === 'own');
|
|
186
|
+
|
|
187
|
+
// 添加委托
|
|
188
|
+
ctx1.addDelegate(ctx2);
|
|
189
|
+
|
|
190
|
+
const tree2 = ctx1.getPropertyMetaTree();
|
|
191
|
+
expect(tree2).toHaveLength(2); // 'own' + 'shared'
|
|
192
|
+
|
|
193
|
+
// 验证缓存被保留了('own' 是同一个实例)
|
|
194
|
+
const ownNode2 = tree2.find((n) => n.name === 'own');
|
|
195
|
+
expect(ownNode1).toBe(ownNode2);
|
|
196
|
+
|
|
197
|
+
// 新的 'shared' 节点是首次创建
|
|
198
|
+
const sharedNode = tree2.find((n) => n.name === 'shared');
|
|
199
|
+
expect(sharedNode).toBeDefined();
|
|
200
|
+
expect(sharedNode?.title).toBe('Shared Property');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
describe('Reference Stability', () => {
|
|
205
|
+
it('should maintain reference stability across multiple calls', () => {
|
|
206
|
+
const ctx = new FlowContext();
|
|
207
|
+
|
|
208
|
+
ctx.defineProperty('stable', {
|
|
209
|
+
meta: {
|
|
210
|
+
type: 'object',
|
|
211
|
+
title: 'Stable Node',
|
|
212
|
+
properties: {
|
|
213
|
+
child: { type: 'string', title: 'Child' },
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// 多次调用应返回相同引用
|
|
219
|
+
const calls = Array.from({ length: 5 }, () => ctx.getPropertyMetaTree());
|
|
220
|
+
|
|
221
|
+
// 所有调用应返回相同的根节点实例
|
|
222
|
+
const rootNodes = calls.map((tree) => tree[0]);
|
|
223
|
+
rootNodes.forEach((node) => {
|
|
224
|
+
expect(node).toBe(rootNodes[0]);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// 子节点也应该稳定
|
|
228
|
+
const childNodes = calls.map((tree) => (tree[0].children as any)?.[0]);
|
|
229
|
+
childNodes.forEach((node) => {
|
|
230
|
+
expect(node).toBe(childNodes[0]);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { FlowEngine } from '../flowEngine';
|
|
12
|
+
|
|
13
|
+
describe('resolveJsonTemplate: dot-only path aggregation', () => {
|
|
14
|
+
it('aggregates across arrays with dot-only path', async () => {
|
|
15
|
+
const engine = new FlowEngine();
|
|
16
|
+
engine.context.defineProperty('a', {
|
|
17
|
+
value: {
|
|
18
|
+
b: [
|
|
19
|
+
{ c: 1, d: [1, 2] },
|
|
20
|
+
{ c: 2, d: [3] },
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const out = await (engine.context as any).resolveJsonTemplate('{{ ctx.a.b.d }}');
|
|
26
|
+
expect(out).toEqual([1, 2, 3]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('replaces inside template strings and stringifies arrays', async () => {
|
|
30
|
+
const engine = new FlowEngine();
|
|
31
|
+
engine.context.defineProperty('a', {
|
|
32
|
+
value: { b: [{ d: [1, 2] }, { d: [3] }] },
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const out = await (engine.context as any).resolveJsonTemplate('x={{ ctx.a.b.d }};');
|
|
36
|
+
expect(out).toBe('x=[1,2,3];');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('returns scalar for non-array dot-only path', async () => {
|
|
40
|
+
const engine = new FlowEngine();
|
|
41
|
+
engine.context.defineProperty('a', {
|
|
42
|
+
value: { title: 'hello' },
|
|
43
|
+
});
|
|
44
|
+
const out = await (engine.context as any).resolveJsonTemplate('{{ ctx.a.title }}');
|
|
45
|
+
expect(out).toBe('hello');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('returns undefined if path not found', async () => {
|
|
49
|
+
const engine = new FlowEngine();
|
|
50
|
+
engine.context.defineProperty('a', {
|
|
51
|
+
value: { b: [{ d: [1, 2] }, { d: [3] }] },
|
|
52
|
+
});
|
|
53
|
+
const out = await (engine.context as any).resolveJsonTemplate({ x: '{{ ctx.a.missing.path }}' });
|
|
54
|
+
expect(out).toEqual({ x: undefined });
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('deep nested arrays keep nested structure (no final deep flatten)', async () => {
|
|
58
|
+
const engine = new FlowEngine();
|
|
59
|
+
engine.context.defineProperty('a', {
|
|
60
|
+
value: {
|
|
61
|
+
b: [{ e: [{ d: [1] }, { d: [2] }] }, { e: [{ d: [3, [4]] }, { d: null }] }, { e: [] }],
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
const out = await (engine.context as any).resolveJsonTemplate('{{ ctx.a.b.e.d }}');
|
|
65
|
+
expect(out).toEqual([1, 2, 3, [4]]);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('missing branch values are ignored during aggregation', async () => {
|
|
69
|
+
const engine = new FlowEngine();
|
|
70
|
+
engine.context.defineProperty('a', {
|
|
71
|
+
value: {
|
|
72
|
+
b: [{ d: [1] }, { x: 0 }, { d: [3] }, {}],
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const out = await (engine.context as any).resolveJsonTemplate('{{ ctx.a.b.d }}');
|
|
76
|
+
expect(out).toEqual([1, 3]);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('non dot-only expressions remain unaffected alongside aggregation', async () => {
|
|
80
|
+
const engine = new FlowEngine();
|
|
81
|
+
engine.context.defineProperty('a', { value: { b: [{ d: [1] }, { d: [2] }] } });
|
|
82
|
+
const out = await (engine.context as any).resolveJsonTemplate('sum={{ 1 + 2 }}, arr={{ ctx.a.b.d }}');
|
|
83
|
+
expect(out).toBe('sum=3, arr=[1,2]');
|
|
84
|
+
});
|
|
85
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { describe, expect, it } from 'vitest';
|
|
12
|
+
import { renderHook } from '@testing-library/react';
|
|
13
|
+
import { FlowEngine } from '../flowEngine';
|
|
14
|
+
import { FlowEngineProvider, useFlowEngine } from '../provider';
|
|
15
|
+
|
|
16
|
+
describe('FlowEngineProvider/useFlowEngine', () => {
|
|
17
|
+
it('throws without provider', () => {
|
|
18
|
+
const run = () => renderHook(() => useFlowEngine());
|
|
19
|
+
expect(run).toThrow(/FlowEngineProvider/);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('returns engine within provider', () => {
|
|
23
|
+
const engine = new FlowEngine();
|
|
24
|
+
const wrapper = ({ children }: any) => <FlowEngineProvider engine={engine}>{children}</FlowEngineProvider>;
|
|
25
|
+
const { result } = renderHook(() => useFlowEngine(), { wrapper });
|
|
26
|
+
expect(result.current).toBe(engine);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import { render, screen, cleanup } from '@testing-library/react';
|
|
13
|
+
import { FlowEngine } from '../flowEngine';
|
|
14
|
+
import { FlowModel, ModelRenderMode } from '../models/flowModel';
|
|
15
|
+
|
|
16
|
+
describe('FlowModel.renderHiddenInConfig', () => {
|
|
17
|
+
it('renders via renderHiddenInConfig when hidden and config enabled (React element mode, mounted)', () => {
|
|
18
|
+
class ElemModel extends FlowModel {
|
|
19
|
+
render() {
|
|
20
|
+
return <div data-testid="content">Content</div>;
|
|
21
|
+
}
|
|
22
|
+
protected renderHiddenInConfig(): React.ReactNode | undefined {
|
|
23
|
+
return <div data-testid="hidden">HiddenViaAPI</div>;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const engine = new FlowEngine();
|
|
28
|
+
const model = new ElemModel({ uid: 'elem-1', flowEngine: engine });
|
|
29
|
+
|
|
30
|
+
// runtime hidden => mounted result should be empty (no content/hidden)
|
|
31
|
+
engine.flowSettings.disable();
|
|
32
|
+
model.setHidden(true);
|
|
33
|
+
const { container, unmount, rerender } = render(model.render() as React.ReactElement);
|
|
34
|
+
expect(screen.queryByTestId('content')).toBeNull();
|
|
35
|
+
expect(screen.queryByTestId('hidden')).toBeNull();
|
|
36
|
+
|
|
37
|
+
// config enabled + hidden => should show renderHiddenInConfig result
|
|
38
|
+
engine.flowSettings.enable();
|
|
39
|
+
rerender(model.render() as React.ReactElement);
|
|
40
|
+
expect(screen.getByTestId('hidden').textContent).toBe('HiddenViaAPI');
|
|
41
|
+
|
|
42
|
+
// visible => show original render
|
|
43
|
+
model.setHidden(false);
|
|
44
|
+
rerender(model.render() as React.ReactElement);
|
|
45
|
+
expect(screen.getByTestId('content').textContent).toBe('Content');
|
|
46
|
+
unmount();
|
|
47
|
+
cleanup();
|
|
48
|
+
});
|
|
49
|
+
it('returns a render function when hidden and config enabled (RenderFunction mode)', () => {
|
|
50
|
+
class FuncModel extends FlowModel {
|
|
51
|
+
static override renderMode = ModelRenderMode.RenderFunction;
|
|
52
|
+
render() {
|
|
53
|
+
return () => <span>Cell</span>;
|
|
54
|
+
}
|
|
55
|
+
protected renderHiddenInConfig(): React.ReactNode | undefined {
|
|
56
|
+
// return a cell renderer
|
|
57
|
+
return <span>No permission</span>;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const engine = new FlowEngine();
|
|
62
|
+
engine.registerModels({ FuncModel: FuncModel });
|
|
63
|
+
const model = engine.createModel({ use: 'FuncModel' }) as FuncModel;
|
|
64
|
+
|
|
65
|
+
// runtime hidden => null
|
|
66
|
+
engine.flowSettings.disable();
|
|
67
|
+
model.setHidden(true);
|
|
68
|
+
const runtimeHidden = model.render();
|
|
69
|
+
expect(runtimeHidden).toBeNull();
|
|
70
|
+
|
|
71
|
+
// config enabled + hidden => renderHiddenInConfig (function)
|
|
72
|
+
engine.flowSettings.enable();
|
|
73
|
+
const cfgHidden = model.render();
|
|
74
|
+
expect(typeof cfgHidden).toBe('function');
|
|
75
|
+
const cellNode = (cfgHidden as any)();
|
|
76
|
+
// Allow either a React element or a plain string depending on environment/mocks
|
|
77
|
+
if (typeof cellNode === 'string') {
|
|
78
|
+
expect(cellNode).toBe('No permission');
|
|
79
|
+
} else {
|
|
80
|
+
expect(cellNode && typeof cellNode === 'object').toBe(true);
|
|
81
|
+
expect((cellNode as any).props?.children).toBe('No permission');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// visible => original render (function)
|
|
85
|
+
model.setHidden(false);
|
|
86
|
+
const visible = model.render();
|
|
87
|
+
expect(typeof visible).toBe('function');
|
|
88
|
+
const visibleNode = (visible as any)();
|
|
89
|
+
expect(visibleNode.props.children).toBe('Cell');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is part of the NocoBase (R) project.
|
|
3
|
+
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
|
4
|
+
* Authors: NocoBase Team.
|
|
5
|
+
*
|
|
6
|
+
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
|
+
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import {
|
|
12
|
+
RunJSContextRegistry,
|
|
13
|
+
registerDefaultMappings,
|
|
14
|
+
getRunJSDocFor,
|
|
15
|
+
createJSRunnerWithVersion,
|
|
16
|
+
FlowRunJSContext,
|
|
17
|
+
} from '../runjs-context';
|
|
18
|
+
import { JSRunner } from '../JSRunner';
|
|
19
|
+
import type { FlowContext } from '../flowContext';
|
|
20
|
+
|
|
21
|
+
describe('flowRunJSContext registry and doc', () => {
|
|
22
|
+
it('registerDefaultMappings should register v1 mapping', () => {
|
|
23
|
+
registerDefaultMappings();
|
|
24
|
+
expect(RunJSContextRegistry['resolve']('v1' as any, '*')).toBeTruthy();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('getRunJSDocFor should pick subclass by model class name', () => {
|
|
28
|
+
const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
|
|
29
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
30
|
+
expect(doc?.label).toMatch(/JSBlock RunJS/);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('createJSRunnerWithVersion returns a JSRunner', async () => {
|
|
34
|
+
const stubCtx: any = {
|
|
35
|
+
model: { constructor: { name: 'JSFieldModel' } },
|
|
36
|
+
createProxy() {
|
|
37
|
+
return this;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const runner = createJSRunnerWithVersion.call(stubCtx, { version: 'v1' });
|
|
41
|
+
expect(runner).toBeInstanceOf(JSRunner);
|
|
42
|
+
const result = await runner.run('return 1 + 1');
|
|
43
|
+
expect(result?.success).toBe(true);
|
|
44
|
+
expect(result?.value).toBe(2);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('default globals (window/document) should be injected for field/block contexts', async () => {
|
|
48
|
+
const stubCtx: any = {
|
|
49
|
+
model: { constructor: { name: 'JSFieldModel' } },
|
|
50
|
+
createProxy() {
|
|
51
|
+
return this;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const runner = createJSRunnerWithVersion.call(stubCtx, { version: 'v1' });
|
|
55
|
+
const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
|
|
56
|
+
expect(r.success && r.value).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Linkage kind via __runjsKind removed; linkage scripts now run in the host model context.
|
|
60
|
+
});
|