{
  "version": 3,
  "sources": ["../../src/y-utilities/y-multidoc-undomanager.js"],
  "sourcesContent": ["// File copied as is from the y-utilities package.\n/* eslint-disable @eslint-community/eslint-comments/disable-enable-pair */\n/* eslint-disable @eslint-community/eslint-comments/no-unlimited-disable */\n/* eslint-disable */\n// @ts-nocheck\n\nimport * as array from 'lib0/array';\nimport * as map from 'lib0/map';\nimport { Observable } from 'lib0/observable';\nimport * as Y from 'yjs';\n\n/**\n * @param {YMultiDocUndoManager} mum\n * @param {'undo' | 'redo'} type\n */\nconst popStackItem = ( mum, type ) => {\n\tconst stack = type === 'undo' ? mum.undoStack : mum.redoStack;\n\twhile ( stack.length > 0 ) {\n\t\tconst um = /** @type {Y.UndoManager} */ ( stack.pop() );\n\t\tconst prevUmStack = type === 'undo' ? um.undoStack : um.redoStack;\n\t\tconst stackItem = /** @type {any} */ ( prevUmStack.pop() );\n\t\tlet actionPerformed = false;\n\t\tif ( type === 'undo' ) {\n\t\t\tum.undoStack = [ stackItem ];\n\t\t\tactionPerformed = um.undo() !== null;\n\t\t\tum.undoStack = prevUmStack;\n\t\t} else {\n\t\t\tum.redoStack = [ stackItem ];\n\t\t\tactionPerformed = um.redo() !== null;\n\t\t\tum.redoStack = prevUmStack;\n\t\t}\n\t\tif ( actionPerformed ) {\n\t\t\treturn stackItem;\n\t\t}\n\t}\n\treturn null;\n};\n\n/**\n * @extends Observable<any>\n */\nexport class YMultiDocUndoManager extends Observable {\n\t/**\n\t * @param {Y.AbstractType<any>|Array<Y.AbstractType<any>>} typeScope Accepts either a single type, or an array of types\n\t * @param {ConstructorParameters<typeof Y.UndoManager>[1]} opts\n\t */\n\tconstructor( typeScope = [], opts = {} ) {\n\t\tsuper();\n\t\t/**\n\t\t * @type {Map<Y.Doc, Y.UndoManager>}\n\t\t */\n\t\tthis.docs = new Map();\n\t\tthis.trackedOrigins = opts.trackedOrigins || new Set( [ null ] );\n\t\topts.trackedOrigins = this.trackedOrigins;\n\t\tthis._defaultOpts = opts;\n\t\t/**\n\t\t * @type {Array<Y.UndoManager>}\n\t\t */\n\t\tthis.undoStack = [];\n\t\t/**\n\t\t * @type {Array<Y.UndoManager>}\n\t\t */\n\t\tthis.redoStack = [];\n\t\tthis.addToScope( typeScope );\n\t}\n\n\t/**\n\t * @param {Array<Y.AbstractType<any>> | Y.AbstractType<any>} ytypes\n\t */\n\taddToScope( ytypes ) {\n\t\tytypes = array.isArray( ytypes ) ? ytypes : [ ytypes ];\n\t\tytypes.forEach( ( ytype ) => {\n\t\t\tconst ydoc = /** @type {Y.Doc} */ ( ytype.doc );\n\t\t\tconst um = map.setIfUndefined( this.docs, ydoc, () => {\n\t\t\t\tconst um = new Y.UndoManager( [ ytype ], this._defaultOpts );\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-cleared',\n\t\t\t\t\t/** @param {any} opts */ ( {\n\t\t\t\t\t\tundoStackCleared,\n\t\t\t\t\t\tredoStackCleared,\n\t\t\t\t\t} ) => {\n\t\t\t\t\t\tthis.clear( undoStackCleared, redoStackCleared );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tydoc.on( 'destroy', () => {\n\t\t\t\t\tthis.docs.delete( ydoc );\n\t\t\t\t\tthis.undoStack = this.undoStack.filter(\n\t\t\t\t\t\t( um ) => um.doc !== ydoc\n\t\t\t\t\t);\n\t\t\t\t\tthis.redoStack = this.redoStack.filter(\n\t\t\t\t\t\t( um ) => um.doc !== ydoc\n\t\t\t\t\t);\n\t\t\t\t} );\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-added',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tconst stack =\n\t\t\t\t\t\t\tchange.type === 'undo'\n\t\t\t\t\t\t\t\t? this.undoStack\n\t\t\t\t\t\t\t\t: this.redoStack;\n\t\t\t\t\t\tstack.push( um );\n\t\t\t\t\t\tthis.emit( 'stack-item-added', [\n\t\t\t\t\t\t\t{ ...change, ydoc: ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-updated',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tthis.emit( 'stack-item-updated', [\n\t\t\t\t\t\t\t{ ...change, ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tum.on(\n\t\t\t\t\t'stack-item-popped',\n\t\t\t\t\t/** @param {any} change */ ( change ) => {\n\t\t\t\t\t\tthis.emit( 'stack-item-popped', [\n\t\t\t\t\t\t\t{ ...change, ydoc },\n\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t] );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// if doc is destroyed\n\t\t\t\t// emit events from um to multium\n\t\t\t\treturn um;\n\t\t\t} );\n\t\t\t/* c8 ignore next 4 */\n\t\t\tif ( um.scope.every( ( yt ) => yt !== ytype ) ) {\n\t\t\t\tum.scope.push( ytype );\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @param {any} origin\n\t */\n\t/* c8 ignore next 3 */\n\taddTrackedOrigin( origin ) {\n\t\tthis.trackedOrigins.add( origin );\n\t}\n\n\t/**\n\t * @param {any} origin\n\t */\n\t/* c8 ignore next 3 */\n\tremoveTrackedOrigin( origin ) {\n\t\tthis.trackedOrigins.delete( origin );\n\t}\n\n\t/**\n\t * Undo last changes on type.\n\t *\n\t * @return {any?} Returns StackItem if a change was applied\n\t */\n\tundo() {\n\t\treturn popStackItem( this, 'undo' );\n\t}\n\n\t/**\n\t * Redo last undo operation.\n\t *\n\t * @return {any?} Returns StackItem if a change was applied\n\t */\n\tredo() {\n\t\treturn popStackItem( this, 'redo' );\n\t}\n\n\tclear( clearUndoStack = true, clearRedoStack = true ) {\n\t\t/* c8 ignore next */\n\t\tif (\n\t\t\t( clearUndoStack && this.canUndo() ) ||\n\t\t\t( clearRedoStack && this.canRedo() )\n\t\t) {\n\t\t\tthis.docs.forEach( ( um ) => {\n\t\t\t\t/* c8 ignore next */\n\t\t\t\tclearUndoStack && ( this.undoStack = [] );\n\t\t\t\t/* c8 ignore next */\n\t\t\t\tclearRedoStack && ( this.redoStack = [] );\n\t\t\t\tum.clear( clearUndoStack, clearRedoStack );\n\t\t\t} );\n\t\t\tthis.emit( 'stack-cleared', [\n\t\t\t\t{\n\t\t\t\t\tundoStackCleared: clearUndoStack,\n\t\t\t\t\tredoStackCleared: clearRedoStack,\n\t\t\t\t},\n\t\t\t] );\n\t\t}\n\t}\n\n\t/* c8 ignore next 5 */\n\tstopCapturing() {\n\t\tthis.docs.forEach( ( um ) => {\n\t\t\tum.stopCapturing();\n\t\t} );\n\t}\n\n\t/**\n\t * Are undo steps available?\n\t *\n\t * @return {boolean} `true` if undo is possible\n\t */\n\tcanUndo() {\n\t\treturn this.undoStack.length > 0;\n\t}\n\n\t/**\n\t * Are redo steps available?\n\t *\n\t * @return {boolean} `true` if redo is possible\n\t */\n\tcanRedo() {\n\t\treturn this.redoStack.length > 0;\n\t}\n\n\tdestroy() {\n\t\tthis.docs.forEach( ( um ) => um.destroy() );\n\t\tsuper.destroy();\n\t}\n}\n\n/**\n * @todo remove\n * @deprecated Use YMultiDocUndoManager instead\n */\nexport const MultiDocUndoManager = YMultiDocUndoManager;\n"],
  "mappings": "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",
  "names": ["um"]
}
