@nocobase/flow-engine 2.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +30 -0
  3. package/lib/ContextPathProxy.d.ts +17 -0
  4. package/lib/ContextPathProxy.js +65 -0
  5. package/lib/ElementProxy.d.ts +17 -0
  6. package/lib/ElementProxy.js +93 -0
  7. package/lib/FlowContextProvider.d.ts +24 -0
  8. package/lib/FlowContextProvider.js +82 -0
  9. package/lib/FlowDefinition.d.ts +423 -0
  10. package/lib/FlowDefinition.js +257 -0
  11. package/lib/JSRunner.d.ts +32 -0
  12. package/lib/JSRunner.js +95 -0
  13. package/lib/ReactView.d.ts +20 -0
  14. package/lib/ReactView.js +120 -0
  15. package/lib/ViewScopedFlowEngine.d.ts +23 -0
  16. package/lib/ViewScopedFlowEngine.js +81 -0
  17. package/lib/acl/Acl.d.ts +31 -0
  18. package/lib/acl/Acl.js +115 -0
  19. package/lib/action-registry/BaseActionRegistry.d.ts +23 -0
  20. package/lib/action-registry/BaseActionRegistry.js +57 -0
  21. package/lib/action-registry/EngineActionRegistry.d.ts +20 -0
  22. package/lib/action-registry/EngineActionRegistry.js +47 -0
  23. package/lib/action-registry/ModelActionRegistry.d.ts +34 -0
  24. package/lib/action-registry/ModelActionRegistry.js +79 -0
  25. package/lib/components/DynamicFlowsEditor.d.ts +17 -0
  26. package/lib/components/DynamicFlowsEditor.js +49 -0
  27. package/lib/components/FieldModelRenderer.d.ts +10 -0
  28. package/lib/components/FieldModelRenderer.js +94 -0
  29. package/lib/components/FlowContextSelector.d.ts +11 -0
  30. package/lib/components/FlowContextSelector.js +221 -0
  31. package/lib/components/FlowErrorFallback.d.ts +25 -0
  32. package/lib/components/FlowErrorFallback.js +264 -0
  33. package/lib/components/FlowModelRenderer.d.ts +64 -0
  34. package/lib/components/FlowModelRenderer.js +254 -0
  35. package/lib/components/FormItem.d.ts +18 -0
  36. package/lib/components/FormItem.js +147 -0
  37. package/lib/components/common/FlowSettingsButton.d.ts +11 -0
  38. package/lib/components/common/FlowSettingsButton.js +66 -0
  39. package/lib/components/common/index.d.ts +9 -0
  40. package/lib/components/common/index.js +30 -0
  41. package/lib/components/common/withFlowDesignMode.d.ts +26 -0
  42. package/lib/components/common/withFlowDesignMode.js +61 -0
  43. package/lib/components/dnd/getMousePositionOnElement.d.ts +50 -0
  44. package/lib/components/dnd/getMousePositionOnElement.js +95 -0
  45. package/lib/components/dnd/index.d.ts +24 -0
  46. package/lib/components/dnd/index.js +164 -0
  47. package/lib/components/dnd/moveBlock.d.ts +33 -0
  48. package/lib/components/dnd/moveBlock.js +302 -0
  49. package/lib/components/index.d.ts +18 -0
  50. package/lib/components/index.js +48 -0
  51. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.d.ts +46 -0
  52. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +225 -0
  53. package/lib/components/settings/independents/dropdown/index.d.ts +9 -0
  54. package/lib/components/settings/independents/dropdown/index.js +30 -0
  55. package/lib/components/settings/independents/index.d.ts +1 -0
  56. package/lib/components/settings/independents/index.js +30 -0
  57. package/lib/components/settings/index.d.ts +10 -0
  58. package/lib/components/settings/index.js +32 -0
  59. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.d.ts +24 -0
  60. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +501 -0
  61. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.d.ts +45 -0
  62. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +231 -0
  63. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +111 -0
  64. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +484 -0
  65. package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.d.ts +26 -0
  66. package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.js +342 -0
  67. package/lib/components/settings/wrappers/contextual/StepSettings.d.ts +23 -0
  68. package/lib/components/settings/wrappers/contextual/StepSettings.js +110 -0
  69. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.d.ts +20 -0
  70. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +206 -0
  71. package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.d.ts +20 -0
  72. package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.js +47 -0
  73. package/lib/components/settings/wrappers/contextual/index.d.ts +14 -0
  74. package/lib/components/settings/wrappers/contextual/index.js +40 -0
  75. package/lib/components/settings/wrappers/embedded/FlowSettings.d.ts +33 -0
  76. package/lib/components/settings/wrappers/embedded/FlowSettings.js +207 -0
  77. package/lib/components/settings/wrappers/embedded/FlowsSettings.d.ts +41 -0
  78. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +84 -0
  79. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.d.ts +16 -0
  80. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +88 -0
  81. package/lib/components/settings/wrappers/embedded/index.d.ts +10 -0
  82. package/lib/components/settings/wrappers/embedded/index.js +32 -0
  83. package/lib/components/settings/wrappers/index.d.ts +2 -0
  84. package/lib/components/settings/wrappers/index.js +32 -0
  85. package/lib/components/subModel/AddSubModelButton.d.ts +62 -0
  86. package/lib/components/subModel/AddSubModelButton.js +415 -0
  87. package/lib/components/subModel/LazyDropdown.d.ts +55 -0
  88. package/lib/components/subModel/LazyDropdown.js +524 -0
  89. package/lib/components/subModel/index.d.ts +10 -0
  90. package/lib/components/subModel/index.js +32 -0
  91. package/lib/components/subModel/utils.d.ts +34 -0
  92. package/lib/components/subModel/utils.js +287 -0
  93. package/lib/components/variables/InlineVariableTag.d.ts +21 -0
  94. package/lib/components/variables/InlineVariableTag.js +123 -0
  95. package/lib/components/variables/SlateVariableEditor.d.ts +46 -0
  96. package/lib/components/variables/SlateVariableEditor.js +302 -0
  97. package/lib/components/variables/VariableInput.d.ts +11 -0
  98. package/lib/components/variables/VariableInput.js +322 -0
  99. package/lib/components/variables/VariableTag.d.ts +11 -0
  100. package/lib/components/variables/VariableTag.js +148 -0
  101. package/lib/components/variables/VariableTrigger.d.ts +20 -0
  102. package/lib/components/variables/VariableTrigger.js +136 -0
  103. package/lib/components/variables/index.d.ts +15 -0
  104. package/lib/components/variables/index.js +53 -0
  105. package/lib/components/variables/types.d.ts +93 -0
  106. package/lib/components/variables/types.js +24 -0
  107. package/lib/components/variables/useResolvedMetaTree.d.ts +19 -0
  108. package/lib/components/variables/useResolvedMetaTree.js +91 -0
  109. package/lib/components/variables/utils.d.ts +22 -0
  110. package/lib/components/variables/utils.js +177 -0
  111. package/lib/data-source/index.d.ts +180 -0
  112. package/lib/data-source/index.js +733 -0
  113. package/lib/data-source/jioToJoiSchema.d.ts +19 -0
  114. package/lib/data-source/jioToJoiSchema.js +114 -0
  115. package/lib/decorators/index.d.ts +9 -0
  116. package/lib/decorators/index.js +36 -0
  117. package/lib/decorators/largeField.d.ts +9 -0
  118. package/lib/decorators/largeField.js +42 -0
  119. package/lib/emitter.d.ts +16 -0
  120. package/lib/emitter.js +58 -0
  121. package/lib/event-registry/BaseEventRegistry.d.ts +22 -0
  122. package/lib/event-registry/BaseEventRegistry.js +57 -0
  123. package/lib/event-registry/EngineEventRegistry.d.ts +19 -0
  124. package/lib/event-registry/EngineEventRegistry.js +47 -0
  125. package/lib/event-registry/ModelEventRegistry.d.ts +33 -0
  126. package/lib/event-registry/ModelEventRegistry.js +79 -0
  127. package/lib/executor/FlowExecutor.d.ts +26 -0
  128. package/lib/executor/FlowExecutor.js +262 -0
  129. package/lib/flow-registry/BaseFlowRegistry.d.ts +46 -0
  130. package/lib/flow-registry/BaseFlowRegistry.js +86 -0
  131. package/lib/flow-registry/GlobalFlowRegistry.d.ts +22 -0
  132. package/lib/flow-registry/GlobalFlowRegistry.js +95 -0
  133. package/lib/flow-registry/InstanceFlowRegistry.d.ts +21 -0
  134. package/lib/flow-registry/InstanceFlowRegistry.js +59 -0
  135. package/lib/flow-registry/index.d.ts +11 -0
  136. package/lib/flow-registry/index.js +34 -0
  137. package/lib/flowContext.d.ts +215 -0
  138. package/lib/flowContext.js +1266 -0
  139. package/lib/flowEngine.d.ts +340 -0
  140. package/lib/flowEngine.js +781 -0
  141. package/lib/flowI18n.d.ts +46 -0
  142. package/lib/flowI18n.js +117 -0
  143. package/lib/flowSettings.d.ts +266 -0
  144. package/lib/flowSettings.js +850 -0
  145. package/lib/hooks/index.d.ts +14 -0
  146. package/lib/hooks/index.js +40 -0
  147. package/lib/hooks/useApplyAutoFlows.d.ts +21 -0
  148. package/lib/hooks/useApplyAutoFlows.js +62 -0
  149. package/lib/hooks/useFlowModel.d.ts +29 -0
  150. package/lib/hooks/useFlowModel.js +72 -0
  151. package/lib/hooks/useFlowModelById.d.ts +11 -0
  152. package/lib/hooks/useFlowModelById.js +61 -0
  153. package/lib/hooks/useFlowSettingsContext.d.ts +20 -0
  154. package/lib/hooks/useFlowSettingsContext.js +61 -0
  155. package/lib/hooks/useFlowStep.d.ts +17 -0
  156. package/lib/hooks/useFlowStep.js +56 -0
  157. package/lib/hooks/useNiceDropdownMaxHeight.d.ts +13 -0
  158. package/lib/hooks/useNiceDropdownMaxHeight.js +52 -0
  159. package/lib/index.d.ts +27 -0
  160. package/lib/index.js +73 -0
  161. package/lib/locale/en-US.json +61 -0
  162. package/lib/locale/index.d.ts +141 -0
  163. package/lib/locale/index.js +70 -0
  164. package/lib/locale/zh-CN.json +61 -0
  165. package/lib/models/CollectionFieldModel.d.ts +50 -0
  166. package/lib/models/CollectionFieldModel.js +242 -0
  167. package/lib/models/DisplayItemModel.d.ts +12 -0
  168. package/lib/models/DisplayItemModel.js +41 -0
  169. package/lib/models/EditableItemModel.d.ts +12 -0
  170. package/lib/models/EditableItemModel.js +41 -0
  171. package/lib/models/FilterableItemModel.d.ts +12 -0
  172. package/lib/models/FilterableItemModel.js +41 -0
  173. package/lib/models/flowModel.d.ts +344 -0
  174. package/lib/models/flowModel.js +1133 -0
  175. package/lib/models/forkFlowModel.d.ts +83 -0
  176. package/lib/models/forkFlowModel.js +257 -0
  177. package/lib/models/index.d.ts +14 -0
  178. package/lib/models/index.js +40 -0
  179. package/lib/provider.d.ts +22 -0
  180. package/lib/provider.js +114 -0
  181. package/lib/resources/apiResource.d.ts +34 -0
  182. package/lib/resources/apiResource.js +153 -0
  183. package/lib/resources/baseRecordResource.d.ts +61 -0
  184. package/lib/resources/baseRecordResource.js +264 -0
  185. package/lib/resources/filterItem.d.ts +33 -0
  186. package/lib/resources/filterItem.js +93 -0
  187. package/lib/resources/flowResource.d.ts +45 -0
  188. package/lib/resources/flowResource.js +146 -0
  189. package/lib/resources/index.d.ts +15 -0
  190. package/lib/resources/index.js +42 -0
  191. package/lib/resources/multiRecordResource.d.ts +53 -0
  192. package/lib/resources/multiRecordResource.js +230 -0
  193. package/lib/resources/singleRecordResource.d.ts +23 -0
  194. package/lib/resources/singleRecordResource.js +111 -0
  195. package/lib/resources/sqlResource.d.ts +73 -0
  196. package/lib/resources/sqlResource.js +294 -0
  197. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +38 -0
  198. package/lib/runjs-context/contexts/FlowRunJSContext.js +217 -0
  199. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +16 -0
  200. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +66 -0
  201. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +16 -0
  202. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +78 -0
  203. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +12 -0
  204. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +59 -0
  205. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +16 -0
  206. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +70 -0
  207. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +16 -0
  208. package/lib/runjs-context/contexts/JSItemRunJSContext.js +66 -0
  209. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +12 -0
  210. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +61 -0
  211. package/lib/runjs-context/contexts/LinkageRunJSContext.d.ts +12 -0
  212. package/lib/runjs-context/contexts/LinkageRunJSContext.js +62 -0
  213. package/lib/runjs-context/helpers.d.ts +17 -0
  214. package/lib/runjs-context/helpers.js +79 -0
  215. package/lib/runjs-context/index.d.ts +19 -0
  216. package/lib/runjs-context/index.js +57 -0
  217. package/lib/runjs-context/registry.d.ts +17 -0
  218. package/lib/runjs-context/registry.js +93 -0
  219. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +16 -0
  220. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +42 -0
  221. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +16 -0
  222. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +42 -0
  223. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +16 -0
  224. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +41 -0
  225. package/lib/runjs-context/snippets/global/copy-record-json.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/global/copy-record-json.snippet.js +42 -0
  227. package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.d.ts +11 -0
  228. package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.js +42 -0
  229. package/lib/runjs-context/snippets/global/log-json-record.snippet.d.ts +11 -0
  230. package/lib/runjs-context/snippets/global/log-json-record.snippet.js +42 -0
  231. package/lib/runjs-context/snippets/global/message-error.snippet.d.ts +11 -0
  232. package/lib/runjs-context/snippets/global/message-error.snippet.js +41 -0
  233. package/lib/runjs-context/snippets/global/message-success.snippet.d.ts +11 -0
  234. package/lib/runjs-context/snippets/global/message-success.snippet.js +41 -0
  235. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +16 -0
  236. package/lib/runjs-context/snippets/global/notification-open.snippet.js +43 -0
  237. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.d.ts +11 -0
  238. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +47 -0
  239. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.d.ts +11 -0
  240. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +47 -0
  241. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +16 -0
  242. package/lib/runjs-context/snippets/global/requireAsync.snippet.js +46 -0
  243. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +16 -0
  244. package/lib/runjs-context/snippets/global/sleep.snippet.js +43 -0
  245. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +16 -0
  246. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +44 -0
  247. package/lib/runjs-context/snippets/global/view-navigation-push.snippet.d.ts +11 -0
  248. package/lib/runjs-context/snippets/global/view-navigation-push.snippet.js +44 -0
  249. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +16 -0
  250. package/lib/runjs-context/snippets/global/window-open.snippet.js +41 -0
  251. package/lib/runjs-context/snippets/index.d.ts +11 -0
  252. package/lib/runjs-context/snippets/index.js +94 -0
  253. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +15 -0
  254. package/lib/runjs-context/snippets/libs/echarts-init.snippet.js +46 -0
  255. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +15 -0
  256. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.js +44 -0
  257. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +15 -0
  258. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.js +43 -0
  259. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +15 -0
  260. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +43 -0
  261. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +15 -0
  262. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +40 -0
  263. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +15 -0
  264. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.js +46 -0
  265. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +15 -0
  266. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +42 -0
  267. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +15 -0
  268. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +46 -0
  269. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +15 -0
  270. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +41 -0
  271. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +15 -0
  272. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +41 -0
  273. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +15 -0
  274. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.js +46 -0
  275. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.d.ts +11 -0
  276. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.js +45 -0
  277. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +15 -0
  278. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.js +56 -0
  279. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +15 -0
  280. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.js +42 -0
  281. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +15 -0
  282. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.js +41 -0
  283. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +15 -0
  284. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.js +40 -0
  285. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +15 -0
  286. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.js +44 -0
  287. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +15 -0
  288. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.js +60 -0
  289. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +15 -0
  290. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.js +59 -0
  291. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +15 -0
  292. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.js +60 -0
  293. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +15 -0
  294. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.js +60 -0
  295. package/lib/runjs-context/snippets/types.d.ts +16 -0
  296. package/lib/runjs-context/snippets/types.js +24 -0
  297. package/lib/types.d.ts +398 -0
  298. package/lib/types.js +43 -0
  299. package/lib/utils/autoFlowError.d.ts +16 -0
  300. package/lib/utils/autoFlowError.js +53 -0
  301. package/lib/utils/constants.d.ts +29 -0
  302. package/lib/utils/constants.js +77 -0
  303. package/lib/utils/context.d.ts +40 -0
  304. package/lib/utils/context.js +63 -0
  305. package/lib/utils/createCollectionContextMeta.d.ts +11 -0
  306. package/lib/utils/createCollectionContextMeta.js +117 -0
  307. package/lib/utils/exceptions.d.ts +22 -0
  308. package/lib/utils/exceptions.js +62 -0
  309. package/lib/utils/flow-definitions.d.ts +11 -0
  310. package/lib/utils/flow-definitions.js +40 -0
  311. package/lib/utils/index.d.ts +22 -0
  312. package/lib/utils/index.js +117 -0
  313. package/lib/utils/inheritance.d.ts +16 -0
  314. package/lib/utils/inheritance.js +53 -0
  315. package/lib/utils/params-resolvers.d.ts +51 -0
  316. package/lib/utils/params-resolvers.js +309 -0
  317. package/lib/utils/parsePathnameToViewParams.d.ts +34 -0
  318. package/lib/utils/parsePathnameToViewParams.js +84 -0
  319. package/lib/utils/safeGlobals.d.ts +16 -0
  320. package/lib/utils/safeGlobals.js +179 -0
  321. package/lib/utils/schema-utils.d.ts +40 -0
  322. package/lib/utils/schema-utils.js +161 -0
  323. package/lib/utils/serverContextParams.d.ts +28 -0
  324. package/lib/utils/serverContextParams.js +106 -0
  325. package/lib/utils/setupRuntimeContextSteps.d.ts +19 -0
  326. package/lib/utils/setupRuntimeContextSteps.js +88 -0
  327. package/lib/utils/translation.d.ts +18 -0
  328. package/lib/utils/translation.js +58 -0
  329. package/lib/utils/variablesParams.d.ts +51 -0
  330. package/lib/utils/variablesParams.js +150 -0
  331. package/lib/views/DialogComponent.d.ts +22 -0
  332. package/lib/views/DialogComponent.js +98 -0
  333. package/lib/views/DrawerComponent.d.ts +11 -0
  334. package/lib/views/DrawerComponent.js +101 -0
  335. package/lib/views/FlowView.d.ts +76 -0
  336. package/lib/views/FlowView.js +81 -0
  337. package/lib/views/PageComponent.d.ts +10 -0
  338. package/lib/views/PageComponent.js +167 -0
  339. package/lib/views/ViewNavigation.d.ts +45 -0
  340. package/lib/views/ViewNavigation.js +97 -0
  341. package/lib/views/createViewMeta.d.ts +16 -0
  342. package/lib/views/createViewMeta.js +171 -0
  343. package/lib/views/index.d.ts +13 -0
  344. package/lib/views/index.js +48 -0
  345. package/lib/views/useDialog.d.ts +32 -0
  346. package/lib/views/useDialog.js +199 -0
  347. package/lib/views/useDrawer.d.ts +33 -0
  348. package/lib/views/useDrawer.js +206 -0
  349. package/lib/views/usePage.d.ts +32 -0
  350. package/lib/views/usePage.js +193 -0
  351. package/lib/views/usePatchElement.d.ts +10 -0
  352. package/lib/views/usePatchElement.js +54 -0
  353. package/lib/views/usePopover.d.ts +17 -0
  354. package/lib/views/usePopover.js +159 -0
  355. package/package.json +37 -0
  356. package/src/ContextPathProxy.ts +45 -0
  357. package/src/ElementProxy.ts +69 -0
  358. package/src/FlowContextProvider.tsx +40 -0
  359. package/src/FlowDefinition.ts +275 -0
  360. package/src/JSRunner.ts +84 -0
  361. package/src/ReactView.tsx +104 -0
  362. package/src/ViewScopedFlowEngine.ts +75 -0
  363. package/src/__tests__/ElementProxy.test.ts +51 -0
  364. package/src/__tests__/JSRunner.test.ts +92 -0
  365. package/src/__tests__/ReactView.test.tsx +63 -0
  366. package/src/__tests__/context-path-proxy.test.ts +35 -0
  367. package/src/__tests__/flow-engine.test.ts +189 -0
  368. package/src/__tests__/flowContext.test.ts +2012 -0
  369. package/src/__tests__/flowEngine.saveModel.test.ts +171 -0
  370. package/src/__tests__/flowI18n.test.ts +28 -0
  371. package/src/__tests__/flowModel.getFlows.test.ts +61 -0
  372. package/src/__tests__/flowModel.openView.navigation.test.ts +78 -0
  373. package/src/__tests__/flowRuntimeContext.test.ts +187 -0
  374. package/src/__tests__/flowSettings.open.test.tsx +1920 -0
  375. package/src/__tests__/flowSettings.test.ts +566 -0
  376. package/src/__tests__/globalFlowRegistry.test.ts +77 -0
  377. package/src/__tests__/isFieldInterfaceMatch.test.ts +51 -0
  378. package/src/__tests__/metaTreeNodeCache.test.ts +234 -0
  379. package/src/__tests__/path-aggregation.test.ts +85 -0
  380. package/src/__tests__/provider.test.tsx +28 -0
  381. package/src/__tests__/renderHiddenInConfig.test.tsx +91 -0
  382. package/src/__tests__/runjsContext.test.ts +60 -0
  383. package/src/__tests__/viewScopedFlowEngine.test.ts +212 -0
  384. package/src/acl/Acl.tsx +109 -0
  385. package/src/acl/__tests__/Acl.test.tsx +72 -0
  386. package/src/action-registry/BaseActionRegistry.ts +46 -0
  387. package/src/action-registry/EngineActionRegistry.ts +32 -0
  388. package/src/action-registry/ModelActionRegistry.ts +75 -0
  389. package/src/action-registry/__tests__/engineActionRegistry.test.ts +43 -0
  390. package/src/action-registry/__tests__/modelActionRegistry.test.ts +107 -0
  391. package/src/components/DynamicFlowsEditor.tsx +318 -0
  392. package/src/components/FieldModelRenderer.tsx +62 -0
  393. package/src/components/FlowContextSelector.tsx +255 -0
  394. package/src/components/FlowErrorFallback.tsx +316 -0
  395. package/src/components/FlowModelRenderer.tsx +428 -0
  396. package/src/components/FormItem.tsx +130 -0
  397. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +226 -0
  398. package/src/components/common/FlowSettingsButton.tsx +30 -0
  399. package/src/components/common/index.ts +10 -0
  400. package/src/components/common/withFlowDesignMode.tsx +49 -0
  401. package/src/components/dnd/getMousePositionOnElement.ts +115 -0
  402. package/src/components/dnd/index.tsx +128 -0
  403. package/src/components/dnd/moveBlock.ts +379 -0
  404. package/src/components/index.ts +20 -0
  405. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +279 -0
  406. package/src/components/settings/independents/dropdown/index.ts +10 -0
  407. package/src/components/settings/independents/index.ts +2 -0
  408. package/src/components/settings/index.ts +11 -0
  409. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +617 -0
  410. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +292 -0
  411. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +655 -0
  412. package/src/components/settings/wrappers/contextual/StepRequiredSettingsDialog.tsx +446 -0
  413. package/src/components/settings/wrappers/contextual/StepSettings.tsx +109 -0
  414. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +217 -0
  415. package/src/components/settings/wrappers/contextual/StepSettingsDrawer.tsx +32 -0
  416. package/src/components/settings/wrappers/contextual/index.ts +15 -0
  417. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +258 -0
  418. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +111 -0
  419. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +96 -0
  420. package/src/components/settings/wrappers/embedded/index.ts +11 -0
  421. package/src/components/settings/wrappers/index.ts +5 -0
  422. package/src/components/subModel/AddSubModelButton.tsx +575 -0
  423. package/src/components/subModel/LazyDropdown.tsx +714 -0
  424. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +1185 -0
  425. package/src/components/subModel/__tests__/buildWrapperFieldChildren.test.ts +192 -0
  426. package/src/components/subModel/__tests__/utils.test.ts +425 -0
  427. package/src/components/subModel/index.ts +12 -0
  428. package/src/components/subModel/utils.ts +278 -0
  429. package/src/components/variables/InlineVariableTag.tsx +97 -0
  430. package/src/components/variables/SlateVariableEditor.tsx +384 -0
  431. package/src/components/variables/VariableInput.tsx +342 -0
  432. package/src/components/variables/VariableTag.tsx +123 -0
  433. package/src/components/variables/VariableTrigger.tsx +116 -0
  434. package/src/components/variables/__tests__/FlowContextSelector.test.tsx +553 -0
  435. package/src/components/variables/__tests__/VariableInput.test.tsx +550 -0
  436. package/src/components/variables/__tests__/VariableTag.test.tsx +347 -0
  437. package/src/components/variables/__tests__/test-utils.tsx +62 -0
  438. package/src/components/variables/__tests__/utils.test.ts +310 -0
  439. package/src/components/variables/index.ts +16 -0
  440. package/src/components/variables/types.ts +100 -0
  441. package/src/components/variables/useResolvedMetaTree.ts +76 -0
  442. package/src/components/variables/utils.ts +192 -0
  443. package/src/data-source/__tests__/collection.test.ts +58 -0
  444. package/src/data-source/__tests__/index.test.ts +82 -0
  445. package/src/data-source/__tests__/jioToJoiSchema.test.ts +56 -0
  446. package/src/data-source/index.ts +812 -0
  447. package/src/data-source/jioToJoiSchema.ts +103 -0
  448. package/src/decorators/index.ts +10 -0
  449. package/src/decorators/largeField.ts +14 -0
  450. package/src/emitter.ts +33 -0
  451. package/src/event-registry/BaseEventRegistry.ts +40 -0
  452. package/src/event-registry/EngineEventRegistry.ts +26 -0
  453. package/src/event-registry/ModelEventRegistry.ts +69 -0
  454. package/src/event-registry/__tests__/engineEventRegistry.test.ts +48 -0
  455. package/src/executor/FlowExecutor.ts +256 -0
  456. package/src/executor/__tests__/eventStep.test.ts +157 -0
  457. package/src/executor/__tests__/flowExecutor.test.ts +163 -0
  458. package/src/flow-registry/BaseFlowRegistry.ts +91 -0
  459. package/src/flow-registry/GlobalFlowRegistry.ts +82 -0
  460. package/src/flow-registry/InstanceFlowRegistry.ts +39 -0
  461. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +141 -0
  462. package/src/flow-registry/__tests__/instance-and-global-registry.test.ts +67 -0
  463. package/src/flow-registry/__tests__/instanceFlowRegistry.test.ts +83 -0
  464. package/src/flow-registry/index.ts +12 -0
  465. package/src/flowContext.ts +1639 -0
  466. package/src/flowEngine.ts +905 -0
  467. package/src/flowI18n.ts +96 -0
  468. package/src/flowSettings.ts +1045 -0
  469. package/src/hooks/index.ts +15 -0
  470. package/src/hooks/useApplyAutoFlows.ts +51 -0
  471. package/src/hooks/useFlowModel.tsx +59 -0
  472. package/src/hooks/useFlowModelById.ts +37 -0
  473. package/src/hooks/useFlowSettingsContext.tsx +37 -0
  474. package/src/hooks/useFlowStep.tsx +19 -0
  475. package/src/hooks/useNiceDropdownMaxHeight.ts +34 -0
  476. package/src/index.ts +38 -0
  477. package/src/locale/en-US.json +61 -0
  478. package/src/locale/index.ts +38 -0
  479. package/src/locale/zh-CN.json +61 -0
  480. package/src/models/CollectionFieldModel.tsx +269 -0
  481. package/src/models/DisplayItemModel.tsx +13 -0
  482. package/src/models/EditableItemModel.tsx +13 -0
  483. package/src/models/FilterableItemModel.tsx +13 -0
  484. package/src/models/__tests__/CollectionFieldModel.test.ts +122 -0
  485. package/src/models/__tests__/defaultParams-on-create.test.ts +83 -0
  486. package/src/models/__tests__/flow-model-oninit.test.ts +44 -0
  487. package/src/models/__tests__/flowModel.actions.integration.test.ts +100 -0
  488. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +100 -0
  489. package/src/models/__tests__/flowModel.test.ts +2746 -0
  490. package/src/models/__tests__/flowRegistry.test.ts +512 -0
  491. package/src/models/__tests__/forkFlowModel.test.ts +1047 -0
  492. package/src/models/__tests__/model-actions.test.ts +70 -0
  493. package/src/models/__tests__/model-events.test.ts +69 -0
  494. package/src/models/flowModel.tsx +1398 -0
  495. package/src/models/forkFlowModel.ts +287 -0
  496. package/src/models/index.ts +17 -0
  497. package/src/provider.tsx +101 -0
  498. package/src/resources/__tests__/apiResource.test.ts +201 -0
  499. package/src/resources/__tests__/baseRecordResource.test.ts +262 -0
  500. package/src/resources/__tests__/filterItem.test.ts +260 -0
  501. package/src/resources/__tests__/flowResource.test.ts +127 -0
  502. package/src/resources/apiResource.ts +148 -0
  503. package/src/resources/baseRecordResource.ts +279 -0
  504. package/src/resources/filterItem.ts +74 -0
  505. package/src/resources/flowResource.ts +143 -0
  506. package/src/resources/index.ts +17 -0
  507. package/src/resources/multiRecordResource.ts +219 -0
  508. package/src/resources/singleRecordResource.ts +83 -0
  509. package/src/resources/sqlResource.ts +299 -0
  510. package/src/runjs-context/contexts/FlowRunJSContext.ts +190 -0
  511. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +39 -0
  512. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +52 -0
  513. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +32 -0
  514. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +43 -0
  515. package/src/runjs-context/contexts/JSItemRunJSContext.ts +39 -0
  516. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +34 -0
  517. package/src/runjs-context/contexts/LinkageRunJSContext.ts +35 -0
  518. package/src/runjs-context/helpers.ts +56 -0
  519. package/src/runjs-context/index.ts +20 -0
  520. package/src/runjs-context/registry.ts +65 -0
  521. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +20 -0
  522. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +20 -0
  523. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +19 -0
  524. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +21 -0
  525. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +21 -0
  526. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +21 -0
  527. package/src/runjs-context/snippets/global/message-error.snippet.ts +20 -0
  528. package/src/runjs-context/snippets/global/message-success.snippet.ts +20 -0
  529. package/src/runjs-context/snippets/global/notification-open.snippet.ts +21 -0
  530. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +26 -0
  531. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +26 -0
  532. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +24 -0
  533. package/src/runjs-context/snippets/global/sleep.snippet.ts +21 -0
  534. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +22 -0
  535. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +23 -0
  536. package/src/runjs-context/snippets/global/window-open.snippet.ts +19 -0
  537. package/src/runjs-context/snippets/index.ts +59 -0
  538. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +24 -0
  539. package/src/runjs-context/snippets/scene/actions/collection-selected-count.snippet.ts +22 -0
  540. package/src/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.ts +21 -0
  541. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +21 -0
  542. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +18 -0
  543. package/src/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.ts +29 -0
  544. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +20 -0
  545. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +24 -0
  546. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +19 -0
  547. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +24 -0
  548. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +24 -0
  549. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +30 -0
  550. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +34 -0
  551. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +20 -0
  552. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +19 -0
  553. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +18 -0
  554. package/src/runjs-context/snippets/scene/jsitem/render-basic.snippet.ts +27 -0
  555. package/src/runjs-context/snippets/scene/linkage/set-disabled.snippet.ts +38 -0
  556. package/src/runjs-context/snippets/scene/linkage/set-field-value.snippet.ts +37 -0
  557. package/src/runjs-context/snippets/scene/linkage/set-required.snippet.ts +38 -0
  558. package/src/runjs-context/snippets/scene/linkage/toggle-visible.snippet.ts +38 -0
  559. package/src/runjs-context/snippets/types.ts +17 -0
  560. package/src/types.ts +474 -0
  561. package/src/utils/__tests__/context.test.ts +93 -0
  562. package/src/utils/__tests__/params-resolvers.test.ts +652 -0
  563. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +104 -0
  564. package/src/utils/__tests__/safeGlobals.test.ts +29 -0
  565. package/src/utils/__tests__/utils.test.ts +1021 -0
  566. package/src/utils/__tests__/variablesParams.test.ts +52 -0
  567. package/src/utils/autoFlowError.ts +29 -0
  568. package/src/utils/constants.ts +60 -0
  569. package/src/utils/context.ts +70 -0
  570. package/src/utils/createCollectionContextMeta.ts +122 -0
  571. package/src/utils/exceptions.ts +36 -0
  572. package/src/utils/flow-definitions.ts +16 -0
  573. package/src/utils/index.ts +63 -0
  574. package/src/utils/inheritance.ts +39 -0
  575. package/src/utils/params-resolvers.ts +482 -0
  576. package/src/utils/parsePathnameToViewParams.ts +103 -0
  577. package/src/utils/safeGlobals.ts +188 -0
  578. package/src/utils/schema-utils.ts +201 -0
  579. package/src/utils/serverContextParams.ts +111 -0
  580. package/src/utils/setupRuntimeContextSteps.ts +89 -0
  581. package/src/utils/translation.ts +37 -0
  582. package/src/utils/variablesParams.ts +175 -0
  583. package/src/views/DialogComponent.tsx +79 -0
  584. package/src/views/DrawerComponent.tsx +72 -0
  585. package/src/views/FlowView.tsx +103 -0
  586. package/src/views/PageComponent.tsx +150 -0
  587. package/src/views/ViewNavigation.ts +122 -0
  588. package/src/views/__tests__/FlowView.test.ts +31 -0
  589. package/src/views/__tests__/ViewNavigation.test.ts +191 -0
  590. package/src/views/__tests__/usePatchElement.test.tsx +28 -0
  591. package/src/views/createViewMeta.ts +157 -0
  592. package/src/views/index.tsx +14 -0
  593. package/src/views/useDialog.tsx +192 -0
  594. package/src/views/useDrawer.tsx +205 -0
  595. package/src/views/usePage.tsx +182 -0
  596. package/src/views/usePatchElement.tsx +27 -0
  597. package/src/views/usePopover.tsx +131 -0
