@nocobase/flow-engine 2.0.0-alpha.7 → 2.0.0-alpha.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +91 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +6 -4
  6. package/lib/JSRunner.d.ts +6 -0
  7. package/lib/JSRunner.js +27 -1
  8. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  9. package/lib/ViewScopedFlowEngine.js +18 -1
  10. package/lib/acl/Acl.d.ts +12 -12
  11. package/lib/acl/Acl.js +88 -30
  12. package/lib/components/DynamicFlowsEditor.js +2 -4
  13. package/lib/components/FieldModelRenderer.js +17 -9
  14. package/lib/components/FieldSkeleton.d.ts +10 -0
  15. package/lib/components/FieldSkeleton.js +64 -0
  16. package/lib/components/FlowContextSelector.js +19 -3
  17. package/lib/components/FlowModelRenderer.d.ts +4 -6
  18. package/lib/components/FlowModelRenderer.js +35 -53
  19. package/lib/components/FormItem.js +5 -1
  20. package/lib/components/MobilePopup.d.ts +20 -0
  21. package/lib/components/MobilePopup.js +102 -0
  22. package/lib/components/MobilePopup.style.d.ts +17 -0
  23. package/lib/components/MobilePopup.style.js +186 -0
  24. package/lib/components/common/withFlowDesignMode.d.ts +1 -1
  25. package/lib/components/common/withFlowDesignMode.js +5 -5
  26. package/lib/components/dnd/gridDragPlanner.d.ts +1 -0
  27. package/lib/components/dnd/gridDragPlanner.js +53 -1
  28. package/lib/components/index.d.ts +1 -0
  29. package/lib/components/index.js +3 -1
  30. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +71 -53
  31. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +19 -0
  32. package/lib/components/settings/wrappers/component/SelectWithTitle.js +136 -0
  33. package/lib/components/settings/wrappers/component/SwitchWithTitle.d.ts +10 -0
  34. package/lib/components/settings/wrappers/component/SwitchWithTitle.js +111 -0
  35. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +233 -97
  36. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +71 -54
  37. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  38. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +63 -23
  39. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +13 -2
  40. package/lib/components/settings/wrappers/embedded/FlowSettings.js +42 -28
  41. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +3 -3
  42. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +52 -32
  43. package/lib/components/subModel/AddSubModelButton.d.ts +7 -0
  44. package/lib/components/subModel/AddSubModelButton.js +78 -8
  45. package/lib/components/subModel/LazyDropdown.js +14 -15
  46. package/lib/components/subModel/utils.d.ts +1 -1
  47. package/lib/components/subModel/utils.js +21 -11
  48. package/lib/components/variables/VariableInput.js +26 -6
  49. package/lib/components/variables/VariableTag.js +43 -2
  50. package/lib/components/variables/types.d.ts +2 -0
  51. package/lib/components/variables/utils.js +4 -2
  52. package/lib/data-source/index.d.ts +23 -4
  53. package/lib/data-source/index.js +135 -14
  54. package/lib/data-source/jioToJoiSchema.js +1 -0
  55. package/lib/emitter.d.ts +6 -0
  56. package/lib/emitter.js +12 -0
  57. package/lib/executor/FlowExecutor.d.ts +6 -6
  58. package/lib/executor/FlowExecutor.js +302 -99
  59. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  60. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  61. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  62. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  63. package/lib/flowContext.d.ts +105 -6
  64. package/lib/flowContext.js +447 -139
  65. package/lib/flowEngine.d.ts +71 -1
  66. package/lib/flowEngine.js +319 -16
  67. package/lib/flowSettings.d.ts +4 -3
  68. package/lib/flowSettings.js +45 -21
  69. package/lib/hooks/useApplyAutoFlows.d.ts +1 -0
  70. package/lib/hooks/useApplyAutoFlows.js +3 -2
  71. package/lib/index.d.ts +14 -3
  72. package/lib/index.js +54 -7
  73. package/lib/locale/de-DE.json +62 -0
  74. package/lib/locale/en-US.json +57 -45
  75. package/lib/locale/es-ES.json +62 -0
  76. package/lib/locale/fr-FR.json +62 -0
  77. package/lib/locale/hu-HU.json +62 -0
  78. package/lib/locale/id-ID.json +62 -0
  79. package/lib/locale/index.d.ts +114 -90
  80. package/lib/locale/it-IT.json +62 -0
  81. package/lib/locale/ja-JP.json +62 -0
  82. package/lib/locale/ko-KR.json +62 -0
  83. package/lib/locale/nl-NL.json +62 -0
  84. package/lib/locale/pt-BR.json +62 -0
  85. package/lib/locale/ru-RU.json +62 -0
  86. package/lib/locale/tr-TR.json +62 -0
  87. package/lib/locale/uk-UA.json +62 -0
  88. package/lib/locale/vi-VN.json +62 -0
  89. package/lib/locale/zh-CN.json +58 -46
  90. package/lib/locale/zh-TW.json +62 -0
  91. package/lib/models/CollectionFieldModel.d.ts +7 -2
  92. package/lib/models/CollectionFieldModel.js +63 -16
  93. package/lib/models/flowModel.d.ts +76 -32
  94. package/lib/models/flowModel.js +300 -112
  95. package/lib/models/forkFlowModel.d.ts +8 -4
  96. package/lib/models/forkFlowModel.js +38 -8
  97. package/lib/provider.d.ts +3 -1
  98. package/lib/provider.js +14 -11
  99. package/lib/reactive/index.d.ts +10 -0
  100. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → reactive/index.js} +14 -15
  101. package/lib/reactive/observer.d.ts +19 -0
  102. package/lib/reactive/observer.js +109 -0
  103. package/lib/resources/baseRecordResource.d.ts +6 -0
  104. package/lib/resources/baseRecordResource.js +38 -3
  105. package/lib/resources/multiRecordResource.d.ts +5 -2
  106. package/lib/resources/multiRecordResource.js +26 -10
  107. package/lib/resources/singleRecordResource.js +8 -3
  108. package/lib/resources/sqlResource.d.ts +5 -3
  109. package/lib/resources/sqlResource.js +30 -28
  110. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  111. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +37 -20
  112. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  113. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  114. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  115. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  116. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  117. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  118. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.d.ts +16 -0
  119. package/lib/runjs-context/contexts/JSEditableFieldRunJSContext.js +125 -0
  120. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  121. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  122. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  123. package/lib/runjs-context/contexts/JSItemRunJSContext.js +34 -20
  124. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  125. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  126. package/lib/runjs-context/contexts/base.d.ts +9 -0
  127. package/lib/runjs-context/contexts/base.js +879 -0
  128. package/lib/runjs-context/contributions.d.ts +33 -0
  129. package/lib/runjs-context/contributions.js +88 -0
  130. package/lib/runjs-context/helpers.d.ts +5 -2
  131. package/lib/runjs-context/helpers.js +36 -27
  132. package/lib/runjs-context/registry.d.ts +7 -4
  133. package/lib/runjs-context/registry.js +10 -42
  134. package/lib/runjs-context/setup.d.ts +9 -0
  135. package/lib/runjs-context/setup.js +88 -0
  136. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  137. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  138. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  139. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  140. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  141. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  142. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  143. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  144. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  145. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  146. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  148. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  149. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  150. package/lib/runjs-context/snippets/index.d.ts +24 -3
  151. package/lib/runjs-context/snippets/index.js +183 -40
  152. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  154. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  158. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  159. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  161. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  163. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  165. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  167. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  169. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  170. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  171. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  172. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  173. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  174. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  175. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  176. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  177. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  178. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  179. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  180. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  181. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  182. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  183. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  184. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  185. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  186. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  187. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  188. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  189. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  190. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  191. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  192. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  193. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  194. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  195. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  196. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  197. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  198. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  199. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  200. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  201. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  202. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  203. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  204. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  205. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  206. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  207. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  208. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  209. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  210. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  211. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  212. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  213. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  214. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  215. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  216. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  217. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  218. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  219. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  220. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  221. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  222. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  223. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  224. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  225. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  227. package/lib/runjs-context/snippets/types.d.ts +9 -1
  228. package/lib/runjsLibs.d.ts +28 -0
  229. package/lib/runjsLibs.js +532 -0
  230. package/lib/scheduler/ModelOperationScheduler.d.ts +53 -0
  231. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  232. package/lib/types.d.ts +66 -7
  233. package/lib/types.js +4 -3
  234. package/lib/utils/associationObjectVariable.d.ts +32 -0
  235. package/lib/utils/associationObjectVariable.js +157 -0
  236. package/lib/utils/createCollectionContextMeta.d.ts +1 -1
  237. package/lib/utils/createCollectionContextMeta.js +9 -4
  238. package/lib/utils/createEphemeralContext.d.ts +13 -0
  239. package/lib/utils/createEphemeralContext.js +140 -0
  240. package/lib/utils/flows.d.ts +10 -0
  241. package/lib/{runjs-context/snippets/global/console-log-ctx.snippet.js → utils/flows.js} +21 -14
  242. package/lib/utils/index.d.ts +9 -3
  243. package/lib/utils/index.js +30 -2
  244. package/lib/utils/jsxTransform.d.ts +15 -0
  245. package/lib/utils/jsxTransform.js +68 -0
  246. package/lib/utils/params-resolvers.js +19 -12
  247. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  248. package/lib/utils/parsePathnameToViewParams.js +41 -5
  249. package/lib/utils/pruneFilter.d.ts +21 -0
  250. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  251. package/lib/utils/resolveModuleUrl.d.ts +58 -0
  252. package/lib/utils/resolveModuleUrl.js +65 -0
  253. package/lib/utils/runjsModuleLoader.d.ts +58 -0
  254. package/lib/utils/runjsModuleLoader.js +422 -0
  255. package/lib/utils/runjsTemplateCompat.d.ts +35 -0
  256. package/lib/utils/runjsTemplateCompat.js +743 -0
  257. package/lib/utils/safeGlobals.d.ts +6 -8
  258. package/lib/utils/safeGlobals.js +169 -14
  259. package/lib/utils/schema-utils.d.ts +6 -0
  260. package/lib/utils/schema-utils.js +71 -6
  261. package/lib/utils/serverContextParams.d.ts +4 -0
  262. package/lib/utils/serverContextParams.js +2 -0
  263. package/lib/utils/translation.d.ts +4 -1
  264. package/lib/utils/translation.js +6 -2
  265. package/lib/utils/variablesParams.d.ts +22 -5
  266. package/lib/utils/variablesParams.js +141 -61
  267. package/lib/views/DialogComponent.js +1 -5
  268. package/lib/views/DrawerComponent.js +18 -9
  269. package/lib/views/PageComponent.js +5 -5
  270. package/lib/views/ViewNavigation.d.ts +11 -15
  271. package/lib/views/ViewNavigation.js +37 -19
  272. package/lib/views/createViewMeta.d.ts +27 -5
  273. package/lib/views/createViewMeta.js +338 -72
  274. package/lib/views/index.d.ts +1 -1
  275. package/lib/views/index.js +4 -0
  276. package/lib/views/useDialog.d.ts +10 -9
  277. package/lib/views/useDialog.js +46 -34
  278. package/lib/views/useDrawer.d.ts +10 -9
  279. package/lib/views/useDrawer.js +74 -48
  280. package/lib/views/usePage.d.ts +14 -9
  281. package/lib/views/usePage.js +82 -33
  282. package/lib/views/usePopover.js +4 -1
  283. package/lib/views/viewEvents.d.ts +17 -0
  284. package/lib/views/viewEvents.js +90 -0
  285. package/package.json +6 -3
  286. package/src/BlockScopedFlowEngine.ts +85 -0
  287. package/src/FlowContextProvider.tsx +4 -2
  288. package/src/JSRunner.ts +39 -1
  289. package/src/ViewScopedFlowEngine.ts +21 -1
  290. package/src/__tests__/JSRunner.test.ts +125 -52
  291. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  292. package/src/__tests__/createViewMeta.popup.test.ts +203 -0
  293. package/src/__tests__/flow-engine.test.ts +3 -0
  294. package/src/__tests__/flowContext.test.ts +160 -0
  295. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  296. package/src/__tests__/flowEngine.dataSourceDirty.test.ts +63 -0
  297. package/src/__tests__/flowEngine.destroyModel.test.ts +74 -0
  298. package/src/__tests__/flowEngine.moveModel.test.ts +43 -0
  299. package/src/__tests__/flowEngine.removeModel.test.ts +72 -0
  300. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  301. package/src/__tests__/flowModel.openView.navigation.test.ts +31 -2
  302. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  303. package/src/__tests__/flowSettings.open.test.tsx +71 -15
  304. package/src/__tests__/flowSettings.test.ts +2 -0
  305. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  306. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  307. package/src/__tests__/objectVariable.test.ts +464 -0
  308. package/src/__tests__/provider.test.tsx +0 -5
  309. package/src/__tests__/runjsContext.test.ts +219 -35
  310. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  311. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  312. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  313. package/src/__tests__/runjsExternalLibs.test.ts +242 -0
  314. package/src/__tests__/runjsLibsLazyLoading.test.ts +44 -0
  315. package/src/__tests__/runjsLocales.test.ts +39 -0
  316. package/src/__tests__/runjsPreprocessDefault.test.ts +49 -0
  317. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  318. package/src/__tests__/runjsSnippets.test.ts +140 -0
  319. package/src/__tests__/viewScopedFlowEngine.test.ts +101 -3
  320. package/src/acl/Acl.tsx +85 -31
  321. package/src/acl/__tests__/Acl.test.tsx +43 -1
  322. package/src/components/DynamicFlowsEditor.tsx +0 -10
  323. package/src/components/FieldModelRenderer.tsx +22 -9
  324. package/src/components/FieldSkeleton.tsx +27 -0
  325. package/src/components/FlowContextSelector.tsx +20 -2
  326. package/src/components/FlowModelRenderer.tsx +52 -84
  327. package/src/components/FormItem.tsx +8 -1
  328. package/src/components/MobilePopup.style.ts +220 -0
  329. package/src/components/MobilePopup.tsx +86 -0
  330. package/src/components/__tests__/FlowModelRenderer.test.tsx +89 -0
  331. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  332. package/src/components/__tests__/gridDragPlanner.test.ts +141 -1
  333. package/src/components/common/withFlowDesignMode.tsx +5 -5
  334. package/src/components/dnd/gridDragPlanner.ts +60 -0
  335. package/src/components/index.ts +1 -0
  336. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +34 -17
  337. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +110 -0
  338. package/src/components/settings/wrappers/component/SwitchWithTitle.tsx +83 -0
  339. package/src/components/settings/wrappers/component/__tests__/InlineControls.test.tsx +74 -0
  340. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +272 -125
  341. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +34 -18
  342. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +56 -18
  343. package/src/components/settings/wrappers/contextual/StepSettings.tsx +1 -2
  344. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +13 -1
  345. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +624 -0
  346. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +47 -35
  347. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +1 -1
  348. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +64 -42
  349. package/src/components/subModel/AddSubModelButton.tsx +104 -9
  350. package/src/components/subModel/LazyDropdown.tsx +14 -14
  351. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +168 -7
  352. package/src/components/subModel/__tests__/utils.test.ts +12 -12
  353. package/src/components/subModel/utils.ts +25 -6
  354. package/src/components/variables/VariableInput.tsx +32 -6
  355. package/src/components/variables/VariableTag.tsx +54 -2
  356. package/src/components/variables/types.ts +2 -0
  357. package/src/components/variables/utils.ts +7 -3
  358. package/src/data-source/index.ts +143 -12
  359. package/src/data-source/jioToJoiSchema.ts +1 -0
  360. package/src/emitter.ts +14 -0
  361. package/src/executor/FlowExecutor.ts +383 -119
  362. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  363. package/src/executor/__tests__/flowExecutor.test.ts +217 -5
  364. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  365. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  366. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  367. package/src/flowContext.ts +646 -158
  368. package/src/flowEngine.ts +385 -14
  369. package/src/flowSettings.ts +59 -30
  370. package/src/hooks/useApplyAutoFlows.ts +5 -3
  371. package/src/index.ts +26 -3
  372. package/src/locale/de-DE.json +62 -0
  373. package/src/locale/en-US.json +57 -45
  374. package/src/locale/es-ES.json +62 -0
  375. package/src/locale/fr-FR.json +62 -0
  376. package/src/locale/hu-HU.json +62 -0
  377. package/src/locale/id-ID.json +62 -0
  378. package/src/locale/it-IT.json +62 -0
  379. package/src/locale/ja-JP.json +62 -0
  380. package/src/locale/ko-KR.json +62 -0
  381. package/src/locale/nl-NL.json +62 -0
  382. package/src/locale/pt-BR.json +62 -0
  383. package/src/locale/ru-RU.json +62 -0
  384. package/src/locale/tr-TR.json +62 -0
  385. package/src/locale/uk-UA.json +62 -0
  386. package/src/locale/vi-VN.json +62 -0
  387. package/src/locale/zh-CN.json +58 -46
  388. package/src/locale/zh-TW.json +62 -0
  389. package/src/models/CollectionFieldModel.tsx +82 -18
  390. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  391. package/src/models/__tests__/dispatchEvent.when.test.ts +356 -0
  392. package/src/models/__tests__/flowEngine.resolveUse.test.ts +170 -0
  393. package/src/models/__tests__/flowModel.clone.test.ts +416 -0
  394. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  395. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  396. package/src/models/__tests__/flowModel.test.ts +296 -119
  397. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  398. package/src/models/flowModel.tsx +426 -148
  399. package/src/models/forkFlowModel.ts +48 -8
  400. package/src/provider.tsx +18 -14
  401. package/src/reactive/__tests__/observer.test.tsx +211 -0
  402. package/src/reactive/index.ts +11 -0
  403. package/src/reactive/observer.tsx +101 -0
  404. package/src/resources/__tests__/multiRecordResource.test.ts +44 -0
  405. package/src/resources/__tests__/sqlResource.test.ts +60 -0
  406. package/src/resources/baseRecordResource.ts +46 -3
  407. package/src/resources/multiRecordResource.ts +28 -12
  408. package/src/resources/singleRecordResource.ts +9 -3
  409. package/src/resources/sqlResource.ts +33 -32
  410. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +38 -21
  411. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +50 -34
  412. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  413. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  414. package/src/runjs-context/contexts/JSEditableFieldRunJSContext.ts +106 -0
  415. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  416. package/src/runjs-context/contexts/JSItemRunJSContext.ts +35 -21
  417. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  418. package/src/runjs-context/contexts/base.ts +871 -0
  419. package/src/runjs-context/contributions.ts +88 -0
  420. package/src/runjs-context/helpers.ts +32 -30
  421. package/src/runjs-context/registry.ts +16 -47
  422. package/src/runjs-context/setup.ts +57 -0
  423. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  424. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  425. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  426. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  427. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  428. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  429. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  430. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  431. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  432. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  433. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  434. package/src/runjs-context/snippets/index.ts +212 -39
  435. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  436. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  437. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  438. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  439. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  440. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  441. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  442. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  443. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  444. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  445. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  446. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  447. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  448. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  449. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  450. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  451. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  452. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  453. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  454. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  455. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  456. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  457. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  458. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  459. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  460. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  461. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  462. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  463. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  464. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  465. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  466. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  467. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  468. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  469. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  470. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  471. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  472. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  473. package/src/runjs-context/snippets/types.ts +5 -1
  474. package/src/runjsLibs.ts +622 -0
  475. package/src/scheduler/ModelOperationScheduler.ts +306 -0
  476. package/src/types.ts +86 -5
  477. package/src/utils/__tests__/createCollectionContextMeta.test.ts +51 -0
  478. package/src/utils/__tests__/flows.test.ts +65 -0
  479. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  480. package/src/utils/__tests__/params-resolvers.test.ts +40 -0
  481. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  482. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  483. package/src/utils/__tests__/runjsRequireAsyncAutoWhitelist.test.ts +38 -0
  484. package/src/utils/__tests__/runjsTemplateCompat.test.ts +159 -0
  485. package/src/utils/__tests__/safeGlobals.test.ts +79 -2
  486. package/src/utils/__tests__/utils.test.ts +114 -15
  487. package/src/utils/__tests__/variablesParams.test.ts +120 -0
  488. package/src/utils/associationObjectVariable.ts +180 -0
  489. package/src/utils/createCollectionContextMeta.ts +9 -3
  490. package/src/utils/createEphemeralContext.ts +142 -0
  491. package/src/utils/flows.ts +23 -0
  492. package/src/utils/index.ts +17 -3
  493. package/src/utils/jsxTransform.ts +39 -0
  494. package/src/utils/params-resolvers.ts +25 -11
  495. package/src/utils/parsePathnameToViewParams.ts +50 -6
  496. package/src/utils/pruneFilter.ts +41 -0
  497. package/src/utils/resolveModuleUrl.ts +91 -0
  498. package/src/utils/runjsModuleLoader.ts +553 -0
  499. package/src/utils/runjsTemplateCompat.ts +828 -0
  500. package/src/utils/safeGlobals.ts +181 -15
  501. package/src/utils/schema-utils.ts +81 -3
  502. package/src/utils/serverContextParams.ts +6 -0
  503. package/src/utils/translation.ts +7 -2
  504. package/src/utils/variablesParams.ts +164 -72
  505. package/src/views/DialogComponent.tsx +1 -4
  506. package/src/views/DrawerComponent.tsx +19 -7
  507. package/src/views/PageComponent.tsx +3 -5
  508. package/src/views/ViewNavigation.ts +49 -43
  509. package/src/views/__tests__/FlowView.usePage.test.tsx +186 -0
  510. package/src/views/__tests__/ViewNavigation.test.ts +54 -34
  511. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +159 -0
  512. package/src/views/__tests__/viewEvents.resolveOpenerEngine.test.ts +28 -0
  513. package/src/views/createViewMeta.ts +402 -73
  514. package/src/views/index.tsx +1 -1
  515. package/src/views/useDialog.tsx +52 -31
  516. package/src/views/useDrawer.tsx +99 -55
  517. package/src/views/usePage.tsx +101 -33
  518. package/src/views/usePopover.tsx +4 -1
  519. package/src/views/viewEvents.ts +55 -0
  520. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  521. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  522. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  523. package/lib/runjs-context/index.d.ts +0 -19
  524. package/lib/runjs-context/index.js +0 -57
  525. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  526. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  527. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  528. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  529. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  530. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  531. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  532. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  533. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  534. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  535. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  536. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  537. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  538. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  539. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  540. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  541. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  542. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  543. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  544. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  545. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  546. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  547. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  548. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  549. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  550. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  551. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  552. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  553. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  554. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  555. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  556. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  557. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  558. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  559. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  560. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  561. package/src/runjs-context/index.ts +0 -20
  562. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  563. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  564. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  565. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  566. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  567. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  568. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  569. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  570. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  571. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  572. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  573. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  574. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  575. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  576. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  577. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  578. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  579. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  580. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  581. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  582. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  583. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  584. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  585. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  586. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  587. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  588. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  589. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -0,0 +1,508 @@
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, beforeEach } from 'vitest';
11
+ import { FlowRunJSContext } from '../flowContext';
12
+
13
+ describe('FlowRunJSContext.define() and getDoc() deep tests', () => {
14
+ // Create test classes for inheritance testing
15
+ class TestBaseContext extends FlowRunJSContext {}
16
+ class TestChildContext extends TestBaseContext {}
17
+ class TestGrandchildContext extends TestChildContext {}
18
+
19
+ beforeEach(() => {
20
+ // Clear all caches to ensure clean state for each test
21
+ // @ts-ignore - accessing private WeakMap for testing
22
+ const cache = (FlowRunJSContext as any).__runjsDocCache;
23
+ if (cache) {
24
+ // WeakMaps can't be cleared directly, but we can create new test classes
25
+ }
26
+ });
27
+
28
+ describe('Deep merging', () => {
29
+ it('should deep merge nested object properties', () => {
30
+ class MergeTestContext extends FlowRunJSContext {}
31
+
32
+ MergeTestContext.define({
33
+ properties: {
34
+ api: {
35
+ description: 'API client',
36
+ properties: {
37
+ request: { description: 'Request method' },
38
+ auth: { description: 'Auth info' },
39
+ },
40
+ },
41
+ },
42
+ });
43
+
44
+ MergeTestContext.define({
45
+ properties: {
46
+ api: {
47
+ properties: {
48
+ request: { description: 'Updated request method' },
49
+ query: { description: 'Query method' },
50
+ },
51
+ },
52
+ },
53
+ });
54
+
55
+ const doc = MergeTestContext.getDoc();
56
+ expect(doc.properties?.api).toBeTruthy();
57
+ const apiProp: any = doc.properties?.api;
58
+ expect(apiProp.description).toBe('API client');
59
+ expect(apiProp.properties?.request?.description).toBe('Updated request method');
60
+ expect(apiProp.properties?.query?.description).toBe('Query method');
61
+ expect(apiProp.properties?.auth?.description).toBe('Auth info');
62
+ });
63
+
64
+ it('should deep merge method documentation', () => {
65
+ class MethodMergeContext extends FlowRunJSContext {}
66
+
67
+ MethodMergeContext.define({
68
+ methods: {
69
+ runAction: {
70
+ description: 'Run an action',
71
+ completion: { insertText: 'ctx.runAction()' },
72
+ },
73
+ },
74
+ });
75
+
76
+ MethodMergeContext.define({
77
+ methods: {
78
+ runAction: {
79
+ description: 'Execute a data action',
80
+ examples: ['ctx.runAction("create", {})'],
81
+ },
82
+ },
83
+ });
84
+
85
+ const doc = MethodMergeContext.getDoc();
86
+ const method: any = doc.methods?.runAction;
87
+ expect(method?.description).toBe('Execute a data action');
88
+ expect(method?.completion?.insertText).toBe('ctx.runAction()');
89
+ expect(method?.examples).toEqual(['ctx.runAction("create", {})']);
90
+ });
91
+ });
92
+
93
+ describe('Null value property deletion', () => {
94
+ it('should remove property when defined with null', () => {
95
+ class NullTestContext extends FlowRunJSContext {}
96
+
97
+ NullTestContext.define({
98
+ properties: {
99
+ foo: 'Foo property',
100
+ bar: 'Bar property',
101
+ },
102
+ });
103
+
104
+ NullTestContext.define({
105
+ properties: {
106
+ foo: null as any,
107
+ },
108
+ });
109
+
110
+ const doc = NullTestContext.getDoc();
111
+ expect(doc.properties?.foo).toBeUndefined();
112
+ expect(doc.properties?.bar).toBe('Bar property');
113
+ });
114
+
115
+ it('should remove nested property when defined with null', () => {
116
+ class NestedNullContext extends FlowRunJSContext {}
117
+
118
+ NestedNullContext.define({
119
+ properties: {
120
+ api: {
121
+ description: 'API client',
122
+ properties: {
123
+ request: { description: 'Request' },
124
+ query: { description: 'Query' },
125
+ },
126
+ },
127
+ },
128
+ });
129
+
130
+ NestedNullContext.define({
131
+ properties: {
132
+ api: {
133
+ properties: {
134
+ query: null as any,
135
+ },
136
+ },
137
+ },
138
+ });
139
+
140
+ const doc = NestedNullContext.getDoc();
141
+ const apiProp: any = doc.properties?.api;
142
+ expect(apiProp.properties?.request?.description).toBe('Request');
143
+ expect(apiProp.properties?.query).toBeUndefined();
144
+ });
145
+
146
+ it('should remove method when defined with null', () => {
147
+ class MethodNullContext extends FlowRunJSContext {}
148
+
149
+ MethodNullContext.define({
150
+ methods: {
151
+ foo: 'Foo method',
152
+ bar: 'Bar method',
153
+ },
154
+ });
155
+
156
+ MethodNullContext.define({
157
+ methods: {
158
+ foo: null as any,
159
+ },
160
+ });
161
+
162
+ const doc = MethodNullContext.getDoc();
163
+ expect(doc.methods?.foo).toBeUndefined();
164
+ expect(doc.methods?.bar).toBe('Bar method');
165
+ });
166
+ });
167
+
168
+ describe('Inheritance chain merging', () => {
169
+ it('should merge metadata from parent class', () => {
170
+ class InheritBaseContext extends FlowRunJSContext {}
171
+ class InheritChildContext extends InheritBaseContext {}
172
+
173
+ InheritBaseContext.define({
174
+ label: 'Base Context',
175
+ properties: {
176
+ baseProp: 'Base property',
177
+ },
178
+ });
179
+
180
+ InheritChildContext.define({
181
+ label: 'Child Context',
182
+ properties: {
183
+ childProp: 'Child property',
184
+ },
185
+ });
186
+
187
+ const doc = InheritChildContext.getDoc();
188
+ expect(doc.label).toBe('Child Context');
189
+ expect(doc.properties?.baseProp).toBe('Base property');
190
+ expect(doc.properties?.childProp).toBe('Child property');
191
+ });
192
+
193
+ it('should merge metadata from entire inheritance chain', () => {
194
+ class ChainBase extends FlowRunJSContext {}
195
+ class ChainMiddle extends ChainBase {}
196
+ class ChainLeaf extends ChainMiddle {}
197
+
198
+ ChainBase.define({
199
+ properties: { base: 'base' },
200
+ methods: { baseMethod: 'base method' },
201
+ });
202
+
203
+ ChainMiddle.define({
204
+ properties: { middle: 'middle' },
205
+ methods: { middleMethod: 'middle method' },
206
+ });
207
+
208
+ ChainLeaf.define({
209
+ properties: { leaf: 'leaf' },
210
+ methods: { leafMethod: 'leaf method' },
211
+ });
212
+
213
+ const doc = ChainLeaf.getDoc();
214
+ expect(doc.properties?.base).toBe('base');
215
+ expect(doc.properties?.middle).toBe('middle');
216
+ expect(doc.properties?.leaf).toBe('leaf');
217
+ expect(doc.methods?.baseMethod).toBe('base method');
218
+ expect(doc.methods?.middleMethod).toBe('middle method');
219
+ expect(doc.methods?.leafMethod).toBe('leaf method');
220
+ });
221
+
222
+ it('should allow child to override parent properties', () => {
223
+ class OverrideBase extends FlowRunJSContext {}
224
+ class OverrideChild extends OverrideBase {}
225
+
226
+ OverrideBase.define({
227
+ properties: {
228
+ shared: 'Base version',
229
+ },
230
+ });
231
+
232
+ OverrideChild.define({
233
+ properties: {
234
+ shared: 'Child version',
235
+ },
236
+ });
237
+
238
+ const doc = OverrideChild.getDoc();
239
+ expect(doc.properties?.shared).toBe('Child version');
240
+ });
241
+
242
+ it('should allow child to remove parent properties with null', () => {
243
+ class RemoveBase extends FlowRunJSContext {}
244
+ class RemoveChild extends RemoveBase {}
245
+
246
+ RemoveBase.define({
247
+ properties: {
248
+ toRemove: 'To be removed',
249
+ toKeep: 'To keep',
250
+ },
251
+ });
252
+
253
+ RemoveChild.define({
254
+ properties: {
255
+ toRemove: null as any,
256
+ },
257
+ });
258
+
259
+ const doc = RemoveChild.getDoc();
260
+ expect(doc.properties?.toRemove).toBeUndefined();
261
+ expect(doc.properties?.toKeep).toBe('To keep');
262
+ });
263
+ });
264
+
265
+ describe('Locale-specific metadata', () => {
266
+ it('should support multiple locales', () => {
267
+ class LocaleContext extends FlowRunJSContext {}
268
+
269
+ LocaleContext.define({
270
+ label: 'Default Label',
271
+ properties: { message: 'Default message' },
272
+ });
273
+
274
+ LocaleContext.define(
275
+ {
276
+ label: 'Chinese Label',
277
+ properties: { message: '中文消息' },
278
+ },
279
+ { locale: 'zh-CN' },
280
+ );
281
+
282
+ LocaleContext.define(
283
+ {
284
+ label: 'Japanese Label',
285
+ properties: { message: '日本語メッセージ' },
286
+ },
287
+ { locale: 'ja-JP' },
288
+ );
289
+
290
+ const defaultDoc = LocaleContext.getDoc();
291
+ expect(defaultDoc.label).toBe('Default Label');
292
+ expect(defaultDoc.properties?.message).toBe('Default message');
293
+
294
+ const zhDoc = LocaleContext.getDoc('zh-CN');
295
+ expect(zhDoc.label).toBe('Chinese Label');
296
+ expect(zhDoc.properties?.message).toBe('中文消息');
297
+
298
+ const jaDoc = LocaleContext.getDoc('ja-JP');
299
+ expect(jaDoc.label).toBe('Japanese Label');
300
+ expect(jaDoc.properties?.message).toBe('日本語メッセージ');
301
+ });
302
+
303
+ it('should merge locale-specific metadata with default', () => {
304
+ class LocaleMergeContext extends FlowRunJSContext {}
305
+
306
+ LocaleMergeContext.define({
307
+ properties: {
308
+ api: 'API client',
309
+ message: 'Message',
310
+ },
311
+ });
312
+
313
+ LocaleMergeContext.define(
314
+ {
315
+ properties: {
316
+ message: '消息',
317
+ },
318
+ },
319
+ { locale: 'zh-CN' },
320
+ );
321
+
322
+ const zhDoc = LocaleMergeContext.getDoc('zh-CN');
323
+ expect(zhDoc.properties?.api).toBe('API client');
324
+ expect(zhDoc.properties?.message).toBe('消息');
325
+ });
326
+
327
+ it('should support locale inheritance', () => {
328
+ class LocaleInheritBase extends FlowRunJSContext {}
329
+ class LocaleInheritChild extends LocaleInheritBase {}
330
+
331
+ LocaleInheritBase.define({ properties: { base: 'base' } });
332
+ LocaleInheritBase.define({ properties: { base: '基础' } }, { locale: 'zh-CN' });
333
+
334
+ LocaleInheritChild.define({ properties: { child: 'child' } });
335
+ LocaleInheritChild.define({ properties: { child: '子级' } }, { locale: 'zh-CN' });
336
+
337
+ const zhDoc = LocaleInheritChild.getDoc('zh-CN');
338
+ expect(zhDoc.properties?.base).toBe('基础');
339
+ expect(zhDoc.properties?.child).toBe('子级');
340
+ });
341
+ });
342
+
343
+ describe('Cache behavior', () => {
344
+ it('should cache getDoc results', () => {
345
+ class CacheContext extends FlowRunJSContext {}
346
+
347
+ CacheContext.define({
348
+ properties: { foo: 'bar' },
349
+ });
350
+
351
+ const doc1 = CacheContext.getDoc();
352
+ const doc2 = CacheContext.getDoc();
353
+
354
+ // Should return the same cached object
355
+ expect(doc1).toBe(doc2);
356
+ });
357
+
358
+ it('should invalidate cache when define is called', () => {
359
+ class InvalidateContext extends FlowRunJSContext {}
360
+
361
+ InvalidateContext.define({
362
+ properties: { foo: 'initial' },
363
+ });
364
+
365
+ const doc1 = InvalidateContext.getDoc();
366
+ expect(doc1.properties?.foo).toBe('initial');
367
+
368
+ InvalidateContext.define({
369
+ properties: { foo: 'updated' },
370
+ });
371
+
372
+ const doc2 = InvalidateContext.getDoc();
373
+ expect(doc2.properties?.foo).toBe('updated');
374
+
375
+ // Should be different objects after invalidation
376
+ expect(doc1).not.toBe(doc2);
377
+ });
378
+
379
+ it('should cache different locales separately', () => {
380
+ class LocaleCacheContext extends FlowRunJSContext {}
381
+
382
+ LocaleCacheContext.define({ properties: { msg: 'English' } });
383
+ LocaleCacheContext.define({ properties: { msg: '中文' } }, { locale: 'zh-CN' });
384
+
385
+ const enDoc1 = LocaleCacheContext.getDoc();
386
+ const zhDoc1 = LocaleCacheContext.getDoc('zh-CN');
387
+ const enDoc2 = LocaleCacheContext.getDoc();
388
+ const zhDoc2 = LocaleCacheContext.getDoc('zh-CN');
389
+
390
+ expect(enDoc1).toBe(enDoc2);
391
+ expect(zhDoc1).toBe(zhDoc2);
392
+ expect(enDoc1).not.toBe(zhDoc1);
393
+ });
394
+ });
395
+
396
+ describe('Edge cases', () => {
397
+ it('should handle empty define calls', () => {
398
+ class EmptyContext extends FlowRunJSContext {}
399
+
400
+ EmptyContext.define({});
401
+ const doc = EmptyContext.getDoc();
402
+
403
+ expect(doc).toBeTruthy();
404
+ expect(typeof doc).toBe('object');
405
+ });
406
+
407
+ it('should handle undefined values gracefully', () => {
408
+ class UndefinedContext extends FlowRunJSContext {}
409
+
410
+ UndefinedContext.define({
411
+ properties: {
412
+ foo: undefined as any,
413
+ },
414
+ });
415
+
416
+ const doc = UndefinedContext.getDoc();
417
+ expect(doc.properties?.foo).toBeUndefined();
418
+ });
419
+
420
+ it('should handle arrays in properties', () => {
421
+ class ArrayContext extends FlowRunJSContext {}
422
+
423
+ ArrayContext.define({
424
+ properties: {
425
+ examples: ['example1', 'example2'] as any,
426
+ },
427
+ });
428
+
429
+ const doc = ArrayContext.getDoc();
430
+ expect(doc.properties?.examples).toEqual(['example1', 'example2']);
431
+ });
432
+
433
+ it('should not merge arrays, replace them instead', () => {
434
+ class ArrayReplaceContext extends FlowRunJSContext {}
435
+
436
+ ArrayReplaceContext.define({
437
+ properties: {
438
+ items: ['a', 'b'] as any,
439
+ },
440
+ });
441
+
442
+ ArrayReplaceContext.define({
443
+ properties: {
444
+ items: ['c', 'd'] as any,
445
+ },
446
+ });
447
+
448
+ const doc = ArrayReplaceContext.getDoc();
449
+ expect(doc.properties?.items).toEqual(['c', 'd']);
450
+ });
451
+ });
452
+
453
+ describe('Multiple define calls', () => {
454
+ it('should accumulate metadata from multiple define calls', () => {
455
+ class MultiDefineContext extends FlowRunJSContext {}
456
+
457
+ MultiDefineContext.define({
458
+ properties: { prop1: 'value1' },
459
+ });
460
+
461
+ MultiDefineContext.define({
462
+ properties: { prop2: 'value2' },
463
+ });
464
+
465
+ MultiDefineContext.define({
466
+ methods: { method1: 'desc1' },
467
+ });
468
+
469
+ const doc = MultiDefineContext.getDoc();
470
+ expect(doc.properties?.prop1).toBe('value1');
471
+ expect(doc.properties?.prop2).toBe('value2');
472
+ expect(doc.methods?.method1).toBe('desc1');
473
+ });
474
+
475
+ it('should allow incremental updates to nested structures', () => {
476
+ class IncrementalContext extends FlowRunJSContext {}
477
+
478
+ IncrementalContext.define({
479
+ properties: {
480
+ api: {
481
+ description: 'API client',
482
+ properties: {
483
+ request: { description: 'Request method' },
484
+ },
485
+ },
486
+ },
487
+ });
488
+
489
+ IncrementalContext.define({
490
+ properties: {
491
+ api: {
492
+ detail: 'APIClient instance',
493
+ properties: {
494
+ query: { description: 'Query method' },
495
+ },
496
+ },
497
+ },
498
+ });
499
+
500
+ const doc = IncrementalContext.getDoc();
501
+ const apiProp: any = doc.properties?.api;
502
+ expect(apiProp.description).toBe('API client');
503
+ expect(apiProp.detail).toBe('APIClient instance');
504
+ expect(apiProp.properties?.request?.description).toBe('Request method');
505
+ expect(apiProp.properties?.query?.description).toBe('Query method');
506
+ });
507
+ });
508
+ });
@@ -12,6 +12,7 @@ import { screen } from '@testing-library/react';
12
12
  import { FlowSettings } from '../flowSettings';
