@nocobase/flow-engine 2.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +30 -0
  3. package/lib/ContextPathProxy.d.ts +17 -0
  4. package/lib/ContextPathProxy.js +65 -0
  5. package/lib/ElementProxy.d.ts +17 -0
  6. package/lib/ElementProxy.js +93 -0
  7. package/lib/FlowContextProvider.d.ts +24 -0
  8. package/lib/FlowContextProvider.js +82 -0
  9. package/lib/FlowDefinition.d.ts +423 -0
  10. package/lib/FlowDefinition.js +257 -0
  11. package/lib/JSRunner.d.ts +32 -0
  12. package/lib/JSRunner.js +95 -0
  13. package/lib/ReactView.d.ts +20 -0
  14. package/lib/ReactView.js +120 -0
  15. package/lib/ViewScopedFlowEngine.d.ts +23 -0
  16. package/lib/ViewScopedFlowEngine.js +81 -0
  17. package/lib/acl/Acl.d.ts +31 -0
  18. package/lib/acl/Acl.js +115 -0
  19. package/lib/action-registry/BaseActionRegistry.d.ts +23 -0
  20. package/lib/action-registry/BaseActionRegistry.js +57 -0
  21. package/lib/action-registry/EngineActionRegistry.d.ts +20 -0
  22. package/lib/action-registry/EngineActionRegistry.js +47 -0
  23. package/lib/action-registry/ModelActionRegistry.d.ts +34 -0
  24. package/lib/action-registry/ModelActionRegistry.js +79 -0
  25. package/lib/components/DynamicFlowsEditor.d.ts +17 -0
  26. package/lib/components/DynamicFlowsEditor.js +49 -0
  27. package/lib/components/FieldModelRenderer.d.ts +10 -0
  28. package/lib/components/FieldModelRenderer.js +94 -0
  29. package/lib/components/FlowContextSelector.d.ts +11 -0
  30. package/lib/components/FlowContextSelector.js +221 -0
  31. package/lib/components/FlowErrorFallback.d.ts +25 -0
  32. package/lib/components/FlowErrorFallback.js +264 -0
  33. package/lib/components/FlowModelRenderer.d.ts +64 -0
  34. package/lib/components/FlowModelRenderer.js +254 -0
  35. package/lib/components/FormItem.d.ts +18 -0
  36. package/lib/components/FormItem.js +147 -0
  37. package/lib/components/common/FlowSettingsButton.d.ts +11 -0
  38. package/lib/components/common/FlowSettingsButton.js +66 -0
  39. package/lib/components/common/index.d.ts +9 -0
  40. package/lib/components/common/index.js +30 -0
  41. package/lib/components/common/withFlowDesignMode.d.ts +26 -0
  42. package/lib/components/common/withFlowDesignMode.js +61 -0
  43. package/lib/components/dnd/getMousePositionOnElement.d.ts +50 -0
  44. package/lib/components/dnd/getMousePositionOnElement.js +95 -0
  45. package/lib/components/dnd/index.d.ts +24 -0
  46. package/lib/components/dnd/index.js +164 -0
  47. package/lib/components/dnd/moveBlock.d.ts +33 -0
  48. package/lib/components/dnd/moveBlock.js +302 -0
  49. package/lib/components/index.d.ts +18 -0
  50. package/lib/components/index.js +48 -0
  51. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.d.ts +46 -0
  52. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +225 -0
  53. package/lib/components/settings/independents/dropdown/index.d.ts +9 -0
  54. package/lib/components/settings/independents/dropdown/index.js +30 -0
  55. package/lib/components/settings/independents/index.d.ts +1 -0
  56. package/lib/components/settings/independents/index.js +30 -0
  57. package/lib/components/settings/index.d.ts +10 -0
  58. package/lib/components/settings/index.js +32 -0
  59. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.d.ts +24 -0
  60. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +501 -0
  61. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.d.ts +45 -0
  62. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +231 -0
  63. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +111 -0
  64. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +484 -0
  65. package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.d.ts +26 -0
  66. package/lib/components/settings/wrappers/contextual/StepRequiredSettingsDialog.js +342 -0
  67. package/lib/components/settings/wrappers/contextual/StepSettings.d.ts +23 -0
  68. package/lib/components/settings/wrappers/contextual/StepSettings.js +110 -0
  69. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.d.ts +20 -0
  70. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +206 -0
  71. package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.d.ts +20 -0
  72. package/lib/components/settings/wrappers/contextual/StepSettingsDrawer.js +47 -0
  73. package/lib/components/settings/wrappers/contextual/index.d.ts +14 -0
  74. package/lib/components/settings/wrappers/contextual/index.js +40 -0
  75. package/lib/components/settings/wrappers/embedded/FlowSettings.d.ts +33 -0
  76. package/lib/components/settings/wrappers/embedded/FlowSettings.js +207 -0
  77. package/lib/components/settings/wrappers/embedded/FlowsSettings.d.ts +41 -0
  78. package/lib/components/settings/wrappers/embedded/FlowsSettings.js +84 -0
  79. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.d.ts +16 -0
  80. package/lib/components/settings/wrappers/embedded/FlowsSettingsContent.js +88 -0
  81. package/lib/components/settings/wrappers/embedded/index.d.ts +10 -0
  82. package/lib/components/settings/wrappers/embedded/index.js +32 -0
  83. package/lib/components/settings/wrappers/index.d.ts +2 -0
  84. package/lib/components/settings/wrappers/index.js +32 -0
  85. package/lib/components/subModel/AddSubModelButton.d.ts +62 -0
  86. package/lib/components/subModel/AddSubModelButton.js +415 -0
  87. package/lib/components/subModel/LazyDropdown.d.ts +55 -0
  88. package/lib/components/subModel/LazyDropdown.js +524 -0
  89. package/lib/components/subModel/index.d.ts +10 -0
  90. package/lib/components/subModel/index.js +32 -0
  91. package/lib/components/subModel/utils.d.ts +34 -0
  92. package/lib/components/subModel/utils.js +287 -0
  93. package/lib/components/variables/InlineVariableTag.d.ts +21 -0
  94. package/lib/components/variables/InlineVariableTag.js +123 -0
  95. package/lib/components/variables/SlateVariableEditor.d.ts +46 -0
  96. package/lib/components/variables/SlateVariableEditor.js +302 -0
  97. package/lib/components/variables/VariableInput.d.ts +11 -0
  98. package/lib/components/variables/VariableInput.js +322 -0
  99. package/lib/components/variables/VariableTag.d.ts +11 -0
  100. package/lib/components/variables/VariableTag.js +148 -0
  101. package/lib/components/variables/VariableTrigger.d.ts +20 -0
  102. package/lib/components/variables/VariableTrigger.js +136 -0
  103. package/lib/components/variables/index.d.ts +15 -0
  104. package/lib/components/variables/index.js +53 -0
  105. package/lib/components/variables/types.d.ts +93 -0
  106. package/lib/components/variables/types.js +24 -0
  107. package/lib/components/variables/useResolvedMetaTree.d.ts +19 -0
  108. package/lib/components/variables/useResolvedMetaTree.js +91 -0
  109. package/lib/components/variables/utils.d.ts +22 -0
  110. package/lib/components/variables/utils.js +177 -0
  111. package/lib/data-source/index.d.ts +180 -0
  112. package/lib/data-source/index.js +733 -0
  113. package/lib/data-source/jioToJoiSchema.d.ts +19 -0
  114. package/lib/data-source/jioToJoiSchema.js +114 -0
  115. package/lib/decorators/index.d.ts +9 -0
  116. package/lib/decorators/index.js +36 -0
  117. package/lib/decorators/largeField.d.ts +9 -0
  118. package/lib/decorators/largeField.js +42 -0
  119. package/lib/emitter.d.ts +16 -0
  120. package/lib/emitter.js +58 -0
  121. package/lib/event-registry/BaseEventRegistry.d.ts +22 -0
  122. package/lib/event-registry/BaseEventRegistry.js +57 -0
  123. package/lib/event-registry/EngineEventRegistry.d.ts +19 -0
  124. package/lib/event-registry/EngineEventRegistry.js +47 -0
  125. package/lib/event-registry/ModelEventRegistry.d.ts +33 -0
  126. package/lib/event-registry/ModelEventRegistry.js +79 -0
  127. package/lib/executor/FlowExecutor.d.ts +26 -0
  128. package/lib/executor/FlowExecutor.js +262 -0
  129. package/lib/flow-registry/BaseFlowRegistry.d.ts +46 -0
  130. package/lib/flow-registry/BaseFlowRegistry.js +86 -0
  131. package/lib/flow-registry/GlobalFlowRegistry.d.ts +22 -0
  132. package/lib/flow-registry/GlobalFlowRegistry.js +95 -0
  133. package/lib/flow-registry/InstanceFlowRegistry.d.ts +21 -0
  134. package/lib/flow-registry/InstanceFlowRegistry.js +59 -0
  135. package/lib/flow-registry/index.d.ts +11 -0
  136. package/lib/flow-registry/index.js +34 -0
  137. package/lib/flowContext.d.ts +215 -0
  138. package/lib/flowContext.js +1266 -0
  139. package/lib/flowEngine.d.ts +340 -0
  140. package/lib/flowEngine.js +781 -0
  141. package/lib/flowI18n.d.ts +46 -0
  142. package/lib/flowI18n.js +117 -0
  143. package/lib/flowSettings.d.ts +266 -0
  144. package/lib/flowSettings.js +850 -0
  145. package/lib/hooks/index.d.ts +14 -0
  146. package/lib/hooks/index.js +40 -0
  147. package/lib/hooks/useApplyAutoFlows.d.ts +21 -0
  148. package/lib/hooks/useApplyAutoFlows.js +62 -0
  149. package/lib/hooks/useFlowModel.d.ts +29 -0
  150. package/lib/hooks/useFlowModel.js +72 -0
  151. package/lib/hooks/useFlowModelById.d.ts +11 -0
  152. package/lib/hooks/useFlowModelById.js +61 -0
  153. package/lib/hooks/useFlowSettingsContext.d.ts +20 -0
  154. package/lib/hooks/useFlowSettingsContext.js +61 -0
  155. package/lib/hooks/useFlowStep.d.ts +17 -0
  156. package/lib/hooks/useFlowStep.js +56 -0
  157. package/lib/hooks/useNiceDropdownMaxHeight.d.ts +13 -0
  158. package/lib/hooks/useNiceDropdownMaxHeight.js +52 -0
  159. package/lib/index.d.ts +27 -0
  160. package/lib/index.js +73 -0
  161. package/lib/locale/en-US.json +61 -0
  162. package/lib/locale/index.d.ts +141 -0
  163. package/lib/locale/index.js +70 -0
  164. package/lib/locale/zh-CN.json +61 -0
  165. package/lib/models/CollectionFieldModel.d.ts +50 -0
  166. package/lib/models/CollectionFieldModel.js +242 -0
  167. package/lib/models/DisplayItemModel.d.ts +12 -0
  168. package/lib/models/DisplayItemModel.js +41 -0
  169. package/lib/models/EditableItemModel.d.ts +12 -0
  170. package/lib/models/EditableItemModel.js +41 -0
  171. package/lib/models/FilterableItemModel.d.ts +12 -0
  172. package/lib/models/FilterableItemModel.js +41 -0
  173. package/lib/models/flowModel.d.ts +344 -0
  174. package/lib/models/flowModel.js +1133 -0
  175. package/lib/models/forkFlowModel.d.ts +83 -0
  176. package/lib/models/forkFlowModel.js +257 -0
  177. package/lib/models/index.d.ts +14 -0
  178. package/lib/models/index.js +40 -0
  179. package/lib/provider.d.ts +22 -0
  180. package/lib/provider.js +114 -0
  181. package/lib/resources/apiResource.d.ts +34 -0
  182. package/lib/resources/apiResource.js +153 -0
  183. package/lib/resources/baseRecordResource.d.ts +61 -0
  184. package/lib/resources/baseRecordResource.js +264 -0
  185. package/lib/resources/filterItem.d.ts +33 -0
  186. package/lib/resources/filterItem.js +93 -0
  187. package/lib/resources/flowResource.d.ts +45 -0
  188. package/lib/resources/flowResource.js +146 -0
  189. package/lib/resources/index.d.ts +15 -0
  190. package/lib/resources/index.js +42 -0
  191. package/lib/resources/multiRecordResource.d.ts +53 -0
  192. package/lib/resources/multiRecordResource.js +230 -0
  193. package/lib/resources/singleRecordResource.d.ts +23 -0
  194. package/lib/resources/singleRecordResource.js +111 -0
  195. package/lib/resources/sqlResource.d.ts +73 -0
  196. package/lib/resources/sqlResource.js +294 -0
  197. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +38 -0
  198. package/lib/runjs-context/contexts/FlowRunJSContext.js +217 -0
  199. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +16 -0
  200. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +66 -0
  201. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +16 -0
  202. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +78 -0
  203. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +12 -0
  204. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +59 -0
  205. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +16 -0
  206. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +70 -0
  207. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +16 -0
  208. package/lib/runjs-context/contexts/JSItemRunJSContext.js +66 -0
  209. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +12 -0
  210. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +61 -0
  211. package/lib/runjs-context/contexts/LinkageRunJSContext.d.ts +12 -0
  212. package/lib/runjs-context/contexts/LinkageRunJSContext.js +62 -0
  213. package/lib/runjs-context/helpers.d.ts +17 -0
  214. package/lib/runjs-context/helpers.js +79 -0
  215. package/lib/runjs-context/index.d.ts +19 -0
  216. package/lib/runjs-context/index.js +57 -0
  217. package/lib/runjs-context/registry.d.ts +17 -0
  218. package/lib/runjs-context/registry.js +93 -0
  219. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +16 -0
  220. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +42 -0
  221. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +16 -0
  222. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +42 -0
  223. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +16 -0
  224. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +41 -0
  225. package/lib/runjs-context/snippets/global/copy-record-json.snippet.d.ts +11 -0
  226. package/lib/runjs-context/snippets/global/copy-record-json.snippet.js +42 -0
  227. package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.d.ts +11 -0
  228. package/lib/runjs-context/snippets/global/copy-to-clipboard.snippet.js +42 -0
  229. package/lib/runjs-context/snippets/global/log-json-record.snippet.d.ts +11 -0
  230. package/lib/runjs-context/snippets/global/log-json-record.snippet.js +42 -0
  231. package/lib/runjs-context/snippets/global/message-error.snippet.d.ts +11 -0
  232. package/lib/runjs-context/snippets/global/message-error.snippet.js +41 -0
  233. package/lib/runjs-context/snippets/global/message-success.snippet.d.ts +11 -0
  234. package/lib/runjs-context/snippets/global/message-success.snippet.js +41 -0
  235. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +16 -0
  236. package/lib/runjs-context/snippets/global/notification-open.snippet.js +43 -0
  237. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.d.ts +11 -0
  238. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +47 -0
  239. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.d.ts +11 -0
  240. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +47 -0
  241. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +16 -0
  242. package/lib/runjs-context/snippets/global/requireAsync.snippet.js +46 -0
  243. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +16 -0
  244. package/lib/runjs-context/snippets/global/sleep.snippet.js +43 -0
  245. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +16 -0
  246. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +44 -0
  247. package/lib/runjs-context/snippets/global/view-navigation-push.snippet.d.ts +11 -0
  248. package/lib/runjs-context/snippets/global/view-navigation-push.snippet.js +44 -0
  249. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +16 -0
  250. package/lib/runjs-context/snippets/global/window-open.snippet.js +41 -0
  251. package/lib/runjs-context/snippets/index.d.ts +11 -0
  252. package/lib/runjs-context/snippets/index.js +94 -0
  253. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +15 -0
  254. package/lib/runjs-context/snippets/libs/echarts-init.snippet.js +46 -0
  255. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +15 -0
  256. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.js +44 -0
  257. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +15 -0
  258. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.js +43 -0
  259. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +15 -0
  260. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +43 -0
  261. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +15 -0
  262. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +40 -0
  263. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +15 -0
  264. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.js +46 -0
  265. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +15 -0
  266. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +42 -0
  267. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +15 -0
  268. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +46 -0
  269. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +15 -0
  270. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +41 -0
  271. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +15 -0
  272. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +41 -0
  273. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +15 -0
  274. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.js +46 -0
  275. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.d.ts +11 -0
  276. package/lib/runjs-context/snippets/scene/jsblock/render-card.snippet.js +45 -0
  277. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +15 -0
  278. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.js +56 -0
  279. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +15 -0
  280. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.js +42 -0
  281. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +15 -0
  282. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.js +41 -0
  283. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +15 -0
  284. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.js +40 -0
  285. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +15 -0
  286. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.js +44 -0
  287. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +15 -0
  288. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.js +60 -0
  289. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +15 -0
  290. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.js +59 -0
  291. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +15 -0
  292. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.js +60 -0
  293. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +15 -0
  294. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.js +60 -0
  295. package/lib/runjs-context/snippets/types.d.ts +16 -0
  296. package/lib/runjs-context/snippets/types.js +24 -0
  297. package/lib/types.d.ts +398 -0
  298. package/lib/types.js +43 -0
  299. package/lib/utils/autoFlowError.d.ts +16 -0
  300. package/lib/utils/autoFlowError.js +53 -0
  301. package/lib/utils/constants.d.ts +29 -0
  302. package/lib/utils/constants.js +77 -0
  303. package/lib/utils/context.d.ts +40 -0
  304. package/lib/utils/context.js +63 -0
  305. package/lib/utils/createCollectionContextMeta.d.ts +11 -0
  306. package/lib/utils/createCollectionContextMeta.js +117 -0
  307. package/lib/utils/exceptions.d.ts +22 -0
  308. package/lib/utils/exceptions.js +62 -0
  309. package/lib/utils/flow-definitions.d.ts +11 -0
  310. package/lib/utils/flow-definitions.js +40 -0
  311. package/lib/utils/index.d.ts +22 -0
  312. package/lib/utils/index.js +117 -0
  313. package/lib/utils/inheritance.d.ts +16 -0
  314. package/lib/utils/inheritance.js +53 -0
  315. package/lib/utils/params-resolvers.d.ts +51 -0
  316. package/lib/utils/params-resolvers.js +309 -0
  317. package/lib/utils/parsePathnameToViewParams.d.ts +34 -0
  318. package/lib/utils/parsePathnameToViewParams.js +84 -0
  319. package/lib/utils/safeGlobals.d.ts +16 -0
  320. package/lib/utils/safeGlobals.js +179 -0
  321. package/lib/utils/schema-utils.d.ts +40 -0
  322. package/lib/utils/schema-utils.js +161 -0
  323. package/lib/utils/serverContextParams.d.ts +28 -0
  324. package/lib/utils/serverContextParams.js +106 -0
  325. package/lib/utils/setupRuntimeContextSteps.d.ts +19 -0
  326. package/lib/utils/setupRuntimeContextSteps.js +88 -0
  327. package/lib/utils/translation.d.ts +18 -0
  328. package/lib/utils/translation.js +58 -0
  329. package/lib/utils/variablesParams.d.ts +51 -0
  330. package/lib/utils/variablesParams.js +150 -0
  331. package/lib/views/DialogComponent.d.ts +22 -0
  332. package/lib/views/DialogComponent.js +98 -0
  333. package/lib/views/DrawerComponent.d.ts +11 -0
  334. package/lib/views/DrawerComponent.js +101 -0
  335. package/lib/views/FlowView.d.ts +76 -0
  336. package/lib/views/FlowView.js +81 -0
  337. package/lib/views/PageComponent.d.ts +10 -0
  338. package/lib/views/PageComponent.js +167 -0
  339. package/lib/views/ViewNavigation.d.ts +45 -0
  340. package/lib/views/ViewNavigation.js +97 -0
  341. package/lib/views/createViewMeta.d.ts +16 -0
  342. package/lib/views/createViewMeta.js +171 -0
  343. package/lib/views/index.d.ts +13 -0
  344. package/lib/views/index.js +48 -0
  345. package/lib/views/useDialog.d.ts +32 -0
  346. package/lib/views/useDialog.js +199 -0
  347. package/lib/views/useDrawer.d.ts +33 -0
  348. package/lib/views/useDrawer.js +206 -0
  349. package/lib/views/usePage.d.ts +32 -0
  350. package/lib/views/usePage.js +193 -0
  351. package/lib/views/usePatchElement.d.ts +10 -0
  352. package/lib/views/usePatchElement.js +54 -0
  353. package/lib/views/usePopover.d.ts +17 -0
  354. package/lib/views/usePopover.js +159 -0
  355. package/package.json +37 -0
  356. package/src/ContextPathProxy.ts +45 -0
  357. package/src/ElementProxy.ts +69 -0
  358. package/src/FlowContextProvider.tsx +40 -0
  359. package/src/FlowDefinition.ts +275 -0
  360. package/src/JSRunner.ts +84 -0
  361. package/src/ReactView.tsx +104 -0
  362. package/src/ViewScopedFlowEngine.ts +75 -0
  363. package/src/__tests__/ElementProxy.test.ts +51 -0
  364. package/src/__tests__/JSRunner.test.ts +92 -0
  365. package/src/__tests__/ReactView.test.tsx +63 -0
  366. package/src/__tests__/context-path-proxy.test.ts +35 -0
  367. package/src/__tests__/flow-engine.test.ts +189 -0
  368. package/src/__tests__/flowContext.test.ts +2012 -0
  369. package/src/__tests__/flowEngine.saveModel.test.ts +171 -0
  370. package/src/__tests__/flowI18n.test.ts +28 -0
  371. package/src/__tests__/flowModel.getFlows.test.ts +61 -0
  372. package/src/__tests__/flowModel.openView.navigation.test.ts +78 -0
  373. package/src/__tests__/flowRuntimeContext.test.ts +187 -0
  374. package/src/__tests__/flowSettings.open.test.tsx +1920 -0
  375. package/src/__tests__/flowSettings.test.ts +566 -0
  376. package/src/__tests__/globalFlowRegistry.test.ts +77 -0
  377. package/src/__tests__/isFieldInterfaceMatch.test.ts +51 -0
  378. package/src/__tests__/metaTreeNodeCache.test.ts +234 -0
  379. package/src/__tests__/path-aggregation.test.ts +85 -0
  380. package/src/__tests__/provider.test.tsx +28 -0
  381. package/src/__tests__/renderHiddenInConfig.test.tsx +91 -0
  382. package/src/__tests__/runjsContext.test.ts +60 -0
  383. package/src/__tests__/viewScopedFlowEngine.test.ts +212 -0
  384. package/src/acl/Acl.tsx +109 -0
  385. package/src/acl/__tests__/Acl.test.tsx +72 -0
  386. package/src/action-registry/BaseActionRegistry.ts +46 -0
  387. package/src/action-registry/EngineActionRegistry.ts +32 -0
  388. package/src/action-registry/ModelActionRegistry.ts +75 -0
  389. package/src/action-registry/__tests__/engineActionRegistry.test.ts +43 -0
  390. package/src/action-registry/__tests__/modelActionRegistry.test.ts +107 -0
  391. package/src/components/DynamicFlowsEditor.tsx +318 -0
  392. package/src/components/FieldModelRenderer.tsx +62 -0
  393. package/src/components/FlowContextSelector.tsx +255 -0
  394. package/src/components/FlowErrorFallback.tsx +316 -0
  395. package/src/components/FlowModelRenderer.tsx +428 -0
  396. package/src/components/FormItem.tsx +130 -0
  397. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +226 -0
  398. package/src/components/common/FlowSettingsButton.tsx +30 -0
  399. package/src/components/common/index.ts +10 -0
  400. package/src/components/common/withFlowDesignMode.tsx +49 -0
  401. package/src/components/dnd/getMousePositionOnElement.ts +115 -0
  402. package/src/components/dnd/index.tsx +128 -0
  403. package/src/components/dnd/moveBlock.ts +379 -0
  404. package/src/components/index.ts +20 -0
  405. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +279 -0
  406. package/src/components/settings/independents/dropdown/index.ts +10 -0
  407. package/src/components/settings/independents/index.ts +2 -0
  408. package/src/components/settings/index.ts +11 -0
  409. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +617 -0
  410. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +292 -0
  411. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +655 -0
  412. package/src/components/settings/wrappers/contextual/StepRequiredSettingsDialog.tsx +446 -0
  413. package/src/components/settings/wrappers/contextual/StepSettings.tsx +109 -0
  414. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +217 -0
  415. package/src/components/settings/wrappers/contextual/StepSettingsDrawer.tsx +32 -0
  416. package/src/components/settings/wrappers/contextual/index.ts +15 -0
  417. package/src/components/settings/wrappers/embedded/FlowSettings.tsx +258 -0
  418. package/src/components/settings/wrappers/embedded/FlowsSettings.tsx +111 -0
  419. package/src/components/settings/wrappers/embedded/FlowsSettingsContent.tsx +96 -0
  420. package/src/components/settings/wrappers/embedded/index.ts +11 -0
  421. package/src/components/settings/wrappers/index.ts +5 -0
  422. package/src/components/subModel/AddSubModelButton.tsx +575 -0
  423. package/src/components/subModel/LazyDropdown.tsx +714 -0
  424. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +1185 -0
  425. package/src/components/subModel/__tests__/buildWrapperFieldChildren.test.ts +192 -0
  426. package/src/components/subModel/__tests__/utils.test.ts +425 -0
  427. package/src/components/subModel/index.ts +12 -0
  428. package/src/components/subModel/utils.ts +278 -0
  429. package/src/components/variables/InlineVariableTag.tsx +97 -0
  430. package/src/components/variables/SlateVariableEditor.tsx +384 -0
  431. package/src/components/variables/VariableInput.tsx +342 -0
  432. package/src/components/variables/VariableTag.tsx +123 -0
  433. package/src/components/variables/VariableTrigger.tsx +116 -0
  434. package/src/components/variables/__tests__/FlowContextSelector.test.tsx +553 -0
  435. package/src/components/variables/__tests__/VariableInput.test.tsx +550 -0
  436. package/src/components/variables/__tests__/VariableTag.test.tsx +347 -0
  437. package/src/components/variables/__tests__/test-utils.tsx +62 -0
  438. package/src/components/variables/__tests__/utils.test.ts +310 -0
  439. package/src/components/variables/index.ts +16 -0
  440. package/src/components/variables/types.ts +100 -0
  441. package/src/components/variables/useResolvedMetaTree.ts +76 -0
  442. package/src/components/variables/utils.ts +192 -0
  443. package/src/data-source/__tests__/collection.test.ts +58 -0
  444. package/src/data-source/__tests__/index.test.ts +82 -0
  445. package/src/data-source/__tests__/jioToJoiSchema.test.ts +56 -0
  446. package/src/data-source/index.ts +812 -0
  447. package/src/data-source/jioToJoiSchema.ts +103 -0
  448. package/src/decorators/index.ts +10 -0
  449. package/src/decorators/largeField.ts +14 -0
  450. package/src/emitter.ts +33 -0
  451. package/src/event-registry/BaseEventRegistry.ts +40 -0
  452. package/src/event-registry/EngineEventRegistry.ts +26 -0
  453. package/src/event-registry/ModelEventRegistry.ts +69 -0
  454. package/src/event-registry/__tests__/engineEventRegistry.test.ts +48 -0
  455. package/src/executor/FlowExecutor.ts +256 -0
  456. package/src/executor/__tests__/eventStep.test.ts +157 -0
  457. package/src/executor/__tests__/flowExecutor.test.ts +163 -0
  458. package/src/flow-registry/BaseFlowRegistry.ts +91 -0
  459. package/src/flow-registry/GlobalFlowRegistry.ts +82 -0
  460. package/src/flow-registry/InstanceFlowRegistry.ts +39 -0
  461. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +141 -0
  462. package/src/flow-registry/__tests__/instance-and-global-registry.test.ts +67 -0
  463. package/src/flow-registry/__tests__/instanceFlowRegistry.test.ts +83 -0
  464. package/src/flow-registry/index.ts +12 -0
  465. package/src/flowContext.ts +1639 -0
  466. package/src/flowEngine.ts +905 -0
  467. package/src/flowI18n.ts +96 -0
  468. package/src/flowSettings.ts +1045 -0
  469. package/src/hooks/index.ts +15 -0
  470. package/src/hooks/useApplyAutoFlows.ts +51 -0
  471. package/src/hooks/useFlowModel.tsx +59 -0
  472. package/src/hooks/useFlowModelById.ts +37 -0
  473. package/src/hooks/useFlowSettingsContext.tsx +37 -0
  474. package/src/hooks/useFlowStep.tsx +19 -0
  475. package/src/hooks/useNiceDropdownMaxHeight.ts +34 -0
  476. package/src/index.ts +38 -0
  477. package/src/locale/en-US.json +61 -0
  478. package/src/locale/index.ts +38 -0
  479. package/src/locale/zh-CN.json +61 -0
  480. package/src/models/CollectionFieldModel.tsx +269 -0
  481. package/src/models/DisplayItemModel.tsx +13 -0
  482. package/src/models/EditableItemModel.tsx +13 -0
  483. package/src/models/FilterableItemModel.tsx +13 -0
  484. package/src/models/__tests__/CollectionFieldModel.test.ts +122 -0
  485. package/src/models/__tests__/defaultParams-on-create.test.ts +83 -0
  486. package/src/models/__tests__/flow-model-oninit.test.ts +44 -0
  487. package/src/models/__tests__/flowModel.actions.integration.test.ts +100 -0
  488. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +100 -0
  489. package/src/models/__tests__/flowModel.test.ts +2746 -0
  490. package/src/models/__tests__/flowRegistry.test.ts +512 -0
  491. package/src/models/__tests__/forkFlowModel.test.ts +1047 -0
  492. package/src/models/__tests__/model-actions.test.ts +70 -0
  493. package/src/models/__tests__/model-events.test.ts +69 -0
  494. package/src/models/flowModel.tsx +1398 -0
  495. package/src/models/forkFlowModel.ts +287 -0
  496. package/src/models/index.ts +17 -0
  497. package/src/provider.tsx +101 -0
  498. package/src/resources/__tests__/apiResource.test.ts +201 -0
  499. package/src/resources/__tests__/baseRecordResource.test.ts +262 -0
  500. package/src/resources/__tests__/filterItem.test.ts +260 -0
  501. package/src/resources/__tests__/flowResource.test.ts +127 -0
  502. package/src/resources/apiResource.ts +148 -0
  503. package/src/resources/baseRecordResource.ts +279 -0
  504. package/src/resources/filterItem.ts +74 -0
  505. package/src/resources/flowResource.ts +143 -0
  506. package/src/resources/index.ts +17 -0
  507. package/src/resources/multiRecordResource.ts +219 -0
  508. package/src/resources/singleRecordResource.ts +83 -0
  509. package/src/resources/sqlResource.ts +299 -0
  510. package/src/runjs-context/contexts/FlowRunJSContext.ts +190 -0
  511. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +39 -0
  512. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +52 -0
  513. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +32 -0
  514. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +43 -0
  515. package/src/runjs-context/contexts/JSItemRunJSContext.ts +39 -0
  516. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +34 -0
  517. package/src/runjs-context/contexts/LinkageRunJSContext.ts +35 -0
  518. package/src/runjs-context/helpers.ts +56 -0
  519. package/src/runjs-context/index.ts +20 -0
  520. package/src/runjs-context/registry.ts +65 -0
  521. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +20 -0
  522. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +20 -0
  523. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +19 -0
  524. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +21 -0
  525. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +21 -0
  526. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +21 -0
  527. package/src/runjs-context/snippets/global/message-error.snippet.ts +20 -0
  528. package/src/runjs-context/snippets/global/message-success.snippet.ts +20 -0
  529. package/src/runjs-context/snippets/global/notification-open.snippet.ts +21 -0
  530. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +26 -0
  531. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +26 -0
  532. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +24 -0
  533. package/src/runjs-context/snippets/global/sleep.snippet.ts +21 -0
  534. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +22 -0
  535. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +23 -0
  536. package/src/runjs-context/snippets/global/window-open.snippet.ts +19 -0
  537. package/src/runjs-context/snippets/index.ts +59 -0
  538. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +24 -0
  539. package/src/runjs-context/snippets/scene/actions/collection-selected-count.snippet.ts +22 -0
  540. package/src/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.ts +21 -0
  541. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +21 -0
  542. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +18 -0
  543. package/src/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.ts +29 -0
  544. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +20 -0
  545. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +24 -0
  546. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +19 -0
  547. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +24 -0
  548. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +24 -0
  549. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +30 -0
  550. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +34 -0
  551. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +20 -0
  552. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +19 -0
  553. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +18 -0
  554. package/src/runjs-context/snippets/scene/jsitem/render-basic.snippet.ts +27 -0
  555. package/src/runjs-context/snippets/scene/linkage/set-disabled.snippet.ts +38 -0
  556. package/src/runjs-context/snippets/scene/linkage/set-field-value.snippet.ts +37 -0
  557. package/src/runjs-context/snippets/scene/linkage/set-required.snippet.ts +38 -0
  558. package/src/runjs-context/snippets/scene/linkage/toggle-visible.snippet.ts +38 -0
  559. package/src/runjs-context/snippets/types.ts +17 -0
  560. package/src/types.ts +474 -0
  561. package/src/utils/__tests__/context.test.ts +93 -0
  562. package/src/utils/__tests__/params-resolvers.test.ts +652 -0
  563. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +104 -0
  564. package/src/utils/__tests__/safeGlobals.test.ts +29 -0
  565. package/src/utils/__tests__/utils.test.ts +1021 -0
  566. package/src/utils/__tests__/variablesParams.test.ts +52 -0
  567. package/src/utils/autoFlowError.ts +29 -0
  568. package/src/utils/constants.ts +60 -0
  569. package/src/utils/context.ts +70 -0
  570. package/src/utils/createCollectionContextMeta.ts +122 -0
  571. package/src/utils/exceptions.ts +36 -0
  572. package/src/utils/flow-definitions.ts +16 -0
  573. package/src/utils/index.ts +63 -0
  574. package/src/utils/inheritance.ts +39 -0
  575. package/src/utils/params-resolvers.ts +482 -0
  576. package/src/utils/parsePathnameToViewParams.ts +103 -0
  577. package/src/utils/safeGlobals.ts +188 -0
  578. package/src/utils/schema-utils.ts +201 -0
  579. package/src/utils/serverContextParams.ts +111 -0
  580. package/src/utils/setupRuntimeContextSteps.ts +89 -0
  581. package/src/utils/translation.ts +37 -0
  582. package/src/utils/variablesParams.ts +175 -0
  583. package/src/views/DialogComponent.tsx +79 -0
  584. package/src/views/DrawerComponent.tsx +72 -0
  585. package/src/views/FlowView.tsx +103 -0
  586. package/src/views/PageComponent.tsx +150 -0
  587. package/src/views/ViewNavigation.ts +122 -0
  588. package/src/views/__tests__/FlowView.test.ts +31 -0
  589. package/src/views/__tests__/ViewNavigation.test.ts +191 -0
  590. package/src/views/__tests__/usePatchElement.test.tsx +28 -0
  591. package/src/views/createViewMeta.ts +157 -0
  592. package/src/views/index.tsx +14 -0
  593. package/src/views/useDialog.tsx +192 -0
  594. package/src/views/useDrawer.tsx +205 -0
  595. package/src/views/usePage.tsx +182 -0
  596. package/src/views/usePatchElement.tsx +27 -0
  597. package/src/views/usePopover.tsx +131 -0
