@flowgram.ai/command 0.2.16 → 0.2.17

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/command.ts","../../src/command-service.ts","../../src/command-container-module.ts"],"sourcesContent":["import { injectable, multiInject, optional } from 'inversify';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/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 | React.ReactNode | ((props: any) => React.ReactNode);\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","import { type Disposable, type Event } from '@flowgram.ai/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","import { ContainerModule } from 'inversify';\nimport { bindContributionProvider } from '@flowgram.ai/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"],"mappings":"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","names":["Command","Default","CommandExecuting"]}
1
+ {"version":3,"sources":["../../src/command.ts","../../src/command-service.ts","../../src/command-container-module.ts"],"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.ai/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 | React.ReactNode | ((props: any) => React.ReactNode);\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.ai/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.ai/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"],"mappings":"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","names":["Command","Default","CommandExecuting"]}
package/dist/index.d.mts CHANGED
@@ -2,6 +2,11 @@ import * as _flowgram_ai_utils from '@flowgram.ai/utils';
2
2
  import { Disposable, Event, Emitter } from '@flowgram.ai/utils';
3
3
  import { ContainerModule } from 'inversify';
4
4
 
5
+ /**
6
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+
5
10
  declare const CommandService: unique symbol;
6
11
  /**
7
12
  * command service 执行接口
@@ -202,6 +207,11 @@ declare class CommandRegistry implements CommandService {
202
207
  dispose(): void;
203
208
  }
204
209
 
210
+ /**
211
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
212
+ * SPDX-License-Identifier: MIT
213
+ */
214
+
205
215
  declare const CommandContainerModule: ContainerModule;
206
216
 
207
217
  export { Command, CommandContainerModule, CommandContribution, type CommandHandler, CommandRegistry, CommandRegistryFactory, CommandService };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,11 @@ import * as _flowgram_ai_utils from '@flowgram.ai/utils';
2
2
  import { Disposable, Event, Emitter } from '@flowgram.ai/utils';
3
3
  import { ContainerModule } from 'inversify';
4
4
 
5
+ /**
6
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
7
+ * SPDX-License-Identifier: MIT
8
+ */
9
+
5
10
  declare const CommandService: unique symbol;
6
11
  /**
7
12
  * command service 执行接口
@@ -202,6 +207,11 @@ declare class CommandRegistry implements CommandService {
202
207
  dispose(): void;
203
208
  }
204
209
 
210
+ /**
211
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
212
+ * SPDX-License-Identifier: MIT
213
+ */
214
+
205
215
  declare const CommandContainerModule: ContainerModule;
206
216
 
207
217
  export { Command, CommandContainerModule, CommandContribution, type CommandHandler, CommandRegistry, CommandRegistryFactory, CommandService };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/command.ts","../src/command-service.ts","../src/command-container-module.ts"],"sourcesContent":["export {\n CommandContribution,\n type CommandHandler,\n CommandRegistry,\n Command,\n CommandRegistryFactory,\n} from './command';\nexport { CommandService } from './command-service';\nexport { CommandContainerModule } from './command-container-module';\n","import { injectable, multiInject, optional } from 'inversify';\nimport { Disposable, DisposableCollection, Emitter } from '@flowgram.ai/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 | React.ReactNode | ((props: any) => React.ReactNode);\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","import { type Disposable, type Event } from '@flowgram.ai/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","import { ContainerModule } from 'inversify';\nimport { bindContributionProvider } from '@flowgram.ai/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"],"mappings":"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","names":["Command","Default","CommandExecuting","import_inversify","import_utils"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/command.ts","../src/command-service.ts","../src/command-container-module.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport {\n CommandContribution,\n type CommandHandler,\n CommandRegistry,\n Command,\n CommandRegistryFactory,\n} from './command';\nexport { CommandService } from './command-service';\nexport { CommandContainerModule } from './command-container-module';\n","/**\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.ai/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 | React.ReactNode | ((props: any) => React.ReactNode);\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.ai/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.ai/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"],"mappings":"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","names":["Command","Default","CommandExecuting","import_inversify","import_utils"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowgram.ai/command",
3
- "version": "0.2.16",
3
+ "version": "0.2.17",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "inversify": "^6.0.1",
20
20
  "reflect-metadata": "~0.2.2",
21
- "@flowgram.ai/utils": "0.2.16"
21
+ "@flowgram.ai/utils": "0.2.17"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/lodash": "^4.14.137",
@@ -31,8 +31,8 @@
31
31
  "tsup": "^8.0.1",
32
32
  "typescript": "^5.0.4",
33
33
  "vitest": "^0.34.6",
34
- "@flowgram.ai/eslint-config": "0.2.16",
35
- "@flowgram.ai/ts-config": "0.2.16"
34
+ "@flowgram.ai/ts-config": "0.2.17",
35
+ "@flowgram.ai/eslint-config": "0.2.17"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "react": ">=16.8",