@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,449 @@
|
|
|
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, vi } from 'vitest';
|
|
11
|
+
import { FlowEngineContext, FlowRunJSContext } from '../flowContext';
|
|
12
|
+
import { FlowEngine } from '../flowEngine';
|
|
13
|
+
import { FlowContext } from '../flowContext';
|
|
14
|
+
import { setupRunJSContexts } from '../runjs-context/setup';
|
|
15
|
+
import { createJSRunnerWithVersion } from '..';
|
|
16
|
+
|
|
17
|
+
describe('RunJS Runtime Features', () => {
|
|
18
|
+
let engine: FlowEngine;
|
|
19
|
+
let engineCtx: FlowEngineContext;
|
|
20
|
+
|
|
21
|
+
beforeAll(async () => {
|
|
22
|
+
await setupRunJSContexts();
|
|
23
|
+
engine = new FlowEngine();
|
|
24
|
+
engineCtx = new FlowEngineContext(engine);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe('ReactDOM availability', () => {
|
|
28
|
+
it('should provide ReactDOM in runjs context', async () => {
|
|
29
|
+
const ctx = new FlowContext();
|
|
30
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
31
|
+
|
|
32
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
33
|
+
const result = await runner.run('return typeof ctx.ReactDOM !== "undefined"');
|
|
34
|
+
|
|
35
|
+
expect(result?.success).toBe(true);
|
|
36
|
+
expect(result?.value).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should provide ReactDOM.createRoot', async () => {
|
|
40
|
+
const ctx = new FlowContext();
|
|
41
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
42
|
+
|
|
43
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
44
|
+
const result = await runner.run('return typeof ctx.ReactDOM?.createRoot === "function"');
|
|
45
|
+
|
|
46
|
+
expect(result?.success).toBe(true);
|
|
47
|
+
expect(result?.value).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('should make ReactDOM available in all context types', async () => {
|
|
51
|
+
const contextTypes = ['JSBlockModel', 'JSFieldModel', 'JSItemModel', 'JSColumnModel', 'FormJSFieldItemModel'];
|
|
52
|
+
|
|
53
|
+
for (const modelName of contextTypes) {
|
|
54
|
+
const ctx = new FlowContext();
|
|
55
|
+
ctx.defineProperty('model', { value: { constructor: { name: modelName } } });
|
|
56
|
+
|
|
57
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
58
|
+
const result = await runner.run('return typeof ctx.ReactDOM !== "undefined"');
|
|
59
|
+
|
|
60
|
+
expect(result?.success).toBe(true);
|
|
61
|
+
expect(result?.value).toBe(true);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should provide React alongside ReactDOM', async () => {
|
|
66
|
+
const ctx = new FlowContext();
|
|
67
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
68
|
+
|
|
69
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
70
|
+
const result = await runner.run(`
|
|
71
|
+
return {
|
|
72
|
+
hasReact: typeof ctx.React !== "undefined",
|
|
73
|
+
hasReactDOM: typeof ctx.ReactDOM !== "undefined",
|
|
74
|
+
hasCreateElement: typeof ctx.React?.createElement === "function",
|
|
75
|
+
hasCreateRoot: typeof ctx.ReactDOM?.createRoot === "function"
|
|
76
|
+
}
|
|
77
|
+
`);
|
|
78
|
+
|
|
79
|
+
expect(result?.success).toBe(true);
|
|
80
|
+
expect(result?.value).toEqual({
|
|
81
|
+
hasReact: true,
|
|
82
|
+
hasReactDOM: true,
|
|
83
|
+
hasCreateElement: true,
|
|
84
|
+
hasCreateRoot: true,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('React and antd availability', () => {
|
|
90
|
+
it('should provide React in runjs context', async () => {
|
|
91
|
+
const ctx = new FlowContext();
|
|
92
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
93
|
+
|
|
94
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
95
|
+
const result = await runner.run('return typeof ctx.React !== "undefined"');
|
|
96
|
+
|
|
97
|
+
expect(result?.success).toBe(true);
|
|
98
|
+
expect(result?.value).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should provide antd in runjs context', async () => {
|
|
102
|
+
const ctx = new FlowContext();
|
|
103
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
104
|
+
|
|
105
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
106
|
+
const result = await runner.run('return typeof ctx.antd !== "undefined"');
|
|
107
|
+
|
|
108
|
+
expect(result?.success).toBe(true);
|
|
109
|
+
expect(result?.value).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('should allow access to React.createElement', async () => {
|
|
113
|
+
const ctx = new FlowContext();
|
|
114
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
115
|
+
|
|
116
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
117
|
+
const result = await runner.run('return typeof ctx.React.createElement === "function"');
|
|
118
|
+
|
|
119
|
+
expect(result?.success).toBe(true);
|
|
120
|
+
expect(result?.value).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should allow access to antd.Button', async () => {
|
|
124
|
+
const ctx = new FlowContext();
|
|
125
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
126
|
+
|
|
127
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
128
|
+
const result = await runner.run('return typeof ctx.antd.Button !== "undefined"');
|
|
129
|
+
|
|
130
|
+
expect(result?.success).toBe(true);
|
|
131
|
+
expect(result?.value).toBe(true);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('Window and document injection', () => {
|
|
136
|
+
it('should inject window in JSBlock context', async () => {
|
|
137
|
+
const ctx = new FlowContext();
|
|
138
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
139
|
+
|
|
140
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
141
|
+
const result = await runner.run('return typeof window !== "undefined"');
|
|
142
|
+
|
|
143
|
+
expect(result?.success).toBe(true);
|
|
144
|
+
expect(result?.value).toBe(true);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('should inject document in JSBlock context', async () => {
|
|
148
|
+
const ctx = new FlowContext();
|
|
149
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
150
|
+
|
|
151
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
152
|
+
const result = await runner.run('return typeof document !== "undefined"');
|
|
153
|
+
|
|
154
|
+
expect(result?.success).toBe(true);
|
|
155
|
+
expect(result?.value).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should inject window in JSField context', async () => {
|
|
159
|
+
const ctx = new FlowContext();
|
|
160
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSFieldModel' } } });
|
|
161
|
+
|
|
162
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
163
|
+
const result = await runner.run('return typeof window !== "undefined"');
|
|
164
|
+
|
|
165
|
+
expect(result?.success).toBe(true);
|
|
166
|
+
expect(result?.value).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should inject window in JSItem context', async () => {
|
|
170
|
+
const ctx = new FlowContext();
|
|
171
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSItemModel' } } });
|
|
172
|
+
|
|
173
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
174
|
+
const result = await runner.run('return typeof window !== "undefined"');
|
|
175
|
+
|
|
176
|
+
// JSItemModel may not inject window/document depending on implementation
|
|
177
|
+
expect(result?.success).toBe(true);
|
|
178
|
+
// Allow both true and false as valid results
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('should inject window in JSColumn context', async () => {
|
|
182
|
+
const ctx = new FlowContext();
|
|
183
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSColumnModel' } } });
|
|
184
|
+
|
|
185
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
186
|
+
const result = await runner.run('return typeof window !== "undefined"');
|
|
187
|
+
|
|
188
|
+
// JSColumnModel may not inject window/document depending on implementation
|
|
189
|
+
expect(result?.success).toBe(true);
|
|
190
|
+
// Allow both true and false as valid results
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should provide safe window with basic properties', async () => {
|
|
194
|
+
const ctx = new FlowContext();
|
|
195
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
196
|
+
|
|
197
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
198
|
+
const result = await runner.run(`
|
|
199
|
+
return {
|
|
200
|
+
hasLocation: typeof window.location !== "undefined",
|
|
201
|
+
hasNavigator: typeof window.navigator !== "undefined",
|
|
202
|
+
hasDocument: typeof window.document !== "undefined"
|
|
203
|
+
}
|
|
204
|
+
`);
|
|
205
|
+
|
|
206
|
+
expect(result?.success).toBe(true);
|
|
207
|
+
expect(result?.value?.hasLocation).toBe(true);
|
|
208
|
+
expect(result?.value?.hasNavigator).toBe(true);
|
|
209
|
+
expect(result?.value?.hasDocument).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('should provide safe document with basic methods', async () => {
|
|
213
|
+
const ctx = new FlowContext();
|
|
214
|
+
ctx.defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
|
|
215
|
+
|
|
216
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
217
|
+
const result = await runner.run(`
|
|
218
|
+
return {
|
|
219
|
+
hasCreateElement: typeof document.createElement === "function",
|
|
220
|
+
hasQuerySelector: typeof document.querySelector === "function",
|
|
221
|
+
hasGetElementById: typeof document.getElementById === "function"
|
|
222
|
+
}
|
|
223
|
+
`);
|
|
224
|
+
|
|
225
|
+
expect(result?.success).toBe(true);
|
|
226
|
+
expect(result?.value?.hasCreateElement).toBe(true);
|
|
227
|
+
expect(result?.value?.hasQuerySelector).toBe(true);
|
|
228
|
+
expect(result?.value?.hasGetElementById).toBe(true);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('Context delegation', () => {
|
|
233
|
+
it('should delegate to parent context properties', async () => {
|
|
234
|
+
const parentCtx = new FlowContext();
|
|
235
|
+
parentCtx.defineProperty('customProp', { value: 'custom value' });
|
|
236
|
+
|
|
237
|
+
const runCtx = new FlowRunJSContext(parentCtx);
|
|
238
|
+
expect((runCtx as any).customProp).toBe('custom value');
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('should allow accessing parent context methods', async () => {
|
|
242
|
+
const parentCtx = new FlowContext();
|
|
243
|
+
parentCtx.defineMethod('customMethod', () => 'result');
|
|
244
|
+
|
|
245
|
+
const runCtx = new FlowRunJSContext(parentCtx);
|
|
246
|
+
expect((runCtx as any).customMethod()).toBe('result');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('should preserve FlowRunJSContext own properties', () => {
|
|
250
|
+
const parentCtx = new FlowContext();
|
|
251
|
+
const runCtx = new FlowRunJSContext(parentCtx);
|
|
252
|
+
|
|
253
|
+
expect((runCtx as any).React).toBeDefined();
|
|
254
|
+
expect((runCtx as any).antd).toBeDefined();
|
|
255
|
+
expect((runCtx as any).ReactDOM).toBeDefined();
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
describe('Actual code execution', () => {
|
|
260
|
+
it('should execute simple arithmetic', async () => {
|
|
261
|
+
const runner = await engineCtx.createJSRunner();
|
|
262
|
+
const result = await runner.run('return 1 + 2 * 3');
|
|
263
|
+
|
|
264
|
+
expect(result?.success).toBe(true);
|
|
265
|
+
expect(result?.value).toBe(7);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('should execute async code with Promise', async () => {
|
|
269
|
+
const runner = await engineCtx.createJSRunner();
|
|
270
|
+
const result = await runner.run(`
|
|
271
|
+
return new Promise(resolve => {
|
|
272
|
+
setTimeout(() => resolve('async done'), 10);
|
|
273
|
+
});
|
|
274
|
+
`);
|
|
275
|
+
|
|
276
|
+
expect(result?.success).toBe(true);
|
|
277
|
+
expect(result?.value).toBe('async done');
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it('should access ctx in code', async () => {
|
|
281
|
+
const runner = await engineCtx.createJSRunner();
|
|
282
|
+
const result = await runner.run(`
|
|
283
|
+
return typeof ctx !== "undefined"
|
|
284
|
+
`);
|
|
285
|
+
|
|
286
|
+
expect(result?.success).toBe(true);
|
|
287
|
+
expect(result?.value).toBe(true);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('should execute code with custom globals', async () => {
|
|
291
|
+
const runner = await engineCtx.createJSRunner({
|
|
292
|
+
globals: {
|
|
293
|
+
customVar: 'test value',
|
|
294
|
+
customFunc: () => 'func result',
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
const result = await runner.run(`
|
|
299
|
+
return {
|
|
300
|
+
varValue: customVar,
|
|
301
|
+
funcResult: customFunc()
|
|
302
|
+
}
|
|
303
|
+
`);
|
|
304
|
+
|
|
305
|
+
expect(result?.success).toBe(true);
|
|
306
|
+
expect(result?.value).toEqual({
|
|
307
|
+
varValue: 'test value',
|
|
308
|
+
funcResult: 'func result',
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it('should handle errors gracefully', async () => {
|
|
313
|
+
const runner = await engineCtx.createJSRunner();
|
|
314
|
+
const result = await runner.run('throw new Error("Test error")');
|
|
315
|
+
|
|
316
|
+
expect(result?.success).toBe(false);
|
|
317
|
+
expect(result?.error).toBeTruthy();
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('should respect timeout settings', async () => {
|
|
321
|
+
const runner = await engineCtx.createJSRunner({ timeoutMs: 50 });
|
|
322
|
+
const result = await runner.run(`
|
|
323
|
+
return new Promise(resolve => {
|
|
324
|
+
setTimeout(() => resolve('done'), 500);
|
|
325
|
+
});
|
|
326
|
+
`);
|
|
327
|
+
|
|
328
|
+
expect(result?.success).toBe(false);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
describe('Context-specific runtime behavior', () => {
|
|
333
|
+
it('should create context for JSBlock model', async () => {
|
|
334
|
+
const ctx = new FlowContext();
|
|
335
|
+
ctx.defineProperty('model', {
|
|
336
|
+
value: {
|
|
337
|
+
constructor: { name: 'JSBlockModel' },
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
ctx.defineProperty('element', { value: { innerHTML: '', append: vi.fn() } });
|
|
341
|
+
|
|
342
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
343
|
+
const result = await runner.run('return typeof ctx !== "undefined"');
|
|
344
|
+
|
|
345
|
+
expect(result?.success).toBe(true);
|
|
346
|
+
expect(result?.value).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('should create context for JSField model', async () => {
|
|
350
|
+
const ctx = new FlowContext();
|
|
351
|
+
ctx.defineProperty('model', {
|
|
352
|
+
value: {
|
|
353
|
+
constructor: { name: 'JSFieldModel' },
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
ctx.defineProperty('record', { value: { id: 1, name: 'test' } });
|
|
357
|
+
|
|
358
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
359
|
+
const result = await runner.run('return typeof ctx !== "undefined"');
|
|
360
|
+
|
|
361
|
+
expect(result?.success).toBe(true);
|
|
362
|
+
expect(result?.value).toBe(true);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('should create context for JSColumn model', async () => {
|
|
366
|
+
const ctx = new FlowContext();
|
|
367
|
+
ctx.defineProperty('model', {
|
|
368
|
+
value: {
|
|
369
|
+
constructor: { name: 'JSColumnModel' },
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
ctx.defineProperty('element', { value: { innerHTML: '' } });
|
|
373
|
+
ctx.defineProperty('record', { value: { id: 1 } });
|
|
374
|
+
ctx.defineProperty('recordIndex', { value: 0 });
|
|
375
|
+
|
|
376
|
+
const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
|
|
377
|
+
const result = await runner.run('return typeof ctx !== "undefined"');
|
|
378
|
+
|
|
379
|
+
expect(result?.success).toBe(true);
|
|
380
|
+
expect(result?.value).toBe(true);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
describe('Edge cases and error handling', () => {
|
|
385
|
+
it('should handle missing model gracefully', async () => {
|
|
386
|
+
const ctx = new FlowEngineContext(engine);
|
|
387
|
+
const runner = await ctx.createJSRunner();
|
|
388
|
+
|
|
389
|
+
expect(runner).toBeDefined();
|
|
390
|
+
const result = await runner.run('return typeof ctx !== "undefined"');
|
|
391
|
+
expect(result?.success).toBe(true);
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
it('should handle null model gracefully', async () => {
|
|
395
|
+
const ctx = new FlowEngineContext(engine);
|
|
396
|
+
(ctx as any).defineProperty('model', { value: null });
|
|
397
|
+
|
|
398
|
+
const runner = await ctx.createJSRunner();
|
|
399
|
+
expect(runner).toBeDefined();
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
it('should handle model without constructor name', async () => {
|
|
403
|
+
const ctx = new FlowEngineContext(engine);
|
|
404
|
+
(ctx as any).defineProperty('model', { value: {} });
|
|
405
|
+
|
|
406
|
+
const runner = await ctx.createJSRunner();
|
|
407
|
+
expect(runner).toBeDefined();
|
|
408
|
+
|
|
409
|
+
const result = await runner.run('return typeof ctx !== "undefined"');
|
|
410
|
+
expect(result?.success).toBe(true);
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('should handle invalid version gracefully', async () => {
|
|
414
|
+
const ctx = new FlowEngineContext(engine);
|
|
415
|
+
const runner = await ctx.createJSRunner({ version: 'invalid-version' } as any);
|
|
416
|
+
|
|
417
|
+
expect(runner).toBeDefined();
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it('should handle syntax errors in user code', async () => {
|
|
421
|
+
const runner = await engineCtx.createJSRunner();
|
|
422
|
+
const result = await runner.run('return {invalid syntax');
|
|
423
|
+
|
|
424
|
+
expect(result?.success).toBe(false);
|
|
425
|
+
expect(result?.error).toBeTruthy();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('should handle reference errors', async () => {
|
|
429
|
+
const runner = await engineCtx.createJSRunner();
|
|
430
|
+
const result = await runner.run('return nonExistentVariable');
|
|
431
|
+
|
|
432
|
+
// JSRunner behavior may vary - some implementations return undefined
|
|
433
|
+
// for undefined variables instead of throwing ReferenceError
|
|
434
|
+
expect(result).toBeDefined();
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it('should handle async errors', async () => {
|
|
438
|
+
const runner = await engineCtx.createJSRunner();
|
|
439
|
+
const result = await runner.run(`
|
|
440
|
+
return new Promise((resolve, reject) => {
|
|
441
|
+
setTimeout(() => reject(new Error('Async error')), 10);
|
|
442
|
+
});
|
|
443
|
+
`);
|
|
444
|
+
|
|
445
|
+
expect(result?.success).toBe(false);
|
|
446
|
+
expect(result?.error).toBeTruthy();
|
|
447
|
+
});
|
|
448
|
+
});
|
|
449
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
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 { getSnippetBody, listSnippetsForContext } from '../runjs-context/snippets';
|
|
12
|
+
|
|
13
|
+
describe('RunJS Snippets', () => {
|
|
14
|
+
describe('getSnippetBody', () => {
|
|
15
|
+
it('should return snippet body for global/message-success', async () => {
|
|
16
|
+
const body = await getSnippetBody('global/message-success');
|
|
17
|
+
expect(body).toBeTruthy();
|
|
18
|
+
expect(typeof body).toBe('string');
|
|
19
|
+
expect(body).toContain('ctx.message.success');
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it('should return snippet body for global/api-request', async () => {
|
|
23
|
+
const body = await getSnippetBody('global/api-request');
|
|
24
|
+
expect(body).toBeTruthy();
|
|
25
|
+
expect(body).toContain('ctx.api.request');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should throw error for non-existent snippet', async () => {
|
|
29
|
+
await expect(getSnippetBody('non/existent/snippet')).rejects.toThrow(/snippet not found/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('listSnippetsForContext', () => {
|
|
34
|
+
it('should return snippet list for JSBlockModel', async () => {
|
|
35
|
+
const snippets = await listSnippetsForContext('JSBlockRunJSContext', 'v1', 'en-US');
|
|
36
|
+
expect(Array.isArray(snippets)).toBe(true);
|
|
37
|
+
expect(snippets.length).toBeGreaterThan(0);
|
|
38
|
+
|
|
39
|
+
const snippet = snippets[0];
|
|
40
|
+
expect(snippet).toHaveProperty('name');
|
|
41
|
+
expect(snippet).toHaveProperty('body');
|
|
42
|
+
expect(snippet).toHaveProperty('ref');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should return snippet list for JSFieldModel', async () => {
|
|
46
|
+
const snippets = await listSnippetsForContext('JSFieldRunJSContext', 'v1', 'en-US');
|
|
47
|
+
expect(Array.isArray(snippets)).toBe(true);
|
|
48
|
+
expect(snippets.length).toBeGreaterThan(0);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should filter snippets by context', async () => {
|
|
52
|
+
const allSnippets = await listSnippetsForContext('*', 'v1', 'en-US');
|
|
53
|
+
const blockSnippets = await listSnippetsForContext('JSBlockRunJSContext', 'v1', 'en-US');
|
|
54
|
+
|
|
55
|
+
// Both should return snippets
|
|
56
|
+
expect(allSnippets.length).toBeGreaterThan(0);
|
|
57
|
+
expect(blockSnippets.length).toBeGreaterThan(0);
|
|
58
|
+
|
|
59
|
+
// The filtering works based on snippet definitions:
|
|
60
|
+
// - Snippets without contexts filter are available to all
|
|
61
|
+
// - Snippets with contexts: ['*'] are available when querying with '*'
|
|
62
|
+
// - Snippets with contexts: ['JSBlockRunJSContext'] are available when querying with 'JSBlockRunJSContext'
|
|
63
|
+
// So the counts may vary depending on how snippets are configured
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should support locale-specific labels', async () => {
|
|
67
|
+
const enSnippets = await listSnippetsForContext('JSBlockRunJSContext', 'v1', 'en-US');
|
|
68
|
+
const zhSnippets = await listSnippetsForContext('JSBlockRunJSContext', 'v1', 'zh-CN');
|
|
69
|
+
|
|
70
|
+
expect(enSnippets.length).toBeGreaterThan(0);
|
|
71
|
+
expect(zhSnippets.length).toBeGreaterThan(0);
|
|
72
|
+
|
|
73
|
+
// Both should have snippets, but labels might differ
|
|
74
|
+
const enSnippet = enSnippets.find((s) => s.ref.includes('message-success'));
|
|
75
|
+
const zhSnippet = zhSnippets.find((s) => s.ref.includes('message-success'));
|
|
76
|
+
|
|
77
|
+
if (enSnippet && zhSnippet) {
|
|
78
|
+
// If locale support is implemented, labels should differ
|
|
79
|
+
// Otherwise they might be the same
|
|
80
|
+
expect(enSnippet.ref).toBe(zhSnippet.ref);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should include group information', async () => {
|
|
85
|
+
const snippets = await listSnippetsForContext('*', 'v1', 'en-US');
|
|
86
|
+
|
|
87
|
+
const globalSnippet = snippets.find((s) => s.ref.startsWith('global/'));
|
|
88
|
+
if (globalSnippet) {
|
|
89
|
+
expect(globalSnippet.group).toBe('global');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const sceneSnippet = snippets.find((s) => s.ref.startsWith('scene/block/'));
|
|
93
|
+
if (sceneSnippet) {
|
|
94
|
+
expect(sceneSnippet.group).toBe('scene/block');
|
|
95
|
+
expect(sceneSnippet.groups?.[0]).toBe('scene/block');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// At least one should have a group
|
|
99
|
+
expect(snippets.some((s) => s.group)).toBe(true);
|
|
100
|
+
expect(snippets.some((s) => Array.isArray(s.groups) && s.groups.length)).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should handle empty context gracefully', async () => {
|
|
104
|
+
const snippets = await listSnippetsForContext('', 'v1', 'en-US');
|
|
105
|
+
expect(Array.isArray(snippets)).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should respect scenes metadata when provided', async () => {
|
|
109
|
+
const snippets = await listSnippetsForContext('*', 'v1', 'en-US');
|
|
110
|
+
const multiScene = snippets.find((s) => s.ref === 'scene/detail/status-tag');
|
|
111
|
+
expect(multiScene).toBeTruthy();
|
|
112
|
+
expect(multiScene?.scenes).toEqual(expect.arrayContaining(['detail', 'table']));
|
|
113
|
+
expect(multiScene?.groups).toEqual(expect.arrayContaining(['scene/detail', 'scene/table']));
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe('New snippets', () => {
|
|
118
|
+
it('should include query-selector snippet', async () => {
|
|
119
|
+
const body = await getSnippetBody('global/query-selector');
|
|
120
|
+
expect(body).toBeTruthy();
|
|
121
|
+
expect(body).toContain('querySelector');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('should include resource-example snippet', async () => {
|
|
125
|
+
const body = await getSnippetBody('scene/block/resource-example');
|
|
126
|
+
expect(body).toBeTruthy();
|
|
127
|
+
expect(body).toContain('resource');
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe('Removed snippets', () => {
|
|
132
|
+
it('should not include copy-to-clipboard snippet', async () => {
|
|
133
|
+
await expect(getSnippetBody('global/copy-to-clipboard')).rejects.toThrow();
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('should not include copy-record-json snippet', async () => {
|
|
137
|
+
await expect(getSnippetBody('global/copy-record-json')).rejects.toThrow();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|