@flowgram.ai/history 0.5.2 → 0.5.4

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/operation/operation-contribution.ts","../../src/operation/operation-registry.ts","../../src/operation/operation-service.ts","../../src/history-context.ts","../../src/history-config.ts","../../src/history/undo-redo-service.ts","../../src/history/types.ts","../../src/history/history-service.ts","../../src/history/stack-operation.ts","../../src/history/history-manager.ts","../../src/history/history-stack.ts","../../src/history-container-module.ts","../../src/create-history-plugin.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, multiInject, optional, postConstruct } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationMeta } from './types';\nimport { OperationContribution } from './operation-contribution';\n\n@injectable()\nexport class OperationRegistry {\n private readonly _operationMetas: Map<string, OperationMeta> = new Map();\n\n @multiInject(OperationContribution)\n @optional()\n protected readonly contributions: OperationContribution[] = [];\n\n @postConstruct()\n protected init() {\n for (const contrib of this.contributions) {\n contrib.registerOperationMeta?.(this);\n }\n }\n\n /**\n * 注册操作的元数据\n * @param operationMeta 操作的元数据\n * @returns 销毁函数\n */\n registerOperationMeta(operationMeta: OperationMeta): Disposable {\n if (this._operationMetas.has(operationMeta.type)) {\n console.warn(`A operation meta ${operationMeta.type} is already registered.`);\n return Disposable.NULL;\n }\n const toDispose = new DisposableCollection(this._doRegisterOperationMetaMeta(operationMeta));\n return toDispose;\n }\n\n /**\n * 获取操作的元数据\n * @param type 操作类型\n * @returns 操作的元数据\n */\n getOperationMeta(type: string): OperationMeta | undefined {\n return this._operationMetas.get(type);\n }\n\n private _doRegisterOperationMetaMeta(operationMeta: OperationMeta): Disposable {\n this._operationMetas.set(operationMeta.type, operationMeta);\n return {\n dispose: () => {\n this._operationMetas.delete(operationMeta.type);\n },\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { Operation } from './types';\nimport { OperationRegistry } from './operation-registry';\n\n@injectable()\nexport class OperationService {\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n config: HistoryConfig;\n\n readonly applyEmitter = new Emitter<Operation>();\n\n readonly onApply = this.applyEmitter.event;\n\n private _toDispose = new DisposableCollection();\n\n @postConstruct()\n init() {\n this._toDispose.push(this.applyEmitter);\n }\n\n /**\n * 执行操作\n * @param op\n * @returns\n */\n applyOperation(op: Operation, options?: { noApply?: boolean }): any {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n\n let res;\n if (!options?.noApply) {\n res = meta.apply(op, this.context.source);\n }\n\n this.applyEmitter.fire(op);\n\n return res;\n }\n\n /**\n * 根据操作类型获取操作的label\n * @param operation 操作\n * @returns\n */\n getOperationLabel(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getLabel) {\n return operationMeta.getLabel(operation, this.context.source);\n }\n }\n\n /**\n * 根据操作类型获取操作的description\n * @param operation 操作\n * @returns\n */\n getOperationDescription(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getDescription) {\n return operationMeta.getDescription(operation, this.context.source);\n }\n }\n\n /**\n * 操作取反\n * @param operations\n * @returns\n */\n inverseOperations(operations: Operation[]) {\n return operations.map(op => this.inverseOperation(op)).reverse();\n }\n\n inverseOperation(op: Operation): Operation {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n return meta.inverse(op);\n }\n\n dispose() {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryContext {\n /**\n * 所属uri\n */\n uri?: string;\n\n /**\n * 操作触发的源对象,如编辑器对象\n */\n source?: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { Emitter, DisposableCollection } from '@flowgram.ai/utils';\n\nimport {\n IUndoRedoElement,\n IUndoRedoService,\n UndoRedoChangeType,\n UndoRedoChangeEvent,\n UndoRedoClearEvent,\n} from './types';\n\n@injectable()\nexport class UndoRedoService implements IUndoRedoService {\n private _undoStack: IUndoRedoElement[];\n\n private _redoStack: IUndoRedoElement[];\n\n private _undoing: boolean = false;\n\n private _redoing: boolean = false;\n\n private _limit: number = 100;\n\n protected onChangeEmitter = new Emitter<UndoRedoChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n readonly _toDispose = new DisposableCollection();\n\n constructor() {\n this._undoStack = [];\n this._redoStack = [];\n this._toDispose.push(this.onChangeEmitter);\n }\n\n setLimit(limit: number) {\n this._limit = limit;\n }\n\n pushElement(element: IUndoRedoElement): void {\n this._redoStack = [];\n this._stackPush(this._undoStack, element);\n this._toDispose.push(element);\n this._emitChange(UndoRedoChangeType.PUSH, element);\n }\n\n getUndoStack() {\n return this._undoStack;\n }\n\n getRedoStack() {\n return this._redoStack;\n }\n\n getLastElement() {\n return this._undoStack[this._undoStack.length - 1];\n }\n\n /**\n * 执行undo\n * @returns void\n */\n async undo(): Promise<void> {\n if (!this.canUndo()) {\n return;\n }\n\n if (this._undoing) {\n return;\n }\n this._undoing = true;\n\n const item = this._undoStack.pop() as IUndoRedoElement;\n\n try {\n await item.undo();\n } finally {\n this._stackPush(this._redoStack, item);\n this._emitChange(UndoRedoChangeType.UNDO, item);\n this._undoing = false;\n }\n }\n\n /**\n * 执行redo\n * @returns void\n */\n async redo(): Promise<void> {\n if (!this.canRedo()) {\n return;\n }\n\n if (this._redoing) {\n return;\n }\n this._redoing = true;\n\n const item = this._redoStack.pop() as IUndoRedoElement;\n\n try {\n await item.redo();\n } finally {\n this._stackPush(this._undoStack, item);\n this._emitChange(UndoRedoChangeType.REDO, item);\n this._redoing = false;\n }\n }\n\n /**\n * 是否可undo\n * @returns true代表可以,false代表不可以\n */\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n /**\n * 是否可redo\n * @returns true代表可以,false代表不可以\n */\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /**\n * 是否可以push\n * @returns true代表可以,false代表不可以\n */\n canPush(): boolean {\n return !this._redoing && !this._undoing;\n }\n\n /**\n * 清空\n */\n clear() {\n this.clearRedoStack();\n this.clearUndoStack();\n this._emitChange(UndoRedoChangeType.CLEAR);\n }\n\n /**\n * 清空redo栈\n */\n clearRedoStack(): void {\n this._redoStack.forEach(element => {\n element.dispose();\n });\n this._redoStack = [];\n }\n\n /**\n * 清空undo栈\n */\n clearUndoStack(): void {\n this._undoStack.forEach(element => {\n element.dispose();\n });\n this._undoStack = [];\n }\n\n /**\n * 销毁\n */\n dispose(): void {\n this.clear();\n this._toDispose.dispose();\n }\n\n private _stackPush(stack: IUndoRedoElement[], element: IUndoRedoElement) {\n stack.push(element);\n if (stack.length > this._limit) {\n stack.shift();\n }\n }\n\n private _emitChange(type: UndoRedoChangeType, element?: IUndoRedoElement) {\n if (element) {\n this.onChangeEmitter.fire({ type, element });\n } else {\n this.onChangeEmitter.fire({ type } as UndoRedoClearEvent);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation } from '../operation';\nimport { HistoryService } from './history-service';\n\nexport interface HistoryRecord {\n snapshot: any;\n stack: any[];\n}\n\nexport interface HistoryItem extends HistoryStackItem {\n id: string;\n time: string;\n operations: HistoryOperation[];\n}\n\n/**\n * 历史服务管理\n */\nexport interface IHistoryManager {\n /**\n * 注册历史服务\n * @param service 历史服务示例\n */\n registerHistoryService(service: IHistoryService): void;\n /**\n * 取消注册历史服务\n * @param service 历史服务示例\n */\n unregisterHistoryService(service: HistoryService): void;\n}\n\n/**\n * 历史服务\n */\nexport interface IHistoryService extends Disposable {\n /**\n * 添加操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): void | Promise<void>;\n /**\n * 获取所有历史操作\n */\n getHistoryOperations(): Operation[];\n /**\n * 撤回\n */\n undo(): void | Promise<void>;\n /**\n * 重做\n */\n redo(): void | Promise<void>;\n /**\n * 是否有可撤销的操作\n */\n canUndo(): boolean;\n /**\n * 是否有可重做的操作\n */\n canRedo(): boolean;\n /**\n * 获取历史记录\n */\n getRecords(): Promise<HistoryRecord[]>;\n /**\n * 根据历史版本重新存储历史记录\n * @param historyRecord 历史记录\n */\n restore(historyRecord: HistoryRecord): Promise<void>;\n /**\n * 清空undo/redo\n */\n clear(): void;\n /**\n * 最大数量限制\n * @param num 数量\n */\n limit(num: number): void;\n /**\n * 返回快照\n */\n getSnapshot(): unknown;\n}\n\nexport interface IOperationService {\n pushOperation(operation: Operation): void;\n}\n\n/**\n * UndoRedo服务\n */\nexport interface IUndoRedoService extends Disposable {\n /**\n * 添加一个undo/redo元素\n * @param element 可undo/redo的元素\n */\n pushElement(element: IUndoRedoElement): void;\n /**\n * 获取最后一个可undo的元素\n */\n getLastElement(): IUndoRedoElement;\n /**\n * 获取undo栈\n */\n getUndoStack(): IUndoRedoElement[];\n /**\n * 获取redo栈\n */\n getRedoStack(): IUndoRedoElement[];\n /**\n * 清空redo栈\n */\n clearRedoStack(): void;\n /**\n * 是否可undo\n */\n canUndo(): boolean;\n /**\n * 执行undo\n */\n undo(): Promise<void> | void;\n /**\n * 是否可redo\n */\n canRedo(): boolean;\n /**\n * 执行redo\n */\n redo(): Promise<void> | void;\n /**\n * 清空 undo和redo栈\n */\n clear(): void;\n}\n\n/**\n * UndoRedo元素\n */\nexport interface IUndoRedoElement extends Disposable {\n /**\n * 操作标题\n */\n readonly label?: string;\n /**\n * 操作描述\n */\n readonly description?: string;\n /**\n * 撤销\n */\n undo(): Promise<void> | void;\n /**\n * 重做\n */\n redo(): Promise<void> | void;\n /**\n * 添加一个操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): Operation;\n /**\n * 获取所有操作\n */\n getOperations(): Operation[];\n /**\n * 获取第一个操作\n */\n getFirstOperation(): Operation;\n /**\n * 获取最后一个操作\n */\n getLastOperation(): Operation;\n /**\n * 获取修改的操作\n */\n getChangeOperations(type: UndoRedoChangeType): Operation[];\n}\n\n/**\n * 操作注册\n */\nexport interface IOperationRegistry {\n register(type: string, factory: IUndoRedoElementFactory<unknown>): void;\n}\n\n/**\n * 操作工厂\n */\nexport type IUndoRedoElementFactory<OperationValue> = (\n operation: Operation<OperationValue>\n) => IUndoRedoElement;\n\n/**\n * undo redo 类型\n */\nexport enum UndoRedoChangeType {\n UNDO = 'undo',\n REDO = 'redo',\n PUSH = 'push',\n CLEAR = 'clear',\n}\n\n/**\n * 带element的事件\n */\nexport interface UndoRedoChangeElementEvent {\n type: UndoRedoChangeType.PUSH | UndoRedoChangeType.UNDO | UndoRedoChangeType.REDO;\n element: IUndoRedoElement;\n}\n/**\n * 清空事件\n */\nexport interface UndoRedoClearEvent {\n type: UndoRedoChangeType.CLEAR;\n}\n/**\n * undo redo变化事件\n */\nexport type UndoRedoChangeEvent = UndoRedoChangeElementEvent | UndoRedoClearEvent;\n\nexport interface HistoryStackItem {\n id: string;\n type: UndoRedoChangeType;\n timestamp: number;\n operations: Operation[];\n uri?: string;\n}\n\n/**\n * 历史栈变化类型\n */\nexport enum HistoryStackChangeType {\n ADD = 'add',\n UPDATE = 'update',\n CLEAR = 'clear',\n ADD_OPERATION = 'add_operation',\n UPDATE_OPERATION = 'update_operation',\n}\n\n/**\n * 历史栈变化事件基础\n */\nexport interface HistoryStackBaseEvent {\n type: HistoryStackChangeType;\n value?: any;\n service: HistoryService;\n}\n\n/**\n * 添加历史事件\n */\nexport interface HistoryStackAddEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD;\n value: HistoryItem;\n}\n\n/**\n * 更新历史事件\n */\nexport interface HistoryStackUpdateEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE;\n value: HistoryItem;\n}\n\n/**\n * 添加操作事件\n */\nexport interface HistoryStackAddOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 更新操作事件\n */\nexport interface HistoryStackUpdateOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 历史记录变化事件\n */\nexport type HistoryStackChangeEvent =\n | HistoryStackAddEvent\n | HistoryStackUpdateEvent\n | HistoryStackAddOperationEvent\n | HistoryStackUpdateOperationEvent;\n\nexport enum HistoryMergeEventType {\n ADD = 'ADD',\n UPDATE = 'UPDATE',\n}\n\n/**\n * 历史合并事件\n */\nexport type HistoryMergeEvent =\n | {\n type: HistoryMergeEventType.ADD;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n };\n }\n | {\n type: HistoryMergeEventType.UPDATE;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n value: any;\n };\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { pick } from 'lodash-es';\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { OperationMeta, OperationRegistry, PushOperationOptions } from '../operation';\nimport { Operation } from '../operation';\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { UndoRedoService } from './undo-redo-service';\nimport {\n HistoryMergeEvent,\n HistoryMergeEventType,\n HistoryRecord,\n IHistoryService,\n IUndoRedoElement,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryManager } from './history-manager';\n\n@injectable()\nexport class HistoryService implements IHistoryService {\n @inject(UndoRedoService)\n readonly undoRedoService: UndoRedoService;\n\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(OperationService)\n readonly operationService: OperationService;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n readonly config: HistoryConfig;\n\n @inject(HistoryManager)\n historyManager: HistoryManager;\n\n private _toDispose = new DisposableCollection();\n\n private _transacting: boolean = false;\n\n private _transactOperation: StackOperation | null = null;\n\n private _locked: boolean = false;\n\n private _willDisposeEmitter = new Emitter<HistoryService>();\n\n private _mergeEmitter = new Emitter<HistoryMergeEvent>();\n\n onWillDispose = this._willDisposeEmitter.event;\n\n onMerge = this._mergeEmitter.event;\n\n get onApply() {\n return this.operationService.onApply;\n }\n\n @postConstruct()\n init() {\n this._toDispose.push(this._willDisposeEmitter);\n this._toDispose.push(this._mergeEmitter);\n }\n\n start() {\n this._locked = false;\n }\n\n stop() {\n this._locked = true;\n }\n\n limit(num: number) {\n this.undoRedoService.setLimit(num);\n }\n\n startTransaction() {\n if (this._transacting) {\n return;\n }\n\n this._transacting = true;\n const stackOperation = new StackOperation(this.operationService, []);\n this._transactOperation = stackOperation;\n }\n\n endTransaction() {\n const stackOperation = this._transactOperation;\n if (!stackOperation) {\n return;\n }\n if (stackOperation.getOperations().length !== 0) {\n this._pushStackOperation(stackOperation);\n }\n\n this._transactOperation = null;\n this._transacting = false;\n }\n\n transact(transaction: () => void) {\n if (this._transacting) {\n return;\n }\n this.startTransaction();\n transaction();\n this.endTransaction();\n }\n\n pushOperation(operation: Operation, options?: PushOperationOptions): any {\n if (!this._canPush()) {\n return;\n }\n\n const prev = this._transactOperation || this.undoRedoService.getLastElement();\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type) as OperationMeta;\n\n if (!operationMeta) {\n throw new Error(`Operation meta ${operation.type} has not registered.`);\n }\n\n if (operationMeta.shouldSave && !operationMeta.shouldSave(operation)) {\n return operationMeta.apply(operation, this.context.source);\n }\n\n const res = this.operationService.applyOperation(operation, { noApply: options?.noApply });\n\n if (operationMeta.getURI && !operation.uri) {\n operation.uri = operationMeta.getURI(operation, this.context.source);\n }\n\n const shouldMerge = this._shouldMerge(operation, prev, operationMeta);\n\n if (shouldMerge) {\n if (typeof shouldMerge === 'object') {\n const operation = prev.getLastOperation();\n operation.value = shouldMerge.value;\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.UPDATE,\n value: {\n element: prev,\n operation: operation,\n value: shouldMerge.value,\n },\n });\n } else {\n const op = prev.pushOperation(operation);\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.ADD,\n value: {\n element: prev,\n operation: op,\n },\n });\n }\n } else {\n const stackOperation = new StackOperation(this.operationService, [operation]);\n this._pushStackOperation(stackOperation);\n }\n\n return res;\n }\n\n getHistoryOperations(): Operation<unknown>[] {\n return this.historyManager.historyStack.items\n .reverse()\n .map((item) =>\n item.operations.map((o) => ({\n ...pick(o, ['type', 'value']),\n label: o.label || o.type,\n }))\n )\n .flat();\n }\n\n async undo(): Promise<void> {\n await this.undoRedoService.undo();\n }\n\n async redo(): Promise<void> {\n await this.undoRedoService.redo();\n }\n\n canUndo(): boolean {\n return this.undoRedoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.undoRedoService.canRedo();\n }\n\n getSnapshot(): unknown {\n return this.config.getSnapshot();\n }\n\n getRecords(): Promise<HistoryRecord[]> {\n throw new Error('Method not implemented.');\n }\n\n restore(historyRecord: HistoryRecord): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n clear() {\n this.undoRedoService.clear();\n }\n\n dispose(): void {\n this._willDisposeEmitter.fire(this);\n this._toDispose.dispose();\n }\n\n private _canPush() {\n if (this._locked) {\n return false;\n }\n return this.undoRedoService.canPush();\n }\n\n private _pushStackOperation(stackOperation: StackOperation) {\n this.undoRedoService.pushElement(stackOperation);\n this.undoRedoService.clearRedoStack();\n }\n\n private _shouldMerge(operation: Operation, prev: IUndoRedoElement, operationMeta: OperationMeta) {\n if (!prev) {\n return false;\n }\n\n if (this._transacting) {\n return true;\n }\n return (\n operationMeta.shouldMerge &&\n operationMeta.shouldMerge(operation, prev.getLastOperation(), prev as StackOperation)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { Operation, OperationWithId } from '../operation';\nimport { IUndoRedoElement, UndoRedoChangeType } from './types';\n\nexport class StackOperation implements IUndoRedoElement {\n label?: string | undefined;\n\n description?: string | undefined;\n\n private _operations: OperationWithId[];\n\n private _toDispose = new DisposableCollection();\n\n private _timestamp: number = Date.now();\n\n private _operationService: OperationService;\n\n private _id: string;\n\n get id() {\n return this._id;\n }\n\n constructor(operationService: OperationService, operations: Operation[] = []) {\n this._operationService = operationService;\n this._operations = operations.map((op) => this._operation(op));\n this._id = operationService.config.generateId();\n }\n\n getTimestamp(): number {\n return this._timestamp;\n }\n\n pushOperation(operation: Operation): OperationWithId {\n const op = this._operation(operation);\n this._operations.push(op);\n return op;\n }\n\n getOperations(): Operation[] {\n return this._operations;\n }\n\n getChangeOperations(type: UndoRedoChangeType): Operation[] {\n if (type === UndoRedoChangeType.UNDO) {\n return this._operationService.inverseOperations(this._operations);\n }\n return this._operations;\n }\n\n getFirstOperation(): Operation {\n return this._operations[0];\n }\n\n getLastOperation(): Operation<unknown> {\n return this._operations[this._operations.length - 1];\n }\n\n async undo(): Promise<void> {\n const inverseOps = this._operationService.inverseOperations(this._operations);\n\n for (const op of inverseOps) {\n await this._apply(op);\n }\n }\n\n async redo(): Promise<void> {\n for (const op of this._operations) {\n await this._apply(op);\n }\n }\n\n revert(type: UndoRedoChangeType): void | Promise<void> {\n let operations: Operation[] = this._operations;\n\n if (type !== UndoRedoChangeType.UNDO) {\n operations = this._operations.map((op) => this._inverse(op)).reverse();\n }\n\n for (const op of operations) {\n this._apply(op);\n }\n }\n\n private _inverse(op: Operation): Operation {\n return this._operationService.inverseOperation(op);\n }\n\n private async _apply(op: Operation) {\n await this._operationService.applyOperation(op);\n }\n\n private _operation(op: Operation) {\n return {\n ...op,\n value: cloneDeep(op.value),\n id: this._operationService.config.generateId(),\n };\n }\n\n dispose(): void {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport { type UndoRedoChangeEvent } from './types';\nimport {\n type IHistoryManager,\n type HistoryStackItem,\n UndoRedoChangeType,\n HistoryMergeEventType,\n HistoryMergeEvent,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryStack } from './history-stack';\nimport { type HistoryService } from './history-service';\n\n@injectable()\nexport class HistoryManager implements IHistoryManager {\n @inject(HistoryStack) readonly historyStack: HistoryStack;\n\n @inject(HistoryConfig) readonly historyConfig: HistoryConfig;\n\n private _historyServices = new Map<HistoryService, Disposable>();\n\n private _toDispose = new DisposableCollection();\n\n registerHistoryService(service: HistoryService): void {\n const toDispose = new DisposableCollection();\n toDispose.pushAll([\n service.undoRedoService.onChange((event: UndoRedoChangeEvent) => {\n if (event.type === UndoRedoChangeType.CLEAR) {\n return;\n }\n\n const { type, element } = event;\n const operations = element.getChangeOperations(type);\n const historyStackItem: HistoryStackItem = {\n id:\n type === UndoRedoChangeType.PUSH\n ? (element as StackOperation).id\n : this.historyConfig.generateId(),\n type,\n uri: service.context.uri,\n operations,\n timestamp: Date.now(),\n };\n this.historyStack.add(service, historyStackItem);\n }),\n service.onMerge((event) => {\n this._handleMerge(service, event);\n }),\n ]);\n this._historyServices.set(service, toDispose);\n\n this._toDispose.push(\n service.onWillDispose(() => {\n this.unregisterHistoryService(service);\n })\n );\n }\n\n unregisterHistoryService(service: HistoryService): void {\n const disposable = this._historyServices.get(service);\n if (!disposable) {\n return;\n }\n disposable.dispose();\n this._historyServices.delete(service);\n }\n\n getHistoryServiceByURI(uri: string) {\n for (const service of this._historyServices.keys()) {\n if (service.context.uri === uri) {\n return service;\n }\n }\n }\n\n getFirstHistoryService() {\n for (const service of this._historyServices.keys()) {\n return service;\n }\n }\n\n dispose(): void {\n this._toDispose.dispose();\n this.historyStack.dispose();\n\n this._historyServices.forEach((service) => service.dispose());\n this._historyServices.clear();\n }\n\n _handleMerge(service: HistoryService, event: HistoryMergeEvent) {\n const { element, operation } = event.value;\n\n const find = this.historyStack.findById((element as StackOperation).id);\n\n if (!find) {\n return;\n }\n\n if (!(operation as OperationWithId).id) {\n console.warn('no operation id found');\n return;\n }\n\n if (event.type === HistoryMergeEventType.UPDATE) {\n this.historyStack.updateOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n\n if (event.type === HistoryMergeEventType.ADD) {\n this.historyStack.addOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { injectable, inject } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation, OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport {\n type HistoryItem,\n HistoryStackChangeType,\n type HistoryStackItem,\n HistoryStackChangeEvent,\n UndoRedoChangeType,\n} from './types';\nimport { type HistoryService } from './history-service';\n\n/**\n * 历史栈,聚合所有历史操作\n */\n@injectable()\nexport class HistoryStack {\n @inject(HistoryConfig)\n historyConfig: HistoryConfig;\n\n private _items: HistoryItem[] = [];\n\n readonly onChangeEmitter = new Emitter<HistoryStackChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n limit = 100;\n\n constructor() {\n this._toDispose.push(this.onChangeEmitter);\n }\n\n get items(): HistoryItem[] {\n return this._items;\n }\n\n add(service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items.unshift(historyItem);\n if (this._items.length > this.limit) {\n this._items.pop();\n }\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD,\n value: historyItem,\n service,\n });\n return historyItem;\n }\n\n findById(id: string): HistoryItem | undefined {\n return this._items.find((item) => item.id === id);\n }\n\n changeByIndex(index: number, service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items[index] = historyItem;\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE,\n value: historyItem,\n service,\n });\n }\n\n addOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.push(newOperatopn);\n\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n updateOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n const index = historyItem.operations.findIndex((op) => op.id === op.id);\n if (index < 0) {\n console.warn('no operation found');\n return;\n }\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.splice(index, 1, newOperatopn);\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n clear() {\n this._items = [];\n }\n\n dispose() {\n this._items = [];\n this._toDispose.dispose();\n }\n\n private _getHistoryItem(service: HistoryService, item: HistoryStackItem): HistoryItem {\n return {\n ...item,\n uri: service.context.uri,\n time: HistoryStack.dateFormat(item.timestamp),\n operations: item.operations.map((op) =>\n this._getHistoryOperation(service, op, item.type !== UndoRedoChangeType.PUSH)\n ),\n };\n }\n\n private _getHistoryOperation(\n service: HistoryService,\n op: Operation,\n generateId: boolean = false\n ): HistoryOperation {\n let id;\n if (generateId) {\n id = this.historyConfig.generateId();\n } else {\n const oldId = (op as OperationWithId).id;\n if (!oldId) {\n throw new Error('no operation id found');\n }\n id = oldId;\n }\n\n return {\n ...cloneDeep(op),\n id,\n label: service.operationService.getOperationLabel(op),\n description: service.operationService.getOperationDescription(op),\n timestamp: Date.now(),\n };\n }\n\n static dateFormat(timestamp: number) {\n return new Date(timestamp).toLocaleString();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { OperationRegistry, OperationService } from './operation';\nimport { HistoryContext } from './history-context';\nimport {\n HistoryService,\n HistoryStack,\n HistoryManager,\n UndoRedoService,\n HistoryConfig,\n} from './history';\n\nexport const HistoryContainerModule = new ContainerModule(\n (bind, _unbind, _isBound, _rebind, _unbindAsync, onActivation, _onDeactivation) => {\n bind(OperationRegistry).toSelf().inSingletonScope();\n bind(OperationService).toSelf().inSingletonScope();\n bind(UndoRedoService).toSelf().inSingletonScope();\n bind(HistoryService).toSelf().inSingletonScope();\n bind(HistoryContext).toSelf().inSingletonScope();\n bind(HistoryManager).toSelf().inSingletonScope();\n bind(HistoryStack).toSelf().inSingletonScope();\n bind(HistoryConfig).toSelf().inSingletonScope();\n\n onActivation(HistoryService, (ctx, historyService) => {\n let historyManager;\n\n if (ctx.container?.parent?.isBound(HistoryManager)) {\n historyManager = ctx.container?.parent?.get(HistoryManager);\n } else {\n historyManager = ctx.container.get(HistoryManager);\n }\n\n if (!historyManager) {\n return historyService;\n }\n\n historyService.historyManager = historyManager;\n historyManager.registerHistoryService(historyService);\n return historyService;\n });\n }\n);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { Operation, OperationService } from './operation';\nimport { HistoryContainerModule } from './history-container-module';\n\nexport interface HistoryPluginOptions<T = PluginContext> {\n enable?: boolean;\n onApply?: (ctx: T, operation: Operation) => void;\n}\n\nexport const createHistoryPlugin = definePluginCreator<HistoryPluginOptions>({\n onInit: (ctx, opts) => {\n if (opts.onApply) {\n ctx.get(OperationService).onApply(opts.onApply.bind(null, ctx));\n }\n },\n containerModules: [HistoryContainerModule],\n});\n"],"mappings":"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","names":["injectable","postConstruct","DisposableCollection","injectable","injectable","injectable","injectable","DisposableCollection","postConstruct","injectable","injectable","Emitter","DisposableCollection","UndoRedoChangeType","HistoryStackChangeType","HistoryMergeEventType","Emitter","DisposableCollection","injectable","injectable","inject","postConstruct","DisposableCollection","Emitter","DisposableCollection","DisposableCollection","inject","injectable","DisposableCollection","cloneDeep","injectable","inject","DisposableCollection","Emitter","Emitter","DisposableCollection","op","cloneDeep","inject","injectable","DisposableCollection","inject","injectable","DisposableCollection","Emitter","operation","inject","postConstruct","injectable"]}
1
+ {"version":3,"sources":["../../src/operation/operation-contribution.ts","../../src/operation/operation-registry.ts","../../src/operation/operation-service.ts","../../src/history-context.ts","../../src/history-config.ts","../../src/history/undo-redo-service.ts","../../src/history/types.ts","../../src/history/history-service.ts","../../src/history/stack-operation.ts","../../src/history/history-manager.ts","../../src/history/history-stack.ts","../../src/history-container-module.ts","../../src/create-history-plugin.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, multiInject, optional, postConstruct } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationMeta } from './types';\nimport { OperationContribution } from './operation-contribution';\n\n@injectable()\nexport class OperationRegistry {\n private readonly _operationMetas: Map<string, OperationMeta> = new Map();\n\n @multiInject(OperationContribution)\n @optional()\n protected readonly contributions: OperationContribution[] = [];\n\n @postConstruct()\n protected init() {\n for (const contrib of this.contributions) {\n contrib.registerOperationMeta?.(this);\n }\n }\n\n /**\n * 注册操作的元数据\n * @param operationMeta 操作的元数据\n * @returns 销毁函数\n */\n registerOperationMeta(operationMeta: OperationMeta): Disposable {\n if (this._operationMetas.has(operationMeta.type)) {\n console.warn(`A operation meta ${operationMeta.type} is already registered.`);\n return Disposable.NULL;\n }\n const toDispose = new DisposableCollection(this._doRegisterOperationMetaMeta(operationMeta));\n return toDispose;\n }\n\n /**\n * 获取操作的元数据\n * @param type 操作类型\n * @returns 操作的元数据\n */\n getOperationMeta(type: string): OperationMeta | undefined {\n return this._operationMetas.get(type);\n }\n\n private _doRegisterOperationMetaMeta(operationMeta: OperationMeta): Disposable {\n this._operationMetas.set(operationMeta.type, operationMeta);\n return {\n dispose: () => {\n this._operationMetas.delete(operationMeta.type);\n },\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { Operation } from './types';\nimport { OperationRegistry } from './operation-registry';\n\n@injectable()\nexport class OperationService {\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n config: HistoryConfig;\n\n readonly applyEmitter = new Emitter<Operation>();\n\n readonly onApply = this.applyEmitter.event;\n\n private _toDispose = new DisposableCollection();\n\n @postConstruct()\n init() {\n this._toDispose.push(this.applyEmitter);\n }\n\n /**\n * 执行操作\n * @param op\n * @returns\n */\n applyOperation(op: Operation, options?: { noApply?: boolean }): any {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n\n let res;\n if (!options?.noApply) {\n res = meta.apply(op, this.context.source);\n }\n\n this.applyEmitter.fire(op);\n\n return res;\n }\n\n /**\n * 根据操作类型获取操作的label\n * @param operation 操作\n * @returns\n */\n getOperationLabel(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getLabel) {\n return operationMeta.getLabel(operation, this.context.source);\n }\n }\n\n /**\n * 根据操作类型获取操作的description\n * @param operation 操作\n * @returns\n */\n getOperationDescription(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getDescription) {\n return operationMeta.getDescription(operation, this.context.source);\n }\n }\n\n /**\n * 操作取反\n * @param operations\n * @returns\n */\n inverseOperations(operations: Operation[]) {\n return operations.map(op => this.inverseOperation(op)).reverse();\n }\n\n inverseOperation(op: Operation): Operation {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n return meta.inverse(op);\n }\n\n dispose() {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryContext {\n /**\n * 所属uri\n */\n uri?: string;\n\n /**\n * 操作触发的源对象,如编辑器对象\n */\n source?: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { Emitter, DisposableCollection } from '@flowgram.ai/utils';\n\nimport {\n IUndoRedoElement,\n IUndoRedoService,\n UndoRedoChangeType,\n UndoRedoChangeEvent,\n UndoRedoClearEvent,\n} from './types';\n\n@injectable()\nexport class UndoRedoService implements IUndoRedoService {\n private _undoStack: IUndoRedoElement[];\n\n private _redoStack: IUndoRedoElement[];\n\n private _undoing: boolean = false;\n\n private _redoing: boolean = false;\n\n private _limit: number = 100;\n\n protected onChangeEmitter = new Emitter<UndoRedoChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n readonly _toDispose = new DisposableCollection();\n\n constructor() {\n this._undoStack = [];\n this._redoStack = [];\n this._toDispose.push(this.onChangeEmitter);\n }\n\n setLimit(limit: number) {\n this._limit = limit;\n }\n\n pushElement(element: IUndoRedoElement): void {\n this._redoStack = [];\n this._stackPush(this._undoStack, element);\n this._toDispose.push(element);\n this._emitChange(UndoRedoChangeType.PUSH, element);\n }\n\n getUndoStack() {\n return this._undoStack;\n }\n\n getRedoStack() {\n return this._redoStack;\n }\n\n getLastElement() {\n return this._undoStack[this._undoStack.length - 1];\n }\n\n /**\n * 执行undo\n * @returns void\n */\n async undo(): Promise<void> {\n if (!this.canUndo()) {\n return;\n }\n\n if (this._undoing) {\n return;\n }\n this._undoing = true;\n\n const item = this._undoStack.pop() as IUndoRedoElement;\n\n try {\n await item.undo();\n } finally {\n this._stackPush(this._redoStack, item);\n this._emitChange(UndoRedoChangeType.UNDO, item);\n this._undoing = false;\n }\n }\n\n /**\n * 执行redo\n * @returns void\n */\n async redo(): Promise<void> {\n if (!this.canRedo()) {\n return;\n }\n\n if (this._redoing) {\n return;\n }\n this._redoing = true;\n\n const item = this._redoStack.pop() as IUndoRedoElement;\n\n try {\n await item.redo();\n } finally {\n this._stackPush(this._undoStack, item);\n this._emitChange(UndoRedoChangeType.REDO, item);\n this._redoing = false;\n }\n }\n\n /**\n * 是否可undo\n * @returns true代表可以,false代表不可以\n */\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n /**\n * 是否可redo\n * @returns true代表可以,false代表不可以\n */\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /**\n * 是否可以push\n * @returns true代表可以,false代表不可以\n */\n canPush(): boolean {\n return !this._redoing && !this._undoing;\n }\n\n /**\n * 清空\n */\n clear() {\n this.clearRedoStack();\n this.clearUndoStack();\n this._emitChange(UndoRedoChangeType.CLEAR);\n }\n\n /**\n * 清空redo栈\n */\n clearRedoStack(): void {\n this._redoStack.forEach(element => {\n element.dispose();\n });\n this._redoStack = [];\n }\n\n /**\n * 清空undo栈\n */\n clearUndoStack(): void {\n this._undoStack.forEach(element => {\n element.dispose();\n });\n this._undoStack = [];\n }\n\n /**\n * 销毁\n */\n dispose(): void {\n this.clear();\n this._toDispose.dispose();\n }\n\n private _stackPush(stack: IUndoRedoElement[], element: IUndoRedoElement) {\n stack.push(element);\n if (stack.length > this._limit) {\n stack.shift();\n }\n }\n\n private _emitChange(type: UndoRedoChangeType, element?: IUndoRedoElement) {\n if (element) {\n this.onChangeEmitter.fire({ type, element });\n } else {\n this.onChangeEmitter.fire({ type } as UndoRedoClearEvent);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation } from '../operation';\nimport { HistoryService } from './history-service';\n\nexport interface HistoryRecord {\n snapshot: any;\n stack: any[];\n}\n\nexport interface HistoryItem extends HistoryStackItem {\n id: string;\n time: string;\n operations: HistoryOperation[];\n}\n\n/**\n * 历史服务管理\n */\nexport interface IHistoryManager {\n /**\n * 注册历史服务\n * @param service 历史服务示例\n */\n registerHistoryService(service: IHistoryService): void;\n /**\n * 取消注册历史服务\n * @param service 历史服务示例\n */\n unregisterHistoryService(service: HistoryService): void;\n}\n\n/**\n * 历史服务\n */\nexport interface IHistoryService extends Disposable {\n /**\n * 添加操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): void | Promise<void>;\n /**\n * 获取所有历史操作\n */\n getHistoryOperations(): Operation[];\n /**\n * 撤回\n */\n undo(): void | Promise<void>;\n /**\n * 重做\n */\n redo(): void | Promise<void>;\n /**\n * 是否有可撤销的操作\n */\n canUndo(): boolean;\n /**\n * 是否有可重做的操作\n */\n canRedo(): boolean;\n /**\n * 获取历史记录\n */\n getRecords(): Promise<HistoryRecord[]>;\n /**\n * 根据历史版本重新存储历史记录\n * @param historyRecord 历史记录\n */\n restore(historyRecord: HistoryRecord): Promise<void>;\n /**\n * 清空undo/redo\n */\n clear(): void;\n /**\n * 最大数量限制\n * @param num 数量\n */\n limit(num: number): void;\n /**\n * 返回快照\n */\n getSnapshot(): unknown;\n}\n\nexport interface IOperationService {\n pushOperation(operation: Operation): void;\n}\n\n/**\n * UndoRedo服务\n */\nexport interface IUndoRedoService extends Disposable {\n /**\n * 添加一个undo/redo元素\n * @param element 可undo/redo的元素\n */\n pushElement(element: IUndoRedoElement): void;\n /**\n * 获取最后一个可undo的元素\n */\n getLastElement(): IUndoRedoElement;\n /**\n * 获取undo栈\n */\n getUndoStack(): IUndoRedoElement[];\n /**\n * 获取redo栈\n */\n getRedoStack(): IUndoRedoElement[];\n /**\n * 清空redo栈\n */\n clearRedoStack(): void;\n /**\n * 是否可undo\n */\n canUndo(): boolean;\n /**\n * 执行undo\n */\n undo(): Promise<void> | void;\n /**\n * 是否可redo\n */\n canRedo(): boolean;\n /**\n * 执行redo\n */\n redo(): Promise<void> | void;\n /**\n * 清空 undo和redo栈\n */\n clear(): void;\n}\n\n/**\n * UndoRedo元素\n */\nexport interface IUndoRedoElement extends Disposable {\n /**\n * 操作标题\n */\n readonly label?: string;\n /**\n * 操作描述\n */\n readonly description?: string;\n /**\n * 撤销\n */\n undo(): Promise<void> | void;\n /**\n * 重做\n */\n redo(): Promise<void> | void;\n /**\n * 添加一个操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): Operation;\n /**\n * 获取所有操作\n */\n getOperations(): Operation[];\n /**\n * 获取第一个操作\n */\n getFirstOperation(): Operation;\n /**\n * 获取最后一个操作\n */\n getLastOperation(): Operation;\n /**\n * 获取修改的操作\n */\n getChangeOperations(type: UndoRedoChangeType): Operation[];\n}\n\n/**\n * 操作注册\n */\nexport interface IOperationRegistry {\n register(type: string, factory: IUndoRedoElementFactory<unknown>): void;\n}\n\n/**\n * 操作工厂\n */\nexport type IUndoRedoElementFactory<OperationValue> = (\n operation: Operation<OperationValue>\n) => IUndoRedoElement;\n\n/**\n * undo redo 类型\n */\nexport enum UndoRedoChangeType {\n UNDO = 'undo',\n REDO = 'redo',\n PUSH = 'push',\n CLEAR = 'clear',\n}\n\n/**\n * 带element的事件\n */\nexport interface UndoRedoChangeElementEvent {\n type: UndoRedoChangeType.PUSH | UndoRedoChangeType.UNDO | UndoRedoChangeType.REDO;\n element: IUndoRedoElement;\n}\n/**\n * 清空事件\n */\nexport interface UndoRedoClearEvent {\n type: UndoRedoChangeType.CLEAR;\n}\n/**\n * undo redo变化事件\n */\nexport type UndoRedoChangeEvent = UndoRedoChangeElementEvent | UndoRedoClearEvent;\n\nexport interface HistoryStackItem {\n id: string;\n type: UndoRedoChangeType;\n timestamp: number;\n operations: Operation[];\n uri?: string;\n}\n\n/**\n * 历史栈变化类型\n */\nexport enum HistoryStackChangeType {\n ADD = 'add',\n UPDATE = 'update',\n CLEAR = 'clear',\n ADD_OPERATION = 'add_operation',\n UPDATE_OPERATION = 'update_operation',\n}\n\n/**\n * 历史栈变化事件基础\n */\nexport interface HistoryStackBaseEvent {\n type: HistoryStackChangeType;\n value?: any;\n service: HistoryService;\n}\n\n/**\n * 添加历史事件\n */\nexport interface HistoryStackAddEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD;\n value: HistoryItem;\n}\n\n/**\n * 更新历史事件\n */\nexport interface HistoryStackUpdateEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE;\n value: HistoryItem;\n}\n\n/**\n * 添加操作事件\n */\nexport interface HistoryStackAddOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 更新操作事件\n */\nexport interface HistoryStackUpdateOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 历史记录变化事件\n */\nexport type HistoryStackChangeEvent =\n | HistoryStackAddEvent\n | HistoryStackUpdateEvent\n | HistoryStackAddOperationEvent\n | HistoryStackUpdateOperationEvent;\n\nexport enum HistoryMergeEventType {\n ADD = 'ADD',\n UPDATE = 'UPDATE',\n}\n\n/**\n * 历史合并事件\n */\nexport type HistoryMergeEvent =\n | {\n type: HistoryMergeEventType.ADD;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n };\n }\n | {\n type: HistoryMergeEventType.UPDATE;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n value: any;\n };\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { pick } from 'lodash-es';\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { OperationMeta, OperationRegistry, PushOperationOptions } from '../operation';\nimport { Operation } from '../operation';\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { UndoRedoService } from './undo-redo-service';\nimport {\n HistoryMergeEvent,\n HistoryMergeEventType,\n HistoryRecord,\n IHistoryService,\n IUndoRedoElement,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryManager } from './history-manager';\n\n@injectable()\nexport class HistoryService implements IHistoryService {\n @inject(UndoRedoService)\n readonly undoRedoService: UndoRedoService;\n\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(OperationService)\n readonly operationService: OperationService;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n readonly config: HistoryConfig;\n\n @inject(HistoryManager)\n historyManager: HistoryManager;\n\n private _toDispose = new DisposableCollection();\n\n private _transacting: boolean = false;\n\n private _transactOperation: StackOperation | null = null;\n\n private _locked: boolean = false;\n\n private _willDisposeEmitter = new Emitter<HistoryService>();\n\n private _mergeEmitter = new Emitter<HistoryMergeEvent>();\n\n onWillDispose = this._willDisposeEmitter.event;\n\n onMerge = this._mergeEmitter.event;\n\n get onApply() {\n return this.operationService.onApply;\n }\n\n @postConstruct()\n init() {\n this._toDispose.push(this._willDisposeEmitter);\n this._toDispose.push(this._mergeEmitter);\n }\n\n start() {\n this._locked = false;\n }\n\n stop() {\n this._locked = true;\n }\n\n limit(num: number) {\n this.undoRedoService.setLimit(num);\n }\n\n startTransaction() {\n if (this._transacting) {\n return;\n }\n\n this._transacting = true;\n const stackOperation = new StackOperation(this.operationService, []);\n this._transactOperation = stackOperation;\n }\n\n endTransaction() {\n const stackOperation = this._transactOperation;\n if (!stackOperation) {\n return;\n }\n if (stackOperation.getOperations().length !== 0) {\n this._pushStackOperation(stackOperation);\n }\n\n this._transactOperation = null;\n this._transacting = false;\n }\n\n transact(transaction: () => void) {\n if (this._transacting) {\n return;\n }\n this.startTransaction();\n transaction();\n this.endTransaction();\n }\n\n pushOperation(operation: Operation, options?: PushOperationOptions): any {\n if (!this._canPush()) {\n return;\n }\n\n const prev = this._transactOperation || this.undoRedoService.getLastElement();\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type) as OperationMeta;\n\n if (!operationMeta) {\n throw new Error(`Operation meta ${operation.type} has not registered.`);\n }\n\n if (operationMeta.shouldSave && !operationMeta.shouldSave(operation)) {\n return operationMeta.apply(operation, this.context.source);\n }\n\n const res = this.operationService.applyOperation(operation, { noApply: options?.noApply });\n\n if (operationMeta.getURI && !operation.uri) {\n operation.uri = operationMeta.getURI(operation, this.context.source);\n }\n\n const shouldMerge = this._shouldMerge(operation, prev, operationMeta);\n\n if (shouldMerge) {\n if (typeof shouldMerge === 'object') {\n const operation = prev.getLastOperation();\n operation.value = shouldMerge.value;\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.UPDATE,\n value: {\n element: prev,\n operation: operation,\n value: shouldMerge.value,\n },\n });\n } else {\n const op = prev.pushOperation(operation);\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.ADD,\n value: {\n element: prev,\n operation: op,\n },\n });\n }\n } else {\n const stackOperation = new StackOperation(this.operationService, [operation]);\n this._pushStackOperation(stackOperation);\n }\n\n return res;\n }\n\n getHistoryOperations(): Operation<unknown>[] {\n return this.historyManager.historyStack.items\n .reverse()\n .map((item) =>\n item.operations.map((o) => ({\n ...pick(o, ['type', 'value']),\n label: o.label || o.type,\n }))\n )\n .flat();\n }\n\n async undo(): Promise<void> {\n await this.undoRedoService.undo();\n }\n\n async redo(): Promise<void> {\n await this.undoRedoService.redo();\n }\n\n canUndo(): boolean {\n return this.undoRedoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.undoRedoService.canRedo();\n }\n\n getSnapshot(): unknown {\n return this.config.getSnapshot();\n }\n\n getRecords(): Promise<HistoryRecord[]> {\n throw new Error('Method not implemented.');\n }\n\n restore(historyRecord: HistoryRecord): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n clear() {\n this.undoRedoService.clear();\n }\n\n dispose(): void {\n this._willDisposeEmitter.fire(this);\n this._toDispose.dispose();\n }\n\n private _canPush() {\n if (this._locked) {\n return false;\n }\n return this.undoRedoService.canPush();\n }\n\n private _pushStackOperation(stackOperation: StackOperation) {\n this.undoRedoService.pushElement(stackOperation);\n this.undoRedoService.clearRedoStack();\n }\n\n private _shouldMerge(operation: Operation, prev: IUndoRedoElement, operationMeta: OperationMeta) {\n if (!prev) {\n return false;\n }\n\n if (this._transacting) {\n return true;\n }\n return (\n operationMeta.shouldMerge &&\n operationMeta.shouldMerge(operation, prev.getLastOperation(), prev as StackOperation)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { Operation, OperationWithId } from '../operation';\nimport { IUndoRedoElement, UndoRedoChangeType } from './types';\n\nexport class StackOperation implements IUndoRedoElement {\n label?: string | undefined;\n\n description?: string | undefined;\n\n private _operations: OperationWithId[];\n\n private _toDispose = new DisposableCollection();\n\n private _timestamp: number = Date.now();\n\n private _operationService: OperationService;\n\n private _id: string;\n\n get id() {\n return this._id;\n }\n\n constructor(operationService: OperationService, operations: Operation[] = []) {\n this._operationService = operationService;\n this._operations = operations.map((op) => this._operation(op));\n this._id = operationService.config.generateId();\n }\n\n getTimestamp(): number {\n return this._timestamp;\n }\n\n pushOperation(operation: Operation): OperationWithId {\n const op = this._operation(operation);\n this._operations.push(op);\n return op;\n }\n\n getOperations(): Operation[] {\n return this._operations;\n }\n\n getChangeOperations(type: UndoRedoChangeType): Operation[] {\n if (type === UndoRedoChangeType.UNDO) {\n return this._operationService.inverseOperations(this._operations);\n }\n return this._operations;\n }\n\n getFirstOperation(): Operation {\n return this._operations[0];\n }\n\n getLastOperation(): Operation<unknown> {\n return this._operations[this._operations.length - 1];\n }\n\n async undo(): Promise<void> {\n const inverseOps = this._operationService.inverseOperations(this._operations);\n\n for (const op of inverseOps) {\n await this._apply(op);\n }\n }\n\n async redo(): Promise<void> {\n for (const op of this._operations) {\n await this._apply(op);\n }\n }\n\n revert(type: UndoRedoChangeType): void | Promise<void> {\n let operations: Operation[] = this._operations;\n\n if (type !== UndoRedoChangeType.UNDO) {\n operations = this._operations.map((op) => this._inverse(op)).reverse();\n }\n\n for (const op of operations) {\n this._apply(op);\n }\n }\n\n private _inverse(op: Operation): Operation {\n return this._operationService.inverseOperation(op);\n }\n\n private async _apply(op: Operation) {\n await this._operationService.applyOperation(op);\n }\n\n private _operation(op: Operation) {\n return {\n ...op,\n value: cloneDeep(op.value),\n id: this._operationService.config.generateId(),\n };\n }\n\n dispose(): void {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport { type UndoRedoChangeEvent } from './types';\nimport {\n type IHistoryManager,\n type HistoryStackItem,\n UndoRedoChangeType,\n HistoryMergeEventType,\n HistoryMergeEvent,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryStack } from './history-stack';\nimport { type HistoryService } from './history-service';\n\n@injectable()\nexport class HistoryManager implements IHistoryManager {\n @inject(HistoryStack) readonly historyStack: HistoryStack;\n\n @inject(HistoryConfig) readonly historyConfig: HistoryConfig;\n\n private _historyServices = new Map<HistoryService, Disposable>();\n\n private _toDispose = new DisposableCollection();\n\n registerHistoryService(service: HistoryService): void {\n const toDispose = new DisposableCollection();\n toDispose.pushAll([\n service.undoRedoService.onChange((event: UndoRedoChangeEvent) => {\n if (event.type === UndoRedoChangeType.CLEAR) {\n return;\n }\n\n const { type, element } = event;\n const operations = element.getChangeOperations(type);\n const historyStackItem: HistoryStackItem = {\n id:\n type === UndoRedoChangeType.PUSH\n ? (element as StackOperation).id\n : this.historyConfig.generateId(),\n type,\n uri: service.context.uri,\n operations,\n timestamp: Date.now(),\n };\n this.historyStack.add(service, historyStackItem);\n }),\n service.onMerge((event) => {\n this._handleMerge(service, event);\n }),\n ]);\n this._historyServices.set(service, toDispose);\n\n this._toDispose.push(\n service.onWillDispose(() => {\n this.unregisterHistoryService(service);\n })\n );\n }\n\n unregisterHistoryService(service: HistoryService): void {\n const disposable = this._historyServices.get(service);\n if (!disposable) {\n return;\n }\n disposable.dispose();\n this._historyServices.delete(service);\n }\n\n getHistoryServiceByURI(uri: string) {\n for (const service of this._historyServices.keys()) {\n if (service.context.uri === uri) {\n return service;\n }\n }\n }\n\n getFirstHistoryService() {\n for (const service of this._historyServices.keys()) {\n return service;\n }\n }\n\n dispose(): void {\n this._toDispose.dispose();\n this.historyStack.dispose();\n\n this._historyServices.forEach((service) => service.dispose());\n this._historyServices.clear();\n }\n\n _handleMerge(service: HistoryService, event: HistoryMergeEvent) {\n const { element, operation } = event.value;\n\n const find = this.historyStack.findById((element as StackOperation).id);\n\n if (!find) {\n return;\n }\n\n if (!(operation as OperationWithId).id) {\n console.warn('no operation id found');\n return;\n }\n\n if (event.type === HistoryMergeEventType.UPDATE) {\n this.historyStack.updateOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n\n if (event.type === HistoryMergeEventType.ADD) {\n this.historyStack.addOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { injectable, inject } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation, OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport {\n type HistoryItem,\n HistoryStackChangeType,\n type HistoryStackItem,\n HistoryStackChangeEvent,\n UndoRedoChangeType,\n} from './types';\nimport { type HistoryService } from './history-service';\n\n/**\n * 历史栈,聚合所有历史操作\n */\n@injectable()\nexport class HistoryStack {\n @inject(HistoryConfig)\n historyConfig: HistoryConfig;\n\n private _items: HistoryItem[] = [];\n\n readonly onChangeEmitter = new Emitter<HistoryStackChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n limit = 100;\n\n constructor() {\n this._toDispose.push(this.onChangeEmitter);\n }\n\n get items(): HistoryItem[] {\n return this._items;\n }\n\n add(service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items.unshift(historyItem);\n if (this._items.length > this.limit) {\n this._items.pop();\n }\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD,\n value: historyItem,\n service,\n });\n return historyItem;\n }\n\n findById(id: string): HistoryItem | undefined {\n return this._items.find((item) => item.id === id);\n }\n\n changeByIndex(index: number, service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items[index] = historyItem;\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE,\n value: historyItem,\n service,\n });\n }\n\n addOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.push(newOperatopn);\n\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n updateOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n const index = historyItem.operations.findIndex((op) => op.id === op.id);\n if (index < 0) {\n console.warn('no operation found');\n return;\n }\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.splice(index, 1, newOperatopn);\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n clear() {\n this._items = [];\n }\n\n dispose() {\n this._items = [];\n this._toDispose.dispose();\n }\n\n private _getHistoryItem(service: HistoryService, item: HistoryStackItem): HistoryItem {\n return {\n ...item,\n uri: service.context.uri,\n time: HistoryStack.dateFormat(item.timestamp),\n operations: item.operations.map((op) =>\n this._getHistoryOperation(service, op, item.type !== UndoRedoChangeType.PUSH)\n ),\n };\n }\n\n private _getHistoryOperation(\n service: HistoryService,\n op: Operation,\n generateId: boolean = false\n ): HistoryOperation {\n let id;\n if (generateId) {\n id = this.historyConfig.generateId();\n } else {\n const oldId = (op as OperationWithId).id;\n if (!oldId) {\n throw new Error('no operation id found');\n }\n id = oldId;\n }\n\n return {\n ...cloneDeep(op),\n id,\n label: service.operationService.getOperationLabel(op),\n description: service.operationService.getOperationDescription(op),\n timestamp: Date.now(),\n };\n }\n\n static dateFormat(timestamp: number) {\n return new Date(timestamp).toLocaleString();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { OperationRegistry, OperationService } from './operation';\nimport { HistoryContext } from './history-context';\nimport {\n HistoryService,\n HistoryStack,\n HistoryManager,\n UndoRedoService,\n HistoryConfig,\n} from './history';\n\nexport const HistoryContainerModule = new ContainerModule(\n (bind, _unbind, _isBound, _rebind, _unbindAsync, onActivation, _onDeactivation) => {\n bind(OperationRegistry).toSelf().inSingletonScope();\n bind(OperationService).toSelf().inSingletonScope();\n bind(UndoRedoService).toSelf().inSingletonScope();\n bind(HistoryService).toSelf().inSingletonScope();\n bind(HistoryContext).toSelf().inSingletonScope();\n bind(HistoryManager).toSelf().inSingletonScope();\n bind(HistoryStack).toSelf().inSingletonScope();\n bind(HistoryConfig).toSelf().inSingletonScope();\n\n onActivation(HistoryService, (ctx, historyService) => {\n let historyManager;\n\n if (ctx.container?.parent?.isBound(HistoryManager)) {\n historyManager = ctx.container?.parent?.get(HistoryManager);\n } else {\n historyManager = ctx.container.get(HistoryManager);\n }\n\n if (!historyManager) {\n return historyService;\n }\n\n historyService.historyManager = historyManager;\n historyManager.registerHistoryService(historyService);\n return historyService;\n });\n }\n);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { Operation, OperationService } from './operation';\nimport { HistoryContainerModule } from './history-container-module';\n\nexport interface HistoryPluginOptions<T = PluginContext> {\n enable?: boolean;\n enableChangeNode?: boolean;\n onApply?: (ctx: T, operation: Operation) => void;\n}\n\nexport const createHistoryPlugin = definePluginCreator<HistoryPluginOptions>({\n onInit: (ctx, opts) => {\n if (opts.onApply) {\n ctx.get(OperationService).onApply(opts.onApply.bind(null, ctx));\n }\n },\n containerModules: [HistoryContainerModule],\n});\n"],"mappings":"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","names":["injectable","postConstruct","DisposableCollection","injectable","injectable","injectable","injectable","DisposableCollection","postConstruct","injectable","injectable","Emitter","DisposableCollection","UndoRedoChangeType","HistoryStackChangeType","HistoryMergeEventType","Emitter","DisposableCollection","injectable","injectable","inject","postConstruct","DisposableCollection","Emitter","DisposableCollection","DisposableCollection","inject","injectable","DisposableCollection","cloneDeep","injectable","inject","DisposableCollection","Emitter","Emitter","DisposableCollection","op","cloneDeep","inject","injectable","DisposableCollection","inject","injectable","DisposableCollection","Emitter","operation","inject","postConstruct","injectable"]}
package/dist/index.d.mts CHANGED
@@ -675,6 +675,7 @@ declare const HistoryContainerModule: ContainerModule;
675
675
 
676
676
  interface HistoryPluginOptions<T = PluginContext> {
677
677
  enable?: boolean;
678
+ enableChangeNode?: boolean;
678
679
  onApply?: (ctx: T, operation: Operation) => void;
679
680
  }
680
681
  declare const createHistoryPlugin: _flowgram_ai_core.PluginCreator<HistoryPluginOptions<PluginContext>>;
package/dist/index.d.ts CHANGED
@@ -675,6 +675,7 @@ declare const HistoryContainerModule: ContainerModule;
675
675
 
676
676
  interface HistoryPluginOptions<T = PluginContext> {
677
677
  enable?: boolean;
678
+ enableChangeNode?: boolean;
678
679
  onApply?: (ctx: T, operation: Operation) => void;
679
680
  }
680
681
  declare const createHistoryPlugin: _flowgram_ai_core.PluginCreator<HistoryPluginOptions<PluginContext>>;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/operation/operation-contribution.ts","../src/operation/operation-registry.ts","../src/operation/operation-service.ts","../src/history-context.ts","../src/history-config.ts","../src/history/undo-redo-service.ts","../src/history/types.ts","../src/history/history-service.ts","../src/history/stack-operation.ts","../src/history/history-manager.ts","../src/history/history-stack.ts","../src/history-container-module.ts","../src/create-history-plugin.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './operation';\nexport * from './history';\nexport * from './history-container-module';\nexport * from './create-history-plugin';\nexport * from './history-context';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, multiInject, optional, postConstruct } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationMeta } from './types';\nimport { OperationContribution } from './operation-contribution';\n\n@injectable()\nexport class OperationRegistry {\n private readonly _operationMetas: Map<string, OperationMeta> = new Map();\n\n @multiInject(OperationContribution)\n @optional()\n protected readonly contributions: OperationContribution[] = [];\n\n @postConstruct()\n protected init() {\n for (const contrib of this.contributions) {\n contrib.registerOperationMeta?.(this);\n }\n }\n\n /**\n * 注册操作的元数据\n * @param operationMeta 操作的元数据\n * @returns 销毁函数\n */\n registerOperationMeta(operationMeta: OperationMeta): Disposable {\n if (this._operationMetas.has(operationMeta.type)) {\n console.warn(`A operation meta ${operationMeta.type} is already registered.`);\n return Disposable.NULL;\n }\n const toDispose = new DisposableCollection(this._doRegisterOperationMetaMeta(operationMeta));\n return toDispose;\n }\n\n /**\n * 获取操作的元数据\n * @param type 操作类型\n * @returns 操作的元数据\n */\n getOperationMeta(type: string): OperationMeta | undefined {\n return this._operationMetas.get(type);\n }\n\n private _doRegisterOperationMetaMeta(operationMeta: OperationMeta): Disposable {\n this._operationMetas.set(operationMeta.type, operationMeta);\n return {\n dispose: () => {\n this._operationMetas.delete(operationMeta.type);\n },\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { Operation } from './types';\nimport { OperationRegistry } from './operation-registry';\n\n@injectable()\nexport class OperationService {\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n config: HistoryConfig;\n\n readonly applyEmitter = new Emitter<Operation>();\n\n readonly onApply = this.applyEmitter.event;\n\n private _toDispose = new DisposableCollection();\n\n @postConstruct()\n init() {\n this._toDispose.push(this.applyEmitter);\n }\n\n /**\n * 执行操作\n * @param op\n * @returns\n */\n applyOperation(op: Operation, options?: { noApply?: boolean }): any {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n\n let res;\n if (!options?.noApply) {\n res = meta.apply(op, this.context.source);\n }\n\n this.applyEmitter.fire(op);\n\n return res;\n }\n\n /**\n * 根据操作类型获取操作的label\n * @param operation 操作\n * @returns\n */\n getOperationLabel(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getLabel) {\n return operationMeta.getLabel(operation, this.context.source);\n }\n }\n\n /**\n * 根据操作类型获取操作的description\n * @param operation 操作\n * @returns\n */\n getOperationDescription(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getDescription) {\n return operationMeta.getDescription(operation, this.context.source);\n }\n }\n\n /**\n * 操作取反\n * @param operations\n * @returns\n */\n inverseOperations(operations: Operation[]) {\n return operations.map(op => this.inverseOperation(op)).reverse();\n }\n\n inverseOperation(op: Operation): Operation {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n return meta.inverse(op);\n }\n\n dispose() {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryContext {\n /**\n * 所属uri\n */\n uri?: string;\n\n /**\n * 操作触发的源对象,如编辑器对象\n */\n source?: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { Emitter, DisposableCollection } from '@flowgram.ai/utils';\n\nimport {\n IUndoRedoElement,\n IUndoRedoService,\n UndoRedoChangeType,\n UndoRedoChangeEvent,\n UndoRedoClearEvent,\n} from './types';\n\n@injectable()\nexport class UndoRedoService implements IUndoRedoService {\n private _undoStack: IUndoRedoElement[];\n\n private _redoStack: IUndoRedoElement[];\n\n private _undoing: boolean = false;\n\n private _redoing: boolean = false;\n\n private _limit: number = 100;\n\n protected onChangeEmitter = new Emitter<UndoRedoChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n readonly _toDispose = new DisposableCollection();\n\n constructor() {\n this._undoStack = [];\n this._redoStack = [];\n this._toDispose.push(this.onChangeEmitter);\n }\n\n setLimit(limit: number) {\n this._limit = limit;\n }\n\n pushElement(element: IUndoRedoElement): void {\n this._redoStack = [];\n this._stackPush(this._undoStack, element);\n this._toDispose.push(element);\n this._emitChange(UndoRedoChangeType.PUSH, element);\n }\n\n getUndoStack() {\n return this._undoStack;\n }\n\n getRedoStack() {\n return this._redoStack;\n }\n\n getLastElement() {\n return this._undoStack[this._undoStack.length - 1];\n }\n\n /**\n * 执行undo\n * @returns void\n */\n async undo(): Promise<void> {\n if (!this.canUndo()) {\n return;\n }\n\n if (this._undoing) {\n return;\n }\n this._undoing = true;\n\n const item = this._undoStack.pop() as IUndoRedoElement;\n\n try {\n await item.undo();\n } finally {\n this._stackPush(this._redoStack, item);\n this._emitChange(UndoRedoChangeType.UNDO, item);\n this._undoing = false;\n }\n }\n\n /**\n * 执行redo\n * @returns void\n */\n async redo(): Promise<void> {\n if (!this.canRedo()) {\n return;\n }\n\n if (this._redoing) {\n return;\n }\n this._redoing = true;\n\n const item = this._redoStack.pop() as IUndoRedoElement;\n\n try {\n await item.redo();\n } finally {\n this._stackPush(this._undoStack, item);\n this._emitChange(UndoRedoChangeType.REDO, item);\n this._redoing = false;\n }\n }\n\n /**\n * 是否可undo\n * @returns true代表可以,false代表不可以\n */\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n /**\n * 是否可redo\n * @returns true代表可以,false代表不可以\n */\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /**\n * 是否可以push\n * @returns true代表可以,false代表不可以\n */\n canPush(): boolean {\n return !this._redoing && !this._undoing;\n }\n\n /**\n * 清空\n */\n clear() {\n this.clearRedoStack();\n this.clearUndoStack();\n this._emitChange(UndoRedoChangeType.CLEAR);\n }\n\n /**\n * 清空redo栈\n */\n clearRedoStack(): void {\n this._redoStack.forEach(element => {\n element.dispose();\n });\n this._redoStack = [];\n }\n\n /**\n * 清空undo栈\n */\n clearUndoStack(): void {\n this._undoStack.forEach(element => {\n element.dispose();\n });\n this._undoStack = [];\n }\n\n /**\n * 销毁\n */\n dispose(): void {\n this.clear();\n this._toDispose.dispose();\n }\n\n private _stackPush(stack: IUndoRedoElement[], element: IUndoRedoElement) {\n stack.push(element);\n if (stack.length > this._limit) {\n stack.shift();\n }\n }\n\n private _emitChange(type: UndoRedoChangeType, element?: IUndoRedoElement) {\n if (element) {\n this.onChangeEmitter.fire({ type, element });\n } else {\n this.onChangeEmitter.fire({ type } as UndoRedoClearEvent);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation } from '../operation';\nimport { HistoryService } from './history-service';\n\nexport interface HistoryRecord {\n snapshot: any;\n stack: any[];\n}\n\nexport interface HistoryItem extends HistoryStackItem {\n id: string;\n time: string;\n operations: HistoryOperation[];\n}\n\n/**\n * 历史服务管理\n */\nexport interface IHistoryManager {\n /**\n * 注册历史服务\n * @param service 历史服务示例\n */\n registerHistoryService(service: IHistoryService): void;\n /**\n * 取消注册历史服务\n * @param service 历史服务示例\n */\n unregisterHistoryService(service: HistoryService): void;\n}\n\n/**\n * 历史服务\n */\nexport interface IHistoryService extends Disposable {\n /**\n * 添加操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): void | Promise<void>;\n /**\n * 获取所有历史操作\n */\n getHistoryOperations(): Operation[];\n /**\n * 撤回\n */\n undo(): void | Promise<void>;\n /**\n * 重做\n */\n redo(): void | Promise<void>;\n /**\n * 是否有可撤销的操作\n */\n canUndo(): boolean;\n /**\n * 是否有可重做的操作\n */\n canRedo(): boolean;\n /**\n * 获取历史记录\n */\n getRecords(): Promise<HistoryRecord[]>;\n /**\n * 根据历史版本重新存储历史记录\n * @param historyRecord 历史记录\n */\n restore(historyRecord: HistoryRecord): Promise<void>;\n /**\n * 清空undo/redo\n */\n clear(): void;\n /**\n * 最大数量限制\n * @param num 数量\n */\n limit(num: number): void;\n /**\n * 返回快照\n */\n getSnapshot(): unknown;\n}\n\nexport interface IOperationService {\n pushOperation(operation: Operation): void;\n}\n\n/**\n * UndoRedo服务\n */\nexport interface IUndoRedoService extends Disposable {\n /**\n * 添加一个undo/redo元素\n * @param element 可undo/redo的元素\n */\n pushElement(element: IUndoRedoElement): void;\n /**\n * 获取最后一个可undo的元素\n */\n getLastElement(): IUndoRedoElement;\n /**\n * 获取undo栈\n */\n getUndoStack(): IUndoRedoElement[];\n /**\n * 获取redo栈\n */\n getRedoStack(): IUndoRedoElement[];\n /**\n * 清空redo栈\n */\n clearRedoStack(): void;\n /**\n * 是否可undo\n */\n canUndo(): boolean;\n /**\n * 执行undo\n */\n undo(): Promise<void> | void;\n /**\n * 是否可redo\n */\n canRedo(): boolean;\n /**\n * 执行redo\n */\n redo(): Promise<void> | void;\n /**\n * 清空 undo和redo栈\n */\n clear(): void;\n}\n\n/**\n * UndoRedo元素\n */\nexport interface IUndoRedoElement extends Disposable {\n /**\n * 操作标题\n */\n readonly label?: string;\n /**\n * 操作描述\n */\n readonly description?: string;\n /**\n * 撤销\n */\n undo(): Promise<void> | void;\n /**\n * 重做\n */\n redo(): Promise<void> | void;\n /**\n * 添加一个操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): Operation;\n /**\n * 获取所有操作\n */\n getOperations(): Operation[];\n /**\n * 获取第一个操作\n */\n getFirstOperation(): Operation;\n /**\n * 获取最后一个操作\n */\n getLastOperation(): Operation;\n /**\n * 获取修改的操作\n */\n getChangeOperations(type: UndoRedoChangeType): Operation[];\n}\n\n/**\n * 操作注册\n */\nexport interface IOperationRegistry {\n register(type: string, factory: IUndoRedoElementFactory<unknown>): void;\n}\n\n/**\n * 操作工厂\n */\nexport type IUndoRedoElementFactory<OperationValue> = (\n operation: Operation<OperationValue>\n) => IUndoRedoElement;\n\n/**\n * undo redo 类型\n */\nexport enum UndoRedoChangeType {\n UNDO = 'undo',\n REDO = 'redo',\n PUSH = 'push',\n CLEAR = 'clear',\n}\n\n/**\n * 带element的事件\n */\nexport interface UndoRedoChangeElementEvent {\n type: UndoRedoChangeType.PUSH | UndoRedoChangeType.UNDO | UndoRedoChangeType.REDO;\n element: IUndoRedoElement;\n}\n/**\n * 清空事件\n */\nexport interface UndoRedoClearEvent {\n type: UndoRedoChangeType.CLEAR;\n}\n/**\n * undo redo变化事件\n */\nexport type UndoRedoChangeEvent = UndoRedoChangeElementEvent | UndoRedoClearEvent;\n\nexport interface HistoryStackItem {\n id: string;\n type: UndoRedoChangeType;\n timestamp: number;\n operations: Operation[];\n uri?: string;\n}\n\n/**\n * 历史栈变化类型\n */\nexport enum HistoryStackChangeType {\n ADD = 'add',\n UPDATE = 'update',\n CLEAR = 'clear',\n ADD_OPERATION = 'add_operation',\n UPDATE_OPERATION = 'update_operation',\n}\n\n/**\n * 历史栈变化事件基础\n */\nexport interface HistoryStackBaseEvent {\n type: HistoryStackChangeType;\n value?: any;\n service: HistoryService;\n}\n\n/**\n * 添加历史事件\n */\nexport interface HistoryStackAddEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD;\n value: HistoryItem;\n}\n\n/**\n * 更新历史事件\n */\nexport interface HistoryStackUpdateEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE;\n value: HistoryItem;\n}\n\n/**\n * 添加操作事件\n */\nexport interface HistoryStackAddOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 更新操作事件\n */\nexport interface HistoryStackUpdateOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 历史记录变化事件\n */\nexport type HistoryStackChangeEvent =\n | HistoryStackAddEvent\n | HistoryStackUpdateEvent\n | HistoryStackAddOperationEvent\n | HistoryStackUpdateOperationEvent;\n\nexport enum HistoryMergeEventType {\n ADD = 'ADD',\n UPDATE = 'UPDATE',\n}\n\n/**\n * 历史合并事件\n */\nexport type HistoryMergeEvent =\n | {\n type: HistoryMergeEventType.ADD;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n };\n }\n | {\n type: HistoryMergeEventType.UPDATE;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n value: any;\n };\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { pick } from 'lodash-es';\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { OperationMeta, OperationRegistry, PushOperationOptions } from '../operation';\nimport { Operation } from '../operation';\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { UndoRedoService } from './undo-redo-service';\nimport {\n HistoryMergeEvent,\n HistoryMergeEventType,\n HistoryRecord,\n IHistoryService,\n IUndoRedoElement,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryManager } from './history-manager';\n\n@injectable()\nexport class HistoryService implements IHistoryService {\n @inject(UndoRedoService)\n readonly undoRedoService: UndoRedoService;\n\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(OperationService)\n readonly operationService: OperationService;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n readonly config: HistoryConfig;\n\n @inject(HistoryManager)\n historyManager: HistoryManager;\n\n private _toDispose = new DisposableCollection();\n\n private _transacting: boolean = false;\n\n private _transactOperation: StackOperation | null = null;\n\n private _locked: boolean = false;\n\n private _willDisposeEmitter = new Emitter<HistoryService>();\n\n private _mergeEmitter = new Emitter<HistoryMergeEvent>();\n\n onWillDispose = this._willDisposeEmitter.event;\n\n onMerge = this._mergeEmitter.event;\n\n get onApply() {\n return this.operationService.onApply;\n }\n\n @postConstruct()\n init() {\n this._toDispose.push(this._willDisposeEmitter);\n this._toDispose.push(this._mergeEmitter);\n }\n\n start() {\n this._locked = false;\n }\n\n stop() {\n this._locked = true;\n }\n\n limit(num: number) {\n this.undoRedoService.setLimit(num);\n }\n\n startTransaction() {\n if (this._transacting) {\n return;\n }\n\n this._transacting = true;\n const stackOperation = new StackOperation(this.operationService, []);\n this._transactOperation = stackOperation;\n }\n\n endTransaction() {\n const stackOperation = this._transactOperation;\n if (!stackOperation) {\n return;\n }\n if (stackOperation.getOperations().length !== 0) {\n this._pushStackOperation(stackOperation);\n }\n\n this._transactOperation = null;\n this._transacting = false;\n }\n\n transact(transaction: () => void) {\n if (this._transacting) {\n return;\n }\n this.startTransaction();\n transaction();\n this.endTransaction();\n }\n\n pushOperation(operation: Operation, options?: PushOperationOptions): any {\n if (!this._canPush()) {\n return;\n }\n\n const prev = this._transactOperation || this.undoRedoService.getLastElement();\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type) as OperationMeta;\n\n if (!operationMeta) {\n throw new Error(`Operation meta ${operation.type} has not registered.`);\n }\n\n if (operationMeta.shouldSave && !operationMeta.shouldSave(operation)) {\n return operationMeta.apply(operation, this.context.source);\n }\n\n const res = this.operationService.applyOperation(operation, { noApply: options?.noApply });\n\n if (operationMeta.getURI && !operation.uri) {\n operation.uri = operationMeta.getURI(operation, this.context.source);\n }\n\n const shouldMerge = this._shouldMerge(operation, prev, operationMeta);\n\n if (shouldMerge) {\n if (typeof shouldMerge === 'object') {\n const operation = prev.getLastOperation();\n operation.value = shouldMerge.value;\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.UPDATE,\n value: {\n element: prev,\n operation: operation,\n value: shouldMerge.value,\n },\n });\n } else {\n const op = prev.pushOperation(operation);\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.ADD,\n value: {\n element: prev,\n operation: op,\n },\n });\n }\n } else {\n const stackOperation = new StackOperation(this.operationService, [operation]);\n this._pushStackOperation(stackOperation);\n }\n\n return res;\n }\n\n getHistoryOperations(): Operation<unknown>[] {\n return this.historyManager.historyStack.items\n .reverse()\n .map((item) =>\n item.operations.map((o) => ({\n ...pick(o, ['type', 'value']),\n label: o.label || o.type,\n }))\n )\n .flat();\n }\n\n async undo(): Promise<void> {\n await this.undoRedoService.undo();\n }\n\n async redo(): Promise<void> {\n await this.undoRedoService.redo();\n }\n\n canUndo(): boolean {\n return this.undoRedoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.undoRedoService.canRedo();\n }\n\n getSnapshot(): unknown {\n return this.config.getSnapshot();\n }\n\n getRecords(): Promise<HistoryRecord[]> {\n throw new Error('Method not implemented.');\n }\n\n restore(historyRecord: HistoryRecord): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n clear() {\n this.undoRedoService.clear();\n }\n\n dispose(): void {\n this._willDisposeEmitter.fire(this);\n this._toDispose.dispose();\n }\n\n private _canPush() {\n if (this._locked) {\n return false;\n }\n return this.undoRedoService.canPush();\n }\n\n private _pushStackOperation(stackOperation: StackOperation) {\n this.undoRedoService.pushElement(stackOperation);\n this.undoRedoService.clearRedoStack();\n }\n\n private _shouldMerge(operation: Operation, prev: IUndoRedoElement, operationMeta: OperationMeta) {\n if (!prev) {\n return false;\n }\n\n if (this._transacting) {\n return true;\n }\n return (\n operationMeta.shouldMerge &&\n operationMeta.shouldMerge(operation, prev.getLastOperation(), prev as StackOperation)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { Operation, OperationWithId } from '../operation';\nimport { IUndoRedoElement, UndoRedoChangeType } from './types';\n\nexport class StackOperation implements IUndoRedoElement {\n label?: string | undefined;\n\n description?: string | undefined;\n\n private _operations: OperationWithId[];\n\n private _toDispose = new DisposableCollection();\n\n private _timestamp: number = Date.now();\n\n private _operationService: OperationService;\n\n private _id: string;\n\n get id() {\n return this._id;\n }\n\n constructor(operationService: OperationService, operations: Operation[] = []) {\n this._operationService = operationService;\n this._operations = operations.map((op) => this._operation(op));\n this._id = operationService.config.generateId();\n }\n\n getTimestamp(): number {\n return this._timestamp;\n }\n\n pushOperation(operation: Operation): OperationWithId {\n const op = this._operation(operation);\n this._operations.push(op);\n return op;\n }\n\n getOperations(): Operation[] {\n return this._operations;\n }\n\n getChangeOperations(type: UndoRedoChangeType): Operation[] {\n if (type === UndoRedoChangeType.UNDO) {\n return this._operationService.inverseOperations(this._operations);\n }\n return this._operations;\n }\n\n getFirstOperation(): Operation {\n return this._operations[0];\n }\n\n getLastOperation(): Operation<unknown> {\n return this._operations[this._operations.length - 1];\n }\n\n async undo(): Promise<void> {\n const inverseOps = this._operationService.inverseOperations(this._operations);\n\n for (const op of inverseOps) {\n await this._apply(op);\n }\n }\n\n async redo(): Promise<void> {\n for (const op of this._operations) {\n await this._apply(op);\n }\n }\n\n revert(type: UndoRedoChangeType): void | Promise<void> {\n let operations: Operation[] = this._operations;\n\n if (type !== UndoRedoChangeType.UNDO) {\n operations = this._operations.map((op) => this._inverse(op)).reverse();\n }\n\n for (const op of operations) {\n this._apply(op);\n }\n }\n\n private _inverse(op: Operation): Operation {\n return this._operationService.inverseOperation(op);\n }\n\n private async _apply(op: Operation) {\n await this._operationService.applyOperation(op);\n }\n\n private _operation(op: Operation) {\n return {\n ...op,\n value: cloneDeep(op.value),\n id: this._operationService.config.generateId(),\n };\n }\n\n dispose(): void {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport { type UndoRedoChangeEvent } from './types';\nimport {\n type IHistoryManager,\n type HistoryStackItem,\n UndoRedoChangeType,\n HistoryMergeEventType,\n HistoryMergeEvent,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryStack } from './history-stack';\nimport { type HistoryService } from './history-service';\n\n@injectable()\nexport class HistoryManager implements IHistoryManager {\n @inject(HistoryStack) readonly historyStack: HistoryStack;\n\n @inject(HistoryConfig) readonly historyConfig: HistoryConfig;\n\n private _historyServices = new Map<HistoryService, Disposable>();\n\n private _toDispose = new DisposableCollection();\n\n registerHistoryService(service: HistoryService): void {\n const toDispose = new DisposableCollection();\n toDispose.pushAll([\n service.undoRedoService.onChange((event: UndoRedoChangeEvent) => {\n if (event.type === UndoRedoChangeType.CLEAR) {\n return;\n }\n\n const { type, element } = event;\n const operations = element.getChangeOperations(type);\n const historyStackItem: HistoryStackItem = {\n id:\n type === UndoRedoChangeType.PUSH\n ? (element as StackOperation).id\n : this.historyConfig.generateId(),\n type,\n uri: service.context.uri,\n operations,\n timestamp: Date.now(),\n };\n this.historyStack.add(service, historyStackItem);\n }),\n service.onMerge((event) => {\n this._handleMerge(service, event);\n }),\n ]);\n this._historyServices.set(service, toDispose);\n\n this._toDispose.push(\n service.onWillDispose(() => {\n this.unregisterHistoryService(service);\n })\n );\n }\n\n unregisterHistoryService(service: HistoryService): void {\n const disposable = this._historyServices.get(service);\n if (!disposable) {\n return;\n }\n disposable.dispose();\n this._historyServices.delete(service);\n }\n\n getHistoryServiceByURI(uri: string) {\n for (const service of this._historyServices.keys()) {\n if (service.context.uri === uri) {\n return service;\n }\n }\n }\n\n getFirstHistoryService() {\n for (const service of this._historyServices.keys()) {\n return service;\n }\n }\n\n dispose(): void {\n this._toDispose.dispose();\n this.historyStack.dispose();\n\n this._historyServices.forEach((service) => service.dispose());\n this._historyServices.clear();\n }\n\n _handleMerge(service: HistoryService, event: HistoryMergeEvent) {\n const { element, operation } = event.value;\n\n const find = this.historyStack.findById((element as StackOperation).id);\n\n if (!find) {\n return;\n }\n\n if (!(operation as OperationWithId).id) {\n console.warn('no operation id found');\n return;\n }\n\n if (event.type === HistoryMergeEventType.UPDATE) {\n this.historyStack.updateOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n\n if (event.type === HistoryMergeEventType.ADD) {\n this.historyStack.addOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { injectable, inject } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation, OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport {\n type HistoryItem,\n HistoryStackChangeType,\n type HistoryStackItem,\n HistoryStackChangeEvent,\n UndoRedoChangeType,\n} from './types';\nimport { type HistoryService } from './history-service';\n\n/**\n * 历史栈,聚合所有历史操作\n */\n@injectable()\nexport class HistoryStack {\n @inject(HistoryConfig)\n historyConfig: HistoryConfig;\n\n private _items: HistoryItem[] = [];\n\n readonly onChangeEmitter = new Emitter<HistoryStackChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n limit = 100;\n\n constructor() {\n this._toDispose.push(this.onChangeEmitter);\n }\n\n get items(): HistoryItem[] {\n return this._items;\n }\n\n add(service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items.unshift(historyItem);\n if (this._items.length > this.limit) {\n this._items.pop();\n }\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD,\n value: historyItem,\n service,\n });\n return historyItem;\n }\n\n findById(id: string): HistoryItem | undefined {\n return this._items.find((item) => item.id === id);\n }\n\n changeByIndex(index: number, service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items[index] = historyItem;\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE,\n value: historyItem,\n service,\n });\n }\n\n addOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.push(newOperatopn);\n\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n updateOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n const index = historyItem.operations.findIndex((op) => op.id === op.id);\n if (index < 0) {\n console.warn('no operation found');\n return;\n }\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.splice(index, 1, newOperatopn);\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n clear() {\n this._items = [];\n }\n\n dispose() {\n this._items = [];\n this._toDispose.dispose();\n }\n\n private _getHistoryItem(service: HistoryService, item: HistoryStackItem): HistoryItem {\n return {\n ...item,\n uri: service.context.uri,\n time: HistoryStack.dateFormat(item.timestamp),\n operations: item.operations.map((op) =>\n this._getHistoryOperation(service, op, item.type !== UndoRedoChangeType.PUSH)\n ),\n };\n }\n\n private _getHistoryOperation(\n service: HistoryService,\n op: Operation,\n generateId: boolean = false\n ): HistoryOperation {\n let id;\n if (generateId) {\n id = this.historyConfig.generateId();\n } else {\n const oldId = (op as OperationWithId).id;\n if (!oldId) {\n throw new Error('no operation id found');\n }\n id = oldId;\n }\n\n return {\n ...cloneDeep(op),\n id,\n label: service.operationService.getOperationLabel(op),\n description: service.operationService.getOperationDescription(op),\n timestamp: Date.now(),\n };\n }\n\n static dateFormat(timestamp: number) {\n return new Date(timestamp).toLocaleString();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { OperationRegistry, OperationService } from './operation';\nimport { HistoryContext } from './history-context';\nimport {\n HistoryService,\n HistoryStack,\n HistoryManager,\n UndoRedoService,\n HistoryConfig,\n} from './history';\n\nexport const HistoryContainerModule = new ContainerModule(\n (bind, _unbind, _isBound, _rebind, _unbindAsync, onActivation, _onDeactivation) => {\n bind(OperationRegistry).toSelf().inSingletonScope();\n bind(OperationService).toSelf().inSingletonScope();\n bind(UndoRedoService).toSelf().inSingletonScope();\n bind(HistoryService).toSelf().inSingletonScope();\n bind(HistoryContext).toSelf().inSingletonScope();\n bind(HistoryManager).toSelf().inSingletonScope();\n bind(HistoryStack).toSelf().inSingletonScope();\n bind(HistoryConfig).toSelf().inSingletonScope();\n\n onActivation(HistoryService, (ctx, historyService) => {\n let historyManager;\n\n if (ctx.container?.parent?.isBound(HistoryManager)) {\n historyManager = ctx.container?.parent?.get(HistoryManager);\n } else {\n historyManager = ctx.container.get(HistoryManager);\n }\n\n if (!historyManager) {\n return historyService;\n }\n\n historyService.historyManager = historyManager;\n historyManager.registerHistoryService(historyService);\n return historyService;\n });\n }\n);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { Operation, OperationService } from './operation';\nimport { HistoryContainerModule } from './history-container-module';\n\nexport interface HistoryPluginOptions<T = PluginContext> {\n enable?: boolean;\n onApply?: (ctx: T, operation: Operation) => void;\n}\n\nexport const createHistoryPlugin = definePluginCreator<HistoryPluginOptions>({\n onInit: (ctx, opts) => {\n if (opts.onApply) {\n ctx.get(OperationService).onApply(opts.onApply.bind(null, ctx));\n }\n },\n containerModules: [HistoryContainerModule],\n});\n"],"mappings":"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","names":["import_inversify","import_utils","import_inversify","import_inversify","import_inversify","import_utils","UndoRedoChangeType","HistoryStackChangeType","HistoryMergeEventType","import_lodash_es","import_inversify","import_utils","import_utils","import_inversify","import_utils","import_lodash_es","import_inversify","import_utils","op","operation","import_inversify"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/operation/operation-contribution.ts","../src/operation/operation-registry.ts","../src/operation/operation-service.ts","../src/history-context.ts","../src/history-config.ts","../src/history/undo-redo-service.ts","../src/history/types.ts","../src/history/history-service.ts","../src/history/stack-operation.ts","../src/history/history-manager.ts","../src/history/history-stack.ts","../src/history-container-module.ts","../src/create-history-plugin.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport * from './operation';\nexport * from './history';\nexport * from './history-container-module';\nexport * from './create-history-plugin';\nexport * from './history-context';\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, multiInject, optional, postConstruct } from 'inversify';\nimport { Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationMeta } from './types';\nimport { OperationContribution } from './operation-contribution';\n\n@injectable()\nexport class OperationRegistry {\n private readonly _operationMetas: Map<string, OperationMeta> = new Map();\n\n @multiInject(OperationContribution)\n @optional()\n protected readonly contributions: OperationContribution[] = [];\n\n @postConstruct()\n protected init() {\n for (const contrib of this.contributions) {\n contrib.registerOperationMeta?.(this);\n }\n }\n\n /**\n * 注册操作的元数据\n * @param operationMeta 操作的元数据\n * @returns 销毁函数\n */\n registerOperationMeta(operationMeta: OperationMeta): Disposable {\n if (this._operationMetas.has(operationMeta.type)) {\n console.warn(`A operation meta ${operationMeta.type} is already registered.`);\n return Disposable.NULL;\n }\n const toDispose = new DisposableCollection(this._doRegisterOperationMetaMeta(operationMeta));\n return toDispose;\n }\n\n /**\n * 获取操作的元数据\n * @param type 操作类型\n * @returns 操作的元数据\n */\n getOperationMeta(type: string): OperationMeta | undefined {\n return this._operationMetas.get(type);\n }\n\n private _doRegisterOperationMetaMeta(operationMeta: OperationMeta): Disposable {\n this._operationMetas.set(operationMeta.type, operationMeta);\n return {\n dispose: () => {\n this._operationMetas.delete(operationMeta.type);\n },\n };\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { Operation } from './types';\nimport { OperationRegistry } from './operation-registry';\n\n@injectable()\nexport class OperationService {\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n config: HistoryConfig;\n\n readonly applyEmitter = new Emitter<Operation>();\n\n readonly onApply = this.applyEmitter.event;\n\n private _toDispose = new DisposableCollection();\n\n @postConstruct()\n init() {\n this._toDispose.push(this.applyEmitter);\n }\n\n /**\n * 执行操作\n * @param op\n * @returns\n */\n applyOperation(op: Operation, options?: { noApply?: boolean }): any {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n\n let res;\n if (!options?.noApply) {\n res = meta.apply(op, this.context.source);\n }\n\n this.applyEmitter.fire(op);\n\n return res;\n }\n\n /**\n * 根据操作类型获取操作的label\n * @param operation 操作\n * @returns\n */\n getOperationLabel(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getLabel) {\n return operationMeta.getLabel(operation, this.context.source);\n }\n }\n\n /**\n * 根据操作类型获取操作的description\n * @param operation 操作\n * @returns\n */\n getOperationDescription(operation: Operation): string | undefined {\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type);\n\n if (operationMeta && operationMeta.getDescription) {\n return operationMeta.getDescription(operation, this.context.source);\n }\n }\n\n /**\n * 操作取反\n * @param operations\n * @returns\n */\n inverseOperations(operations: Operation[]) {\n return operations.map(op => this.inverseOperation(op)).reverse();\n }\n\n inverseOperation(op: Operation): Operation {\n const meta = this.operationRegistry.getOperationMeta(op.type);\n\n if (!meta) {\n throw new Error(`Operation meta ${op.type} has not registered.`);\n }\n return meta.inverse(op);\n }\n\n dispose() {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryContext {\n /**\n * 所属uri\n */\n uri?: string;\n\n /**\n * 操作触发的源对象,如编辑器对象\n */\n source?: unknown;\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\nimport { Emitter, DisposableCollection } from '@flowgram.ai/utils';\n\nimport {\n IUndoRedoElement,\n IUndoRedoService,\n UndoRedoChangeType,\n UndoRedoChangeEvent,\n UndoRedoClearEvent,\n} from './types';\n\n@injectable()\nexport class UndoRedoService implements IUndoRedoService {\n private _undoStack: IUndoRedoElement[];\n\n private _redoStack: IUndoRedoElement[];\n\n private _undoing: boolean = false;\n\n private _redoing: boolean = false;\n\n private _limit: number = 100;\n\n protected onChangeEmitter = new Emitter<UndoRedoChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n readonly _toDispose = new DisposableCollection();\n\n constructor() {\n this._undoStack = [];\n this._redoStack = [];\n this._toDispose.push(this.onChangeEmitter);\n }\n\n setLimit(limit: number) {\n this._limit = limit;\n }\n\n pushElement(element: IUndoRedoElement): void {\n this._redoStack = [];\n this._stackPush(this._undoStack, element);\n this._toDispose.push(element);\n this._emitChange(UndoRedoChangeType.PUSH, element);\n }\n\n getUndoStack() {\n return this._undoStack;\n }\n\n getRedoStack() {\n return this._redoStack;\n }\n\n getLastElement() {\n return this._undoStack[this._undoStack.length - 1];\n }\n\n /**\n * 执行undo\n * @returns void\n */\n async undo(): Promise<void> {\n if (!this.canUndo()) {\n return;\n }\n\n if (this._undoing) {\n return;\n }\n this._undoing = true;\n\n const item = this._undoStack.pop() as IUndoRedoElement;\n\n try {\n await item.undo();\n } finally {\n this._stackPush(this._redoStack, item);\n this._emitChange(UndoRedoChangeType.UNDO, item);\n this._undoing = false;\n }\n }\n\n /**\n * 执行redo\n * @returns void\n */\n async redo(): Promise<void> {\n if (!this.canRedo()) {\n return;\n }\n\n if (this._redoing) {\n return;\n }\n this._redoing = true;\n\n const item = this._redoStack.pop() as IUndoRedoElement;\n\n try {\n await item.redo();\n } finally {\n this._stackPush(this._undoStack, item);\n this._emitChange(UndoRedoChangeType.REDO, item);\n this._redoing = false;\n }\n }\n\n /**\n * 是否可undo\n * @returns true代表可以,false代表不可以\n */\n canUndo(): boolean {\n return this._undoStack.length > 0;\n }\n\n /**\n * 是否可redo\n * @returns true代表可以,false代表不可以\n */\n canRedo(): boolean {\n return this._redoStack.length > 0;\n }\n\n /**\n * 是否可以push\n * @returns true代表可以,false代表不可以\n */\n canPush(): boolean {\n return !this._redoing && !this._undoing;\n }\n\n /**\n * 清空\n */\n clear() {\n this.clearRedoStack();\n this.clearUndoStack();\n this._emitChange(UndoRedoChangeType.CLEAR);\n }\n\n /**\n * 清空redo栈\n */\n clearRedoStack(): void {\n this._redoStack.forEach(element => {\n element.dispose();\n });\n this._redoStack = [];\n }\n\n /**\n * 清空undo栈\n */\n clearUndoStack(): void {\n this._undoStack.forEach(element => {\n element.dispose();\n });\n this._undoStack = [];\n }\n\n /**\n * 销毁\n */\n dispose(): void {\n this.clear();\n this._toDispose.dispose();\n }\n\n private _stackPush(stack: IUndoRedoElement[], element: IUndoRedoElement) {\n stack.push(element);\n if (stack.length > this._limit) {\n stack.shift();\n }\n }\n\n private _emitChange(type: UndoRedoChangeType, element?: IUndoRedoElement) {\n if (element) {\n this.onChangeEmitter.fire({ type, element });\n } else {\n this.onChangeEmitter.fire({ type } as UndoRedoClearEvent);\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Disposable } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation } from '../operation';\nimport { HistoryService } from './history-service';\n\nexport interface HistoryRecord {\n snapshot: any;\n stack: any[];\n}\n\nexport interface HistoryItem extends HistoryStackItem {\n id: string;\n time: string;\n operations: HistoryOperation[];\n}\n\n/**\n * 历史服务管理\n */\nexport interface IHistoryManager {\n /**\n * 注册历史服务\n * @param service 历史服务示例\n */\n registerHistoryService(service: IHistoryService): void;\n /**\n * 取消注册历史服务\n * @param service 历史服务示例\n */\n unregisterHistoryService(service: HistoryService): void;\n}\n\n/**\n * 历史服务\n */\nexport interface IHistoryService extends Disposable {\n /**\n * 添加操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): void | Promise<void>;\n /**\n * 获取所有历史操作\n */\n getHistoryOperations(): Operation[];\n /**\n * 撤回\n */\n undo(): void | Promise<void>;\n /**\n * 重做\n */\n redo(): void | Promise<void>;\n /**\n * 是否有可撤销的操作\n */\n canUndo(): boolean;\n /**\n * 是否有可重做的操作\n */\n canRedo(): boolean;\n /**\n * 获取历史记录\n */\n getRecords(): Promise<HistoryRecord[]>;\n /**\n * 根据历史版本重新存储历史记录\n * @param historyRecord 历史记录\n */\n restore(historyRecord: HistoryRecord): Promise<void>;\n /**\n * 清空undo/redo\n */\n clear(): void;\n /**\n * 最大数量限制\n * @param num 数量\n */\n limit(num: number): void;\n /**\n * 返回快照\n */\n getSnapshot(): unknown;\n}\n\nexport interface IOperationService {\n pushOperation(operation: Operation): void;\n}\n\n/**\n * UndoRedo服务\n */\nexport interface IUndoRedoService extends Disposable {\n /**\n * 添加一个undo/redo元素\n * @param element 可undo/redo的元素\n */\n pushElement(element: IUndoRedoElement): void;\n /**\n * 获取最后一个可undo的元素\n */\n getLastElement(): IUndoRedoElement;\n /**\n * 获取undo栈\n */\n getUndoStack(): IUndoRedoElement[];\n /**\n * 获取redo栈\n */\n getRedoStack(): IUndoRedoElement[];\n /**\n * 清空redo栈\n */\n clearRedoStack(): void;\n /**\n * 是否可undo\n */\n canUndo(): boolean;\n /**\n * 执行undo\n */\n undo(): Promise<void> | void;\n /**\n * 是否可redo\n */\n canRedo(): boolean;\n /**\n * 执行redo\n */\n redo(): Promise<void> | void;\n /**\n * 清空 undo和redo栈\n */\n clear(): void;\n}\n\n/**\n * UndoRedo元素\n */\nexport interface IUndoRedoElement extends Disposable {\n /**\n * 操作标题\n */\n readonly label?: string;\n /**\n * 操作描述\n */\n readonly description?: string;\n /**\n * 撤销\n */\n undo(): Promise<void> | void;\n /**\n * 重做\n */\n redo(): Promise<void> | void;\n /**\n * 添加一个操作\n * @param operation 操作\n */\n pushOperation(operation: Operation): Operation;\n /**\n * 获取所有操作\n */\n getOperations(): Operation[];\n /**\n * 获取第一个操作\n */\n getFirstOperation(): Operation;\n /**\n * 获取最后一个操作\n */\n getLastOperation(): Operation;\n /**\n * 获取修改的操作\n */\n getChangeOperations(type: UndoRedoChangeType): Operation[];\n}\n\n/**\n * 操作注册\n */\nexport interface IOperationRegistry {\n register(type: string, factory: IUndoRedoElementFactory<unknown>): void;\n}\n\n/**\n * 操作工厂\n */\nexport type IUndoRedoElementFactory<OperationValue> = (\n operation: Operation<OperationValue>\n) => IUndoRedoElement;\n\n/**\n * undo redo 类型\n */\nexport enum UndoRedoChangeType {\n UNDO = 'undo',\n REDO = 'redo',\n PUSH = 'push',\n CLEAR = 'clear',\n}\n\n/**\n * 带element的事件\n */\nexport interface UndoRedoChangeElementEvent {\n type: UndoRedoChangeType.PUSH | UndoRedoChangeType.UNDO | UndoRedoChangeType.REDO;\n element: IUndoRedoElement;\n}\n/**\n * 清空事件\n */\nexport interface UndoRedoClearEvent {\n type: UndoRedoChangeType.CLEAR;\n}\n/**\n * undo redo变化事件\n */\nexport type UndoRedoChangeEvent = UndoRedoChangeElementEvent | UndoRedoClearEvent;\n\nexport interface HistoryStackItem {\n id: string;\n type: UndoRedoChangeType;\n timestamp: number;\n operations: Operation[];\n uri?: string;\n}\n\n/**\n * 历史栈变化类型\n */\nexport enum HistoryStackChangeType {\n ADD = 'add',\n UPDATE = 'update',\n CLEAR = 'clear',\n ADD_OPERATION = 'add_operation',\n UPDATE_OPERATION = 'update_operation',\n}\n\n/**\n * 历史栈变化事件基础\n */\nexport interface HistoryStackBaseEvent {\n type: HistoryStackChangeType;\n value?: any;\n service: HistoryService;\n}\n\n/**\n * 添加历史事件\n */\nexport interface HistoryStackAddEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD;\n value: HistoryItem;\n}\n\n/**\n * 更新历史事件\n */\nexport interface HistoryStackUpdateEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE;\n value: HistoryItem;\n}\n\n/**\n * 添加操作事件\n */\nexport interface HistoryStackAddOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.ADD_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 更新操作事件\n */\nexport interface HistoryStackUpdateOperationEvent extends HistoryStackBaseEvent {\n type: HistoryStackChangeType.UPDATE_OPERATION;\n value: {\n historyItem: HistoryItem;\n operation: HistoryOperation;\n };\n}\n\n/**\n * 历史记录变化事件\n */\nexport type HistoryStackChangeEvent =\n | HistoryStackAddEvent\n | HistoryStackUpdateEvent\n | HistoryStackAddOperationEvent\n | HistoryStackUpdateOperationEvent;\n\nexport enum HistoryMergeEventType {\n ADD = 'ADD',\n UPDATE = 'UPDATE',\n}\n\n/**\n * 历史合并事件\n */\nexport type HistoryMergeEvent =\n | {\n type: HistoryMergeEventType.ADD;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n };\n }\n | {\n type: HistoryMergeEventType.UPDATE;\n value: {\n element: IUndoRedoElement;\n operation: Operation;\n value: any;\n };\n };\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { pick } from 'lodash-es';\nimport { injectable, inject, postConstruct } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { OperationMeta, OperationRegistry, PushOperationOptions } from '../operation';\nimport { Operation } from '../operation';\nimport { HistoryContext } from '../history-context';\nimport { HistoryConfig } from '../history-config';\nimport { UndoRedoService } from './undo-redo-service';\nimport {\n HistoryMergeEvent,\n HistoryMergeEventType,\n HistoryRecord,\n IHistoryService,\n IUndoRedoElement,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryManager } from './history-manager';\n\n@injectable()\nexport class HistoryService implements IHistoryService {\n @inject(UndoRedoService)\n readonly undoRedoService: UndoRedoService;\n\n @inject(OperationRegistry)\n readonly operationRegistry: OperationRegistry;\n\n @inject(OperationService)\n readonly operationService: OperationService;\n\n @inject(HistoryContext)\n readonly context: HistoryContext;\n\n @inject(HistoryConfig)\n readonly config: HistoryConfig;\n\n @inject(HistoryManager)\n historyManager: HistoryManager;\n\n private _toDispose = new DisposableCollection();\n\n private _transacting: boolean = false;\n\n private _transactOperation: StackOperation | null = null;\n\n private _locked: boolean = false;\n\n private _willDisposeEmitter = new Emitter<HistoryService>();\n\n private _mergeEmitter = new Emitter<HistoryMergeEvent>();\n\n onWillDispose = this._willDisposeEmitter.event;\n\n onMerge = this._mergeEmitter.event;\n\n get onApply() {\n return this.operationService.onApply;\n }\n\n @postConstruct()\n init() {\n this._toDispose.push(this._willDisposeEmitter);\n this._toDispose.push(this._mergeEmitter);\n }\n\n start() {\n this._locked = false;\n }\n\n stop() {\n this._locked = true;\n }\n\n limit(num: number) {\n this.undoRedoService.setLimit(num);\n }\n\n startTransaction() {\n if (this._transacting) {\n return;\n }\n\n this._transacting = true;\n const stackOperation = new StackOperation(this.operationService, []);\n this._transactOperation = stackOperation;\n }\n\n endTransaction() {\n const stackOperation = this._transactOperation;\n if (!stackOperation) {\n return;\n }\n if (stackOperation.getOperations().length !== 0) {\n this._pushStackOperation(stackOperation);\n }\n\n this._transactOperation = null;\n this._transacting = false;\n }\n\n transact(transaction: () => void) {\n if (this._transacting) {\n return;\n }\n this.startTransaction();\n transaction();\n this.endTransaction();\n }\n\n pushOperation(operation: Operation, options?: PushOperationOptions): any {\n if (!this._canPush()) {\n return;\n }\n\n const prev = this._transactOperation || this.undoRedoService.getLastElement();\n const operationMeta = this.operationRegistry.getOperationMeta(operation.type) as OperationMeta;\n\n if (!operationMeta) {\n throw new Error(`Operation meta ${operation.type} has not registered.`);\n }\n\n if (operationMeta.shouldSave && !operationMeta.shouldSave(operation)) {\n return operationMeta.apply(operation, this.context.source);\n }\n\n const res = this.operationService.applyOperation(operation, { noApply: options?.noApply });\n\n if (operationMeta.getURI && !operation.uri) {\n operation.uri = operationMeta.getURI(operation, this.context.source);\n }\n\n const shouldMerge = this._shouldMerge(operation, prev, operationMeta);\n\n if (shouldMerge) {\n if (typeof shouldMerge === 'object') {\n const operation = prev.getLastOperation();\n operation.value = shouldMerge.value;\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.UPDATE,\n value: {\n element: prev,\n operation: operation,\n value: shouldMerge.value,\n },\n });\n } else {\n const op = prev.pushOperation(operation);\n this._mergeEmitter.fire({\n type: HistoryMergeEventType.ADD,\n value: {\n element: prev,\n operation: op,\n },\n });\n }\n } else {\n const stackOperation = new StackOperation(this.operationService, [operation]);\n this._pushStackOperation(stackOperation);\n }\n\n return res;\n }\n\n getHistoryOperations(): Operation<unknown>[] {\n return this.historyManager.historyStack.items\n .reverse()\n .map((item) =>\n item.operations.map((o) => ({\n ...pick(o, ['type', 'value']),\n label: o.label || o.type,\n }))\n )\n .flat();\n }\n\n async undo(): Promise<void> {\n await this.undoRedoService.undo();\n }\n\n async redo(): Promise<void> {\n await this.undoRedoService.redo();\n }\n\n canUndo(): boolean {\n return this.undoRedoService.canUndo();\n }\n\n canRedo(): boolean {\n return this.undoRedoService.canRedo();\n }\n\n getSnapshot(): unknown {\n return this.config.getSnapshot();\n }\n\n getRecords(): Promise<HistoryRecord[]> {\n throw new Error('Method not implemented.');\n }\n\n restore(historyRecord: HistoryRecord): Promise<void> {\n throw new Error('Method not implemented.');\n }\n\n clear() {\n this.undoRedoService.clear();\n }\n\n dispose(): void {\n this._willDisposeEmitter.fire(this);\n this._toDispose.dispose();\n }\n\n private _canPush() {\n if (this._locked) {\n return false;\n }\n return this.undoRedoService.canPush();\n }\n\n private _pushStackOperation(stackOperation: StackOperation) {\n this.undoRedoService.pushElement(stackOperation);\n this.undoRedoService.clearRedoStack();\n }\n\n private _shouldMerge(operation: Operation, prev: IUndoRedoElement, operationMeta: OperationMeta) {\n if (!prev) {\n return false;\n }\n\n if (this._transacting) {\n return true;\n }\n return (\n operationMeta.shouldMerge &&\n operationMeta.shouldMerge(operation, prev.getLastOperation(), prev as StackOperation)\n );\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationService } from '../operation/operation-service';\nimport { Operation, OperationWithId } from '../operation';\nimport { IUndoRedoElement, UndoRedoChangeType } from './types';\n\nexport class StackOperation implements IUndoRedoElement {\n label?: string | undefined;\n\n description?: string | undefined;\n\n private _operations: OperationWithId[];\n\n private _toDispose = new DisposableCollection();\n\n private _timestamp: number = Date.now();\n\n private _operationService: OperationService;\n\n private _id: string;\n\n get id() {\n return this._id;\n }\n\n constructor(operationService: OperationService, operations: Operation[] = []) {\n this._operationService = operationService;\n this._operations = operations.map((op) => this._operation(op));\n this._id = operationService.config.generateId();\n }\n\n getTimestamp(): number {\n return this._timestamp;\n }\n\n pushOperation(operation: Operation): OperationWithId {\n const op = this._operation(operation);\n this._operations.push(op);\n return op;\n }\n\n getOperations(): Operation[] {\n return this._operations;\n }\n\n getChangeOperations(type: UndoRedoChangeType): Operation[] {\n if (type === UndoRedoChangeType.UNDO) {\n return this._operationService.inverseOperations(this._operations);\n }\n return this._operations;\n }\n\n getFirstOperation(): Operation {\n return this._operations[0];\n }\n\n getLastOperation(): Operation<unknown> {\n return this._operations[this._operations.length - 1];\n }\n\n async undo(): Promise<void> {\n const inverseOps = this._operationService.inverseOperations(this._operations);\n\n for (const op of inverseOps) {\n await this._apply(op);\n }\n }\n\n async redo(): Promise<void> {\n for (const op of this._operations) {\n await this._apply(op);\n }\n }\n\n revert(type: UndoRedoChangeType): void | Promise<void> {\n let operations: Operation[] = this._operations;\n\n if (type !== UndoRedoChangeType.UNDO) {\n operations = this._operations.map((op) => this._inverse(op)).reverse();\n }\n\n for (const op of operations) {\n this._apply(op);\n }\n }\n\n private _inverse(op: Operation): Operation {\n return this._operationService.inverseOperation(op);\n }\n\n private async _apply(op: Operation) {\n await this._operationService.applyOperation(op);\n }\n\n private _operation(op: Operation) {\n return {\n ...op,\n value: cloneDeep(op.value),\n id: this._operationService.config.generateId(),\n };\n }\n\n dispose(): void {\n this._toDispose.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable } from 'inversify';\nimport { type Disposable, DisposableCollection } from '@flowgram.ai/utils';\n\nimport { OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport { type UndoRedoChangeEvent } from './types';\nimport {\n type IHistoryManager,\n type HistoryStackItem,\n UndoRedoChangeType,\n HistoryMergeEventType,\n HistoryMergeEvent,\n} from './types';\nimport { StackOperation } from './stack-operation';\nimport { HistoryStack } from './history-stack';\nimport { type HistoryService } from './history-service';\n\n@injectable()\nexport class HistoryManager implements IHistoryManager {\n @inject(HistoryStack) readonly historyStack: HistoryStack;\n\n @inject(HistoryConfig) readonly historyConfig: HistoryConfig;\n\n private _historyServices = new Map<HistoryService, Disposable>();\n\n private _toDispose = new DisposableCollection();\n\n registerHistoryService(service: HistoryService): void {\n const toDispose = new DisposableCollection();\n toDispose.pushAll([\n service.undoRedoService.onChange((event: UndoRedoChangeEvent) => {\n if (event.type === UndoRedoChangeType.CLEAR) {\n return;\n }\n\n const { type, element } = event;\n const operations = element.getChangeOperations(type);\n const historyStackItem: HistoryStackItem = {\n id:\n type === UndoRedoChangeType.PUSH\n ? (element as StackOperation).id\n : this.historyConfig.generateId(),\n type,\n uri: service.context.uri,\n operations,\n timestamp: Date.now(),\n };\n this.historyStack.add(service, historyStackItem);\n }),\n service.onMerge((event) => {\n this._handleMerge(service, event);\n }),\n ]);\n this._historyServices.set(service, toDispose);\n\n this._toDispose.push(\n service.onWillDispose(() => {\n this.unregisterHistoryService(service);\n })\n );\n }\n\n unregisterHistoryService(service: HistoryService): void {\n const disposable = this._historyServices.get(service);\n if (!disposable) {\n return;\n }\n disposable.dispose();\n this._historyServices.delete(service);\n }\n\n getHistoryServiceByURI(uri: string) {\n for (const service of this._historyServices.keys()) {\n if (service.context.uri === uri) {\n return service;\n }\n }\n }\n\n getFirstHistoryService() {\n for (const service of this._historyServices.keys()) {\n return service;\n }\n }\n\n dispose(): void {\n this._toDispose.dispose();\n this.historyStack.dispose();\n\n this._historyServices.forEach((service) => service.dispose());\n this._historyServices.clear();\n }\n\n _handleMerge(service: HistoryService, event: HistoryMergeEvent) {\n const { element, operation } = event.value;\n\n const find = this.historyStack.findById((element as StackOperation).id);\n\n if (!find) {\n return;\n }\n\n if (!(operation as OperationWithId).id) {\n console.warn('no operation id found');\n return;\n }\n\n if (event.type === HistoryMergeEventType.UPDATE) {\n this.historyStack.updateOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n\n if (event.type === HistoryMergeEventType.ADD) {\n this.historyStack.addOperation(\n service,\n (element as StackOperation).id,\n operation as OperationWithId\n );\n }\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { cloneDeep } from 'lodash-es';\nimport { injectable, inject } from 'inversify';\nimport { DisposableCollection, Emitter } from '@flowgram.ai/utils';\n\nimport { HistoryOperation, Operation, OperationWithId } from '../operation';\nimport { HistoryConfig } from '../history-config';\nimport {\n type HistoryItem,\n HistoryStackChangeType,\n type HistoryStackItem,\n HistoryStackChangeEvent,\n UndoRedoChangeType,\n} from './types';\nimport { type HistoryService } from './history-service';\n\n/**\n * 历史栈,聚合所有历史操作\n */\n@injectable()\nexport class HistoryStack {\n @inject(HistoryConfig)\n historyConfig: HistoryConfig;\n\n private _items: HistoryItem[] = [];\n\n readonly onChangeEmitter = new Emitter<HistoryStackChangeEvent>();\n\n readonly onChange = this.onChangeEmitter.event;\n\n private _toDispose: DisposableCollection = new DisposableCollection();\n\n limit = 100;\n\n constructor() {\n this._toDispose.push(this.onChangeEmitter);\n }\n\n get items(): HistoryItem[] {\n return this._items;\n }\n\n add(service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items.unshift(historyItem);\n if (this._items.length > this.limit) {\n this._items.pop();\n }\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD,\n value: historyItem,\n service,\n });\n return historyItem;\n }\n\n findById(id: string): HistoryItem | undefined {\n return this._items.find((item) => item.id === id);\n }\n\n changeByIndex(index: number, service: HistoryService, item: HistoryStackItem) {\n const historyItem = this._getHistoryItem(service, item);\n this._items[index] = historyItem;\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE,\n value: historyItem,\n service,\n });\n }\n\n addOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.push(newOperatopn);\n\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.ADD_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n updateOperation(service: HistoryService, id: string, op: OperationWithId) {\n const historyItem = this._items.find((item) => item.id === id);\n if (!historyItem) {\n console.warn('no history item found');\n return;\n }\n const index = historyItem.operations.findIndex((op) => op.id === op.id);\n if (index < 0) {\n console.warn('no operation found');\n return;\n }\n const newOperatopn = this._getHistoryOperation(service, op);\n historyItem.operations.splice(index, 1, newOperatopn);\n this.onChangeEmitter.fire({\n type: HistoryStackChangeType.UPDATE_OPERATION,\n value: {\n historyItem,\n operation: newOperatopn,\n },\n service,\n });\n }\n\n clear() {\n this._items = [];\n }\n\n dispose() {\n this._items = [];\n this._toDispose.dispose();\n }\n\n private _getHistoryItem(service: HistoryService, item: HistoryStackItem): HistoryItem {\n return {\n ...item,\n uri: service.context.uri,\n time: HistoryStack.dateFormat(item.timestamp),\n operations: item.operations.map((op) =>\n this._getHistoryOperation(service, op, item.type !== UndoRedoChangeType.PUSH)\n ),\n };\n }\n\n private _getHistoryOperation(\n service: HistoryService,\n op: Operation,\n generateId: boolean = false\n ): HistoryOperation {\n let id;\n if (generateId) {\n id = this.historyConfig.generateId();\n } else {\n const oldId = (op as OperationWithId).id;\n if (!oldId) {\n throw new Error('no operation id found');\n }\n id = oldId;\n }\n\n return {\n ...cloneDeep(op),\n id,\n label: service.operationService.getOperationLabel(op),\n description: service.operationService.getOperationDescription(op),\n timestamp: Date.now(),\n };\n }\n\n static dateFormat(timestamp: number) {\n return new Date(timestamp).toLocaleString();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { ContainerModule } from 'inversify';\n\nimport { OperationRegistry, OperationService } from './operation';\nimport { HistoryContext } from './history-context';\nimport {\n HistoryService,\n HistoryStack,\n HistoryManager,\n UndoRedoService,\n HistoryConfig,\n} from './history';\n\nexport const HistoryContainerModule = new ContainerModule(\n (bind, _unbind, _isBound, _rebind, _unbindAsync, onActivation, _onDeactivation) => {\n bind(OperationRegistry).toSelf().inSingletonScope();\n bind(OperationService).toSelf().inSingletonScope();\n bind(UndoRedoService).toSelf().inSingletonScope();\n bind(HistoryService).toSelf().inSingletonScope();\n bind(HistoryContext).toSelf().inSingletonScope();\n bind(HistoryManager).toSelf().inSingletonScope();\n bind(HistoryStack).toSelf().inSingletonScope();\n bind(HistoryConfig).toSelf().inSingletonScope();\n\n onActivation(HistoryService, (ctx, historyService) => {\n let historyManager;\n\n if (ctx.container?.parent?.isBound(HistoryManager)) {\n historyManager = ctx.container?.parent?.get(HistoryManager);\n } else {\n historyManager = ctx.container.get(HistoryManager);\n }\n\n if (!historyManager) {\n return historyService;\n }\n\n historyService.historyManager = historyManager;\n historyManager.registerHistoryService(historyService);\n return historyService;\n });\n }\n);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { Operation, OperationService } from './operation';\nimport { HistoryContainerModule } from './history-container-module';\n\nexport interface HistoryPluginOptions<T = PluginContext> {\n enable?: boolean;\n enableChangeNode?: boolean;\n onApply?: (ctx: T, operation: Operation) => void;\n}\n\nexport const createHistoryPlugin = definePluginCreator<HistoryPluginOptions>({\n onInit: (ctx, opts) => {\n if (opts.onApply) {\n ctx.get(OperationService).onApply(opts.onApply.bind(null, ctx));\n }\n },\n containerModules: [HistoryContainerModule],\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,wBAAwB,OAAO,uBAAuB;;;ACFnE,uBAAiE;AACjE,mBAAiD;AAM1C,IAAM,oBAAN,MAAwB;AAAA,EAAxB;AACL,SAAiB,kBAA8C,oBAAI,IAAI;AAIvE,SAAmB,gBAAyC,CAAC;AAAA;AAAA,EAGnD,OAAO;AACf,eAAW,WAAW,KAAK,eAAe;AACxC,cAAQ,wBAAwB,IAAI;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,eAA0C;AAC9D,QAAI,KAAK,gBAAgB,IAAI,cAAc,IAAI,GAAG;AAChD,cAAQ,KAAK,oBAAoB,cAAc,IAAI,yBAAyB;AAC5E,aAAO,wBAAW;AAAA,IACpB;AACA,UAAM,YAAY,IAAI,kCAAqB,KAAK,6BAA6B,aAAa,CAAC;AAC3F,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,MAAyC;AACxD,WAAO,KAAK,gBAAgB,IAAI,IAAI;AAAA,EACtC;AAAA,EAEQ,6BAA6B,eAA0C;AAC7E,SAAK,gBAAgB,IAAI,cAAc,MAAM,aAAa;AAC1D,WAAO;AAAA,MACL,SAAS,MAAM;AACb,aAAK,gBAAgB,OAAO,cAAc,IAAI;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;AAxCqB;AAAA,MAFlB,8BAAY,qBAAqB;AAAA,MACjC,2BAAS;AAAA,GAJC,kBAKQ;AAGT;AAAA,MADT,gCAAc;AAAA,GAPJ,kBAQD;AARC,oBAAN;AAAA,MADN,6BAAW;AAAA,GACC;;;ACPb,IAAAA,oBAAkD;AAClD,IAAAC,gBAA8C;;;ACD9C,IAAAC,oBAA2B;AAGpB,IAAM,iBAAN,MAAqB;AAU5B;AAVa,iBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;ACHb,oBAAuB;AACvB,IAAAC,oBAA2B;AAGpB,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACL,sBAA2B,UAAM,sBAAO;AAExC,uBAA6B,MAAM;AAAA;AACrC;AAJa,gBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;AFKN,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AAUL,SAAS,eAAe,IAAI,sBAAmB;AAE/C,SAAS,UAAU,KAAK,aAAa;AAErC,SAAQ,aAAa,IAAI,mCAAqB;AAAA;AAAA,EAG9C,OAAO;AACL,SAAK,WAAW,KAAK,KAAK,YAAY;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,IAAe,SAAsC;AAClE,UAAM,OAAO,KAAK,kBAAkB,iBAAiB,GAAG,IAAI;AAE5D,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,kBAAkB,GAAG,IAAI,sBAAsB;AAAA,IACjE;AAEA,QAAI;AACJ,QAAI,CAAC,SAAS,SAAS;AACrB,YAAM,KAAK,MAAM,IAAI,KAAK,QAAQ,MAAM;AAAA,IAC1C;AAEA,SAAK,aAAa,KAAK,EAAE;AAEzB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,WAA0C;AAC1D,UAAM,gBAAgB,KAAK,kBAAkB,iBAAiB,UAAU,IAAI;AAE5E,QAAI,iBAAiB,cAAc,UAAU;AAC3C,aAAO,cAAc,SAAS,WAAW,KAAK,QAAQ,MAAM;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwB,WAA0C;AAChE,UAAM,gBAAgB,KAAK,kBAAkB,iBAAiB,UAAU,IAAI;AAE5E,QAAI,iBAAiB,cAAc,gBAAgB;AACjD,aAAO,cAAc,eAAe,WAAW,KAAK,QAAQ,MAAM;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,YAAyB;AACzC,WAAO,WAAW,IAAI,QAAM,KAAK,iBAAiB,EAAE,CAAC,EAAE,QAAQ;AAAA,EACjE;AAAA,EAEA,iBAAiB,IAA0B;AACzC,UAAM,OAAO,KAAK,kBAAkB,iBAAiB,GAAG,IAAI;AAE5D,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,kBAAkB,GAAG,IAAI,sBAAsB;AAAA,IACjE;AACA,WAAO,KAAK,QAAQ,EAAE;AAAA,EACxB;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;AAxFW;AAAA,MADR,0BAAO,iBAAiB;AAAA,GADd,iBAEF;AAGA;AAAA,MADR,0BAAO,cAAc;AAAA,GAJX,iBAKF;AAGT;AAAA,MADC,0BAAO,aAAa;AAAA,GAPV,iBAQX;AASA;AAAA,MADC,iCAAc;AAAA,GAhBJ,iBAiBX;AAjBW,mBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;AGTb,IAAAC,oBAA2B;AAC3B,IAAAC,gBAA8C;;;ACmMvC,IAAK,qBAAL,kBAAKC,wBAAL;AACL,EAAAA,oBAAA,UAAO;AACP,EAAAA,oBAAA,UAAO;AACP,EAAAA,oBAAA,UAAO;AACP,EAAAA,oBAAA,WAAQ;AAJE,SAAAA;AAAA,GAAA;AAoCL,IAAK,yBAAL,kBAAKC,4BAAL;AACL,EAAAA,wBAAA,SAAM;AACN,EAAAA,wBAAA,YAAS;AACT,EAAAA,wBAAA,WAAQ;AACR,EAAAA,wBAAA,mBAAgB;AAChB,EAAAA,wBAAA,sBAAmB;AALT,SAAAA;AAAA,GAAA;AAgEL,IAAK,wBAAL,kBAAKC,2BAAL;AACL,EAAAA,uBAAA,SAAM;AACN,EAAAA,uBAAA,YAAS;AAFC,SAAAA;AAAA,GAAA;;;AD5RL,IAAM,kBAAN,MAAkD;AAAA,EAiBvD,cAAc;AAZd,SAAQ,WAAoB;AAE5B,SAAQ,WAAoB;AAE5B,SAAQ,SAAiB;AAEzB,SAAU,kBAAkB,IAAI,sBAA6B;AAE7D,SAAS,WAAW,KAAK,gBAAgB;AAEzC,SAAS,aAAa,IAAI,mCAAqB;AAG7C,SAAK,aAAa,CAAC;AACnB,SAAK,aAAa,CAAC;AACnB,SAAK,WAAW,KAAK,KAAK,eAAe;AAAA,EAC3C;AAAA,EAEA,SAAS,OAAe;AACtB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,YAAY,SAAiC;AAC3C,SAAK,aAAa,CAAC;AACnB,SAAK,WAAW,KAAK,YAAY,OAAO;AACxC,SAAK,WAAW,KAAK,OAAO;AAC5B,SAAK,+BAAqC,OAAO;AAAA,EACnD;AAAA,EAEA,eAAe;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAe;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAiB;AACf,WAAO,KAAK,WAAW,KAAK,WAAW,SAAS,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,SAAK,WAAW;AAEhB,UAAM,OAAO,KAAK,WAAW,IAAI;AAEjC,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,IAClB,UAAE;AACA,WAAK,WAAW,KAAK,YAAY,IAAI;AACrC,WAAK,+BAAqC,IAAI;AAC9C,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB;AAAA,IACF;AACA,SAAK,WAAW;AAEhB,UAAM,OAAO,KAAK,WAAW,IAAI;AAEjC,QAAI;AACF,YAAM,KAAK,KAAK;AAAA,IAClB,UAAE;AACA,WAAK,WAAW,KAAK,YAAY,IAAI;AACrC,WAAK,+BAAqC,IAAI;AAC9C,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAmB;AACjB,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAmB;AACjB,WAAO,KAAK,WAAW,SAAS;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAmB;AACjB,WAAO,CAAC,KAAK,YAAY,CAAC,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,+BAAoC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,WAAW,QAAQ,aAAW;AACjC,cAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAuB;AACrB,SAAK,WAAW,QAAQ,aAAW;AACjC,cAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,SAAK,aAAa,CAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,MAAM;AACX,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEQ,WAAW,OAA2B,SAA2B;AACvE,UAAM,KAAK,OAAO;AAClB,QAAI,MAAM,SAAS,KAAK,QAAQ;AAC9B,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,YAAY,MAA0B,SAA4B;AACxE,QAAI,SAAS;AACX,WAAK,gBAAgB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC7C,OAAO;AACL,WAAK,gBAAgB,KAAK,EAAE,KAAK,CAAuB;AAAA,IAC1D;AAAA,EACF;AACF;AA3Ka,kBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;AEZb,IAAAC,oBAAqB;AACrB,IAAAC,oBAAkD;AAClD,IAAAC,gBAA8C;;;ACF9C,uBAA0B;AAC1B,IAAAC,gBAAqC;AAM9B,IAAM,iBAAN,MAAiD;AAAA,EAmBtD,YAAY,kBAAoC,aAA0B,CAAC,GAAG;AAZ9E,SAAQ,aAAa,IAAI,mCAAqB;AAE9C,SAAQ,aAAqB,KAAK,IAAI;AAWpC,SAAK,oBAAoB;AACzB,SAAK,cAAc,WAAW,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;AAC7D,SAAK,MAAM,iBAAiB,OAAO,WAAW;AAAA,EAChD;AAAA,EARA,IAAI,KAAK;AACP,WAAO,KAAK;AAAA,EACd;AAAA,EAQA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,WAAuC;AACnD,UAAM,KAAK,KAAK,WAAW,SAAS;AACpC,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,gBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB,MAAuC;AACzD,QAAI,4BAAkC;AACpC,aAAO,KAAK,kBAAkB,kBAAkB,KAAK,WAAW;AAAA,IAClE;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAA+B;AAC7B,WAAO,KAAK,YAAY,CAAC;AAAA,EAC3B;AAAA,EAEA,mBAAuC;AACrC,WAAO,KAAK,YAAY,KAAK,YAAY,SAAS,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,aAAa,KAAK,kBAAkB,kBAAkB,KAAK,WAAW;AAE5E,eAAW,MAAM,YAAY;AAC3B,YAAM,KAAK,OAAO,EAAE;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,eAAW,MAAM,KAAK,aAAa;AACjC,YAAM,KAAK,OAAO,EAAE;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,MAAgD;AACrD,QAAI,aAA0B,KAAK;AAEnC,QAAI,4BAAkC;AACpC,mBAAa,KAAK,YAAY,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,EAAE,QAAQ;AAAA,IACvE;AAEA,eAAW,MAAM,YAAY;AAC3B,WAAK,OAAO,EAAE;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,SAAS,IAA0B;AACzC,WAAO,KAAK,kBAAkB,iBAAiB,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,OAAO,IAAe;AAClC,UAAM,KAAK,kBAAkB,eAAe,EAAE;AAAA,EAChD;AAAA,EAEQ,WAAW,IAAe;AAChC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAO,4BAAU,GAAG,KAAK;AAAA,MACzB,IAAI,KAAK,kBAAkB,OAAO,WAAW;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,WAAW,QAAQ;AAAA,EAC1B;AACF;;;AC1GA,IAAAC,oBAAmC;AACnC,IAAAC,gBAAsD;;;ACDtD,IAAAC,oBAA0B;AAC1B,IAAAC,oBAAmC;AACnC,IAAAC,gBAA8C;AAiBvC,IAAM,eAAN,MAAmB;AAAA,EAcxB,cAAc;AAVd,SAAQ,SAAwB,CAAC;AAEjC,SAAS,kBAAkB,IAAI,sBAAiC;AAEhE,SAAS,WAAW,KAAK,gBAAgB;AAEzC,SAAQ,aAAmC,IAAI,mCAAqB;AAEpE,iBAAQ;AAGN,SAAK,WAAW,KAAK,KAAK,eAAe;AAAA,EAC3C;AAAA,EAEA,IAAI,QAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAAyB,MAAwB;AACnD,UAAM,cAAc,KAAK,gBAAgB,SAAS,IAAI;AACtD,SAAK,OAAO,QAAQ,WAAW;AAC/B,QAAI,KAAK,OAAO,SAAS,KAAK,OAAO;AACnC,WAAK,OAAO,IAAI;AAAA,IAClB;AACA,SAAK,gBAAgB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,IAAqC;AAC5C,WAAO,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAAA,EAClD;AAAA,EAEA,cAAc,OAAe,SAAyB,MAAwB;AAC5E,UAAM,cAAc,KAAK,gBAAgB,SAAS,IAAI;AACtD,SAAK,OAAO,KAAK,IAAI;AACrB,SAAK,gBAAgB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,SAAyB,IAAY,IAAqB;AACrE,UAAM,cAAc,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAC7D,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK,uBAAuB;AACpC;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,qBAAqB,SAAS,EAAE;AAC1D,gBAAY,WAAW,KAAK,YAAY;AAExC,SAAK,gBAAgB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,SAAyB,IAAY,IAAqB;AACxE,UAAM,cAAc,KAAK,OAAO,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAC7D,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK,uBAAuB;AACpC;AAAA,IACF;AACA,UAAM,QAAQ,YAAY,WAAW,UAAU,CAACC,QAAOA,IAAG,OAAOA,IAAG,EAAE;AACtE,QAAI,QAAQ,GAAG;AACb,cAAQ,KAAK,oBAAoB;AACjC;AAAA,IACF;AACA,UAAM,eAAe,KAAK,qBAAqB,SAAS,EAAE;AAC1D,gBAAY,WAAW,OAAO,OAAO,GAAG,YAAY;AACpD,SAAK,gBAAgB,KAAK;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AACN,SAAK,SAAS,CAAC;AAAA,EACjB;AAAA,EAEA,UAAU;AACR,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEQ,gBAAgB,SAAyB,MAAqC;AACpF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK,QAAQ,QAAQ;AAAA,MACrB,MAAM,aAAa,WAAW,KAAK,SAAS;AAAA,MAC5C,YAAY,KAAK,WAAW;AAAA,QAAI,CAAC,OAC/B,KAAK,qBAAqB,SAAS,IAAI,KAAK,0BAAgC;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBACN,SACA,IACA,aAAsB,OACJ;AAClB,QAAI;AACJ,QAAI,YAAY;AACd,WAAK,KAAK,cAAc,WAAW;AAAA,IACrC,OAAO;AACL,YAAM,QAAS,GAAuB;AACtC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACzC;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,MACL,OAAG,6BAAU,EAAE;AAAA,MACf;AAAA,MACA,OAAO,QAAQ,iBAAiB,kBAAkB,EAAE;AAAA,MACpD,aAAa,QAAQ,iBAAiB,wBAAwB,EAAE;AAAA,MAChE,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,WAAmB;AACnC,WAAO,IAAI,KAAK,SAAS,EAAE,eAAe;AAAA,EAC5C;AACF;AA3IE;AAAA,MADC,0BAAO,aAAa;AAAA,GADV,aAEX;AAFW,eAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;ADDN,IAAM,iBAAN,MAAgD;AAAA,EAAhD;AAKL,SAAQ,mBAAmB,oBAAI,IAAgC;AAE/D,SAAQ,aAAa,IAAI,mCAAqB;AAAA;AAAA,EAE9C,uBAAuB,SAA+B;AACpD,UAAM,YAAY,IAAI,mCAAqB;AAC3C,cAAU,QAAQ;AAAA,MAChB,QAAQ,gBAAgB,SAAS,CAAC,UAA+B;AAC/D,YAAI,MAAM,8BAAmC;AAC3C;AAAA,QACF;AAEA,cAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,cAAM,aAAa,QAAQ,oBAAoB,IAAI;AACnD,cAAM,mBAAqC;AAAA,UACzC,IACE,6BACK,QAA2B,KAC5B,KAAK,cAAc,WAAW;AAAA,UACpC;AAAA,UACA,KAAK,QAAQ,QAAQ;AAAA,UACrB;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,QACtB;AACA,aAAK,aAAa,IAAI,SAAS,gBAAgB;AAAA,MACjD,CAAC;AAAA,MACD,QAAQ,QAAQ,CAAC,UAAU;AACzB,aAAK,aAAa,SAAS,KAAK;AAAA,MAClC,CAAC;AAAA,IACH,CAAC;AACD,SAAK,iBAAiB,IAAI,SAAS,SAAS;AAE5C,SAAK,WAAW;AAAA,MACd,QAAQ,cAAc,MAAM;AAC1B,aAAK,yBAAyB,OAAO;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,yBAAyB,SAA+B;AACtD,UAAM,aAAa,KAAK,iBAAiB,IAAI,OAAO;AACpD,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,eAAW,QAAQ;AACnB,SAAK,iBAAiB,OAAO,OAAO;AAAA,EACtC;AAAA,EAEA,uBAAuB,KAAa;AAClC,eAAW,WAAW,KAAK,iBAAiB,KAAK,GAAG;AAClD,UAAI,QAAQ,QAAQ,QAAQ,KAAK;AAC/B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,yBAAyB;AACvB,eAAW,WAAW,KAAK,iBAAiB,KAAK,GAAG;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,WAAW,QAAQ;AACxB,SAAK,aAAa,QAAQ;AAE1B,SAAK,iBAAiB,QAAQ,CAAC,YAAY,QAAQ,QAAQ,CAAC;AAC5D,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AAAA,EAEA,aAAa,SAAyB,OAA0B;AAC9D,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM;AAErC,UAAM,OAAO,KAAK,aAAa,SAAU,QAA2B,EAAE;AAEtE,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,CAAE,UAA8B,IAAI;AACtC,cAAQ,KAAK,uBAAuB;AACpC;AAAA,IACF;AAEA,QAAI,MAAM,gCAAuC;AAC/C,WAAK,aAAa;AAAA,QAChB;AAAA,QACC,QAA2B;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,0BAAoC;AAC5C,WAAK,aAAa;AAAA,QAChB;AAAA,QACC,QAA2B;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAxGiC;AAAA,MAA9B,0BAAO,YAAY;AAAA,GADT,eACoB;AAEC;AAAA,MAA/B,0BAAO,aAAa;AAAA,GAHV,eAGqB;AAHrB,iBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;AFGN,IAAM,iBAAN,MAAgD;AAAA,EAAhD;AAmBL,SAAQ,aAAa,IAAI,mCAAqB;AAE9C,SAAQ,eAAwB;AAEhC,SAAQ,qBAA4C;AAEpD,SAAQ,UAAmB;AAE3B,SAAQ,sBAAsB,IAAI,sBAAwB;AAE1D,SAAQ,gBAAgB,IAAI,sBAA2B;AAEvD,yBAAgB,KAAK,oBAAoB;AAEzC,mBAAU,KAAK,cAAc;AAAA;AAAA,EAE7B,IAAI,UAAU;AACZ,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AAAA,EAGA,OAAO;AACL,SAAK,WAAW,KAAK,KAAK,mBAAmB;AAC7C,SAAK,WAAW,KAAK,KAAK,aAAa;AAAA,EACzC;AAAA,EAEA,QAAQ;AACN,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAO;AACL,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,KAAa;AACjB,SAAK,gBAAgB,SAAS,GAAG;AAAA,EACnC;AAAA,EAEA,mBAAmB;AACjB,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,UAAM,iBAAiB,IAAI,eAAe,KAAK,kBAAkB,CAAC,CAAC;AACnE,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,iBAAiB;AACf,UAAM,iBAAiB,KAAK;AAC5B,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AACA,QAAI,eAAe,cAAc,EAAE,WAAW,GAAG;AAC/C,WAAK,oBAAoB,cAAc;AAAA,IACzC;AAEA,SAAK,qBAAqB;AAC1B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,SAAS,aAAyB;AAChC,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AACA,SAAK,iBAAiB;AACtB,gBAAY;AACZ,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,cAAc,WAAsB,SAAqC;AACvE,QAAI,CAAC,KAAK,SAAS,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,sBAAsB,KAAK,gBAAgB,eAAe;AAC5E,UAAM,gBAAgB,KAAK,kBAAkB,iBAAiB,UAAU,IAAI;AAE5E,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,kBAAkB,UAAU,IAAI,sBAAsB;AAAA,IACxE;AAEA,QAAI,cAAc,cAAc,CAAC,cAAc,WAAW,SAAS,GAAG;AACpE,aAAO,cAAc,MAAM,WAAW,KAAK,QAAQ,MAAM;AAAA,IAC3D;AAEA,UAAM,MAAM,KAAK,iBAAiB,eAAe,WAAW,EAAE,SAAS,SAAS,QAAQ,CAAC;AAEzF,QAAI,cAAc,UAAU,CAAC,UAAU,KAAK;AAC1C,gBAAU,MAAM,cAAc,OAAO,WAAW,KAAK,QAAQ,MAAM;AAAA,IACrE;AAEA,UAAM,cAAc,KAAK,aAAa,WAAW,MAAM,aAAa;AAEpE,QAAI,aAAa;AACf,UAAI,OAAO,gBAAgB,UAAU;AACnC,cAAMC,aAAY,KAAK,iBAAiB;AACxC,QAAAA,WAAU,QAAQ,YAAY;AAC9B,aAAK,cAAc,KAAK;AAAA,UACtB;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,WAAWA;AAAA,YACX,OAAO,YAAY;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,KAAK,KAAK,cAAc,SAAS;AACvC,aAAK,cAAc,KAAK;AAAA,UACtB;AAAA,UACA,OAAO;AAAA,YACL,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,YAAM,iBAAiB,IAAI,eAAe,KAAK,kBAAkB,CAAC,SAAS,CAAC;AAC5E,WAAK,oBAAoB,cAAc;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,uBAA6C;AAC3C,WAAO,KAAK,eAAe,aAAa,MACrC,QAAQ,EACR;AAAA,MAAI,CAAC,SACJ,KAAK,WAAW,IAAI,CAAC,OAAO;AAAA,QAC1B,OAAG,wBAAK,GAAG,CAAC,QAAQ,OAAO,CAAC;AAAA,QAC5B,OAAO,EAAE,SAAS,EAAE;AAAA,MACtB,EAAE;AAAA,IACJ,EACC,KAAK;AAAA,EACV;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,gBAAgB,KAAK;AAAA,EAClC;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,gBAAgB,KAAK;AAAA,EAClC;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,OAAO,YAAY;AAAA,EACjC;AAAA,EAEA,aAAuC;AACrC,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAAA,EAEA,QAAQ,eAA6C;AACnD,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAAA,EAEA,QAAQ;AACN,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA,EAEA,UAAgB;AACd,SAAK,oBAAoB,KAAK,IAAI;AAClC,SAAK,WAAW,QAAQ;AAAA,EAC1B;AAAA,EAEQ,WAAW;AACjB,QAAI,KAAK,SAAS;AAChB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA,EAEQ,oBAAoB,gBAAgC;AAC1D,SAAK,gBAAgB,YAAY,cAAc;AAC/C,SAAK,gBAAgB,eAAe;AAAA,EACtC;AAAA,EAEQ,aAAa,WAAsB,MAAwB,eAA8B;AAC/F,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,cAAc;AACrB,aAAO;AAAA,IACT;AACA,WACE,cAAc,eACd,cAAc,YAAY,WAAW,KAAK,iBAAiB,GAAG,IAAsB;AAAA,EAExF;AACF;AAvNW;AAAA,MADR,0BAAO,eAAe;AAAA,GADZ,eAEF;AAGA;AAAA,MADR,0BAAO,iBAAiB;AAAA,GAJd,eAKF;AAGA;AAAA,MADR,0BAAO,gBAAgB;AAAA,GAPb,eAQF;AAGA;AAAA,MADR,0BAAO,cAAc;AAAA,GAVX,eAWF;AAGA;AAAA,MADR,0BAAO,aAAa;AAAA,GAbV,eAcF;AAGT;AAAA,MADC,0BAAO,cAAc;AAAA,GAhBX,eAiBX;AAuBA;AAAA,MADC,iCAAc;AAAA,GAvCJ,eAwCX;AAxCW,iBAAN;AAAA,MADN,8BAAW;AAAA,GACC;;;AIrBb,IAAAC,oBAAgC;AAYzB,IAAM,yBAAyB,IAAI;AAAA,EACxC,CAAC,MAAM,SAAS,UAAU,SAAS,cAAc,cAAc,oBAAoB;AACjF,SAAK,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;AAClD,SAAK,gBAAgB,EAAE,OAAO,EAAE,iBAAiB;AACjD,SAAK,eAAe,EAAE,OAAO,EAAE,iBAAiB;AAChD,SAAK,cAAc,EAAE,OAAO,EAAE,iBAAiB;AAC/C,SAAK,cAAc,EAAE,OAAO,EAAE,iBAAiB;AAC/C,SAAK,cAAc,EAAE,OAAO,EAAE,iBAAiB;AAC/C,SAAK,YAAY,EAAE,OAAO,EAAE,iBAAiB;AAC7C,SAAK,aAAa,EAAE,OAAO,EAAE,iBAAiB;AAE9C,iBAAa,gBAAgB,CAAC,KAAK,mBAAmB;AACpD,UAAI;AAEJ,UAAI,IAAI,WAAW,QAAQ,QAAQ,cAAc,GAAG;AAClD,yBAAiB,IAAI,WAAW,QAAQ,IAAI,cAAc;AAAA,MAC5D,OAAO;AACL,yBAAiB,IAAI,UAAU,IAAI,cAAc;AAAA,MACnD;AAEA,UAAI,CAAC,gBAAgB;AACnB,eAAO;AAAA,MACT;AAEA,qBAAe,iBAAiB;AAChC,qBAAe,uBAAuB,cAAc;AACpD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;ACzCA,kBAAmD;AAW5C,IAAM,0BAAsB,iCAA0C;AAAA,EAC3E,QAAQ,CAAC,KAAK,SAAS;AACrB,QAAI,KAAK,SAAS;AAChB,UAAI,IAAI,gBAAgB,EAAE,QAAQ,KAAK,QAAQ,KAAK,MAAM,GAAG,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EACA,kBAAkB,CAAC,sBAAsB;AAC3C,CAAC;","names":["import_inversify","import_utils","import_inversify","import_inversify","import_inversify","import_utils","UndoRedoChangeType","HistoryStackChangeType","HistoryMergeEventType","import_lodash_es","import_inversify","import_utils","import_utils","import_inversify","import_utils","import_lodash_es","import_inversify","import_utils","op","operation","import_inversify"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowgram.ai/history",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -20,8 +20,8 @@
20
20
  "reflect-metadata": "~0.2.2",
21
21
  "lodash-es": "^4.17.21",
22
22
  "nanoid": "^5.0.9",
23
- "@flowgram.ai/core": "0.5.2",
24
- "@flowgram.ai/utils": "0.5.2"
23
+ "@flowgram.ai/core": "0.5.4",
24
+ "@flowgram.ai/utils": "0.5.4"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/lodash-es": "^4.17.12",
@@ -31,8 +31,8 @@
31
31
  "tsup": "^8.0.1",
32
32
  "typescript": "^5.8.3",
33
33
  "vitest": "^3.2.4",
34
- "@flowgram.ai/eslint-config": "0.5.2",
35
- "@flowgram.ai/ts-config": "0.5.2"
34
+ "@flowgram.ai/eslint-config": "0.5.4",
35
+ "@flowgram.ai/ts-config": "0.5.4"
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public",