@tmagic/editor 1.3.5 → 1.3.7

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 (142) hide show
  1. package/LICENSE +5432 -0
  2. package/dist/style.css +88 -62
  3. package/dist/tmagic-editor.js +2448 -2016
  4. package/dist/tmagic-editor.js.map +1 -1
  5. package/dist/tmagic-editor.umd.cjs +2453 -2019
  6. package/dist/tmagic-editor.umd.cjs.map +1 -1
  7. package/package.json +23 -23
  8. package/src/Editor.vue +15 -7
  9. package/src/components/CodeBlockEditor.vue +2 -2
  10. package/src/components/ContentMenu.vue +5 -5
  11. package/src/components/FloatingBox.vue +117 -0
  12. package/src/components/ScrollBar.vue +2 -2
  13. package/src/components/ScrollViewer.vue +2 -2
  14. package/src/components/SplitView.vue +2 -2
  15. package/src/components/Tree.vue +5 -0
  16. package/src/components/TreeNode.vue +10 -4
  17. package/src/editorProps.ts +20 -3
  18. package/src/fields/PageFragmentSelect.vue +55 -0
  19. package/src/hooks/use-filter.ts +55 -0
  20. package/src/hooks/use-getso.ts +2 -2
  21. package/src/hooks/use-node-status.ts +48 -0
  22. package/src/hooks/use-stage.ts +19 -1
  23. package/src/index.ts +3 -0
  24. package/src/initService.ts +43 -17
  25. package/src/layouts/AddPageBox.vue +16 -4
  26. package/src/layouts/CodeEditor.vue +2 -2
  27. package/src/layouts/Framework.vue +17 -3
  28. package/src/layouts/PropsPanel.vue +2 -2
  29. package/src/layouts/page-bar/AddButton.vue +48 -0
  30. package/src/layouts/page-bar/PageBar.vue +158 -0
  31. package/src/layouts/{workspace → page-bar}/PageBarScrollContainer.vue +61 -35
  32. package/src/layouts/page-bar/SwitchTypeButton.vue +45 -0
  33. package/src/layouts/sidebar/Sidebar.vue +9 -2
  34. package/src/layouts/sidebar/code-block/CodeBlockList.vue +55 -65
  35. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +2 -1
  36. package/src/layouts/sidebar/data-source/DataSourceList.vue +63 -59
  37. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +1 -1
  38. package/src/layouts/sidebar/layer/LayerMenu.vue +39 -27
  39. package/src/layouts/sidebar/layer/LayerPanel.vue +31 -8
  40. package/src/layouts/sidebar/layer/use-click.ts +5 -3
  41. package/src/layouts/sidebar/layer/use-keybinding.ts +8 -8
  42. package/src/layouts/sidebar/layer/use-node-status.ts +10 -13
  43. package/src/layouts/workspace/Workspace.vue +6 -7
  44. package/src/layouts/workspace/viewer/NodeListMenu.vue +68 -129
  45. package/src/layouts/workspace/viewer/Stage.vue +14 -6
  46. package/src/layouts/workspace/viewer/ViewerMenu.vue +94 -86
  47. package/src/services/BaseService.ts +63 -26
  48. package/src/services/codeBlock.ts +7 -1
  49. package/src/services/dep.ts +12 -8
  50. package/src/services/editor.ts +131 -64
  51. package/src/services/history.ts +6 -2
  52. package/src/services/keybinding.ts +48 -13
  53. package/src/services/props.ts +70 -12
  54. package/src/services/storage.ts +23 -13
  55. package/src/services/ui.ts +4 -1
  56. package/src/theme/code-block.scss +0 -16
  57. package/src/theme/floating-box.scss +30 -0
  58. package/src/theme/layer-panel.scss +19 -0
  59. package/src/theme/page-bar.scss +18 -1
  60. package/src/theme/stage.scss +24 -0
  61. package/src/theme/theme.scss +1 -1
  62. package/src/theme/tree.scss +12 -1
  63. package/src/type.ts +28 -10
  64. package/src/utils/compose.ts +25 -6
  65. package/src/utils/content-menu.ts +6 -7
  66. package/src/utils/editor.ts +34 -18
  67. package/src/utils/operator.ts +5 -6
  68. package/types/components/CodeBlockEditor.vue.d.ts +6 -2
  69. package/types/components/CodeParams.vue.d.ts +3 -1
  70. package/types/components/ContentMenu.vue.d.ts +13 -5
  71. package/types/components/FloatingBox.vue.d.ts +78 -0
  72. package/types/components/Resizer.vue.d.ts +6 -1
  73. package/types/components/ScrollBar.vue.d.ts +3 -1
  74. package/types/components/ScrollViewer.vue.d.ts +3 -3
  75. package/types/components/SearchInput.vue.d.ts +3 -1
  76. package/types/components/SplitView.vue.d.ts +8 -4
  77. package/types/components/ToolButton.vue.d.ts +3 -3
  78. package/types/components/Tree.vue.d.ts +27 -8
  79. package/types/components/TreeNode.vue.d.ts +24 -7
  80. package/types/editorProps.d.ts +16 -1
  81. package/types/fields/Code.vue.d.ts +6 -2
  82. package/types/fields/CodeLink.vue.d.ts +5 -3
  83. package/types/fields/CodeSelect.vue.d.ts +3 -1
  84. package/types/fields/CodeSelectCol.vue.d.ts +3 -1
  85. package/types/fields/DataSourceFieldSelect.vue.d.ts +3 -1
  86. package/types/fields/DataSourceFields.vue.d.ts +5 -3
  87. package/types/fields/DataSourceInput.vue.d.ts +8 -4
  88. package/types/fields/DataSourceMethodSelect.vue.d.ts +3 -1
  89. package/types/fields/DataSourceMethods.vue.d.ts +5 -3
  90. package/types/fields/DataSourceMocks.vue.d.ts +5 -3
  91. package/types/fields/DataSourceSelect.vue.d.ts +5 -3
  92. package/types/fields/EventSelect.vue.d.ts +3 -1
  93. package/types/fields/KeyValue.vue.d.ts +2 -2
  94. package/types/fields/PageFragmentSelect.vue.d.ts +31 -0
  95. package/types/fields/UISelect.vue.d.ts +3 -1
  96. package/types/hooks/use-code-block-edit.d.ts +14 -5
  97. package/types/hooks/use-data-source-method.d.ts +14 -5
  98. package/types/hooks/use-filter.d.ts +7 -0
  99. package/types/hooks/use-node-status.d.ts +6 -0
  100. package/types/index.d.ts +1 -0
  101. package/types/layouts/AddPageBox.vue.d.ts +14 -1
  102. package/types/layouts/CodeEditor.vue.d.ts +4 -1
  103. package/types/layouts/Framework.vue.d.ts +14 -1
  104. package/types/layouts/PropsPanel.vue.d.ts +19 -13
  105. package/types/layouts/{workspace/viewer/NodeListMenuTitle.vue.d.ts → page-bar/AddButton.vue.d.ts} +3 -2
  106. package/types/layouts/page-bar/PageBar.vue.d.ts +28 -0
  107. package/types/layouts/page-bar/PageBarScrollContainer.vue.d.ts +24 -0
  108. package/types/layouts/page-bar/SwitchTypeButton.vue.d.ts +20 -0
  109. package/types/layouts/sidebar/ComponentListPanel.vue.d.ts +1 -1
  110. package/types/layouts/sidebar/Sidebar.vue.d.ts +7 -5
  111. package/types/layouts/sidebar/code-block/CodeBlockList.vue.d.ts +9 -3
  112. package/types/layouts/sidebar/code-block/CodeBlockListPanel.vue.d.ts +1 -1
  113. package/types/layouts/sidebar/data-source/DataSourceConfigPanel.vue.d.ts +3 -1
  114. package/types/layouts/sidebar/data-source/DataSourceList.vue.d.ts +8 -2
  115. package/types/layouts/sidebar/data-source/DataSourceListPanel.vue.d.ts +1 -1
  116. package/types/layouts/sidebar/layer/LayerMenu.vue.d.ts +26 -3
  117. package/types/layouts/sidebar/layer/LayerPanel.vue.d.ts +3 -1
  118. package/types/layouts/sidebar/layer/use-click.d.ts +37 -6
  119. package/types/layouts/sidebar/layer/use-keybinding.d.ts +1 -1
  120. package/types/layouts/sidebar/layer/use-node-status.d.ts +3 -4
  121. package/types/layouts/workspace/Workspace.vue.d.ts +3 -1
  122. package/types/layouts/workspace/viewer/NodeListMenu.vue.d.ts +1 -14
  123. package/types/layouts/workspace/viewer/Stage.vue.d.ts +2 -0
  124. package/types/layouts/workspace/viewer/ViewerMenu.vue.d.ts +9 -1
  125. package/types/services/BaseService.d.ts +4 -1
  126. package/types/services/dataSource.d.ts +1 -0
  127. package/types/services/dep.d.ts +6 -5
  128. package/types/services/editor.d.ts +12 -5
  129. package/types/services/history.d.ts +3 -2
  130. package/types/services/keybinding.d.ts +21 -1
  131. package/types/services/props.d.ts +25 -1
  132. package/types/services/storage.d.ts +7 -7
  133. package/types/type.d.ts +32 -17
  134. package/types/utils/compose.d.ts +1 -1
  135. package/types/utils/editor.d.ts +14 -8
  136. package/src/layouts/sidebar/layer/use-filter.ts +0 -59
  137. package/src/layouts/workspace/PageBar.vue +0 -87
  138. package/src/layouts/workspace/viewer/NodeListMenuTitle.vue +0 -68
  139. package/src/theme/dep-list.scss +0 -59
  140. package/types/layouts/sidebar/layer/use-filter.d.ts +0 -7
  141. package/types/layouts/workspace/PageBar.vue.d.ts +0 -15
  142. package/types/layouts/workspace/PageBarScrollContainer.vue.d.ts +0 -9
