@nocobase/flow-engine 2.0.0-alpha.2 → 2.0.0-alpha.20

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 (387) 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 +2 -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/wrappers/contextual/StepSettingsDialog.js +7 -1
  22. package/lib/components/variables/VariableInput.js +16 -2
  23. package/lib/components/variables/VariableTag.js +43 -2
  24. package/lib/components/variables/types.d.ts +2 -0
  25. package/lib/data-source/index.d.ts +12 -4
  26. package/lib/data-source/index.js +18 -12
  27. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  28. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  29. package/lib/executor/FlowExecutor.d.ts +4 -5
  30. package/lib/executor/FlowExecutor.js +122 -94
  31. package/lib/flowContext.d.ts +33 -5
  32. package/lib/flowContext.js +145 -74
  33. package/lib/flowEngine.d.ts +8 -1
  34. package/lib/flowEngine.js +12 -2
  35. package/lib/flowSettings.d.ts +2 -1
  36. package/lib/flowSettings.js +7 -3
  37. package/lib/hooks/useApplyAutoFlows.js +2 -1
  38. package/lib/index.d.ts +6 -1
  39. package/lib/index.js +29 -3
  40. package/lib/models/CollectionFieldModel.d.ts +2 -0
  41. package/lib/models/CollectionFieldModel.js +43 -3
  42. package/lib/models/flowModel.d.ts +28 -29
  43. package/lib/models/flowModel.js +110 -88
  44. package/lib/models/forkFlowModel.d.ts +2 -2
  45. package/lib/models/forkFlowModel.js +29 -6
  46. package/lib/provider.d.ts +3 -1
  47. package/lib/provider.js +7 -5
  48. package/lib/resources/multiRecordResource.js +2 -0
  49. package/lib/resources/singleRecordResource.js +1 -0
  50. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  51. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  52. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  53. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  54. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  55. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  56. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  57. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  58. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  60. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  62. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  64. package/lib/runjs-context/contexts/base.d.ts +9 -0
  65. package/lib/runjs-context/contexts/base.js +169 -0
  66. package/lib/runjs-context/helpers.d.ts +5 -2
  67. package/lib/runjs-context/helpers.js +36 -27
  68. package/lib/runjs-context/registry.d.ts +7 -4
  69. package/lib/runjs-context/registry.js +10 -42
  70. package/lib/runjs-context/setup.d.ts +9 -0
  71. package/lib/runjs-context/setup.js +82 -0
  72. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  73. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  74. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  75. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  76. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  77. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  78. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  79. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  80. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  81. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  82. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  83. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  84. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  85. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  86. package/lib/runjs-context/snippets/index.d.ts +14 -3
  87. package/lib/runjs-context/snippets/index.js +160 -40
  88. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  89. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  90. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  92. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  93. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  94. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  95. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  96. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +12 -6
  97. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  98. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  99. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  100. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +72 -0
  101. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  102. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +12 -11
  103. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +100 -0
  105. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +85 -0
  107. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  109. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  111. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  113. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  115. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  117. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  119. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  121. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  123. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  125. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  127. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  129. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  131. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  133. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  135. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  137. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  139. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  141. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  143. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  145. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  147. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  149. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  151. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  153. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  155. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  157. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  159. package/lib/runjs-context/snippets/types.d.ts +9 -1
  160. package/lib/types.d.ts +15 -3
  161. package/lib/types.js +4 -3
  162. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  163. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  164. package/lib/utils/index.d.ts +3 -2
  165. package/lib/utils/index.js +5 -2
  166. package/lib/utils/params-resolvers.js +2 -2
  167. package/lib/utils/safeGlobals.d.ts +5 -3
  168. package/lib/utils/safeGlobals.js +40 -0
  169. package/lib/utils/serverContextParams.d.ts +1 -0
  170. package/lib/utils/variablesParams.d.ts +9 -5
  171. package/lib/utils/variablesParams.js +47 -36
  172. package/lib/views/PageComponent.js +2 -1
  173. package/lib/views/createViewMeta.d.ts +29 -1
  174. package/lib/views/createViewMeta.js +321 -72
  175. package/lib/views/index.d.ts +1 -0
  176. package/lib/views/index.js +3 -0
  177. package/lib/views/useDialog.d.ts +8 -8
  178. package/lib/views/useDialog.js +8 -7
  179. package/lib/views/useDrawer.d.ts +8 -8
  180. package/lib/views/useDrawer.js +40 -26
  181. package/lib/views/usePage.d.ts +8 -8
  182. package/lib/views/usePage.js +8 -7
  183. package/package.json +4 -3
  184. package/src/BlockScopedFlowEngine.ts +86 -0
  185. package/src/FlowContextProvider.tsx +4 -2
  186. package/src/JSRunner.ts +3 -0
  187. package/src/ViewScopedFlowEngine.ts +1 -1
  188. package/src/__tests__/JSRunner.test.ts +62 -53
  189. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  190. package/src/__tests__/flow-engine.test.ts +3 -0
  191. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  192. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  193. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  194. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  195. package/src/__tests__/runjsContext.test.ts +216 -35
  196. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  197. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  198. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  199. package/src/__tests__/runjsLocales.test.ts +36 -0
  200. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  201. package/src/__tests__/runjsSnippets.test.ts +140 -0
  202. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  203. package/src/components/DynamicFlowsEditor.tsx +3 -4
  204. package/src/components/FieldModelRenderer.tsx +16 -5
  205. package/src/components/FieldSkeleton.tsx +27 -0
  206. package/src/components/FlowContextSelector.tsx +6 -2
  207. package/src/components/FlowModelRenderer.tsx +30 -78
  208. package/src/components/FormItem.tsx +8 -1
  209. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  210. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  211. package/src/components/dnd/README.md +149 -0
  212. package/src/components/dnd/findModelUidPosition.ts +26 -0
  213. package/src/components/dnd/gridDragPlanner.ts +659 -0
  214. package/src/components/dnd/index.tsx +3 -3
  215. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  216. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +1 -0
  217. package/src/components/variables/VariableInput.tsx +22 -2
  218. package/src/components/variables/VariableTag.tsx +54 -2
  219. package/src/components/variables/types.ts +2 -0
  220. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  221. package/src/data-source/index.ts +16 -10
  222. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  223. package/src/executor/FlowExecutor.ts +160 -114
  224. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  225. package/src/flowContext.ts +196 -93
  226. package/src/flowEngine.ts +13 -2
  227. package/src/flowSettings.ts +8 -3
  228. package/src/hooks/useApplyAutoFlows.ts +3 -1
  229. package/src/index.ts +11 -1
  230. package/src/models/CollectionFieldModel.tsx +43 -4
  231. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  232. package/src/models/__tests__/flowModel.test.ts +218 -95
  233. package/src/models/flowModel.tsx +146 -122
  234. package/src/models/forkFlowModel.ts +37 -5
  235. package/src/provider.tsx +10 -7
  236. package/src/resources/multiRecordResource.ts +2 -0
  237. package/src/resources/singleRecordResource.ts +1 -0
  238. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  239. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  240. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  241. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  242. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  243. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  244. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  245. package/src/runjs-context/contexts/base.ts +155 -0
  246. package/src/runjs-context/helpers.ts +32 -30
  247. package/src/runjs-context/registry.ts +16 -47
  248. package/src/runjs-context/setup.ts +51 -0
  249. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  250. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  251. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  252. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  253. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  254. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  255. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  256. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  257. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  258. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  259. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  260. package/src/runjs-context/snippets/index.ts +176 -39
  261. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  262. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  263. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  264. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  265. package/src/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.ts +15 -6
  266. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  267. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +53 -0
  268. package/src/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.ts +15 -11
  269. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +81 -0
  270. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +66 -0
  271. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  272. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  273. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  274. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  275. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  276. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  277. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  278. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  279. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  280. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  281. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  282. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  283. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  284. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  285. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  286. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  287. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  288. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  289. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  290. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  291. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  292. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  293. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  294. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  295. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  296. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  297. package/src/runjs-context/snippets/types.ts +5 -1
  298. package/src/types.ts +13 -0
  299. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  300. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  301. package/src/utils/index.ts +2 -2
  302. package/src/utils/params-resolvers.ts +1 -1
  303. package/src/utils/safeGlobals.ts +49 -3
  304. package/src/utils/serverContextParams.ts +1 -0
  305. package/src/utils/variablesParams.ts +50 -38
  306. package/src/views/PageComponent.tsx +1 -1
  307. package/src/views/createViewMeta.ts +372 -70
  308. package/src/views/index.tsx +1 -0
  309. package/src/views/useDialog.tsx +12 -10
  310. package/src/views/useDrawer.tsx +60 -36
  311. package/src/views/usePage.tsx +13 -10
  312. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  313. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  314. package/lib/components/dnd/moveBlock.d.ts +0 -33
  315. package/lib/components/dnd/moveBlock.js +0 -302
  316. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  317. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  318. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  319. package/lib/runjs-context/index.d.ts +0 -19
  320. package/lib/runjs-context/index.js +0 -57
  321. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  322. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  323. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  324. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  325. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  326. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  327. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  328. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  329. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  330. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  331. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  332. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  333. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  334. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  335. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  336. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  337. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  338. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  339. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  340. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  341. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  342. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  343. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  344. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  345. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  346. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  347. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.js +0 -45
  348. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  349. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  350. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  351. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  352. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  353. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  354. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  355. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  356. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  357. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  358. package/src/components/dnd/moveBlock.ts +0 -379
  359. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  360. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  361. package/src/runjs-context/index.ts +0 -20
  362. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  363. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  364. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  365. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  366. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  367. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  368. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  369. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  370. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  371. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  372. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  373. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  374. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  375. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  376. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  377. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  378. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  379. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  380. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  381. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  382. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  383. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  384. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  385. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  386. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  387. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -94,6 +94,7 @@ const VariableInputComponent = /* @__PURE__ */ __name(({
94
94
  showValueComponent = true,
95
95
  onlyLeafSelectable = false,
96
96
  clearValue,
97
+ ignoreFieldNames,
97
98
  ...restProps
98
99
  }) => {
99
100
  const [currentMetaTreeNode, setCurrentMetaTreeNode] = (0, import_react.useState)(null);
@@ -241,11 +242,23 @@ const VariableInputComponent = /* @__PURE__ */ __name(({
241
242
  if (disabled) {
242
243
  return;
243
244
  }
244
- setCurrentMetaTreeNode(null);
245
245
  const cleared = clearValue !== void 0 ? clearValue : null;
246
246
  setInnerValue(cleared);
247
+ try {
248
+ const path = resolvePathFromValue == null ? void 0 : resolvePathFromValue(cleared);
249
+ if (Array.isArray(resolvedMetaTree) && path && path.length > 0) {
250
+ const node = findMetaTreeNodeByPath(resolvedMetaTree, path);
251
+ if (node) {
252
+ setCurrentMetaTreeNode(node);
253
+ emitChange(cleared, node);
254
+ return;
255
+ }
256
+ }
257
+ } catch (_) {
258
+ }
259
+ setCurrentMetaTreeNode(null);
247
260
  emitChange(cleared);
248
- }, [emitChange, disabled, clearValue]);
261
+ }, [emitChange, disabled, clearValue, resolvedMetaTree, resolvePathFromValue]);
249
262
  const stableProps = (0, import_react.useMemo)(() => {
250
263
  const { style, onFocus, onBlur, disabled: disabled2, ...otherProps } = restProps;
251
264
  return { style, onFocus, onBlur, otherProps };
@@ -311,6 +324,7 @@ const VariableInputComponent = /* @__PURE__ */ __name(({
311
324
  parseValueToPath: resolvePathFromValue,
312
325
  formatPathToValue: resolveValueFromPath,
313
326
  onlyLeafSelectable,
327
+ ignoreFieldNames,
314
328
  ...!showValueComponent && { children: null, placeholder: restProps == null ? void 0 : restProps.placeholder }
315
329
  }
316
330
  ));
@@ -63,8 +63,49 @@ const VariableTagComponent = /* @__PURE__ */ __name(({
63
63
  return metaTreeNode.parentTitles ? [...metaTreeNode.parentTitles, metaTreeNode.title].map(ctx.t).join("/") : ctx.t(metaTreeNode.title) || "";
64
64
  }
65
65
  if (!value) return String(value);
66
- const path = (0, import_utils.parseValueToPath)(value);
67
- return path ? path.join("/") : String(value);
66
+ const rawPath = (0, import_utils.parseValueToPath)(value);
67
+ if (!rawPath || !Array.isArray(resolvedMetaTree)) {
68
+ return Array.isArray(rawPath) ? rawPath.join("/") : String(value);
69
+ }
70
+ const topNames = new Set((resolvedMetaTree || []).map((n) => String(n == null ? void 0 : n.name)));
71
+ const path = !topNames.has(String(rawPath[0])) ? rawPath.slice(1) : rawPath;
72
+ if (!path.length) return "";
73
+ let nodes = resolvedMetaTree;
74
+ let deepest = null;
75
+ let matchedCount = 0;
76
+ for (let i = 0; i < path.length; i++) {
77
+ if (!nodes) break;
78
+ const seg = String(path[i]);
79
+ const node = nodes.find((n) => String(n == null ? void 0 : n.name) === seg);
80
+ if (!node) break;
81
+ deepest = node;
82
+ matchedCount = i + 1;
83
+ if (i < path.length - 1) {
84
+ if (Array.isArray(node.children)) {
85
+ nodes = node.children;
86
+ } else if (typeof node.children === "function") {
87
+ try {
88
+ const childNodes = await node.children();
89
+ node.children = childNodes;
90
+ nodes = childNodes;
91
+ } catch {
92
+ nodes = void 0;
93
+ }
94
+ } else {
95
+ nodes = void 0;
96
+ }
97
+ }
98
+ }
99
+ if (deepest) {
100
+ const titles = deepest.parentTitles ? [...deepest.parentTitles, deepest.title] : [deepest.title];
101
+ let label = titles.map(ctx.t).join("/");
102
+ if (matchedCount < path.length) {
103
+ const tail = path.slice(matchedCount).join("/");
104
+ label = tail ? `${label}/${tail}` : label;
105
+ }
106
+ return label;
107
+ }
108
+ return path.join("/");
68
109
  },
69
110
  { refreshDeps: [resolvedMetaTree, value, metaTreeNode] }
70
111
  );
@@ -18,6 +18,7 @@ export interface FlowContextSelectorProps extends Omit<CascaderProps<ContextSele
18
18
  formatPathToValue?: (item: MetaTreeNode) => string;
19
19
  open?: boolean;
20
20
  onlyLeafSelectable?: boolean;
21
+ ignoreFieldNames?: string[];
21
22
  }
22
23
  export interface ContextSelectorItem {
23
24
  label: React.ReactNode;
@@ -62,6 +63,7 @@ export interface VariableInputProps {
62
63
  * 默认行为为 null;可设置为 '' 等,以便清空后默认切换为“常量-空字符串”。
63
64
  */
64
65
  clearValue?: any;
66
+ ignoreFieldNames?: string[];
65
67
  [key: string]: any;
66
68
  }
67
69
  export interface VariableTagProps {
@@ -49,7 +49,9 @@ export declare class DataSource {
49
49
  addCollection(collection: Collection | CollectionOptions): void;
50
50
  updateCollection(newOptions: CollectionOptions): void;
51
51
  upsertCollection(options: CollectionOptions): Collection;
52
- upsertCollections(collections: CollectionOptions[]): void;
52
+ upsertCollections(collections: CollectionOptions[], options?: {
53
+ clearFields?: boolean;
54
+ }): void;
53
55
  removeCollection(name: string): void;
54
56
  clearCollections(): void;
55
57
  setOptions(newOptions?: any): void;
@@ -68,9 +70,13 @@ export declare class CollectionManager {
68
70
  get flowEngine(): FlowEngine;
69
71
  addCollection(collection: Collection | CollectionOptions): void;
70
72
  removeCollection(name: string): void;
71
- updateCollection(newOptions: CollectionOptions): void;
73
+ updateCollection(newOptions: CollectionOptions, options?: {
74
+ clearFields?: boolean;
75
+ }): void;
72
76
  upsertCollection(options: CollectionOptions): Collection;
73
- upsertCollections(collections: CollectionOptions[]): void;
77
+ upsertCollections(collections: CollectionOptions[], options?: {
78
+ clearFields?: boolean;
79
+ }): void;
74
80
  sortCollectionsByInherits(collections: CollectionOptions[]): CollectionOptions[];
75
81
  getCollection(name: string): Collection | undefined;
76
82
  getCollections(): Collection[];
@@ -97,7 +103,9 @@ export declare class Collection {
97
103
  get titleCollectionField(): CollectionField;
98
104
  initInherits(): void;
99
105
  setDataSource(dataSource: DataSource): void;
100
- setOptions(newOptions?: any): void;
106
+ setOptions(newOptions?: any, options?: {
107
+ clearFields?: boolean;
108
+ }): void;
101
109
  getFields(): CollectionField[];
102
110
  getToOneAssociationFields(): CollectionField[];
103
111
  getAssociationFields(types?: any[]): CollectionField[];
@@ -49,6 +49,7 @@ module.exports = __toCommonJS(data_source_exports);
49
49
  var import_reactive = require("@formily/reactive");
50
50
  var import_lodash = __toESM(require("lodash"));
51
51
  var import_jioToJoiSchema = require("./jioToJoiSchema");
52
+ var import_sortCollectionsByInherits = require("./sortCollectionsByInherits");
52
53
  const _DataSourceManager = class _DataSourceManager {
53
54
  dataSources;
54
55
  flowEngine;
@@ -152,8 +153,8 @@ const _DataSource = class _DataSource {
152
153
  upsertCollection(options) {
153
154
  return this.collectionManager.upsertCollection(options);
154
155
  }
155
- upsertCollections(collections) {
156
- return this.collectionManager.upsertCollections(collections);
156
+ upsertCollections(collections, options = {}) {
157
+ return this.collectionManager.upsertCollections(collections, options);
157
158
  }
158
159
  removeCollection(name) {
159
160
  return this.collectionManager.removeCollection(name);
@@ -204,12 +205,12 @@ const _CollectionManager = class _CollectionManager {
204
205
  removeCollection(name) {
205
206
  this.collections.delete(name);
206
207
  }
207
- updateCollection(newOptions) {
208
+ updateCollection(newOptions, options = {}) {
208
209
  const collection = this.getCollection(newOptions.name);
209
210
  if (!collection) {
210
211
  throw new Error(`Collection ${newOptions.name} not found`);
211
212
  }
212
- collection.setOptions(newOptions);
213
+ collection.setOptions(newOptions, options);
213
214
  }
214
215
  upsertCollection(options) {
215
216
  if (this.collections.has(options.name)) {
@@ -219,10 +220,10 @@ const _CollectionManager = class _CollectionManager {
219
220
  }
220
221
  return this.getCollection(options.name);
221
222
  }
222
- upsertCollections(collections) {
223
- for (const collection of this.sortCollectionsByInherits(collections)) {
223
+ upsertCollections(collections, options = {}) {
224
+ for (const collection of (0, import_sortCollectionsByInherits.sortCollectionsByInherits)(collections)) {
224
225
  if (this.collections.has(collection.name)) {
225
- this.updateCollection(collection);
226
+ this.updateCollection(collection, options);
226
227
  } else {
227
228
  this.addCollection(collection);
228
229
  }
@@ -368,7 +369,8 @@ const _Collection = class _Collection {
368
369
  for (const inherit of this.options.inherits || []) {
369
370
  const collection = this.collectionManager.getCollection(inherit);
370
371
  if (!collection) {
371
- throw new Error(`Collection ${inherit} not found`);
372
+ console.warn(`Warning: Collection ${inherit} not found for collection ${this.name}`);
373
+ continue;
372
374
  }
373
375
  this.inherits.set(inherit, collection);
374
376
  }
@@ -376,10 +378,13 @@ const _Collection = class _Collection {
376
378
  setDataSource(dataSource) {
377
379
  this.dataSource = dataSource;
378
380
  }
379
- setOptions(newOptions = {}) {
381
+ setOptions(newOptions = {}, options = {}) {
380
382
  Object.keys(this.options).forEach((key) => delete this.options[key]);
381
383
  Object.assign(this.options, newOptions);
382
384
  this.initInherits();
385
+ if (options.clearFields) {
386
+ this.clearFields();
387
+ }
383
388
  this.upsertFields(this.options.fields || []);
384
389
  }
385
390
  getFields() {
@@ -584,7 +589,7 @@ const _CollectionField = class _CollectionField {
584
589
  }
585
590
  get title() {
586
591
  var _a, _b, _c;
587
- const titleValue = ((_a = this.options) == null ? void 0 : _a.title) || ((_c = (_b = this.options) == null ? void 0 : _b.uiSchema) == null ? void 0 : _c.title) || this.options.name;
592
+ const titleValue = ((_b = (_a = this.options) == null ? void 0 : _a.uiSchema) == null ? void 0 : _b.title) || ((_c = this.options) == null ? void 0 : _c.title) || this.options.name;
588
593
  return this.flowEngine.translate(titleValue);
589
594
  }
590
595
  set title(value) {
@@ -618,7 +623,7 @@ const _CollectionField = class _CollectionField {
618
623
  return this.options.validation;
619
624
  }
620
625
  getComponentProps() {
621
- var _a;
626
+ var _a, _b;
622
627
  const { type, target } = this.options;
623
628
  const componentProps = import_lodash.default.omitBy(
624
629
  {
@@ -627,7 +632,8 @@ const _CollectionField = class _CollectionField {
627
632
  mode: this.type === "array" ? "multiple" : void 0,
628
633
  multiple: target ? ["belongsToMany", "hasMany", "belongsToArray"].includes(type) : void 0,
629
634
  maxCount: target && !["belongsToMany", "hasMany", "belongsToArray"].includes(type) ? 1 : void 0,
630
- target
635
+ target,
636
+ template: (_b = this.targetCollection) == null ? void 0 : _b.template
631
637
  },
632
638
  import_lodash.default.isUndefined
633
639
  );
@@ -0,0 +1,10 @@
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
+ import { CollectionOptions } from '.';
10
+ export declare function sortCollectionsByInherits(collections: CollectionOptions[]): CollectionOptions[];
@@ -0,0 +1,71 @@
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
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var sortCollectionsByInherits_exports = {};
29
+ __export(sortCollectionsByInherits_exports, {
30
+ sortCollectionsByInherits: () => sortCollectionsByInherits
31
+ });
32
+ module.exports = __toCommonJS(sortCollectionsByInherits_exports);
33
+ function sortCollectionsByInherits(collections) {
34
+ const sorted = [];
35
+ const visited = /* @__PURE__ */ new Set();
36
+ const visiting = /* @__PURE__ */ new Set();
37
+ const map = /* @__PURE__ */ new Map();
38
+ collections.forEach((col) => {
39
+ map.set(col.name, col);
40
+ });
41
+ const addToSorted = /* @__PURE__ */ __name((col) => {
42
+ if (visiting.has(col.name)) {
43
+ throw new Error(`Circular dependency detected: ${col.name} inherits from itself through a chain`);
44
+ }
45
+ if (visited.has(col.name)) {
46
+ return;
47
+ }
48
+ visiting.add(col.name);
49
+ const inherits = col.inherits || [];
50
+ for (const inheritName of inherits) {
51
+ const inheritCol = map.get(inheritName);
52
+ if (!inheritCol) {
53
+ console.warn(`Warning: Collection ${inheritName}, inherited by ${col.name}, not found.`);
54
+ continue;
55
+ }
56
+ addToSorted(inheritCol);
57
+ }
58
+ visiting.delete(col.name);
59
+ visited.add(col.name);
60
+ sorted.push(col);
61
+ }, "addToSorted");
62
+ for (const col of collections) {
63
+ addToSorted(col);
64
+ }
65
+ return sorted;
66
+ }
67
+ __name(sortCollectionsByInherits, "sortCollectionsByInherits");
68
+ // Annotate the CommonJS export names for ESM import in node:
69
+ 0 && (module.exports = {
70
+ sortCollectionsByInherits
71
+ });
@@ -8,19 +8,18 @@
8
8
  */
9
9
  import { FlowEngine } from '../flowEngine';
10
10
  import type { FlowModel } from '../models';
11
+ import type { DispatchEventOptions } from '../types';
11
12
  export declare class FlowExecutor {
12
13
  private readonly engine;
13
14
  constructor(engine: FlowEngine);
15
+ /** Cache wrapper for applyFlow cache lifecycle */
16
+ private withApplyFlowCache;
14
17
  /**
15
18
  * Execute a single flow on model.
16
19
  */
17
20
  runFlow(model: FlowModel, flowKey: string, inputArgs?: Record<string, any>, runId?: string): Promise<any>;
18
- /**
19
- * Execute all auto-apply flows for model.
20
- */
21
- runAutoFlows(model: FlowModel, inputArgs?: Record<string, any>, useCache?: boolean): Promise<any[]>;
22
21
  /**
23
22
  * Dispatch an event to flows bound via flow.on and execute them.
24
23
  */
25
- dispatchEvent(model: FlowModel, eventName: string, inputArgs?: Record<string, any>): Promise<void>;
24
+ dispatchEvent(model: FlowModel, eventName: string, inputArgs?: Record<string, any>, options?: DispatchEventOptions): Promise<any>;
26
25
  }
@@ -50,6 +50,33 @@ const _FlowExecutor = class _FlowExecutor {
50
50
  constructor(engine) {
51
51
  this.engine = engine;
52
52
  }
53
+ /** Cache wrapper for applyFlow cache lifecycle */
54
+ async withApplyFlowCache(cacheKey, executor) {
55
+ if (!cacheKey || !this.engine) return await executor();
56
+ const cachedEntry = this.engine.applyFlowCache.get(cacheKey);
57
+ if (cachedEntry) {
58
+ if (cachedEntry.status === "resolved") return cachedEntry.data;
59
+ if (cachedEntry.status === "rejected") throw cachedEntry.error;
60
+ if (cachedEntry.status === "pending") return await cachedEntry.promise;
61
+ }
62
+ const promise = executor().then((result) => {
63
+ this.engine.applyFlowCache.set(cacheKey, {
64
+ status: "resolved",
65
+ data: result,
66
+ promise: Promise.resolve(result)
67
+ });
68
+ return result;
69
+ }).catch((err) => {
70
+ this.engine.applyFlowCache.set(cacheKey, {
71
+ status: "rejected",
72
+ error: err,
73
+ promise: Promise.reject(err)
74
+ });
75
+ throw err;
76
+ });
77
+ this.engine.applyFlowCache.set(cacheKey, { status: "pending", promise });
78
+ return await promise;
79
+ }
53
80
  /**
54
81
  * Execute a single flow on model.
55
82
  */
@@ -77,20 +104,20 @@ const _FlowExecutor = class _FlowExecutor {
77
104
  let eventStep = model.getEvent(typeof flow.on === "string" ? flow.on : (_a = flow.on) == null ? void 0 : _a.eventName);
78
105
  if (eventStep) {
79
106
  eventStep = { ...eventStep };
80
- eventStep.defaultParams = { ...import_lodash.default.get(flow, "on.defaultParams", {}), ...eventStep.defaultParams };
107
+ eventStep.defaultParams = {
108
+ ...import_lodash.default.get(flow, "on.defaultParams", {}),
109
+ ...eventStep.defaultParams
110
+ };
81
111
  }
82
112
  const stepDefs = eventStep ? { eventStep, ...flow.steps } : flow.steps;
83
113
  (0, import_setupRuntimeContextSteps.setupRuntimeContextSteps)(flowContext, stepDefs, model, flowKey);
84
114
  const stepsRuntime = flowContext.steps;
85
- for (const stepKey in stepDefs) {
86
- if (!Object.prototype.hasOwnProperty.call(stepDefs, stepKey)) continue;
87
- const step = stepDefs[stepKey];
115
+ for (const [stepKey, step] of Object.entries(stepDefs)) {
88
116
  let handler;
89
117
  let combinedParams = {};
90
- let actionDefinition;
91
118
  let useRawParams = step.useRawParams;
92
119
  if (step.use) {
93
- actionDefinition = model.getAction(step.use);
120
+ const actionDefinition = model.getAction(step.use);
94
121
  if (!actionDefinition) {
95
122
  flowContext.logger.error(
96
123
  `BaseModel.applyFlow: Action '${step.use}' not found for step '${stepKey}' in flow '${flowKey}'. Skipping.`
@@ -152,106 +179,107 @@ const _FlowExecutor = class _FlowExecutor {
152
179
  }
153
180
  return Promise.resolve(stepResults);
154
181
  }
182
+ // runAutoFlows 已移除:统一通过 dispatchEvent('beforeRender') + useCache 控制
155
183
  /**
156
- * Execute all auto-apply flows for model.
184
+ * Dispatch an event to flows bound via flow.on and execute them.
157
185
  */
158
- async runAutoFlows(model, inputArgs, useCache = true) {
159
- const autoApplyFlows = model.getAutoFlows();
160
- if (autoApplyFlows.length === 0) {
161
- model.context.logger.warn(`FlowModel: No auto-apply flows found for model '${model.uid}'`);
162
- return [];
163
- }
164
- const cacheKey = useCache ? import_flowEngine.FlowEngine.generateApplyFlowCacheKey(model.getAutoFlowCacheScope(), "all", model.uid) : null;
165
- if (cacheKey && this.engine) {
166
- const cachedEntry = this.engine.applyFlowCache.get(cacheKey);
167
- if (cachedEntry) {
168
- if (cachedEntry.status === "resolved") {
169
- model.context.logger.debug(`[FlowEngine.applyAutoFlows] Using cached result for model: ${model.uid}`);
170
- return cachedEntry.data;
171
- }
172
- if (cachedEntry.status === "rejected") throw cachedEntry.error;
173
- if (cachedEntry.status === "pending") return await cachedEntry.promise;
186
+ async dispatchEvent(model, eventName, inputArgs, options) {
187
+ var _a, _b, _c, _d;
188
+ const isBeforeRender = eventName === "beforeRender";
189
+ const sequential = !!(options == null ? void 0 : options.sequential);
190
+ const useCache = !!(options == null ? void 0 : options.useCache);
191
+ const throwOnError = isBeforeRender;
192
+ const runId = `${model.uid}-${eventName}-${Date.now()}`;
193
+ const logger = model.context.logger;
194
+ try {
195
+ await ((_a = model.onDispatchEventStart) == null ? void 0 : _a.call(model, eventName, options, inputArgs));
196
+ } catch (err) {
197
+ if (isBeforeRender && err instanceof import_utils.FlowExitException) {
198
+ logger.debug(`[FlowModel.dispatchEvent] ${err.message}`);
199
+ return [];
174
200
  }
175
- }
176
- const executeAutoFlows = /* @__PURE__ */ __name(async () => {
177
- const results = [];
178
- const runId = `${model.uid}-autoFlow-${Date.now()}-${Math.floor(Math.random() * 1e3)}`;
179
- const logger = model.context.logger.child({ module: "flow-engine", component: "FlowExecutor", runId });
180
- logger.debug(
181
- `[FlowExecutor] runAutoFlows: uid=${model.uid}, isFork=${(model == null ? void 0 : model.isFork) === true}, useCache=${useCache}, runId=${runId}, flows=${autoApplyFlows.map((f) => f.key).join(",")}`
182
- );
183
201
  try {
184
- if (autoApplyFlows.length === 0) {
185
- logger.warn(`FlowModel: No auto-apply flows found for model '${model.uid}'`);
186
- } else {
187
- for (const flow of autoApplyFlows) {
188
- try {
189
- logger.debug(`[FlowExecutor] runFlow: uid=${model.uid}, flowKey=${flow.key}`);
190
- const result = await this.runFlow(model, flow.key, inputArgs, runId);
191
- if (result instanceof import_exceptions.FlowExitAllException) {
192
- logger.debug(`[FlowEngine.applyAutoFlows] ${result.message}`);
193
- break;
194
- }
195
- results.push(result);
196
- } catch (error) {
197
- logger.error({ err: error }, `FlowModel.applyAutoFlows: Error executing auto-apply flow '${flow.key}':`);
198
- throw error;
199
- }
200
- }
201
- }
202
- return results;
203
- } catch (error) {
204
- if (error instanceof import_utils.FlowExitException) {
205
- logger.debug(`[FlowEngine.applyAutoFlows] ${error.message}`);
206
- return results;
207
- }
208
- throw error;
202
+ await ((_b = model.onDispatchEventError) == null ? void 0 : _b.call(model, eventName, options, inputArgs, err));
203
+ } finally {
204
+ logger.error({ err }, `BaseModel.dispatchEvent: Start hook error for event '${eventName}'`);
209
205
  }
210
- }, "executeAutoFlows");
211
- if (!cacheKey || !this.engine) {
212
- return await executeAutoFlows();
206
+ if (throwOnError) throw err;
207
+ return;
213
208
  }
214
- const promise = executeAutoFlows().then((result) => {
215
- this.engine.applyFlowCache.set(cacheKey, {
216
- status: "resolved",
217
- data: result,
218
- promise: Promise.resolve(result)
219
- });
220
- return result;
221
- }).catch((err) => {
222
- this.engine.applyFlowCache.set(cacheKey, {
223
- status: "rejected",
224
- error: err,
225
- promise: Promise.reject(err)
226
- });
227
- throw err;
228
- });
229
- this.engine.applyFlowCache.set(cacheKey, { status: "pending", promise });
230
- return await promise;
231
- }
232
- /**
233
- * Dispatch an event to flows bound via flow.on and execute them.
234
- */
235
- async dispatchEvent(model, eventName, inputArgs) {
236
- const flows = Array.from(model.getFlows().values()).filter((flow) => {
209
+ const flows = isBeforeRender ? model.getEventFlows("beforeRender") : Array.from(model.getFlows().values()).filter((flow) => {
237
210
  const on = flow.on;
238
211
  if (!on) return false;
239
212
  if (typeof on === "string") return on === eventName;
240
213
  if (typeof on === "object") return on.eventName === eventName;
241
214
  return false;
242
215
  });
243
- const runId = `${model.uid}-${eventName}-${Date.now()}`;
244
- const logger = model.context.logger;
245
- const promises = flows.map((flow) => {
246
- logger.debug(`BaseModel '${model.uid}' dispatching event '${eventName}' to flow '${flow.key}'.`);
247
- return this.runFlow(model, flow.key, inputArgs, runId).catch((error) => {
248
- logger.error(
249
- { err: error },
250
- `BaseModel.dispatchEvent: Error executing event-triggered flow '${flow.key}' for event '${eventName}':`
251
- );
252
- });
253
- });
254
- await Promise.all(promises);
216
+ const execute = /* @__PURE__ */ __name(async () => {
217
+ if (sequential) {
218
+ const ordered = flows.slice().sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0));
219
+ const results2 = [];
220
+ for (const flow of ordered) {
221
+ try {
222
+ logger.debug(
223
+ `BaseModel '${model.uid}' dispatching event '${eventName}' to flow '${flow.key}' (sequential).`
224
+ );
225
+ const result = await this.runFlow(model, flow.key, inputArgs, runId);
226
+ if (result instanceof import_exceptions.FlowExitAllException) {
227
+ logger.debug(`[FlowEngine.dispatchEvent] ${result.message}`);
228
+ break;
229
+ }
230
+ results2.push(result);
231
+ } catch (error) {
232
+ logger.error(
233
+ { err: error },
234
+ `BaseModel.dispatchEvent: Error executing event-triggered flow '${flow.key}' for event '${eventName}' (sequential):`
235
+ );
236
+ throw error;
237
+ }
238
+ }
239
+ return results2;
240
+ }
241
+ const results = await Promise.all(
242
+ flows.map(async (flow) => {
243
+ logger.debug(`BaseModel '${model.uid}' dispatching event '${eventName}' to flow '${flow.key}'.`);
244
+ try {
245
+ return await this.runFlow(model, flow.key, inputArgs, runId);
246
+ } catch (error) {
247
+ logger.error(
248
+ { err: error },
249
+ `BaseModel.dispatchEvent: Error executing event-triggered flow '${flow.key}' for event '${eventName}':`
250
+ );
251
+ if (throwOnError) throw error;
252
+ return void 0;
253
+ }
254
+ })
255
+ );
256
+ return results.filter((x) => x !== void 0);
257
+ }, "execute");
258
+ const argsKey = useCache ? JSON.stringify(inputArgs ?? {}) : "";
259
+ const cacheKey = useCache ? import_flowEngine.FlowEngine.generateApplyFlowCacheKey(
260
+ `event:${model.getFlowCacheScope(eventName)}:${argsKey}`,
261
+ eventName,
262
+ model.uid
263
+ ) : null;
264
+ try {
265
+ const result = await this.withApplyFlowCache(cacheKey, execute);
266
+ try {
267
+ await ((_c = model.onDispatchEventEnd) == null ? void 0 : _c.call(model, eventName, options, inputArgs, result));
268
+ } catch (hookErr) {
269
+ logger.error({ err: hookErr }, `BaseModel.dispatchEvent: End hook error for event '${eventName}'`);
270
+ }
271
+ return result;
272
+ } catch (error) {
273
+ try {
274
+ await ((_d = model.onDispatchEventError) == null ? void 0 : _d.call(model, eventName, options, inputArgs, error));
275
+ } catch (_2) {
276
+ }
277
+ model.context.logger.error(
278
+ { err: error },
279
+ `BaseModel.dispatchEvent: Error executing event '${eventName}' for model '${model.uid}':`
280
+ );
281
+ if (throwOnError) throw error;
282
+ }
255
283
  }
256
284
  };
257
285
  __name(_FlowExecutor, "FlowExecutor");