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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/lib/BlockScopedFlowEngine.d.ts +23 -0
  2. package/lib/BlockScopedFlowEngine.js +90 -0
  3. package/lib/FlowContextProvider.d.ts +2 -2
  4. package/lib/FlowContextProvider.js +3 -3
  5. package/lib/FlowDefinition.d.ts +4 -2
  6. package/lib/JSRunner.js +3 -0
  7. package/lib/ViewScopedFlowEngine.d.ts +1 -1
  8. package/lib/components/FieldModelRenderer.js +10 -4
  9. package/lib/components/FieldSkeleton.d.ts +10 -0
  10. package/lib/components/FieldSkeleton.js +64 -0
  11. package/lib/components/FlowContextSelector.js +7 -2
  12. package/lib/components/FlowModelRenderer.d.ts +2 -5
  13. package/lib/components/FlowModelRenderer.js +16 -47
  14. package/lib/components/FormItem.js +5 -1
  15. package/lib/{runjs-context/snippets/global/requireAsync.snippet.d.ts → components/dnd/findModelUidPosition.d.ts} +4 -7
  16. package/lib/{runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js → components/dnd/findModelUidPosition.js} +23 -19
  17. package/lib/components/dnd/gridDragPlanner.d.ts +130 -0
  18. package/lib/components/dnd/gridDragPlanner.js +497 -0
  19. package/lib/components/dnd/index.d.ts +2 -2
  20. package/lib/components/dnd/index.js +5 -5
  21. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  22. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  23. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  25. package/lib/components/variables/VariableInput.js +16 -2
  26. package/lib/components/variables/VariableTag.js +43 -2
  27. package/lib/components/variables/types.d.ts +2 -0
  28. package/lib/data-source/index.d.ts +12 -4
  29. package/lib/data-source/index.js +19 -13
  30. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  31. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  32. package/lib/executor/FlowExecutor.d.ts +4 -5
  33. package/lib/executor/FlowExecutor.js +135 -100
  34. package/lib/flowContext.d.ts +33 -5
  35. package/lib/flowContext.js +193 -76
  36. package/lib/flowEngine.d.ts +8 -1
  37. package/lib/flowEngine.js +18 -6
  38. package/lib/flowSettings.d.ts +2 -1
  39. package/lib/flowSettings.js +12 -8
  40. package/lib/hooks/useApplyAutoFlows.js +2 -1
  41. package/lib/index.d.ts +7 -1
  42. package/lib/index.js +32 -3
  43. package/lib/locale/en-US.json +4 -2
  44. package/lib/locale/index.d.ts +4 -0
  45. package/lib/locale/zh-CN.json +4 -2
  46. package/lib/models/CollectionFieldModel.d.ts +2 -0
  47. package/lib/models/CollectionFieldModel.js +43 -3
  48. package/lib/models/flowModel.d.ts +28 -29
  49. package/lib/models/flowModel.js +114 -92
  50. package/lib/models/forkFlowModel.d.ts +4 -4
  51. package/lib/models/forkFlowModel.js +32 -8
  52. package/lib/provider.d.ts +3 -1
  53. package/lib/provider.js +7 -5
  54. package/lib/resources/multiRecordResource.js +2 -0
  55. package/lib/resources/singleRecordResource.js +1 -0
  56. package/lib/resources/sqlResource.d.ts +1 -0
  57. package/lib/resources/sqlResource.js +20 -24
  58. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  59. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  60. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  61. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  62. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  63. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  64. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  65. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  66. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  67. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  68. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  69. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  70. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  71. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  72. package/lib/runjs-context/contexts/base.d.ts +9 -0
  73. package/lib/runjs-context/contexts/base.js +183 -0
  74. package/lib/runjs-context/helpers.d.ts +5 -2
  75. package/lib/runjs-context/helpers.js +36 -27
  76. package/lib/runjs-context/registry.d.ts +7 -4
  77. package/lib/runjs-context/registry.js +10 -42
  78. package/lib/runjs-context/setup.d.ts +9 -0
  79. package/lib/runjs-context/setup.js +82 -0
  80. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  81. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  82. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  83. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  84. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  85. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  86. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  87. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  88. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  89. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  90. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  91. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  92. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  93. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  94. package/lib/runjs-context/snippets/index.d.ts +14 -3
  95. package/lib/runjs-context/snippets/index.js +161 -40
  96. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  97. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  98. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  99. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  100. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  101. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  102. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  103. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  104. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  105. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  106. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  107. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  109. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  111. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  113. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  114. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  115. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  116. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  117. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  118. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  119. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  120. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  121. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  122. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  123. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  124. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  125. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  126. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  127. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  128. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  129. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  130. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  131. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  132. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  133. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  134. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  135. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  136. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  137. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  138. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  139. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  140. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  141. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  142. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  143. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  144. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  145. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  146. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  147. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  148. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  149. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  150. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  151. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  152. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  153. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  154. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  155. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  156. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  157. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  158. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  159. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  160. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  161. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  162. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  163. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  164. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  165. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  166. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  167. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  168. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  169. package/lib/runjs-context/snippets/types.d.ts +9 -1
  170. package/lib/types.d.ts +28 -3
  171. package/lib/types.js +4 -3
  172. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  173. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  174. package/lib/utils/createEphemeralContext.d.ts +13 -0
  175. package/lib/utils/createEphemeralContext.js +140 -0
  176. package/lib/utils/index.d.ts +3 -2
  177. package/lib/utils/index.js +5 -2
  178. package/lib/utils/jsxTransform.d.ts +15 -0
  179. package/lib/utils/jsxTransform.js +68 -0
  180. package/lib/utils/params-resolvers.js +3 -3
  181. package/lib/utils/safeGlobals.d.ts +5 -3
  182. package/lib/utils/safeGlobals.js +40 -0
  183. package/lib/utils/schema-utils.js +2 -2
  184. package/lib/utils/serverContextParams.d.ts +1 -0
  185. package/lib/utils/variablesParams.d.ts +9 -5
  186. package/lib/utils/variablesParams.js +47 -36
  187. package/lib/views/PageComponent.js +2 -1
  188. package/lib/views/createViewMeta.d.ts +29 -1
  189. package/lib/views/createViewMeta.js +338 -72
  190. package/lib/views/index.d.ts +1 -0
  191. package/lib/views/index.js +3 -0
  192. package/lib/views/useDialog.d.ts +8 -8
  193. package/lib/views/useDialog.js +8 -7
  194. package/lib/views/useDrawer.d.ts +8 -8
  195. package/lib/views/useDrawer.js +40 -26
  196. package/lib/views/usePage.d.ts +8 -8
  197. package/lib/views/usePage.js +8 -7
  198. package/package.json +5 -3
  199. package/src/BlockScopedFlowEngine.ts +86 -0
  200. package/src/FlowContextProvider.tsx +4 -2
  201. package/src/JSRunner.ts +3 -0
  202. package/src/ViewScopedFlowEngine.ts +1 -1
  203. package/src/__tests__/JSRunner.test.ts +62 -53
  204. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  205. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  206. package/src/__tests__/flow-engine.test.ts +3 -0
  207. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  208. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  209. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  210. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  211. package/src/__tests__/runjsContext.test.ts +216 -35
  212. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  213. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  214. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  215. package/src/__tests__/runjsLocales.test.ts +36 -0
  216. package/src/__tests__/runjsRuntimeFeatures.test.ts +449 -0
  217. package/src/__tests__/runjsSnippets.test.ts +140 -0
  218. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  219. package/src/components/DynamicFlowsEditor.tsx +3 -4
  220. package/src/components/FieldModelRenderer.tsx +16 -5
  221. package/src/components/FieldSkeleton.tsx +27 -0
  222. package/src/components/FlowContextSelector.tsx +6 -2
  223. package/src/components/FlowModelRenderer.tsx +30 -78
  224. package/src/components/FormItem.tsx +8 -1
  225. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +5 -5
  226. package/src/components/__tests__/gridDragPlanner.test.ts +494 -0
  227. package/src/components/dnd/README.md +149 -0
  228. package/src/components/dnd/findModelUidPosition.ts +26 -0
  229. package/src/components/dnd/gridDragPlanner.ts +659 -0
  230. package/src/components/dnd/index.tsx +3 -3
  231. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  232. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  233. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  234. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  235. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +424 -0
  236. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  237. package/src/components/variables/VariableInput.tsx +22 -2
  238. package/src/components/variables/VariableTag.tsx +54 -2
  239. package/src/components/variables/types.ts +2 -0
  240. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  241. package/src/data-source/index.ts +17 -11
  242. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  243. package/src/executor/FlowExecutor.ts +178 -121
  244. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  245. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  246. package/src/flowContext.ts +266 -97
  247. package/src/flowEngine.ts +21 -6
  248. package/src/flowSettings.ts +9 -4
  249. package/src/hooks/useApplyAutoFlows.ts +3 -1
  250. package/src/index.ts +12 -1
  251. package/src/locale/en-US.json +4 -2
  252. package/src/locale/zh-CN.json +4 -2
  253. package/src/models/CollectionFieldModel.tsx +43 -4
  254. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +4 -4
  255. package/src/models/__tests__/flowModel.test.ts +234 -111
  256. package/src/models/__tests__/forkFlowModel.test.ts +22 -7
  257. package/src/models/flowModel.tsx +149 -125
  258. package/src/models/forkFlowModel.ts +41 -8
  259. package/src/provider.tsx +10 -7
  260. package/src/resources/multiRecordResource.ts +2 -0
  261. package/src/resources/singleRecordResource.ts +1 -0
  262. package/src/resources/sqlResource.ts +20 -25
  263. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  264. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  265. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  266. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  267. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  268. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  269. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  270. package/src/runjs-context/contexts/base.ts +171 -0
  271. package/src/runjs-context/helpers.ts +32 -30
  272. package/src/runjs-context/registry.ts +16 -47
  273. package/src/runjs-context/setup.ts +51 -0
  274. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  275. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  276. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  277. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  278. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  279. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  280. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  281. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  282. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  283. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  284. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  285. package/src/runjs-context/snippets/index.ts +177 -39
  286. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  287. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  288. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  289. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  290. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  291. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  292. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  293. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  294. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  295. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  296. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  297. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  298. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  299. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  300. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  301. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  302. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  303. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  304. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  305. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  306. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  307. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  308. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  309. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  310. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  311. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  312. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  313. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  314. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  315. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  316. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  317. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  318. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  319. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  320. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  321. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  322. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  323. package/src/runjs-context/snippets/types.ts +5 -1
  324. package/src/types.ts +34 -0
  325. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  326. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  327. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  328. package/src/utils/createEphemeralContext.ts +142 -0
  329. package/src/utils/index.ts +2 -2
  330. package/src/utils/jsxTransform.ts +39 -0
  331. package/src/utils/params-resolvers.ts +2 -2
  332. package/src/utils/safeGlobals.ts +49 -3
  333. package/src/utils/schema-utils.ts +1 -1
  334. package/src/utils/serverContextParams.ts +1 -0
  335. package/src/utils/variablesParams.ts +50 -38
  336. package/src/views/PageComponent.tsx +1 -1
  337. package/src/views/createViewMeta.ts +393 -70
  338. package/src/views/index.tsx +1 -0
  339. package/src/views/useDialog.tsx +12 -10
  340. package/src/views/useDrawer.tsx +60 -36
  341. package/src/views/usePage.tsx +13 -10
  342. package/lib/components/dnd/getMousePositionOnElement.d.ts +0 -50
  343. package/lib/components/dnd/getMousePositionOnElement.js +0 -95
  344. package/lib/components/dnd/moveBlock.d.ts +0 -33
  345. package/lib/components/dnd/moveBlock.js +0 -302
  346. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  347. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  348. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  349. package/lib/runjs-context/index.d.ts +0 -19
  350. package/lib/runjs-context/index.js +0 -57
  351. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  352. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  353. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  354. package/lib/runjs-context/snippets/global/api-request-post.snippet.js +0 -42
  355. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  356. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  357. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  358. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  359. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  360. package/lib/runjs-context/snippets/global/try-catch-async.snippet.js +0 -44
  361. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  362. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  363. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  364. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  365. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  366. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  367. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  368. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  369. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  370. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  371. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  372. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  373. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  374. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  375. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  376. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  377. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  378. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  379. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  380. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  381. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  382. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  383. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  384. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  385. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  386. package/src/components/dnd/getMousePositionOnElement.ts +0 -115
  387. package/src/components/dnd/moveBlock.ts +0 -379
  388. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  389. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  390. package/src/runjs-context/index.ts +0 -20
  391. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  392. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  393. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  394. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  395. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  396. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  397. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  398. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  399. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  400. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  401. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  402. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  403. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  404. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  405. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  406. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  407. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  408. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  409. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  410. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  411. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  412. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  413. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  414. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  415. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  416. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  417. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  418. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ import { describe, it, expect, beforeEach } from 'vitest';