@@ -0,0 +1,188 @@
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
+ /**
11
+ * 统一的安全全局对象代理:window/document
12
+ * - 默认仅允许常用的定时器、console、Math、Date、addEventListener(绑定原 window)
13
+ * - document 仅允许 createElement/querySelector/querySelectorAll
14
+ * - 不允许随意访问未声明的属性,最小权限原则
15
+ */
16
+
17
+ export function createSafeWindow(extra?: Record<string, any>) {
18
+ // 解析相对 URL 使用脱敏 base(不含 query/hash),避免在解析时泄露敏感信息
19
+ const getSafeBaseHref = () => `${window.location.origin}${window.location.pathname}`;
20
+
21
+ // 安全的 window.open 代理
22
+ const safeOpen = (url: string, target?: string, features?: string): Window | null => {
23
+ // 仅允许 http/https 和 about:blank
24
+ const isSafeUrl = (u: string): boolean => {
25
+ try {
26
+ const parsed = new URL(u, getSafeBaseHref()); // 使用脱敏 base
27
+ const protocol = parsed.protocol.toLowerCase();
28
+ if (protocol === 'about:') return parsed.href === 'about:blank';
29
+ return protocol === 'http:' || protocol === 'https:';
30
+ } catch {
31
+ return false;
32
+ }
33
+ };
34
+
35
+ if (!isSafeUrl(url)) {
36
+ throw new Error('Unsafe URL: window.open only allows http/https/about:blank.');
37
+ }
38
+
39
+ // 强制在新标签页打开,避免覆盖当前页或父窗口
40
+ const sanitizedTarget = '_blank';
41
+
42
+ // 合并并强制加上安全特性
43
+ const enforceFeatures = (f?: string): string => {
44
+ const set = new Set<string>();
45
+ if (f) {
46
+ f.split(',')
47
+ .map((s) => s.trim())
48
+ .filter(Boolean)
49
+ .forEach((part) => {
50
+ const key = part.split('=')[0].trim().toLowerCase();
51
+ if (key !== 'noopener' && key !== 'noreferrer') set.add(part);
52
+ });
53
+ }
54
+ set.add('noopener');
55
+ set.add('noreferrer');
56
+ return Array.from(set).join(',');
57
+ };
58
+
59
+ const sanitizedFeatures = enforceFeatures(features);
60
+
61
+ // 调用原生 window.open
62
+ const newWin = window.open.call(window, url, sanitizedTarget, sanitizedFeatures);
63
+
64
+ // 双重保险:禁用 opener(部分浏览器/场景下 features 可能不生效)
65
+ if (newWin && 'opener' in newWin) {
66
+ try {
67
+ (newWin as any).opener = null;
68
+ } catch {
69
+ // ignore
70
+ }
71
+ }
72
+ return newWin;
73
+ };
74
+
75
+ // 同源在当前页导航;跨域强制用新标签页 + noreferrer/noopener
76
+ const guardedNavigate = (rawUrl: string, opts?: { replace?: boolean }) => {
77
+ const parsed = new URL(rawUrl, getSafeBaseHref());
78
+ const protocol = parsed.protocol.toLowerCase();
79
+
80
+ const isAboutBlank = protocol === 'about:' && parsed.href === 'about:blank';
81
+ const isHttp = protocol === 'http:' || protocol === 'https:';
82
+ if (!isHttp && !isAboutBlank) {
83
+ throw new Error('Unsafe URL: only http/https/about:blank are allowed.');
84
+ }
85
+
86
+ if (isAboutBlank) {
87
+ return opts?.replace ? window.location.replace('about:blank') : window.location.assign('about:blank');
88
+ }
89
+
90
+ const sameOrigin =
91
+ parsed.protocol === window.location.protocol &&
92
+ parsed.hostname === window.location.hostname &&
93
+ parsed.port === window.location.port;
94
+
95
+ if (sameOrigin) {
96
+ return opts?.replace ? window.location.replace(parsed.href) : window.location.assign(parsed.href);
97
+ }
98
+
99
+ const win = safeOpen(parsed.href);
100
+ if (!win) throw new Error('Popup blocked: cross-origin navigation is opened in a new tab.');
101
+ };
102
+
103
+ // 只读/脱敏的 location 代理;支持安全的 href 赋值和 assign/replace
104
+ const safeLocation = new Proxy(
105
+ {},
106
+ {
107
+ get(_t, prop: string) {
108
+ switch (prop) {
109
+ case 'origin':
110
+ return window.location.origin;
111
+ case 'protocol':
112
+ return window.location.protocol;
113
+ case 'host':
114
+ return window.location.host;
115
+ case 'hostname':
116
+ return window.location.hostname;
117
+ case 'port':
118
+ return window.location.port;
119
+ case 'pathname':
120
+ return window.location.pathname;
121
+ case 'assign':
122
+ return (u: string) => guardedNavigate(u, { replace: false });
123
+ case 'replace':
124
+ return (u: string) => guardedNavigate(u, { replace: true });
125
+ case 'reload':
126
+ throw new Error('Access to location.reload is not allowed.');
127
+ case 'href':
128
+ throw new Error('Reading location.href is not allowed.');
129
+ default:
130
+ throw new Error(`Access to location property "${prop}" is not allowed.`);
131
+ }
132
+ },
133
+ set(_t, prop: string, value: any) {
134
+ if (prop === 'href') {
135
+ guardedNavigate(String(value), { replace: false });
136
+ return true;
137
+ }
138
+ throw new Error('Mutation on location is not allowed.');
139
+ },
140
+ },
141
+ );
142
+
143
+ const allowedGlobals: Record<string, any> = {
144
+ // 需绑定到原始 window,避免严格模式下触发 Illegal invocation
145
+ setTimeout: window.setTimeout.bind(window),
146
+ clearTimeout: window.clearTimeout.bind(window),
147
+ setInterval: window.setInterval.bind(window),
148
+ clearInterval: window.clearInterval.bind(window),
149
+ console,
150
+ Math,
151
+ Date,
152
+ // 事件侦听仅绑定到真实 window,便于少量需要的全局监听
153
+ addEventListener: addEventListener.bind(window),
154
+ // 安全的 window.open 代理
155
+ open: safeOpen,
156
+ // 安全的 location 代理
157
+ location: safeLocation,
158
+ ...(extra || {}),
159
+ };
160
+
161
+ return new Proxy(
162
+ {},
163
+ {
164
+ get(_target, prop: string) {
165
+ if (prop in allowedGlobals) return allowedGlobals[prop];
166
+ throw new Error(`Access to global property "${prop}" is not allowed.`);
167
+ },
168
+ },
169
+ );
170
+ }
171
+
172
+ export function createSafeDocument(extra?: Record<string, any>) {
173
+ const allowed: Record<string, any> = {
174
+ createElement: document.createElement.bind(document),
175
+ querySelector: document.querySelector.bind(document),
176
+ querySelectorAll: document.querySelectorAll.bind(document),
177
+ ...(extra || {}),
178
+ };
179
+ return new Proxy(
180
+ {},
181
+ {
182
+ get(_target, prop: string) {
183
+ if (prop in allowed) return allowed[prop];
184
+ throw new Error(`Access to document property "${prop}" is not allowed.`);
185
+ },
186
+ },
187
+ );
188
+ }
@@ -0,0 +1,201 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { ISchema } from '@formily/json-schema';
11
+ import { Schema } from '@formily/json-schema';
12
+ import type { FlowModel } from '../models';
13
+ import { FlowRuntimeContext } from '../flowContext';
14
+ import type { StepDefinition, StepUIMode } from '../types';
15
+ import { setupRuntimeContextSteps } from './setupRuntimeContextSteps';
16
+
17
+ /**
18
+ * 解析 uiSchema,支持静态值和函数形式
19
+ * 函数可以接收 FlowRuntimeContext(在 settings 中)
20
+ * @param {Record<string, ISchema> | ((ctx: FlowRuntimeContext<TModel>) => Record<string, ISchema> | Promise<Record<string, ISchema>>)} uiSchema UI Schema 定义
21
+ * @param {FlowRuntimeContext<TModel>} ctx 上下文
22
+ * @returns {Promise<Record<string, ISchema>>} 解析后的 UI Schema 对象
23
+ */
24
+ async function resolveUiSchema<TModel extends FlowModel = FlowModel>(
25
+ uiSchema:
26
+ | Record<string, ISchema>
27
+ | ((ctx: FlowRuntimeContext<TModel>) => Record<string, ISchema> | Promise<Record<string, ISchema>>)
28
+ | undefined,
29
+ ctx: FlowRuntimeContext<TModel>,
30
+ ): Promise<Record<string, ISchema>> {
31
+ if (!uiSchema) {
32
+ return {};
33
+ }
34
+
35
+ if (typeof uiSchema === 'function') {
36
+ try {
37
+ const result = await uiSchema(ctx);
38
+ return result || {};
39
+ } catch (error) {
40
+ console.error('Error resolving uiSchema function:', error);
41
+ return {};
42
+ }
43
+ }
44
+
45
+ return uiSchema;
46
+ }
47
+
48
+ /**
49
+ * 解析 uiMode,支持静态值和函数形式
50
+ * 函数可以接收 FlowRuntimeContext
51
+ * @param {StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)} uiMode UI模式定义
52
+ * @param {FlowRuntimeContext<TModel>} ctx 上下文
53
+ * @returns {Promise<StepUIMode>} 解析后的 UI 模式
54
+ */
55
+ export async function resolveUiMode<TModel extends FlowModel = FlowModel>(
56
+ uiMode: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>) | undefined,
57
+ ctx: FlowRuntimeContext<TModel>,
58
+ ): Promise<StepUIMode> {
59
+ if (!uiMode) {
60
+ return 'dialog';
61
+ }
62
+
63
+ if (typeof uiMode === 'function') {
64
+ try {
65
+ const result = await uiMode(ctx);
66
+ return result || 'dialog';
67
+ } catch (error) {
68
+ console.error('Error resolving uiMode function:', error);
69
+ return 'dialog';
70
+ }
71
+ }
72
+
73
+ return uiMode;
74
+ }
75
+
76
+ // 模块级全局缓存,与 useCompile 保持一致
77
+ const compileCache = {};
78
+
79
+ /**
80
+ * 编译 UI Schema 中的表达式
81
+ *
82
+ * @param scope 编译作用域,包含可用的变量和函数(如 t, randomString 等)
83
+ * @param uiSchema 待编译的 UI Schema
84
+ * @param options 编译选项
85
+ * @returns 编译后的 UI Schema
86
+ */
87
+ export function compileUiSchema(scope: Record<string, any>, uiSchema: any, options: { noCache?: boolean } = {}): any {
88
+ const { noCache = false } = options;
89
+
90
+ const hasVariable = (source: string): boolean => {
91
+ const reg = /\{\{.*?\}\}/g;
92
+ return reg.test(source);
93
+ };
94
+
95
+ const compile = (source: any): any => {
96
+ let shouldCompile = false;
97
+ let cacheKey: string;
98
+
99
+ // source is expression, for example: {{ t('Add new') }}
100
+ if (typeof source === 'string' && source.startsWith('{{')) {
101
+ shouldCompile = true;
102
+ cacheKey = source;
103
+ }
104
+
105
+ // source is Component Object, for example: { 'x-component': "Cascader", type: "array", title: "所属地区(行政区划)" }
106
+ if (source && typeof source === 'object' && !Array.isArray(source)) {
107
+ try {
108
+ cacheKey = JSON.stringify(source);
109
+ } catch (e) {
110
+ console.warn('Failed to stringify:', e);
111
+ return source;
112
+ }
113
+ if (compileCache[cacheKey]) return compileCache[cacheKey];
114
+ shouldCompile = hasVariable(cacheKey);
115
+ }
116
+
117
+ // source is Array, for example: [{ 'title': "{{ t('Admin') }}", name: 'admin' }, { 'title': "{{ t('Root') }}", name: 'root' }]
118
+ if (Array.isArray(source)) {
119
+ try {
120
+ cacheKey = JSON.stringify(source);
121
+ } catch (e) {
122
+ console.warn('Failed to stringify:', e);
123
+ return source;
124
+ }
125
+ if (compileCache[cacheKey]) return compileCache[cacheKey];
126
+ shouldCompile = hasVariable(cacheKey);
127
+ }
128
+
129
+ if (shouldCompile) {
130
+ if (!cacheKey) {
131
+ try {
132
+ return Schema.compile(source, scope);
133
+ } catch (error) {
134
+ console.warn('Failed to compile with Formily Schema.compile:', error);
135
+ return source;
136
+ }
137
+ }
138
+ try {
139
+ if (noCache) {
140
+ return Schema.compile(source, scope);
141
+ }
142
+ compileCache[cacheKey] = compileCache[cacheKey] || Schema.compile(source, scope);
143
+ return compileCache[cacheKey];
144
+ } catch (e) {
145
+ console.log('compileUiSchema error', source, e);
146
+ try {
147
+ return Schema.compile(source, scope);
148
+ } catch (error) {
149
+ return source;
150
+ }
151
+ }
152
+ }
153
+
154
+ // source is: plain object、string、number、boolean、undefined、null
155
+ return source;
156
+ };
157
+
158
+ return compile(uiSchema);
159
+ }
160
+
161
+ /**
162
+ * 解析并合并步骤的完整uiSchema
163
+ * 这个函数提取了在多个组件中重复使用的uiSchema解析和合并逻辑
164
+ * @param model 模型实例
165
+ * @param flow 流程定义
166
+ * @param step 步骤定义
167
+ * @returns 合并后的uiSchema对象,如果为空则返回null
168
+ */
169
+ export async function resolveStepUiSchema<TModel extends FlowModel = FlowModel>(
170
+ model: TModel,
171
+ flow: any,
172
+ step: StepDefinition,
173
+ ): Promise<Record<string, ISchema> | null> {
174
+ // 创建运行时上下文
175
+ const flowRuntimeContext = new FlowRuntimeContext(model, flow.key, 'settings');
176
+ setupRuntimeContextSteps(flowRuntimeContext, flow.steps, model, flow.key);
177
+ flowRuntimeContext.defineProperty('currentStep', { value: step });
178
+
179
+ // 获取步骤的uiSchema
180
+ let stepUiSchema = step.uiSchema;
181
+
182
+ if (step.use) {
183
+ try {
184
+ const action = model.flowEngine?.getAction?.(step.use);
185
+ if (action && action.uiSchema) {
186
+ stepUiSchema = stepUiSchema || action.uiSchema;
187
+ }
188
+ } catch (error) {
189
+ console.warn(`Failed to get action ${step.use}:`, error);
190
+ }
191
+ }
192
+
193
+ const resolvedStepUiSchema = await resolveUiSchema(stepUiSchema || {}, flowRuntimeContext);
194
+
195
+ // 如果解析后没有可配置的UI Schema,返回null
196
+ if (Object.keys(resolvedStepUiSchema).length === 0) {
197
+ return null;
198
+ }
199
+
200
+ return resolvedStepUiSchema;
201
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { FlowContext } from '../flowContext';
11
+
12
+ export type RecordRef = {
13
+ collection?: string;
14
+ id?: any; // primary key value
15
+ filterByTk?: any; // alias for id
16
+ dataSourceKey?: string;
17
+ fields?: string[];
18
+ appends?: string[];
19
+ record?: any; // full record object (try to infer pk from it)
20
+ };
21
+
22
+ // Arbitrary key input and flattened output (dot-joined keys)
23
+ export type BuildServerContextParamsInput = Record<string, any>;
24
+ export type ServerContextParams = Record<string, NormalizedRecordParams>;
25
+
26
+ export type NormalizedRecordParams = {
27
+ collection: string;
28
+ filterByTk: any;
29
+ dataSourceKey?: string;
30
+ fields?: string[];
31
+ appends?: string[];
32
+ };
33
+
34
+ function pickDefined<T extends object>(obj: T): T {
35
+ const out: any = {};
36
+ Object.entries(obj || {}).forEach(([k, v]) => {
37
+ if (typeof v !== 'undefined' && v !== null) out[k] = v;
38
+ });
39
+ return out as T;
40
+ }
41
+
42
+ function resolvePrimaryKey(ctx: FlowContext, dataSourceKey: string, collection: string): string | undefined {
43
+ try {
44
+ const ds = ctx.dataSourceManager?.getDataSource?.(dataSourceKey || 'main');
45
+ const col = ds?.collectionManager?.getCollection?.(collection);
46
+ const pk = col?.getPrimaryKey?.();
47
+ return pk || 'id';
48
+ } catch (e) {
49
+ return 'id';
50
+ }
51
+ }
52
+
53
+ function normalizeOne(ctx: FlowContext, ref?: RecordRef): NormalizedRecordParams | undefined {
54
+ if (!ref) return undefined;
55
+ const dataSourceKey = ref.dataSourceKey || 'main';
56
+ const collection = ref.collection || ref.record?.__collectionName;
57
+ if (!collection) return undefined;
58
+ const pk = resolvePrimaryKey(ctx, dataSourceKey, collection) || 'id';
59
+ const filterByTk =
60
+ typeof ref.filterByTk !== 'undefined' ? ref.filterByTk : typeof ref.id !== 'undefined' ? ref.id : ref.record?.[pk];
61
+ if (typeof filterByTk === 'undefined') return undefined;
62
+ return pickDefined({
63
+ collection,
64
+ filterByTk,
65
+ dataSourceKey,
66
+ fields: ref.fields,
67
+ appends: ref.appends,
68
+ });
69
+ }
70
+
71
+ export function buildServerContextParams(
72
+ ctx: FlowContext,
73
+ input: BuildServerContextParamsInput = {},
74
+ ): ServerContextParams | undefined {
75
+ // Helper: detect a record-like object
76
+ const isRecordRef = (val: any) => {
77
+ if (!val || typeof val !== 'object') return false;
78
+ return (
79
+ typeof (val as any).collection === 'string' &&
80
+ (typeof (val as any).filterByTk !== 'undefined' || typeof (val as any).id !== 'undefined' || (val as any).record)
81
+ );
82
+ };
83
+
84
+ const out: Record<string, NormalizedRecordParams> = {};
85
+
86
+ const visit = (src: any, path: string[]) => {
87
+ if (isRecordRef(src)) {
88
+ const norm = normalizeOne(ctx, src as RecordRef);
89
+ if (norm) {
90
+ const key = path.join('.');
91
+ out[key] = norm;
92
+ }
93
+ return;
94
+ }
95
+ if (Array.isArray(src)) {
96
+ for (let i = 0; i < src.length; i++) {
97
+ visit(src[i], [...path, String(i)]);
98
+ }
99
+ return;
100
+ }
101
+ if (src && typeof src === 'object') {
102
+ for (const [k, v] of Object.entries(src)) {
103
+ visit(v, [...path, k]);
104
+ }
105
+ return;
106
+ }
107
+ };
108
+
109
+ visit(input, []);
110
+ return Object.keys(out).length ? out : undefined;
111
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { FlowRuntimeContext } from '../flowContext';
11
+ import { FlowModel } from '../models/flowModel';
12
+ import { DefaultStructure, StepDefinition } from '../types';
13
+
14
+ /**
15
+ * 为 FlowRuntimeContext 设置 steps 属性及其 meta 信息
16
+ * @param ctx FlowRuntimeContext 实例
17
+ * @param flowSteps 流定义
18
+ * @param model FlowModel 实例
19
+ * @param flowKey key
20
+ */
21
+ export function setupRuntimeContextSteps(
22
+ ctx: FlowRuntimeContext<any>,
23
+ flowSteps: Record<string, StepDefinition<FlowModel<DefaultStructure>>>,
24
+ model: FlowModel,
25
+ flowKey: string,
26
+ ): void {
27
+ const steps: Record<string, any> = {};
28
+ const stepsMetaProperties: Record<string, any> = {};
29
+
30
+ // 构建 meta 信息和步骤对象
31
+ for (const stepKey in flowSteps) {
32
+ if (Object.prototype.hasOwnProperty.call(flowSteps, stepKey)) {
33
+ const flowStep = flowSteps[stepKey];
34
+
35
+ // 根据 uiSchema 构建细化的 params meta
36
+ const paramsProperties: Record<string, any> = {};
37
+
38
+ if (flowStep.uiSchema && typeof flowStep.uiSchema === 'object') {
39
+ for (const [paramKey, paramSchema] of Object.entries(flowStep.uiSchema)) {
40
+ if (paramSchema && typeof paramSchema === 'object') {
41
+ const schema = paramSchema as any;
42
+ paramsProperties[paramKey] = {
43
+ type: schema.type || 'any',
44
+ title: schema.title || schema['x-decorator-props']?.label || paramKey,
45
+ interface: schema['x-component'],
46
+ uiSchema: schema,
47
+ };
48
+ }
49
+ }
50
+ }
51
+
52
+ // 如果没有参数属性,则隐藏整个step
53
+ const hasParams = Object.keys(paramsProperties).length > 0;
54
+
55
+ stepsMetaProperties[stepKey] = {
56
+ type: 'object',
57
+ title: ctx.t(flowStep.title) || stepKey,
58
+ display: hasParams ? 'default' : 'none',
59
+ properties: hasParams
60
+ ? {
61
+ params: {
62
+ type: 'object',
63
+ title: 'Parameters',
64
+ display: 'flatten',
65
+ properties: paramsProperties,
66
+ },
67
+ }
68
+ : undefined,
69
+ };
70
+
71
+ // 始终创建步骤对象,确保运行时能够访问
72
+ steps[stepKey] = {
73
+ get params() {
74
+ return model.getStepParams(flowKey, stepKey) || {};
75
+ },
76
+ get uiSchema() {
77
+ return flowStep.uiSchema;
78
+ },
79
+ result: undefined, // result 会在运行时被设置
80
+ };
81
+ }
82
+ }
83
+
84
+ // 定义 steps 属性
85
+ // 暂时隐藏 settings 对应的变量选择项:不提供 meta,仅保留运行时访问能力
86
+ ctx.defineProperty('steps', {
87
+ get: () => steps,
88
+ });
89
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import type { TFuncKey, TOptions } from 'i18next';
11
+ import type { FlowModel } from '../models';
12
+ import { FLOW_ENGINE_NAMESPACE } from './constants';
13
+
14
+ /**
15
+ * 获取带有 flow-engine 命名空间的翻译函数
16
+ * @param model FlowModel 实例
17
+ * @returns 翻译函数,自动使用 flow-engine 命名空间
18
+ */
19
+ export function getT(model: FlowModel): (key: string, options?: any) => string {
20
+ if (model.flowEngine?.translate) {
21
+ return (key: string, options?: any) => {
22
+ // 自动添加 flow-engine 命名空间
23
+ return model.flowEngine.translate(key, { ns: [FLOW_ENGINE_NAMESPACE, 'client'], nsMode: 'fallback', ...options });
24
+ };
25
+ }
26
+ // 回退到原始键值
27
+ return (key: string) => key;
28
+ }
29
+
30
+ export function escapeT(text: TFuncKey | TFuncKey[], options?: TOptions) {
31
+ if (options) {
32
+ return `{{t(${JSON.stringify(text)}, ${JSON.stringify(options)})}}`;
33
+ }
34
+ return `{{t(${JSON.stringify(text)})}}`;
35
+ }
36
+
37
+ export { escapeT as tExpr };