13
13
  import { FlowModel } from '../models';
14
14
  import { FlowEngine } from '../flowEngine';
15
+ import { GLOBAL_EMBED_CONTAINER_ID } from '../views';
15
16
 
16
17
  // We will stub viewer directly on model.context in tests
17
18
 
@@ -82,6 +83,8 @@ vi.mock('antd', () => {
82
83
  Paragraph: ({ children }: any) => children ?? 'Paragraph',
83
84
  Text: ({ children }: any) => children ?? 'Text',
84
85
  },
86
+ ConfigProvider: ({ children }: any) => children ?? 'ConfigProvider',
87
+ theme: { useToken: () => ({}) },
85
88
  };
86
89
  });
87
90
 
@@ -1085,18 +1088,18 @@ describe('FlowSettings.open rendering behavior', () => {
1085
1088
 
1086
1089
  // Create mock DOM element for embed target
1087
1090
  const mockTarget = document.createElement('div');
1088
- mockTarget.id = 'nocobase-embed-container';
1091
+ mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
1089
1092
  mockTarget.style.width = 'auto';
1090
1093
  mockTarget.style.maxWidth = 'none';
1091
1094
  document.body.appendChild(mockTarget);
1092
1095
 
1093
1096
  // Mock querySelector to return our mock element
1094
- const originalQuerySelector = document.querySelector;
1095
- document.querySelector = vi.fn((selector) => {
1096
- if (selector === '#nocobase-embed-container') {
1097
+ const originalQuerySelector = document.querySelector.bind(document);
1098
+ const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
1099
+ if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
1097
1100
  return mockTarget;
1098
1101
  }
1099
- return originalQuerySelector.call(document, selector);
1102
+ return originalQuerySelector(selector);
1100
1103
  });
1101
1104
 
1102
1105
  const M = model.constructor as any;
@@ -1162,7 +1165,61 @@ describe('FlowSettings.open rendering behavior', () => {
1162
1165
 
1163
1166
  // Cleanup
1164
1167
  document.body.removeChild(mockTarget);
1165
- document.querySelector = originalQuerySelector;
1168
+ querySelectorSpy.mockRestore();
1169
+ });
1170
+
1171
+ it('does not clear embed target DOM before opening (avoids portal unmount errors)', async () => {
1172
+ const engine = new FlowEngine();
1173
+ const flowSettings = new FlowSettings(engine);
1174
+ const model = new FlowModel({ uid: 'm-embed-no-clear', flowEngine: engine });
1175
+
1176
+ const mockTarget = document.createElement('div');
1177
+ mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
1178
+ mockTarget.innerHTML = '<div data-testid="existing">Existing</div>';
1179
+ document.body.appendChild(mockTarget);
1180
+
1181
+ const originalQuerySelector = document.querySelector.bind(document);
1182
+ const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
1183
+ if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
1184
+ return mockTarget;
1185
+ }
1186
+ return originalQuerySelector(selector);
1187
+ });
1188
+
1189
+ const M = model.constructor as any;
1190
+ M.registerFlow({
1191
+ key: 'embedNoClearFlow',
1192
+ steps: {
1193
+ step: {
1194
+ title: 'Step',
1195
+ uiSchema: { f: { type: 'string', 'x-component': 'Input' } },
1196
+ },
1197
+ },
1198
+ });
1199
+
1200
+ const embed = vi.fn((opts: any) => {
1201
+ // The existing DOM should not be wiped out before opening the embed view.
1202
+ expect(mockTarget.querySelector('[data-testid="existing"]')).toBeTruthy();
1203
+ const dlg = { close: vi.fn(), Footer: (p: any) => null } as any;
1204
+ if (typeof opts.content === 'function') opts.content(dlg, { defineMethod: vi.fn() });
1205
+ return dlg;
1206
+ });
1207
+
1208
+ model.context.defineProperty('viewer', { value: { embed } });
1209
+ model.context.defineProperty('message', { value: { info: vi.fn(), error: vi.fn(), success: vi.fn() } });
1210
+
1211
+ await flowSettings.open({
1212
+ model,
1213
+ flowKey: 'embedNoClearFlow',
1214
+ stepKey: 'step',
1215
+ uiMode: 'embed',
1216
+ } as any);
1217
+
1218
+ expect(embed).toHaveBeenCalledTimes(1);
1219
+ expect(mockTarget.querySelector('[data-testid="existing"]')).toBeTruthy();
1220
+
1221
+ document.body.removeChild(mockTarget);
1222
+ querySelectorSpy.mockRestore();
1166
1223
  });