11
+ import { FlowRunJSContext } from '../flowContext';
12
+
13
+ describe('FlowRunJSContext.define() and getDoc() deep tests', () => {
14
+ // Create test classes for inheritance testing
15
+ class TestBaseContext extends FlowRunJSContext {}
16
+ class TestChildContext extends TestBaseContext {}
17
+ class TestGrandchildContext extends TestChildContext {}
18
+
19
+ beforeEach(() => {
20
+ // Clear all caches to ensure clean state for each test
21
+ // @ts-ignore - accessing private WeakMap for testing
22
+ const cache = (FlowRunJSContext as any).__runjsDocCache;
23
+ if (cache) {
24
+ // WeakMaps can't be cleared directly, but we can create new test classes
25
+ }
26
+ });
27
+
28
+ describe('Deep merging', () => {
29
+ it('should deep merge nested object properties', () => {
30
+ class MergeTestContext extends FlowRunJSContext {}
31
+
32
+ MergeTestContext.define({
33
+ properties: {
34
+ api: {
35
+ description: 'API client',
36
+ properties: {
37
+ request: { description: 'Request method' },
38
+ auth: { description: 'Auth info' },
39
+ },
40
+ },
41
+ },
42
+ });
43
+
44
+ MergeTestContext.define({
45
+ properties: {
46
+ api: {
47
+ properties: {
48
+ request: { description: 'Updated request method' },
49
+ query: { description: 'Query method' },
50
+ },
51
+ },
52
+ },
53
+ });
54
+
55
+ const doc = MergeTestContext.getDoc();
56
+ expect(doc.properties?.api).toBeTruthy();
57
+ const apiProp: any = doc.properties?.api;
58
+ expect(apiProp.description).toBe('API client');
59
+ expect(apiProp.properties?.request?.description).toBe('Updated request method');
60
+ expect(apiProp.properties?.query?.description).toBe('Query method');
61
+ expect(apiProp.properties?.auth?.description).toBe('Auth info');
62
+ });
63
+
64
+ it('should deep merge method documentation', () => {
65
+ class MethodMergeContext extends FlowRunJSContext {}
66
+
67
+ MethodMergeContext.define({
68
+ methods: {
69
+ runAction: {
70
+ description: 'Run an action',
71
+ completion: { insertText: 'ctx.runAction()' },
72
+ },
73
+ },
74
+ });
75
+
76
+ MethodMergeContext.define({
77
+ methods: {
78
+ runAction: {
79
+ description: 'Execute a data action',
80
+ examples: ['ctx.runAction("create", {})'],
81
+ },
82
+ },
83
+ });
84
+
85
+ const doc = MethodMergeContext.getDoc();
86
+ const method: any = doc.methods?.runAction;
87
+ expect(method?.description).toBe('Execute a data action');
88
+ expect(method?.completion?.insertText).toBe('ctx.runAction()');
89
+ expect(method?.examples).toEqual(['ctx.runAction("create", {})']);
90
+ });
91
+ });
92
+
93
+ describe('Null value property deletion', () => {
94
+ it('should remove property when defined with null', () => {
95
+ class NullTestContext extends FlowRunJSContext {}
96
+
97
+ NullTestContext.define({
98
+ properties: {
99
+ foo: 'Foo property',
100
+ bar: 'Bar property',
101
+ },
102
+ });
103
+
104
+ NullTestContext.define({
105
+ properties: {
106
+ foo: null as any,
107
+ },
108
+ });
109
+
110
+ const doc = NullTestContext.getDoc();
111
+ expect(doc.properties?.foo).toBeUndefined();
112
+ expect(doc.properties?.bar).toBe('Bar property');
113
+ });
114
+
115
+ it('should remove nested property when defined with null', () => {
116
+ class NestedNullContext extends FlowRunJSContext {}
117
+
118
+ NestedNullContext.define({
119
+ properties: {
120
+ api: {
121
+ description: 'API client',
122
+ properties: {
123
+ request: { description: 'Request' },
124
+ query: { description: 'Query' },
125
+ },
126
+ },
127
+ },
128
+ });
129
+
130
+ NestedNullContext.define({
131
+ properties: {
132
+ api: {
133
+ properties: {
134
+ query: null as any,
135
+ },
136
+ },
137
+ },
138
+ });
139
+
140
+ const doc = NestedNullContext.getDoc();
141
+ const apiProp: any = doc.properties?.api;
142
+ expect(apiProp.properties?.request?.description).toBe('Request');
143
+ expect(apiProp.properties?.query).toBeUndefined();
144
+ });
145
+
146
+ it('should remove method when defined with null', () => {
147
+ class MethodNullContext extends FlowRunJSContext {}
148
+
149
+ MethodNullContext.define({
150
+ methods: {
151
+ foo: 'Foo method',
152
+ bar: 'Bar method',
153
+ },
154
+ });
155
+
156
+ MethodNullContext.define({
157
+ methods: {
158
+ foo: null as any,
159
+ },
160
+ });
161
+
162
+ const doc = MethodNullContext.getDoc();
163
+ expect(doc.methods?.foo).toBeUndefined();
164
+ expect(doc.methods?.bar).toBe('Bar method');
165
+ });
166
+ });
167
+
168
+ describe('Inheritance chain merging', () => {
169
+ it('should merge metadata from parent class', () => {
170
+ class InheritBaseContext extends FlowRunJSContext {}
171
+ class InheritChildContext extends InheritBaseContext {}
172
+
173
+ InheritBaseContext.define({
174
+ label: 'Base Context',
175
+ properties: {
176
+ baseProp: 'Base property',
177
+ },
178
+ });
179
+
180
+ InheritChildContext.define({
181
+ label: 'Child Context',
182
+ properties: {
183
+ childProp: 'Child property',
184
+ },
185
+ });
186
+
187
+ const doc = InheritChildContext.getDoc();
188
+ expect(doc.label).toBe('Child Context');
189
+ expect(doc.properties?.baseProp).toBe('Base property');
190
+ expect(doc.properties?.childProp).toBe('Child property');
191
+ });
192
+
193
+ it('should merge metadata from entire inheritance chain', () => {
194
+ class ChainBase extends FlowRunJSContext {}
195
+ class ChainMiddle extends ChainBase {}
196
+ class ChainLeaf extends ChainMiddle {}
197
+
198
+ ChainBase.define({
199
+ properties: { base: 'base' },
200
+ methods: { baseMethod: 'base method' },
201
+ });
202
+
203
+ ChainMiddle.define({
204
+ properties: { middle: 'middle' },
205
+ methods: { middleMethod: 'middle method' },
206
+ });
207
+
208
+ ChainLeaf.define({
209
+ properties: { leaf: 'leaf' },
210
+ methods: { leafMethod: 'leaf method' },
211
+ });
212
+
213
+ const doc = ChainLeaf.getDoc();
214
+ expect(doc.properties?.base).toBe('base');
215
+ expect(doc.properties?.middle).toBe('middle');
216
+ expect(doc.properties?.leaf).toBe('leaf');
217
+ expect(doc.methods?.baseMethod).toBe('base method');
218
+ expect(doc.methods?.middleMethod).toBe('middle method');
219
+ expect(doc.methods?.leafMethod).toBe('leaf method');
220
+ });
221
+
222
+ it('should allow child to override parent properties', () => {
223
+ class OverrideBase extends FlowRunJSContext {}
224
+ class OverrideChild extends OverrideBase {}
225
+
226
+ OverrideBase.define({
227
+ properties: {
228
+ shared: 'Base version',
229
+ },
230
+ });
231
+
232
+ OverrideChild.define({
233
+ properties: {
234
+ shared: 'Child version',
235
+ },
236
+ });
237
+
238
+ const doc = OverrideChild.getDoc();
239
+ expect(doc.properties?.shared).toBe('Child version');
240
+ });
241
+
242
+ it('should allow child to remove parent properties with null', () => {
243
+ class RemoveBase extends FlowRunJSContext {}
244
+ class RemoveChild extends RemoveBase {}
245
+
246
+ RemoveBase.define({
247
+ properties: {
248
+ toRemove: 'To be removed',
249
+ toKeep: 'To keep',
250
+ },
251
+ });
252
+
253
+ RemoveChild.define({
254
+ properties: {
255
+ toRemove: null as any,
256
+ },
257
+ });
258
+
259
+ const doc = RemoveChild.getDoc();
260
+ expect(doc.properties?.toRemove).toBeUndefined();
261
+ expect(doc.properties?.toKeep).toBe('To keep');
262
+ });
263
+ });
264
+
265
+ describe('Locale-specific metadata', () => {
266
+ it('should support multiple locales', () => {
267
+ class LocaleContext extends FlowRunJSContext {}
268
+
269
+ LocaleContext.define({
270
+ label: 'Default Label',
271
+ properties: { message: 'Default message' },
272
+ });
273
+
274
+ LocaleContext.define(
275
+ {
276
+ label: 'Chinese Label',
277
+ properties: { message: '中文消息' },
278
+ },
279
+ { locale: 'zh-CN' },
280
+ );
281
+
282
+ LocaleContext.define(
283
+ {
284
+ label: 'Japanese Label',
285
+ properties: { message: '日本語メッセージ' },
286
+ },
287
+ { locale: 'ja-JP' },
288
+ );
289
+
290
+ const defaultDoc = LocaleContext.getDoc();
291
+ expect(defaultDoc.label).toBe('Default Label');
292
+ expect(defaultDoc.properties?.message).toBe('Default message');
293
+
294
+ const zhDoc = LocaleContext.getDoc('zh-CN');
295
+ expect(zhDoc.label).toBe('Chinese Label');
296
+ expect(zhDoc.properties?.message).toBe('中文消息');
297
+
298
+ const jaDoc = LocaleContext.getDoc('ja-JP');
299
+ expect(jaDoc.label).toBe('Japanese Label');
300
+ expect(jaDoc.properties?.message).toBe('日本語メッセージ');
301
+ });
302
+
303
+ it('should merge locale-specific metadata with default', () => {
304
+ class LocaleMergeContext extends FlowRunJSContext {}
305
+
306
+ LocaleMergeContext.define({
307
+ properties: {
308
+ api: 'API client',
309
+ message: 'Message',
310
+ },
311
+ });
312
+
313
+ LocaleMergeContext.define(
314
+ {
315
+ properties: {
316
+ message: '消息',
317
+ },
318
+ },
319
+ { locale: 'zh-CN' },
320
+ );
321
+
322
+ const zhDoc = LocaleMergeContext.getDoc('zh-CN');
323
+ expect(zhDoc.properties?.api).toBe('API client');
324
+ expect(zhDoc.properties?.message).toBe('消息');
325
+ });
326
+
327
+ it('should support locale inheritance', () => {
328
+ class LocaleInheritBase extends FlowRunJSContext {}
329
+ class LocaleInheritChild extends LocaleInheritBase {}
330
+
331
+ LocaleInheritBase.define({ properties: { base: 'base' } });
332
+ LocaleInheritBase.define({ properties: { base: '基础' } }, { locale: 'zh-CN' });
333
+
334
+ LocaleInheritChild.define({ properties: { child: 'child' } });
335
+ LocaleInheritChild.define({ properties: { child: '子级' } }, { locale: 'zh-CN' });
336
+
337
+ const zhDoc = LocaleInheritChild.getDoc('zh-CN');
338
+ expect(zhDoc.properties?.base).toBe('基础');
339
+ expect(zhDoc.properties?.child).toBe('子级');
340
+ });
341
+ });
342
+
343
+ describe('Cache behavior', () => {
344
+ it('should cache getDoc results', () => {
345
+ class CacheContext extends FlowRunJSContext {}
346
+
347
+ CacheContext.define({
348
+ properties: { foo: 'bar' },
349
+ });
350
+
351
+ const doc1 = CacheContext.getDoc();
352
+ const doc2 = CacheContext.getDoc();
353
+
354
+ // Should return the same cached object
355
+ expect(doc1).toBe(doc2);
356
+ });
357
+
358
+ it('should invalidate cache when define is called', () => {
359
+ class InvalidateContext extends FlowRunJSContext {}
360
+
361
+ InvalidateContext.define({
362
+ properties: { foo: 'initial' },
363
+ });
364
+
365
+ const doc1 = InvalidateContext.getDoc();
366
+ expect(doc1.properties?.foo).toBe('initial');
367
+
368
+ InvalidateContext.define({
369
+ properties: { foo: 'updated' },
370
+ });
371
+
372
+ const doc2 = InvalidateContext.getDoc();
373
+ expect(doc2.properties?.foo).toBe('updated');
374
+
375
+ // Should be different objects after invalidation
376
+ expect(doc1).not.toBe(doc2);
377
+ });
378
+
379
+ it('should cache different locales separately', () => {
380
+ class LocaleCacheContext extends FlowRunJSContext {}
381
+
382
+ LocaleCacheContext.define({ properties: { msg: 'English' } });
383
+ LocaleCacheContext.define({ properties: { msg: '中文' } }, { locale: 'zh-CN' });
384
+
385
+ const enDoc1 = LocaleCacheContext.getDoc();
386
+ const zhDoc1 = LocaleCacheContext.getDoc('zh-CN');
387
+ const enDoc2 = LocaleCacheContext.getDoc();
388
+ const zhDoc2 = LocaleCacheContext.getDoc('zh-CN');
389
+
390
+ expect(enDoc1).toBe(enDoc2);
391
+ expect(zhDoc1).toBe(zhDoc2);
392
+ expect(enDoc1).not.toBe(zhDoc1);
393
+ });
394
+ });
395
+
396
+ describe('Edge cases', () => {
397
+ it('should handle empty define calls', () => {
398
+ class EmptyContext extends FlowRunJSContext {}
399
+
400
+ EmptyContext.define({});
401
+ const doc = EmptyContext.getDoc();
402
+
403
+ expect(doc).toBeTruthy();
404
+ expect(typeof doc).toBe('object');
405
+ });
406
+
407
+ it('should handle undefined values gracefully', () => {
408
+ class UndefinedContext extends FlowRunJSContext {}
409
+
410
+ UndefinedContext.define({
411
+ properties: {
412
+ foo: undefined as any,
413
+ },
414
+ });
415
+
416
+ const doc = UndefinedContext.getDoc();
417
+ expect(doc.properties?.foo).toBeUndefined();
418
+ });
419
+
420
+ it('should handle arrays in properties', () => {
421
+ class ArrayContext extends FlowRunJSContext {}
422
+
423
+ ArrayContext.define({
424
+ properties: {
425
+ examples: ['example1', 'example2'] as any,
426
+ },
427
+ });
428
+
429
+ const doc = ArrayContext.getDoc();
430
+ expect(doc.properties?.examples).toEqual(['example1', 'example2']);
431
+ });
432
+
433
+ it('should not merge arrays, replace them instead', () => {
434
+ class ArrayReplaceContext extends FlowRunJSContext {}
435
+
436
+ ArrayReplaceContext.define({
437
+ properties: {
438
+ items: ['a', 'b'] as any,
439
+ },
440
+ });
441
+
442
+ ArrayReplaceContext.define({
443
+ properties: {
444
+ items: ['c', 'd'] as any,
445
+ },
446
+ });
447
+
448
+ const doc = ArrayReplaceContext.getDoc();
449
+ expect(doc.properties?.items).toEqual(['c', 'd']);
450
+ });
451
+ });
452
+
453
+ describe('Multiple define calls', () => {
454
+ it('should accumulate metadata from multiple define calls', () => {
455
+ class MultiDefineContext extends FlowRunJSContext {}
456
+
457
+ MultiDefineContext.define({
458
+ properties: { prop1: 'value1' },
459
+ });
460
+
461
+ MultiDefineContext.define({
462
+ properties: { prop2: 'value2' },
463
+ });
464
+
465
+ MultiDefineContext.define({
466
+ methods: { method1: 'desc1' },
467
+ });
468
+
469
+ const doc = MultiDefineContext.getDoc();
470
+ expect(doc.properties?.prop1).toBe('value1');
471
+ expect(doc.properties?.prop2).toBe('value2');
472
+ expect(doc.methods?.method1).toBe('desc1');
473
+ });
474
+
475
+ it('should allow incremental updates to nested structures', () => {
476
+ class IncrementalContext extends FlowRunJSContext {}
477
+
478
+ IncrementalContext.define({
479
+ properties: {
480
+ api: {
481
+ description: 'API client',
482
+ properties: {
483
+ request: { description: 'Request method' },
484
+ },
485
+ },
486
+ },
487
+ });
488
+
489
+ IncrementalContext.define({
490
+ properties: {
491
+ api: {
492
+ detail: 'APIClient instance',
493
+ properties: {
494
+ query: { description: 'Query method' },
495
+ },
496
+ },
497
+ },
498
+ });
499
+
500
+ const doc = IncrementalContext.getDoc();
501
+ const apiProp: any = doc.properties?.api;
502
+ expect(apiProp.description).toBe('API client');
503
+ expect(apiProp.detail).toBe('APIClient instance');
504
+ expect(apiProp.properties?.request?.description).toBe('Request method');
505
+ expect(apiProp.properties?.query?.description).toBe('Query method');
506
+ });
507
+ });
508
+ });
@@ -7,8 +7,8 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { describe, it, expect } from 'vitest';
11
10
  import { FlowModel } from '@nocobase/flow-engine';
11
+ import { describe, expect, it } from 'vitest';
12
12
 
13
13
  describe('GlobalFlowRegistry (class-level flows)', () => {
14
14
  class BaseModel extends FlowModel {}