@nocobase/flow-engine 2.0.0-alpha.4 → 2.0.0-alpha.41

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 (466) 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/ViewScopedFlowEngine.js +12 -0
  9. package/lib/acl/Acl.d.ts +1 -0
  10. package/lib/acl/Acl.js +11 -0
  11. package/lib/components/FieldModelRenderer.js +14 -6
  12. package/lib/components/FieldSkeleton.d.ts +10 -0
  13. package/lib/components/FieldSkeleton.js +64 -0
  14. package/lib/components/FlowContextSelector.js +7 -2
  15. package/lib/components/FlowModelRenderer.d.ts +3 -6
  16. package/lib/components/FlowModelRenderer.js +16 -47
  17. package/lib/components/FormItem.js +5 -1
  18. package/lib/components/MobilePopup.d.ts +20 -0
  19. package/lib/components/MobilePopup.js +102 -0
  20. package/lib/components/MobilePopup.style.d.ts +17 -0
  21. package/lib/components/MobilePopup.style.js +186 -0
  22. package/lib/components/index.d.ts +1 -0
  23. package/lib/components/index.js +3 -1
  24. package/lib/components/settings/independents/dropdown/FlowsDropdownButton.js +2 -2
  25. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +17 -5
  26. package/lib/components/settings/wrappers/contextual/FlowsContextMenu.js +2 -2
  27. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +2 -2
  28. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +35 -6
  29. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +7 -1
  30. package/lib/components/variables/VariableInput.js +19 -5
  31. package/lib/components/variables/VariableTag.js +43 -2
  32. package/lib/components/variables/types.d.ts +2 -0
  33. package/lib/data-source/index.d.ts +15 -4
  34. package/lib/data-source/index.js +42 -13
  35. package/lib/data-source/sortCollectionsByInherits.d.ts +10 -0
  36. package/lib/data-source/sortCollectionsByInherits.js +71 -0
  37. package/lib/emitter.d.ts +6 -0
  38. package/lib/emitter.js +12 -0
  39. package/lib/executor/FlowExecutor.d.ts +4 -5
  40. package/lib/executor/FlowExecutor.js +168 -99
  41. package/lib/flow-registry/GlobalFlowRegistry.d.ts +1 -0
  42. package/lib/flow-registry/GlobalFlowRegistry.js +3 -0
  43. package/lib/flow-registry/InstanceFlowRegistry.d.ts +1 -0
  44. package/lib/flow-registry/InstanceFlowRegistry.js +3 -0
  45. package/lib/flowContext.d.ts +37 -5
  46. package/lib/flowContext.js +224 -87
  47. package/lib/flowEngine.d.ts +24 -1
  48. package/lib/flowEngine.js +81 -8
  49. package/lib/flowSettings.d.ts +2 -1
  50. package/lib/flowSettings.js +16 -8
  51. package/lib/hooks/useApplyAutoFlows.js +2 -1
  52. package/lib/index.d.ts +7 -1
  53. package/lib/index.js +32 -3
  54. package/lib/locale/en-US.json +4 -2
  55. package/lib/locale/index.d.ts +4 -0
  56. package/lib/locale/zh-CN.json +4 -2
  57. package/lib/models/CollectionFieldModel.d.ts +3 -0
  58. package/lib/models/CollectionFieldModel.js +52 -6
  59. package/lib/models/flowModel.d.ts +30 -29
  60. package/lib/models/flowModel.js +153 -100
  61. package/lib/models/forkFlowModel.d.ts +8 -4
  62. package/lib/models/forkFlowModel.js +38 -8
  63. package/lib/provider.d.ts +3 -1
  64. package/lib/provider.js +7 -5
  65. package/lib/resources/multiRecordResource.js +25 -1
  66. package/lib/resources/singleRecordResource.js +19 -1
  67. package/lib/resources/sqlResource.d.ts +1 -0
  68. package/lib/resources/sqlResource.js +20 -24
  69. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.d.ts +1 -6
  70. package/lib/runjs-context/contexts/FormJSFieldItemRunJSContext.js +27 -20
  71. package/lib/runjs-context/contexts/JSBlockRunJSContext.d.ts +1 -6
  72. package/lib/runjs-context/contexts/JSBlockRunJSContext.js +46 -33
  73. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.d.ts +1 -2
  74. package/lib/runjs-context/contexts/JSCollectionActionRunJSContext.js +14 -15
  75. package/lib/runjs-context/contexts/{LinkageRunJSContext.d.ts → JSColumnRunJSContext.d.ts} +6 -3
  76. package/lib/runjs-context/contexts/JSColumnRunJSContext.js +78 -0
  77. package/lib/runjs-context/contexts/JSFieldRunJSContext.d.ts +1 -6
  78. package/lib/runjs-context/contexts/JSFieldRunJSContext.js +28 -24
  79. package/lib/runjs-context/contexts/JSItemRunJSContext.d.ts +1 -6
  80. package/lib/runjs-context/contexts/JSItemRunJSContext.js +24 -20
  81. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.d.ts +1 -2
  82. package/lib/runjs-context/contexts/JSRecordActionRunJSContext.js +16 -17
  83. package/lib/runjs-context/contexts/base.d.ts +9 -0
  84. package/lib/runjs-context/contexts/base.js +205 -0
  85. package/lib/runjs-context/helpers.d.ts +5 -2
  86. package/lib/runjs-context/helpers.js +36 -27
  87. package/lib/runjs-context/registry.d.ts +7 -4
  88. package/lib/runjs-context/registry.js +10 -42
  89. package/lib/runjs-context/setup.d.ts +9 -0
  90. package/lib/runjs-context/setup.js +82 -0
  91. package/lib/runjs-context/snippets/global/{copy-record-json.snippet.js → api-request.snippet.js} +25 -10
  92. package/lib/runjs-context/snippets/global/clipboard-copy-text.snippet.js +61 -0
  93. package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.js → import-esm.snippet.js} +26 -12
  94. package/lib/runjs-context/snippets/global/message-error.snippet.js +6 -0
  95. package/lib/runjs-context/snippets/global/message-success.snippet.js +6 -0
  96. package/lib/runjs-context/snippets/global/notification-open.snippet.d.ts +3 -8
  97. package/lib/runjs-context/snippets/global/notification-open.snippet.js +8 -1
  98. package/lib/runjs-context/snippets/global/open-view-dialog.snippet.js +10 -3
  99. package/lib/runjs-context/snippets/global/open-view-drawer.snippet.js +10 -3
  100. package/lib/runjs-context/snippets/global/query-selector.snippet.js +53 -0
  101. package/lib/runjs-context/snippets/global/require-amd.snippet.d.ts +11 -0
  102. package/lib/runjs-context/snippets/global/{requireAsync.snippet.js → require-amd.snippet.js} +16 -13
  103. package/lib/runjs-context/snippets/global/window-open.snippet.d.ts +3 -8
  104. package/lib/runjs-context/snippets/global/window-open.snippet.js +8 -1
  105. package/lib/runjs-context/snippets/index.d.ts +14 -3
  106. package/lib/runjs-context/snippets/index.js +162 -40
  107. package/lib/runjs-context/snippets/scene/block/add-event-listener.snippet.d.ts +11 -0
  108. package/lib/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.js +11 -2
  109. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.d.ts +11 -0
  110. package/lib/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.js +64 -0
  111. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.d.ts +11 -0
  112. package/lib/runjs-context/snippets/scene/block/chartjs-bar.snippet.js +99 -0
  113. package/lib/runjs-context/snippets/{libs → scene/block}/echarts-init.snippet.js +24 -7
  114. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.d.ts +11 -0
  115. package/lib/runjs-context/snippets/scene/block/render-antd-icons.snippet.js +65 -0
  116. package/lib/runjs-context/snippets/scene/block/render-button-handler.snippet.d.ts +11 -0
  117. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-button-handler.snippet.js +17 -9
  118. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.d.ts +11 -0
  119. package/lib/runjs-context/snippets/scene/block/render-iframe.snippet.js +57 -0
  120. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.d.ts +11 -0
  121. package/lib/runjs-context/snippets/scene/block/render-info-card.snippet.js +71 -0
  122. package/lib/runjs-context/snippets/scene/block/render-react-jsx.snippet.d.ts +11 -0
  123. package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.js → block/render-react-jsx.snippet.js} +26 -13
  124. package/lib/runjs-context/snippets/scene/block/render-react.snippet.d.ts +11 -0
  125. package/lib/runjs-context/snippets/scene/{jsblock → block}/render-react.snippet.js +18 -17
  126. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.d.ts +11 -0
  127. package/lib/runjs-context/snippets/scene/block/render-statistics.snippet.js +95 -0
  128. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.d.ts +11 -0
  129. package/lib/runjs-context/snippets/scene/block/render-timeline.snippet.js +84 -0
  130. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.d.ts +11 -0
  131. package/lib/runjs-context/snippets/scene/block/resource-example.snippet.js +60 -0
  132. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.d.ts +11 -0
  133. package/lib/runjs-context/snippets/scene/block/three-users-orbit.snippet.js +283 -0
  134. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.d.ts +11 -0
  135. package/lib/runjs-context/snippets/scene/block/vue-component.snippet.js +124 -0
  136. package/lib/runjs-context/snippets/scene/detail/color-by-value.snippet.d.ts +11 -0
  137. package/lib/runjs-context/snippets/scene/{jsfield → detail}/color-by-value.snippet.js +13 -3
  138. package/lib/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.d.ts +11 -0
  139. package/lib/runjs-context/snippets/{global → scene/detail}/copy-to-clipboard.snippet.js +28 -6
  140. package/lib/runjs-context/snippets/scene/detail/format-number.snippet.d.ts +11 -0
  141. package/lib/runjs-context/snippets/scene/{jsfield → detail}/format-number.snippet.js +13 -3
  142. package/lib/runjs-context/snippets/scene/detail/innerHTML-value.snippet.d.ts +11 -0
  143. package/lib/runjs-context/snippets/scene/{jsfield → detail}/innerHTML-value.snippet.js +13 -3
  144. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.d.ts +11 -0
  145. package/lib/runjs-context/snippets/scene/detail/percentage-bar.snippet.js +82 -0
  146. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.d.ts +11 -0
  147. package/lib/runjs-context/snippets/scene/detail/relative-time.snippet.js +80 -0
  148. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.d.ts +11 -0
  149. package/lib/runjs-context/snippets/scene/detail/status-tag.snippet.js +74 -0
  150. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.d.ts +11 -0
  151. package/lib/runjs-context/snippets/scene/form/calculate-total.snippet.js +63 -0
  152. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.d.ts +11 -0
  153. package/lib/runjs-context/snippets/scene/form/cascade-select.snippet.js +81 -0
  154. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.d.ts +11 -0
  155. package/lib/runjs-context/snippets/scene/form/conditional-required.snippet.js +64 -0
  156. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.d.ts +11 -0
  157. package/lib/runjs-context/snippets/scene/form/copy-field-values.snippet.js +74 -0
  158. package/lib/runjs-context/snippets/scene/form/render-basic.snippet.d.ts +11 -0
  159. package/lib/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.js +11 -2
  160. package/lib/runjs-context/snippets/scene/form/set-disabled.snippet.d.ts +11 -0
  161. package/lib/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.js +12 -3
  162. package/lib/runjs-context/snippets/scene/form/set-field-value.snippet.d.ts +11 -0
  163. package/lib/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.js +12 -3
  164. package/lib/runjs-context/snippets/scene/form/set-required.snippet.d.ts +11 -0
  165. package/lib/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.js +12 -3
  166. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.d.ts +11 -0
  167. package/lib/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.js +67 -0
  168. package/lib/runjs-context/snippets/scene/form/toggle-visible.snippet.d.ts +11 -0
  169. package/lib/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.js +12 -3
  170. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.d.ts +11 -0
  171. package/lib/runjs-context/snippets/scene/table/cell-open-dialog.snippet.js +64 -0
  172. package/lib/runjs-context/snippets/scene/table/collection-selected-count.snippet.d.ts +11 -0
  173. package/lib/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.js +11 -2
  174. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.d.ts +11 -0
  175. package/lib/runjs-context/snippets/scene/table/concat-fields.snippet.js +79 -0
  176. package/lib/runjs-context/snippets/scene/table/destroy-selected.snippet.d.ts +11 -0
  177. package/lib/runjs-context/snippets/{global/log-json-record.snippet.js → scene/table/destroy-selected.snippet.js} +24 -11
  178. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.d.ts +11 -0
  179. package/lib/runjs-context/snippets/scene/table/export-selected-json.snippet.js +64 -0
  180. package/lib/runjs-context/snippets/scene/table/iterate-selected-rows.snippet.d.ts +11 -0
  181. package/lib/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.js +11 -2
  182. package/lib/runjs-context/snippets/types.d.ts +9 -1
  183. package/lib/scheduler/ModelOperationScheduler.d.ts +51 -0
  184. package/lib/scheduler/ModelOperationScheduler.js +262 -0
  185. package/lib/types.d.ts +28 -3
  186. package/lib/types.js +4 -3
  187. package/lib/utils/associationObjectVariable.d.ts +32 -0
  188. package/lib/utils/associationObjectVariable.js +157 -0
  189. package/lib/utils/buildSettingsViewInputArgs.d.ts +19 -0
  190. package/lib/utils/buildSettingsViewInputArgs.js +75 -0
  191. package/lib/utils/createEphemeralContext.d.ts +13 -0
  192. package/lib/utils/createEphemeralContext.js +140 -0
  193. package/lib/utils/flows.d.ts +10 -0
  194. package/lib/{runjs-context/snippets/global/api-request-post.snippet.js → utils/flows.js} +21 -15
  195. package/lib/utils/index.d.ts +7 -2
  196. package/lib/utils/index.js +21 -2
  197. package/lib/utils/jsxTransform.d.ts +15 -0
  198. package/lib/utils/jsxTransform.js +68 -0
  199. package/lib/utils/params-resolvers.js +3 -3
  200. package/lib/utils/parsePathnameToViewParams.d.ts +1 -1
  201. package/lib/utils/parsePathnameToViewParams.js +41 -5
  202. package/lib/utils/pruneFilter.d.ts +21 -0
  203. package/lib/{runjs-context/snippets/global/try-catch-async.snippet.js → utils/pruneFilter.js} +24 -16
  204. package/lib/utils/safeGlobals.d.ts +5 -3
  205. package/lib/utils/safeGlobals.js +40 -0
  206. package/lib/utils/schema-utils.js +2 -2
  207. package/lib/utils/serverContextParams.d.ts +1 -0
  208. package/lib/utils/translation.d.ts +4 -1
  209. package/lib/utils/translation.js +6 -2
  210. package/lib/utils/variablesParams.d.ts +22 -5
  211. package/lib/utils/variablesParams.js +132 -36
  212. package/lib/views/DrawerComponent.js +21 -2
  213. package/lib/views/PageComponent.js +2 -1
  214. package/lib/views/ViewNavigation.d.ts +3 -9
  215. package/lib/views/ViewNavigation.js +16 -2
  216. package/lib/views/createViewMeta.d.ts +29 -1
  217. package/lib/views/createViewMeta.js +338 -72
  218. package/lib/views/index.d.ts +1 -0
  219. package/lib/views/index.js +3 -0
  220. package/lib/views/useDialog.d.ts +9 -8
  221. package/lib/views/useDialog.js +19 -14
  222. package/lib/views/useDrawer.d.ts +9 -8
  223. package/lib/views/useDrawer.js +54 -35
  224. package/lib/views/usePage.d.ts +9 -8
  225. package/lib/views/usePage.js +20 -14
  226. package/package.json +6 -3
  227. package/src/BlockScopedFlowEngine.ts +86 -0
  228. package/src/FlowContextProvider.tsx +4 -2
  229. package/src/JSRunner.ts +3 -0
  230. package/src/ViewScopedFlowEngine.ts +15 -1
  231. package/src/__tests__/JSRunner.test.ts +62 -53
  232. package/src/__tests__/blockScopedFlowEngine.test.ts +154 -0
  233. package/src/__tests__/createViewMeta.popup.test.ts +132 -0
  234. package/src/__tests__/flow-engine.test.ts +3 -0
  235. package/src/__tests__/flowContext.test.ts +52 -0
  236. package/src/__tests__/flowContextCreateJSRunner.test.ts +163 -0
  237. package/src/__tests__/flowEngine.saveModel.test.ts +4 -0
  238. package/src/__tests__/flowRunJSContextDefine.test.ts +508 -0
  239. package/src/__tests__/flowSettings.open.test.tsx +2 -0
  240. package/src/__tests__/flowSettings.test.ts +2 -0
  241. package/src/__tests__/globalFlowRegistry.test.ts +1 -1
  242. package/src/__tests__/modelOperationScheduler.test.ts +346 -0
  243. package/src/__tests__/objectVariable.test.ts +464 -0
  244. package/src/__tests__/runjsContext.test.ts +216 -35
  245. package/src/__tests__/runjsContextImplementations.test.ts +217 -0
  246. package/src/__tests__/runjsContextRuntime.test.ts +269 -0
  247. package/src/__tests__/runjsEdgeCases.test.ts +281 -0
  248. package/src/__tests__/runjsLocales.test.ts +36 -0
  249. package/src/__tests__/runjsRuntimeFeatures.test.ts +461 -0
  250. package/src/__tests__/runjsSnippets.test.ts +140 -0
  251. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  252. package/src/acl/Acl.tsx +14 -0
  253. package/src/acl/__tests__/Acl.test.tsx +43 -0
  254. package/src/components/DynamicFlowsEditor.tsx +3 -4
  255. package/src/components/FieldModelRenderer.tsx +20 -7
  256. package/src/components/FieldSkeleton.tsx +27 -0
  257. package/src/components/FlowContextSelector.tsx +6 -2
  258. package/src/components/FlowModelRenderer.tsx +33 -81
  259. package/src/components/FormItem.tsx +8 -1
  260. package/src/components/MobilePopup.style.ts +220 -0
  261. package/src/components/MobilePopup.tsx +86 -0
  262. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +6 -6
  263. package/src/components/index.ts +1 -0
  264. package/src/components/settings/independents/dropdown/FlowsDropdownButton.tsx +1 -1
  265. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +17 -4
  266. package/src/components/settings/wrappers/contextual/FlowsContextMenu.tsx +1 -1
  267. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +39 -10
  268. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +14 -1
  269. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +425 -0
  270. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +5 -7
  271. package/src/components/variables/VariableInput.tsx +25 -5
  272. package/src/components/variables/VariableTag.tsx +54 -2
  273. package/src/components/variables/types.ts +2 -0
  274. package/src/data-source/__tests__/sortCollectionsByInherits.test.ts +125 -0
  275. package/src/data-source/index.ts +42 -11
  276. package/src/data-source/sortCollectionsByInherits.ts +61 -0
  277. package/src/emitter.ts +14 -0
  278. package/src/executor/FlowExecutor.ts +213 -119
  279. package/src/executor/__tests__/ctx-defs-injection.test.ts +197 -0
  280. package/src/executor/__tests__/flowExecutor.test.ts +151 -5
  281. package/src/flow-registry/GlobalFlowRegistry.ts +1 -0
  282. package/src/flow-registry/InstanceFlowRegistry.ts +1 -0
  283. package/src/flow-registry/__tests__/globalFlowRegistry.test.ts +54 -0
  284. package/src/flowContext.ts +303 -104
  285. package/src/flowEngine.ts +96 -6
  286. package/src/flowSettings.ts +12 -4
  287. package/src/hooks/useApplyAutoFlows.ts +3 -1
  288. package/src/index.ts +12 -1
  289. package/src/locale/en-US.json +4 -2
  290. package/src/locale/zh-CN.json +4 -2
  291. package/src/models/CollectionFieldModel.tsx +60 -8
  292. package/src/models/__tests__/dispatchEvent.behavior.test.ts +169 -0
  293. package/src/models/__tests__/flowModel.getFlows.sort.test.ts +33 -9
  294. package/src/models/__tests__/flowModel.scheduleModelOperation.test.tsx +129 -0
  295. package/src/models/__tests__/flowModel.test.ts +234 -111
  296. package/src/models/__tests__/forkFlowModel.test.ts +40 -7
  297. package/src/models/flowModel.tsx +197 -132
  298. package/src/models/forkFlowModel.ts +48 -8
  299. package/src/provider.tsx +10 -7
  300. package/src/resources/multiRecordResource.ts +28 -1
  301. package/src/resources/singleRecordResource.ts +19 -1
  302. package/src/resources/sqlResource.ts +20 -25
  303. package/src/runjs-context/contexts/FormJSFieldItemRunJSContext.ts +28 -21
  304. package/src/runjs-context/contexts/JSBlockRunJSContext.ts +46 -34
  305. package/src/runjs-context/contexts/JSCollectionActionRunJSContext.ts +15 -16
  306. package/src/runjs-context/contexts/JSColumnRunJSContext.ts +58 -0
  307. package/src/runjs-context/contexts/JSFieldRunJSContext.ts +30 -25
  308. package/src/runjs-context/contexts/JSItemRunJSContext.ts +25 -21
  309. package/src/runjs-context/contexts/JSRecordActionRunJSContext.ts +17 -18
  310. package/src/runjs-context/contexts/base.ts +196 -0
  311. package/src/runjs-context/helpers.ts +32 -30
  312. package/src/runjs-context/registry.ts +16 -47
  313. package/src/runjs-context/setup.ts +51 -0
  314. package/src/runjs-context/snippets/global/api-request.snippet.ts +38 -0
  315. package/src/runjs-context/snippets/global/clipboard-copy-text.snippet.ts +42 -0
  316. package/src/runjs-context/snippets/global/import-esm.snippet.ts +39 -0
  317. package/src/runjs-context/snippets/global/message-error.snippet.ts +6 -0
  318. package/src/runjs-context/snippets/global/message-success.snippet.ts +6 -0
  319. package/src/runjs-context/snippets/global/notification-open.snippet.ts +11 -1
  320. package/src/runjs-context/snippets/global/open-view-dialog.snippet.ts +10 -3
  321. package/src/runjs-context/snippets/global/open-view-drawer.snippet.ts +10 -3
  322. package/src/runjs-context/snippets/global/query-selector.snippet.ts +34 -0
  323. package/src/runjs-context/snippets/global/require-amd.snippet.ts +30 -0
  324. package/src/runjs-context/snippets/global/window-open.snippet.ts +11 -1
  325. package/src/runjs-context/snippets/index.ts +178 -39
  326. package/src/runjs-context/snippets/scene/{jsblock → block}/add-event-listener.snippet.ts +14 -2
  327. package/src/runjs-context/snippets/scene/block/api-fetch-render-list.snippet.ts +45 -0
  328. package/src/runjs-context/snippets/scene/block/chartjs-bar.snippet.ts +80 -0
  329. package/src/runjs-context/snippets/scene/block/echarts-init.snippet.ts +44 -0
  330. package/src/runjs-context/snippets/scene/block/render-antd-icons.snippet.ts +46 -0
  331. package/src/runjs-context/snippets/scene/block/render-button-handler.snippet.ts +35 -0
  332. package/src/runjs-context/snippets/scene/block/render-iframe.snippet.ts +38 -0
  333. package/src/runjs-context/snippets/scene/block/render-info-card.snippet.ts +52 -0
  334. package/src/runjs-context/snippets/scene/block/render-react-jsx.snippet.ts +39 -0
  335. package/src/runjs-context/snippets/scene/block/render-react.snippet.ts +38 -0
  336. package/src/runjs-context/snippets/scene/block/render-statistics.snippet.ts +76 -0
  337. package/src/runjs-context/snippets/scene/block/render-timeline.snippet.ts +65 -0
  338. package/src/runjs-context/snippets/scene/block/resource-example.snippet.ts +46 -0
  339. package/src/runjs-context/snippets/scene/block/three-users-orbit.snippet.ts +264 -0
  340. package/src/runjs-context/snippets/scene/block/vue-component.snippet.ts +105 -0
  341. package/src/runjs-context/snippets/scene/detail/color-by-value.snippet.ts +33 -0
  342. package/src/runjs-context/snippets/scene/detail/copy-to-clipboard.snippet.ts +45 -0
  343. package/src/runjs-context/snippets/scene/detail/format-number.snippet.ts +32 -0
  344. package/src/runjs-context/snippets/scene/detail/innerHTML-value.snippet.ts +31 -0
  345. package/src/runjs-context/snippets/scene/detail/percentage-bar.snippet.ts +63 -0
  346. package/src/runjs-context/snippets/scene/detail/relative-time.snippet.ts +61 -0
  347. package/src/runjs-context/snippets/scene/detail/status-tag.snippet.ts +55 -0
  348. package/src/runjs-context/snippets/scene/form/calculate-total.snippet.ts +44 -0
  349. package/src/runjs-context/snippets/scene/form/cascade-select.snippet.ts +62 -0
  350. package/src/runjs-context/snippets/scene/form/conditional-required.snippet.ts +45 -0
  351. package/src/runjs-context/snippets/scene/form/copy-field-values.snippet.ts +55 -0
  352. package/src/runjs-context/snippets/scene/{jsitem → form}/render-basic.snippet.ts +14 -2
  353. package/src/runjs-context/snippets/scene/{linkage → form}/set-disabled.snippet.ts +15 -3
  354. package/src/runjs-context/snippets/scene/{linkage → form}/set-field-value.snippet.ts +15 -3
  355. package/src/runjs-context/snippets/scene/{linkage → form}/set-required.snippet.ts +15 -3
  356. package/src/runjs-context/snippets/scene/form/toggle-multiple-fields.snippet.ts +48 -0
  357. package/src/runjs-context/snippets/scene/{linkage → form}/toggle-visible.snippet.ts +15 -3
  358. package/src/runjs-context/snippets/scene/table/cell-open-dialog.snippet.ts +45 -0
  359. package/src/runjs-context/snippets/scene/{actions → table}/collection-selected-count.snippet.ts +14 -2
  360. package/src/runjs-context/snippets/scene/table/concat-fields.snippet.ts +60 -0
  361. package/src/runjs-context/snippets/scene/table/destroy-selected.snippet.ts +36 -0
  362. package/src/runjs-context/snippets/scene/table/export-selected-json.snippet.ts +45 -0
  363. package/src/runjs-context/snippets/scene/{actions → table}/iterate-selected-rows.snippet.ts +14 -2
  364. package/src/runjs-context/snippets/types.ts +5 -1
  365. package/src/scheduler/ModelOperationScheduler.ts +304 -0
  366. package/src/types.ts +34 -0
  367. package/src/utils/__tests__/flows.test.ts +65 -0
  368. package/src/utils/__tests__/jsxTransform.test.ts +38 -0
  369. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +25 -0
  370. package/src/utils/__tests__/pruneFilter.test.ts +38 -0
  371. package/src/utils/__tests__/safeGlobals.test.ts +22 -1
  372. package/src/utils/__tests__/variablesParams.test.ts +63 -0
  373. package/src/utils/associationObjectVariable.ts +180 -0
  374. package/src/utils/buildSettingsViewInputArgs.ts +72 -0
  375. package/src/utils/createEphemeralContext.ts +142 -0
  376. package/src/utils/flows.ts +23 -0
  377. package/src/utils/index.ts +11 -2
  378. package/src/utils/jsxTransform.ts +39 -0
  379. package/src/utils/params-resolvers.ts +2 -2
  380. package/src/utils/parsePathnameToViewParams.ts +50 -6
  381. package/src/utils/pruneFilter.ts +41 -0
  382. package/src/utils/safeGlobals.ts +49 -3
  383. package/src/utils/schema-utils.ts +1 -1
  384. package/src/utils/serverContextParams.ts +1 -0
  385. package/src/utils/translation.ts +7 -2
  386. package/src/utils/variablesParams.ts +156 -38
  387. package/src/views/DrawerComponent.tsx +21 -2
  388. package/src/views/PageComponent.tsx +1 -1
  389. package/src/views/ViewNavigation.ts +20 -12
  390. package/src/views/__tests__/ViewNavigation.test.ts +10 -0
  391. package/src/views/createViewMeta.ts +393 -70
  392. package/src/views/index.tsx +1 -0
  393. package/src/views/useDialog.tsx +24 -18
  394. package/src/views/useDrawer.tsx +74 -45
  395. package/src/views/usePage.tsx +26 -17
  396. package/lib/runjs-context/contexts/FlowRunJSContext.d.ts +0 -38
  397. package/lib/runjs-context/contexts/FlowRunJSContext.js +0 -217
  398. package/lib/runjs-context/contexts/LinkageRunJSContext.js +0 -62
  399. package/lib/runjs-context/index.d.ts +0 -19
  400. package/lib/runjs-context/index.js +0 -57
  401. package/lib/runjs-context/snippets/global/api-request-get.snippet.d.ts +0 -16
  402. package/lib/runjs-context/snippets/global/api-request-get.snippet.js +0 -42
  403. package/lib/runjs-context/snippets/global/api-request-post.snippet.d.ts +0 -16
  404. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.d.ts +0 -16
  405. package/lib/runjs-context/snippets/global/console-log-ctx.snippet.js +0 -41
  406. package/lib/runjs-context/snippets/global/requireAsync.snippet.d.ts +0 -16
  407. package/lib/runjs-context/snippets/global/sleep.snippet.d.ts +0 -16
  408. package/lib/runjs-context/snippets/global/sleep.snippet.js +0 -43
  409. package/lib/runjs-context/snippets/global/try-catch-async.snippet.d.ts +0 -16
  410. package/lib/runjs-context/snippets/libs/echarts-init.snippet.d.ts +0 -15
  411. package/lib/runjs-context/snippets/scene/actions/collection-selected-count.snippet.d.ts +0 -15
  412. package/lib/runjs-context/snippets/scene/actions/iterate-selected-rows.snippet.d.ts +0 -15
  413. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.d.ts +0 -15
  414. package/lib/runjs-context/snippets/scene/actions/record-id-message.snippet.js +0 -43
  415. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.d.ts +0 -15
  416. package/lib/runjs-context/snippets/scene/actions/run-action-basic.snippet.js +0 -40
  417. package/lib/runjs-context/snippets/scene/jsblock/add-event-listener.snippet.d.ts +0 -15
  418. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.d.ts +0 -15
  419. package/lib/runjs-context/snippets/scene/jsblock/append-style.snippet.js +0 -42
  420. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.d.ts +0 -15
  421. package/lib/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.js +0 -46
  422. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.d.ts +0 -15
  423. package/lib/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.js +0 -41
  424. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.d.ts +0 -15
  425. package/lib/runjs-context/snippets/scene/jsblock/render-basic.snippet.js +0 -41
  426. package/lib/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.d.ts +0 -15
  427. package/lib/runjs-context/snippets/scene/jsblock/render-react.snippet.d.ts +0 -15
  428. package/lib/runjs-context/snippets/scene/jsfield/color-by-value.snippet.d.ts +0 -15
  429. package/lib/runjs-context/snippets/scene/jsfield/format-number.snippet.d.ts +0 -15
  430. package/lib/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.d.ts +0 -15
  431. package/lib/runjs-context/snippets/scene/jsitem/render-basic.snippet.d.ts +0 -15
  432. package/lib/runjs-context/snippets/scene/linkage/set-disabled.snippet.d.ts +0 -15
  433. package/lib/runjs-context/snippets/scene/linkage/set-field-value.snippet.d.ts +0 -15
  434. package/lib/runjs-context/snippets/scene/linkage/set-required.snippet.d.ts +0 -15
  435. package/lib/runjs-context/snippets/scene/linkage/toggle-visible.snippet.d.ts +0 -15
  436. package/src/runjs-context/contexts/FlowRunJSContext.ts +0 -190
  437. package/src/runjs-context/contexts/LinkageRunJSContext.ts +0 -35
  438. package/src/runjs-context/index.ts +0 -20
  439. package/src/runjs-context/snippets/global/api-request-get.snippet.ts +0 -20
  440. package/src/runjs-context/snippets/global/api-request-post.snippet.ts +0 -20
  441. package/src/runjs-context/snippets/global/console-log-ctx.snippet.ts +0 -19
  442. package/src/runjs-context/snippets/global/copy-record-json.snippet.ts +0 -21
  443. package/src/runjs-context/snippets/global/copy-to-clipboard.snippet.ts +0 -21
  444. package/src/runjs-context/snippets/global/log-json-record.snippet.ts +0 -21
  445. package/src/runjs-context/snippets/global/requireAsync.snippet.ts +0 -24
  446. package/src/runjs-context/snippets/global/sleep.snippet.ts +0 -21
  447. package/src/runjs-context/snippets/global/try-catch-async.snippet.ts +0 -22
  448. package/src/runjs-context/snippets/global/view-navigation-push.snippet.ts +0 -23
  449. package/src/runjs-context/snippets/libs/echarts-init.snippet.ts +0 -24
  450. package/src/runjs-context/snippets/scene/actions/record-id-message.snippet.ts +0 -21
  451. package/src/runjs-context/snippets/scene/actions/run-action-basic.snippet.ts +0 -18
  452. package/src/runjs-context/snippets/scene/jsblock/append-style.snippet.ts +0 -20
  453. package/src/runjs-context/snippets/scene/jsblock/jsx-mount.snippet.ts +0 -24
  454. package/src/runjs-context/snippets/scene/jsblock/jsx-unmount.snippet.ts +0 -19
  455. package/src/runjs-context/snippets/scene/jsblock/render-basic.snippet.ts +0 -24
  456. package/src/runjs-context/snippets/scene/jsblock/render-button-handler.snippet.ts +0 -24
  457. package/src/runjs-context/snippets/scene/jsblock/render-card.snippet.ts +0 -30
  458. package/src/runjs-context/snippets/scene/jsblock/render-react.snippet.ts +0 -34
  459. package/src/runjs-context/snippets/scene/jsfield/color-by-value.snippet.ts +0 -20
  460. package/src/runjs-context/snippets/scene/jsfield/format-number.snippet.ts +0 -19
  461. package/src/runjs-context/snippets/scene/jsfield/innerHTML-value.snippet.ts +0 -18
  462. /package/lib/runjs-context/snippets/global/{copy-record-json.snippet.d.ts → api-request.snippet.d.ts} +0 -0
  463. /package/lib/runjs-context/snippets/global/{copy-to-clipboard.snippet.d.ts → clipboard-copy-text.snippet.d.ts} +0 -0
  464. /package/lib/runjs-context/snippets/global/{log-json-record.snippet.d.ts → import-esm.snippet.d.ts} +0 -0
  465. /package/lib/runjs-context/snippets/global/{view-navigation-push.snippet.d.ts → query-selector.snippet.d.ts} +0 -0
  466. /package/lib/runjs-context/snippets/scene/{jsblock/render-card.snippet.d.ts → block/echarts-init.snippet.d.ts} +0 -0
