@flowgram.ai/history 0.2.16 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/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":["import { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","import { 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","import { 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","import { 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","import { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","import { 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","import { 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","import { pick } from 'lodash';\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","import { cloneDeep } from 'lodash';\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","import { 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","import { cloneDeep } from 'lodash';\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","import { 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","import { 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';\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';\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';\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"]}
package/dist/index.d.mts CHANGED
@@ -4,6 +4,10 @@ import { ContainerModule } from 'inversify';
4
4
  import * as _flowgram_ai_core from '@flowgram.ai/core';
5
5
  import { PluginContext } from '@flowgram.ai/core';
6
6
 
7
+ /**
8
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
9
+ * SPDX-License-Identifier: MIT
10
+ */
7
11
  declare class HistoryContext {
8
12
  /**
9
13
  * 所属uri
@@ -15,6 +19,10 @@ declare class HistoryContext {
15
19
  source?: unknown;
16
20
  }
17
21
 
22
+ /**
23
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
24
+ * SPDX-License-Identifier: MIT
25
+ */
18
26
  declare class HistoryConfig {
19
27
  generateId: () => string;
20
28
  getSnapshot: () => unknown;
@@ -82,6 +90,11 @@ declare class HistoryStack {
82
90
  static dateFormat(timestamp: number): string;
83
91
  }
84
92
 
93
+ /**
94
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
95
+ * SPDX-License-Identifier: MIT
96
+ */
97
+
85
98
  declare class HistoryManager implements IHistoryManager {
86
99
  readonly historyStack: HistoryStack;
87
100
  readonly historyConfig: HistoryConfig;
@@ -134,6 +147,11 @@ declare class HistoryService implements IHistoryService {
134
147
  private _shouldMerge;
135
148
  }
136
149
 
150
+ /**
151
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
152
+ * SPDX-License-Identifier: MIT
153
+ */
154
+
137
155
  interface HistoryRecord {
138
156
  snapshot: any;
139
157
  stack: any[];
@@ -482,6 +500,11 @@ declare class UndoRedoService implements IUndoRedoService {
482
500
  private _emitChange;
483
501
  }
484
502
 
503
+ /**
504
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
505
+ * SPDX-License-Identifier: MIT
506
+ */
507
+
485
508
  declare class StackOperation implements IUndoRedoElement {
486
509
  label?: string | undefined;
487
510
  description?: string | undefined;
@@ -507,6 +530,11 @@ declare class StackOperation implements IUndoRedoElement {
507
530
  dispose(): void;
508
531
  }
509
532
 
533
+ /**
534
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
535
+ * SPDX-License-Identifier: MIT
536
+ */
537
+
510
538
  /**
511
539
  * 操作
512
540
  */
@@ -604,6 +632,11 @@ interface OperationMeta<OperationValue = any, Source = any, ApplyResult = any> {
604
632
  getURI?: (operation: Operation<OperationValue>, source: Source) => string | undefined;
605
633
  }
606
634
 
635
+ /**
636
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
637
+ * SPDX-License-Identifier: MIT
638
+ */
639
+
607
640
  declare class OperationRegistry {
608
641
  private readonly _operationMetas;
609
642
  protected readonly contributions: OperationContribution[];
@@ -623,11 +656,21 @@ declare class OperationRegistry {
623
656
  private _doRegisterOperationMetaMeta;
624
657
  }
625
658
 
659
+ /**
660
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
661
+ * SPDX-License-Identifier: MIT
662
+ */
663
+
626
664
  declare const OperationContribution: unique symbol;
627
665
  interface OperationContribution {
628
666
  registerOperationMeta?(operationRegistry: OperationRegistry): void;
629
667
  }
630
668
 
669
+ /**
670
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
671
+ * SPDX-License-Identifier: MIT
672
+ */
673
+
631
674
  declare const HistoryContainerModule: ContainerModule;
632
675
 
633
676
  interface HistoryPluginOptions<T = PluginContext> {
package/dist/index.d.ts CHANGED
@@ -4,6 +4,10 @@ import { ContainerModule } from 'inversify';
4
4
  import * as _flowgram_ai_core from '@flowgram.ai/core';
5
5
  import { PluginContext } from '@flowgram.ai/core';
6
6
 
7
+ /**
8
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
9
+ * SPDX-License-Identifier: MIT
10
+ */
7
11
  declare class HistoryContext {
8
12
  /**
9
13
  * 所属uri
@@ -15,6 +19,10 @@ declare class HistoryContext {
15
19
  source?: unknown;
16
20
  }
17
21
 
22
+ /**
23
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
24
+ * SPDX-License-Identifier: MIT
25
+ */
18
26
  declare class HistoryConfig {
19
27
  generateId: () => string;
20
28
  getSnapshot: () => unknown;
@@ -82,6 +90,11 @@ declare class HistoryStack {
82
90
  static dateFormat(timestamp: number): string;
83
91
  }
84
92
 
93
+ /**
94
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
95
+ * SPDX-License-Identifier: MIT
96
+ */
97
+
85
98
  declare class HistoryManager implements IHistoryManager {
86
99
  readonly historyStack: HistoryStack;
87
100
  readonly historyConfig: HistoryConfig;
@@ -134,6 +147,11 @@ declare class HistoryService implements IHistoryService {
134
147
  private _shouldMerge;
135
148
  }
136
149
 
150
+ /**
151
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
152
+ * SPDX-License-Identifier: MIT
153
+ */
154
+
137
155
  interface HistoryRecord {
138
156
  snapshot: any;
139
157
  stack: any[];
@@ -482,6 +500,11 @@ declare class UndoRedoService implements IUndoRedoService {
482
500
  private _emitChange;
483
501
  }
484
502
 
503
+ /**
504
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
505
+ * SPDX-License-Identifier: MIT
506
+ */
507
+
485
508
  declare class StackOperation implements IUndoRedoElement {
486
509
  label?: string | undefined;
487
510
  description?: string | undefined;
@@ -507,6 +530,11 @@ declare class StackOperation implements IUndoRedoElement {
507
530
  dispose(): void;
508
531
  }
509
532
 
533
+ /**
534
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
535
+ * SPDX-License-Identifier: MIT
536
+ */
537
+
510
538
  /**
511
539
  * 操作
512
540
  */
@@ -604,6 +632,11 @@ interface OperationMeta<OperationValue = any, Source = any, ApplyResult = any> {
604
632
  getURI?: (operation: Operation<OperationValue>, source: Source) => string | undefined;
605
633
  }
606
634
 
635
+ /**
636
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
637
+ * SPDX-License-Identifier: MIT
638
+ */
639
+
607
640
  declare class OperationRegistry {
608
641
  private readonly _operationMetas;
609
642
  protected readonly contributions: OperationContribution[];
@@ -623,11 +656,21 @@ declare class OperationRegistry {
623
656
  private _doRegisterOperationMetaMeta;
624
657
  }
625
658
 
659
+ /**
660
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
661
+ * SPDX-License-Identifier: MIT
662
+ */
663
+
626
664
  declare const OperationContribution: unique symbol;
627
665
  interface OperationContribution {
628
666
  registerOperationMeta?(operationRegistry: OperationRegistry): void;
629
667
  }
630
668
 
669
+ /**
670
+ * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
671
+ * SPDX-License-Identifier: MIT
672
+ */
673
+
631
674
  declare const HistoryContainerModule: ContainerModule;
632
675
 
633
676
  interface HistoryPluginOptions<T = 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":["export * from './operation';\nexport * from './history';\nexport * from './history-container-module';\nexport * from './create-history-plugin';\nexport * from './history-context';\n","import { OperationRegistry } from './operation-registry';\n\nexport const OperationContribution = Symbol('OperationContribution');\n\nexport interface OperationContribution {\n registerOperationMeta?(operationRegistry: OperationRegistry): void;\n}\n","import { 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","import { 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","import { 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","import { nanoid } from 'nanoid';\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class HistoryConfig {\n generateId: () => string = () => nanoid();\n\n getSnapshot: () => unknown = () => '';\n}\n","import { 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","import { 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","import { pick } from 'lodash';\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","import { cloneDeep } from 'lodash';\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","import { 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","import { cloneDeep } from 'lodash';\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","import { 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","import { 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","import_inversify","import_utils","import_utils","import_inversify","import_utils","import_lodash","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';\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';\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';\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","import_inversify","import_utils","import_utils","import_inversify","import_utils","import_lodash","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.2.16",
3
+ "version": "0.2.17",
4
4
  "homepage": "https://flowgram.ai/",
5
5
  "repository": "https://github.com/bytedance/flowgram.ai",
6
6
  "license": "MIT",
@@ -20,8 +20,8 @@
20
20
  "reflect-metadata": "~0.2.2",
21
21
  "lodash": "^4.17.21",
22
22
  "nanoid": "^4.0.2",
23
- "@flowgram.ai/core": "0.2.16",
24
- "@flowgram.ai/utils": "0.2.16"
23
+ "@flowgram.ai/core": "0.2.17",
24
+ "@flowgram.ai/utils": "0.2.17"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/lodash": "^4.14.137",
@@ -31,8 +31,8 @@
31
31
  "tsup": "^8.0.1",
32
32
  "typescript": "^5.0.4",
33
33
  "vitest": "^0.34.6",
34
- "@flowgram.ai/ts-config": "0.2.16",
35
- "@flowgram.ai/eslint-config": "0.2.16"
34
+ "@flowgram.ai/ts-config": "0.2.17",
35
+ "@flowgram.ai/eslint-config": "0.2.17"
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public",