@@ -7,111 +7,121 @@ import { computed, inject, markRaw, ref, watch } from 'vue';
7
7
  import { Bottom, Top } from '@element-plus/icons-vue';
8
8
 
9
9
  import { NodeType } from '@tmagic/schema';
10
- import { isPage } from '@tmagic/utils';
10
+ import { isPage, isPageFragment } from '@tmagic/utils';
11
11
 
12
12
  import ContentMenu from '@editor/components/ContentMenu.vue';
13
13
  import CenterIcon from '@editor/icons/CenterIcon.vue';
14
- import storageService from '@editor/services/storage';
15
14
  import { LayerOffset, Layout, MenuButton, MenuComponent, Services } from '@editor/type';
16
15
  import { useCopyMenu, useDeleteMenu, useMoveToMenu, usePasteMenu } from '@editor/utils/content-menu';
17
- import { COPY_STORAGE_KEY } from '@editor/utils/editor';
18
16
 
19
17
  defineOptions({
20
18
  name: 'MEditorViewerMenu',
21
19
  });
22
20
 
23
21
  const props = withDefaults(
24
- defineProps<{ isMultiSelect?: boolean; stageContentMenu: (MenuButton | MenuComponent)[] }>(),
25
- { isMultiSelect: false },
22
+ defineProps<{
23
+ isMultiSelect?: boolean;
24
+ stageContentMenu: (MenuButton | MenuComponent)[];
25
+ customContentMenu?: (menus: (MenuButton | MenuComponent)[], type: string) => (MenuButton | MenuComponent)[];
26
+ }>(),
27
+ {
28
+ isMultiSelect: false,
29
+ stageContentMenu: () => [],
30
+ customContentMenu: (menus: (MenuButton | MenuComponent)[]) => menus,
31
+ },
26
32
  );
