{"version":3,"file":"thread-mark-node.cjs","sources":["../../src/comments/thread-mark-node.ts"],"sourcesContent":["import type {\n  BaseSelection,\n  LexicalNode,\n  NodeKey,\n  RangeSelection,\n  SerializedElementNode,\n  Spread,\n} from \"lexical\";\nimport { $applyNodeReplacement, $isRangeSelection, ElementNode } from \"lexical\";\n\nexport type SerializedThreadMarkNode = Spread<\n  {\n    ids: Array<string>;\n  },\n  SerializedElementNode\n>;\n\nexport class ThreadMarkNode extends ElementNode {\n  /** @internal */\n  __ids: Array<string>; // The ids of the threads that this mark is associated with\n\n  static getType(): string {\n    return \"lb-thread-mark\";\n  }\n\n  static clone(node: ThreadMarkNode): ThreadMarkNode {\n    return new ThreadMarkNode(Array.from(node.__ids), node.__key);\n  }\n\n  static importDOM(): null {\n    return null;\n  }\n\n  static importJSON(serializedNode: SerializedThreadMarkNode): ThreadMarkNode {\n    const node = $createThreadMarkNode(serializedNode.ids);\n    node.setFormat(serializedNode.format);\n    node.setIndent(serializedNode.indent);\n    node.setDirection(serializedNode.direction);\n    return node;\n  }\n\n  exportJSON(): SerializedThreadMarkNode {\n    return {\n      ...super.exportJSON(),\n      ids: this.getIDs(),\n      type: \"lb-thread-mark\",\n      version: 1,\n    };\n  }\n\n  constructor(ids: Array<string>, key?: NodeKey) {\n    super(key);\n    this.__ids = ids || [];\n  }\n\n  createDOM(): HTMLElement {\n    const element = document.createElement(\"span\");\n    return element;\n  }\n\n  updateDOM(): boolean {\n    return false;\n  }\n\n  hasID(id: string): boolean {\n    const ids = this.getIDs();\n    for (let i = 0; i < ids.length; i++) {\n      if (id === ids[i]) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  getIDs(): Array<string> {\n    const self = this.getLatest();\n    return $isThreadMarkNode(self) ? self.__ids : [];\n  }\n\n  addID(id: string): void {\n    const self = this.getWritable();\n    if ($isThreadMarkNode(self)) {\n      const ids = self.__ids;\n      self.__ids = ids;\n      for (let i = 0; i < ids.length; i++) {\n        // If we already have it, don't add again\n        if (id === ids[i]) {\n          return;\n        }\n      }\n      ids.push(id);\n    }\n  }\n\n  deleteID(id: string): void {\n    const self = this.getWritable();\n    if ($isThreadMarkNode(self)) {\n      const ids = self.__ids;\n      self.__ids = ids;\n      for (let i = 0; i < ids.length; i++) {\n        if (id === ids[i]) {\n          ids.splice(i, 1);\n          return;\n        }\n      }\n    }\n  }\n\n  insertNewAfter(\n    _: RangeSelection,\n    restoreSelection = true\n  ): null | ElementNode {\n    const markNode = $createThreadMarkNode(this.__ids);\n    this.insertAfter(markNode, restoreSelection);\n    return markNode;\n  }\n\n  canInsertTextBefore(): false {\n    return false;\n  }\n\n  canInsertTextAfter(): false {\n    return false;\n  }\n\n  canBeEmpty(): false {\n    return false;\n  }\n\n  isInline(): true {\n    return true;\n  }\n\n  extractWithChild(\n    _: LexicalNode,\n    selection: BaseSelection,\n    destination: \"clone\" | \"html\"\n  ): boolean {\n    if (!$isRangeSelection(selection) || destination === \"html\") {\n      return false;\n    }\n    const anchor = selection.anchor;\n    const focus = selection.focus;\n    const anchorNode = anchor.getNode();\n    const focusNode = focus.getNode();\n    const isBackward = selection.isBackward();\n    const selectionLength = isBackward\n      ? anchor.offset - focus.offset\n      : focus.offset - anchor.offset;\n    return (\n      this.isParentOf(anchorNode) &&\n      this.isParentOf(focusNode) &&\n      this.getTextContent().length === selectionLength\n    );\n  }\n\n  excludeFromCopy(destination: \"clone\" | \"html\"): boolean {\n    return destination !== \"clone\";\n  }\n}\n\nexport function $createThreadMarkNode(ids: Array<string>): ThreadMarkNode {\n  return $applyNodeReplacement(new ThreadMarkNode(ids));\n}\n\nexport function $isThreadMarkNode(\n  node: LexicalNode | null\n): node is ThreadMarkNode {\n  return node instanceof ThreadMarkNode;\n}\n"],"names":["ElementNode","$isRangeSelection","$applyNodeReplacement"],"mappings":";;;;AAiBO,MAAM,uBAAuBA,mBAAY,CAAA;AAAA;AAAA,EAE9C,KAAA,CAAA;AAAA;AAAA,EAEA,OAAO,OAAkB,GAAA;AACvB,IAAO,OAAA,gBAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAO,MAAM,IAAsC,EAAA;AACjD,IAAO,OAAA,IAAI,eAAe,KAAM,CAAA,IAAA,CAAK,KAAK,KAAK,CAAA,EAAG,KAAK,KAAK,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEA,OAAO,SAAkB,GAAA;AACvB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAO,WAAW,cAA0D,EAAA;AAC1E,IAAM,MAAA,IAAA,GAAO,qBAAsB,CAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AACrD,IAAK,IAAA,CAAA,SAAA,CAAU,eAAe,MAAM,CAAA,CAAA;AACpC,IAAK,IAAA,CAAA,SAAA,CAAU,eAAe,MAAM,CAAA,CAAA;AACpC,IAAK,IAAA,CAAA,YAAA,CAAa,eAAe,SAAS,CAAA,CAAA;AAC1C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,UAAuC,GAAA;AACrC,IAAO,OAAA;AAAA,MACL,GAAG,MAAM,UAAW,EAAA;AAAA,MACpB,GAAA,EAAK,KAAK,MAAO,EAAA;AAAA,MACjB,IAAM,EAAA,gBAAA;AAAA,MACN,OAAS,EAAA,CAAA;AAAA,KACX,CAAA;AAAA,GACF;AAAA,EAEA,WAAA,CAAY,KAAoB,GAAe,EAAA;AAC7C,IAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACT,IAAK,IAAA,CAAA,KAAA,GAAQ,OAAO,EAAC,CAAA;AAAA,GACvB;AAAA,EAEA,SAAyB,GAAA;AACvB,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAC7C,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AAAA,EAEA,SAAqB,GAAA;AACnB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAM,EAAqB,EAAA;AACzB,IAAM,MAAA,GAAA,GAAM,KAAK,MAAO,EAAA,CAAA;AACxB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AACnC,MAAI,IAAA,EAAA,KAAO,GAAI,CAAA,CAAC,CAAG,EAAA;AACjB,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAwB,GAAA;AACtB,IAAM,MAAA,IAAA,GAAO,KAAK,SAAU,EAAA,CAAA;AAC5B,IAAA,OAAO,iBAAkB,CAAA,IAAI,CAAI,GAAA,IAAA,CAAK,QAAQ,EAAC,CAAA;AAAA,GACjD;AAAA,EAEA,MAAM,EAAkB,EAAA;AACtB,IAAM,MAAA,IAAA,GAAO,KAAK,WAAY,EAAA,CAAA;AAC9B,IAAI,IAAA,iBAAA,CAAkB,IAAI,CAAG,EAAA;AAC3B,MAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAA;AACjB,MAAA,IAAA,CAAK,KAAQ,GAAA,GAAA,CAAA;AACb,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AAEnC,QAAI,IAAA,EAAA,KAAO,GAAI,CAAA,CAAC,CAAG,EAAA;AACjB,UAAA,OAAA;AAAA,SACF;AAAA,OACF;AACA,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA,CAAA;AAAA,KACb;AAAA,GACF;AAAA,EAEA,SAAS,EAAkB,EAAA;AACzB,IAAM,MAAA,IAAA,GAAO,KAAK,WAAY,EAAA,CAAA;AAC9B,IAAI,IAAA,iBAAA,CAAkB,IAAI,CAAG,EAAA;AAC3B,MAAA,MAAM,MAAM,IAAK,CAAA,KAAA,CAAA;AACjB,MAAA,IAAA,CAAK,KAAQ,GAAA,GAAA,CAAA;AACb,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,CAAI,QAAQ,CAAK,EAAA,EAAA;AACnC,QAAI,IAAA,EAAA,KAAO,GAAI,CAAA,CAAC,CAAG,EAAA;AACjB,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACf,UAAA,OAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA,EAEA,cAAA,CACE,CACA,EAAA,gBAAA,GAAmB,IACC,EAAA;AACpB,IAAM,MAAA,QAAA,GAAW,qBAAsB,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AACjD,IAAK,IAAA,CAAA,WAAA,CAAY,UAAU,gBAAgB,CAAA,CAAA;AAC3C,IAAO,OAAA,QAAA,CAAA;AAAA,GACT;AAAA,EAEA,mBAA6B,GAAA;AAC3B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,kBAA4B,GAAA;AAC1B,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,UAAoB,GAAA;AAClB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,QAAiB,GAAA;AACf,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,gBAAA,CACE,CACA,EAAA,SAAA,EACA,WACS,EAAA;AACT,IAAA,IAAI,CAACC,yBAAA,CAAkB,SAAS,CAAA,IAAK,gBAAgB,MAAQ,EAAA;AAC3D,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AACA,IAAA,MAAM,SAAS,SAAU,CAAA,MAAA,CAAA;AACzB,IAAA,MAAM,QAAQ,SAAU,CAAA,KAAA,CAAA;AACxB,IAAM,MAAA,UAAA,GAAa,OAAO,OAAQ,EAAA,CAAA;AAClC,IAAM,MAAA,SAAA,GAAY,MAAM,OAAQ,EAAA,CAAA;AAChC,IAAM,MAAA,UAAA,GAAa,UAAU,UAAW,EAAA,CAAA;AACxC,IAAM,MAAA,eAAA,GAAkB,aACpB,MAAO,CAAA,MAAA,GAAS,MAAM,MACtB,GAAA,KAAA,CAAM,SAAS,MAAO,CAAA,MAAA,CAAA;AAC1B,IACE,OAAA,IAAA,CAAK,UAAW,CAAA,UAAU,CAC1B,IAAA,IAAA,CAAK,UAAW,CAAA,SAAS,CACzB,IAAA,IAAA,CAAK,cAAe,EAAA,CAAE,MAAW,KAAA,eAAA,CAAA;AAAA,GAErC;AAAA,EAEA,gBAAgB,WAAwC,EAAA;AACtD,IAAA,OAAO,WAAgB,KAAA,OAAA,CAAA;AAAA,GACzB;AACF,CAAA;AAEO,SAAS,sBAAsB,GAAoC,EAAA;AACxE,EAAA,OAAOC,6BAAsB,CAAA,IAAI,cAAe,CAAA,GAAG,CAAC,CAAA,CAAA;AACtD,CAAA;AAEO,SAAS,kBACd,IACwB,EAAA;AACxB,EAAA,OAAO,IAAgB,YAAA,cAAA,CAAA;AACzB;;;;;;"}