@nocobase/flow-engine 2.0.0-alpha.3 → 2.0.0-alpha.30

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 (418) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +90 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +4 -2
  6. package/lib/JSRunner.js +3 -0
  7. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  8. package/lib/components/FieldModelRenderer.js +10 -4
  9. package/lib/components/FieldSkeleton.d.ts +10 -0
  10. package/lib/components/FieldSkeleton.js +64 -0
  11. package/lib/components/FlowContextSelector.js +7 -2
  12. package/lib/components/FlowModelRenderer.d.ts +2 -5
  13. package/lib/components/FlowModelRenderer.js +16 -47
  14. package/lib/components/FormItem.js +5 -1
  15. package/lib/{runjs-context/snippets/global/requireAsync.snippet.d.ts → components/dnd/findModelUidPosition.d.ts} +4 -7
  16. package/lib/{runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js → components/dnd/findModelUidPosition.js} +23 -19
  17. package/lib/components/dnd/gridDragPlanner.d.ts +130 -0
  18. package/lib/components/dnd/gridDragPlanner.js +497 -0
  19. package/lib/components/dnd/index.d.ts +2 -2
  20. package/lib/components/dnd/index.js +5 -5
  21. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  22. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  23. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  25. package/lib/components/variables/VariableInput.js +16 -2
  26. package/lib/components/variables/VariableTag.js +43 -2
  27. package/lib/components/variables/types.d.ts +2 -0
  28. package/lib/data-source/index.d.ts +12 -4
  29. package/lib/data-source/index.js +19 -13
  30. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  31. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  32. package/lib/executor/FlowExecutor.d.ts +4 -5
  33. package/lib/executor/FlowExecutor.js +135 -100
  34. package/lib/flowContext.d.ts +33 -5
  35. package/lib/flowContext.js +193 -76
  36. package/lib/flowEngine.d.ts +8 -1
  37. package/lib/flowEngine.js +18 -6
  38. package/lib/flowSettings.d.ts +2 -1
  39. package/lib/flowSettings.js +12 -8
  40. package/lib/hooks/useApplyAutoFlows.js +2 -1
  41. package/lib/index.d.ts +7 -1
  42. package/lib/index.js +32 -3
  43. package/lib/locale/en-US.json +4 -2
  44. package/lib/locale/index.d.ts +4 -0
  45. package/lib/locale/zh-CN.json +4 -2
  46. package/lib/models/CollectionFieldModel.d.ts +2 -0
  47. package/lib/models/CollectionFieldModel.js +43 -3
  48. package/lib/models/flowModel.d.ts +28 -29
  49. package/lib/models/flowModel.js +114 -92
  50. package/lib/models/forkFlowModel.d.ts +4 -4
  51. package/lib/models/forkFlowModel.js +32 -8
  52. package/lib/provider.d.ts +3 -1
  53. package/lib/provider.js +7 -5
  54. package/lib/resources/multiRecordResource.js +2 -0
  55. package/lib/resources/singleRecordResource.js +1 -0
  56. package/lib/resources/sqlResource.d.ts +1 -0
  57. package/lib/resources/sqlResource.js +20 -24
  58. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  60. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  62. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  64. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  65. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  66. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  67. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  68. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  69. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  70. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  71. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  72. package/lib/runjs-context/contexts/base.d.ts +9 -0
  73. package/lib/runjs-context/contexts/base.js +183 -0
  74. package/lib/runjs-context/helpers.d.ts +5 -2
  75. package/lib/runjs-context/helpers.js +36 -27
  76. package/lib/runjs-context/registry.d.ts +7 -4
  77. package/lib/runjs-context/registry.js +10 -42
  78. package/lib/runjs-context/setup.d.ts +9 -0
  79. package/lib/runjs-context/setup.js +82 -0
  80. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  81. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  82. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  83. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  84. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  85. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  86. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  87. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  88. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  89. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  90. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  92. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  93. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  94. package/lib/runjs-context/snippets/index.d.ts +14 -3
  95. package/lib/runjs-context/snippets/index.js +161 -40
  96. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  97. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  98. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  99. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  100. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  101. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  102. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  103. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  105. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  107. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  109. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  111. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  113. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  115. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  117. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  119. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  121. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  123. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  125. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  127. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  129. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  131. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  133. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  135. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  137. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  139. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  141. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  143. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  145. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  147. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  149. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  151. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  153. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  155. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  157. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  159. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  161. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  163. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  165. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  167. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  169. package/lib/runjs-context/snippets/types.d.ts +9 -1
  170. package/lib/types.d.ts +28 -3
  171. package/lib/types.js +4 -3
  172. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  173. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  174. package/lib/utils/createEphemeralContext.d.ts +13 -0
  175. package/lib/utils/createEphemeralContext.js +140 -0
  176. package/lib/utils/index.d.ts +3 -2
  177. package/lib/utils/index.js +5 -2
  178. package/lib/utils/jsxTransform.d.ts +15 -0
  179. package/lib/utils/jsxTransform.js +68 -0
  180. package/lib/utils/params-resolvers.js +3 -3
  181. package/lib/utils/safeGlobals.d.ts +5 -3
  182. package/lib/utils/safeGlobals.js +40 -0
  183. package/lib/utils/schema-utils.js +2 -2
  184. package/lib/utils/serverContextParams.d.ts +1 -0
  185. package/lib/utils/variablesParams.d.ts +9 -5
  186. package/lib/utils/variablesParams.js +47 -36
  187. package/lib/views/PageComponent.js +2 -1
  188. package/lib/views/createViewMeta.d.ts +29 -1
  189. package/lib/views/createViewMeta.js +338 -72
  190. package/lib/views/index.d.ts +1 -0
  191. package/lib/views/index.js +3 -0
  192. package/lib/views/useDialog.d.ts +8 -8
  193. package/lib/views/useDialog.js +8 -7
  194. package/lib/views/useDrawer.d.ts +8 -8
  195. package/lib/views/useDrawer.js +40 -26
  196. package/lib/views/usePage.d.ts +8 -8
  197. package/lib/views/usePage.js +8 -7
  198. package/package.json +5 -3
  199. package/src/BlockScopedFlowEngine.ts +86 -0
  200. package/src/FlowContextProvider.tsx +4 -2
  201. package/src/JSRunner.ts +3 -0
  202. package/src/ViewScopedFlowEngine.ts +1 -1
  203. package/src/__tests__/JSRunner.test.ts +62 -53
  204. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  205. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  206. package/src/__tests__/flow-engine.test.ts +3 -0
  207. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  208. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  209. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  210. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  211. package/src/__tests__/runjsContext.test.ts +216 -35
  212. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  213. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  214. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  215. package/src/__tests__/runjsLocales.test.ts +36 -0
  216. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  217. package/src/__tests__/runjsSnippets.test.ts +140 -0
  218. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  219. package/src/components/DynamicFlowsEditor.tsx +3 -4
  220. package/src/components/FieldModelRenderer.tsx +16 -5
  221. package/src/components/FieldSkeleton.tsx +27 -0
  222. package/src/components/FlowContextSelector.tsx +6 -2
  223. package/src/components/FlowModelRenderer.tsx +30 -78
  224. package/src/components/FormItem.tsx +8 -1
  225. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  226. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  227. package/src/components/dnd/README.md +149 -0
  228. package/src/components/dnd/findModelUidPosition.ts +26 -0
  229. package/src/components/dnd/gridDragPlanner.ts +659 -0
  230. package/src/components/dnd/index.tsx +3 -3
  231. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  232. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  233. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  234. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  235. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +424 -0
  236. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  237. package/src/components/variables/VariableInput.tsx +22 -2
  238. package/src/components/variables/VariableTag.tsx +54 -2
  239. package/src/components/variables/types.ts +2 -0
  240. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  241. package/src/data-source/index.ts +17 -11
  242. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  243. package/src/executor/FlowExecutor.ts +178 -121
  244. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  245. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  246. package/src/flowContext.ts +266 -97
  247. package/src/flowEngine.ts +21 -6
  248. package/src/flowSettings.ts +9 -4
  249. package/src/hooks/useApplyAutoFlows.ts +3 -1
  250. package/src/index.ts +12 -1
  251. package/src/locale/en-US.json +4 -2
  252. package/src/locale/zh-CN.json +4 -2
  253. package/src/models/CollectionFieldModel.tsx +43 -4
  254. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  255. package/src/models/__tests__/flowModel.test.ts +234 -111
  256. package/src/models/__tests__/forkFlowModel.test.ts +22 -7
  257. package/src/models/flowModel.tsx +149 -125
  258. package/src/models/forkFlowModel.ts +41 -8
  259. package/src/provider.tsx +10 -7
  260. package/src/resources/multiRecordResource.ts +2 -0
  261. package/src/resources/singleRecordResource.ts +1 -0
  262. package/src/resources/sqlResource.ts +20 -25
  263. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  264. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  265. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  266. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  267. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  268. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  269. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  270. package/src/runjs-context/contexts/base.ts +171 -0
  271. package/src/runjs-context/helpers.ts +32 -30
  272. package/src/runjs-context/registry.ts +16 -47
  273. package/src/runjs-context/setup.ts +51 -0
  274. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  275. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  276. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  277. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  278. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  279. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  280. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  281. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  282. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  283. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  284. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  285. package/src/runjs-context/snippets/index.ts +177 -39
  286. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  287. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  288. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  289. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  290. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  291. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  292. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  293. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  294. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  295. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  296. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  297. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  298. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  299. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  300. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  301. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  302. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  303. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  304. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  305. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  306. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  307. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  308. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  309. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  310. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  311. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  312. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  313. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  314. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  315. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  316. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  317. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  318. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  319. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  320. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  321. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  322. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  323. package/src/runjs-context/snippets/types.ts +5 -1
  324. package/src/types.ts +34 -0
  325. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  326. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  327. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  328. package/src/utils/createEphemeralContext.ts +142 -0
  329. package/src/utils/index.ts +2 -2
  330. package/src/utils/jsxTransform.ts +39 -0
  331. package/src/utils/params-resolvers.ts +2 -2
  332. package/src/utils/safeGlobals.ts +49 -3
  333. package/src/utils/schema-utils.ts +1 -1
  334. package/src/utils/serverContextParams.ts +1 -0
  335. package/src/utils/variablesParams.ts +50 -38
  336. package/src/views/PageComponent.tsx +1 -1
  337. package/src/views/createViewMeta.ts +393 -70
  338. package/src/views/index.tsx +1 -0
  339. package/src/views/useDialog.tsx +12 -10
  340. package/src/views/useDrawer.tsx +60 -36
  341. package/src/views/usePage.tsx +13 -10
  342. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  343. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  344. package/lib/components/dnd/moveBlock.d.ts +0 -33
  345. package/lib/components/dnd/moveBlock.js +0 -302
  346. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  347. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  348. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  349. package/lib/runjs-context/index.d.ts +0 -19
  350. package/lib/runjs-context/index.js +0 -57
  351. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  352. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  353. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  354. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  355. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  356. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  357. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  358. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  359. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  360. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  361. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  362. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  363. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  364. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  365. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  366. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  367. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  368. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  369. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  370. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  371. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  372. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  373. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  374. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  375. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  376. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  377. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  378. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  379. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  380. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  381. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  382. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  383. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  384. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  385. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  386. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  387. package/src/components/dnd/moveBlock.ts +0 -379
  388. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  389. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  390. package/src/runjs-context/index.ts +0 -20
  391. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  392. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  393. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  394. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  395. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  396. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  397. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  398. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  399. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  400. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  401. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  402. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  403. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  404. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  405. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  406. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  407. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  408. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  409. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  410. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  411. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  412. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  413. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  414. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  415. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  416. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  417. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  418. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -62,7 +62,6 @@ var import_StepSettingsDialog = require("../components/settings/wrappers/context
62
62
  var import_emitter = require("../emitter");
63
63
  var import_InstanceFlowRegistry = require("../flow-registry/InstanceFlowRegistry");
64
64
  var import_flowContext = require("../flowContext");
65
- var import_flowEngine = require("../flowEngine");
66
65
  var import_utils = require("../utils");
67
66
  var import_lib = require("antd/lib");
68
67
  var import_ModelActionRegistry = require("../action-registry/ModelActionRegistry");
@@ -94,6 +93,7 @@ const _FlowModel = class _FlowModel {
94
93
  __publicField(this, "_title");
95
94
  __publicField(this, "isNew", false);
96
95
  // 标记是否为新建状态
96
+ __publicField(this, "skeleton", null);
97
97
  /**
98
98
  * 所有 fork 实例的引用集合。
99
99
  * 使用 Set 便于在销毁时主动遍历并调用 dispose,避免悬挂引用。
@@ -105,7 +105,7 @@ const _FlowModel = class _FlowModel {
105
105
  */
106
106
  __publicField(this, "forkCache", /* @__PURE__ */ new Map());
107
107
  /**
108
- * 上一次 applyAutoFlows 的执行参数
108
+ * 上一次 beforeRender 的执行参数
109
109
  */
110
110
  __publicField(this, "_lastAutoRunParams", null);
111
111
  __publicField(this, "observerDispose");
@@ -120,18 +120,22 @@ const _FlowModel = class _FlowModel {
120
120
  __publicField(this, "_reactiveWrapperCache");
121
121
  __publicField(this, "flowRegistry");
122
122
  __publicField(this, "_cleanRun");
123
- __publicField(this, "_dispatchEventWithDebounce", import_lodash.default.debounce(async (eventName, inputArgs) => {
124
- return this._dispatchEvent(eventName, inputArgs);
125
- }, 100));
123
+ __publicField(this, "_dispatchEventWithDebounce", import_lodash.default.debounce(
124
+ async (eventName, inputArgs, options) => {
125
+ return this._dispatchEvent(eventName, inputArgs, options);
126
+ },
127
+ 100
128
+ ));
126
129
  /**
127
- * 重新执行上一次的 applyAutoFlows,保持参数一致
130
+ * 重新执行上一次的 beforeRender,保持参数一致
128
131
  * 如果之前没有执行过,则直接跳过
129
132
  * 使用 lodash debounce 避免频繁调用
130
133
  */
131
134
  __publicField(this, "_rerunLastAutoRun", import_lodash.default.debounce(async () => {
132
135
  if (this._lastAutoRunParams) {
133
136
  try {
134
- await this.applyAutoFlows(...this._lastAutoRunParams);
137
+ const [inputArgs] = this._lastAutoRunParams;
138
+ await this.dispatchEvent("beforeRender", inputArgs);
135
139
  } catch (error) {
136
140
  console.error("FlowModel._rerunLastAutoRun: Error during rerun:", error);
137
141
  }
@@ -172,7 +176,7 @@ const _FlowModel = class _FlowModel {
172
176
  return;
173
177
  }
174
178
  if (this.flowEngine) {
175
- this.invalidateAutoFlowCache();
179
+ this.invalidateFlowCache("beforeRender");
176
180
  }
177
181
  this._rerunLastAutoRun();
178
182
  this.forks.forEach((fork) => {
@@ -342,13 +346,57 @@ const _FlowModel = class _FlowModel {
342
346
  }
343
347
  });
344
348
  }
345
- invalidateAutoFlowCache(deep = false) {
349
+ /**
350
+ * 失效指定事件的流程缓存;未指定 eventName 时,失效当前模型全部事件缓存。
351
+ * - 默认 beforeRender 与其它事件共享同一缓存体系:prefix=`event:${scope}`,flowKey=`eventName`,uid=`model.uid`
352
+ */
353
+ invalidateFlowCache(eventName, deep = false) {
346
354
  if (this.flowEngine) {
347
- const cacheKey = import_flowEngine.FlowEngine.generateApplyFlowCacheKey("autoFlow", "all", this.uid);
348
- this.flowEngine.applyFlowCache.delete(cacheKey);
355
+ const scope = `event:${this.getFlowCacheScope(eventName || "beforeRender")}`;
356
+ const cache = this.flowEngine.applyFlowCache;
357
+ if (eventName) {
358
+ const altScope = scope.replace(/:/g, "-");
359
+ const uidSuffixes = [`:${this.uid}`, `-${this.uid}`];
360
+ const eventSegments = [`:${eventName}:`, `-${eventName}-`];
361
+ for (const key of cache.keys()) {
362
+ const startMatches = key.startsWith(scope) || key.startsWith(altScope);
363
+ const endMatches = uidSuffixes.some((s) => key.endsWith(s));
364
+ const eventMatches = eventSegments.some((seg) => key.includes(seg));
365
+ if (startMatches && endMatches && eventMatches) {
366
+ cache.delete(key);
367
+ }
368
+ }
369
+ } else {
370
+ const altScope = `${scope}:`.replace(/:/g, "-");
371
+ const prefixes = [`${scope}:`, altScope];
372
+ const uidSuffixes = [`:${this.uid}`, `-${this.uid}`];
373
+ for (const key of cache.keys()) {
374
+ const startMatches = prefixes.some((p) => key.startsWith(p));
375
+ const endMatches = uidSuffixes.some((s) => key.endsWith(s));
376
+ if (startMatches && endMatches) cache.delete(key);
377
+ }
378
+ }
349
379
  this.forks.forEach((fork) => {
350
- const forkCacheKey = import_flowEngine.FlowEngine.generateApplyFlowCacheKey(`${fork["forkId"]}`, "all", this.uid);
351
- this.flowEngine.applyFlowCache.delete(forkCacheKey);
380
+ var _a;
381
+ const forkScope = `event:${((_a = fork.getFlowCacheScope) == null ? void 0 : _a.call(fork, eventName || "beforeRender")) ?? String(fork["forkId"])}`;
382
+ const altForkScope = forkScope.replace(/:/g, "-");
383
+ const uidSuffixes = [`:${this.uid}`, `-${this.uid}`];
384
+ if (eventName) {
385
+ const eventSegments = [`:${eventName}:`, `-${eventName}-`];
386
+ for (const key of this.flowEngine.applyFlowCache.keys()) {
387
+ const startMatches = key.startsWith(forkScope) || key.startsWith(altForkScope);
388
+ const endMatches = uidSuffixes.some((s) => key.endsWith(s));
389
+ const eventMatches = eventSegments.some((seg) => key.includes(seg));
390
+ if (startMatches && endMatches && eventMatches) this.flowEngine.applyFlowCache.delete(key);
391
+ }
392
+ } else {
393
+ const prefixes = [`${forkScope}:`, `${altForkScope}-`];
394
+ for (const key of this.flowEngine.applyFlowCache.keys()) {
395
+ const startMatches = prefixes.some((p) => key.startsWith(p));
396
+ const endMatches = uidSuffixes.some((s) => key.endsWith(s));
397
+ if (startMatches && endMatches) this.flowEngine.applyFlowCache.delete(key);
398
+ }
399
+ }
352
400
  });
353
401
  }
354
402
  if (deep) {
@@ -357,10 +405,10 @@ const _FlowModel = class _FlowModel {
357
405
  const subModelValue = this.subModels[subModelKey];
358
406
  if (Array.isArray(subModelValue)) {
359
407
  for (const subModel of subModelValue) {
360
- subModel.invalidateAutoFlowCache(deep);
408
+ subModel.invalidateFlowCache(eventName, deep);
361
409
  }
362
410
  } else if (subModelValue instanceof _FlowModel) {
363
- subModelValue.invalidateAutoFlowCache(deep);
411
+ subModelValue.invalidateFlowCache(eventName, deep);
364
412
  }
365
413
  }
366
414
  }
@@ -544,7 +592,7 @@ const _FlowModel = class _FlowModel {
544
592
  );
545
593
  return currentFlowEngine.executor.runFlow(target, flowKey, inputArgs, runId);
546
594
  }
547
- async _dispatchEvent(eventName, inputArgs) {
595
+ async _dispatchEvent(eventName, inputArgs, options) {
548
596
  const currentFlowEngine = this.flowEngine;
549
597
  if (!currentFlowEngine) {
550
598
  console.warn("FlowEngine not available on this model for dispatchEvent. Please set flowEngine on the model.");
@@ -555,93 +603,63 @@ const _FlowModel = class _FlowModel {
555
603
  console.log(
556
604
  `[FlowModel] dispatchEvent: uid=${this.uid}, event=${eventName}, isFork=${isFork}, cleanRun=${this.cleanRun}, targetIsFork=${(target == null ? void 0 : target.isFork) === true}`
557
605
  );
558
- await currentFlowEngine.executor.dispatchEvent(target, eventName, inputArgs);
606
+ return await currentFlowEngine.executor.dispatchEvent(target, eventName, inputArgs, options);
559
607
  }
560
608
  async dispatchEvent(eventName, inputArgs, options) {
609
+ const isBeforeRender = eventName === "beforeRender";
610
+ const defaults = isBeforeRender ? { sequential: true, useCache: true } : {};
611
+ const execOptions = {
612
+ sequential: (options == null ? void 0 : options.sequential) ?? defaults.sequential,
613
+ useCache: (options == null ? void 0 : options.useCache) ?? defaults.useCache
614
+ };
615
+ if (isBeforeRender) {
616
+ this._lastAutoRunParams = [inputArgs, execOptions.useCache];
617
+ }
561
618
  if (options == null ? void 0 : options.debounce) {
562
- return this._dispatchEventWithDebounce(eventName, inputArgs);
619
+ return this._dispatchEventWithDebounce(eventName, inputArgs, execOptions);
563
620
  }
564
- return this._dispatchEvent(eventName, inputArgs);
621
+ return this._dispatchEvent(eventName, inputArgs, execOptions);
565
622
  }
566
623
  /**
567
- * 获取所有自动应用流程定义(保持 getFlows 的顺序,即按 sort 排序)
568
- * @returns {FlowDefinition[]} 自动应用流程定义数组(已按 sort 排序)
624
+ * 按事件名获取对应的流程集合(保持 getFlows 的顺序,即按 sort 排序)。
625
+ * - beforeRender 兼容:除显式 on: 'beforeRender' 外,包含未声明 on 且 manual !== true 的流程。
569
626
  */
570
- getAutoFlows() {
627
+ getEventFlows(eventName) {
571
628
  const allFlows = this.getFlows();
572
- const autoFlows = Array.from(allFlows.values()).filter((flow) => {
573
- if (flow.on) {
574
- return false;
629
+ const beforeRender = eventName === "beforeRender";
630
+ const isMatch = /* @__PURE__ */ __name((flow) => {
631
+ var _a;
632
+ if (beforeRender) {
633
+ if (flow.manual === true) return false;
634
+ if (!flow.on) return true;
635
+ return typeof flow.on === "string" ? flow.on === "beforeRender" : ((_a = flow.on) == null ? void 0 : _a.eventName) === "beforeRender";
575
636
  }
576
- if (flow.manual === true) {
577
- return false;
578
- }
579
- return true;
580
- });
581
- return autoFlows;
637
+ const on = flow.on;
638
+ if (!on) return false;
639
+ return typeof on === "string" ? on === eventName : (on == null ? void 0 : on.eventName) === eventName;
640
+ }, "isMatch");
641
+ return Array.from(allFlows.values()).filter(isMatch);
582
642
  }
583
643
  /**
584
- * 自动流程执行前钩子。
585
- * 子类可覆盖;可抛出 FlowExitException 提前终止。
644
+ * 通用事件分发钩子:开始
645
+ * 子类可覆盖;beforeRender 事件可通过抛出 FlowExitException 提前终止。
586
646
  */
587
- async onBeforeAutoFlows(inputArgs) {
647
+ async onDispatchEventStart(eventName, options, inputArgs) {
588
648
  }
589
649
  /**
590
- * 自动流程执行后钩子。
650
+ * 通用事件分发钩子:结束
591
651
  * 子类可覆盖。
592
652
  */
593
- async onAfterAutoFlows(results, inputArgs) {
653
+ async onDispatchEventEnd(eventName, options, inputArgs, results) {
594
654
  }
595
655
  /**
596
- * 自动流程错误钩子。
656
+ * 通用事件分发钩子:错误
597
657
  * 子类可覆盖。
598
658
  */
599
- async onAutoFlowsError(error, inputArgs) {
659
+ async onDispatchEventError(eventName, options, inputArgs, error) {
600
660
  }
601
661
  useHooksBeforeRender() {
602
662
  }
603
- async applyAutoFlows(...args) {
604
- var _a, _b;
605
- const [inputArgs, useCache = true] = args;
606
- const cacheKey = useCache ? import_flowEngine.FlowEngine.generateApplyFlowCacheKey(this["forkId"] ?? "autoFlow", "all", this.uid) : null;
607
- if (!import_lodash.default.isEqual(inputArgs, (_a = this._lastAutoRunParams) == null ? void 0 : _a[0]) && cacheKey) {
608
- this.flowEngine.applyFlowCache.delete(cacheKey);
609
- }
610
- this._lastAutoRunParams = args;
611
- try {
612
- await this.onBeforeAutoFlows(inputArgs);
613
- } catch (error) {
614
- if (error instanceof import_utils.FlowExitException) {
615
- (_b = this.context.logger) == null ? void 0 : _b.debug(`[FlowModel.applyAutoFlows] ${error.message}`);
616
- return [];
617
- }
618
- try {
619
- await this.onAutoFlowsError(error, inputArgs);
620
- } catch (_2) {
621
- }
622
- throw error;
623
- }
624
- let results = [];
625
- try {
626
- results = await this.flowEngine.executor.runAutoFlows(this, inputArgs, useCache);
627
- } catch (error) {
628
- try {
629
- await this.onAutoFlowsError(error, inputArgs);
630
- } catch (_2) {
631
- }
632
- throw error;
633
- }
634
- try {
635
- await this.onAfterAutoFlows(results, inputArgs);
636
- } catch (error) {
637
- try {
638
- await this.onAutoFlowsError(error, inputArgs);
639
- } catch (_2) {
640
- }
641
- throw error;
642
- }
643
- return results;
644
- }
645
663
  /**
646
664
  * 智能检测是否应该跳过响应式包装
647
665
  * 说明:
@@ -717,6 +735,7 @@ const _FlowModel = class _FlowModel {
717
735
  }
718
736
  return (_c = modelInstance.renderHiddenInConfig) == null ? void 0 : _c.call(modelInstance);
719
737
  }
738
+ modelInstance.stepParams;
720
739
  return originalRender.call(renderTarget);
721
740
  });
722
741
  ReactiveWrapper.displayName = `ReactiveWrapper(${modelInstance.constructor.name})`;
@@ -768,13 +787,13 @@ const _FlowModel = class _FlowModel {
768
787
  }
769
788
  async rerender() {
770
789
  var _a;
771
- await this.applyAutoFlows((_a = this._lastAutoRunParams) == null ? void 0 : _a[0], false);
790
+ await this.dispatchEvent("beforeRender", (_a = this._lastAutoRunParams) == null ? void 0 : _a[0], { useCache: false });
772
791
  }
773
792
  /**
774
- * 自动流程缓存的作用域标识;fork 实例可覆盖以区分缓存。
793
+ * 事件缓存的作用域标识;可按事件区分(默认与事件无关的 scope 返回 'default')。
775
794
  */
776
- getAutoFlowCacheScope() {
777
- return "autoFlow";
795
+ getFlowCacheScope(eventName) {
796
+ return String(eventName);
778
797
  }
779
798
  setParent(parent) {
780
799
  const isValidParent = parent && (parent.constructor === _FlowModel || (0, import_utils.isInheritedFrom)(parent.constructor, _FlowModel));
@@ -892,10 +911,13 @@ const _FlowModel = class _FlowModel {
892
911
  createRootModel(options) {
893
912
  return this.flowEngine.createModel(options);
894
913
  }
895
- async applySubModelsAutoFlows(subKey, inputArgs, shared) {
914
+ /**
915
+ * 对指定子模型派发 beforeRender 事件(顺序执行并使用缓存)。
916
+ */
917
+ async applySubModelsBeforeRenderFlows(subKey, inputArgs, shared) {
896
918
  await Promise.all(
897
919
  this.mapSubModels(subKey, async (sub) => {
898
- await sub.applyAutoFlows(inputArgs);
920
+ await sub.dispatchEvent("beforeRender", inputArgs);
899
921
  })
900
922
  );
901
923
  }
@@ -913,7 +935,7 @@ const _FlowModel = class _FlowModel {
913
935
  return cachedFork;
914
936
  }
915
937
  }
916
- const forkId = this.forks.size;
938
+ const forkId = (0, import_secure.uid)();
917
939
  const fork = new import_forkFlowModel.ForkFlowModel(this, localProps, forkId);
918
940
  if ((options == null ? void 0 : options.register) !== false) {
919
941
  this.forks.add(fork);
@@ -952,7 +974,7 @@ const _FlowModel = class _FlowModel {
952
974
  throw new Error("FlowEngine is not set on this model. Please set flowEngine before saving.");
953
975
  }
954
976
  this.observerDispose();
955
- this.invalidateAutoFlowCache(true);
977
+ this.invalidateFlowCache("beforeRender", true);
956
978
  return this.flowEngine.removeModel(this.uid);
957
979
  }
958
980
  async save() {
@@ -969,7 +991,7 @@ const _FlowModel = class _FlowModel {
969
991
  throw new Error("FlowEngine is not set on this model. Please set flowEngine before deleting.");
970
992
  }
971
993
  this.observerDispose();
972
- this.invalidateAutoFlowCache(true);
994
+ this.invalidateFlowCache("beforeRender", true);
973
995
  return this.flowEngine.destroyModel(this.uid);
974
996
  }
975
997
  /**
@@ -1032,7 +1054,8 @@ const _FlowModel = class _FlowModel {
1032
1054
  uid: this.uid,
1033
1055
  ...import_lodash.default.omit(this._options, ["flowEngine"]),
1034
1056
  stepParams: this.stepParams,
1035
- sortIndex: this.sortIndex
1057
+ sortIndex: this.sortIndex,
1058
+ flowRegistry: {}
1036
1059
  };
1037
1060
  const subModels = this.subModels;
1038
1061
  for (const subModelKey in subModels) {
@@ -1047,8 +1070,7 @@ const _FlowModel = class _FlowModel {
1047
1070
  }
1048
1071
  }
1049
1072
  for (const [key, flow] of this.flowRegistry.getFlows()) {
1050
- data["flowRegistry"] = data["flowRegistry"] || {};
1051
- data["flowRegistry"][key] = flow.toData();
1073
+ data.flowRegistry[key] = flow.toData();
1052
1074
  }
1053
1075
  return data;
1054
1076
  }
@@ -31,7 +31,7 @@ export declare class ForkFlowModel<TMaster extends FlowModel = FlowModel> {
31
31
  /** 是否已被释放 */
32
32
  private disposed;
33
33
  /** fork 在 master.forks 中的索引 */
34
- readonly forkId: number;
34
+ readonly forkId: string;
35
35
  /** 需要与 master 共享的属性列表 */
36
36
  private static readonly SHARED_PROPERTIES;
37
37
  /**
@@ -48,7 +48,7 @@ export declare class ForkFlowModel<TMaster extends FlowModel = FlowModel> {
48
48
  * 注意:此属性通过 Proxy 在 get/set 陷阱中被动态访问,IDE 可能无法检测到使用, 切勿删除!
49
49
  */
50
50
  private localProperties;
51
- constructor(master: TMaster, initialProps?: IModelComponentProps, forkId?: number);
51
+ constructor(master: TMaster, initialProps?: IModelComponentProps, forkId?: string);
52
52
  get context(): FlowModelContext;
53
53
  /**
54
54
  * 获取对象及其原型链上的属性描述符
@@ -63,9 +63,9 @@ export declare class ForkFlowModel<TMaster extends FlowModel = FlowModel> {
63
63
  */
64
64
  render(): any;
65
65
  /**
66
- * 自动流程缓存的作用域标识(fork 专用)。
66
+ * 事件缓存的作用域标识(fork 专用)。
67
67
  */
68
- getAutoFlowCacheScope(): string;
68
+ getFlowCacheScope(eventName: string): string;
69
69
  /**
70
70
  * 释放 fork:从 master.forks 中移除自身并断开引用
71
71
  */
@@ -38,10 +38,10 @@ __export(forkFlowModel_exports, {
38
38
  module.exports = __toCommonJS(forkFlowModel_exports);
39
39
  var import_reactive = require("@formily/reactive");
40
40
  var import_flowContext = require("../flowContext");
41
- var import_flowEngine = require("../flowEngine");
41
+ var import_secure = require("uid/secure");
42
42
  var _flowContext;
43
43
  const _ForkFlowModel = class _ForkFlowModel {
44
- constructor(master, initialProps = {}, forkId = 0) {
44
+ constructor(master, initialProps = {}, forkId) {
45
45
  /** 与 master 相同的 UID,用于日志调试 */
46
46
  __publicField(this, "uid");
47
47
  /** 调试标识,便于在日志或断言中快速识别 */
@@ -65,7 +65,7 @@ const _ForkFlowModel = class _ForkFlowModel {
65
65
  this.master = master;
66
66
  this.uid = master.uid;
67
67
  this.localProps = { ...initialProps };
68
- this.forkId = forkId;
68
+ this.forkId = forkId || (0, import_secure.uid)();
69
69
  this.hidden = this.master.hidden;
70
70
  (0, import_reactive.define)(this, {
71
71
  localProps: import_reactive.observable,
@@ -194,10 +194,10 @@ const _ForkFlowModel = class _ForkFlowModel {
194
194
  }
195
195
  }
196
196
  /**
197
- * 自动流程缓存的作用域标识(fork 专用)。
197
+ * 事件缓存的作用域标识(fork 专用)。
198
198
  */
199
- getAutoFlowCacheScope() {
200
- return String(this.forkId);
199
+ getFlowCacheScope(eventName) {
200
+ return `${String(eventName)}:${String(this.forkId)}`;
201
201
  }
202
202
  // onUnmount() {
203
203
  // // 不在此处自动 dispose(避免破坏外部 fork 管理),但应透传到 master 的 onUnmount 钩子,
@@ -216,11 +216,35 @@ const _ForkFlowModel = class _ForkFlowModel {
216
216
  * 释放 fork:从 master.forks 中移除自身并断开引用
217
217
  */
218
218
  dispose() {
219
+ var _a;
219
220
  if (this.disposed) return;
220
221
  this.disposed = true;
222
+ try {
223
+ const cache = (_a = this.flowEngine) == null ? void 0 : _a.applyFlowCache;
224
+ if (cache && cache.size > 0) {
225
+ const uidSuffixes = [`:${this.uid}`, `-${this.uid}`];
226
+ const forkIdColon = `:${this.forkId}:`;
227
+ const forkIdHyphen = `-${this.forkId}-`;
228
+ for (const key of cache.keys()) {
229
+ const isEventCache = key.startsWith("event:") || key.startsWith("event-");
230
+ if (!isEventCache) continue;
231
+ const endMatches = uidSuffixes.some((s) => key.endsWith(s));
232
+ if (!endMatches) continue;
233
+ let trimmed = key;
234
+ for (const suf of uidSuffixes) {
235
+ if (trimmed.endsWith(suf)) {
236
+ trimmed = trimmed.slice(0, -suf.length);
237
+ break;
238
+ }
239
+ }
240
+ if (trimmed.includes(forkIdColon) || trimmed.includes(forkIdHyphen)) {
241
+ cache.delete(key);
242
+ }
243
+ }
244
+ }
245
+ } catch {
246
+ }
221
247
  if (this.master && this.master.forks) {
222
- const forkCacheKey = import_flowEngine.FlowEngine.generateApplyFlowCacheKey(`${this.forkId}`, "all", this.uid);
223
- this.flowEngine.applyFlowCache.delete(forkCacheKey);
224
248
  this.master.forks.delete(this);
225
249
  }
226
250
  if (this.master && this.master.forkCache) {
package/lib/provider.d.ts CHANGED
@@ -17,6 +17,8 @@ export declare const FlowEngineProvider: React.FC<FlowEngineProviderProps>;
17
17
  export declare const FlowEngineGlobalsContextProvider: React.FC<{
18
18
  children: React.ReactNode;
19
19
  }>;
20
- export declare const useFlowEngine: () => FlowEngine;
20
+ export declare const useFlowEngine: ({ throwError }?: {
21
+ throwError?: boolean;
22
+ }) => FlowEngine;
21
23
  export declare const useFlowEngineContext: () => FlowEngineContext;
22
24
  export {};
package/lib/provider.js CHANGED
@@ -49,14 +49,16 @@ var import_FlowContextProvider = require("./FlowContextProvider");
49
49
  var import_views = require("./views");
50
50
  var import_FlowView = require("./views/FlowView");
51
51
  const FlowEngineReactContext = (0, import_react.createContext)(null);
52
- const FlowEngineProvider = /* @__PURE__ */ __name((props) => {
52
+ const FlowEngineProvider = import_react.default.memo((props) => {
53
53
  const { engine, children } = props;
54
54
  if (!engine) {
55
55
  throw new Error("FlowEngineProvider must be supplied with an engine.");
56
56
  }
57
57
  return /* @__PURE__ */ import_react.default.createElement(FlowEngineReactContext.Provider, { value: engine }, /* @__PURE__ */ import_react.default.createElement(import_FlowContextProvider.FlowContextProvider, { context: engine.context }, children));
58
- }, "FlowEngineProvider");
58
+ });
59
+ FlowEngineProvider.displayName = "FlowEngineProvider";
59
60
  const FlowEngineGlobalsContextProvider = /* @__PURE__ */ __name(({ children }) => {
61
+ var _a;
60
62
  const { modal, message, notification } = import_antd.App.useApp();
61
63
  const [drawer, contextHolder] = (0, import_views.useDrawer)();
62
64
  const [embed, pageContextHolder] = (0, import_views.usePage)();
@@ -90,11 +92,11 @@ const FlowEngineGlobalsContextProvider = /* @__PURE__ */ __name(({ children }) =
90
92
  }
91
93
  engine.reactView.refresh();
92
94
  }, [engine, drawer, modal, message, notification, config, popover, token, dialog, embed]);
93
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, children, contextHolder, popoverContextHolder, pageContextHolder, dialogContextHolder);
95
+ return /* @__PURE__ */ import_react.default.createElement(import_antd.ConfigProvider, { ...config, locale: (_a = engine.context.locales) == null ? void 0 : _a.antd, popupMatchSelectWidth: false }, children, contextHolder, popoverContextHolder, pageContextHolder, dialogContextHolder);
94
96
  }, "FlowEngineGlobalsContextProvider");
95
- const useFlowEngine = /* @__PURE__ */ __name(() => {
97
+ const useFlowEngine = /* @__PURE__ */ __name(({ throwError = true } = {}) => {
96
98
  const context = (0, import_react.useContext)(FlowEngineReactContext);
97
- if (!context) {
99
+ if (!context && throwError) {
98
100
  throw new Error(
99
101
  "useFlowEngine must be used within a FlowEngineProvider, and FlowEngineProvider must be supplied with an engine."
100
102
  );
@@ -130,6 +130,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
130
130
  async create(data, options) {
131
131
  const config = this.mergeRequestConfig({ data }, this.createActionOptions, options);
132
132
  await this.runAction("create", config);
133
+ this.emit("saved", data);
133
134
  await this.refresh();
134
135
  }
135
136
  async get(filterByTk) {
@@ -155,6 +156,7 @@ const _MultiRecordResource = class _MultiRecordResource extends import_baseRecor
155
156
  options
156
157
  );
157
158
  await this.runAction("update", config);
159
+ this.emit("saved", data);
158
160
  await this.refresh();
159
161
  }
160
162
  async destroySelectedRows() {
@@ -69,6 +69,7 @@ const _SingleRecordResource = class _SingleRecordResource extends import_baseRec
69
69
  ...config,
70
70
  data
71
71
  });
72
+ this.emit("saved", data);
72
73
  if ((options == null ? void 0 : options.refresh) !== false) {
73
74
  await this.refresh();
74
75
  }
@@ -61,6 +61,7 @@ export declare class SQLResource<TData = any> extends BaseRecordResource<TData>
61
61
  setFilterByTk(filterByTk: any): this;
62
62
  setFilter(filter: Record<string, any>): this;
63
63
  setBind(bind: Record<string, any> | Array<any>): this;
64
+ setLiquidContext(liquidContext: Record<string, any>): this;
64
65
  run(): Promise<any>;
65
66
  runBySQL(): Promise<any>;
66
67
  runById(): Promise<any>;
@@ -45,18 +45,7 @@ var import_reactive = require("@formily/reactive");
45
45
  var import_lodash = __toESM(require("lodash"));
46
46
  var import_flowContext = require("../flowContext");
47
47
  var import_baseRecordResource = require("./baseRecordResource");
48
- function transformSQL(template) {
49
- let index = 1;
50
- const bind = {};
51
- const sql = template.replace(/{{\s*([^}]+)\s*}}/g, (_2, expr) => {
52
- const key = `__var${index}`;
53
- bind[key] = `{{${expr.trim()}}}`;
54
- index++;
55
- return `$${key}`;
56
- });
57
- return { sql, bind };
58
- }
59
- __name(transformSQL, "transformSQL");
48
+ var import_client = require("@nocobase/utils/client");
60
49
  const _FlowSQLRepository = class _FlowSQLRepository {
61
50
  ctx;
62
51
  constructor(ctx) {
@@ -72,16 +61,17 @@ const _FlowSQLRepository = class _FlowSQLRepository {
72
61
  });
73
62
  }
74
63
  async run(sql, options = {}) {
75
- const result = transformSQL(sql);
76
- const bind = await this.ctx.resolveJsonTemplate(result.bind);
64
+ const { sql: transformedSQL, bind, liquidContext } = await (0, import_client.transformSQL)(sql);
65
+ const resolved = await this.ctx.resolveJsonTemplate({ bind, liquidContext });
66
+ const parsedSQL = await (0, import_client.parseLiquidContext)(transformedSQL, resolved.liquidContext);
77
67
  const { data } = await this.ctx.api.request({
78
68
  method: "POST",
79
69
  url: "flowSql:run",
80
70
  data: {
81
- sql: result.sql,
71
+ sql: parsedSQL,
82
72
  ...options,
83
73
  bind: {
84
- ...bind,
74
+ ...resolved.bind,
85
75
  ...options.bind
86
76
  }
87
77
  }
@@ -105,7 +95,7 @@ const _FlowSQLRepository = class _FlowSQLRepository {
105
95
  uid
106
96
  }
107
97
  });
108
- const bind = await this.ctx.resolveJsonTemplate(response.data.data || {});
98
+ const { bind, liquidContext } = await this.ctx.resolveJsonTemplate(response.data.data || {});
109
99
  const { data } = await this.ctx.api.request({
110
100
  method: "POST",
111
101
  url: "flowSql:runById",
@@ -114,8 +104,9 @@ const _FlowSQLRepository = class _FlowSQLRepository {
114
104
  ...options,
115
105
  bind: {
116
106
  ...bind,
117
- ...options.bind
118
- }
107
+ ...options == null ? void 0 : options.bind
108
+ },
109
+ liquidContext
119
110
  }
120
111
  });
121
112
  return data == null ? void 0 : data.data;
@@ -227,19 +218,23 @@ const _SQLResource = class _SQLResource extends import_baseRecordResource.BaseRe
227
218
  this.request.data.bind = bind;
228
219
  return this;
229
220
  }
221
+ setLiquidContext(liquidContext) {
222
+ this.request.data.liquidContext = liquidContext;
223
+ return this;
224
+ }
230
225
  async run() {
231
226
  return this._debugEnabled ? await this.runBySQL() : await this.runById();
232
227
  }
233
228
  async runBySQL() {
234
229
  const sql = this._sql;
235
- const result = transformSQL(sql);
236
- const bind = await this.context.resolveJsonTemplate(result.bind);
230
+ const { sql: transformedSQL, bind, liquidContext } = await (0, import_client.transformSQL)(sql);
231
+ const resolved = await this.context.resolveJsonTemplate({ bind, liquidContext });
237
232
  const options = import_lodash.default.cloneDeep({
238
233
  method: "post",
239
234
  ...this.getRefreshRequestOptions()
240
235
  });
241
- options.data.bind = bind;
242
- options.data.sql = result.sql;
236
+ options.data.sql = await (0, import_client.parseLiquidContext)(transformedSQL, resolved.liquidContext);
237
+ options.data.bind = resolved.bind;
243
238
  return await this.runAction("run", options);
244
239
  }
245
240
  async runById() {
@@ -249,8 +244,9 @@ const _SQLResource = class _SQLResource extends import_baseRecordResource.BaseRe
249
244
  uid: this.request.data.uid
250
245
  }
251
246
  });
252
- const bind = await this.context.resolveJsonTemplate(data);
247
+ const { bind, liquidContext } = await this.context.resolveJsonTemplate(data);
253
248
  this.setBind(bind);
249
+ this.setLiquidContext(liquidContext);
254
250
  return await this.runAction("runById", {
255
251
  method: "post",
256
252
  ...this.getRefreshRequestOptions()
@@ -6,11 +6,6 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
- import { FlowRunJSContext } from './FlowRunJSContext';
9
+ import { FlowRunJSContext } from '../../flowContext';
10
10
  export declare class FormJSFieldItemRunJSContext extends FlowRunJSContext {
11
- static injectDefaultGlobals(): {
12
- window: {};
13
- document: {};
14
- };
15
- constructor(delegate: any);
16
11
  }