27
33
 
28
34
  const services = inject<Services>('services');
29
35
  const editorService = services?.editorService;
30
36
  const menu = ref<InstanceType<typeof ContentMenu>>();
31
- const canPaste = ref(false);
32
37
  const canCenter = ref(false);
33
38
 
34
39
  const node = computed(() => editorService?.get('node'));
35
40
  const nodes = computed(() => editorService?.get('nodes'));
36
41
  const parent = computed(() => editorService?.get('parent'));
37
42
 
38
- const menuData = computed<(MenuButton | MenuComponent)[]>(() => [
39
- {
40
- type: 'button',
41
- text: '水平居中',
42
- icon: markRaw(CenterIcon),
43
- display: () => canCenter.value,
44
- handler: () => {
45
- if (!nodes.value) return;
46
- editorService?.alignCenter(nodes.value);
47
- },
48
- },
49
- useCopyMenu(),
50
- usePasteMenu(menu),
51
- {
52
- type: 'divider',
53
- direction: 'horizontal',
54
- display: () => {
55
- if (!node.value) return false;
56
- return !isPage(node.value);
57
- },
58
- },
59
- {
60
- type: 'button',
61
- text: '上移一层',
62
- icon: markRaw(Top),
63
- display: () => !isPage(node.value) && !props.isMultiSelect,
64
- handler: () => {
65
- editorService?.moveLayer(1);
66
- },
67
- },
68
- {
69
- type: 'button',
70
- text: '下移一层',
71
- icon: markRaw(Bottom),
72
- display: () => !isPage(node.value) && !props.isMultiSelect,
73
- handler: () => {
74
- editorService?.moveLayer(-1);
75
- },
76
- },
77
- {
78
- type: 'button',
79
- text: '置顶',
80
- icon: markRaw(Top),
81
- display: () => !isPage(node.value) && !props.isMultiSelect,
82
- handler: () => {
83
- editorService?.moveLayer(LayerOffset.TOP);
84
- },
85
- },
86
- {
87
- type: 'button',
88
- text: '置底',
89
- icon: markRaw(Bottom),
90
- display: () => !isPage(node.value) && !props.isMultiSelect,
91
- handler: () => {
92
- editorService?.moveLayer(LayerOffset.BOTTOM);
93
- },
94
- },
95
- useMoveToMenu(services),
96
- {
97
- type: 'divider',
98
- direction: 'horizontal',
99
- display: () => !isPage(node.value) && !props.isMultiSelect,
100
- },
101
- useDeleteMenu(),
102
- {
103
- type: 'divider',
104
- direction: 'horizontal',
105
- },
106
- {
107
- type: 'button',
108
- text: '清空参考线',
109
- handler: () => {
110
- editorService?.get('stage')?.clearGuides();
111
- },
112
- },
113
- ...props.stageContentMenu,
114
- ]);
43
+ const menuData = computed<(MenuButton | MenuComponent)[]>(() =>
44
+ props.customContentMenu(
45
+ [
46
+ {
47
+ type: 'button',
48
+ text: '水平居中',
49
+ icon: markRaw(CenterIcon),
50
+ display: () => canCenter.value,
51
+ handler: () => {
52
+ if (!nodes.value) return;
53
+ editorService?.alignCenter(nodes.value);
54
+ },
55
+ },
56
+ useCopyMenu(),
57
+ usePasteMenu(menu),
58
+ {
59
+ type: 'divider',
60
+ direction: 'horizontal',
61
+ display: () => {
62
+ if (!node.value) return false;
63
+ return !isPage(node.value) && !isPageFragment(node.value);
64
+ },
65
+ },
66
+ {
67
+ type: 'button',
68
+ text: '上移一层',
69
+ icon: markRaw(Top),
70
+ display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
71
+ handler: () => {
72
+ editorService?.moveLayer(1);
73
+ },
74
+ },
75
+ {
76
+ type: 'button',
77
+ text: '下移一层',
78
+ icon: markRaw(Bottom),
79
+ display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
80
+ handler: () => {
81
+ editorService?.moveLayer(-1);
82
+ },
83
+ },
84
+ {
85
+ type: 'button',
86
+ text: '置顶',
87
+ icon: markRaw(Top),
88
+ display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
89
+ handler: () => {
90
+ editorService?.moveLayer(LayerOffset.TOP);
91
+ },
92
+ },
93
+ {
94
+ type: 'button',
95
+ text: '置底',
96
+ icon: markRaw(Bottom),
97
+ display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
98
+ handler: () => {
99
+ editorService?.moveLayer(LayerOffset.BOTTOM);
100
+ },
101
+ },
102
+ useMoveToMenu(services),
103
+ {
104
+ type: 'divider',
105
+ direction: 'horizontal',
106
+ display: () => !isPage(node.value) && !isPageFragment(node.value) && !props.isMultiSelect,
107
+ },
108
+ useDeleteMenu(),
109
+ {
110
+ type: 'divider',
111
+ direction: 'horizontal',
112
+ },
113
+ {
114
+ type: 'button',
115
+ text: '清空参考线',
116
+ handler: () => {
117
+ editorService?.get('stage')?.clearGuides();
118
+ },
119
+ },
120
+ ...props.stageContentMenu,
121
+ ],
122
+ 'viewer',
123
+ ),
124
+ );
115
125
 