1167
1224
 
1168
1225
  it('uses embed uiMode with default props when target element exists', async () => {
@@ -1172,16 +1229,16 @@ describe('FlowSettings.open rendering behavior', () => {
1172
1229
 
1173
1230
  // Create mock DOM element for embed target
1174
1231
  const mockTarget = document.createElement('div');
1175
- mockTarget.id = 'nocobase-embed-container';
1232
+ mockTarget.id = GLOBAL_EMBED_CONTAINER_ID;
1176
1233
  document.body.appendChild(mockTarget);
1177
1234
 
1178
1235
  // Mock querySelector
1179
- const originalQuerySelector = document.querySelector;
1180
- document.querySelector = vi.fn((selector) => {
1181
- if (selector === '#nocobase-embed-container') {
1236
+ const originalQuerySelector = document.querySelector.bind(document);
1237
+ const querySelectorSpy = vi.spyOn(document, 'querySelector').mockImplementation((selector: string) => {
1238
+ if (selector === `#${GLOBAL_EMBED_CONTAINER_ID}`) {
1182
1239
  return mockTarget;
1183
1240
  }
1184
- return originalQuerySelector.call(document, selector);
1241
+ return originalQuerySelector(selector);
1185
1242
  });
1186
1243
 
1187
1244
  const M = model.constructor as any;
@@ -1221,7 +1278,7 @@ describe('FlowSettings.open rendering behavior', () => {
1221
1278
 
1222
1279
  // Cleanup
1223
1280
  document.body.removeChild(mockTarget);
1224
- document.querySelector = originalQuerySelector;
1281
+ querySelectorSpy.mockRestore();
1225
1282
  });
1226
1283
 
1227
1284
  it('handles embed uiMode when target element is not found', async () => {
@@ -1230,8 +1287,7 @@ describe('FlowSettings.open rendering behavior', () => {
1230
1287
  const model = new FlowModel({ uid: 'm-embed-no-target', flowEngine: engine });
1231
1288
 
1232
1289
  // Mock querySelector to return null (target not found)
1233
- const originalQuerySelector = document.querySelector;
1234
- document.querySelector = vi.fn(() => null);
1290
+ const querySelectorSpy = vi.spyOn(document, 'querySelector').mockReturnValue(null);
1235
1291
 
1236
1292
  const M = model.constructor as any;
1237
1293
  M.registerFlow({
@@ -1264,7 +1320,7 @@ describe('FlowSettings.open rendering behavior', () => {
1264
1320
  expect(embed).toHaveBeenCalledTimes(1);
1265
1321
 
1266
1322
  // Restore querySelector
1267
- document.querySelector = originalQuerySelector;
1323
+ querySelectorSpy.mockRestore();
1268
1324
  });
1269
1325
 
1270
1326
  it('handles error in function-based step uiMode gracefully', async () => {
@@ -95,6 +95,8 @@ vi.mock('antd', () => {
95
95
  Paragraph: vi.fn(({ children }: any) => children ?? 'Paragraph'),
96
96
  Text: vi.fn(({ children }: any) => children ?? 'Text'),
97
97
  },
98
+ ConfigProvider: ({ children }: any) => children ?? 'ConfigProvider',
99
+ theme: { useToken: () => ({}) },
98
100
  } as any;
99
101
  });
100
102
 
@@ -7,8 +7,8 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { describe, it, expect } from 'vitest';
11
10
  import { FlowModel } from '@nocobase/flow-engine';
11
+ import { describe, expect, it } from 'vitest';
12
12
 
13
13
  describe('GlobalFlowRegistry (class-level flows)', () => {
14
14
  class BaseModel extends FlowModel {}