@flowgram-vue/command 0.2.0

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.
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
4
+ Copyright (c) 2026 Crayon
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,278 @@
1
+ 'use strict';
2
+
3
+ var inversify = require('inversify');
4
+ var utils = require('@flowgram-vue/utils');
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
+ var __decorateClass = (decorators, target, key, kind) => {
9
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
10
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
11
+ if (decorator = decorators[i])
12
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
13
+ if (kind && result) __defProp(target, key, result);
14
+ return result;
15
+ };
16
+ exports.Command = void 0;
17
+ ((Command2) => {
18
+ ((Default2) => {
19
+ Default2["ZOOM_IN"] = "ZOOM_IN";
20
+ Default2["ZOOM_OUT"] = "ZOOM_OUT";
21
+ Default2["DELETE"] = "DELETE";
22
+ Default2["COPY"] = "COPY";
23
+ Default2["PASTE"] = "PASTE";
24
+ Default2["UNDO"] = "UNDO";
25
+ Default2["REDO"] = "REDO";
26
+ Default2["VIEW_CLOSE_ALL_WIDGET"] = "view.closeAllWidget";
27
+ Default2["VIEW_CLOSE_CURRENT_WIDGET"] = "view.closeCurrentWidget";
28
+ Default2["VIEW_REOPEN_LAST_WIDGET"] = "view.reopenLastWidget";
29
+ Default2["VIEW_CLOSE_OTHER_WIDGET"] = "view.closeOtherWidget";
30
+ Default2["VIEW_CLOSE_BOTTOM_PANEL"] = "view.closeBottomPannel";
31
+ Default2["VIEW_OPEN_NEXT_TAB"] = "view.openNextTab";
32
+ Default2["VIEW_OEPN_LAST_TAB"] = "view.openLastTab";
33
+ Default2["VIEW_FULL_SCREEN"] = "view.fullScreen";
34
+ Default2["VIEW_SAVING_WIDGET_CLOSE_CONFIRM"] = "view.savingWidgetCloseConfirm";
35
+ Default2["VIEW_SHORTCUTS"] = "view.shortcuts";
36
+ Default2["VIEW_PREFERENCES"] = "view.preferences";
37
+ Default2["VIEW_LOG"] = "view.log";
38
+ Default2["VIEW_PROBLEMS"] = "view.problems";
39
+ })(Command2.Default || (Command2.Default = {}));
40
+ function is(arg) {
41
+ return !!arg && arg === Object(arg) && "id" in arg;
42
+ }
43
+ Command2.is = is;
44
+ })(exports.Command || (exports.Command = {}));
45
+ var CommandContribution = /* @__PURE__ */ Symbol("CommandContribution");
46
+ var CommandExecuting;
47
+ ((CommandExecuting2) => {
48
+ function findSimple(arrs, newCmd) {
49
+ for (const item of arrs.values()) {
50
+ if (item.id === newCmd.id && item.args.length === newCmd.args.length && item.args.every((arg, index) => newCmd[index] === arg)) {
51
+ return item;
52
+ }
53
+ }
54
+ }
55
+ CommandExecuting2.findSimple = findSimple;
56
+ })(CommandExecuting || (CommandExecuting = {}));
57
+ var CommandRegistryFactory = "CommandRegistryFactory";
58
+ exports.CommandRegistry = class CommandRegistry {
59
+ constructor() {
60
+ this._handlers = {};
61
+ this._commands = {};
62
+ this._commandExecutings = /* @__PURE__ */ new Set();
63
+ this.toUnregisterCommands = /* @__PURE__ */ new Map();
64
+ this.onDidExecuteCommandEmitter = new utils.Emitter();
65
+ this.onDidExecuteCommand = this.onDidExecuteCommandEmitter.event;
66
+ this.onWillExecuteCommandEmitter = new utils.Emitter();
67
+ this.onWillExecuteCommand = this.onWillExecuteCommandEmitter.event;
68
+ }
69
+ init() {
70
+ for (const contrib of this.contributions) {
71
+ contrib.registerCommands(this);
72
+ }
73
+ }
74
+ /**
75
+ * 当前所有 command
76
+ */
77
+ get commands() {
78
+ const commands = [];
79
+ for (const id of this.commandIds) {
80
+ const cmd = this.getCommand(id);
81
+ if (cmd) {
82
+ commands.push(cmd);
83
+ }
84
+ }
85
+ return commands;
86
+ }
87
+ /**
88
+ * 当前所有 commandid
89
+ */
90
+ get commandIds() {
91
+ return Object.keys(this._commands);
92
+ }
93
+ registerCommand(commandOrId, handler) {
94
+ const command = typeof commandOrId === "string" ? { id: commandOrId } : commandOrId;
95
+ if (this._commands[command.id]) {
96
+ console.warn(`A command ${command.id} is already registered.`);
97
+ return utils.Disposable.NULL;
98
+ }
99
+ const toDispose = new utils.DisposableCollection(this.doRegisterCommand(command));
100
+ if (handler) {
101
+ toDispose.push(this.registerHandler(command.id, handler));
102
+ }
103
+ this.toUnregisterCommands.set(command.id, toDispose);
104
+ toDispose.push(utils.Disposable.create(() => this.toUnregisterCommands.delete(command.id)));
105
+ return toDispose;
106
+ }
107
+ unregisterCommand(commandOrId) {
108
+ const id = exports.Command.is(commandOrId) ? commandOrId.id : commandOrId;
109
+ const toUnregister = this.toUnregisterCommands.get(id);
110
+ if (toUnregister) {
111
+ toUnregister.dispose();
112
+ }
113
+ }
114
+ /**
115
+ * 注册 handler
116
+ */
117
+ registerHandler(commandId, handler) {
118
+ let handlers = this._handlers[commandId];
119
+ if (!handlers) {
120
+ this._handlers[commandId] = handlers = [];
121
+ }
122
+ handlers.unshift(handler);
123
+ return {
124
+ dispose: () => {
125
+ const idx = handlers.indexOf(handler);
126
+ if (idx >= 0) {
127
+ handlers.splice(idx, 1);
128
+ }
129
+ }
130
+ };
131
+ }
132
+ /**
133
+ * 预留 contextMenu 用,该 handler 是否可见
134
+ */
135
+ isVisible(command, ...args) {
136
+ return typeof this.getVisibleHandler(command, ...args) !== "undefined";
137
+ }
138
+ /**
139
+ * command 是否可用
140
+ */
141
+ isEnabled(command, ...args) {
142
+ return typeof this.getActiveHandler(command, ...args) !== "undefined";
143
+ }
144
+ /**
145
+ * 预留 contextMenu 用,该 handler 是否可以触发
146
+ */
147
+ isToggled(command, ...args) {
148
+ return typeof this.getToggledHandler(command, ...args) !== "undefined";
149
+ }
150
+ /**
151
+ * 执行 command,会先判断是否可以执行,不会重复执行
152
+ */
153
+ async executeCommand(commandId, ...args) {
154
+ const handler = this.getActiveHandler(commandId, ...args);
155
+ const execInfo = { id: commandId, args };
156
+ const simpleExecInfo = CommandExecuting.findSimple(this._commandExecutings, execInfo);
157
+ if (simpleExecInfo) {
158
+ return execInfo.promise;
159
+ }
160
+ if (handler) {
161
+ try {
162
+ this._commandExecutings.add(execInfo);
163
+ this.onWillExecuteCommandEmitter.fire({ commandId, args });
164
+ const promise = handler.execute(...args);
165
+ execInfo.promise = promise;
166
+ const result = await promise;
167
+ this.onDidExecuteCommandEmitter.fire({ commandId, args });
168
+ return result;
169
+ } finally {
170
+ this._commandExecutings.delete(execInfo);
171
+ }
172
+ }
173
+ }
174
+ getVisibleHandler(commandId, ...args) {
175
+ const handlers = this._handlers[commandId];
176
+ if (handlers) {
177
+ for (const handler of handlers) {
178
+ try {
179
+ if (!handler.isVisible || handler.isVisible(...args)) {
180
+ return handler;
181
+ }
182
+ } catch (error) {
183
+ console.error(error);
184
+ }
185
+ }
186
+ }
187
+ return void 0;
188
+ }
189
+ getActiveHandler(commandId, ...args) {
190
+ const handlers = this._handlers[commandId];
191
+ if (handlers) {
192
+ for (const handler of handlers) {
193
+ try {
194
+ if (!handler.isEnabled || handler.isEnabled(...args)) {
195
+ return handler;
196
+ }
197
+ } catch (error) {
198
+ console.error(error);
199
+ }
200
+ }
201
+ }
202
+ return void 0;
203
+ }
204
+ /**
205
+ * 获取 command 对应的所有 handler
206
+ */
207
+ getAllHandlers(commandId) {
208
+ const handlers = this._handlers[commandId];
209
+ return handlers ? handlers.slice() : [];
210
+ }
211
+ getToggledHandler(commandId, ...args) {
212
+ const handlers = this._handlers[commandId];
213
+ if (handlers) {
214
+ for (const handler of handlers) {
215
+ try {
216
+ if (handler.isToggled && handler.isToggled(...args)) {
217
+ return handler;
218
+ }
219
+ } catch (error) {
220
+ console.error(error);
221
+ }
222
+ }
223
+ }
224
+ return void 0;
225
+ }
226
+ /**
227
+ * 获取 command
228
+ */
229
+ getCommand(id) {
230
+ return this._commands[id];
231
+ }
232
+ doRegisterCommand(command) {
233
+ this._commands[command.id] = command;
234
+ return {
235
+ dispose: () => {
236
+ delete this._commands[command.id];
237
+ }
238
+ };
239
+ }
240
+ /**
241
+ * 更新 command
242
+ */
243
+ updateCommand(id, command) {
244
+ if (this._commands[id]) {
245
+ this._commands[id] = {
246
+ ...this._commands[id],
247
+ ...command
248
+ };
249
+ }
250
+ }
251
+ dispose() {
252
+ this.onWillExecuteCommandEmitter.dispose();
253
+ this.onDidExecuteCommandEmitter.dispose();
254
+ }
255
+ };
256
+ __decorateClass([
257
+ inversify.multiInject(CommandContribution),
258
+ inversify.optional()
259
+ ], exports.CommandRegistry.prototype, "contributions", 2);
260
+ exports.CommandRegistry = __decorateClass([
261
+ inversify.injectable()
262
+ ], exports.CommandRegistry);
263
+
264
+ // src/command-service.ts
265
+ var CommandService = /* @__PURE__ */ Symbol("CommandService");
266
+ var CommandContainerModule = new inversify.ContainerModule((bind) => {
267
+ utils.bindContributionProvider(bind, CommandContribution);
268
+ bind(exports.CommandRegistry).toSelf().inSingletonScope();
269
+ bind(CommandService).toService(exports.CommandRegistry);
270
+ bind(CommandRegistryFactory).toFactory((ctx) => () => ctx.container.get(exports.CommandRegistry));
271
+ });
272
+
273
+ exports.CommandContainerModule = CommandContainerModule;
274
+ exports.CommandContribution = CommandContribution;
275
+ exports.CommandRegistryFactory = CommandRegistryFactory;
276
+ exports.CommandService = CommandService;
277
+ //# sourceMappingURL=index.cjs.map
278
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/command.ts","../src/command-service.ts","../src/command-container-module.ts"],"names":["Command","Default","CommandExecuting","CommandRegistry","Emitter","Disposable","DisposableCollection","multiInject","optional","injectable","ContainerModule","bindContributionProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, multiInject, optional } from 'inversify';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram-vue/utils';\n\nimport { type CommandService } from './command-service';\n\nexport interface Command {\n /**\n * id,唯一 key\n */\n id: string;\n /**\n * 展示用 label\n */\n label?: string;\n /**\n * 在一些明确的场景下,部分只展示简短的 label 即可\n */\n shortLabel?: string;\n\n /**\n * 展示用 command icon\n */\n icon?: string | object | ((props: any) => any);\n /**\n * 暂不使用\n */\n category?: string;\n}\nexport namespace Command {\n export enum Default {\n ZOOM_IN = 'ZOOM_IN',\n ZOOM_OUT = 'ZOOM_OUT',\n DELETE = 'DELETE',\n COPY = 'COPY',\n PASTE = 'PASTE',\n UNDO = 'UNDO',\n REDO = 'REDO',\n VIEW_CLOSE_ALL_WIDGET = 'view.closeAllWidget',\n VIEW_CLOSE_CURRENT_WIDGET = 'view.closeCurrentWidget',\n VIEW_REOPEN_LAST_WIDGET = 'view.reopenLastWidget',\n VIEW_CLOSE_OTHER_WIDGET = 'view.closeOtherWidget',\n VIEW_CLOSE_BOTTOM_PANEL = 'view.closeBottomPannel',\n VIEW_OPEN_NEXT_TAB = 'view.openNextTab',\n VIEW_OEPN_LAST_TAB = 'view.openLastTab',\n VIEW_FULL_SCREEN = 'view.fullScreen',\n VIEW_SAVING_WIDGET_CLOSE_CONFIRM = 'view.savingWidgetCloseConfirm',\n VIEW_SHORTCUTS = 'view.shortcuts',\n VIEW_PREFERENCES = 'view.preferences',\n VIEW_LOG = 'view.log',\n VIEW_PROBLEMS = 'view.problems',\n }\n\n /**\n * 判断是否是 command\n */\n export function is(arg: Command | any): arg is Command {\n return !!arg && arg === Object(arg) && 'id' in arg;\n }\n}\n\nexport interface CommandHandler {\n /**\n * handler 执行函数\n */\n execute(...args: any[]): any;\n\n /**\n * 该 handler 是否可以执行\n */\n isEnabled?(...args: any[]): boolean;\n\n /**\n * 预留 contextMenu 用,该 handler 是否可见\n */\n isVisible?(...args: any[]): boolean;\n\n /**\n * 预留 contextMenu 用,该 handler 是否可以触发\n */\n isToggled?(...args: any[]): boolean;\n}\n\nexport interface CommandEvent {\n /**\n * commandId\n */\n commandId: string;\n /**\n * 参数\n */\n args: any[];\n}\nexport const CommandContribution = Symbol('CommandContribution');\n\nexport interface CommandContribution {\n /**\n * 注册 command\n */\n registerCommands(commands: CommandService): void;\n}\n\n/**\n * 当前正在运行的 command\n */\ninterface CommandExecuting {\n /**\n * commandid\n */\n id: string;\n /**\n * 参数\n */\n args: any[];\n /**\n * 正在进行的 promise\n */\n promise?: Promise<any>;\n}\n\nnamespace CommandExecuting {\n /**\n * 获取正在运行的 command 单个实例\n */\n export function findSimple(\n arrs: Set<CommandExecuting>,\n newCmd: CommandExecuting,\n ): CommandExecuting | undefined {\n for (const item of arrs.values()) {\n if (\n item.id === newCmd.id &&\n item.args.length === newCmd.args.length &&\n item.args.every((arg, index) => (newCmd as any)[index] === arg)\n ) {\n return item;\n }\n }\n }\n}\n\nexport const CommandRegistryFactory = 'CommandRegistryFactory';\n\n@injectable()\nexport class CommandRegistry implements CommandService {\n protected readonly _handlers: { [id: string]: CommandHandler[] } = {};\n\n protected readonly _commands: { [id: string]: Command } = {};\n\n protected readonly _commandExecutings = new Set<CommandExecuting>();\n\n protected readonly toUnregisterCommands = new Map<string, Disposable>();\n\n protected readonly onDidExecuteCommandEmitter = new Emitter<CommandEvent>();\n\n readonly onDidExecuteCommand = this.onDidExecuteCommandEmitter.event;\n\n protected readonly onWillExecuteCommandEmitter = new Emitter<CommandEvent>();\n\n readonly onWillExecuteCommand = this.onWillExecuteCommandEmitter.event;\n\n @multiInject(CommandContribution)\n @optional()\n protected readonly contributions: CommandContribution[];\n\n init() {\n for (const contrib of this.contributions) {\n contrib.registerCommands(this);\n }\n }\n\n /**\n * 当前所有 command\n */\n get commands(): Command[] {\n const commands: Command[] = [];\n for (const id of this.commandIds) {\n const cmd = this.getCommand(id);\n if (cmd) {\n commands.push(cmd);\n }\n }\n return commands;\n }\n\n /**\n * 当前所有 commandid\n */\n get commandIds(): string[] {\n return Object.keys(this._commands);\n }\n\n /**\n * registerCommand\n */\n registerCommand(id: string, handler?: CommandHandler): Disposable;\n\n registerCommand(command: Command, handler?: CommandHandler): Disposable;\n\n registerCommand(commandOrId: string | Command, handler?: CommandHandler): Disposable {\n const command: Command = typeof commandOrId === 'string' ? { id: commandOrId } : commandOrId;\n\n if (this._commands[command.id]) {\n console.warn(`A command ${command.id} is already registered.`);\n return Disposable.NULL;\n }\n const toDispose = new DisposableCollection(this.doRegisterCommand(command));\n if (handler) {\n toDispose.push(this.registerHandler(command.id, handler));\n }\n this.toUnregisterCommands.set(command.id, toDispose);\n toDispose.push(Disposable.create(() => this.toUnregisterCommands.delete(command.id)));\n return toDispose;\n }\n\n /**\n * unregisterCommand\n */\n unregisterCommand(command: Command): void;\n\n unregisterCommand(id: string): void;\n\n unregisterCommand(commandOrId: Command | string): void {\n const id = Command.is(commandOrId) ? commandOrId.id : commandOrId;\n const toUnregister = this.toUnregisterCommands.get(id);\n if (toUnregister) {\n toUnregister.dispose();\n }\n }\n\n /**\n * 注册 handler\n */\n registerHandler(commandId: string, handler: CommandHandler): Disposable {\n let handlers = this._handlers[commandId];\n if (!handlers) {\n this._handlers[commandId] = handlers = [];\n }\n handlers.unshift(handler);\n return {\n dispose: () => {\n const idx = handlers.indexOf(handler);\n if (idx >= 0) {\n handlers.splice(idx, 1);\n }\n },\n };\n }\n\n /**\n * 预留 contextMenu 用,该 handler 是否可见\n */\n isVisible(command: string, ...args: any[]): boolean {\n return typeof this.getVisibleHandler(command, ...args) !== 'undefined';\n }\n\n /**\n * command 是否可用\n */\n isEnabled(command: string, ...args: any[]): boolean {\n return typeof this.getActiveHandler(command, ...args) !== 'undefined';\n }\n\n /**\n * 预留 contextMenu 用,该 handler 是否可以触发\n */\n isToggled(command: string, ...args: any[]): boolean {\n return typeof this.getToggledHandler(command, ...args) !== 'undefined';\n }\n\n /**\n * 执行 command,会先判断是否可以执行,不会重复执行\n */\n async executeCommand<T>(commandId: string, ...args: any[]): Promise<T | undefined> {\n const handler = this.getActiveHandler(commandId, ...args);\n const execInfo: CommandExecuting = { id: commandId, args };\n const simpleExecInfo = CommandExecuting.findSimple(this._commandExecutings, execInfo);\n if (simpleExecInfo) {\n return execInfo.promise;\n }\n if (handler) {\n try {\n this._commandExecutings.add(execInfo);\n this.onWillExecuteCommandEmitter.fire({ commandId, args });\n const promise = handler.execute(...args);\n execInfo.promise = promise;\n const result = await promise;\n this.onDidExecuteCommandEmitter.fire({ commandId, args });\n return result;\n } finally {\n this._commandExecutings.delete(execInfo);\n }\n }\n }\n\n getVisibleHandler(commandId: string, ...args: any[]): CommandHandler | undefined {\n const handlers = this._handlers[commandId];\n if (handlers) {\n for (const handler of handlers) {\n try {\n if (!handler.isVisible || handler.isVisible(...args)) {\n return handler;\n }\n } catch (error) {\n console.error(error);\n }\n }\n }\n return undefined;\n }\n\n getActiveHandler(commandId: string, ...args: any[]): CommandHandler | undefined {\n const handlers = this._handlers[commandId];\n if (handlers) {\n for (const handler of handlers) {\n try {\n if (!handler.isEnabled || handler.isEnabled(...args)) {\n return handler;\n }\n } catch (error) {\n console.error(error);\n }\n }\n }\n return undefined;\n }\n\n /**\n * 获取 command 对应的所有 handler\n */\n getAllHandlers(commandId: string): CommandHandler[] {\n const handlers = this._handlers[commandId];\n return handlers ? handlers.slice() : [];\n }\n\n getToggledHandler(commandId: string, ...args: any[]): CommandHandler | undefined {\n const handlers = this._handlers[commandId];\n if (handlers) {\n for (const handler of handlers) {\n try {\n if (handler.isToggled && handler.isToggled(...args)) {\n return handler;\n }\n } catch (error) {\n console.error(error);\n }\n }\n }\n return undefined;\n }\n\n /**\n * 获取 command\n */\n getCommand(id: string): Command | undefined {\n return this._commands[id];\n }\n\n protected doRegisterCommand(command: Command): Disposable {\n this._commands[command.id] = command;\n return {\n dispose: () => {\n delete this._commands[command.id];\n },\n };\n }\n\n /**\n * 更新 command\n */\n public updateCommand(id: string, command: Partial<Omit<Command, 'id'>>) {\n if (this._commands[id]) {\n this._commands[id] = {\n ...this._commands[id],\n ...command,\n };\n }\n }\n\n dispose() {\n this.onWillExecuteCommandEmitter.dispose();\n this.onDidExecuteCommandEmitter.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { type Disposable, type Event } from '@flowgram-vue/utils';\n\nimport { type CommandEvent } from './command';\n\nexport const CommandService = Symbol('CommandService');\n\n/**\n * command service 执行接口\n */\nexport interface CommandService extends Disposable {\n /**\n * command 事件执行前触发事件\n */\n readonly onWillExecuteCommand: Event<CommandEvent>;\n /**\n * command 事件执行完成后触发\n */\n readonly onDidExecuteCommand: Event<CommandEvent>;\n\n /**\n * 执行 command\n */\n executeCommand<T>(command: string, ...args: any[]): Promise<T | undefined>;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\nimport { bindContributionProvider } from '@flowgram-vue/utils';\n\nimport { CommandService } from './command-service';\nimport { CommandRegistry, CommandRegistryFactory, CommandContribution } from './command';\n\nexport const CommandContainerModule = new ContainerModule(bind => {\n bindContributionProvider(bind, CommandContribution);\n bind(CommandRegistry).toSelf().inSingletonScope();\n bind(CommandService).toService(CommandRegistry);\n bind(CommandRegistryFactory).toFactory(ctx => () => ctx.container.get(CommandRegistry));\n});\n"]}
@@ -0,0 +1,217 @@
1
+ import * as _flowgram_vue_utils from '@flowgram-vue/utils';
2
+ import { Disposable, Event, Emitter } from '@flowgram-vue/utils';
3
+ import { ContainerModule } from 'inversify';
4
+
5
+ /**
6
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+
10
+ declare const CommandService: unique symbol;
11
+ /**
12
+ * command service 执行接口
13
+ */
14
+ interface CommandService extends Disposable {
15
+ /**
16
+ * command 事件执行前触发事件
17
+ */
18
+ readonly onWillExecuteCommand: Event<CommandEvent>;
19
+ /**
20
+ * command 事件执行完成后触发
21
+ */
22
+ readonly onDidExecuteCommand: Event<CommandEvent>;
23
+ /**
24
+ * 执行 command
25
+ */
26
+ executeCommand<T>(command: string, ...args: any[]): Promise<T | undefined>;
27
+ }
28
+
29
+ interface Command {
30
+ /**
31
+ * id,唯一 key
32
+ */
33
+ id: string;
34
+ /**
35
+ * 展示用 label
36
+ */
37
+ label?: string;
38
+ /**
39
+ * 在一些明确的场景下,部分只展示简短的 label 即可
40
+ */
41
+ shortLabel?: string;
42
+ /**
43
+ * 展示用 command icon
44
+ */
45
+ icon?: string | object | ((props: any) => any);
46
+ /**
47
+ * 暂不使用
48
+ */
49
+ category?: string;
50
+ }
51
+ declare namespace Command {
52
+ enum Default {
53
+ ZOOM_IN = "ZOOM_IN",
54
+ ZOOM_OUT = "ZOOM_OUT",
55
+ DELETE = "DELETE",
56
+ COPY = "COPY",
57
+ PASTE = "PASTE",
58
+ UNDO = "UNDO",
59
+ REDO = "REDO",
60
+ VIEW_CLOSE_ALL_WIDGET = "view.closeAllWidget",
61
+ VIEW_CLOSE_CURRENT_WIDGET = "view.closeCurrentWidget",
62
+ VIEW_REOPEN_LAST_WIDGET = "view.reopenLastWidget",
63
+ VIEW_CLOSE_OTHER_WIDGET = "view.closeOtherWidget",
64
+ VIEW_CLOSE_BOTTOM_PANEL = "view.closeBottomPannel",
65
+ VIEW_OPEN_NEXT_TAB = "view.openNextTab",
66
+ VIEW_OEPN_LAST_TAB = "view.openLastTab",
67
+ VIEW_FULL_SCREEN = "view.fullScreen",
68
+ VIEW_SAVING_WIDGET_CLOSE_CONFIRM = "view.savingWidgetCloseConfirm",
69
+ VIEW_SHORTCUTS = "view.shortcuts",
70
+ VIEW_PREFERENCES = "view.preferences",
71
+ VIEW_LOG = "view.log",
72
+ VIEW_PROBLEMS = "view.problems"
73
+ }
74
+ /**
75
+ * 判断是否是 command
76
+ */
77
+ function is(arg: Command | any): arg is Command;
78
+ }
79
+ interface CommandHandler {
80
+ /**
81
+ * handler 执行函数
82
+ */
83
+ execute(...args: any[]): any;
84
+ /**
85
+ * 该 handler 是否可以执行
86
+ */
87
+ isEnabled?(...args: any[]): boolean;
88
+ /**
89
+ * 预留 contextMenu 用,该 handler 是否可见
90
+ */
91
+ isVisible?(...args: any[]): boolean;
92
+ /**
93
+ * 预留 contextMenu 用,该 handler 是否可以触发
94
+ */
95
+ isToggled?(...args: any[]): boolean;
96
+ }
97
+ interface CommandEvent {
98
+ /**
99
+ * commandId
100
+ */
101
+ commandId: string;
102
+ /**
103
+ * 参数
104
+ */
105
+ args: any[];
106
+ }
107
+ declare const CommandContribution: unique symbol;
108
+ interface CommandContribution {
109
+ /**
110
+ * 注册 command
111
+ */
112
+ registerCommands(commands: CommandService): void;
113
+ }
114
+ /**
115
+ * 当前正在运行的 command
116
+ */
117
+ interface CommandExecuting {
118
+ /**
119
+ * commandid
120
+ */
121
+ id: string;
122
+ /**
123
+ * 参数
124
+ */
125
+ args: any[];
126
+ /**
127
+ * 正在进行的 promise
128
+ */
129
+ promise?: Promise<any>;
130
+ }
131
+ declare namespace CommandExecuting {
132
+ /**
133
+ * 获取正在运行的 command 单个实例
134
+ */
135
+ function findSimple(arrs: Set<CommandExecuting>, newCmd: CommandExecuting): CommandExecuting | undefined;
136
+ }
137
+ declare const CommandRegistryFactory = "CommandRegistryFactory";
138
+ declare class CommandRegistry implements CommandService {
139
+ protected readonly _handlers: {
140
+ [id: string]: CommandHandler[];
141
+ };
142
+ protected readonly _commands: {
143
+ [id: string]: Command;
144
+ };
145
+ protected readonly _commandExecutings: Set<CommandExecuting>;
146
+ protected readonly toUnregisterCommands: Map<string, Disposable>;
147
+ protected readonly onDidExecuteCommandEmitter: Emitter<CommandEvent>;
148
+ readonly onDidExecuteCommand: _flowgram_vue_utils.Event<CommandEvent>;
149
+ protected readonly onWillExecuteCommandEmitter: Emitter<CommandEvent>;
150
+ readonly onWillExecuteCommand: _flowgram_vue_utils.Event<CommandEvent>;
151
+ protected readonly contributions: CommandContribution[];
152
+ init(): void;
153
+ /**
154
+ * 当前所有 command
155
+ */
156
+ get commands(): Command[];
157
+ /**
158
+ * 当前所有 commandid
159
+ */
160
+ get commandIds(): string[];
161
+ /**
162
+ * registerCommand
163
+ */
164
+ registerCommand(id: string, handler?: CommandHandler): Disposable;
165
+ registerCommand(command: Command, handler?: CommandHandler): Disposable;
166
+ /**
167
+ * unregisterCommand
168
+ */
169
+ unregisterCommand(command: Command): void;
170
+ unregisterCommand(id: string): void;
171
+ /**
172
+ * 注册 handler
173
+ */
174
+ registerHandler(commandId: string, handler: CommandHandler): Disposable;
175
+ /**
176
+ * 预留 contextMenu 用,该 handler 是否可见
177
+ */
178
+ isVisible(command: string, ...args: any[]): boolean;
179
+ /**
180
+ * command 是否可用
181
+ */
182
+ isEnabled(command: string, ...args: any[]): boolean;
183
+ /**
184
+ * 预留 contextMenu 用,该 handler 是否可以触发
185
+ */
186
+ isToggled(command: string, ...args: any[]): boolean;
187
+ /**
188
+ * 执行 command,会先判断是否可以执行,不会重复执行
189
+ */
190
+ executeCommand<T>(commandId: string, ...args: any[]): Promise<T | undefined>;
191
+ getVisibleHandler(commandId: string, ...args: any[]): CommandHandler | undefined;
192
+ getActiveHandler(commandId: string, ...args: any[]): CommandHandler | undefined;
193
+ /**
194
+ * 获取 command 对应的所有 handler
195
+ */
196
+ getAllHandlers(commandId: string): CommandHandler[];
197
+ getToggledHandler(commandId: string, ...args: any[]): CommandHandler | undefined;
198
+ /**
199
+ * 获取 command
200
+ */
201
+ getCommand(id: string): Command | undefined;
202
+ protected doRegisterCommand(command: Command): Disposable;
203
+ /**
204
+ * 更新 command
205
+ */
206
+ updateCommand(id: string, command: Partial<Omit<Command, 'id'>>): void;
207
+ dispose(): void;
208
+ }
209
+
210
+ /**
211
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
212
+ * SPDX-License-Identifier: MIT
213
+ */
214
+
215
+ declare const CommandContainerModule: ContainerModule;
216
+
217
+ export { Command, CommandContainerModule, CommandContribution, type CommandHandler, CommandRegistry, CommandRegistryFactory, CommandService };