116
126
  watch(
117
127
  parent,
@@ -127,10 +137,8 @@ watch(
127
137
  { immediate: true },
128
138
  );
129
139
 
130
- const show = async (e: MouseEvent) => {
140
+ const show = (e: MouseEvent) => {
131
141
  menu.value?.show(e);
132
- const data = await storageService.getItem(COPY_STORAGE_KEY);
133
- canPaste.value = data !== 'undefined' && !!data;
134
142
  };
135
143
 
136
144
  defineExpose({ show });
@@ -24,13 +24,48 @@ const methodName = (prefix: string, name: string) => `${prefix}${name[0].toUpper
24
24
 
25
25
  const isError = (error: any): boolean => Object.prototype.toString.call(error) === '[object Error]';
26
26
 
27
- const doAction = async (
27
+ const doAction = (
28
28
  args: any[],
29
29
  scope: any,
30
30
  sourceMethod: any,
31
31
  beforeMethodName: string,
32
32
  afterMethodName: string,
33
- fn: (args: any[], next?: Function | undefined) => Promise<void>,
33
+ fn: (args: any[], next?: Function | undefined) => void,
34
+ ) => {
35
+ try {
36
+ let beforeArgs = args;
37
+
38
+ for (const beforeMethod of scope.pluginOptionsList[beforeMethodName]) {
39
+ beforeArgs = beforeMethod(...beforeArgs) || [];
40
+
41
+ if (isError(beforeArgs)) throw beforeArgs;
42
+
43
+ if (!Array.isArray(beforeArgs)) {
44
+ beforeArgs = [beforeArgs];
45
+ }
46
+ }
47
+
48
+ let returnValue: any = fn(beforeArgs, sourceMethod.bind(scope));
49
+
50
+ for (const afterMethod of scope.pluginOptionsList[afterMethodName]) {
51
+ returnValue = afterMethod(returnValue, ...beforeArgs);
52
+
53
+ if (isError(returnValue)) throw returnValue;
54
+ }
55
+
56
+ return returnValue;
57
+ } catch (error) {
58
+ throw error;
59
+ }
60
+ };
61
+
62
+ const doAsyncAction = async (
63
+ args: any[],
64
+ scope: any,
65
+ sourceMethod: any,
66
+ beforeMethodName: string,
67
+ afterMethodName: string,
68
+ fn: (args: any[], next?: Function | undefined) => Promise<void> | void,
34
69
  ) => {
35
70
  try {
36
71
  let beforeArgs = args;
@@ -112,10 +147,10 @@ export default class extends EventEmitter {
112
147
  private taskList: (() => Promise<void>)[] = [];
113
148
  private doingTask = false;
114
149
 
115
- constructor(methods: string[] = [], serialMethods: string[] = []) {
150
+ constructor(methods: { name: string; isAsync: boolean }[] = [], serialMethods: string[] = []) {
116
151
  super();
117
152
 
118
- methods.forEach((propertyName: string) => {
153
+ methods.forEach(({ name: propertyName, isAsync }) => {
119
154
  const scope = this as any;
120
155
 
121
156
  const sourceMethod = scope[propertyName];
@@ -127,32 +162,34 @@ export default class extends EventEmitter {
127
162
  this.pluginOptionsList[afterMethodName] = [];
128
163
  this.middleware[propertyName] = [];
129
164
 
130
- const fn = compose(this.middleware[propertyName]);
165
+ const fn = compose(this.middleware[propertyName], isAsync);
131
166
  Object.defineProperty(scope, propertyName, {
132
- value: async (...args: any[]) => {
133
- if (!serialMethods.includes(propertyName)) {
134
- return doAction(args, scope, sourceMethod, beforeMethodName, afterMethodName, fn);
135
- }
136
-
137
- // 由于async await,所以会出现函数执行到await时让出线程,导致执行顺序出错,例如调用了select(1) -> update -> select(2),这个时候就有可能出现update了2;
138
- // 这里保证函数调用严格按顺序执行;
139
- const promise = new Promise<any>((resolve, reject) => {
140
- this.taskList.push(async () => {
141
- try {
142
- const value = await doAction(args, scope, sourceMethod, beforeMethodName, afterMethodName, fn);
143
- resolve(value);
144
- } catch (e) {
145
- reject(e);
167
+ value: isAsync
168
+ ? async (...args: any[]) => {
169
+ if (!serialMethods.includes(propertyName)) {
170
+ return doAsyncAction(args, scope, sourceMethod, beforeMethodName, afterMethodName, fn);
146
171
  }
147
- });
148
- });
149
172
 
150
- if (!this.doingTask) {
151
- this.doTask();
152
- }
173
+ // 由于async await,所以会出现函数执行到await时让出线程,导致执行顺序出错,例如调用了select(1) -> update -> select(2),这个时候就有可能出现update了2;
174
+ // 这里保证函数调用严格按顺序执行;
175
+ const promise = new Promise<any>((resolve, reject) => {
176
+ this.taskList.push(async () => {
177
+ try {
178
+ const value = await doAsyncAction(args, scope, sourceMethod, beforeMethodName, afterMethodName, fn);
179
+ resolve(value);
180
+ } catch (e) {
181
+ reject(e);
182
+ }
183
+ });
184
+ });
185
+
186
+ if (!this.doingTask) {
187
+ this.doTask();
188
+ }
153
189
 
154
- return promise;
155
- },
190
+ return promise;
191
+ }
192
+ : (...args: any[]) => doAction(args, scope, sourceMethod, beforeMethodName, afterMethodName, fn),
156
193
  });
157
194
  });
158
195
  }
@@ -38,7 +38,13 @@ class CodeBlock extends BaseService {
38
38
  });
39
39
 
40
40
  constructor() {
41
- super(['setCodeDslById', 'setEditStatus', 'setCombineIds', 'setUndeleteableList', 'deleteCodeDslByIds']);
41
+ super([
42
+ { name: 'setCodeDslById', isAsync: true },
43
+ { name: 'setEditStatus', isAsync: true },
44
+ { name: 'setCombineIds', isAsync: true },
45
+ { name: 'setUndeleteableList', isAsync: true },
46
+ { name: 'deleteCodeDslByIds', isAsync: true },
47
+ ]);
42
48
  }
43
49
 
44
50
  /**
@@ -35,8 +35,8 @@ class Dep extends BaseService {
35
35
  return this.watcher.getTargets(type);
36
36
  }
37
37
 
38
- public getTarget(id: Id) {
39
- return this.watcher.getTarget(id);
38
+ public getTarget(id: Id, type: string = DepTargetType.DEFAULT) {
39
+ return this.watcher.getTarget(id, type);
40
40
  }
41
41
 
42
42
  public addTarget(target: Target) {
@@ -44,8 +44,8 @@ class Dep extends BaseService {
44
44
  this.emit('add-target', target);
45
45
  }
46
46
 
47
- public removeTarget(id: Id) {
48
- this.watcher.removeTarget(id);
47
+ public removeTarget(id: Id, type: string = DepTargetType.DEFAULT) {
48
+ this.watcher.removeTarget(id, type);
49
49
  this.emit('remove-target');
50
50
  }
51
51
 
@@ -53,8 +53,8 @@ class Dep extends BaseService {
53
53
  this.watcher.clearTargets();
54
54
  }
55
55
 
56
- public collect(nodes: MNode[], deep = false) {
57
- this.watcher.collect(nodes, deep);
56
+ public collect(nodes: MNode[], deep = false, type?: DepTargetType) {
57
+ this.watcher.collect(nodes, deep, type);
58
58
  this.emit('collected', nodes, deep);
59
59
  }
60
60
 
@@ -62,8 +62,12 @@ class Dep extends BaseService {
62
62
  return this.watcher.clear(nodes);
63
63
  }
64
64
 
65
- public hasTarget(id: Id) {
66
- return this.watcher.hasTarget(id);
65
+ public hasTarget(id: Id, type: string = DepTargetType.DEFAULT) {
66
+ return this.watcher.hasTarget(id, type);
67
+ }
68
+
69
+ public hasSpecifiedTypeTarget(type: string = DepTargetType.DEFAULT): boolean {
70
+ return this.watcher.hasSpecifiedTypeTarget(type);
67
71
  }
68
72
  }
69
73