@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.21

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 (308) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +43 -9
  2. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +8 -4
  3. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +3 -2
  4. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +22 -98
  5. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +32 -9
  6. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +68 -17
  7. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +1 -1
  8. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +1 -1
  9. package/dist/es/components/ScrollBar.js +0 -1
  10. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +1 -1
  11. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +1 -1
  13. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +1 -1
  14. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +7 -7
  15. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +1 -1
  16. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +1 -1
  17. package/dist/es/components/ViewForm.js +5 -0
  18. package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
  19. package/dist/es/editorProps.js +9 -1
  20. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +16 -5
  21. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +7 -7
  22. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +81 -44
  23. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +10 -3
  24. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +7 -19
  25. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +13 -6
  26. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +11 -8
  27. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +39 -12
  28. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +11 -20
  29. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +11 -6
  30. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +30 -14
  31. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +11 -4
  32. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  33. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +38 -6
  34. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +156 -155
  35. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +5 -2
  36. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +5 -2
  37. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +8 -10
  38. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +5 -2
  39. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +28 -6
  40. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +1 -1
  41. package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
  42. package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
  43. package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
  44. package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
  45. package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
  46. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +7 -7
  47. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +6 -3
  48. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +29 -6
  49. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +32 -6
  50. package/dist/es/fields/StyleSetter/icons/display/Block.js +1 -1
  51. package/dist/es/fields/StyleSetter/icons/display/Flex.js +1 -1
  52. package/dist/es/fields/StyleSetter/icons/display/Inline.js +1 -1
  53. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +1 -1
  54. package/dist/es/fields/StyleSetter/icons/display/None.js +1 -1
  55. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +11 -3
  56. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +11 -3
  57. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +11 -3
  58. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +11 -3
  59. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +17 -3
  60. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +19 -3
  61. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +19 -3
  62. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +37 -3
  63. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +33 -3
  64. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +1 -1
  65. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +1 -1
  66. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +1 -1
  67. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +56 -30
  68. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +7 -4
  69. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +35 -26
  70. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +76 -48
  71. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +29 -23
  72. package/dist/es/fields/StyleSetter/pro/Transform.vue_vue_type_script_setup_true_lang.js +7 -4
  73. package/dist/es/fields/UISelect.js +0 -1
  74. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +5 -2
  75. package/dist/es/hooks/use-code-block-edit.js +6 -3
  76. package/dist/es/hooks/use-compare-form.js +119 -0
  77. package/dist/es/hooks/use-data-source-edit.js +5 -2
  78. package/dist/es/hooks/use-stage.js +9 -4
  79. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  80. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  81. package/dist/es/icons/DatasourceIcon.js +17 -0
  82. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +1 -1
  83. package/dist/es/index.js +24 -10
  84. package/dist/es/initService.js +19 -13
  85. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +1 -1
  86. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +24 -12
  87. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +25 -18
  88. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +4 -4
  89. package/dist/es/layouts/NavMenuColumn.vue_vue_type_script_setup_true_lang.js +1 -1
  90. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +25 -38
  91. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  92. package/dist/es/layouts/history-list/BucketTab.vue_vue_type_script_setup_true_lang.js +62 -0
  93. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +177 -88
  94. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +139 -37
  95. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +164 -107
  96. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +44 -9
  97. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +49 -53
  98. package/dist/es/layouts/history-list/composables.js +138 -108
  99. package/dist/es/layouts/history-list/useHistoryList.js +56 -0
  100. package/dist/es/layouts/history-list/useHistoryRevert.js +317 -0
  101. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  102. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +5 -3
  103. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +1 -1
  104. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +1 -1
  105. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +50 -7
  107. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +33 -13
  108. package/dist/es/layouts/props-panel/use-style-panel.js +3 -2
  109. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +3 -3
  110. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +26 -38
  111. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +4 -4
  112. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  113. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +19 -4
  114. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +1 -1
  115. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +23 -6
  116. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +1 -1
  117. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +27 -5
  118. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +19 -4
  119. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  120. package/dist/es/layouts/sidebar/layer/LayerNodeContent.js +5 -0
  121. package/dist/es/layouts/sidebar/layer/LayerNodeContent.vue_vue_type_script_setup_true_lang.js +46 -0
  122. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +2 -2
  123. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +3 -2
  124. package/dist/es/layouts/sidebar/layer/use-click.js +3 -3
  125. package/dist/es/layouts/sidebar/layer/use-node-status.js +2 -2
  126. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +1 -1
  127. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +1 -1
  128. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +9 -3
  129. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +2 -2
  130. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +1 -1
  131. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +16 -16
  132. package/dist/es/plugin.js +5 -2
  133. package/dist/es/services/codeBlock.js +137 -56
  134. package/dist/es/services/dataSource.js +122 -52
  135. package/dist/es/services/dep.js +162 -41
  136. package/dist/es/services/editor.js +613 -179
  137. package/dist/es/services/events.js +2 -2
  138. package/dist/es/services/history.js +350 -386
  139. package/dist/es/services/keybinding.js +6 -6
  140. package/dist/es/services/props.js +3 -2
  141. package/dist/es/services/storage.js +2 -2
  142. package/dist/es/services/ui.js +10 -2
  143. package/dist/es/style.css +549 -113
  144. package/dist/es/utils/config.js +4 -1
  145. package/dist/es/utils/const.js +2 -2
  146. package/dist/es/utils/content-menu.js +19 -11
  147. package/dist/es/utils/data-source/index.js +34 -11
  148. package/dist/es/utils/dep/collect-worker-client.js +114 -0
  149. package/dist/es/utils/dep/idle-task.js +70 -22
  150. package/dist/es/utils/dep/worker.js +1 -1
  151. package/dist/es/utils/editor.js +103 -49
  152. package/dist/es/utils/event.js +135 -0
  153. package/dist/es/utils/history.js +220 -0
  154. package/dist/es/utils/indexed-db.js +86 -0
  155. package/dist/es/utils/monaco-editor.js +22 -6
  156. package/dist/es/utils/operator.js +2 -2
  157. package/dist/es/utils/props.js +114 -33
  158. package/dist/es/utils/type-match-rules.js +367 -0
  159. package/dist/es/utils/undo-redo.js +60 -1
  160. package/dist/style.css +549 -113
  161. package/dist/themes/magic-admin.css +3028 -0
  162. package/dist/tmagic-editor.umd.cjs +14403 -10121
  163. package/package.json +8 -8
  164. package/src/Editor.vue +43 -2
  165. package/src/components/CodeBlockEditor.vue +3 -0
  166. package/src/components/CompareForm.vue +18 -146
  167. package/src/components/ContentMenu.vue +44 -8
  168. package/src/components/FloatingBox.vue +84 -9
  169. package/src/components/ScrollBar.vue +0 -67
  170. package/src/components/ToolButton.vue +2 -2
  171. package/src/components/ViewForm.vue +55 -0
  172. package/src/editorProps.ts +30 -0
  173. package/src/fields/Code.vue +10 -2
  174. package/src/fields/CodeLink.vue +2 -5
  175. package/src/fields/CodeSelect.vue +54 -40
  176. package/src/fields/CodeSelectCol.vue +8 -1
  177. package/src/fields/CondOpSelect.vue +2 -24
  178. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
  179. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  180. package/src/fields/DataSourceFields.vue +42 -8
  181. package/src/fields/DataSourceInput.vue +10 -28
  182. package/src/fields/DataSourceMethodSelect.vue +9 -4
  183. package/src/fields/DataSourceMethods.vue +42 -21
  184. package/src/fields/DataSourceMocks.vue +3 -0
  185. package/src/fields/DisplayConds.vue +18 -1
  186. package/src/fields/EventSelect.vue +152 -166
  187. package/src/fields/StyleSetter/Index.vue +3 -12
  188. package/src/fields/StyleSetter/components/Border.vue +15 -6
  189. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  190. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  191. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  192. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  193. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  194. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  195. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  196. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  197. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  198. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  199. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  200. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  201. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  202. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  203. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  204. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  205. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  206. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  207. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  208. package/src/fields/StyleSetter/pro/Background.vue +99 -55
  209. package/src/fields/StyleSetter/pro/Border.vue +9 -11
  210. package/src/fields/StyleSetter/pro/Font.vue +66 -64
  211. package/src/fields/StyleSetter/pro/Layout.vue +211 -139
  212. package/src/fields/StyleSetter/pro/Position.vue +69 -67
  213. package/src/fields/StyleSetter/pro/Transform.vue +23 -25
  214. package/src/fields/UISelect.vue +0 -12
  215. package/src/hooks/index.ts +1 -0
  216. package/src/hooks/use-code-block-edit.ts +4 -3
  217. package/src/hooks/use-compare-form.ts +187 -0
  218. package/src/hooks/use-data-source-edit.ts +2 -2
  219. package/src/hooks/use-stage.ts +5 -3
  220. package/src/icons/DatasourceIcon.vue +7 -0
  221. package/src/index.ts +12 -0
  222. package/src/initService.ts +26 -16
  223. package/src/layouts/CodeEditor.vue +34 -11
  224. package/src/layouts/Framework.vue +15 -8
  225. package/src/layouts/NavMenu.vue +3 -3
  226. package/src/layouts/history-list/Bucket.vue +33 -41
  227. package/src/layouts/history-list/BucketTab.vue +72 -0
  228. package/src/layouts/history-list/GroupRow.vue +190 -93
  229. package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
  230. package/src/layouts/history-list/HistoryListPanel.vue +191 -95
  231. package/src/layouts/history-list/InitialRow.vue +38 -8
  232. package/src/layouts/history-list/PageTab.vue +67 -43
  233. package/src/layouts/history-list/composables.ts +239 -125
  234. package/src/layouts/history-list/useHistoryList.ts +60 -0
  235. package/src/layouts/history-list/useHistoryRevert.ts +425 -0
  236. package/src/layouts/page-bar/PageBar.vue +4 -2
  237. package/src/layouts/props-panel/FormPanel.vue +72 -6
  238. package/src/layouts/props-panel/PropsPanel.vue +62 -18
  239. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  240. package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
  241. package/src/layouts/sidebar/Sidebar.vue +13 -6
  242. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  243. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  244. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  245. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
  246. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
  247. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  248. package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
  249. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  250. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  251. package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
  252. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  253. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  254. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  255. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  256. package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
  257. package/src/plugin.ts +6 -3
  258. package/src/services/codeBlock.ts +152 -47
  259. package/src/services/dataSource.ts +120 -41
  260. package/src/services/dep.ts +292 -47
  261. package/src/services/editor.ts +820 -224
  262. package/src/services/events.ts +3 -3
  263. package/src/services/history.ts +449 -412
  264. package/src/services/keybinding.ts +6 -6
  265. package/src/services/ui.ts +33 -5
  266. package/src/theme/code-block.scss +37 -0
  267. package/src/theme/common/var.scss +1 -1
  268. package/src/theme/component-list-panel.scss +2 -2
  269. package/src/theme/data-source-field.scss +4 -0
  270. package/src/theme/display-conds.scss +11 -0
  271. package/src/theme/event.scss +70 -1
  272. package/src/theme/floating-box.scss +9 -1
  273. package/src/theme/framework.scss +4 -1
  274. package/src/theme/history-list-panel.scss +157 -23
  275. package/src/theme/layer-node-content.scss +14 -0
  276. package/src/theme/nav-menu.scss +5 -1
  277. package/src/theme/page-bar.scss +0 -4
  278. package/src/theme/props-panel.scss +5 -4
  279. package/src/theme/scroll-bar.scss +64 -0
  280. package/src/theme/style-setter/border.scss +17 -5
  281. package/src/theme/theme.scss +4 -0
  282. package/src/theme/themes/magic-admin/index.scss +214 -0
  283. package/src/theme/ui-select.scss +9 -0
  284. package/src/type.ts +668 -124
  285. package/src/utils/config.ts +9 -1
  286. package/src/utils/const.ts +3 -2
  287. package/src/utils/content-menu.ts +20 -11
  288. package/src/utils/data-source/index.ts +32 -12
  289. package/src/utils/dep/collect-worker-client.ts +149 -0
  290. package/src/utils/dep/idle-task.ts +104 -35
  291. package/src/utils/dep/worker.ts +113 -9
  292. package/src/utils/editor.ts +166 -60
  293. package/src/utils/event.ts +237 -0
  294. package/src/utils/history.ts +286 -0
  295. package/src/utils/index.ts +4 -0
  296. package/src/utils/indexed-db.ts +122 -0
  297. package/src/utils/monaco-editor.ts +27 -0
  298. package/src/utils/operator.ts +2 -2
  299. package/src/utils/props.ts +114 -11
  300. package/src/utils/type-match-rules.ts +684 -0
  301. package/src/utils/undo-redo.ts +88 -0
  302. package/types/index.d.ts +1990 -517
  303. package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
  304. package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
  305. package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
  306. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
  307. package/src/layouts/history-list/CodeBlockTab.vue +0 -61
  308. package/src/layouts/history-list/DataSourceTab.vue +0 -61
