@tmagic/editor 1.7.7 → 1.7.8-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/LICENSE +235 -164
  2. package/dist/es/Editor.js +5 -0
  3. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +214 -0
  4. package/dist/es/_virtual/_plugin-vue_export-helper.js +8 -0
  5. package/dist/es/components/CodeBlockEditor.js +5 -0
  6. package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +337 -0
  7. package/dist/es/components/CodeParams.js +5 -0
  8. package/dist/es/components/CodeParams.vue_vue_type_script_setup_true_lang.js +63 -0
  9. package/dist/es/components/ContentMenu.js +5 -0
  10. package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +160 -0
  11. package/dist/es/components/FloatingBox.js +5 -0
  12. package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +161 -0
  13. package/dist/es/components/Icon.js +5 -0
  14. package/dist/es/components/Icon.vue_vue_type_script_setup_true_lang.js +39 -0
  15. package/dist/es/components/Resizer.js +5 -0
  16. package/dist/es/components/Resizer.vue_vue_type_script_setup_true_lang.js +20 -0
  17. package/dist/es/components/ScrollBar.js +6 -0
  18. package/dist/es/components/ScrollBar.vue_vue_type_script_setup_true_lang.js +72 -0
  19. package/dist/es/components/ScrollViewer.js +5 -0
  20. package/dist/es/components/ScrollViewer.vue_vue_type_script_setup_true_lang.js +104 -0
  21. package/dist/es/components/SearchInput.js +5 -0
  22. package/dist/es/components/SearchInput.vue_vue_type_script_setup_true_lang.js +40 -0
  23. package/dist/es/components/SplitView.js +5 -0
  24. package/dist/es/components/SplitView.vue_vue_type_script_setup_true_lang.js +135 -0
  25. package/dist/es/components/ToolButton.js +5 -0
  26. package/dist/es/components/ToolButton.vue_vue_type_script_setup_true_lang.js +131 -0
  27. package/dist/es/components/Tree.js +5 -0
  28. package/dist/es/components/Tree.vue_vue_type_script_setup_true_lang.js +60 -0
  29. package/dist/es/components/TreeNode.js +5 -0
  30. package/dist/es/components/TreeNode.vue_vue_type_script_setup_true_lang.js +126 -0
  31. package/dist/es/editorProps.js +34 -0
  32. package/dist/es/fields/Code.js +5 -0
  33. package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +54 -0
  34. package/dist/es/fields/CodeLink.js +5 -0
  35. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +69 -0
  36. package/dist/es/fields/CodeSelect.js +5 -0
  37. package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +116 -0
  38. package/dist/es/fields/CodeSelectCol.js +5 -0
  39. package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +145 -0
  40. package/dist/es/fields/CondOpSelect.js +5 -0
  41. package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +81 -0
  42. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.js +5 -0
  43. package/dist/es/fields/DataSourceFieldSelect/FieldSelect.vue_vue_type_script_setup_true_lang.js +158 -0
  44. package/dist/es/fields/DataSourceFieldSelect/Index.js +5 -0
  45. package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +155 -0
  46. package/dist/es/fields/DataSourceFields.js +5 -0
  47. package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +390 -0
  48. package/dist/es/fields/DataSourceInput.js +5 -0
  49. package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +268 -0
  50. package/dist/es/fields/DataSourceMethodSelect.js +5 -0
  51. package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +144 -0
  52. package/dist/es/fields/DataSourceMethods.js +5 -0
  53. package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +148 -0
  54. package/dist/es/fields/DataSourceMocks.js +5 -0
  55. package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +259 -0
  56. package/dist/es/fields/DataSourceSelect.js +5 -0
  57. package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +101 -0
  58. package/dist/es/fields/DisplayConds.js +5 -0
  59. package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +156 -0
  60. package/dist/es/fields/EventSelect.js +5 -0
  61. package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +338 -0
  62. package/dist/es/fields/KeyValue.js +5 -0
  63. package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +158 -0
  64. package/dist/es/fields/PageFragmentSelect.js +5 -0
  65. package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +81 -0
  66. package/dist/es/fields/StyleSetter/Index.js +5 -0
  67. package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +92 -0
  68. package/dist/es/fields/StyleSetter/components/BackgroundPosition.js +5 -0
  69. package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +96 -0
  70. package/dist/es/fields/StyleSetter/components/Border.js +5 -0
  71. package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +100 -0
  72. package/dist/es/fields/StyleSetter/components/Box.js +5 -0
  73. package/dist/es/fields/StyleSetter/components/Box.vue_vue_type_script_setup_true_lang.js +81 -0
  74. package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +17 -0
  75. package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +14 -0
  76. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +17 -0
  77. package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +17 -0
  78. package/dist/es/fields/StyleSetter/icons/display/Block.js +14 -0
  79. package/dist/es/fields/StyleSetter/icons/display/Flex.js +14 -0
  80. package/dist/es/fields/StyleSetter/icons/display/Inline.js +14 -0
  81. package/dist/es/fields/StyleSetter/icons/display/InlineBlock.js +14 -0
  82. package/dist/es/fields/StyleSetter/icons/display/None.js +14 -0
  83. package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +14 -0
  84. package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +14 -0
  85. package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +14 -0
  86. package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +14 -0
  87. package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +14 -0
  88. package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +14 -0
  89. package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +14 -0
  90. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +14 -0
  91. package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +14 -0
  92. package/dist/es/fields/StyleSetter/icons/text-align/Center.js +14 -0
  93. package/dist/es/fields/StyleSetter/icons/text-align/Left.js +14 -0
  94. package/dist/es/fields/StyleSetter/icons/text-align/Right.js +14 -0
  95. package/dist/es/fields/StyleSetter/pro/Background.js +5 -0
  96. package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +114 -0
  97. package/dist/es/fields/StyleSetter/pro/Border.js +5 -0
  98. package/dist/es/fields/StyleSetter/pro/Border.vue_vue_type_script_setup_true_lang.js +50 -0
  99. package/dist/es/fields/StyleSetter/pro/Font.js +5 -0
  100. package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +98 -0
  101. package/dist/es/fields/StyleSetter/pro/Layout.js +5 -0
  102. package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +288 -0
  103. package/dist/es/fields/StyleSetter/pro/Position.js +5 -0
  104. package/dist/es/fields/StyleSetter/pro/Position.vue_vue_type_script_setup_true_lang.js +95 -0
  105. package/dist/es/fields/UISelect.js +6 -0
  106. package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +161 -0
  107. package/dist/es/hooks/use-code-block-edit.js +54 -0
  108. package/dist/es/hooks/use-data-source-edit.js +29 -0
  109. package/dist/es/hooks/use-editor-content-height.js +17 -0
  110. package/dist/es/hooks/use-filter.js +35 -0
  111. package/dist/es/hooks/use-float-box.js +76 -0
  112. package/dist/es/hooks/use-getso.js +28 -0
  113. package/dist/es/hooks/use-next-float-box-position.js +27 -0
  114. package/dist/es/hooks/use-node-status.js +28 -0
  115. package/dist/es/hooks/use-services.js +9 -0
  116. package/dist/es/hooks/use-stage.js +107 -0
  117. package/dist/es/hooks/use-window-rect.js +19 -0
  118. package/dist/es/icons/CenterIcon.js +5 -0
  119. package/dist/es/icons/CenterIcon.vue_vue_type_script_setup_true_lang.js +40 -0
  120. package/dist/es/icons/CodeIcon.js +5 -0
  121. package/dist/es/icons/CodeIcon.vue_vue_type_script_setup_true_lang.js +19 -0
  122. package/dist/es/icons/FolderMinusIcon.js +5 -0
  123. package/dist/es/icons/FolderMinusIcon.vue_vue_type_script_setup_true_lang.js +27 -0
  124. package/dist/es/index.js +79 -0
  125. package/dist/es/initService.js +392 -0
  126. package/dist/es/layouts/AddPageBox.js +5 -0
  127. package/dist/es/layouts/AddPageBox.vue_vue_type_script_setup_true_lang.js +38 -0
  128. package/dist/es/layouts/CodeEditor.js +5 -0
  129. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +270 -0
  130. package/dist/es/layouts/Framework.js +5 -0
  131. package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +134 -0
  132. package/dist/es/layouts/NavMenu.js +5 -0
  133. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +181 -0
  134. package/dist/es/layouts/page-bar/AddButton.js +5 -0
  135. package/dist/es/layouts/page-bar/AddButton.vue_vue_type_script_setup_true_lang.js +57 -0
  136. package/dist/es/layouts/page-bar/PageBar.js +5 -0
  137. package/dist/es/layouts/page-bar/PageBar.vue_vue_type_script_setup_true_lang.js +135 -0
  138. package/dist/es/layouts/page-bar/PageBarScrollContainer.js +5 -0
  139. package/dist/es/layouts/page-bar/PageBarScrollContainer.vue_vue_type_script_setup_true_lang.js +119 -0
  140. package/dist/es/layouts/page-bar/PageList.js +5 -0
  141. package/dist/es/layouts/page-bar/PageList.vue_vue_type_script_setup_true_lang.js +54 -0
  142. package/dist/es/layouts/page-bar/Search.js +5 -0
  143. package/dist/es/layouts/page-bar/Search.vue_vue_type_script_setup_true_lang.js +60 -0
  144. package/dist/es/layouts/props-panel/FormPanel.js +5 -0
  145. package/dist/es/layouts/props-panel/FormPanel.vue_vue_type_script_setup_true_lang.js +129 -0
  146. package/dist/es/layouts/props-panel/PropsPanel.js +5 -0
  147. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +179 -0
  148. package/dist/es/layouts/props-panel/use-style-panel.js +40 -0
  149. package/dist/es/layouts/sidebar/ComponentListPanel.js +5 -0
  150. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +121 -0
  151. package/dist/es/layouts/sidebar/Sidebar.js +5 -0
  152. package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +314 -0
  153. package/dist/es/layouts/sidebar/code-block/CodeBlockList.js +5 -0
  154. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +161 -0
  155. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.js +5 -0
  156. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +113 -0
  157. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +60 -0
  158. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.js +5 -0
  159. package/dist/es/layouts/sidebar/data-source/DataSourceAddButton.vue_vue_type_script_setup_true_lang.js +44 -0
  160. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.js +5 -0
  161. package/dist/es/layouts/sidebar/data-source/DataSourceConfigPanel.vue_vue_type_script_setup_true_lang.js +103 -0
  162. package/dist/es/layouts/sidebar/data-source/DataSourceList.js +5 -0
  163. package/dist/es/layouts/sidebar/data-source/DataSourceList.vue_vue_type_script_setup_true_lang.js +162 -0
  164. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.js +5 -0
  165. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +133 -0
  166. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +59 -0
  167. package/dist/es/layouts/sidebar/layer/LayerMenu.js +5 -0
  168. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +90 -0
  169. package/dist/es/layouts/sidebar/layer/LayerNodeTool.js +5 -0
  170. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +35 -0
  171. package/dist/es/layouts/sidebar/layer/LayerPanel.js +5 -0
  172. package/dist/es/layouts/sidebar/layer/LayerPanel.vue_vue_type_script_setup_true_lang.js +99 -0
  173. package/dist/es/layouts/sidebar/layer/use-click.js +68 -0
  174. package/dist/es/layouts/sidebar/layer/use-drag.js +118 -0
  175. package/dist/es/layouts/sidebar/layer/use-keybinding.js +36 -0
  176. package/dist/es/layouts/sidebar/layer/use-node-status.js +75 -0
  177. package/dist/es/layouts/workspace/Breadcrumb.js +5 -0
  178. package/dist/es/layouts/workspace/Breadcrumb.vue_vue_type_script_setup_true_lang.js +39 -0
  179. package/dist/es/layouts/workspace/Workspace.js +5 -0
  180. package/dist/es/layouts/workspace/Workspace.vue_vue_type_script_setup_true_lang.js +43 -0
  181. package/dist/es/layouts/workspace/viewer/NodeListMenu.js +5 -0
  182. package/dist/es/layouts/workspace/viewer/NodeListMenu.vue_vue_type_script_setup_true_lang.js +88 -0
  183. package/dist/es/layouts/workspace/viewer/Stage.js +5 -0
  184. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +206 -0
  185. package/dist/es/layouts/workspace/viewer/StageOverlay.js +5 -0
  186. package/dist/es/layouts/workspace/viewer/StageOverlay.vue_vue_type_script_setup_true_lang.js +89 -0
  187. package/dist/es/layouts/workspace/viewer/ViewerMenu.js +5 -0
  188. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +132 -0
  189. package/dist/es/plugin.js +61 -0
  190. package/dist/es/services/BaseService.js +148 -0
  191. package/dist/es/services/codeBlock.js +251 -0
  192. package/dist/es/services/componentList.js +29 -0
  193. package/dist/es/services/dataSource.js +157 -0
  194. package/dist/es/services/dep.js +173 -0
  195. package/dist/es/services/editor.js +752 -0
  196. package/dist/es/services/events.js +64 -0
  197. package/dist/es/services/history.js +84 -0
  198. package/dist/es/services/keybinding.js +182 -0
  199. package/dist/es/services/props.js +216 -0
  200. package/dist/es/services/stageOverlay.js +161 -0
  201. package/dist/es/services/storage.js +127 -0
  202. package/dist/es/services/ui.js +112 -0
  203. package/dist/es/style.css +1937 -0
  204. package/dist/es/type.js +90 -0
  205. package/dist/es/utils/compose.js +44 -0
  206. package/dist/es/utils/config.js +8 -0
  207. package/dist/es/utils/const.js +15 -0
  208. package/dist/es/utils/content-menu.js +76 -0
  209. package/dist/es/utils/data-source/formConfigs/base.js +28 -0
  210. package/dist/es/utils/data-source/formConfigs/http.js +74 -0
  211. package/dist/es/utils/data-source/index.js +202 -0
  212. package/dist/es/utils/dep/idle-task.js +76 -0
  213. package/dist/es/utils/dep/worker.js +19 -0
  214. package/dist/es/utils/editor.js +261 -0
  215. package/dist/es/utils/keybinding-config.js +106 -0
  216. package/dist/es/utils/logger.js +18 -0
  217. package/dist/es/utils/monaco-editor.js +13 -0
  218. package/dist/es/utils/operator.js +73 -0
  219. package/dist/es/utils/props.js +232 -0
  220. package/dist/es/utils/scroll-viewer.js +115 -0
  221. package/dist/es/utils/tree.js +11 -0
  222. package/dist/es/utils/undo-redo.js +43 -0
  223. package/dist/style.css +10 -10
  224. package/dist/tmagic-editor.umd.cjs +18430 -21979
  225. package/package.json +16 -12
  226. package/src/components/CodeBlockEditor.vue +2 -8
  227. package/src/fields/CodeLink.vue +2 -2
  228. package/src/fields/CodeSelectCol.vue +1 -1
  229. package/src/fields/DataSourceFieldSelect/Index.vue +16 -3
  230. package/src/fields/DataSourceFields.vue +4 -1
  231. package/src/fields/EventSelect.vue +11 -11
  232. package/src/fields/StyleSetter/components/BackgroundPosition.vue +2 -2
  233. package/src/fields/StyleSetter/pro/Layout.vue +8 -8
  234. package/src/index.ts +1 -73
  235. package/src/plugin.ts +92 -0
  236. package/src/services/props.ts +3 -1
  237. package/src/type.ts +1 -1
  238. package/src/utils/data-source/index.ts +71 -73
  239. package/src/utils/index.ts +1 -0
  240. package/src/utils/props.ts +9 -7
  241. package/types/index.d.ts +3369 -3319
  242. package/dist/tmagic-editor.js +0 -17053
