@nocobase/flow-engine 2.0.0-alpha.10
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 +100 -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 +61 -0
- package/lib/components/FlowModelRenderer.js +214 -0
- package/lib/components/FormItem.d.ts +18 -0
- package/lib/components/FormItem.js +151 -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/findModelUidPosition.d.ts +13 -0
- package/lib/components/dnd/findModelUidPosition.js +50 -0
- package/lib/components/dnd/gridDragPlanner.d.ts +130 -0
- package/lib/components/dnd/gridDragPlanner.js +497 -0
- package/lib/components/dnd/index.d.ts +24 -0
- package/lib/components/dnd/index.js +164 -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 +212 -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 +334 -0
- package/lib/components/variables/VariableTag.d.ts +11 -0
- package/lib/components/variables/VariableTag.js +189 -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 +737 -0
- package/lib/data-source/jioToJoiSchema.d.ts +19 -0
- package/lib/data-source/jioToJoiSchema.js +114 -0
- package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
- package/lib/data-source/sortCollectionsByInherits.js +71 -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 +25 -0
- package/lib/executor/FlowExecutor.js +290 -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 +243 -0
- package/lib/flowContext.js +1337 -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 +63 -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 +30 -0
- package/lib/index.js +93 -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 +52 -0
- package/lib/models/CollectionFieldModel.js +280 -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 +342 -0
- package/lib/models/flowModel.js +1154 -0
- package/lib/models/forkFlowModel.d.ts +83 -0
- package/lib/models/forkFlowModel.js +280 -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 +115 -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/FormJSFieldItemRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +73 -0
- package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/JSBlockRunJSContext.js +91 -0
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +58 -0
- package/lib/runjs-context/contexts/JSColumnRunJSContext.d.ts +15 -0
- package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/JSFieldRunJSContext.js +74 -0
- package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/JSItemRunJSContext.js +70 -0
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +11 -0
- package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +60 -0
- package/lib/runjs-context/contexts/base.d.ts +9 -0
- package/lib/runjs-context/contexts/base.js +169 -0
- package/lib/runjs-context/helpers.d.ts +20 -0
- package/lib/runjs-context/helpers.js +88 -0
- package/lib/runjs-context/registry.d.ts +20 -0
- package/lib/runjs-context/registry.js +61 -0
- package/lib/runjs-context/setup.d.ts +9 -0
- package/lib/runjs-context/setup.js +82 -0
- package/lib/runjs-context/snippets/global/api-request.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/api-request.snippet.js +57 -0
- package/lib/runjs-context/snippets/global/import-esm.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/import-esm.snippet.js +58 -0
- package/lib/runjs-context/snippets/global/message-error.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/message-error.snippet.js +47 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/message-success.snippet.js +47 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/notification-open.snippet.js +50 -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 +54 -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 +54 -0
- package/lib/runjs-context/snippets/global/query-selector.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
- package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/require-amd.snippet.js +49 -0
- package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/global/window-open.snippet.js +48 -0
- package/lib/runjs-context/snippets/index.d.ts +22 -0
- package/lib/runjs-context/snippets/index.js +213 -0
- package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.js +55 -0
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
- package/lib/runjs-context/snippets/scene/block/echarts-init.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/echarts-init.snippet.js +63 -0
- package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.js +52 -0
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +72 -0
- package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-react.snippet.js +57 -0
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +100 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +85 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
- package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.js +52 -0
- package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/format-number.snippet.js +51 -0
- package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.js +50 -0
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
- package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/render-basic.snippet.js +53 -0
- package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.js +69 -0
- package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.js +68 -0
- package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/set-required.snippet.js +69 -0
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
- package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.js +69 -0
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.js +53 -0
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
- package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.js +55 -0
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
- package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
- package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.js +52 -0
- package/lib/runjs-context/snippets/types.d.ts +24 -0
- package/lib/runjs-context/snippets/types.js +24 -0
- package/lib/types.d.ts +407 -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 +115 -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 +29 -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 +52 -0
- package/lib/utils/variablesParams.js +161 -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 +168 -0
- package/lib/views/ViewNavigation.d.ts +45 -0
- package/lib/views/ViewNavigation.js +97 -0
- package/lib/views/createViewMeta.d.ts +44 -0
- package/lib/views/createViewMeta.js +377 -0
- package/lib/views/index.d.ts +14 -0
- package/lib/views/index.js +51 -0
- package/lib/views/useDialog.d.ts +32 -0
- package/lib/views/useDialog.js +200 -0
- package/lib/views/useDrawer.d.ts +33 -0
- package/lib/views/useDrawer.js +220 -0
- package/lib/views/usePage.d.ts +32 -0
- package/lib/views/usePage.js +194 -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 +42 -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__/flowContextCreateJSRunner.test.ts +163 -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__/flowRunJSContextDefine.test.ts +508 -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 +241 -0
- package/src/__tests__/runjsContextImplementations.test.ts +217 -0
- package/src/__tests__/runjsContextRuntime.test.ts +269 -0
- package/src/__tests__/runjsEdgeCases.test.ts +281 -0
- package/src/__tests__/runjsLocales.test.ts +36 -0
- package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
- package/src/__tests__/runjsSnippets.test.ts +140 -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 +68 -0
- package/src/components/FlowContextSelector.tsx +255 -0
- package/src/components/FlowErrorFallback.tsx +316 -0
- package/src/components/FlowModelRenderer.tsx +362 -0
- package/src/components/FormItem.tsx +136 -0
- package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +226 -0
- package/src/components/__tests__/gridDragPlanner.test.ts +494 -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/README.md +149 -0
- package/src/components/dnd/findModelUidPosition.ts +26 -0
- package/src/components/dnd/gridDragPlanner.ts +659 -0
- package/src/components/dnd/index.tsx +128 -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 +223 -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 +360 -0
- package/src/components/variables/VariableTag.tsx +175 -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/__tests__/sortCollectionsByInherits.test.ts +125 -0
- package/src/data-source/index.ts +816 -0
- package/src/data-source/jioToJoiSchema.ts +103 -0
- package/src/data-source/sortCollectionsByInherits.ts +61 -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 +302 -0
- package/src/executor/__tests__/eventStep.test.ts +157 -0
- package/src/executor/__tests__/flowExecutor.test.ts +309 -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 +1742 -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 +53 -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 +46 -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 +306 -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 +2869 -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 +1421 -0
- package/src/models/forkFlowModel.ts +319 -0
- package/src/models/index.ts +17 -0
- package/src/provider.tsx +103 -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/FormJSFieldItemRunJSContext.ts +46 -0
- package/src/runjs-context/contexts/JSBlockRunJSContext.ts +64 -0
- package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +31 -0
- package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
- package/src/runjs-context/contexts/JSFieldRunJSContext.ts +48 -0
- package/src/runjs-context/contexts/JSItemRunJSContext.ts +43 -0
- package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +33 -0
- package/src/runjs-context/contexts/base.ts +155 -0
- package/src/runjs-context/helpers.ts +58 -0
- package/src/runjs-context/registry.ts +34 -0
- package/src/runjs-context/setup.ts +51 -0
- package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
- package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
- package/src/runjs-context/snippets/global/message-error.snippet.ts +26 -0
- package/src/runjs-context/snippets/global/message-success.snippet.ts +26 -0
- package/src/runjs-context/snippets/global/notification-open.snippet.ts +31 -0
- package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +33 -0
- package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +33 -0
- package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
- package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
- package/src/runjs-context/snippets/global/window-open.snippet.ts +29 -0
- package/src/runjs-context/snippets/index.ts +195 -0
- package/src/runjs-context/snippets/scene/block/add-event-listener.snippet.ts +41 -0
- package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
- package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +33 -0
- package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +53 -0
- package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
- package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +81 -0
- package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +66 -0
- package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
- package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
- package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
- package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
- package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
- package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
- package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
- package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
- package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
- package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
- package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
- package/src/runjs-context/snippets/scene/form/render-basic.snippet.ts +39 -0
- package/src/runjs-context/snippets/scene/form/set-disabled.snippet.ts +50 -0
- package/src/runjs-context/snippets/scene/form/set-field-value.snippet.ts +49 -0
- package/src/runjs-context/snippets/scene/form/set-required.snippet.ts +50 -0
- package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
- package/src/runjs-context/snippets/scene/form/toggle-visible.snippet.ts +50 -0
- package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/table/collection-selected-count.snippet.ts +34 -0
- package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
- package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
- package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
- package/src/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.ts +33 -0
- package/src/runjs-context/snippets/types.ts +21 -0
- package/src/types.ts +484 -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 +62 -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 +112 -0
- package/src/utils/setupRuntimeContextSteps.ts +89 -0
- package/src/utils/translation.ts +37 -0
- package/src/utils/variablesParams.ts +184 -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 +402 -0
- package/src/views/index.tsx +15 -0
- package/src/views/useDialog.tsx +194 -0
- package/src/views/useDrawer.tsx +229 -0
- package/src/views/usePage.tsx +185 -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,241 @@
|
|
|
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, beforeAll } from 'vitest';
|
|
11
|
+
import {
|
|
12
|
+
RunJSContextRegistry,
|
|
13
|
+
getRunJSDocFor,
|
|
14
|
+
createJSRunnerWithVersion,
|
|
15
|
+
getRunJSScenesForModel,
|
|
16
|
+
getRunJSScenesForContext,
|
|
17
|
+
} from '..';
|
|
18
|
+
import { setupRunJSContexts } from '../runjs-context/setup';
|
|
19
|
+
import { FlowContext } from '../flowContext';
|
|
20
|
+
import { JSRunner } from '../JSRunner';
|
|
21
|
+
|
|
22
|
+
describe('flowRunJSContext registry and doc', () => {
|
|
23
|
+
beforeAll(async () => {
|
|
24
|
+
await setupRunJSContexts();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('setupRunJSContexts', () => {
|
|
28
|
+
it('should register v1 mapping', () => {
|
|
29
|
+
expect(RunJSContextRegistry['resolve']('v1' as any, '*')).toBeTruthy();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should register all context types', () => {
|
|
33
|
+
const contextTypes = [
|
|
34
|
+
'JSBlockModel',
|
|
35
|
+
'JSFieldModel',
|
|
36
|
+
'JSItemModel',
|
|
37
|
+
'JSColumnModel',
|
|
38
|
+
'FormJSFieldItemModel',
|
|
39
|
+
'JSRecordActionModel',
|
|
40
|
+
'JSCollectionActionModel',
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
contextTypes.forEach((modelClass) => {
|
|
44
|
+
const ctor = RunJSContextRegistry['resolve']('v1' as any, modelClass);
|
|
45
|
+
expect(ctor).toBeTruthy();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should expose scene metadata for contexts', () => {
|
|
50
|
+
expect(getRunJSScenesForModel('JSBlockModel', 'v1')).toEqual(['block']);
|
|
51
|
+
expect(getRunJSScenesForModel('JSFieldModel', 'v1')).toEqual(['detail']);
|
|
52
|
+
expect(getRunJSScenesForModel('UnknownModel', 'v1')).toEqual([]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should only execute once (idempotent)', async () => {
|
|
56
|
+
const ctor1 = RunJSContextRegistry['resolve']('v1' as any, '*');
|
|
57
|
+
await setupRunJSContexts();
|
|
58
|
+
await setupRunJSContexts();
|
|
59
|
+
const ctor2 = RunJSContextRegistry['resolve']('v1' as any, '*');
|
|
60
|
+
expect(ctor1).toBe(ctor2);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe('getRunJSDocFor', () => {
|
|
65
|
+
it('should pick subclass by model class name', () => {
|
|
66
|
+
const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
|
|
67
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
68
|
+
expect(doc?.label).toMatch(/RunJS/);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should return base doc for unknown model', () => {
|
|
72
|
+
const ctx: any = { model: { constructor: { name: 'UnknownModel' } } };
|
|
73
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
74
|
+
expect(doc).toBeTruthy();
|
|
75
|
+
expect(doc?.label).toMatch(/RunJS base/);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should support locale-specific doc', () => {
|
|
79
|
+
const ctx = new FlowContext();
|
|
80
|
+
(ctx as any).defineProperty('model', { value: { constructor: { name: 'JSFieldModel' } } });
|
|
81
|
+
(ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
|
|
82
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
83
|
+
expect(doc?.properties?.message).toMatch(/Ant Design 全局消息/);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should fallback to English when locale is not found', () => {
|
|
87
|
+
const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
|
|
88
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
89
|
+
expect(doc?.label).toBeTruthy();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('createJSRunnerWithVersion', () => {
|
|
94
|
+
it('should return a JSRunner instance', () => {
|
|
95
|
+
const ctx = new FlowContext();
|
|
96
|
+
ctx.defineProperty('model', {
|
|
97
|
+
value: { constructor: { name: 'JSFieldModel' } },
|
|
98
|
+
});
|
|
99
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
100
|
+
expect(runner).toBeInstanceOf(JSRunner);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should execute JavaScript code successfully', async () => {
|
|
104
|
+
const ctx = new FlowContext();
|
|
105
|
+
ctx.defineProperty('model', {
|
|
106
|
+
value: { constructor: { name: 'JSFieldModel' } },
|
|
107
|
+
});
|
|
108
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
109
|
+
const result = await runner.run('return 1 + 1');
|
|
110
|
+
expect(result?.success).toBe(true);
|
|
111
|
+
expect(result?.value).toBe(2);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('should inject window/document for field contexts', async () => {
|
|
115
|
+
const ctx = new FlowContext();
|
|
116
|
+
ctx.defineProperty('model', {
|
|
117
|
+
value: { constructor: { name: 'JSFieldModel' } },
|
|
118
|
+
});
|
|
119
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
120
|
+
const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
|
|
121
|
+
expect(r.success && r.value).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should inject window/document for block contexts', async () => {
|
|
125
|
+
const ctx = new FlowContext();
|
|
126
|
+
ctx.defineProperty('model', {
|
|
127
|
+
value: { constructor: { name: 'JSBlockModel' } },
|
|
128
|
+
});
|
|
129
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
130
|
+
const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
|
|
131
|
+
expect(r.success && r.value).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('should provide ctx variable in globals', async () => {
|
|
135
|
+
const ctx = new FlowContext();
|
|
136
|
+
ctx.defineProperty('model', {
|
|
137
|
+
value: { constructor: { name: 'JSFieldModel' } },
|
|
138
|
+
});
|
|
139
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
140
|
+
const r = await runner.run('return typeof ctx !== "undefined"');
|
|
141
|
+
expect(r.success && r.value).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should throw error when no context is registered', () => {
|
|
145
|
+
const ctx = new FlowContext();
|
|
146
|
+
ctx.defineProperty('model', {
|
|
147
|
+
value: { constructor: { name: 'UnknownModel' } },
|
|
148
|
+
});
|
|
149
|
+
// Clear registry temporarily - this test checks the error case
|
|
150
|
+
const originalResolve = RunJSContextRegistry['resolve'];
|
|
151
|
+
RunJSContextRegistry['resolve'] = () => undefined;
|
|
152
|
+
|
|
153
|
+
expect(() => {
|
|
154
|
+
createJSRunnerWithVersion.call(ctx, { version: 'v999' as any });
|
|
155
|
+
}).toThrow(/No RunJSContext registered/);
|
|
156
|
+
|
|
157
|
+
// Restore
|
|
158
|
+
RunJSContextRegistry['resolve'] = originalResolve;
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe('Context-specific features', () => {
|
|
163
|
+
it('JSColumnModel context should be available', () => {
|
|
164
|
+
const ctor = RunJSContextRegistry['resolve']('v1' as any, 'JSColumnModel');
|
|
165
|
+
expect(ctor).toBeTruthy();
|
|
166
|
+
const ctx = new FlowContext();
|
|
167
|
+
const instance = new (ctor as any)(ctx);
|
|
168
|
+
expect(instance).toBeTruthy();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should resolve scenes from context instance', () => {
|
|
172
|
+
const ctx = new FlowContext();
|
|
173
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSColumnModel' } } });
|
|
174
|
+
expect(getRunJSScenesForContext(ctx as any, { version: 'v1' })).toEqual(['table']);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('JSBlockModel context should have element property in doc', () => {
|
|
178
|
+
const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
|
|
179
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
180
|
+
expect(doc?.properties?.element).toBeTruthy();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('JSFieldModel context should have record property in doc', () => {
|
|
184
|
+
const ctx: any = { model: { constructor: { name: 'JSFieldModel' } } };
|
|
185
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
186
|
+
expect(doc?.properties?.record).toBeTruthy();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('JSItemModel context should have element and record properties in doc', () => {
|
|
190
|
+
const ctx: any = { model: { constructor: { name: 'JSItemModel' } } };
|
|
191
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
192
|
+
expect(doc?.properties?.element).toBeTruthy();
|
|
193
|
+
expect(doc?.properties?.record).toBeTruthy();
|
|
194
|
+
expect(doc?.properties?.resource).toBeTruthy();
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe('Base context metadata', () => {
|
|
199
|
+
it('should have logger property in base context', () => {
|
|
200
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
201
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
202
|
+
expect(doc?.properties?.logger).toBeTruthy();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should have message property in base context', () => {
|
|
206
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
207
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
208
|
+
expect(doc?.properties?.message).toBeTruthy();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should have api property in base context', () => {
|
|
212
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
213
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
214
|
+
expect(doc?.properties?.api).toBeTruthy();
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('should have t method in base context', () => {
|
|
218
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
219
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
220
|
+
expect(doc?.methods?.t).toBeTruthy();
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('should have requireAsync method in base context', () => {
|
|
224
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
225
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
226
|
+
expect(doc?.methods?.requireAsync).toBeTruthy();
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('should have runAction method in base context', () => {
|
|
230
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
231
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
232
|
+
expect(doc?.methods?.runAction).toBeTruthy();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('should have openView method in base context', () => {
|
|
236
|
+
const ctx: any = { model: { constructor: { name: '*' } } };
|
|
237
|
+
const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
|
|
238
|
+
expect(doc?.methods?.openView).toBeTruthy();
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
});
|