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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) 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 +151 -153
  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/history.js +350 -386
  138. package/dist/es/services/keybinding.js +6 -6
  139. package/dist/es/services/props.js +3 -2
  140. package/dist/es/services/storage.js +2 -2
  141. package/dist/es/services/ui.js +10 -2
  142. package/dist/es/style.css +549 -113
  143. package/dist/es/utils/config.js +4 -1
  144. package/dist/es/utils/const.js +2 -2
  145. package/dist/es/utils/content-menu.js +19 -11
  146. package/dist/es/utils/data-source/index.js +34 -11
  147. package/dist/es/utils/dep/collect-worker-client.js +114 -0
  148. package/dist/es/utils/dep/idle-task.js +47 -22
  149. package/dist/es/utils/dep/worker.js +1 -1
  150. package/dist/es/utils/editor.js +103 -49
  151. package/dist/es/utils/event.js +123 -0
  152. package/dist/es/utils/history.js +220 -0
  153. package/dist/es/utils/indexed-db.js +86 -0
  154. package/dist/es/utils/monaco-editor.js +22 -6
  155. package/dist/es/utils/operator.js +2 -2
  156. package/dist/es/utils/props.js +114 -33
  157. package/dist/es/utils/type-match-rules.js +367 -0
  158. package/dist/es/utils/undo-redo.js +60 -1
  159. package/dist/style.css +549 -113
  160. package/dist/themes/magic-admin.css +3028 -0
  161. package/dist/tmagic-editor.umd.cjs +14273 -10029
  162. package/package.json +8 -8
  163. package/src/Editor.vue +43 -2
  164. package/src/components/CodeBlockEditor.vue +3 -0
  165. package/src/components/CompareForm.vue +18 -146
  166. package/src/components/ContentMenu.vue +44 -8
  167. package/src/components/FloatingBox.vue +84 -9
  168. package/src/components/ScrollBar.vue +0 -67
  169. package/src/components/ToolButton.vue +2 -2
  170. package/src/components/ViewForm.vue +55 -0
  171. package/src/editorProps.ts +30 -0
  172. package/src/fields/Code.vue +10 -2
  173. package/src/fields/CodeLink.vue +2 -5
  174. package/src/fields/CodeSelect.vue +54 -40
  175. package/src/fields/CodeSelectCol.vue +8 -1
  176. package/src/fields/CondOpSelect.vue +2 -24
  177. package/src/fields/DataSourceFieldSelect/FieldSelect.vue +16 -2
  178. package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
  179. package/src/fields/DataSourceFields.vue +42 -8
  180. package/src/fields/DataSourceInput.vue +10 -28
  181. package/src/fields/DataSourceMethodSelect.vue +9 -4
  182. package/src/fields/DataSourceMethods.vue +42 -21
  183. package/src/fields/DataSourceMocks.vue +3 -0
  184. package/src/fields/DisplayConds.vue +18 -1
  185. package/src/fields/EventSelect.vue +145 -161
  186. package/src/fields/StyleSetter/Index.vue +3 -12
  187. package/src/fields/StyleSetter/components/Border.vue +15 -6
  188. package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
  189. package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
  190. package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
  191. package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
  192. package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
  193. package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
  194. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
  195. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
  196. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
  197. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
  198. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
  199. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
  200. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
  201. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
  202. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
  203. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
  204. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
  205. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
  206. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
  207. package/src/fields/StyleSetter/pro/Background.vue +99 -55
  208. package/src/fields/StyleSetter/pro/Border.vue +9 -11
  209. package/src/fields/StyleSetter/pro/Font.vue +66 -64
  210. package/src/fields/StyleSetter/pro/Layout.vue +211 -139
  211. package/src/fields/StyleSetter/pro/Position.vue +69 -67
  212. package/src/fields/StyleSetter/pro/Transform.vue +23 -25
  213. package/src/fields/UISelect.vue +0 -12
  214. package/src/hooks/index.ts +1 -0
  215. package/src/hooks/use-code-block-edit.ts +4 -3
  216. package/src/hooks/use-compare-form.ts +187 -0
  217. package/src/hooks/use-data-source-edit.ts +2 -2
  218. package/src/hooks/use-stage.ts +5 -3
  219. package/src/icons/DatasourceIcon.vue +7 -0
  220. package/src/index.ts +12 -0
  221. package/src/initService.ts +26 -16
  222. package/src/layouts/CodeEditor.vue +34 -11
  223. package/src/layouts/Framework.vue +15 -8
  224. package/src/layouts/NavMenu.vue +3 -3
  225. package/src/layouts/history-list/Bucket.vue +33 -41
  226. package/src/layouts/history-list/BucketTab.vue +72 -0
  227. package/src/layouts/history-list/GroupRow.vue +190 -93
  228. package/src/layouts/history-list/HistoryDiffDialog.vue +169 -90
  229. package/src/layouts/history-list/HistoryListPanel.vue +191 -95
  230. package/src/layouts/history-list/InitialRow.vue +38 -8
  231. package/src/layouts/history-list/PageTab.vue +67 -43
  232. package/src/layouts/history-list/composables.ts +239 -125
  233. package/src/layouts/history-list/useHistoryList.ts +60 -0
  234. package/src/layouts/history-list/useHistoryRevert.ts +425 -0
  235. package/src/layouts/page-bar/PageBar.vue +4 -2
  236. package/src/layouts/props-panel/FormPanel.vue +72 -6
  237. package/src/layouts/props-panel/PropsPanel.vue +62 -18
  238. package/src/layouts/props-panel/use-style-panel.ts +4 -3
  239. package/src/layouts/sidebar/ComponentListPanel.vue +10 -6
  240. package/src/layouts/sidebar/Sidebar.vue +13 -6
  241. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  242. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +5 -2
  243. package/src/layouts/sidebar/code-block/useContentMenu.ts +14 -2
  244. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +34 -2
  245. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +29 -4
  246. package/src/layouts/sidebar/data-source/useContentMenu.ts +14 -2
  247. package/src/layouts/sidebar/layer/LayerMenu.vue +21 -13
  248. package/src/layouts/sidebar/layer/LayerNodeContent.vue +57 -0
  249. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  250. package/src/layouts/sidebar/layer/LayerPanel.vue +4 -1
  251. package/src/layouts/sidebar/layer/use-click.ts +3 -3
  252. package/src/layouts/sidebar/layer/use-node-status.ts +2 -2
  253. package/src/layouts/workspace/viewer/NodeListMenu.vue +4 -1
  254. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  255. package/src/layouts/workspace/viewer/ViewerMenu.vue +15 -15
  256. package/src/plugin.ts +6 -3
  257. package/src/services/codeBlock.ts +152 -47
  258. package/src/services/dataSource.ts +120 -41
  259. package/src/services/dep.ts +292 -47
  260. package/src/services/editor.ts +820 -224
  261. package/src/services/history.ts +449 -412
  262. package/src/services/keybinding.ts +6 -6
  263. package/src/services/ui.ts +33 -5
  264. package/src/theme/code-block.scss +37 -0
  265. package/src/theme/common/var.scss +1 -1
  266. package/src/theme/component-list-panel.scss +2 -2
  267. package/src/theme/data-source-field.scss +4 -0
  268. package/src/theme/display-conds.scss +11 -0
  269. package/src/theme/event.scss +70 -1
  270. package/src/theme/floating-box.scss +9 -1
  271. package/src/theme/framework.scss +4 -1
  272. package/src/theme/history-list-panel.scss +157 -23
  273. package/src/theme/layer-node-content.scss +14 -0
  274. package/src/theme/nav-menu.scss +5 -1
  275. package/src/theme/page-bar.scss +0 -4
  276. package/src/theme/props-panel.scss +5 -4
  277. package/src/theme/scroll-bar.scss +64 -0
  278. package/src/theme/style-setter/border.scss +17 -5
  279. package/src/theme/theme.scss +4 -0
  280. package/src/theme/themes/magic-admin/index.scss +214 -0
  281. package/src/theme/ui-select.scss +9 -0
  282. package/src/type.ts +668 -124
  283. package/src/utils/config.ts +9 -1
  284. package/src/utils/const.ts +3 -2
  285. package/src/utils/content-menu.ts +20 -11
  286. package/src/utils/data-source/index.ts +32 -12
  287. package/src/utils/dep/collect-worker-client.ts +149 -0
  288. package/src/utils/dep/idle-task.ts +72 -35
  289. package/src/utils/dep/worker.ts +113 -9
  290. package/src/utils/editor.ts +166 -60
  291. package/src/utils/event.ts +224 -0
  292. package/src/utils/history.ts +286 -0
  293. package/src/utils/index.ts +4 -0
  294. package/src/utils/indexed-db.ts +122 -0
  295. package/src/utils/monaco-editor.ts +27 -0
  296. package/src/utils/operator.ts +2 -2
  297. package/src/utils/props.ts +114 -11
  298. package/src/utils/type-match-rules.ts +684 -0
  299. package/src/utils/undo-redo.ts +88 -0
  300. package/types/index.d.ts +1979 -515
  301. package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
  302. package/dist/es/layouts/history-list/CodeBlockTab.vue_vue_type_script_setup_true_lang.js +0 -62
  303. package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
  304. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
  305. package/src/layouts/history-list/CodeBlockTab.vue +0 -61
  306. package/src/layouts/history-list/DataSourceTab.vue +0 -61