@@ -0,0 +1,90 @@
1
+ //#region packages/editor/src/type.ts
2
+ var ColumnLayout = /* @__PURE__ */ function(ColumnLayout) {
3
+ ColumnLayout["LEFT"] = "left";
4
+ ColumnLayout["CENTER"] = "center";
5
+ ColumnLayout["RIGHT"] = "right";
6
+ return ColumnLayout;
7
+ }({});
8
+ var SideItemKey = /* @__PURE__ */ function(SideItemKey) {
9
+ SideItemKey["COMPONENT_LIST"] = "component-list";
10
+ SideItemKey["LAYER"] = "layer";
11
+ SideItemKey["CODE_BLOCK"] = "code-block";
12
+ SideItemKey["DATA_SOURCE"] = "data-source";
13
+ return SideItemKey;
14
+ }({});
15
+ var LayerOffset = /* @__PURE__ */ function(LayerOffset) {
16
+ LayerOffset["TOP"] = "top";
17
+ LayerOffset["BOTTOM"] = "bottom";
18
+ return LayerOffset;
19
+ }({});
20
+ /** 容器布局 */
21
+ var Layout = /* @__PURE__ */ function(Layout) {
22
+ Layout["FLEX"] = "flex";
23
+ Layout["FIXED"] = "fixed";
24
+ Layout["RELATIVE"] = "relative";
25
+ Layout["ABSOLUTE"] = "absolute";
26
+ return Layout;
27
+ }({});
28
+ var Keys = /* @__PURE__ */ function(Keys) {
29
+ Keys["ESCAPE"] = "Space";
30
+ return Keys;
31
+ }({});
32
+ var CodeDeleteErrorType = /* @__PURE__ */ function(CodeDeleteErrorType) {
33
+ /** 代码块存在于不可删除列表中 */
34
+ CodeDeleteErrorType["UNDELETEABLE"] = "undeleteable";
35
+ /** 代码块存在绑定关系 */
36
+ CodeDeleteErrorType["BIND"] = "bind";
37
+ return CodeDeleteErrorType;
38
+ }({});
39
+ var CODE_DRAFT_STORAGE_KEY = "magicCodeDraft";
40
+ var KeyBindingCommand = /* @__PURE__ */ function(KeyBindingCommand) {
41
+ /** 复制 */
42
+ KeyBindingCommand["COPY_NODE"] = "tmagic-system-copy-node";
43
+ /** 粘贴 */
44
+ KeyBindingCommand["PASTE_NODE"] = "tmagic-system-paste-node";
45
+ /** 删除 */
46
+ KeyBindingCommand["DELETE_NODE"] = "tmagic-system-delete-node";
47
+ /** 剪切 */
48
+ KeyBindingCommand["CUT_NODE"] = "tmagic-system-cut-node";
49
+ /** 撤销 */
50
+ KeyBindingCommand["UNDO"] = "tmagic-system-undo";
51
+ /** 重做 */
52
+ KeyBindingCommand["REDO"] = "tmagic-system-redo";
53
+ /** 放大 */
54
+ KeyBindingCommand["ZOOM_IN"] = "tmagic-system-zoom-in";
55
+ /** 缩小 */
56
+ KeyBindingCommand["ZOOM_OUT"] = "tmagic-system-zoom-out";
57
+ /** 缩放到实际大小 */
58
+ KeyBindingCommand["ZOOM_RESET"] = "tmagic-system-zoom-reset";
59
+ /** 缩放以适应 */
60
+ KeyBindingCommand["ZOOM_FIT"] = "tmagic-system-zoom-fit";
61
+ /** 向上移动1px */
62
+ KeyBindingCommand["MOVE_UP_1"] = "tmagic-system-move-up-1";
63
+ /** 向下移动1px */
64
+ KeyBindingCommand["MOVE_DOWN_1"] = "tmagic-system-move-down-1";
65
+ /** 向左移动1px */
66
+ KeyBindingCommand["MOVE_LEFT_1"] = "tmagic-system-move-left-1";
67
+ /** 向右移动1px */
68
+ KeyBindingCommand["MOVE_RIGHT_1"] = "tmagic-system-move-right-1";
69
+ /** 向上移动10px */
70
+ KeyBindingCommand["MOVE_UP_10"] = "tmagic-system-move-up-10";
71
+ /** 向下移动10px */
72
+ KeyBindingCommand["MOVE_DOWN_10"] = "tmagic-system-move-down-10";
73
+ /** 向左移动10px */
74
+ KeyBindingCommand["MOVE_LEFT_10"] = "tmagic-system-move-left-10";
75
+ /** 向右移动10px */
76
+ KeyBindingCommand["MOVE_RIGHT_10"] = "tmagic-system-move-right-10";
77
+ /** 切换组件 */
78
+ KeyBindingCommand["SWITCH_NODE"] = "tmagic-system-switch-node";
79
+ return KeyBindingCommand;
80
+ }({});
81
+ /** 拖拽类型 */
82
+ var DragType = /* @__PURE__ */ function(DragType) {
83
+ /** 从组件列表拖到画布 */
84
+ DragType["COMPONENT_LIST"] = "component-list";
85
+ /** 拖动组件树节点 */
86
+ DragType["LAYER_TREE"] = "layer-tree";
87
+ return DragType;
88
+ }({});
89
+ //#endregion
90
+ export { CODE_DRAFT_STORAGE_KEY, CodeDeleteErrorType, ColumnLayout, DragType, KeyBindingCommand, Keys, LayerOffset, Layout, SideItemKey };
@@ -0,0 +1,44 @@
1
+ //#region packages/editor/src/utils/compose.ts
2
+ /**
3
+ * @param {Array} middleware
4
+ * @return {Function}
5
+ */
6
+ var compose = (middleware, isAsync) => {
7
+ if (!Array.isArray(middleware)) throw new TypeError("Middleware 必须是一个数组!");
8
+ for (const fn of middleware) if (typeof fn !== "function") throw new TypeError("Middleware 必须由函数组成!");
9
+ /**
10
+ * @param {Object} args
11
+ * @return {Promise}
12
+ * @api public
13
+ */
14
+ return (args, next) => {
15
+ let index = -1;
16
+ return dispatch(0);
17
+ function dispatch(i) {
18
+ if (i <= index) {
19
+ const error = /* @__PURE__ */ new Error("next() 被多次调用");
20
+ if (isAsync) return Promise.reject(error);
21
+ throw error;
22
+ }
23
+ index = i;
24
+ let fn = middleware[i];
25
+ if (i === middleware.length && next) fn = next;
26
+ if (!fn) {
27
+ if (isAsync) return Promise.resolve();
28
+ return;
29
+ }
30
+ if (isAsync) try {
31
+ return Promise.resolve(fn(...args, dispatch.bind(null, i + 1)));
32
+ } catch (err) {
33
+ return Promise.reject(err);
34
+ }
35
+ try {
36
+ return fn(...args, dispatch.bind(null, i + 1));
37
+ } catch (err) {
38
+ throw err;
39
+ }
40
+ }
41
+ };
42
+ };
43
+ //#endregion
44
+ export { compose };
@@ -0,0 +1,8 @@
1
+ //#region packages/editor/src/utils/config.ts
2
+ var $TMAGIC_EDITOR = {};
3
+ var setEditorConfig = (option) => {
4
+ $TMAGIC_EDITOR = option;
5
+ };
6
+ var getEditorConfig = (key) => $TMAGIC_EDITOR[key];
7
+ //#endregion
8
+ export { getEditorConfig, setEditorConfig };
@@ -0,0 +1,15 @@
1
+ //#region packages/editor/src/utils/const.ts
2
+ /** 当uiService.get('uiSelectMode')为true,点击组件(包括任何形式,组件树/画布)时触发的事件名 */
3
+ var UI_SELECT_MODE_EVENT_NAME = "ui-select";
4
+ var LEFT_COLUMN_WIDTH_STORAGE_KEY = "$MagicEditorLeftColumnWidthData";
5
+ var RIGHT_COLUMN_WIDTH_STORAGE_KEY = "$MagicEditorRightColumnWidthData";
6
+ var PROPS_PANEL_WIDTH_STORAGE_KEY = "$MagicEditorPropsPanelWidthData";
7
+ var DEFAULT_LEFT_COLUMN_WIDTH = 310;
8
+ var DEFAULT_RIGHT_COLUMN_WIDTH = 480;
9
+ var MIN_LEFT_COLUMN_WIDTH = 200;
10
+ var MIN_CENTER_COLUMN_WIDTH = 400;
11
+ var MIN_RIGHT_COLUMN_WIDTH = 300;
12
+ var H_GUIDE_LINE_STORAGE_KEY = "$MagicStageHorizontalGuidelinesData";
13
+ var V_GUIDE_LINE_STORAGE_KEY = "$MagicStageVerticalGuidelinesData";
14
+ //#endregion
15
+ export { DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, H_GUIDE_LINE_STORAGE_KEY, LEFT_COLUMN_WIDTH_STORAGE_KEY, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, RIGHT_COLUMN_WIDTH_STORAGE_KEY, UI_SELECT_MODE_EVENT_NAME, V_GUIDE_LINE_STORAGE_KEY };
@@ -0,0 +1,76 @@
1
+ import { COPY_STORAGE_KEY } from "./editor.js";
2
+ import { calcValueByFontsize, isPage, isPageFragment } from "@tmagic/utils";
3
+ import { NodeType } from "@tmagic/core";
4
+ import { computed, markRaw } from "vue";
5
+ import { CopyDocument, Delete, DocumentCopy } from "@element-plus/icons-vue";
6
+ //#region packages/editor/src/utils/content-menu.ts
7
+ var useDeleteMenu = () => ({
8
+ type: "button",
9
+ text: "删除",
10
+ icon: Delete,
11
+ display: ({ editorService }) => {
12
+ const node = editorService.get("node");
13
+ return node?.type !== NodeType.ROOT && !isPage(node) && !isPageFragment(node);
14
+ },
15
+ handler: ({ editorService }) => {
16
+ const nodes = editorService.get("nodes");
17
+ nodes && editorService.remove(nodes);
18
+ }
19
+ });
20
+ var useCopyMenu = () => ({
21
+ type: "button",
22
+ text: "复制",
23
+ icon: markRaw(CopyDocument),
24
+ handler: ({ editorService }) => {
25
+ const nodes = editorService?.get("nodes");
26
+ nodes && editorService?.copy(nodes);
27
+ }
28
+ });
29
+ var usePasteMenu = (menu) => ({
30
+ type: "button",
31
+ text: "粘贴",
32
+ icon: markRaw(DocumentCopy),
33
+ display: ({ storageService }) => !!storageService.getItem(COPY_STORAGE_KEY),
34
+ handler: ({ editorService, uiService }) => {
35
+ const nodes = editorService?.get("nodes");
36
+ if (!nodes || nodes.length === 0) return;
37
+ if (menu?.value?.$el) {
38
+ const stage = editorService.get("stage");
39
+ const rect = menu.value.$el.getBoundingClientRect();
40
+ const parentRect = stage?.container?.getBoundingClientRect();
41
+ const initialLeft = calcValueByFontsize(stage?.renderer?.getDocument(), (rect.left || 0) - (parentRect?.left || 0)) / uiService.get("zoom");
42
+ const initialTop = calcValueByFontsize(stage?.renderer?.getDocument(), (rect.top || 0) - (parentRect?.top || 0)) / uiService.get("zoom");
43
+ editorService.paste({
44
+ left: initialLeft,
45
+ top: initialTop
46
+ });
47
+ } else editorService.paste();
48
+ }
49
+ });
50
+ var moveTo = (id, { editorService }) => {
51
+ const nodes = editorService.get("nodes") || [];
52
+ const parent = editorService.getNodeById(id);
53
+ if (!parent) return;
54
+ editorService.add(nodes, parent);
55
+ editorService.remove(nodes);
56
+ };
57
+ var useMoveToMenu = ({ editorService }) => {
58
+ return {
59
+ type: "button",
60
+ text: "移动至",
61
+ display: ({ editorService }) => {
62
+ const node = editorService.get("node");
63
+ const pageLength = editorService.get("pageLength");
64
+ return !isPage(node) && pageLength > 1;
65
+ },
66
+ items: (computed(() => editorService.get("root")).value?.items || []).filter((page) => page.id !== editorService.get("page")?.id).map((page) => ({
67
+ text: `${page.name}(${page.id})`,
68
+ type: "button",
69
+ handler: (services) => {
70
+ moveTo(page.id, services);
71
+ }
72
+ }))
73
+ };
74
+ };
75
+ //#endregion
76
+ export { useCopyMenu, useDeleteMenu, useMoveToMenu, usePasteMenu };
@@ -0,0 +1,28 @@
1
+ import { defineFormConfig } from "@tmagic/form";
2
+ //#region packages/editor/src/utils/data-source/formConfigs/base.ts
3
+ var base_default = () => defineFormConfig([
4
+ {
5
+ name: "id",
6
+ type: "hidden"
7
+ },
8
+ {
9
+ name: "type",
10
+ text: "类型",
11
+ type: "hidden",
12
+ defaultValue: "base"
13
+ },
14
+ {
15
+ name: "title",
16
+ text: "名称",
17
+ rules: [{
18
+ required: true,
19
+ message: "请输入名称"
20
+ }]
21
+ },
22
+ {
23
+ name: "description",
24
+ text: "描述"
25
+ }
26
+ ]);
27
+ //#endregion
28
+ export { base_default as default };
@@ -0,0 +1,74 @@
1
+ import { defineFormConfig } from "@tmagic/form";
2
+ //#region packages/editor/src/utils/data-source/formConfigs/http.ts
3
+ var http_default = defineFormConfig([
4
+ {
5
+ name: "autoFetch",
6
+ text: "自动请求",
7
+ type: "switch",
8
+ defaultValue: true
9
+ },
10
+ {
11
+ name: "responseOptions",
12
+ items: [{
13
+ name: "dataPath",
14
+ text: "数据路径"
15
+ }]
16
+ },
17
+ {
18
+ type: "fieldset",
19
+ name: "options",
20
+ legend: "HTTP 配置",
21
+ items: [
22
+ {
23
+ name: "url",
24
+ text: "URL"
25
+ },
26
+ {
27
+ name: "method",
28
+ text: "Method",
29
+ type: "select",
30
+ options: [
31
+ {
32
+ text: "GET",
33
+ value: "GET"
34
+ },
35
+ {
36
+ text: "POST",
37
+ value: "POST"
38
+ },
39
+ {
40
+ text: "PUT",
41
+ value: "PUT"
42
+ },
43
+ {
44
+ text: "DELETE",
45
+ value: "DELETE"
46
+ }
47
+ ]
48
+ },
49
+ {
50
+ name: "params",
51
+ type: "key-value",
52
+ defaultValue: {},
53
+ advanced: true,
54
+ text: "参数"
55
+ },
56
+ {
57
+ name: "data",
58
+ type: "key-value",
59
+ defaultValue: {},
60
+ advanced: true,
61
+ text: "请求体"
62
+ },
63
+ {
64
+ name: "headers",
65
+ type: "key-value",
66
+ defaultValue: {},
67
+ advanced: true,
68
+ text: "请求头"
69
+ }
70
+ ]
71
+ }
72
+ ]);
73
+ //#endregion
74
+ export { http_default as default };
@@ -0,0 +1,202 @@
1
+ import base_default from "./formConfigs/base.js";
2
+ import http_default from "./formConfigs/http.js";
3
+ import { dataSourceTemplateRegExp, getKeysArray, isNumber } from "@tmagic/utils";
4
+ //#region packages/editor/src/utils/data-source/index.ts
5
+ var dataSourceFormConfig = {
6
+ type: "tab",
7
+ items: [
8
+ {
9
+ title: "数据定义",
10
+ items: [{
11
+ name: "fields",
12
+ type: "data-source-fields",
13
+ defaultValue: () => []
14
+ }]
15
+ },
16
+ {
17
+ title: "方法定义",
18
+ items: [{
19
+ name: "methods",
20
+ type: "data-source-methods",
21
+ defaultValue: () => []
22
+ }]
23
+ },
24
+ {
25
+ title: "事件配置",
26
+ items: [{
27
+ name: "events",
28
+ src: "datasource",
29
+ type: "event-select"
30
+ }]
31
+ },
32
+ {
33
+ title: "mock数据",
34
+ items: [{
35
+ name: "mocks",
36
+ type: "data-source-mocks",
37
+ defaultValue: () => []
38
+ }]
39
+ },
40
+ {
41
+ title: "请求参数裁剪",
42
+ display: (_formState, { model }) => model.type === "http",
43
+ items: [{
44
+ name: "beforeRequest",
45
+ type: "vs-code",
46
+ parse: true,
47
+ autosize: {
48
+ minRows: 10,
49
+ maxRows: 30
50
+ }
51
+ }]
52
+ },
53
+ {
54
+ title: "响应数据裁剪",
55
+ display: (_formState, { model }) => model.type === "http",
56
+ items: [{
57
+ name: "afterResponse",
58
+ type: "vs-code",
59
+ parse: true,
60
+ autosize: {
61
+ minRows: 10,
62
+ maxRows: 30
63
+ }
64
+ }]
65
+ }
66
+ ]
67
+ };
68
+ var fillConfig = (config) => [
69
+ ...base_default(),
70
+ ...config,
71
+ dataSourceFormConfig
72
+ ];
73
+ var getFormConfig = (type, configs) => {
74
+ switch (type) {
75
+ case "base": return fillConfig([]);
76
+ case "http": return fillConfig(http_default);
77
+ default: return fillConfig(configs[type] || []);
78
+ }
79
+ };
80
+ var getFormValue = (type, values) => {
81
+ if (type !== "http") return values;
82
+ return {
83
+ beforeRequest: `(options, context) => {
84
+ /**
85
+ * 用户可以直接编写函数,在原始接口调用之前,会运行该函数,将这个函数的返回值作为该数据源接口的入参
86
+ *
87
+ * options: HttpOptions
88
+ *
89
+ * interface HttpOptions {
90
+ * // 请求链接
91
+ * url: string;
92
+ * // query参数
93
+ * params?: Record<string, string>;
94
+ * // body数据
95
+ * data?: Record<string, any>;
96
+ * // 请求头
97
+ * headers?: Record<string, string>;
98
+ * // 请求方法 GET/POST
99
+ * method?: Method;
100
+ * }
101
+ *
102
+ * context:上下文对象
103
+ *
104
+ * interface Content {
105
+ * app: TMagicApp;
106
+ * dataSource: HttpDataSource;
107
+ * }
108
+ *
109
+ * return: HttpOptions
110
+ */
111
+
112
+ // 此处的返回值会作为这个接口的入参
113
+ return options;
114
+ }`,
115
+ afterResponse: `(response, context) => {
116
+ /**
117
+ * 用户可以直接编写函数,在原始接口返回之后,会运行该函数,将这个函数的返回值作为该数据源接口的返回
118
+
119
+ * context:上下文对象
120
+ *
121
+ * interface Content {
122
+ * app: TMagicApp;
123
+ * dataSource: HttpDataSource;
124
+ * }
125
+ *
126
+ */
127
+
128
+ // 此处的返回值会作为这个接口的返回值
129
+ return response;
130
+ }`,
131
+ ...values
132
+ };
133
+ };
134
+ var getDisplayField = (dataSources, key) => {
135
+ const displayState = [];
136
+ const matches = key.matchAll(dataSourceTemplateRegExp);
137
+ let index = 0;
138
+ for (const match of matches) {
139
+ if (typeof match.index === "undefined") break;
140
+ displayState.push({
141
+ type: "text",
142
+ value: key.substring(index, match.index)
143
+ });
144
+ let dsText = "";
145
+ let ds;
146
+ let fields;
147
+ getKeysArray(match[1]).forEach((item, index) => {
148
+ if (index === 0) {
149
+ ds = dataSources.find((ds) => ds.id === item);
150
+ dsText += ds?.title || item;
151
+ fields = ds?.fields;
152
+ return;
153
+ }
154
+ if (isNumber(item)) dsText += `[${item}]`;
155
+ else {
156
+ const field = fields?.find((field) => field.name === item);
157
+ fields = field?.fields;
158
+ dsText += `.${field?.title || item}`;
159
+ }
160
+ });
161
+ displayState.push({
162
+ type: "var",
163
+ value: dsText
164
+ });
165
+ index = match.index + match[0].length;
166
+ }
167
+ if (index < key.length) displayState.push({
168
+ type: "text",
169
+ value: key.substring(index)
170
+ });
171
+ return displayState;
172
+ };
173
+ var getCascaderOptionsFromFields = (fields = [], dataSourceFieldType = ["any"]) => {
174
+ const typeSet = new Set(dataSourceFieldType.length ? dataSourceFieldType : ["any"]);
175
+ const includesAny = typeSet.has("any");
176
+ const result = [];
177
+ for (const field of fields) {
178
+ const fieldType = field.type || "any";
179
+ const isContainerType = fieldType === "any" || fieldType === "array" || fieldType === "object";
180
+ const children = isContainerType ? getCascaderOptionsFromFields(field.fields, dataSourceFieldType) : [];
181
+ if (includesAny || typeSet.has(fieldType) || isContainerType && children.length) result.push({
182
+ label: `${field.title || field.name}(${field.type})`,
183
+ value: field.name,
184
+ children
185
+ });
186
+ }
187
+ return result;
188
+ };
189
+ var getFieldType = (ds, fieldNames) => {
190
+ let fields = ds?.fields;
191
+ let type = "";
192
+ for (const fieldName of fieldNames) {
193
+ if (!fields?.length) return "";
194
+ const field = fields.find((f) => f.name === fieldName);
195
+ if (!field) return "";
196
+ type = field.type || "";
197
+ fields = field.fields;
198
+ }
199
+ return type;
200
+ };
201
+ //#endregion
202
+ export { getCascaderOptionsFromFields, getDisplayField, getFieldType, getFormConfig, getFormValue };
@@ -0,0 +1,76 @@
1
+ import { EventEmitter } from "events";
2
+ //#region packages/editor/src/utils/dep/idle-task.ts
3
+ globalThis.requestIdleCallback = globalThis.requestIdleCallback || function(cb) {
4
+ const start = Date.now();
5
+ return setTimeout(() => {
6
+ cb({
7
+ didTimeout: false,
8
+ timeRemaining() {
9
+ return Math.max(0, 50 - (Date.now() - start));
10
+ }
11
+ });
12
+ }, 1);
13
+ };
14
+ var IdleTask = class extends EventEmitter {
15
+ taskList = [];
16
+ hightLevelTaskList = [];
17
+ taskHandle = null;
18
+ constructor() {
19
+ super();
20
+ this.setMaxListeners(1e3);
21
+ }
22
+ enqueueTask(taskHandler, taskData, isHightLevel = false) {
23
+ (isHightLevel ? this.hightLevelTaskList : this.taskList).push({
24
+ handler: taskHandler,
25
+ data: taskData
26
+ });
27
+ if (!this.taskHandle) this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 1e4 });
28
+ }
29
+ clearTasks() {
30
+ if (this.taskHandle) globalThis.cancelIdleCallback(this.taskHandle);
31
+ this.hightLevelTaskList = [];
32
+ this.taskList = [];
33
+ this.taskHandle = null;
34
+ this.emit("update-task-length", {
35
+ length: this.taskList.length + this.hightLevelTaskList.length,
36
+ hightLevelLength: this.hightLevelTaskList.length
37
+ });
38
+ }
39
+ on(eventName, listener) {
40
+ return super.on(eventName, listener);
41
+ }
42
+ once(eventName, listener) {
43
+ return super.once(eventName, listener);
44
+ }
45
+ emit(eventName, ...args) {
46
+ return super.emit(eventName, ...args);
47
+ }
48
+ runTaskQueue(deadline) {
49
+ const { hightLevelTaskList, taskList } = this;
50
+ while (deadline.timeRemaining() > 0 && (taskList.length || hightLevelTaskList.length)) {
51
+ const timeRemaining = deadline.timeRemaining();
52
+ let times = 0;
53
+ if (timeRemaining <= 5) times = 10;
54
+ else if (timeRemaining <= 10) times = 100;
55
+ else if (timeRemaining <= 15) times = 300;
56
+ else times = 600;
57
+ for (let i = 0; i < times; i++) {
58
+ const task = hightLevelTaskList.length > 0 ? hightLevelTaskList.shift() : taskList.shift();
59
+ if (task) task.handler(task.data);
60
+ if (hightLevelTaskList.length === 0 && taskList.length === 0) break;
61
+ }
62
+ }
63
+ if (!hightLevelTaskList.length) this.emit("hight-level-finish");
64
+ if (hightLevelTaskList.length || taskList.length) this.taskHandle = globalThis.requestIdleCallback(this.runTaskQueue.bind(this), { timeout: 300 });
65
+ else {
66
+ this.taskHandle = 0;
67
+ this.emit("finish");
68
+ }
69
+ this.emit("update-task-length", {
70
+ length: taskList.length + hightLevelTaskList.length,
71
+ hightLevelLength: hightLevelTaskList.length
72
+ });
73
+ }
74
+ };
75
+ //#endregion
76
+ export { IdleTask };
@@ -0,0 +1,19 @@
1
+ //#region packages/editor/src/utils/dep/worker.ts?worker&inline
2
+ var jsContent = "(function() {\n //#region packages/schema/src/index.ts\n const NODE_CONDS_KEY = \"displayConds\";\n const NODE_DISABLE_DATA_SOURCE_KEY = \"_tmagic_node_disabled_data_source\";\n const NODE_DISABLE_CODE_BLOCK_KEY = \"_tmagic_node_disabled_code_block\";\n let HookType = /* @__PURE__ */ function(HookType) {\n /** 代码块钩子标识 */\n HookType[\"CODE\"] = \"code\";\n return HookType;\n }({});\n //#endregion\n //#region packages/utils/src/index.ts\n const isObject = (obj) => Object.prototype.toString.call(obj) === \"[object Object]\";\n const getKeysArray = (keys) => `${keys}`.replace(/\\[(\\d+)\\]/g, \".$1\").split(\".\");\n const DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX = \"ds-field::\";\n const dataSourceTemplateRegExp = /\\$\\{([\\s\\S]+?)\\}/g;\n //#endregion\n //#region packages/dep/src/types.ts\n /** 依赖收集的目标类型 */\n let DepTargetType = /* @__PURE__ */ function(DepTargetType) {\n DepTargetType[\"DEFAULT\"] = \"default\";\n /** 代码块 */\n DepTargetType[\"CODE_BLOCK\"] = \"code-block\";\n /** 数据源 */\n DepTargetType[\"DATA_SOURCE\"] = \"data-source\";\n /** 数据源方法 */\n DepTargetType[\"DATA_SOURCE_METHOD\"] = \"data-source-method\";\n /** 数据源条件 */\n DepTargetType[\"DATA_SOURCE_COND\"] = \"data-source-cond\";\n return DepTargetType;\n }({});\n //#endregion\n //#region packages/dep/src/Target.ts\n /**\n * 需要收集依赖的目标\n * 例如:一个代码块可以为一个目标\n */\n var Target = class {\n /**\n * 如何识别目标\n */\n isTarget;\n /**\n * 目标id,不可重复\n * 例如目标是代码块,则为代码块id\n */\n id;\n /**\n * 目标名称,用于显示在依赖列表中\n */\n name;\n /**\n * 不同的目标可以进行分类,例如代码块,数据源可以为两个不同的type\n */\n type = DepTargetType.DEFAULT;\n /**\n * 依赖详情\n * 实例:{ 'node_id': { name: 'node_name', keys: [ created, mounted ] } }\n */\n deps = {};\n /**\n * 是否默认收集,默认为true,当值为false时需要传入type参数给collect方法才会被收集\n */\n isCollectByDefault;\n constructor(options) {\n this.isTarget = options.isTarget;\n this.id = options.id;\n this.name = options.name;\n this.isCollectByDefault = options.isCollectByDefault ?? true;\n if (options.type) this.type = options.type;\n if (options.initialDeps) this.deps = options.initialDeps;\n }\n /**\n * 更新依赖\n * @param option 节点配置\n * @param key 哪个key配置了这个目标的id\n */\n updateDep({ id, name, key, data }) {\n const dep = this.deps[id] || {\n name,\n keys: []\n };\n dep.name = name;\n dep.data = data;\n this.deps[id] = dep;\n if (!dep.keys.includes(key)) dep.keys.push(key);\n }\n /**\n * 删除依赖\n * @param node 哪个节点的依赖需要移除,如果为空,则移除所有依赖\n * @param key 节点下哪个key需要移除,如果为空,则移除改节点下的所有依赖key\n * @returns void\n */\n removeDep(id, key) {\n if (typeof id === \"undefined\") {\n Object.keys(this.deps).forEach((depKey) => {\n delete this.deps[depKey];\n });\n return;\n }\n const dep = this.deps[id];\n if (!dep) return;\n if (key) {\n const index = dep.keys.indexOf(key);\n dep.keys.splice(index, 1);\n if (dep.keys.length === 0) delete this.deps[id];\n } else delete this.deps[id];\n }\n /**\n * 判断指定节点下的指定key是否存在在依赖列表中\n * @param node 哪个节点\n * @param key 哪个key\n * @returns boolean\n */\n hasDep(id, key) {\n return this.deps[id]?.keys.includes(key) ?? false;\n }\n destroy() {\n this.deps = {};\n }\n };\n //#endregion\n //#region packages/dep/src/utils.ts\n const INTEGER_REGEXP = /^\\d+$/;\n const createCodeBlockTarget = (id, codeBlock, initialDeps = {}) => new Target({\n type: DepTargetType.CODE_BLOCK,\n id,\n initialDeps,\n name: codeBlock.name,\n isTarget: (_key, value) => {\n if (id === value) return true;\n if (value?.hookType === HookType.CODE && Array.isArray(value.hookData)) return value.hookData.some((item) => item.codeId === id);\n return false;\n }\n });\n /**\n * ['array'] ['array', '0'] ['array', '0', 'a'] 这种返回false\n * ['array', 'a'] 这种返回true\n * @param keys\n * @param fields\n * @returns boolean\n */\n const isIncludeArrayField = (keys, fields) => {\n let f = fields;\n return keys.some((key, index) => {\n const field = f.find(({ name }) => name === key);\n f = field?.fields || [];\n return field?.type === \"array\" && index < keys.length - 1 && !INTEGER_REGEXP.test(keys[index + 1]);\n });\n };\n /**\n * 判断模板(value)是不是使用数据源Id(dsId),如:`xxx${dsId.field}xxx${dsId.field}`\n * @param value any\n * @param dsId string | number\n * @param hasArray boolean true: 一定要包含有需要迭代的模板; false: 一定要包含普通模板;\n * @returns boolean\n */\n const isDataSourceTemplate = (value, ds, hasArray = false) => {\n const templates = value.match(dataSourceTemplateRegExp) || [];\n if (templates.length <= 0) return false;\n for (const tpl of templates) {\n const keys = getKeysArray(tpl.substring(2, tpl.length - 1));\n const dsId = keys.shift();\n if (!dsId || dsId !== ds.id) continue;\n if (hasArray === isIncludeArrayField(keys, ds.fields)) return true;\n }\n return false;\n };\n /**\n * 指定数据源的字符串模板,如:{ isBindDataSourceField: true, dataSourceId: 'id', template: `xxx${field}xxx`}\n * @param value any\n * @param dsId string | number\n * @returns boolean\n */\n const isSpecificDataSourceTemplate = (value, dsId) => value?.isBindDataSourceField && value.dataSourceId && value.dataSourceId === dsId && typeof value.template === \"string\";\n /**\n * 关联数据源字段,格式为 [前缀+数据源ID, 字段名]\n * 使用data-source-field-select value: 'value' 可以配置出来\n * @param value any[]\n * @param id string | number\n * @returns boolean\n */\n const isUseDataSourceField = (value, id) => {\n if (!Array.isArray(value) || typeof value[0] !== \"string\") return false;\n const [prefixId] = value;\n const prefixIndex = prefixId.indexOf(DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX);\n if (prefixIndex === -1) return false;\n return prefixId.substring(prefixIndex + DATA_SOURCE_FIELDS_SELECT_VALUE_PREFIX.length) === id;\n };\n const isDataSourceTarget = (ds, key, value, hasArray = false) => {\n if (!value) return false;\n const valueType = typeof value;\n if (valueType !== \"string\" && valueType !== \"object\") return false;\n if (`${key}`.startsWith(\"displayConds\")) return false;\n if (valueType === \"string\") return isDataSourceTemplate(value, ds, hasArray);\n if (isObject(value) && value.isBindDataSource && value.dataSourceId === ds.id) return true;\n if (isSpecificDataSourceTemplate(value, ds.id)) return true;\n if (isUseDataSourceField(value, ds.id)) {\n const [, ...keys] = value;\n const includeArray = isIncludeArrayField(keys, ds.fields);\n return hasArray ? includeArray : !includeArray;\n }\n return false;\n };\n const isDataSourceCondTarget = (ds, key, value, hasArray = false) => {\n if (!Array.isArray(value) || !ds) return false;\n const [dsId, ...keys] = value;\n if (dsId !== ds.id || !`${key}`.startsWith(\"displayConds\")) return false;\n if (ds.fields?.some((field) => field.name === keys[0])) {\n const includeArray = isIncludeArrayField(keys, ds.fields);\n return hasArray ? includeArray : !includeArray;\n }\n return false;\n };\n const createDataSourceTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceTarget(ds, key, value)\n });\n const createDataSourceCondTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_COND,\n id: ds.id,\n initialDeps,\n isTarget: (key, value) => isDataSourceCondTarget(ds, key, value)\n });\n const createDataSourceMethodTarget = (ds, initialDeps = {}) => new Target({\n type: DepTargetType.DATA_SOURCE_METHOD,\n id: ds.id,\n initialDeps,\n isTarget: (_key, value) => {\n if (!Array.isArray(value)) return false;\n const [dsId, methodName] = value;\n if (!methodName || dsId !== ds.id) return false;\n if (ds.methods?.some((method) => method.name === methodName)) return true;\n if (ds.fields?.some((field) => field.name === methodName)) return false;\n return true;\n }\n });\n const traverseTarget = (targetsList, cb, type) => {\n if (type) {\n const targets = targetsList[type];\n if (targets) for (const target of Object.values(targets)) cb(target);\n return;\n }\n for (const targets of Object.values(targetsList)) for (const target of Object.values(targets)) cb(target);\n };\n //#endregion\n //#region packages/dep/src/Watcher.ts\n const DATA_SOURCE_TARGET_TYPES = new Set([\n DepTargetType.DATA_SOURCE,\n DepTargetType.DATA_SOURCE_COND,\n DepTargetType.DATA_SOURCE_METHOD\n ]);\n var Watcher = class {\n targetsList = {};\n childrenProp = \"items\";\n idProp = \"id\";\n nameProp = \"name\";\n constructor(options) {\n if (options?.initialTargets) this.targetsList = options.initialTargets;\n if (options?.childrenProp) this.childrenProp = options.childrenProp;\n }\n getTargetsList() {\n return this.targetsList;\n }\n /**\n * 获取指定类型中的所有target\n * @param type 分类\n * @returns Target[]\n */\n getTargets(type = DepTargetType.DEFAULT) {\n return this.targetsList[type] || {};\n }\n /**\n * 添加新的目标\n * @param target Target\n */\n addTarget(target) {\n const targets = this.getTargets(target.type) || {};\n this.targetsList[target.type] = targets;\n targets[target.id] = target;\n }\n /**\n * 获取指定id的target\n * @param id target id\n * @returns Target\n */\n getTarget(id, type = DepTargetType.DEFAULT) {\n return this.getTargets(type)[id];\n }\n /**\n * 判断是否存在指定id的target\n * @param id target id\n * @returns boolean\n */\n hasTarget(id, type = DepTargetType.DEFAULT) {\n return Boolean(this.getTarget(id, type));\n }\n /**\n * 判断是否存在指定类型的target\n * @param type target type\n * @returns boolean\n */\n hasSpecifiedTypeTarget(type = DepTargetType.DEFAULT) {\n return Object.keys(this.getTargets(type)).length > 0;\n }\n /**\n * 删除指定id的target\n * @param id target id\n */\n removeTarget(id, type = DepTargetType.DEFAULT) {\n const targets = this.getTargets(type);\n if (targets[id]) {\n targets[id].destroy();\n delete targets[id];\n }\n }\n /**\n * 删除指定分类的所有target\n * @param type 分类\n * @returns void\n */\n removeTargets(type = DepTargetType.DEFAULT) {\n const targets = this.targetsList[type];\n if (!targets) return;\n for (const target of Object.values(targets)) target.destroy();\n delete this.targetsList[type];\n }\n /**\n * 删除所有target\n */\n clearTargets() {\n for (const key of Object.keys(this.targetsList)) delete this.targetsList[key];\n }\n /**\n * 收集依赖\n * @param nodes 需要收集的节点\n * @param deep 是否需要收集子节点\n * @param type 强制收集指定类型的依赖\n */\n collect(nodes, depExtendedData = {}, deep = false, type) {\n this.collectByCallback(nodes, type, ({ node, target }) => {\n this.removeTargetDep(target, node);\n this.collectItem(node, target, depExtendedData, deep);\n });\n }\n collectByCallback(nodes, type, cb) {\n traverseTarget(this.targetsList, (target) => {\n if (!type && !target.isCollectByDefault) return;\n for (const node of nodes) cb({\n node,\n target\n });\n }, type);\n }\n /**\n * 清除所有目标的依赖\n * @param nodes 需要清除依赖的节点\n */\n clear(nodes, type) {\n let { targetsList } = this;\n if (type) targetsList = { [type]: this.getTargets(type) };\n const clearedItemsNodeIds = /* @__PURE__ */ new Set();\n traverseTarget(targetsList, (target) => {\n if (nodes) for (const node of nodes) {\n target.removeDep(node[this.idProp]);\n if (Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length && !clearedItemsNodeIds.has(node[this.idProp])) {\n clearedItemsNodeIds.add(node[this.idProp]);\n this.clear(node[this.childrenProp]);\n }\n }\n else target.removeDep();\n });\n }\n /**\n * 清除指定类型的依赖\n * @param type 类型\n * @param nodes 需要清除依赖的节点\n */\n clearByType(type, nodes) {\n this.clear(nodes, type);\n }\n collectItem(node, target, depExtendedData = {}, deep = false) {\n if (node[\"_tmagic_node_disabled_data_source\"] && DATA_SOURCE_TARGET_TYPES.has(target.type)) return;\n if (node[\"_tmagic_node_disabled_code_block\"] && target.type === DepTargetType.CODE_BLOCK) return;\n const collectTarget = (config, prop = \"\") => {\n const doCollect = (key, value) => {\n const keyIsItems = key === this.childrenProp;\n const fullKey = prop ? `${prop}.${key}` : key;\n if (target.isTarget(fullKey, value)) target.updateDep({\n id: node[this.idProp],\n name: `${node[this.nameProp] || node[this.idProp]}`,\n data: depExtendedData,\n key: fullKey\n });\n else if (!keyIsItems && Array.isArray(value)) for (let i = 0, l = value.length; i < l; i++) {\n const item = value[i];\n if (isObject(item)) collectTarget(item, `${fullKey}[${i}]`);\n }\n else if (isObject(value)) collectTarget(value, fullKey);\n if (keyIsItems && deep && Array.isArray(value)) for (const child of value) this.collectItem(child, target, depExtendedData, deep);\n };\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === \"undefined\" || value === \"\") continue;\n doCollect(key, value);\n }\n };\n collectTarget(node);\n }\n removeTargetDep(target, node, key) {\n target.removeDep(node[this.idProp], key);\n if (typeof key === \"undefined\" && Array.isArray(node[this.childrenProp]) && node[this.childrenProp].length) for (const item of node[this.childrenProp]) this.removeTargetDep(target, item, key);\n }\n };\n //#endregion\n //#region packages/editor/src/utils/logger.ts\n const error = (...args) => {};\n //#endregion\n //#region packages/editor/src/utils/dep/worker.ts\n onmessage = (e) => {\n const watcher = new Watcher({ initialTargets: {} });\n const { dsl } = e.data;\n try {\n const mApp = eval(`(${dsl})`);\n if (!mApp) postMessage({});\n watcher.clearTargets();\n if (mApp.codeBlocks) for (const [id, code] of Object.entries(mApp.codeBlocks)) watcher.addTarget(createCodeBlockTarget(id, code));\n if (mApp.dataSources) for (const ds of mApp.dataSources) {\n watcher.addTarget(createDataSourceTarget(ds, {}));\n watcher.addTarget(createDataSourceMethodTarget(ds, {}));\n watcher.addTarget(createDataSourceCondTarget(ds, {}));\n }\n watcher.collectByCallback(mApp.items, void 0, ({ node, target }) => {\n watcher.collectItem(node, target, { pageId: node.id }, true);\n });\n const data = {\n [DepTargetType.DATA_SOURCE]: {},\n [DepTargetType.DATA_SOURCE_METHOD]: {},\n [DepTargetType.DATA_SOURCE_COND]: {},\n [DepTargetType.CODE_BLOCK]: {}\n };\n traverseTarget(watcher.getTargetsList(), (target) => {\n data[target.type][target.id] = target.deps;\n });\n postMessage(data);\n } catch (e) {\n postMessage({});\n }\n };\n //#endregion\n})();\n";
3
+ var blob = typeof self !== "undefined" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", jsContent], { type: "text/javascript;charset=utf-8" });
4
+ function WorkerWrapper(options) {
5
+ let objURL;
6
+ try {
7
+ objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob);
8
+ if (!objURL) throw "";
9
+ const worker = new Worker(objURL, { name: options?.name });
10
+ worker.addEventListener("error", () => {
11
+ (self.URL || self.webkitURL).revokeObjectURL(objURL);
12
+ });
13
+ return worker;
14
+ } catch (e) {
15
+ return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(jsContent), { name: options?.name });
16
+ }
17
+ }
18
+ //#endregion
19
+ export { WorkerWrapper as default };