@@ -17,14 +17,14 @@
17
17
  */
18
18
  import { reactive, shallowReactive } from 'vue';
19
19
  import { throttle } from 'lodash-es';
20
- import serialize from 'serialize-javascript';
21
20
 
22
- import type { DepData, DepExtendedData, Id, MApp, MNode, Target, TargetNode } from '@tmagic/core';
21
+ import type { DepData, DepExtendedData, Id, MApp, MNode, Target } from '@tmagic/core';
23
22
  import { DepTargetType, traverseTarget, Watcher } from '@tmagic/core';
24
23
  import { isPage } from '@tmagic/utils';
25
24
 
25
+ import { CollectWorkerClient } from '@editor/utils/dep/collect-worker-client';
26
26
  import { IdleTask } from '@editor/utils/dep/idle-task';
27
- import Work from '@editor/utils/dep/worker.ts?worker&inline';
27
+ import type { DepsData } from '@editor/utils/dep/worker';
28
28
 
29
29
  import BaseService from './BaseService';
30
30
 
@@ -42,18 +42,42 @@ interface State {
42
42
 
43
43
  type StateKey = keyof State;
44
44
 
45
+ /**
46
+ * 一次 collectIdle 调用对应一个批次。批次自行统计入队/完成的任务数,在自身任务全部完成或被中断时
47
+ * 结算对应的 Promise,避免多次快速触发时共用 idleTask 的 finish 事件造成的串扰、提前 resolve,
48
+ * 以及 clearTasks 后 Promise 永不 resolve(collecting 卡死、监听器泄漏)。
49
+ */
50
+ interface CollectBatch {
51
+ nodes: MNode[];
52
+ deep: boolean;
53
+ pending: number;
54
+ dsPending: number;
55
+ collectedEmitted: boolean;
56
+ dsSettled: boolean;
57
+ aborted: boolean;
58
+ resolve: (completed: boolean) => void;
59
+ }
60
+
45
61
  class Dep extends BaseService {
46
62
  private state = shallowReactive<State>({
47
63
  collecting: false,
48
64
  taskLength: 0,
49
65
  });
50
66
 
51
- private idleTask = new IdleTask<{ node: TargetNode; deep: boolean; target: Target }>();
67
+ private idleTask = new IdleTask<void>();
68
+
69
+ private collectWorker = new CollectWorkerClient();
52
70
 
53
71
  private watcher = new Watcher({ initialTargets: reactive({}) });
54
72
 
55
73
  private waitingWorker?: Promise<void>;
56
74
 
75
+ private resolveWaitingWorker?: () => void;
76
+
77
+ private workerGeneration = 0;
78
+
79
+ private activeBatches = new Set<CollectBatch>();
80
+
57
81
  constructor() {
58
82
  super();
59
83
 
@@ -132,56 +156,77 @@ class Dep extends BaseService {
132
156
  this.emit('ds-collected', nodes, deep);
133
157
  }
134
158
 
159
+ /**
160
+ * 空闲收集依赖
161
+ *
162
+ * 遍历匹配是整个收集过程中最耗时的部分(要深度遍历节点树并对每个属性做 target 匹配),
163
+ * 节点/数据源多时在主线程执行会长时间卡死页面,因此优先交给 worker 执行,主线程只负责把结果写回 target。
164
+ * 自定义 target 的 isTarget 是无法跨线程传递的闭包函数(没有 descriptor),仍走主线程空闲队列;
165
+ * worker 不可用(如 SSR)或执行失败时也会回退到主线程空闲队列。
166
+ */
135
167
  public async collectIdle(nodes: MNode[], depExtendedData: DepExtendedData = {}, deep = false, type?: DepTargetType) {
136
168
  if (this.waitingWorker) {
137
169
  await this.waitingWorker;
138
170
  }
139
171
 
140
- this.set('collecting', true);
141
- let startTask = false;
142
- this.watcher.collectByCallback(nodes, type, ({ node, target }) => {
143
- startTask = true;
172
+ const batch: CollectBatch = {
173
+ nodes,
174
+ deep,
175
+ pending: 0,
176
+ dsPending: 0,
177
+ collectedEmitted: false,
178
+ dsSettled: false,
179
+ aborted: false,
180
+ resolve: () => {},
181
+ };
182
+
183
+ const workerTargets: Target[] = [];
184
+
185
+ for (const target of this.watcher.getCollectableTargets(type)) {
186
+ if (target.descriptor && this.collectWorker.isSupported) {
187
+ workerTargets.push(target);
188
+ } else {
189
+ this.enqueueTasks(nodes, target, depExtendedData, deep, batch);
190
+ }
191
+ }
144
192
 
145
- this.enqueueTask(node, target, depExtendedData, deep);
146
- });
193
+ if (workerTargets.length && nodes.length) {
194
+ this.collectByCollectWorker(nodes, workerTargets, depExtendedData, deep, batch);
195
+ }
147
196
 
148
- return new Promise<void>((resolve) => {
149
- if (!startTask) {
150
- this.emit('collected', nodes, deep);
151
- this.set('collecting', false);
152
- resolve();
153
- return;
154
- }
155
- this.idleTask.once('finish', () => {
156
- this.emit('collected', nodes, deep);
157
- this.set('collecting', false);
158
- });
159
- this.idleTask.once('hight-level-finish', () => {
160
- this.emit('ds-collected', nodes, deep);
161
- resolve();
162
- });
197
+ // 没有命中任何 target,无需收集,直接完成
198
+ if (batch.pending === 0) {
199
+ this.emit('collected', nodes, deep);
200
+ this.updateCollectingState();
201
+ return true;
202
+ }
203
+
204
+ this.activeBatches.add(batch);
205
+ this.set('collecting', true);
206
+
207
+ return new Promise<boolean>((resolve) => {
208
+ batch.resolve = resolve;
163
209
  });
164
210
  }
165
211
 
166
212
  public collectByWorker(dsl: MApp) {
167
213
  this.set('collecting', true);
214
+ this.workerGeneration += 1;
215
+ const generation = this.workerGeneration;
168
216
 
169
217
  const { promise, resolve: waitingResolve } = Promise.withResolvers<void>();
170
218
 
171
219
  this.waitingWorker = promise;
220
+ this.resolveWaitingWorker = waitingResolve;
221
+
222
+ return this.collectWorker.collectDsl(dsl).then((deps) => {
223
+ const depsData: DepsData = deps || {};
224
+
225
+ if (generation !== this.workerGeneration) {
226
+ waitingResolve();
227
+ return depsData;
228
+ }
172
229
 
173
- return new Promise<Record<string, Record<string, DepData>>>((resolve) => {
174
- const worker = new Work();
175
- worker.postMessage({
176
- dsl: serialize(dsl),
177
- });
178
- worker.onmessage = (e) => {
179
- resolve(e.data);
180
- };
181
- worker.onerror = () => {
182
- resolve({});
183
- };
184
- }).then((depsData) => {
185
230
  traverseTarget(this.watcher.getTargetsList(), (target) => {
186
231
  if (depsData[target.type]?.[target.id]) {
187
232
  target.deps = reactive(depsData[target.type][target.id]);
@@ -200,6 +245,10 @@ class Dep extends BaseService {
200
245
  this.emit('collected', dsl.items, true);
201
246
  this.emit('ds-collected', dsl.items, true);
202
247
  waitingResolve();
248
+ if (this.waitingWorker === promise) {
249
+ this.waitingWorker = undefined;
250
+ this.resolveWaitingWorker = undefined;
251
+ }
203
252
 
204
253
  return depsData;
205
254
  });
@@ -209,8 +258,12 @@ class Dep extends BaseService {
209
258
  // 先删除原有依赖,重新收集
210
259
  if (isPage(node)) {
211
260
  this.removePageDep(target, depExtendedData);
212
- } else {
261
+ } else if (deep) {
262
+ // deep 收集会覆盖整棵子树,删除也要同步清掉子孙旧依赖
213
263
  this.watcher.removeTargetDep(target, node);
264
+ } else {
265
+ // 非 deep 只动当前节点,避免误清子节点上其他尚未重收的依赖
266
+ target.removeDep(node.id);
214
267
  }
215
268
 
216
269
  this.watcher.collectItem(node, target, depExtendedData, deep);
@@ -233,7 +286,10 @@ class Dep extends BaseService {
233
286
  }
234
287
 
235
288
  public clearIdleTasks() {
289
+ this.abortActiveBatches();
236
290
  this.idleTask.clearTasks();
291
+ // 丢掉 worker 在途任务,避免 abort 后的长任务继续占着常驻 worker
292
+ this.collectWorker.abort();
237
293
  }
238
294
 
239
295
  public on<Name extends keyof DepEvents, Param extends DepEvents[Name]>(
@@ -251,7 +307,13 @@ class Dep extends BaseService {
251
307
  }
252
308
 
253
309
  public reset() {
310
+ this.abortActiveBatches();
311
+ this.workerGeneration += 1;
312
+ this.resolveWaitingWorker?.();
313
+ this.resolveWaitingWorker = undefined;
314
+ this.waitingWorker = undefined;
254
315
  this.idleTask.clearTasks();
316
+ this.collectWorker.abort();
255
317
 
256
318
  for (const type of Object.keys(this.watcher.getTargetsList())) {
257
319
  this.removeTargets(type);
@@ -267,6 +329,7 @@ class Dep extends BaseService {
267
329
  this.reset();
268
330
  this.removeAllPlugins();
269
331
  this.idleTask.removeAllListeners();
332
+ this.collectWorker.terminate();
270
333
  }
271
334
 
272
335
  public emit<Name extends keyof DepEvents, Param extends DepEvents[Name]>(eventName: Name, ...args: Param) {
@@ -286,25 +349,207 @@ class Dep extends BaseService {
286
349
  }
287
350
  }
288
351
 
289
- private enqueueTask(node: MNode, target: Target, depExtendedData: DepExtendedData, deep: boolean) {
352
+ /**
353
+ * 把遍历匹配交给 worker,结果回来后按 target 分片写回主线程
354
+ */
355
+ private collectByCollectWorker(
356
+ nodes: MNode[],
357
+ targets: Target[],
358
+ depExtendedData: DepExtendedData,
359
+ deep: boolean,
360
+ batch: CollectBatch,
361
+ ) {
362
+ const hasDataSource = targets.some((target) => target.type === DepTargetType.DATA_SOURCE);
363
+
364
+ // 先占位,避免 worker 返回前批次被误判为已完成(提前 resolve、collecting 提前复位)
365
+ this.beginBatchTask(batch, hasDataSource);
366
+
367
+ this.collectWorker
368
+ .collect({
369
+ nodes,
370
+ targets: targets.map((target) => target.descriptor!),
371
+ depExtendedData,
372
+ deep,
373
+ })
374
+ .then((result) => {
375
+ if (batch.aborted) return;
376
+
377
+ for (const target of targets) {
378
+ if (result) {
379
+ // 写回是纯字典操作,但数据量大时同样会占用主线程,因此按 target 拆成空闲任务
380
+ this.enqueueApplyTask(target, result.deps[target.type]?.[target.id] || {}, result.nodeIds, batch, {
381
+ nodes,
382
+ depExtendedData,
383
+ deep,
384
+ });
385
+ } else {
386
+ this.enqueueTasks(nodes, target, depExtendedData, deep, batch);
387
+ }
388
+ }
389
+ })
390
+ .finally(() => {
391
+ // 释放占位:必须在新任务入队之后,否则批次会在中途被判定为完成
392
+ this.onBatchTaskDone(batch, hasDataSource);
393
+ });
394
+ }
395
+
396
+ /**
397
+ * 用 worker 的收集结果替换 target 上这批节点的依赖
398
+ */
399
+ private enqueueApplyTask(
400
+ target: Target,
401
+ deps: DepData,
402
+ nodeIds: Id[],
403
+ batch: CollectBatch,
404
+ { nodes, depExtendedData, deep }: { nodes: MNode[]; depExtendedData: DepExtendedData; deep: boolean },
405
+ ) {
406
+ const isDataSource = target.type === DepTargetType.DATA_SOURCE;
407
+
408
+ this.beginBatchTask(batch, isDataSource);
409
+
290
410
  this.idleTask.enqueueTask(
291
- ({ node, deep, target }) => {
292
- this.collectNode(node, target, depExtendedData, deep);
411
+ () => {
412
+ try {
413
+ // target 可能在 worker 收集期间被移除或重建(如修改数据源字段)
414
+ const current = this.watcher.getTarget(target.id, target.type);
415
+ if (current !== target) {
416
+ // 已被同 id 的新 target 替换时,用当前 target 在主线程补收,避免依赖空窗
417
+ if (current) {
418
+ this.enqueueTasks(nodes, current, depExtendedData, deep, batch);
419
+ }
420
+ return;
421
+ }
422
+
423
+ // 页面按 pageId 匹配删除,可清掉页面内已被删除节点的残留依赖
424
+ if (nodes.some((node) => isPage(node))) {
425
+ this.removePageDep(target, depExtendedData);
426
+ }
427
+
428
+ for (const id of nodeIds) {
429
+ target.removeDep(id);
430
+ }
431
+
432
+ for (const [id, dep] of Object.entries(deps)) {
433
+ target.deps[id] = dep;
434
+ }
435
+ } finally {
436
+ this.onBatchTaskDone(batch, isDataSource);
437
+ }
293
438
  },
294
- {
295
- node,
296
- deep: false,
297
- target,
439
+ undefined,
440
+ isDataSource,
441
+ );
442
+ }
443
+
444
+ private enqueueTasks(
445
+ nodes: MNode[],
446
+ target: Target,
447
+ depExtendedData: DepExtendedData,
448
+ deep: boolean,
449
+ batch: CollectBatch,
450
+ ) {
451
+ for (const node of nodes) {
452
+ this.enqueueTask(node, target, depExtendedData, deep, batch);
453
+ }
454
+ }
455
+
456
+ private enqueueTask(
457
+ node: MNode,
458
+ target: Target,
459
+ depExtendedData: DepExtendedData,
460
+ deep: boolean,
461
+ batch: CollectBatch,
462
+ ) {
463
+ const isDataSource = target.type === DepTargetType.DATA_SOURCE;
464
+
465
+ this.beginBatchTask(batch, isDataSource);
466
+
467
+ this.idleTask.enqueueTask(
468
+ () => {
469
+ try {
470
+ this.collectNode(node, target, depExtendedData);
471
+ } finally {
472
+ this.onBatchTaskDone(batch, isDataSource);
473
+ }
298
474
  },
299
- target.type === DepTargetType.DATA_SOURCE,
475
+ undefined,
476
+ isDataSource,
300
477
  );
301
478
 
302
479
  if (deep && Array.isArray(node.items) && node.items.length) {
303
480
  node.items.forEach((item) => {
304
- this.enqueueTask(item, target, depExtendedData, deep);
481
+ this.enqueueTask(item, target, depExtendedData, deep, batch);
305
482
  });
306
483
  }
307
484
  }
485
+
486
+ private beginBatchTask(batch: CollectBatch, isDataSource: boolean) {
487
+ batch.pending += 1;
488
+ if (isDataSource) {
489
+ batch.dsPending += 1;
490
+ }
491
+ }
492
+
493
+ private onBatchTaskDone(batch: CollectBatch, isDataSource: boolean) {
494
+ if (batch.aborted) return;
495
+
496
+ if (isDataSource) {
497
+ batch.dsPending -= 1;
498
+ // 数据源依赖收集完先 resolve,让 stage 尽快更新,其余依赖继续在后台收集
499
+ if (batch.dsPending === 0) {
500
+ this.settleBatchDs(batch);
501
+ }
502
+ }
503
+
504
+ batch.pending -= 1;
505
+ if (batch.pending === 0) {
506
+ this.finishBatch(batch);
507
+ }
508
+ }
509
+
510
+ private settleBatchDs(batch: CollectBatch) {
511
+ if (batch.dsSettled) return;
512
+ batch.dsSettled = true;
513
+ this.emit('ds-collected', batch.nodes, batch.deep);
514
+ batch.resolve(true);
515
+ }
516
+
517
+ private finishBatch(batch: CollectBatch) {
518
+ if (!batch.collectedEmitted) {
519
+ batch.collectedEmitted = true;
520
+ this.emit('collected', batch.nodes, batch.deep);
521
+ }
522
+ // 没有数据源任务的批次在此结算 Promise
523
+ this.settleBatchDs(batch);
524
+ this.activeBatches.delete(batch);
525
+ this.updateCollectingState();
526
+ }
527
+
528
+ /**
529
+ * idleTask 被清空时,在途批次的任务不会再执行,必须主动结算,
530
+ * 否则对应的 collectIdle Promise 永远不会 resolve(collecting 卡在 true、once 监听器泄漏)。
531
+ * 收集被中断(通常紧跟一次全量重新收集),因此不再 emit collected/ds-collected,仅结算 Promise。
532
+ */
533
+ private abortActiveBatches() {
534
+ if (!this.activeBatches.size) {
535
+ return;
536
+ }
537
+
538
+ const batches = [...this.activeBatches];
539
+ this.activeBatches.clear();
540
+
541
+ for (const batch of batches) {
542
+ // 标记中断:worker 结果可能在之后才返回,此时不能再写回依赖,也不能再结算批次
543
+ batch.aborted = true;
544
+ batch.resolve(false);
545
+ }
546
+
547
+ this.updateCollectingState();
548
+ }
549
+
550
+ private updateCollectingState() {
551
+ this.set('collecting', this.activeBatches.size > 0);
552
+ }
308
553
  }
309
554
 
310
555
  export type DepService = Dep;