{"version":3,"file":"y-multidoc-undomanager.cjs","sources":["../y-multidoc-undomanager.js"],"sourcesContent":["import * 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  const stack = type === 'undo' ? mum.undoStack : mum.redoStack\n  while (stack.length > 0) {\n    const um = /** @type {Y.UndoManager} */ (stack.pop())\n    const prevUmStack = type === 'undo' ? um.undoStack : um.redoStack\n    const stackItem = /** @type {any} */ (prevUmStack.pop())\n    let actionPerformed = false\n    if (type === 'undo') {\n      um.undoStack = [stackItem]\n      actionPerformed = um.undo() !== null\n      um.undoStack = prevUmStack\n    } else {\n      um.redoStack = [stackItem]\n      actionPerformed = um.redo() !== null\n      um.redoStack = prevUmStack\n    }\n    if (actionPerformed) {\n      return stackItem\n    }\n  }\n  return null\n}\n\n/**\n * @extends Observable<any>\n */\nexport class YMultiDocUndoManager extends Observable {\n  /**\n   * @param {Y.AbstractType<any>|Array<Y.AbstractType<any>>} typeScope Accepts either a single type, or an array of types\n   * @param {ConstructorParameters<typeof Y.UndoManager>[1]} opts\n   */\n  constructor (typeScope = [], opts = {}) {\n    super()\n    /**\n     * @type {Map<Y.Doc, Y.UndoManager>}\n     */\n    this.docs = new Map()\n    this.trackedOrigins = opts.trackedOrigins || new Set([null])\n    opts.trackedOrigins = this.trackedOrigins\n    this._defaultOpts = opts\n    /**\n     * @type {Array<Y.UndoManager>}\n     */\n    this.undoStack = []\n    /**\n     * @type {Array<Y.UndoManager>}\n     */\n    this.redoStack = []\n    this.addToScope(typeScope)\n  }\n\n  /**\n   * @param {Array<Y.AbstractType<any>> | Y.AbstractType<any>} ytypes\n   */\n  addToScope (ytypes) {\n    ytypes = array.isArray(ytypes) ? ytypes : [ytypes]\n    ytypes.forEach(ytype => {\n      const ydoc = /** @type {Y.Doc} */ (ytype.doc)\n      const um = map.setIfUndefined(this.docs, ydoc, () => {\n        const um = new Y.UndoManager([ytype], this._defaultOpts)\n        um.on('stack-cleared', /** @param {any} opts */ ({ undoStackCleared, redoStackCleared }) => {\n          this.clear(undoStackCleared, redoStackCleared)\n        })\n        ydoc.on('destroy', () => {\n          this.docs.delete(ydoc)\n          this.undoStack = this.undoStack.filter(um => um.doc !== ydoc)\n          this.redoStack = this.redoStack.filter(um => um.doc !== ydoc)\n        })\n        um.on('stack-item-added', /** @param {any} change */ change => {\n          const stack = change.type === 'undo' ? this.undoStack : this.redoStack\n          stack.push(um)\n          this.emit('stack-item-added', [{ ...change, ydoc: ydoc }, this])\n        })\n        um.on('stack-item-updated', /** @param {any} change */ change => {\n          this.emit('stack-item-updated', [{ ...change, ydoc }, this])\n        })\n        um.on('stack-item-popped', /** @param {any} change */ change => {\n          this.emit('stack-item-popped', [{ ...change, ydoc }, this])\n        })\n        // if doc is destroyed\n        // emit events from um to multium\n        return um\n      })\n      /* c8 ignore next 4 */\n      if (um.scope.every(yt => yt !== ytype)) {\n        um.scope.push(ytype)\n      }\n    })\n  }\n\n  /**\n   * @param {any} origin\n   */\n  /* c8 ignore next 3 */\n  addTrackedOrigin (origin) {\n    this.trackedOrigins.add(origin)\n  }\n\n  /**\n   * @param {any} origin\n   */\n  /* c8 ignore next 3 */\n  removeTrackedOrigin (origin) {\n    this.trackedOrigins.delete(origin)\n  }\n\n  /**\n   * Undo last changes on type.\n   *\n   * @return {any?} Returns StackItem if a change was applied\n   */\n  undo () {\n    return popStackItem(this, 'undo')\n  }\n\n  /**\n   * Redo last undo operation.\n   *\n   * @return {any?} Returns StackItem if a change was applied\n   */\n  redo () {\n    return popStackItem(this, 'redo')\n  }\n\n  clear (clearUndoStack = true, clearRedoStack = true) {\n    /* c8 ignore next */\n    if ((clearUndoStack && this.canUndo()) || (clearRedoStack && this.canRedo())) {\n      this.docs.forEach(um => {\n        /* c8 ignore next */\n        clearUndoStack && (this.undoStack = [])\n        /* c8 ignore next */\n        clearRedoStack && (this.redoStack = [])\n        um.clear(clearUndoStack, clearRedoStack)\n      })\n      this.emit('stack-cleared', [{ undoStackCleared: clearUndoStack, redoStackCleared: clearRedoStack }])\n    }\n  }\n\n  /* c8 ignore next 5 */\n  stopCapturing () {\n    this.docs.forEach(um => {\n      um.stopCapturing()\n    })\n  }\n\n  /**\n   * Are undo steps available?\n   *\n   * @return {boolean} `true` if undo is possible\n   */\n  canUndo () {\n    return this.undoStack.length > 0\n  }\n\n  /**\n   * Are redo steps available?\n   *\n   * @return {boolean} `true` if redo is possible\n   */\n  canRedo () {\n    return this.redoStack.length > 0\n  }\n\n  destroy () {\n    this.docs.forEach(um => um.destroy())\n    super.destroy()\n  }\n}\n\n/**\n * @todo remove\n * @deprecated Use YMultiDocUndoManager instead\n */\nexport const MultiDocUndoManager = YMultiDocUndoManager\n"],"names":["Observable","array","map","Y"],"mappings":"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"}