@@ -13,12 +13,14 @@ import storageService, { Protocol } from '@editor/services/storage';
13
13
  import type {
14
14
  DataSourceStepValue,
15
15
  DatasourceTypeOption,
16
+ DslOpWithHistoryIdsResult,
16
17
  HistoryOpOptions,
17
18
  HistoryOpOptionsWithChangeRecords,
18
19
  SyncHookPlugin,
19
20
  } from '@editor/type';
20
21
  import { getFormConfig, getFormValue } from '@editor/utils/data-source';
21
22
  import { COPY_DS_STORAGE_KEY } from '@editor/utils/editor';
23
+ import { createStackStep, describeRevertStep, getLastPushedHistoryIds } from '@editor/utils/history';
22
24
 
23
25
  import BaseService from './BaseService';
24
26
 
@@ -54,19 +56,6 @@ const canUsePluginMethods = {
54
56
 
55
57
  type SyncMethodName = Writable<(typeof canUsePluginMethods)['sync']>;
56
58
 
57
- /**
58
- * 「回滚」生成的新 step 简短描述。
59
- * 仅在 service 层使用,避免依赖 UI 层 composables。
60
- */
61
- const describeRevertDataSourceStep = (step: DataSourceStepValue): string => {
62
- const { oldSchema, newSchema, changeRecords, id } = step;
63
- if (oldSchema === null && newSchema) return `撤回新增 ${newSchema.title || newSchema.id || id}`;
64
- if (oldSchema && newSchema === null) return `还原已删除的 ${oldSchema.title || oldSchema.id || id}`;
65
- const title = newSchema?.title || oldSchema?.title || `${id}`;
66
- const propPath = changeRecords?.[0]?.propPath;
67
- return propPath ? `还原 ${title} · ${propPath}` : `还原 ${title}`;
68
- };
69
-
70
59
  class DataSource extends BaseService {
71
60
  private state = reactive<State>({
72
61
  datasourceTypeList: [],
@@ -78,6 +67,13 @@ class DataSource extends BaseService {
78
67
  methods: {},
79
68
  });
80
69
 
70
+ /**
71
+ * 最近一次写入历史栈的数据源历史记录 uuid。
72
+ * 供 *AndGetHistoryId 系列方法在调用 add / update / remove 后取回本次产生的历史记录 id;
73
+ * 普通方法不读取它,调用前由 *AndGetHistoryId 重置为 null。
74
+ */
75
+ private lastPushedHistoryId: string | null = null;
76
+
81
77
  constructor() {
82
78
  super(canUsePluginMethods.sync.map((methodName) => ({ name: methodName, isAsync: false })));
83
79
  }
@@ -129,7 +125,10 @@ class DataSource extends BaseService {
129
125
  * @param options.doNotPushHistory 是否不写入历史记录(默认 false)
130
126
  * @param options.historyDescription 入栈时附带的人类可读描述,用于历史面板展示
131
127
  */
132
- public add(config: DataSourceSchema, { doNotPushHistory = false, historyDescription }: HistoryOpOptions = {}) {
128
+ public add(
129
+ config: DataSourceSchema,
130
+ { doNotPushHistory = false, historyDescription, historySource }: HistoryOpOptions = {},
131
+ ) {
133
132
  const newConfig = {
134
133
  ...config,
135
134
  id: config.id && !this.getDataSourceById(config.id) ? config.id : this.createId(),
@@ -138,10 +137,17 @@ class DataSource extends BaseService {
138
137
  this.get('dataSources').push(newConfig);
139
138
 
140
139
  if (!doNotPushHistory) {
141
- historyService.pushDataSource(newConfig.id, { oldSchema: null, newSchema: newConfig, historyDescription });
140
+ const step = createStackStep<DataSourceSchema, DataSourceStepValue>(newConfig.id, {
141
+ oldValue: null,
142
+ newValue: newConfig,
143
+ historyDescription,
144
+ source: historySource,
145
+ });
146
+ this.lastPushedHistoryId = (step ? historyService.push('dataSource', step, newConfig.id) : null)?.uuid ?? null;
142
147
  }
143
148
 
144
149
  this.emit('add', newConfig);
150
+ this.emit('change', this.get('dataSources'));
145
151
 
146
152
  return newConfig;
147
153
  }
@@ -156,7 +162,12 @@ class DataSource extends BaseService {
156
162
  */
157
163
  public update(
158
164
  config: DataSourceSchema,
159
- { changeRecords = [], doNotPushHistory = false, historyDescription }: HistoryOpOptionsWithChangeRecords = {},
165
+ {
166
+ changeRecords = [],
167
+ doNotPushHistory = false,
168
+ historyDescription,
169
+ historySource,
170
+ }: HistoryOpOptionsWithChangeRecords = {},
160
171
  ) {
161
172
  const dataSources = this.get('dataSources');
162
173
 
@@ -168,18 +179,21 @@ class DataSource extends BaseService {
168
179
  dataSources[index] = newConfig;
169
180
 
170
181
  if (!doNotPushHistory) {
171
- historyService.pushDataSource(newConfig.id, {
172
- oldSchema: oldConfig ? cloneDeep(oldConfig) : null,
173
- newSchema: newConfig,
182
+ const step = createStackStep<DataSourceSchema, DataSourceStepValue>(newConfig.id, {
183
+ oldValue: oldConfig ? cloneDeep(oldConfig) : null,
184
+ newValue: newConfig,
174
185
  changeRecords,
175
186
  historyDescription,
187
+ source: historySource,
176
188
  });
189
+ this.lastPushedHistoryId = (step ? historyService.push('dataSource', step, newConfig.id) : null)?.uuid ?? null;
177
190
  }
178
191
 
179
192
  this.emit('update', newConfig, {
180
193
  oldConfig,
181
194
  changeRecords,
182
195
  });
196
+ this.emit('change', this.get('dataSources'));
183
197
 
184
198
  return newConfig;
185
199
  }
@@ -191,19 +205,63 @@ class DataSource extends BaseService {
191
205
  * @param options.doNotPushHistory 是否不写入历史记录(默认 false)
192
206
  * @param options.historyDescription 入栈时附带的人类可读描述,用于历史面板展示
193
207
  */
194
- public remove(id: string, { doNotPushHistory = false, historyDescription }: HistoryOpOptions = {}) {
208
+ public remove(id: string, { doNotPushHistory = false, historyDescription, historySource }: HistoryOpOptions = {}) {
195
209
  const dataSources = this.get('dataSources');
196
210
  const index = dataSources.findIndex((ds) => ds.id === id);
197
211
  const oldConfig = index !== -1 ? dataSources[index] : null;
198
212
  dataSources.splice(index, 1);
199
213
 
200
214
  if (oldConfig && !doNotPushHistory) {
201
- historyService.pushDataSource(id, { oldSchema: cloneDeep(oldConfig), newSchema: null, historyDescription });
215
+ const step = createStackStep<DataSourceSchema, DataSourceStepValue>(id, {
216
+ oldValue: cloneDeep(oldConfig),
217
+ newValue: null,
218
+ historyDescription,
219
+ source: historySource,
220
+ });
221
+ this.lastPushedHistoryId = (step ? historyService.push('dataSource', step, id) : null)?.uuid ?? null;
202
222
  }
203
223
 
204
224
  this.emit('remove', id);
225
+ this.emit('change', this.get('dataSources'));
205
226
  }
206
227
 
228
+ // #region AndGetHistoryId
229
+ /**
230
+ * 下列 *AndGetHistoryId 方法与对应的 add / update / remove 行为完全一致,
231
+ * 返回值在 {@link DslOpWithHistoryIdsResult} 中同时包含原操作结果与本次写入历史栈的 uuid 列表({@link DataSourceStepValue.uuid}),
232
+ * 可用于精确引用 / 定位该条历史记录(埋点、revert、跨端同步等)。
233
+ *
234
+ * 当本次操作未写入历史(doNotPushHistory 为 true、或无对应记录)时 historyIds 为 `[]`。
235
+ */
236
+
237
+ /** 等价于 {@link add},并额外返回本次写入历史记录的 uuid 列表(未入栈时 historyIds 为 `[]`)。 */
238
+ public addAndGetHistoryId(
239
+ config: DataSourceSchema,
240
+ options: HistoryOpOptions = {},
241
+ ): DslOpWithHistoryIdsResult<DataSourceSchema> {
242
+ this.lastPushedHistoryId = null;
243
+ const result = this.add(config, options);
244
+ return { result, historyIds: getLastPushedHistoryIds(this.lastPushedHistoryId) };
245
+ }
246
+
247
+ /** 等价于 {@link update},并额外返回本次写入历史记录的 uuid 列表(未入栈时 historyIds 为 `[]`)。 */
248
+ public updateAndGetHistoryId(
249
+ config: DataSourceSchema,
250
+ options: HistoryOpOptionsWithChangeRecords = {},
251
+ ): DslOpWithHistoryIdsResult<DataSourceSchema> {
252
+ this.lastPushedHistoryId = null;
253
+ const result = this.update(config, options);
254
+ return { result, historyIds: getLastPushedHistoryIds(this.lastPushedHistoryId) };
255
+ }
256
+
257
+ /** 等价于 {@link remove},并额外返回本次写入历史记录的 uuid 列表(未入栈时 historyIds 为 `[]`)。 */
258
+ public removeAndGetHistoryId(id: string, options: HistoryOpOptions = {}): DslOpWithHistoryIdsResult<void> {
259
+ this.lastPushedHistoryId = null;
260
+ this.remove(id, options);
261
+ return { result: undefined, historyIds: getLastPushedHistoryIds(this.lastPushedHistoryId) };
262
+ }
263
+ // #endregion AndGetHistoryId
264
+
207
265
  /**
208
266
  * 撤销指定数据源的最近一次变更。
209
267
  *
@@ -215,7 +273,7 @@ class DataSource extends BaseService {
215
273
  * @returns 撤销的 step;栈不存在或已无可撤销时返回 null
216
274
  */
217
275
  public undo(id: Id) {
218
- const step = historyService.undoDataSource(id);
276
+ const step = historyService.undo('dataSource', id);
219
277
  if (!step) return null;
220
278
  this.applyHistoryStep(step, true);
221
279
  return step;
@@ -227,7 +285,7 @@ class DataSource extends BaseService {
227
285
  * @returns 重做的 step;栈不存在或已无可重做时返回 null
228
286
  */
229
287
  public redo(id: Id) {
230
- const step = historyService.redoDataSource(id);
288
+ const step = historyService.redo('dataSource', id);
231
289
  if (!step) return null;
232
290
  this.applyHistoryStep(step, false);
233
291
  return step;
@@ -235,12 +293,12 @@ class DataSource extends BaseService {
235
293
 
236
294
  /** 是否可对指定数据源撤销。 */
237
295
  public canUndo(id: Id): boolean {
238
- return historyService.canUndoDataSource(id);
296
+ return historyService.canUndo('dataSource', id);
239
297
  }
240
298
 
241
299
  /** 是否可对指定数据源重做。 */
242
300
  public canRedo(id: Id): boolean {
243
- return historyService.canRedoDataSource(id);
301
+ return historyService.canRedo('dataSource', id);
244
302
  }
245
303
 
246
304
  /**
@@ -251,7 +309,7 @@ class DataSource extends BaseService {
251
309
  * @returns 实际移动到的最终游标位置
252
310
  */
253
311
  public goto(id: Id, targetCursor: number): number {
254
- let cursor = historyService.getDataSourceCursor(id);
312
+ let cursor = historyService.getCursor('dataSource', id);
255
313
  const target = Math.max(0, targetCursor);
256
314
  while (cursor > target) {
257
315
  if (!this.undo(id)) break;
@@ -275,13 +333,31 @@ class DataSource extends BaseService {
275
333
  * @returns 反向后产生的新 step;目标不存在 / 未应用时返回 null
276
334
  */
277
335
  public revert(id: Id, index: number): DataSourceStepValue | null {
278
- const list = historyService.getDataSourceStepList(id);
336
+ const list = historyService.getStepList('dataSource', id);
279
337
  const entry = list[index];
280
338
  if (!entry?.applied) return null;
281
- const description = `回滚 #${index + 1}: ${describeRevertDataSourceStep(entry.step)}`;
339
+ // 更新类步骤(前后 schema 都存在)必须带 changeRecords 才支持回滚,否则只能整 schema 替换,会冲掉后续无关变更。
340
+ const { oldSchema, newSchema, changeRecords } = entry.step.diff?.[0] ?? {};
341
+ if (oldSchema && newSchema && !changeRecords?.length) return null;
342
+ const description = `回滚 #${index + 1}: ${describeRevertStep<DataSourceSchema>(entry.step.data.id, entry.step.diff?.[0], (s) => s.title)}`;
282
343
  return this.applyRevertStep(entry.step, description);
283
344
  }
284
345
 
346
+ /**
347
+ * 通过历史记录 uuid 回滚数据源历史步骤,语义同 {@link revert},
348
+ * 仅无需调用方再传 dataSourceId 与 index:内部会按 uuid 在全部数据源栈中定位对应步骤后再回滚。
349
+ * 按数组顺序依次回滚,返回与入参同序的结果列表(某项失败时为 `null`)。
350
+ *
351
+ * @param uuids 目标历史记录的 uuid 列表,通常由 {@link addAndGetHistoryId} 等方法返回的 `historyIds`
352
+ */
353
+ public revertById(uuids: string[]): (DataSourceStepValue | null)[] {
354
+ return uuids.map((uuid) => {
355
+ const location = historyService.findStepLocationByUuid('dataSource', uuid);
356
+ if (!location) return null;
357
+ return this.revert(location.id, location.index);
358
+ });
359
+ }
360
+
285
361
  public createId(): string {
286
362
  return `ds_${guid()}`;
287
363
  }
@@ -362,18 +438,19 @@ class DataSource extends BaseService {
362
438
  * 同构,差异仅在于走对应的公共 add / update / remove 而不是带 doNotPushHistory 的版本。
363
439
  */
364
440
  private applyRevertStep(step: DataSourceStepValue, historyDescription: string): DataSourceStepValue | null {
365
- const { id, oldSchema, newSchema, changeRecords } = step;
441
+ const { id } = step.data;
442
+ const { oldSchema, newSchema, changeRecords } = step.diff?.[0] ?? {};
366
443
 
367
444
  // 原本是新增 → revert 即删除
368
- if (oldSchema === null && newSchema) {
369
- this.remove(`${id}`, { historyDescription });
370
- return historyService.getDataSourceStepList(id).slice(-1)[0]?.step ?? null;
445
+ if (!oldSchema && newSchema) {
446
+ this.remove(`${id}`, { historyDescription, historySource: 'rollback' });
447
+ return historyService.getStepList('dataSource', id).slice(-1)[0]?.step ?? null;
371
448
  }
372
449
 
373
450
  // 原本是删除 → revert 即重新加回
374
- if (oldSchema && newSchema === null) {
375
- this.add(cloneDeep(oldSchema), { historyDescription });
376
- return historyService.getDataSourceStepList(id).slice(-1)[0]?.step ?? null;
451
+ if (oldSchema && !newSchema) {
452
+ this.add(cloneDeep(oldSchema), { historyDescription, historySource: 'rollback' });
453
+ return historyService.getStepList('dataSource', id).slice(-1)[0]?.step ?? null;
377
454
  }
378
455
 
379
456
  if (!oldSchema || !newSchema) return null;
@@ -395,12 +472,13 @@ class DataSource extends BaseService {
395
472
  this.update(fallbackToFullReplace ? cloneDeep(oldSchema) : patched, {
396
473
  changeRecords,
397
474
  historyDescription,
475
+ historySource: 'rollback',
398
476
  });
399
- return historyService.getDataSourceStepList(id).slice(-1)[0]?.step ?? null;
477
+ return historyService.getStepList('dataSource', id).slice(-1)[0]?.step ?? null;
400
478
  }
401
479
 
402
- this.update(cloneDeep(oldSchema), { historyDescription });
403
- return historyService.getDataSourceStepList(id).slice(-1)[0]?.step ?? null;
480
+ this.update(cloneDeep(oldSchema), { historyDescription, historySource: 'rollback' });
481
+ return historyService.getStepList('dataSource', id).slice(-1)[0]?.step ?? null;
404
482
  }
405
483
 
406
484
  /**
@@ -418,10 +496,11 @@ class DataSource extends BaseService {
418
496
  * @param reverse true=撤销,false=重做
419
497
  */
420
498
  private applyHistoryStep(step: DataSourceStepValue, reverse: boolean): void {
421
- const { id, oldSchema, newSchema, changeRecords } = step;
499
+ const { id } = step.data;
500
+ const { oldSchema, newSchema, changeRecords } = step.diff?.[0] ?? {};
422
501
 
423
502
  // 新增 / 删除:直接 add 或 remove,不走 patch 逻辑
424
- if (oldSchema === null && newSchema) {
503
+ if (!oldSchema && newSchema) {
425
504
  if (reverse) {
426
505
  this.remove(`${id}`, { doNotPushHistory: true });
427
506
  } else {
@@ -430,7 +509,7 @@ class DataSource extends BaseService {
430
509
  return;
431
510
  }
432
511
 
433
- if (oldSchema && newSchema === null) {
512
+ if (oldSchema && !newSchema) {
434
513
  if (reverse) {
435
514
  this.add(cloneDeep(oldSchema), { doNotPushHistory: true });
436
515
  } else {