@@ -7,54 +7,235 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { describe, it, expect } from 'vitest';
10
+ import { describe, it, expect, beforeAll } from 'vitest';
11
11
  import {
12
12
  RunJSContextRegistry,
13
- registerDefaultMappings,
14
13
  getRunJSDocFor,
15
14
  createJSRunnerWithVersion,
16
- FlowRunJSContext,
17
- } from '../runjs-context';
15
+ getRunJSScenesForModel,
16
+ getRunJSScenesForContext,
17
+ } from '..';
18
+ import { setupRunJSContexts } from '../runjs-context/setup';
19
+ import { FlowContext } from '../flowContext';
18
20
  import { JSRunner } from '../JSRunner';
19
- import type { FlowContext } from '../flowContext';
20
21
 
21
22
  describe('flowRunJSContext registry and doc', () => {
22
- it('registerDefaultMappings should register v1 mapping', () => {
23
- registerDefaultMappings();
24
- expect(RunJSContextRegistry['resolve']('v1' as any, '*')).toBeTruthy();
23
+ beforeAll(async () => {
24
+ await setupRunJSContexts();
25
25
  });
26
26
 
27
- it('getRunJSDocFor should pick subclass by model class name', () => {
28
- const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
29
- const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
30
- expect(doc?.label).toMatch(/JSBlock RunJS/);
27
+ describe('setupRunJSContexts', () => {
28
+ it('should register v1 mapping', () => {
29
+ expect(RunJSContextRegistry['resolve']('v1' as any, '*')).toBeTruthy();
30
+ });
31
+
32
+ it('should register all context types', () => {
33
+ const contextTypes = [
34
+ 'JSBlockModel',
35
+ 'JSFieldModel',
36
+ 'JSItemModel',
37
+ 'JSColumnModel',
38
+ 'FormJSFieldItemModel',
39
+ 'JSRecordActionModel',
40
+ 'JSCollectionActionModel',
41
+ ];
42
+
43
+ contextTypes.forEach((modelClass) => {
44
+ const ctor = RunJSContextRegistry['resolve']('v1' as any, modelClass);
45
+ expect(ctor).toBeTruthy();
46
+ });
47
+ });
48
+
49
+ it('should expose scene metadata for contexts', () => {
50
+ expect(getRunJSScenesForModel('JSBlockModel', 'v1')).toEqual(['block']);
51
+ expect(getRunJSScenesForModel('JSFieldModel', 'v1')).toEqual(['detail']);
52
+ expect(getRunJSScenesForModel('UnknownModel', 'v1')).toEqual([]);
53
+ });
54
+
55
+ it('should only execute once (idempotent)', async () => {
56
+ const ctor1 = RunJSContextRegistry['resolve']('v1' as any, '*');
57
+ await setupRunJSContexts();
58
+ await setupRunJSContexts();
59
+ const ctor2 = RunJSContextRegistry['resolve']('v1' as any, '*');
60
+ expect(ctor1).toBe(ctor2);
61
+ });
31
62
  });
32
63
 
33
- it('createJSRunnerWithVersion returns a JSRunner', async () => {
34
- const stubCtx: any = {
35
- model: { constructor: { name: 'JSFieldModel' } },
36
- createProxy() {
37
- return this;
38
- },
39
- };
40
- const runner = createJSRunnerWithVersion.call(stubCtx, { version: 'v1' });
41
- expect(runner).toBeInstanceOf(JSRunner);
42
- const result = await runner.run('return 1 + 1');
43
- expect(result?.success).toBe(true);
44
- expect(result?.value).toBe(2);
64
+ describe('getRunJSDocFor', () => {
65
+ it('should pick subclass by model class name', () => {
66
+ const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
67
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
68
+ expect(doc?.label).toMatch(/RunJS/);
69
+ });
70
+
71
+ it('should return base doc for unknown model', () => {
72
+ const ctx: any = { model: { constructor: { name: 'UnknownModel' } } };
73
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
74
+ expect(doc).toBeTruthy();
75
+ expect(doc?.label).toMatch(/RunJS base/);
76
+ });
77
+
78
+ it('should support locale-specific doc', () => {
79
+ const ctx = new FlowContext();
80
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSFieldModel' } } });
81
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
82
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
83
+ expect(doc?.properties?.message).toMatch(/Ant Design 全局消息/);
84
+ });
85
+
86
+ it('should fallback to English when locale is not found', () => {
87
+ const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
88
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
89
+ expect(doc?.label).toBeTruthy();
90
+ });
45
91
  });
46
92
 
47
- it('default globals (window/document) should be injected for field/block contexts', async () => {
48
- const stubCtx: any = {
49
- model: { constructor: { name: 'JSFieldModel' } },
50
- createProxy() {
51
- return this;
52
- },
53
- };
54
- const runner = createJSRunnerWithVersion.call(stubCtx, { version: 'v1' });
55
- const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
56
- expect(r.success && r.value).toBe(true);
93
+ describe('createJSRunnerWithVersion', () => {
94
+ it('should return a JSRunner instance', () => {
95
+ const ctx = new FlowContext();
96
+ ctx.defineProperty('model', {
97
+ value: { constructor: { name: 'JSFieldModel' } },
98
+ });
99
+ const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
100
+ expect(runner).toBeInstanceOf(JSRunner);
101
+ });
102
+
103
+ it('should execute JavaScript code successfully', async () => {
104
+ const ctx = new FlowContext();
105
+ ctx.defineProperty('model', {
106
+ value: { constructor: { name: 'JSFieldModel' } },
107
+ });
108
+ const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
109
+ const result = await runner.run('return 1 + 1');
110
+ expect(result?.success).toBe(true);
111
+ expect(result?.value).toBe(2);
112
+ });
113
+
114
+ it('should inject window/document for field contexts', async () => {
115
+ const ctx = new FlowContext();
116
+ ctx.defineProperty('model', {
117
+ value: { constructor: { name: 'JSFieldModel' } },
118
+ });
119
+ const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
120
+ const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
121
+ expect(r.success && r.value).toBe(true);
122
+ });
123
+
124
+ it('should inject window/document for block contexts', async () => {
125
+ const ctx = new FlowContext();
126
+ ctx.defineProperty('model', {
127
+ value: { constructor: { name: 'JSBlockModel' } },
128
+ });
129
+ const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
130
+ const r = await runner.run('return typeof window !== "undefined" && typeof document !== "undefined"');
131
+ expect(r.success && r.value).toBe(true);
132
+ });
133
+
134
+ it('should provide ctx variable in globals', async () => {
135
+ const ctx = new FlowContext();
136
+ ctx.defineProperty('model', {
137
+ value: { constructor: { name: 'JSFieldModel' } },
138
+ });
139
+ const runner = createJSRunnerWithVersion.call(ctx, { version: 'v1' });
140
+ const r = await runner.run('return typeof ctx !== "undefined"');
141
+ expect(r.success && r.value).toBe(true);
142
+ });
143
+
144
+ it('should throw error when no context is registered', () => {
145
+ const ctx = new FlowContext();
146
+ ctx.defineProperty('model', {
147
+ value: { constructor: { name: 'UnknownModel' } },
148
+ });
149
+ // Clear registry temporarily - this test checks the error case
150
+ const originalResolve = RunJSContextRegistry['resolve'];
151
+ RunJSContextRegistry['resolve'] = () => undefined;
152
+
153
+ expect(() => {
154
+ createJSRunnerWithVersion.call(ctx, { version: 'v999' as any });
155
+ }).toThrow(/No RunJSContext registered/);
156
+
157
+ // Restore
158
+ RunJSContextRegistry['resolve'] = originalResolve;
159
+ });
57
160
  });
58
161
 
59
- // Linkage kind via __runjsKind removed; linkage scripts now run in the host model context.
162
+ describe('Context-specific features', () => {
163
+ it('JSColumnModel context should be available', () => {
164
+ const ctor = RunJSContextRegistry['resolve']('v1' as any, 'JSColumnModel');
165
+ expect(ctor).toBeTruthy();
166
+ const ctx = new FlowContext();
167
+ const instance = new (ctor as any)(ctx);
168
+ expect(instance).toBeTruthy();
169
+ });
170
+
171
+ it('should resolve scenes from context instance', () => {
172
+ const ctx = new FlowContext();
173
+ ctx.defineProperty('model', { value: { constructor: { name: 'JSColumnModel' } } });
174
+ expect(getRunJSScenesForContext(ctx as any, { version: 'v1' })).toEqual(['table']);
175
+ });
176
+
177
+ it('JSBlockModel context should have element property in doc', () => {
178
+ const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
179
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
180
+ expect(doc?.properties?.element).toBeTruthy();
181
+ });
182
+
183
+ it('JSFieldModel context should have record property in doc', () => {
184
+ const ctx: any = { model: { constructor: { name: 'JSFieldModel' } } };
185
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
186
+ expect(doc?.properties?.record).toBeTruthy();
187
+ });
188
+
189
+ it('JSItemModel context should have element and record properties in doc', () => {
190
+ const ctx: any = { model: { constructor: { name: 'JSItemModel' } } };
191
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
192
+ expect(doc?.properties?.element).toBeTruthy();
193
+ expect(doc?.properties?.record).toBeTruthy();
194
+ expect(doc?.properties?.resource).toBeTruthy();
195
+ });
196
+ });
197
+
198
+ describe('Base context metadata', () => {
199
+ it('should have logger property in base context', () => {
200
+ const ctx: any = { model: { constructor: { name: '*' } } };
201
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
202
+ expect(doc?.properties?.logger).toBeTruthy();
203
+ });
204
+
205
+ it('should have message property in base context', () => {
206
+ const ctx: any = { model: { constructor: { name: '*' } } };
207
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
208
+ expect(doc?.properties?.message).toBeTruthy();
209
+ });
210
+
211
+ it('should have api property in base context', () => {
212
+ const ctx: any = { model: { constructor: { name: '*' } } };
213
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
214
+ expect(doc?.properties?.api).toBeTruthy();
215
+ });
216
+
217
+ it('should have t method in base context', () => {
218
+ const ctx: any = { model: { constructor: { name: '*' } } };
219
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
220
+ expect(doc?.methods?.t).toBeTruthy();
221
+ });
222
+
223
+ it('should have requireAsync method in base context', () => {
224
+ const ctx: any = { model: { constructor: { name: '*' } } };
225
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
226
+ expect(doc?.methods?.requireAsync).toBeTruthy();
227
+ });
228
+
229
+ it('should have runAction method in base context', () => {
230
+ const ctx: any = { model: { constructor: { name: '*' } } };
231
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
232
+ expect(doc?.methods?.runAction).toBeTruthy();
233
+ });
234
+
235
+ it('should have openView method in base context', () => {
236
+ const ctx: any = { model: { constructor: { name: '*' } } };
237
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
238
+ expect(doc?.methods?.openView).toBeTruthy();
239
+ });
240
+ });
60
241
  });
@@ -0,0 +1,217 @@
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, beforeAll } from 'vitest';
11
+ import { RunJSContextRegistry, getRunJSDocFor } from '..';
12
+ import { setupRunJSContexts } from '../runjs-context/setup';
13
+ import { FlowContext } from '../flowContext';
14
+
15
+ describe('Specific RunJSContext implementations', () => {
16
+ beforeAll(async () => {
17
+ await setupRunJSContexts();
18
+ });
19
+
20
+ describe('JSColumnRunJSContext', () => {
21
+ it('should be registered for JSColumnModel', () => {
22
+ const ctor = RunJSContextRegistry['resolve']('v1' as any, 'JSColumnModel');
23
+ expect(ctor).toBeTruthy();
24
+ });
25
+
26
+ it('should have element property in doc', () => {
27
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
28
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
29
+ expect(doc?.properties?.element).toBeTruthy();
30
+ expect(doc?.properties?.element).toContain('ElementProxy');
31
+ });
32
+
33
+ it('should have record property in doc', () => {
34
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
35
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
36
+ expect(doc?.properties?.record).toBeTruthy();
37
+ expect(doc?.properties?.record).toContain('row record');
38
+ });
39
+
40
+ it('should have recordIndex property in doc', () => {
41
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
42
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
43
+ expect(doc?.properties?.recordIndex).toBeTruthy();
44
+ });
45
+
46
+ it('should have collection property in doc', () => {
47
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
48
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
49
+ expect(doc?.properties?.collection).toBeTruthy();
50
+ });
51
+
52
+ it('should have viewer property in doc', () => {
53
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
54
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
55
+ expect(doc?.properties?.viewer).toBeTruthy();
56
+ });
57
+
58
+ it('should have onRefReady method in doc', () => {
59
+ const ctx: any = { model: { constructor: { name: 'JSColumnModel' } } };
60
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
61
+ expect(doc?.methods?.onRefReady).toBeTruthy();
62
+ });
63
+
64
+ it('should support zh-CN locale', () => {
65
+ const ctx = new FlowContext();
66
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSColumnModel' } } });
67
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
68
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
69
+ expect(doc?.label).toMatch(/JS 列/);
70
+ expect(doc?.properties?.element).toContain('表格单元格');
71
+ });
72
+
73
+ it('should create instance successfully', () => {
74
+ const ctor = RunJSContextRegistry['resolve']('v1' as any, 'JSColumnModel');
75
+ const baseCtx = new FlowContext();
76
+ const instance = new (ctor as any)(baseCtx);
77
+ expect(instance).toBeTruthy();
78
+ });
79
+ });
80
+
81
+ describe('JSBlockRunJSContext', () => {
82
+ it('should have React and antd in doc', () => {
83
+ const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
84
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
85
+ expect(doc?.properties?.React).toBeTruthy();
86
+ expect(doc?.properties?.antd).toBeTruthy();
87
+ });
88
+
89
+ it('should have element property', () => {
90
+ const ctx: any = { model: { constructor: { name: 'JSBlockModel' } } };
91
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
92
+ expect(doc?.properties?.element).toBeTruthy();
93
+ });
94
+
95
+ it('should support zh-CN locale', () => {
96
+ const ctx = new FlowContext();
97
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSBlockModel' } } });
98
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
99
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
100
+ expect(doc?.label).toContain('RunJS');
101
+ });
102
+ });
103
+
104
+ describe('JSFieldRunJSContext', () => {
105
+ it('should have record, value, and collection properties', () => {
106
+ const ctx: any = { model: { constructor: { name: 'JSFieldModel' } } };
107
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
108
+ expect(doc?.properties?.record).toBeTruthy();
109
+ expect(doc?.properties?.value).toBeTruthy();
110
+ expect(doc?.properties?.collection).toBeTruthy();
111
+ });
112
+
113
+ it('should have element property', () => {
114
+ const ctx: any = { model: { constructor: { name: 'JSFieldModel' } } };
115
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
116
+ expect(doc?.properties?.element).toBeTruthy();
117
+ });
118
+
119
+ it('should support zh-CN locale', () => {
120
+ const ctx = new FlowContext();
121
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSFieldModel' } } });
122
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
123
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
124
+ expect(doc?.label).toMatch(/JS 字段/);
125
+ });
126
+ });
127
+
128
+ describe('JSItemRunJSContext', () => {
129
+ it('should have element and record properties', () => {
130
+ const ctx: any = { model: { constructor: { name: 'JSItemModel' } } };
131
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
132
+ expect(doc?.properties?.element).toBeTruthy();
133
+ expect(doc?.properties?.record).toBeTruthy();
134
+ });
135
+
136
+ it('should have resource property', () => {
137
+ const ctx: any = { model: { constructor: { name: 'JSItemModel' } } };
138
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
139
+ expect(doc?.properties?.resource).toBeTruthy();
140
+ });
141
+
142
+ it('should support zh-CN locale', () => {
143
+ const ctx = new FlowContext();
144
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSItemModel' } } });
145
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
146
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
147
+ expect(doc?.label).toMatch(/JS 表单项/);
148
+ });
149
+ });
150
+
151
+ describe('JSRecordActionRunJSContext', () => {
152
+ it('should have record property', () => {
153
+ const ctx: any = { model: { constructor: { name: 'JSRecordActionModel' } } };
154
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
155
+ expect(doc?.properties?.record).toBeTruthy();
156
+ });
157
+
158
+ it('should have filterByTk property', () => {
159
+ const ctx: any = { model: { constructor: { name: 'JSRecordActionModel' } } };
160
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
161
+ expect(doc?.properties?.filterByTk).toBeTruthy();
162
+ });
163
+
164
+ it('should support zh-CN locale', () => {
165
+ const ctx = new FlowContext();
166
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSRecordActionModel' } } });
167
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
168
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
169
+ expect(doc?.label).toMatch(/JS 记录动作/);
170
+ });
171
+ });
172
+
173
+ describe('JSCollectionActionRunJSContext', () => {
174
+ it('should have resource property', () => {
175
+ const ctx: any = { model: { constructor: { name: 'JSCollectionActionModel' } } };
176
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
177
+ expect(doc?.properties?.resource).toBeTruthy();
178
+ });
179
+
180
+ it('should support zh-CN locale', () => {
181
+ const ctx = new FlowContext();
182
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'JSCollectionActionModel' } } });
183
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
184
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
185
+ expect(doc?.label).toMatch(/JS 集合动作/);
186
+ });
187
+ });
188
+
189
+ describe('FormJSFieldItemRunJSContext', () => {
190
+ it('should have element property', () => {
191
+ const ctx: any = { model: { constructor: { name: 'FormJSFieldItemModel' } } };
192
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
193
+ expect(doc?.properties?.element).toBeTruthy();
194
+ });
195
+
196
+ it('should have value and record properties', () => {
197
+ const ctx: any = { model: { constructor: { name: 'FormJSFieldItemModel' } } };
198
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
199
+ expect(doc?.properties?.value).toBeTruthy();
200
+ expect(doc?.properties?.record).toBeTruthy();
201
+ });
202
+
203
+ it('should have setProps method', () => {
204
+ const ctx: any = { model: { constructor: { name: 'FormJSFieldItemModel' } } };
205
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
206
+ expect(doc?.methods?.setProps).toBeTruthy();
207
+ });
208
+
209
+ it('should support zh-CN locale', () => {
210
+ const ctx = new FlowContext();
211
+ (ctx as any).defineProperty('model', { value: { constructor: { name: 'FormJSFieldItemModel' } } });
212
+ (ctx as any).defineProperty('api', { value: { auth: { locale: 'zh-CN' } } });
213
+ const doc = getRunJSDocFor(ctx as any, { version: 'v1' });
214
+ expect(doc?.label).toMatch(/表单 JS 字段项/);
215
+ });
216
+ });
217
+ });