Also cleaned up old unused imports.
-import {$getSelection, createEditor, CreateEditorArgs, isCurrentlyReadOnlyMode, LexicalEditor} from 'lexical';
+import {$getSelection, createEditor, CreateEditorArgs, LexicalEditor} from 'lexical';
import {createEmptyHistoryState, registerHistory} from '@lexical/history';
import {registerRichText} from '@lexical/rich-text';
import {mergeRegister} from '@lexical/utils';
$getSelection,
$isDecoratorNode,
$isElementNode,
- $isRangeSelection,
$isTextNode,
$setSelection,
} from '.';
import {
DOUBLE_LINE_BREAK,
FULL_RECONCILE,
- IS_ALIGN_CENTER,
- IS_ALIGN_END,
- IS_ALIGN_JUSTIFY,
- IS_ALIGN_LEFT,
- IS_ALIGN_RIGHT,
- IS_ALIGN_START,
+
+
+
+
+
+
} from './LexicalConstants';
import {EditorState} from './LexicalEditorState';
import {
import invariant from 'lexical/shared/invariant';
import {
- $createTestDecoratorNode,
$createTestElementNode,
$createTestInlineElementNode,
createTestEditor,
-import {ElementNode} from "./LexicalElementNode";
-import {CommonBlockAlignment, SerializedCommonBlockNode} from "../../../nodes/_common";
+import {ElementNode, type SerializedElementNode} from "./LexicalElementNode";
+import {CommonBlockAlignment, CommonBlockInterface} from "./common";
+import {Spread} from "lexical";
-export class CommonBlockNode extends ElementNode {
+export type SerializedCommonBlockNode = Spread<{
+ id: string;
+ alignment: CommonBlockAlignment;
+ inset: number;
+}, SerializedElementNode>
+
+export class CommonBlockNode extends ElementNode implements CommonBlockInterface {
__id: string = '';
__alignment: CommonBlockAlignment = '';
__inset: number = 0;
import {$isTextNode, TextNode} from '../index';
import {
DOUBLE_LINE_BREAK,
- ELEMENT_FORMAT_TO_TYPE,
- ELEMENT_TYPE_TO_FORMAT,
+
+
} from '../LexicalConstants';
import {LexicalNode} from '../LexicalNode';
import {
import {$isTextNode} from './LexicalTextNode';
import {
commonPropertiesDifferent, deserializeCommonBlockNode,
- SerializedCommonBlockNode, setCommonBlockPropsFromElement,
+ setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "../../../nodes/_common";
-import {CommonBlockNode, copyCommonBlockProperties} from "lexical/nodes/CommonBlockNode";
+} from "./common";
+import {CommonBlockNode, copyCommonBlockProperties, SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
export type SerializedParagraphNode = Spread<
{
$insertDataTransferForPlainText,
$insertDataTransferForRichText,
} from '@lexical/clipboard';
-import {$createListItemNode, $createListNode} from '@lexical/list';
-import {registerRichText} from '@lexical/rich-text';
import {
$createParagraphNode,
- $createRangeSelection,
$createTabNode,
- $createTextNode,
$getRoot,
$getSelection,
$insertNodes,
- $isElementNode,
$isRangeSelection,
- $isTextNode,
- $setSelection,
- KEY_TAB_COMMAND,
+
} from 'lexical';
import {
initializeUnitTest,
invariant,
} from '../../../__tests__/utils';
-import {$createHeadingNode} from "@lexical/rich-text/LexicalHeadingNode";
describe('LexicalTabNode tests', () => {
initializeUnitTest((testEnv) => {
$setCompositionKey,
getEditorStateTextContent,
} from '../../../LexicalUtils';
-import {Text} from "@codemirror/state";
import {$generateHtmlFromNodes} from "@lexical/html";
-import {formatBold} from "@lexical/selection/__tests__/utils";
const editorConfig = Object.freeze({
namespace: '',
-import {LexicalNode, Spread} from "lexical";
-import type {SerializedElementNode} from "lexical/nodes/LexicalElementNode";
-import {el, sizeToPixels} from "../utils/dom";
+import {sizeToPixels} from "../../../utils/dom";
+import {SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
export type CommonBlockAlignment = 'left' | 'right' | 'center' | 'justify' | '';
const validAlignments: CommonBlockAlignment[] = ['left', 'right', 'center', 'justify'];
type EditorNodeDirection = 'ltr' | 'rtl' | null;
-export type SerializedCommonBlockNode = Spread<{
- id: string;
- alignment: CommonBlockAlignment;
- inset: number;
-}, SerializedElementNode>
-
export interface NodeHasAlignment {
readonly __alignment: CommonBlockAlignment;
setAlignment(alignment: CommonBlockAlignment): void;
getDirection(): EditorNodeDirection;
}
-interface CommonBlockInterface extends NodeHasId, NodeHasAlignment, NodeHasInset, NodeHasDirection {}
+export interface CommonBlockInterface extends NodeHasId, NodeHasAlignment, NodeHasInset, NodeHasDirection {}
export function extractAlignmentFromElement(element: HTMLElement): CommonBlockAlignment {
const textAlignStyle: string = element.style.textAlign || '';
updateChildrenListItemValue,
} from './formatList';
import {$getListDepth, $wrapInListItem} from './utils';
-import {extractDirectionFromElement} from "../../nodes/_common";
+import {extractDirectionFromElement} from "lexical/nodes/common";
export type SerializedListNode = Spread<
{
The original work built upon in this directory and below is under the copyright of Meta Platforms, Inc. and affiliates.
The original license can be seen in the [ORIGINAL-LEXICAL-LICENSE](./ORIGINAL-LEXICAL-LICENSE) file.
-Files may have since been modified with modifications being under the license and copyright of the BookStack project as a whole.
\ No newline at end of file
+Files may have since been added or modified with changes being under the license and copyright of the BookStack project as a whole.
\ No newline at end of file
import type {RangeSelection} from "lexical/LexicalSelection";
import {
CommonBlockAlignment, commonPropertiesDifferent, deserializeCommonBlockNode,
- SerializedCommonBlockNode,
setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "./_common";
+} from "lexical/nodes/common";
+import {SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
export type CalloutCategory = 'info' | 'danger' | 'warning' | 'success';
Spread
} from "lexical";
import type {EditorConfig} from "lexical/LexicalEditor";
-import {EditorDecoratorAdapter} from "../ui/framework/decorator";
-import {CodeEditor} from "../../components";
-import {el} from "../utils/dom";
+import {EditorDecoratorAdapter} from "../../ui/framework/decorator";
+import {CodeEditor} from "../../../components";
+import {el} from "../../utils/dom";
export type SerializedCodeBlockNode = Spread<{
language: string;
EditorConfig,
} from 'lexical';
-import {el} from "../utils/dom";
-import {extractDirectionFromElement} from "./_common";
+import {el} from "../../utils/dom";
+import {extractDirectionFromElement} from "lexical/nodes/common";
export type SerializedDetailsNode = Spread<{
id: string;
Spread
} from "lexical";
import type {EditorConfig} from "lexical/LexicalEditor";
-import {EditorDecoratorAdapter} from "../ui/framework/decorator";
-import {el} from "../utils/dom";
+import {EditorDecoratorAdapter} from "../../ui/framework/decorator";
+import {el} from "../../utils/dom";
export type SerializedDiagramNode = Spread<{
id: string;
type NodeKey,
type ParagraphNode,
type RangeSelection,
- type SerializedElementNode,
type Spread
} from "lexical";
import {addClassNamesToElement} from "@lexical/utils";
-import {CommonBlockNode, copyCommonBlockProperties} from "lexical/nodes/CommonBlockNode";
+import {CommonBlockNode, copyCommonBlockProperties, SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
import {
commonPropertiesDifferent, deserializeCommonBlockNode,
- SerializedCommonBlockNode, setCommonBlockPropsFromElement,
+ setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "../../nodes/_common";
+} from "lexical/nodes/common";
export type HeadingTagType = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
Spread
} from "lexical";
import type {EditorConfig} from "lexical/LexicalEditor";
-import {CommonBlockAlignment, extractAlignmentFromElement} from "./_common";
-import {$selectSingleNode} from "../utils/selection";
+import {CommonBlockAlignment, extractAlignmentFromElement} from "lexical/nodes/common";
+import {$selectSingleNode} from "../../utils/selection";
import {SerializedElementNode} from "lexical/nodes/LexicalElementNode";
export interface ImageNodeOptions {
} from 'lexical';
import type {EditorConfig} from "lexical/LexicalEditor";
-import {el, setOrRemoveAttribute, sizeToPixels} from "../utils/dom";
+import {el, setOrRemoveAttribute, sizeToPixels} from "../../utils/dom";
import {
CommonBlockAlignment, deserializeCommonBlockNode,
- SerializedCommonBlockNode,
setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "./_common";
-import {$selectSingleNode} from "../utils/selection";
+} from "lexical/nodes/common";
+import {$selectSingleNode} from "../../utils/selection";
+import {SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
export type MediaNodeTag = 'iframe' | 'embed' | 'object' | 'video' | 'audio';
export type MediaNodeSource = {
type DOMConversionOutput,
type DOMExportOutput,
type EditorConfig,
- ElementNode,
isHTMLElement,
type LexicalEditor,
LexicalNode,
type NodeKey,
type ParagraphNode,
- type RangeSelection,
- SerializedElementNode
+ type RangeSelection
} from "lexical";
import {addClassNamesToElement} from "@lexical/utils";
-import {CommonBlockNode, copyCommonBlockProperties} from "lexical/nodes/CommonBlockNode";
+import {CommonBlockNode, copyCommonBlockProperties, SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
import {
commonPropertiesDifferent, deserializeCommonBlockNode,
- SerializedCommonBlockNode, setCommonBlockPropsFromElement,
+ setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "../../nodes/_common";
+} from "lexical/nodes/common";
export type SerializedQuoteNode = SerializedCommonBlockNode;
} from 'lexical';
import {extractStyleMapFromElement, StyleMap} from "../../utils/dom";
-import {CommonBlockAlignment, extractAlignmentFromElement} from "../../nodes/_common";
+import {CommonBlockAlignment, extractAlignmentFromElement} from "lexical/nodes/common";
export const TableCellHeaderStates = {
BOTH: 3,
LexicalEditor,
LexicalNode,
NodeKey,
- SerializedElementNode, Spread,
+ Spread,
} from 'lexical';
import {addClassNamesToElement, isHTMLElement} from '@lexical/utils';
import {
$applyNodeReplacement,
$getNearestNodeFromDOMNode,
- ElementNode,
+
} from 'lexical';
import {$isTableCellNode} from './LexicalTableCellNode';
import {TableDOMCell, TableDOMTable} from './LexicalTableObserver';
import {getTable} from './LexicalTableSelectionHelpers';
-import {CommonBlockNode, copyCommonBlockProperties} from "lexical/nodes/CommonBlockNode";
+import {CommonBlockNode, copyCommonBlockProperties, SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
import {
commonPropertiesDifferent, deserializeCommonBlockNode,
- SerializedCommonBlockNode, setCommonBlockPropsFromElement,
+ setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
-} from "../../nodes/_common";
+} from "lexical/nodes/common";
import {el, extractStyleMapFromElement, StyleMap} from "../../utils/dom";
import {getTableColumnWidths} from "../../utils/tables";
} from './LexicalTableSelection';
import type {
BaseSelection,
- ElementFormatType,
LexicalCommand,
LexicalEditor,
LexicalNode,
DELETE_LINE_COMMAND,
DELETE_WORD_COMMAND,
FOCUS_COMMAND,
- FORMAT_ELEMENT_COMMAND,
FORMAT_TEXT_COMMAND,
INSERT_PARAGRAPH_COMMAND,
KEY_ARROW_DOWN_COMMAND,
-import {CalloutNode} from './callout';
+import {CalloutNode} from '@lexical/rich-text/LexicalCalloutNode';
import {
ElementNode,
KlassConstructor,
ParagraphNode
} from "lexical";
import {LinkNode} from "@lexical/link";
-import {ImageNode} from "./image";
-import {DetailsNode, SummaryNode} from "./details";
+import {ImageNode} from "@lexical/rich-text/LexicalImageNode";
+import {DetailsNode, SummaryNode} from "@lexical/rich-text/LexicalDetailsNode";
import {ListItemNode, ListNode} from "@lexical/list";
import {TableCellNode, TableNode, TableRowNode} from "@lexical/table";
-import {HorizontalRuleNode} from "./horizontal-rule";
-import {CodeBlockNode} from "./code-block";
-import {DiagramNode} from "./diagram";
-import {EditorUiContext} from "../ui/framework/core";
-import {MediaNode} from "./media";
+import {HorizontalRuleNode} from "@lexical/rich-text/LexicalHorizontalRuleNode";
+import {CodeBlockNode} from "@lexical/rich-text/LexicalCodeBlockNode";
+import {DiagramNode} from "@lexical/rich-text/LexicalDiagramNode";
+import {EditorUiContext} from "./ui/framework/core";
+import {MediaNode} from "@lexical/rich-text/LexicalMediaNode";
import {HeadingNode} from "@lexical/rich-text/LexicalHeadingNode";
import {QuoteNode} from "@lexical/rich-text/LexicalQuoteNode";
import {$insertNewBlockNodesAtSelection, $selectSingleNode} from "../utils/selection";
import {$getNearestBlockNodeForCoords, $htmlToBlockNodes} from "../utils/nodes";
import {Clipboard} from "../../services/clipboard";
-import {$createImageNode} from "../nodes/image";
+import {$createImageNode} from "@lexical/rich-text/LexicalImageNode";
import {$createLinkNode} from "@lexical/link";
import {EditorImageData, uploadImageFile} from "../utils/images";
import {EditorUiContext} from "../ui/framework/core";
LexicalEditor,
LexicalNode
} from "lexical";
-import {$isImageNode} from "../nodes/image";
-import {$isMediaNode} from "../nodes/media";
+import {$isImageNode} from "@lexical/rich-text/LexicalImageNode";
+import {$isMediaNode} from "@lexical/rich-text/LexicalMediaNode";
import {getLastSelection} from "../utils/selection";
import {$getNearestNodeBlockParent} from "../utils/nodes";
import {$setInsetForSelection} from "../utils/lists";
import {EditorDecorator} from "../framework/decorator";
import {EditorUiContext} from "../framework/core";
-import {$openCodeEditorForNode, CodeBlockNode} from "../../nodes/code-block";
-import {$isDecoratorNode, BaseSelection} from "lexical";
+import {$openCodeEditorForNode, CodeBlockNode} from "@lexical/rich-text/LexicalCodeBlockNode";
+import {BaseSelection} from "lexical";
import {$selectionContainsNode, $selectSingleNode} from "../../utils/selection";
import {EditorDecorator} from "../framework/decorator";
import {EditorUiContext} from "../framework/core";
import {BaseSelection} from "lexical";
-import {DiagramNode} from "../../nodes/diagram";
+import {DiagramNode} from "@lexical/rich-text/LexicalDiagramNode";
import {$selectionContainsNode, $selectSingleNode} from "../../utils/selection";
import {$openDrawingEditorForNode} from "../../utils/diagrams";
import rtlIcon from "@icons/editor/direction-rtl.svg";
import {
$getBlockElementNodesInSelection,
- $selectionContainsAlignment, $selectionContainsDirection, $selectSingleNode, $toggleSelection, getLastSelection
+ $selectionContainsAlignment, $selectionContainsDirection, $selectSingleNode, getLastSelection
} from "../../../utils/selection";
-import {CommonBlockAlignment} from "../../../nodes/_common";
+import {CommonBlockAlignment} from "lexical/nodes/common";
import {nodeHasAlignment} from "../../../utils/nodes";
-import {$createCalloutNode, $isCalloutNodeOfCategory, CalloutCategory} from "../../../nodes/callout";
+import {$createCalloutNode, $isCalloutNodeOfCategory, CalloutCategory} from "@lexical/rich-text/LexicalCalloutNode";
import {EditorButtonDefinition} from "../../framework/buttons";
import {EditorUiContext} from "../../framework/core";
import {$isParagraphNode, BaseSelection, LexicalNode} from "lexical";
import linkIcon from "@icons/editor/link.svg";
import {EditorUiContext} from "../../framework/core";
import {
- $createTextNode,
$getRoot,
$getSelection, $insertNodes,
BaseSelection,
- ElementNode, isCurrentlyReadOnlyMode
+ ElementNode
} from "lexical";
import {$isLinkNode, LinkNode} from "@lexical/link";
import unlinkIcon from "@icons/editor/unlink.svg";
import imageIcon from "@icons/editor/image.svg";
-import {$isImageNode, ImageNode} from "../../../nodes/image";
+import {$isImageNode, ImageNode} from "@lexical/rich-text/LexicalImageNode";
import horizontalRuleIcon from "@icons/editor/horizontal-rule.svg";
-import {$createHorizontalRuleNode, $isHorizontalRuleNode} from "../../../nodes/horizontal-rule";
+import {$createHorizontalRuleNode, $isHorizontalRuleNode} from "@lexical/rich-text/LexicalHorizontalRuleNode";
import codeBlockIcon from "@icons/editor/code-block.svg";
-import {$isCodeBlockNode} from "../../../nodes/code-block";
+import {$isCodeBlockNode} from "@lexical/rich-text/LexicalCodeBlockNode";
import editIcon from "@icons/edit.svg";
import diagramIcon from "@icons/editor/diagram.svg";
-import {$createDiagramNode, DiagramNode} from "../../../nodes/diagram";
+import {$createDiagramNode, DiagramNode} from "@lexical/rich-text/LexicalDiagramNode";
import detailsIcon from "@icons/editor/details.svg";
import mediaIcon from "@icons/editor/media.svg";
-import {$createDetailsNode, $isDetailsNode} from "../../../nodes/details";
-import {$isMediaNode, MediaNode} from "../../../nodes/media";
+import {$createDetailsNode, $isDetailsNode} from "@lexical/rich-text/LexicalDetailsNode";
+import {$isMediaNode, MediaNode} from "@lexical/rich-text/LexicalMediaNode";
import {
$getNodeFromSelection,
$insertNewBlockNodeAtSelection,
EditorSelectFormFieldDefinition
} from "../../framework/forms";
import {EditorUiContext} from "../../framework/core";
-import {$createNodeSelection, $createTextNode, $getSelection, $insertNodes, $setSelection} from "lexical";
-import {$isImageNode, ImageNode} from "../../../nodes/image";
-import {$createLinkNode, $isLinkNode, LinkNode} from "@lexical/link";
-import {$createMediaNodeFromHtml, $createMediaNodeFromSrc, $isMediaNode, MediaNode} from "../../../nodes/media";
-import {$insertNodeToNearestRoot} from "@lexical/utils";
+import {$createNodeSelection, $getSelection, $insertNodes, $setSelection} from "lexical";
+import {$isImageNode, ImageNode} from "@lexical/rich-text/LexicalImageNode";
+import {LinkNode} from "@lexical/link";
+import {$createMediaNodeFromHtml, $createMediaNodeFromSrc, $isMediaNode, MediaNode} from "@lexical/rich-text/LexicalMediaNode";
import {$getNodeFromSelection, getLastSelection} from "../../../utils/selection";
import {EditorFormModal} from "../../framework/modals";
import {EditorActionField} from "../../framework/blocks/action-field";
} from "../../framework/forms";
import {EditorUiContext} from "../../framework/core";
import {EditorFormModal} from "../../framework/modals";
-import {$getSelection, ElementFormatType} from "lexical";
+import {$getSelection} from "lexical";
import {
$forEachTableCell, $getCellPaddingForTable,
$getTableCellColumnWidth,
} from "../../../utils/tables";
import {formatSizeValue} from "../../../utils/dom";
import {TableCellNode, TableNode, TableRowNode} from "@lexical/table";
-import {CommonBlockAlignment} from "../../../nodes/_common";
+import {CommonBlockAlignment} from "lexical/nodes/common";
const borderStyleInput: EditorSelectFormFieldDefinition = {
label: 'Border style',
import {BaseSelection, LexicalNode,} from "lexical";
import {MouseDragTracker, MouseDragTrackerDistance} from "./mouse-drag-tracker";
import {el} from "../../../utils/dom";
-import {$isImageNode} from "../../../nodes/image";
+import {$isImageNode} from "@lexical/rich-text/LexicalImageNode";
import {EditorUiContext} from "../core";
-import {NodeHasSize} from "../../../nodes/_common";
-import {$isMediaNode} from "../../../nodes/media";
+import {NodeHasSize} from "lexical/nodes/common";
+import {$isMediaNode} from "@lexical/rich-text/LexicalMediaNode";
function isNodeWithSize(node: LexicalNode): node is NodeHasSize&LexicalNode {
return $isImageNode(node) || $isMediaNode(node);
import {EditorFormModal, EditorFormModalDefinition} from "./modals";
import {EditorContainerUiElement, EditorUiContext, EditorUiElement, EditorUiStateUpdate} from "./core";
import {EditorDecorator, EditorDecoratorAdapter} from "./decorator";
-import {$getSelection, BaseSelection, COMMAND_PRIORITY_LOW, LexicalEditor, SELECTION_CHANGE_COMMAND} from "lexical";
+import {BaseSelection, LexicalEditor} from "lexical";
import {DecoratorListener} from "lexical/LexicalEditor";
import type {NodeKey} from "lexical/LexicalNode";
import {EditorContextToolbar, EditorContextToolbarDefinition} from "./toolbars";
-import {$getSelection, $insertNodes, LexicalEditor, LexicalNode} from "lexical";
+import {$insertNodes, LexicalEditor, LexicalNode} from "lexical";
import {HttpError} from "../../services/http";
import {EditorUiContext} from "../ui/framework/core";
import * as DrawIO from "../../services/drawio";
-import {$createDiagramNode, DiagramNode} from "../nodes/diagram";
+import {$createDiagramNode, DiagramNode} from "@lexical/rich-text/LexicalDiagramNode";
import {ImageManager} from "../../components";
import {EditorImageData} from "./images";
import {$getNodeFromSelection, getLastSelection} from "./selection";
$toggleSelectionBlockNodeType,
getLastSelection
} from "./selection";
-import {$createCodeBlockNode, $isCodeBlockNode, $openCodeEditorForNode, CodeBlockNode} from "../nodes/code-block";
-import {$createCalloutNode, $isCalloutNode, CalloutCategory} from "../nodes/callout";
+import {$createCodeBlockNode, $isCodeBlockNode, $openCodeEditorForNode, CodeBlockNode} from "@lexical/rich-text/LexicalCodeBlockNode";
+import {$createCalloutNode, $isCalloutNode, CalloutCategory} from "@lexical/rich-text/LexicalCalloutNode";
import {$isListNode, insertList, ListNode, ListType, removeList} from "@lexical/list";
import {$createLinkNode, $isLinkNode} from "@lexical/link";
import {$createHeadingNode, $isHeadingNode, HeadingTagType} from "@lexical/rich-text/LexicalHeadingNode";
import {ImageManager} from "../../components";
-import {$createImageNode} from "../nodes/image";
+import {$createImageNode} from "@lexical/rich-text/LexicalImageNode";
import {$createLinkNode, LinkNode} from "@lexical/link";
export type EditorImageData = {
import {LexicalNodeMatcher} from "../nodes";
import {$generateNodesFromDOM} from "@lexical/html";
import {htmlToDom} from "./dom";
-import {NodeHasAlignment, NodeHasInset} from "../nodes/_common";
+import {NodeHasAlignment, NodeHasInset} from "lexical/nodes/common";
import {$findMatchingParent} from "@lexical/utils";
function wrapTextNodes(nodes: LexicalNode[]): LexicalNode[] {
import {$setBlocksType} from "@lexical/selection";
import {$getNearestNodeBlockParent, $getParentOfType, nodeHasAlignment} from "./nodes";
-import {CommonBlockAlignment} from "../nodes/_common";
+import {CommonBlockAlignment} from "lexical/nodes/common";
const lastSelectionByEditor = new WeakMap<LexicalEditor, BaseSelection|null>;