UNPKG

@terrible-lexical/yjs

Version:

The library provides Yjs editor bindings for Lexical.

79 lines (73 loc) 2.13 kB
/** * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ import type {CollabDecoratorNode} from './CollabDecoratorNode'; import type {CollabElementNode} from './CollabElementNode'; import type {CollabLineBreakNode} from './CollabLineBreakNode'; import type {CollabTextNode} from './CollabTextNode'; import type {Cursor} from './SyncCursors'; import type {LexicalEditor, NodeKey} from 'terrible-lexical'; import type {Doc} from 'yjs'; import {Klass, LexicalNode} from 'terrible-lexical'; import invariant from '@terrible-lexical/shared/src/invariant'; import {XmlText} from 'yjs'; import {Provider} from '.'; import {$createCollabElementNode} from './CollabElementNode'; export type ClientID = number; export type Binding = { clientID: number; collabNodeMap: Map< NodeKey, | CollabElementNode | CollabTextNode | CollabDecoratorNode | CollabLineBreakNode >; cursors: Map<ClientID, Cursor>; cursorsContainer: null | HTMLElement; doc: Doc; docMap: Map<string, Doc>; editor: LexicalEditor; id: string; nodeProperties: Map<string, Array<string>>; root: CollabElementNode; excludedProperties: ExcludedProperties; }; export type ExcludedProperties = Map<Klass<LexicalNode>, Set<string>>; export function createBinding( editor: LexicalEditor, provider: Provider, id: string, doc: Doc | null | undefined, docMap: Map<string, Doc>, excludedProperties?: ExcludedProperties, ): Binding { invariant( doc !== undefined && doc !== null, 'createBinding: doc is null or undefined', ); const rootXmlText = doc.get('root', XmlText) as XmlText; const root: CollabElementNode = $createCollabElementNode( rootXmlText, null, 'root', ); root._key = 'root'; return { clientID: doc.clientID, collabNodeMap: new Map(), cursors: new Map(), cursorsContainer: null, doc, docMap, editor, excludedProperties: excludedProperties || new Map(), id, nodeProperties: new Map(), root, }; }