{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","../src/index.ts","../src/collab.ts","../src/GroupMentionNodeLite.ts","../src/MentionNodeLite.ts","../src/ThreadNodeLite.ts","../src/version.ts"],"names":["DecoratorNode","$applyNodeReplacement","MENTION_CHARACTER","createHeadlessEditor","Doc","createBinding"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-node-lexical/dist/index.cjs","sourcesContent":[null,"import { createHeadlessEditor } from \"@lexical/headless\";\nimport { $convertToMarkdownString, TRANSFORMERS } from \"@lexical/markdown\";\nimport { createBinding } from \"@lexical/yjs\";\nimport { detectDupes } from \"@liveblocks/core\";\nimport type { Liveblocks } from \"@liveblocks/node\";\nimport type {\n  EditorState,\n  Klass,\n  LexicalEditor,\n  LexicalNode,\n  LexicalNodeReplacement,\n  SerializedEditorState,\n  SerializedLexicalNode,\n} from \"lexical\";\nimport { $getRoot } from \"lexical\";\nimport { applyUpdate, Doc, encodeStateAsUpdate, encodeStateVector } from \"yjs\";\n\nimport { createNoOpProvider, registerCollaborationListeners } from \"./collab\";\nimport { GroupMentionNode } from \"./GroupMentionNodeLite\";\nimport { MentionNode } from \"./MentionNodeLite\";\nimport { ThreadMarkNode } from \"./ThreadNodeLite\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nconst LIVEBLOCKS_NODES = [ThreadMarkNode, MentionNode, GroupMentionNode];\n\nexport { $createParagraphNode, $createTextNode, $getRoot } from \"lexical\";\n\nexport type LiveblocksLexicalOptions = {\n  roomId: string;\n  nodes?: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>;\n  client: Liveblocks;\n};\n\nexport type LiveblocksDocumentApi = {\n  refresh: () => Promise<void>;\n  update: (modifyFn: () => void) => Promise<void>;\n  getTextContent: () => string;\n  getEditorState: () => EditorState;\n  getLexicalEditor: () => LexicalEditor;\n  toJSON: () => SerializedEditorState<SerializedLexicalNode>;\n  toMarkdown: () => string;\n};\n\n/**\n *\n * `withLexicalDocument` is the main entry point to access and modify Lexical documents on your backend.\n * This function internally instantiates a Lexical headless editor and allows you to modify and export its values asynchronously\n * with a simplified interface.\n *\n * @param options Specify the roomId, client, and nodes.\n * @param callback The call back function is optionally async and receives the document API as its only argument.\n *\n * @example\n *\n * import { Liveblocks } from \"@liveblocks/node\";\n * import { withLexicalDocument } from \"@liveblocks/node-lexical\";\n *\n * const client = new Liveblocks({secret: \"sk_your_secret_key\"});\n * const text = await withLexicalDocument(\n *   { client, roomId: \"your-room\" },\n *   async (doc) => {\n *     await doc.update(() => {\n *       const root = $getRoot();\n *       const paragraphNode = $createParagraphNode();\n *       const textNode = $createTextNode(\"Hello from node\");\n *       paragraphNode.append(textNode);\n *       root.append(paragraphNode);\n *     });\n *     return doc.getTextContent();\n *   }\n * );\n *\n */\nexport async function withLexicalDocument<T>(\n  { roomId, nodes, client }: LiveblocksLexicalOptions,\n  callback: (api: LiveblocksDocumentApi) => Promise<T> | T\n): Promise<T> {\n  const update = new Uint8Array(\n    await client.getYjsDocumentAsBinaryUpdate(roomId)\n  );\n  const editor = createHeadlessEditor({\n    nodes: [...LIVEBLOCKS_NODES, ...(nodes ?? [])],\n  });\n  const id = \"root\";\n  const doc = new Doc();\n  const docMap = new Map([[id, doc]]);\n  const provider = createNoOpProvider();\n  const binding = createBinding(editor, provider, id, doc, docMap);\n  const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n  applyUpdate(binding.doc, update);\n  editor.update(() => {}, { discrete: true });\n\n  const val = await callback({\n    /**\n     * Fetches and resyncs the latest document with Liveblocks\n     */\n    refresh: async () => {\n      const latest = new Uint8Array(\n        await client.getYjsDocumentAsBinaryUpdate(roomId)\n      );\n      applyUpdate(binding.doc, latest);\n      editor.update(() => {}, { discrete: true });\n    },\n    /**\n     * Provide a callback to modify documetns with Lexical's standard api. All calls are discrete.\n     */\n    update: async (modifyFn) => {\n      // Flush any pending updates (there really shouldn't be any?), this may be a NOOP\n      editor.update(() => {}, { discrete: true });\n      const beforeVector = encodeStateVector(binding.doc);\n      editor.update(\n        () => {\n          modifyFn();\n        },\n        { discrete: true }\n      );\n      // grab update after diffing\n      const diffUpdate = encodeStateAsUpdate(binding.doc, beforeVector);\n      return client.sendYjsBinaryUpdate(roomId, diffUpdate);\n    },\n    /**\n     * Helper function to easily provide the text content from the root, i.e. `$getRoot().getTextContent()`\n     */\n    getTextContent: () => {\n      let content = \"\";\n      editor.getEditorState().read(() => {\n        content = $getRoot().getTextContent();\n      });\n      return content;\n    },\n    /**\n     * Helper function to return editorState in JSON form\n     */\n    toJSON: () => {\n      return editor.getEditorState().toJSON();\n    },\n    /**\n     * Helper function to return editor state as Markdown\n     */\n    toMarkdown: () => {\n      let markdown: string = \"\";\n      editor.getEditorState().read(() => {\n        markdown = $convertToMarkdownString(TRANSFORMERS);\n      });\n      return markdown;\n    },\n    /**\n     * Helper function to return the editor's current state\n     */\n    getEditorState: () => {\n      return editor.getEditorState();\n    },\n    /**\n     * Helper function to return the current headless editor instance\n     */\n    getLexicalEditor: () => {\n      return editor;\n    },\n  });\n  unsubscribe();\n\n  return val;\n}\n","import { createHeadlessEditor } from \"@lexical/headless\";\nimport type { Binding, Provider } from \"@lexical/yjs\";\nimport {\n  createBinding,\n  syncLexicalUpdateToYjs,\n  syncYjsChangesToLexical,\n} from \"@lexical/yjs\";\nimport type {\n  Klass,\n  LexicalEditor,\n  LexicalNode,\n  LexicalNodeReplacement,\n} from \"lexical\";\nimport type { Transaction, YEvent } from \"yjs\";\nimport { Doc } from \"yjs\";\n\nexport function withHeadlessCollaborationEditor<T>(\n  nodes: ReadonlyArray<Klass<LexicalNode> | LexicalNodeReplacement>,\n  callback: (editor: LexicalEditor, binding: Binding, provider: Provider) => T\n): T {\n  const editor = createHeadlessEditor({\n    nodes,\n  });\n\n  const id = \"root\";\n  const doc = new Doc();\n  const docMap = new Map([[id, doc]]);\n  const provider = createNoOpProvider();\n  const binding = createBinding(editor, provider, id, doc, docMap);\n\n  const unsubscribe = registerCollaborationListeners(editor, provider, binding);\n\n  const res = callback(editor, binding, provider);\n\n  unsubscribe();\n\n  return res;\n}\n\nexport function registerCollaborationListeners(\n  editor: LexicalEditor,\n  provider: Provider,\n  binding: Binding\n): () => void {\n  const unsubscribeUpdateListener = editor.registerUpdateListener(\n    ({\n      dirtyElements,\n      dirtyLeaves,\n      editorState,\n      normalizedNodes,\n      prevEditorState,\n      tags,\n    }) => {\n      if (tags.has(\"skip-collab\") === false) {\n        syncLexicalUpdateToYjs(\n          binding,\n          provider,\n          prevEditorState,\n          editorState,\n          dirtyElements,\n          dirtyLeaves,\n          normalizedNodes,\n          tags\n        );\n      }\n    }\n  );\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const observer = (events: Array<YEvent<any>>, transaction: Transaction) => {\n    if (transaction.origin !== binding) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      syncYjsChangesToLexical(binding, provider, events, false);\n    }\n  };\n\n  binding.root.getSharedType().observeDeep(observer);\n\n  return () => {\n    unsubscribeUpdateListener();\n    binding.root.getSharedType().unobserveDeep(observer);\n  };\n}\n\nexport function createNoOpProvider(): Provider {\n  const emptyFunction = () => {};\n\n  return {\n    awareness: {\n      getLocalState: () => null,\n      setLocalStateField: emptyFunction,\n      getStates: () => new Map(),\n      off: emptyFunction,\n      on: emptyFunction,\n      setLocalState: emptyFunction,\n    },\n    connect: emptyFunction,\n    disconnect: emptyFunction,\n    off: emptyFunction,\n    on: emptyFunction,\n  };\n}\n","import { MENTION_CHARACTER } from \"@liveblocks/core\";\nimport type { NodeKey, SerializedLexicalNode, Spread } from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\n\nexport type SerializedGroupMentionNode = Spread<\n  {\n    id: string;\n    groupId: string;\n    userIds: string[] | undefined;\n  },\n  SerializedLexicalNode\n>;\n\nexport class GroupMentionNode extends DecoratorNode<null> {\n  __id: string;\n  __groupId: string;\n  __userIds: string[] | undefined;\n\n  constructor(\n    id: string,\n    groupId: string,\n    userIds: string[] | undefined,\n    key?: NodeKey\n  ) {\n    super(key);\n    this.__id = id;\n    this.__groupId = groupId;\n    this.__userIds = userIds;\n  }\n\n  static getType(): string {\n    return \"lb-group-mention\";\n  }\n\n  static clone(node: GroupMentionNode): GroupMentionNode {\n    return new GroupMentionNode(node.__id, node.__groupId, node.__userIds);\n  }\n\n  static importJSON(\n    serializedNode: SerializedGroupMentionNode\n  ): GroupMentionNode {\n    const node = new GroupMentionNode(\n      serializedNode.id,\n      serializedNode.groupId,\n      serializedNode.userIds\n    );\n    return $applyNodeReplacement(node);\n  }\n\n  exportJSON(): SerializedGroupMentionNode {\n    return {\n      id: this.getId(),\n      groupId: this.getGroupId(),\n      userIds: this.getUserIds(),\n      type: \"lb-group-mention\",\n      version: 1,\n    };\n  }\n\n  getId(): string {\n    const self = this.getLatest();\n    return self.__id;\n  }\n\n  getGroupId(): string {\n    const self = this.getLatest();\n    return self.__groupId;\n  }\n\n  getUserIds(): string[] | undefined {\n    const self = this.getLatest();\n    return self.__userIds;\n  }\n\n  getTextContent(): string {\n    const groupId = this.getGroupId();\n\n    return MENTION_CHARACTER + groupId;\n  }\n\n  decorate(): null {\n    return null;\n  }\n}\n","import { MENTION_CHARACTER } from \"@liveblocks/core\";\nimport type { NodeKey, SerializedLexicalNode, Spread } from \"lexical\";\nimport { $applyNodeReplacement, DecoratorNode } from \"lexical\";\n\ntype LegacySerializedMentionNode = Spread<\n  {\n    // Legacy field now named `id`\n    value: string;\n    // Not present in legacy nodes\n    userId: never;\n  },\n  SerializedLexicalNode\n>;\n\nexport type SerializedMentionNode = Spread<\n  {\n    id: string;\n    userId: string | undefined;\n  },\n  SerializedLexicalNode\n>;\n\nexport class MentionNode extends DecoratorNode<null> {\n  __id: string;\n  __userId: string | undefined;\n\n  constructor(id: string, userId: string | undefined, key?: NodeKey) {\n    super(key);\n    this.__id = id;\n    this.__userId = userId;\n  }\n\n  static getType(): string {\n    return \"lb-mention\";\n  }\n\n  static clone(node: MentionNode): MentionNode {\n    return new MentionNode(node.__id, node.__userId);\n  }\n\n  static importJSON(\n    serializedNode: SerializedMentionNode | LegacySerializedMentionNode\n  ): MentionNode {\n    const node = new MentionNode(\n      (serializedNode as LegacySerializedMentionNode).value ??\n        (serializedNode as SerializedMentionNode).id,\n      (serializedNode as SerializedMentionNode).userId\n    );\n    return $applyNodeReplacement(node);\n  }\n\n  exportJSON(): SerializedMentionNode {\n    return {\n      id: this.getId(),\n      userId: this.getUserId(),\n      type: \"lb-mention\",\n      version: 1,\n    };\n  }\n\n  getId(): string {\n    const self = this.getLatest();\n    return self.__id;\n  }\n\n  getUserId(): string | undefined {\n    const self = this.getLatest();\n    return self.__userId;\n  }\n\n  getTextContent(): string {\n    const userId = this.getUserId();\n\n    if (userId) {\n      return MENTION_CHARACTER + userId;\n    }\n\n    // Legacy behavior: return the ID as text content\n    // Since the ID is an inbox notification ID (\"in_xxx\") and not a user ID, this isn't ideal\n    return this.getId();\n  }\n\n  decorate(): null {\n    return null;\n  }\n}\n","import type {\n  BaseSelection,\n  LexicalNode,\n  NodeKey,\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 importJSON(serializedNode: SerializedThreadMarkNode): ThreadMarkNode {\n    const node = $applyNodeReplacement<ThreadMarkNode>(\n      new ThreadMarkNode(serializedNode.ids)\n    );\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  getIDs(): Array<string> {\n    const self = this.getLatest();\n    return self instanceof ThreadMarkNode ? self.__ids : [];\n  }\n\n  constructor(ids: Array<string>, key?: NodeKey) {\n    super(key);\n    this.__ids = ids || [];\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","declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/node-lexical\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n"]}