@@ -0,0 +1,287 @@
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 { action, define, observable } from '@formily/reactive';
11
+ import { FlowForkModelContext, FlowModelContext } from '../flowContext';
12
+ import type { IModelComponentProps } from '../types';
13
+ import { FlowModel } from './flowModel';
14
+ import { FlowEngine } from '../flowEngine';
15
+
16
+ /**
17
+ * ForkFlowModel 作为 FlowModel 的独立实例:
18
+ * - 大部分属性在 fork 本地存储,实现真正的实例隔离
19
+ * - 只有特定的共享属性(如 stepParams、sortIndex)会同步到 master
20
+ * - 透传的函数中 this 指向 fork 实例,而非 master,确保正确的上下文
21
+ * - 使用 Object.create 创建临时上下文,确保 this.constructor 指向正确的类(避免异步竞态条件)
22
+ * - setter 方法中的 this 也指向 fork 实例,保持一致的上下文行为
23
+ * - 不会被注册到 FlowEngine.modelInstances 中,保持 uid → master 唯一性假设
24
+ */
25
+ export class ForkFlowModel<TMaster extends FlowModel = FlowModel> {
26
+ /** 与 master 相同的 UID,用于日志调试 */
27
+ public readonly uid: string;
28
+ /** 调试标识,便于在日志或断言中快速识别 */
29
+ public readonly isFork = true;
30
+
31
+ /** 本地覆盖的 props,fork 层面的 UI/状态 */
32
+ public localProps: IModelComponentProps;
33
+
34
+ /** master 引用 */
35
+ private master: TMaster;
36
+
37
+ /** 是否已被释放 */
38
+ private disposed = false;
39
+
40
+ /** fork 在 master.forks 中的索引 */
41
+ public readonly forkId: number;
42
+
43
+ /** 需要与 master 共享的属性列表 */
44
+ private static readonly SHARED_PROPERTIES = ['stepParams', 'sortIndex'];
45
+
46
+ /**
47
+ * 配置需要与 master 共享的属性列表
48
+ * @param properties 共享属性名称数组
49
+ */
50
+ public static setSharedProperties(properties: string[]): void {
51
+ (this as any).SHARED_PROPERTIES = [...properties];
52
+ }
53
+
54
+ /**
55
+ * 获取当前配置的共享属性列表
56
+ */
57
+ public static getSharedProperties(): string[] {
58
+ return [...this.SHARED_PROPERTIES];
59
+ }
60
+
61
+ /**
62
+ * fork 本地存储的属性,除了共享属性外的所有属性都存储在这里
63
+ * 注意:此属性通过 Proxy 在 get/set 陷阱中被动态访问,IDE 可能无法检测到使用, 切勿删除!
64
+ */
65
+ private localProperties: Record<string, any> = {};
66
+
67
+ // 不需要定义自己的属性了,现在是SHARED_PROPERTIES中指定的少数几个属性,所有属性设置时会自动添加自己的fork内的独有属性
68
+ #flowContext: FlowModelContext;
69
+
70
+ constructor(master: TMaster, initialProps: IModelComponentProps = {}, forkId = 0) {
71
+ void this.localProperties; // 避免 IDE 提示 unused
72
+ this.master = master;
73
+ this.uid = master.uid;
74
+ this.localProps = { ...initialProps };
75
+ this.forkId = forkId;
76
+ this.hidden = this.master.hidden;
77
+
78
+ define(this, {
79
+ localProps: observable,
80
+ hidden: observable,
81
+ setProps: action,
82
+ });
83
+
84
+ // 返回代理对象,实现自动透传
85
+ return new Proxy(this, {
86
+ get: (target: any, prop: PropertyKey, receiver: any) => {
87
+ // disposed check
88
+ if (prop === 'disposed') return target.disposed;
89
+
90
+ // 特殊处理 constructor,应该返回 master 的 constructor
91
+ if (prop === 'constructor') {
92
+ return target.master.constructor;
93
+ }
94
+ if (prop === 'props') {
95
+ // 对 props 做合并返回
96
+ return { ...target.master.getProps(), ...target.localProps };
97
+ }
98
+ // fork 自身属性 / 方法优先
99
+ if (prop in target) {
100
+ return Reflect.get(target, prop, receiver);
101
+ }
102
+
103
+ // 检查是否在本地属性中
104
+ if (Object.prototype.hasOwnProperty.call(target.localProperties, prop)) {
105
+ return target.localProperties[prop];
106
+ }
107
+
108
+ // 默认取 master 上的值
109
+ const value = (target.master as any)?.[prop];
110
+
111
+ // 如果是函数,需要绑定到 fork 实例,让 this 指向 fork
112
+ // 使用闭包捕获正确的 constructor,避免异步方法中的竞态条件
113
+ if (typeof value === 'function') {
114
+ const masterConstructor = target.master.constructor;
115
+ return function (this: any, ...args: any[]) {
116
+ // 创建一个临时的 this 对象,包含正确的 constructor
117
+ const contextThis = Object.create(this);
118
+ Object.defineProperty(contextThis, 'constructor', {
119
+ value: masterConstructor,
120
+ configurable: true,
121
+ enumerable: false,
122
+ writable: false,
123
+ });
124
+
125
+ return value.apply(contextThis, args);
126
+ }.bind(receiver);
127
+ }
128
+ return value;
129
+ },
130
+ set: (target: any, prop: PropertyKey, value: any, receiver: any) => {
131
+ if (prop === 'props') {
132
+ // fork 中不允许直接设置props
133
+ return true;
134
+ }
135
+
136
+ // 如果 fork 自带字段,则写到自身(例如 localProps、localProperties 等)
137
+ if (prop in target) {
138
+ return Reflect.set(target, prop, value, receiver);
139
+ }
140
+
141
+ // 检查是否为需要与 master 共享的属性
142
+ const propString = String(prop);
143
+ const isSharedProperty = ForkFlowModel.SHARED_PROPERTIES.includes(propString);
144
+
145
+ if (isSharedProperty) {
146
+ // 共享属性:写入 master,但需要确保 setter 中的 this 指向 fork
147
+ const descriptor = this.getPropertyDescriptor(target.master, prop);
148
+ if (descriptor && descriptor.set) {
149
+ // 如果有 setter,直接用 receiver(fork 实例)作为 this 调用
150
+ descriptor.set.call(receiver, value);
151
+ return true;
152
+ } else {
153
+ // 没有 setter,直接赋值到 master
154
+ (target.master as any)[prop] = value;
155
+ return true;
156
+ }
157
+ } else {
158
+ // 非共享属性:检查 master 是否有 setter,如果有则优先调用
159
+ const descriptor = this.getPropertyDescriptor(target.master, prop);
160
+ if (descriptor && descriptor.set) {
161
+ // 如果有 setter,用 receiver(fork 实例)作为 this 调用
162
+ descriptor.set.call(receiver, value);
163
+ return true;
164
+ } else {
165
+ // 没有 setter,写入 fork 的本地属性存储
166
+ target.localProperties[prop] = value;
167
+ return true;
168
+ }
169
+ }
170
+ },
171
+ });
172
+ }
173
+
174
+ get context() {
175
+ if (!this['#flowContext']) {
176
+ this['#flowContext'] = new FlowForkModelContext(this.master, this) as unknown as FlowModelContext;
177
+ }
178
+ return this['#flowContext'] as unknown as FlowModelContext;
179
+ }
180
+
181
+ /**
182
+ * 获取对象及其原型链上的属性描述符
183
+ */
184
+ private getPropertyDescriptor(obj: any, prop: PropertyKey): PropertyDescriptor | undefined {
185
+ let current = obj;
186
+ while (current) {
187
+ const descriptor = Object.getOwnPropertyDescriptor(current, prop);
188
+ if (descriptor) {
189
+ return descriptor;
190
+ }
191
+ current = Object.getPrototypeOf(current);
192
+ }
193
+ return undefined;
194
+ }
195
+
196
+ /**
197
+ * 修改局部 props,仅影响当前 fork
198
+ */
199
+ setProps(key: string | IModelComponentProps, value?: any): void {
200
+ if (this.disposed) return;
201
+
202
+ if (typeof key === 'string') {
203
+ this.localProps[key] = value;
204
+ } else {
205
+ this.localProps = { ...this.localProps, ...key };
206
+ }
207
+ }
208
+
209
+ /**
210
+ * render 依旧使用 master 的方法,但合并后的 props 需要透传
211
+ */
212
+ render() {
213
+ if (this.disposed) return null;
214
+ // 将 master.render 以 fork 作为 this 调用,使其读取到合并后的 props
215
+ const mergedProps = { ...this.master.getProps(), ...this.localProps };
216
+ // 临时替换 this.props
217
+ const originalProps = (this as any).props;
218
+ (this as any).props = mergedProps;
219
+ try {
220
+ return (this.master.render as any).call(this);
221
+ } finally {
222
+ (this as any).props = originalProps;
223
+ }
224
+ }
225
+
226
+ /**
227
+ * 自动流程缓存的作用域标识(fork 专用)。
228
+ */
229
+ public getAutoFlowCacheScope(): string {
230
+ return String(this.forkId);
231
+ }
232
+
233
+ // onUnmount() {
234
+ // // 不在此处自动 dispose(避免破坏外部 fork 管理),但应透传到 master 的 onUnmount 钩子,
235
+ // // 以便用户在子类覆盖 onUnmount 时依然能在 cleanRun 场景下收到回调。
236
+ // try {
237
+ // const masterOnUnmount = (this.master as any)?.onUnmount;
238
+ // if (typeof masterOnUnmount === 'function') {
239
+ // // 使用 fork 作为 this,保持与运行/渲染一致的上下文
240
+ // return masterOnUnmount.call(this);
241
+ // }
242
+ // } catch {
243
+ // // 忽略钩子中的异常,保持卸载流程健壮
244
+ // }
245
+ // }
246
+
247
+ /**
248
+ * 释放 fork:从 master.forks 中移除自身并断开引用
249
+ */
250
+ dispose() {
251
+ if (this.disposed) return;
252
+ this.disposed = true;
253
+ if (this.master && (this.master as any).forks) {
254
+ const forkCacheKey = FlowEngine.generateApplyFlowCacheKey(`${this.forkId}`, 'all', this.uid);
255
+ this.flowEngine.applyFlowCache.delete(forkCacheKey);
256
+ (this.master as any).forks.delete(this as any);
257
+ }
258
+ // 从 master 的 forkCache 中移除自己
259
+ if (this.master && (this.master as any).forkCache) {
260
+ const forkCache = (this.master as any).forkCache;
261
+ for (const [key, fork] of forkCache.entries()) {
262
+ if (fork === this) {
263
+ forkCache.delete(key);
264
+ break;
265
+ }
266
+ }
267
+ }
268
+ }
269
+
270
+ /**
271
+ * 获取合并后的 props(master + localProps,local 优先)
272
+ */
273
+ getProps(): IModelComponentProps {
274
+ return { ...this.master.getProps(), ...this.localProps };
275
+ }
276
+
277
+ /**
278
+ * 检查属性是否为共享属性
279
+ */
280
+ private isSharedProperty(prop: string): boolean {
281
+ return ForkFlowModel.SHARED_PROPERTIES.includes(prop);
282
+ }
283
+ }
284
+
285
+ // 类型断言:让 ForkFlowModel 可以被当作 FlowModel 使用
286
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-unsafe-declaration-merging
287
+ export interface ForkFlowModel<TMaster extends FlowModel = FlowModel> extends FlowModel {}
@@ -0,0 +1,17 @@
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
+ export * from './flowModel';
11
+ export * from './forkFlowModel';
12
+
13
+ export * from './CollectionFieldModel';
14
+ export * from './DisplayItemModel';
15
+ export * from './EditableItemModel';
16
+ export * from './FilterableItemModel';
17
+ //
@@ -0,0 +1,101 @@
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 { App, ConfigProvider, theme } from 'antd';
11
+ import React, { createContext, useContext, useEffect } from 'react';
12
+ import { FlowEngineContext } from './flowContext';
13
+ import { FlowContextProvider } from './FlowContextProvider';
14
+ import { FlowEngine } from './flowEngine';
15
+ import { useDialog, useDrawer, usePage, usePopover } from './views';
16
+ import { FlowViewer } from './views/FlowView';
17
+
18
+ interface FlowEngineProviderProps {
19
+ engine: FlowEngine;
20
+ children: React.ReactNode;
21
+ }
22
+
23
+ const FlowEngineReactContext = createContext<FlowEngine | null>(null);
24
+
25
+ export const FlowEngineProvider: React.FC<FlowEngineProviderProps> = (props) => {
26
+ const { engine, children } = props;
27
+ if (!engine) {
28
+ throw new Error('FlowEngineProvider must be supplied with an engine.');
29
+ }
30
+ return (
31
+ <FlowEngineReactContext.Provider value={engine}>
32
+ <FlowContextProvider context={engine.context}>{children}</FlowContextProvider>
33
+ </FlowEngineReactContext.Provider>
34
+ );
35
+ };
36
+
37
+ export const FlowEngineGlobalsContextProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
38
+ const { modal, message, notification } = App.useApp();
39
+ const [drawer, contextHolder] = useDrawer();
40
+ const [embed, pageContextHolder] = usePage();
41
+ const [popover, popoverContextHolder] = usePopover();
42
+ const [dialog, dialogContextHolder] = useDialog();
43
+ const engine = useFlowEngine();
44
+ const config = useContext(ConfigProvider.ConfigContext);
45
+ const { token } = theme.useToken();
46
+
47
+ useEffect(() => {
48
+ const context = {
49
+ antdConfig: config,
50
+ // themeToken 改为可观察的 getter,在下方单独 define
51
+ modal,
52
+ message,
53
+ notification,
54
+ };
55
+ engine.context.defineProperty('viewer', {
56
+ cache: false,
57
+ get: (ctx) => new FlowViewer(ctx, { drawer, embed, popover, dialog }),
58
+ });
59
+ // 将 themeToken 定义为 observable, 使组件能够响应主题的变更
60
+ engine.context.defineProperty('themeToken', {
61
+ get: () => token,
62
+ observable: true,
63
+ cache: true,
64
+ });
65
+ for (const item of Object.entries(context)) {
66
+ const [key, value] = item;
67
+ if (value) {
68
+ engine.context.defineProperty(key, { value });
69
+ }
70
+ }
71
+ engine.reactView.refresh();
72
+ }, [engine, drawer, modal, message, notification, config, popover, token, dialog, embed]);
73
+
74
+ return (
75
+ <>
76
+ {children}
77
+ {contextHolder as any}
78
+ {popoverContextHolder as any}
79
+ {pageContextHolder as any}
80
+ {dialogContextHolder as any}
81
+ {/* The modal context is provided by App.useApp() */}
82
+ </>
83
+ );
84
+ };
85
+
86
+ export const useFlowEngine = (): FlowEngine => {
87
+ const context = useContext(FlowEngineReactContext);
88
+ if (!context) {
89
+ // This error should ideally not be hit if FlowEngineProvider is used correctly at the root
90
+ // and always supplied with an engine.
91
+ throw new Error(
92
+ 'useFlowEngine must be used within a FlowEngineProvider, and FlowEngineProvider must be supplied with an engine.',
93
+ );
94
+ }
95
+ return context;
96
+ };
97
+
98
+ export const useFlowEngineContext = (): FlowEngineContext => {
99
+ const engine = useFlowEngine();
100
+ return engine.context as FlowEngineContext;
101
+ };
@@ -0,0 +1,201 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import { describe, expect, it, vi } from 'vitest';
11
+ import { FlowEngine } from '../../flowEngine';
12
+ import { APIResource } from '../apiResource';
13
+ import { ResourceError } from '../flowResource';
14
+
15
+ function createAPIResource<T = any>() {
16
+ const engine = new FlowEngine();
17
+ return engine.createResource(APIResource);
18
+ }
19
+
20
+ describe('APIResource - request configuration', () => {
21
+ it('should get/set URL', () => {
22
+ const r = createAPIResource();
23
+
24
+ expect(r.getURL()).toBeUndefined();
25
+
26
+ const ret = r.setURL('/api/test');
27
+ expect(ret).toBe(r);
28
+ expect(r.getURL()).toBe('/api/test');
29
+ });
30
+
31
+ it('should set method, headers, params, body and custom options', () => {
32
+ const r = createAPIResource();
33
+
34
+ // method
35
+ const r1 = r.setRequestMethod('post');
36
+ expect(r1).toBe(r);
37
+
38
+ // headers add + remove
39
+ const r2 = r.addRequestHeader('X-Token', 'abc');
40
+ expect(r2).toBe(r);
41
+ const r3 = r.removeRequestHeader('X-Token');
42
+ expect(r3).toBe(r);
43
+ // removing non-existing header should be safe
44
+ const r4 = r.removeRequestHeader('X-Token');
45
+ expect(r4).toBe(r);
46
+
47
+ // params add/get/remove/clear/merge
48
+ const r5 = r.addRequestParameter('page', 1);
49
+ expect(r5).toBe(r);
50
+ expect(r.getRequestParameter('page')).toBe(1);
51
+
52
+ const r6 = r.removeRequestParameter('page');
53
+ expect(r6).toBe(r);
54
+ expect(r.getRequestParameter('page')).toBeNull();
55
+
56
+ // merge parameters
57
+ r.setRequestParameters({ a: 1, b: 2 });
58
+ r.setRequestParameters({ b: 3, c: 4 });
59
+ expect(r.getRequestParameter('a')).toBe(1);
60
+ expect(r.getRequestParameter('b')).toBe(3);
61
+ expect(r.getRequestParameter('c')).toBe(4);
62
+
63
+ const r7 = r.clearRequestParameters();
64
+ expect(r7).toBe(r);
65
+ expect(r.getRequestParameter('a')).toBeNull();
66
+ expect(r.getRequestParameter('b')).toBeNull();
67
+ expect(r.getRequestParameter('c')).toBeNull();
68
+
69
+ // body
70
+ const r8 = r.setRequestBody({ k: 'v' });
71
+ expect(r8).toBe(r);
72
+
73
+ // custom option
74
+ const r9 = r.setRequestOptions('timeout', 1000);
75
+ expect(r9).toBe(r);
76
+ });
77
+
78
+ it('setAPIClient should be chainable', () => {
79
+ const r = createAPIResource();
80
+ const api = { request: vi.fn() };
81
+ const ret = r.setAPIClient(api as any);
82
+ expect(ret).toBe(r);
83
+ });
84
+ });
85
+
86
+ describe('APIResource - loading meta', () => {
87
+ it('should read and write loading via meta', () => {
88
+ const r = createAPIResource();
89
+
90
+ expect(r.loading).toBe(false);
91
+
92
+ r.loading = true;
93
+ expect(r.loading).toBe(true);
94
+ expect(r.getMeta('loading')).toBe(true);
95
+
96
+ r.loading = false;
97
+ expect(r.loading).toBe(false);
98
+ expect(r.getMeta('loading')).toBe(false);
99
+ });
100
+ });
101
+
102
+ describe('APIResource - refresh', () => {
103
+ it('should fetch data successfully and emit refresh event', async () => {
104
+ const r = createAPIResource();
105
+ const api = {
106
+ request: vi.fn().mockResolvedValue({ data: { ok: 1 } }),
107
+ };
108
+
109
+ const onRefresh = vi.fn();
110
+ r.on('refresh', onRefresh);
111
+
112
+ r.setAPIClient(api as any);
113
+ r.setURL('/foo');
114
+ r.setRequestMethod('get');
115
+ r.addRequestHeader('Accept', 'application/json');
116
+ r.setRequestParameters({ a: 1 });
117
+ r.setRequestBody(null);
118
+
119
+ await r.refresh();
120
+
121
+ // data is set
122
+ expect(r.getData()).toEqual({ ok: 1 });
123
+ // no error
124
+ expect(r.getError()).toBeNull();
125
+ // event emitted
126
+ expect(onRefresh).toHaveBeenCalledTimes(1);
127
+
128
+ // API called with merged options
129
+ expect(api.request).toHaveBeenCalledTimes(1);
130
+ const callArg = api.request.mock.calls[0][0];
131
+ expect(callArg.url).toBe('/foo');
132
+ expect(callArg.method).toBe('get');
133
+ expect(callArg.headers).toBeTruthy();
134
+ expect(callArg.params).toEqual({ a: 1 });
135
+ // data stays as set in request
136
+ expect(Object.prototype.hasOwnProperty.call(callArg, 'data')).toBe(true);
137
+ });
138
+
139
+ it('should set ResourceError and rethrow on failure', async () => {
140
+ const r = createAPIResource();
141
+ const api = {
142
+ request: vi.fn().mockRejectedValue({
143
+ response: { data: { error: { message: 'boom', code: 'X' } } },
144
+ }),
145
+ };
146
+ const onRefresh = vi.fn();
147
+ r.on('refresh', onRefresh);
148
+
149
+ r.setAPIClient(api as any);
150
+ r.setURL('/err');
151
+
152
+ // preset data to ensure unchanged on error
153
+ r.setData({ before: true });
154
+
155
+ await expect(r.refresh()).rejects.toBeInstanceOf(ResourceError);
156
+
157
+ expect(r.getError()).toBeInstanceOf(ResourceError);
158
+ // data unchanged
159
+ expect(r.getData()).toEqual({ before: true });
160
+ // no refresh event on failure
161
+ expect(onRefresh).not.toHaveBeenCalled();
162
+ });
163
+
164
+ it('should throw if API client not set', async () => {
165
+ const r = createAPIResource();
166
+ r.setURL('/no-api');
167
+ await expect(r.refresh()).rejects.toThrowError('API client not set');
168
+ });
169
+ });
170
+
171
+ describe('APIResource - getRequestOptions', () => {
172
+ it('should return current request options and reflect updates (same reference)', () => {
173
+ const r = createAPIResource();
174
+
175
+ r.setURL('/api/x')
176
+ .setRequestMethod('post')
177
+ .addRequestHeader('X-Token', 'abc')
178
+ .setRequestParameters({ a: 1 })
179
+ .setRequestBody({ k: 'v' })
180
+ .setRequestOptions('timeout', 1000);
181
+
182
+ const opts = r.getRequestOptions();
183
+
184
+ expect(opts.url).toBe('/api/x');
185
+ expect(opts.method).toBe('post');
186
+ expect(opts.headers).toEqual({ 'X-Token': 'abc' });
187
+ expect(opts.params).toEqual({ a: 1 });
188
+ expect(opts.data).toEqual({ k: 'v' });
189
+ expect(opts.timeout).toBe(1000);
190
+
191
+ // mutate returned options -> internal state reflects
192
+ opts.params.page = 2;
193
+ expect(r.getRequestParameter('page')).toBe(2);
194
+
195
+ delete opts.headers['X-Token'];
196
+ expect(r.getRequestOptions().headers['X-Token']).toBeUndefined();
197
+
198
+ r.clearRequestParameters();
199
+ expect(r.getRequestOptions().params).toEqual({});
200
+ });
201
+ });