@payloadcms/richtext-lexical 3.68.0-internal-debug.35482da → 3.68.0-internal-debug.654e4ad
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/client/index.d.ts +1 -0
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +1 -0
- package/dist/exports/client/index.js.map +1 -1
- package/dist/exports/client/internal-client.d.ts +3 -0
- package/dist/exports/client/internal-client.d.ts.map +1 -0
- package/dist/exports/client/internal-client.js +4 -0
- package/dist/exports/client/internal-client.js.map +1 -0
- package/dist/exports/react/index.d.ts +1 -1
- package/dist/exports/react/index.d.ts.map +1 -1
- package/dist/exports/react/index.js.map +1 -1
- package/dist/features/blocks/client/component/index.js +2 -2
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +2 -2
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.d.ts +2 -14
- package/dist/features/converters/lexicalToJSX/Component/index.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.js +4 -9
- package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.d.ts +16 -1
- package/dist/features/converters/lexicalToJSX/converter/index.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.js +87 -5
- package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/types.d.ts +14 -10
- package/dist/features/converters/lexicalToJSX/converter/types.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/types.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js +37 -21
- package/dist/field/Field.js.map +1 -1
- package/dist/field/RichTextViewProvider.d.ts +83 -0
- package/dist/field/RichTextViewProvider.d.ts.map +1 -0
- package/dist/field/RichTextViewProvider.js +102 -0
- package/dist/field/RichTextViewProvider.js.map +1 -0
- package/dist/field/ViewSelector.d.ts +4 -0
- package/dist/field/ViewSelector.d.ts.map +1 -0
- package/dist/field/ViewSelector.js +90 -0
- package/dist/field/ViewSelector.js.map +1 -0
- package/dist/field/ViewSelector.scss +34 -0
- package/dist/field/index.d.ts +1 -0
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +41 -16
- package/dist/field/index.js.map +1 -1
- package/dist/field/index.scss +12 -0
- package/dist/field/rscEntry.d.ts +1 -1
- package/dist/field/rscEntry.d.ts.map +1 -1
- package/dist/field/rscEntry.js +13 -1
- package/dist/field/rscEntry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/lexical/LexicalEditor.js +34 -28
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalProvider.d.ts.map +1 -1
- package/dist/lexical/LexicalProvider.js +19 -11
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/config/client/sanitize.d.ts +1 -1
- package/dist/lexical/config/client/sanitize.d.ts.map +1 -1
- package/dist/lexical/config/client/sanitize.js +3 -2
- package/dist/lexical/config/client/sanitize.js.map +1 -1
- package/dist/lexical/config/types.d.ts +4 -0
- package/dist/lexical/config/types.d.ts.map +1 -1
- package/dist/lexical/config/types.js +3 -1
- package/dist/lexical/config/types.js.map +1 -1
- package/dist/lexical/nodes/index.d.ts +12 -2
- package/dist/lexical/nodes/index.d.ts.map +1 -1
- package/dist/lexical/nodes/index.js +187 -2
- package/dist/lexical/nodes/index.js.map +1 -1
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts +2 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts.map +1 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.js +31 -0
- package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +1 -0
- package/dist/lexical/utils/point.js.map +1 -1
- package/dist/lexical/utils/rect.js.map +1 -1
- package/dist/types.d.ts +152 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +55 -0
- package/dist/types.js.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.js +2 -2
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
- package/dist/utilities/generateImportMap.d.ts.map +1 -1
- package/dist/utilities/generateImportMap.js +1 -0
- package/dist/utilities/generateImportMap.js.map +1 -1
- package/dist/validate/hasText.d.ts +6 -1
- package/dist/validate/hasText.d.ts.map +1 -1
- package/dist/validate/hasText.js +10 -4
- package/dist/validate/hasText.js.map +1 -1
- package/package.json +13 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/blocks/server/nodes/InlineBlocksNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n} from 'lexical'\nimport type { JsonObject } from 'payload'\nimport type React from 'react'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type InlineBlockFields<TInlineBlockFields extends JsonObject = JsonObject> = {\n blockType: string\n id: string\n} & TInlineBlockFields\n\nexport type SerializedInlineBlockNode<TBlockFields extends JsonObject = JsonObject> = {\n fields: InlineBlockFields<TBlockFields>\n} & StronglyTypedLeafNode<SerializedLexicalNode, 'inlineBlock'>\n\nexport class ServerInlineBlockNode extends DecoratorNode<null | React.ReactElement> {\n __cacheBuster: number\n __fields: InlineBlockFields\n\n constructor({\n cacheBuster,\n fields,\n key,\n }: {\n cacheBuster?: number\n fields: InlineBlockFields\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__cacheBuster = cacheBuster || 0\n }\n\n static override clone(node: ServerInlineBlockNode): ServerInlineBlockNode {\n return new this({\n cacheBuster: node.__cacheBuster,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'inlineBlock'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {}\n }\n\n static override importJSON(serializedNode: SerializedInlineBlockNode): ServerInlineBlockNode {\n const node = $createServerInlineBlockNode(serializedNode.fields)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n canIndent() {\n return true\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, config?.theme?.inlineBlock)\n return element\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element | null {\n return null\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('span')\n element.classList.add('inline-block-container')\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedInlineBlockNode {\n return {\n type: 'inlineBlock',\n fields: this.getFields(),\n version: 1,\n }\n }\n\n getCacheBuster(): number {\n return this.getLatest().__cacheBuster\n }\n\n getFields(): InlineBlockFields {\n return this.getLatest().__fields\n }\n\n override getTextContent(): string {\n return `Block Field`\n }\n\n override isInline() {\n return true\n }\n\n setFields(fields: InlineBlockFields, preventFormStateUpdate?: boolean): void {\n const writable = this.getWritable()\n writable.__fields = fields\n if (!preventFormStateUpdate) {\n writable.__cacheBuster++\n }\n }\n\n override updateDOM(): boolean {\n return false\n }\n}\n\nexport function $createServerInlineBlockNode(\n fields: Exclude<InlineBlockFields, 'id'>,\n): ServerInlineBlockNode {\n return $applyNodeReplacement(\n new ServerInlineBlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isServerInlineBlockNode(\n node: LexicalNode | null | ServerInlineBlockNode | undefined,\n): node is ServerInlineBlockNode {\n return node instanceof ServerInlineBlockNode\n}\n"],"names":["addClassNamesToElement","ObjectID","$applyNodeReplacement","DecoratorNode","ServerInlineBlockNode","__cacheBuster","__fields","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/blocks/server/nodes/InlineBlocksNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n} from 'lexical'\nimport type { JsonObject } from 'payload'\nimport type React from 'react'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type InlineBlockFields<TInlineBlockFields extends JsonObject = JsonObject> = {\n blockType: string\n id: string\n} & TInlineBlockFields\n\nexport type SerializedInlineBlockNode<TBlockFields extends JsonObject = JsonObject> = {\n fields: InlineBlockFields<TBlockFields>\n} & StronglyTypedLeafNode<SerializedLexicalNode, 'inlineBlock'>\n\nexport class ServerInlineBlockNode extends DecoratorNode<null | React.ReactElement> {\n __cacheBuster: number\n __fields: InlineBlockFields\n\n constructor({\n cacheBuster,\n fields,\n key,\n }: {\n cacheBuster?: number\n fields: InlineBlockFields\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__cacheBuster = cacheBuster || 0\n }\n\n static override clone(node: ServerInlineBlockNode): ServerInlineBlockNode {\n return new this({\n cacheBuster: node.__cacheBuster,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'inlineBlock'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {}\n }\n\n static override importJSON(serializedNode: SerializedInlineBlockNode): ServerInlineBlockNode {\n const node = $createServerInlineBlockNode(serializedNode.fields)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n canIndent() {\n return true\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, config?.theme?.inlineBlock)\n return element\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element | null {\n return null\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('span')\n element.classList.add('inline-block-container')\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedInlineBlockNode {\n return {\n type: 'inlineBlock',\n fields: this.getFields(),\n version: 1,\n }\n }\n\n getCacheBuster(): number {\n return this.getLatest().__cacheBuster\n }\n\n getFields(): InlineBlockFields {\n return this.getLatest().__fields\n }\n\n override getTextContent(): string {\n return `Block Field`\n }\n\n override isInline() {\n return true\n }\n\n setFields(fields: InlineBlockFields, preventFormStateUpdate?: boolean): void {\n const writable = this.getWritable()\n writable.__fields = fields\n if (!preventFormStateUpdate) {\n writable.__cacheBuster++\n }\n }\n\n override updateDOM(): boolean {\n return false\n }\n}\n\nexport function $createServerInlineBlockNode(\n fields: Exclude<InlineBlockFields, 'id'>,\n): ServerInlineBlockNode {\n return $applyNodeReplacement(\n new ServerInlineBlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isServerInlineBlockNode(\n node: LexicalNode | null | ServerInlineBlockNode | undefined,\n): node is ServerInlineBlockNode {\n return node instanceof ServerInlineBlockNode\n}\n"],"names":["addClassNamesToElement","ObjectID","$applyNodeReplacement","DecoratorNode","ServerInlineBlockNode","__cacheBuster","__fields","cacheBuster","fields","key","clone","node","__key","getType","importDOM","importJSON","serializedNode","$createServerInlineBlockNode","isInline","canIndent","createDOM","config","element","document","createElement","theme","inlineBlock","decorate","editor","exportDOM","classList","add","text","createTextNode","getTextContent","append","exportJSON","type","getFields","version","getCacheBuster","getLatest","setFields","preventFormStateUpdate","writable","getWritable","updateDOM","id","default","toHexString","$isServerInlineBlockNode"],"mappings":"AAaA,SAASA,sBAAsB,QAAQ,iBAAgB;AACvD,OAAOC,cAAc,gBAAe;AACpC,SAASC,qBAAqB,EAAEC,aAAa,QAAQ,UAAS;AAa9D,OAAO,MAAMC,8BAA8BD;IACzCE,cAAqB;IACrBC,SAA2B;IAE3B,YAAY,EACVC,WAAW,EACXC,MAAM,EACNC,GAAG,EAKJ,CAAE;QACD,KAAK,CAACA;QACN,IAAI,CAACH,QAAQ,GAAGE;QAChB,IAAI,CAACH,aAAa,GAAGE,eAAe;IACtC;IAEA,OAAgBG,MAAMC,IAA2B,EAAyB;QACxE,OAAO,IAAI,IAAI,CAAC;YACdJ,aAAaI,KAAKN,aAAa;YAC/BG,QAAQG,KAAKL,QAAQ;YACrBG,KAAKE,KAAKC,KAAK;QACjB;IACF;IAEA,OAAgBC,UAAkB;QAChC,OAAO;IACT;IAEA,OAAgBC,YAAqD;QACnE,OAAO,CAAC;IACV;IAEA,OAAgBC,WAAWC,cAAyC,EAAyB;QAC3F,MAAML,OAAOM,6BAA6BD,eAAeR,MAAM;QAC/D,OAAOG;IACT;IAEA,OAAOO,WAAkB;QACvB,OAAO;IACT;IAEAC,YAAY;QACV,OAAO;IACT;IAESC,UAAUC,MAAqB,EAAe;QACrD,MAAMC,UAAUC,SAASC,aAAa,CAAC;QACvCxB,uBAAuBsB,SAASD,QAAQI,OAAOC;QAC/C,OAAOJ;IACT;IAESK,SAASC,MAAqB,EAAEP,MAAoB,EAAsB;QACjF,OAAO;IACT;IAESQ,YAA6B;QACpC,MAAMP,UAAUC,SAASC,aAAa,CAAC;QACvCF,QAAQQ,SAAS,CAACC,GAAG,CAAC;QAEtB,MAAMC,OAAOT,SAASU,cAAc,CAAC,IAAI,CAACC,cAAc;QACxDZ,QAAQa,MAAM,CAACH;QACf,OAAO;YAAEV;QAAQ;IACnB;IAESc,aAAwC;QAC/C,OAAO;YACLC,MAAM;YACN7B,QAAQ,IAAI,CAAC8B,SAAS;YACtBC,SAAS;QACX;IACF;IAEAC,iBAAyB;QACvB,OAAO,IAAI,CAACC,SAAS,GAAGpC,aAAa;IACvC;IAEAiC,YAA+B;QAC7B,OAAO,IAAI,CAACG,SAAS,GAAGnC,QAAQ;IAClC;IAES4B,iBAAyB;QAChC,OAAO,CAAC,WAAW,CAAC;IACtB;IAEShB,WAAW;QAClB,OAAO;IACT;IAEAwB,UAAUlC,MAAyB,EAAEmC,sBAAgC,EAAQ;QAC3E,MAAMC,WAAW,IAAI,CAACC,WAAW;QACjCD,SAAStC,QAAQ,GAAGE;QACpB,IAAI,CAACmC,wBAAwB;YAC3BC,SAASvC,aAAa;QACxB;IACF;IAESyC,YAAqB;QAC5B,OAAO;IACT;AACF;AAEA,OAAO,SAAS7B,6BACdT,MAAwC;IAExC,OAAON,sBACL,IAAIE,sBAAsB;QACxBI,QAAQ;YACN,GAAGA,MAAM;YACTuC,IAAIvC,QAAQuC,MAAM,IAAI9C,SAAS+C,OAAO,GAAGC,WAAW;QACtD;IACF;AAEJ;AAEA,OAAO,SAASC,yBACdvC,IAA4D;IAE5D,OAAOA,gBAAgBP;AACzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { SerializedEditorState } from 'lexical';
|
|
2
1
|
import React from 'react';
|
|
3
2
|
import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js';
|
|
4
3
|
import type { JSXConverters } from '../converter/types.js';
|
|
4
|
+
import { type ConvertLexicalToJSXArgs } from '../converter/index.js';
|
|
5
5
|
export type JSXConvertersFunction<T extends {
|
|
6
6
|
[key: string]: any;
|
|
7
7
|
type?: string;
|
|
@@ -21,23 +21,11 @@ type RichTextProps = {
|
|
|
21
21
|
* Custom converters to transform your nodes to JSX. Can be an object or a function that receives the default converters.
|
|
22
22
|
*/
|
|
23
23
|
converters?: JSXConverters | JSXConvertersFunction;
|
|
24
|
-
/**
|
|
25
|
-
* Serialized editor state to render.
|
|
26
|
-
*/
|
|
27
|
-
data: SerializedEditorState;
|
|
28
24
|
/**
|
|
29
25
|
* If true, removes the container div wrapper.
|
|
30
26
|
*/
|
|
31
27
|
disableContainer?: boolean;
|
|
32
|
-
|
|
33
|
-
* If true, disables indentation globally. If an array, disables for specific node `type` values.
|
|
34
|
-
*/
|
|
35
|
-
disableIndent?: boolean | string[];
|
|
36
|
-
/**
|
|
37
|
-
* If true, disables text alignment globally. If an array, disables for specific node `type` values.
|
|
38
|
-
*/
|
|
39
|
-
disableTextAlign?: boolean | string[];
|
|
40
|
-
};
|
|
28
|
+
} & Pick<ConvertLexicalToJSXArgs, 'data' | 'disableIndent' | 'disableTextAlign' | 'nodeMap'>;
|
|
41
29
|
export declare const RichText: React.FC<RichTextProps>;
|
|
42
30
|
export {};
|
|
43
31
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/Component/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/Component/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAG1D,OAAO,EAAuB,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEzF,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,gBAAgB,GAChB,mBAAmB,CAAC;IAAE,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAAC,GAClD,yBAAyB,CAAC;IAAE,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE,CAAC,IAC1D,CAAC,IAAI,EAAE;IAAE,iBAAiB,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAA;CAAE,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;AAEtF,KAAK,aAAa,GAAG;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,UAAU,CAAC,EAAE,aAAa,GAAG,qBAAqB,CAAA;IAElD;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAC,CAAA;AAE5F,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA0C5C,CAAA"}
|
|
@@ -7,14 +7,8 @@ import { convertLexicalToJSX } from '../converter/index.js';
|
|
|
7
7
|
*/ /**
|
|
8
8
|
* Custom converters to transform your nodes to JSX. Can be an object or a function that receives the default converters.
|
|
9
9
|
*/ /**
|
|
10
|
-
* Serialized editor state to render.
|
|
11
|
-
*/ /**
|
|
12
10
|
* If true, removes the container div wrapper.
|
|
13
|
-
*/
|
|
14
|
-
* If true, disables indentation globally. If an array, disables for specific node `type` values.
|
|
15
|
-
*/ /**
|
|
16
|
-
* If true, disables text alignment globally. If an array, disables for specific node `type` values.
|
|
17
|
-
*/ export const RichText = ({ className, converters, data: editorState, disableContainer, disableIndent, disableTextAlign })=>{
|
|
11
|
+
*/ export const RichText = ({ className, converters, data: editorState, disableContainer, disableIndent, disableTextAlign, nodeMap })=>{
|
|
18
12
|
if (!editorState) {
|
|
19
13
|
return null;
|
|
20
14
|
}
|
|
@@ -34,7 +28,8 @@ import { convertLexicalToJSX } from '../converter/index.js';
|
|
|
34
28
|
converters: finalConverters,
|
|
35
29
|
data: editorState,
|
|
36
30
|
disableIndent,
|
|
37
|
-
disableTextAlign
|
|
31
|
+
disableTextAlign,
|
|
32
|
+
nodeMap
|
|
38
33
|
});
|
|
39
34
|
if (disableContainer) {
|
|
40
35
|
return /*#__PURE__*/ _jsxDEV(_Fragment, {
|
|
@@ -46,7 +41,7 @@ import { convertLexicalToJSX } from '../converter/index.js';
|
|
|
46
41
|
children: content
|
|
47
42
|
}, void 0, false, {
|
|
48
43
|
fileName: "src/features/converters/lexicalToJSX/Component/index.tsx",
|
|
49
|
-
lineNumber:
|
|
44
|
+
lineNumber: 77,
|
|
50
45
|
columnNumber: 10
|
|
51
46
|
}, this);
|
|
52
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/Component/index.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/Component/index.tsx"],"sourcesContent":["import React from 'react'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\nimport type { JSXConverters } from '../converter/types.js'\n\nimport { defaultJSXConverters } from '../converter/defaultConverters.js'\nimport { convertLexicalToJSX, type ConvertLexicalToJSXArgs } from '../converter/index.js'\n\nexport type JSXConvertersFunction<\n T extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string }>\n | SerializedInlineBlockNode<{ blockName?: null | string }>,\n> = (args: { defaultConverters: JSXConverters<DefaultNodeTypes> }) => JSXConverters<T>\n\ntype RichTextProps = {\n /**\n * Override class names for the container.\n */\n className?: string\n /**\n * Custom converters to transform your nodes to JSX. Can be an object or a function that receives the default converters.\n */\n converters?: JSXConverters | JSXConvertersFunction\n\n /**\n * If true, removes the container div wrapper.\n */\n disableContainer?: boolean\n} & Pick<ConvertLexicalToJSXArgs, 'data' | 'disableIndent' | 'disableTextAlign' | 'nodeMap'>\n\nexport const RichText: React.FC<RichTextProps> = ({\n className,\n converters,\n data: editorState,\n disableContainer,\n disableIndent,\n disableTextAlign,\n nodeMap,\n}) => {\n if (!editorState) {\n return null\n }\n\n let finalConverters: JSXConverters = {}\n if (converters) {\n if (typeof converters === 'function') {\n finalConverters = converters({ defaultConverters: defaultJSXConverters })\n } else {\n finalConverters = converters\n }\n } else {\n finalConverters = defaultJSXConverters\n }\n\n const content =\n editorState &&\n !Array.isArray(editorState) &&\n typeof editorState === 'object' &&\n 'root' in editorState &&\n convertLexicalToJSX({\n converters: finalConverters,\n data: editorState,\n disableIndent,\n disableTextAlign,\n nodeMap,\n })\n\n if (disableContainer) {\n return <>{content}</>\n }\n\n return <div className={className ?? 'payload-richtext'}>{content}</div>\n}\n"],"names":["React","defaultJSXConverters","convertLexicalToJSX","RichText","className","converters","data","editorState","disableContainer","disableIndent","disableTextAlign","nodeMap","finalConverters","defaultConverters","content","Array","isArray","div"],"mappings":";AAAA,OAAOA,WAAW,QAAO;AASzB,SAASC,oBAAoB,QAAQ,oCAAmC;AACxE,SAASC,mBAAmB,QAAsC,wBAAuB;AAUvF;;GAEC,GAED;;GAEC,GAGD;;GAEC,GAIH,OAAO,MAAMC,WAAoC,CAAC,EAChDC,SAAS,EACTC,UAAU,EACVC,MAAMC,WAAW,EACjBC,gBAAgB,EAChBC,aAAa,EACbC,gBAAgB,EAChBC,OAAO,EACR;IACC,IAAI,CAACJ,aAAa;QAChB,OAAO;IACT;IAEA,IAAIK,kBAAiC,CAAC;IACtC,IAAIP,YAAY;QACd,IAAI,OAAOA,eAAe,YAAY;YACpCO,kBAAkBP,WAAW;gBAAEQ,mBAAmBZ;YAAqB;QACzE,OAAO;YACLW,kBAAkBP;QACpB;IACF,OAAO;QACLO,kBAAkBX;IACpB;IAEA,MAAMa,UACJP,eACA,CAACQ,MAAMC,OAAO,CAACT,gBACf,OAAOA,gBAAgB,YACvB,UAAUA,eACVL,oBAAoB;QAClBG,YAAYO;QACZN,MAAMC;QACNE;QACAC;QACAC;IACF;IAEF,IAAIH,kBAAkB;QACpB,qBAAO;sBAAGM;;IACZ;IAEA,qBAAO,QAACG;QAAIb,WAAWA,aAAa;kBAAqBU;;;;;;AAC3D,EAAC"}
|
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
import type { SerializedEditorState, SerializedLexicalNode } from 'lexical';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
import type { LexicalEditorNodeMap } from '../../../../types.js';
|
|
3
4
|
import type { JSXConverters, SerializedLexicalNodeWithParent } from './types.js';
|
|
4
5
|
export type ConvertLexicalToJSXArgs = {
|
|
5
6
|
converters: JSXConverters;
|
|
7
|
+
/**
|
|
8
|
+
* Serialized editor state to render.
|
|
9
|
+
*/
|
|
6
10
|
data: SerializedEditorState;
|
|
11
|
+
/**
|
|
12
|
+
* If true, disables indentation globally. If an array, disables for specific node `type` values.
|
|
13
|
+
*/
|
|
7
14
|
disableIndent?: boolean | string[];
|
|
15
|
+
/**
|
|
16
|
+
* If true, disables text alignment globally. If an array, disables for specific node `type` values.
|
|
17
|
+
*/
|
|
8
18
|
disableTextAlign?: boolean | string[];
|
|
19
|
+
/**
|
|
20
|
+
* You can use the lexical editor node map or view map as converters. NodeMap converters will override converters passed
|
|
21
|
+
* in the `converters` prop. If a LexicalEditorViewMap is provided, the `default` view will be used.
|
|
22
|
+
*/
|
|
23
|
+
nodeMap?: LexicalEditorNodeMap;
|
|
9
24
|
};
|
|
10
|
-
export declare function convertLexicalToJSX({ converters, data, disableIndent, disableTextAlign, }: ConvertLexicalToJSXArgs): React.ReactNode;
|
|
25
|
+
export declare function convertLexicalToJSX({ converters, data, disableIndent, disableTextAlign, nodeMap, }: ConvertLexicalToJSXArgs): React.ReactNode;
|
|
11
26
|
export declare function convertLexicalNodesToJSX({ converters, disableIndent, disableTextAlign, nodes, parent, }: {
|
|
12
27
|
converters: JSXConverters;
|
|
13
28
|
disableIndent?: boolean | string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAgB,aAAa,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,sBAAsB,CAAA;AAC9E,OAAO,KAAK,EAAgB,aAAa,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAA;AA8E9F,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,IAAI,EAAE,qBAAqB,CAAA;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IAClC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAC/B,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,OAAO,GACR,EAAE,uBAAuB,GAAG,KAAK,CAAC,SAAS,CAoB3C;AAED,wBAAgB,wBAAwB,CAAC,EACvC,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,MAAM,GACP,EAAE;IACD,UAAU,EAAE,aAAa,CAAA;IACzB,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IAClC,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAA;IACrC,KAAK,EAAE,qBAAqB,EAAE,CAAA;IAC9B,MAAM,EAAE,+BAA+B,CAAA;CACxC,GAAG,KAAK,CAAC,SAAS,EAAE,CAmIpB"}
|
|
@@ -1,14 +1,96 @@
|
|
|
1
1
|
import { jsxDEV as _jsxDEV, Fragment as _Fragment } from "react/jsx-dev-runtime";
|
|
2
2
|
/* eslint-disable no-console */ import React from 'react';
|
|
3
3
|
import { hasText } from '../../../../validate/hasText.js';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Creates a JSX converter from a NodeMapValue
|
|
6
|
+
*/ function createConverterFromNodeMapValue(viewDef) {
|
|
7
|
+
return (args)=>{
|
|
8
|
+
const converterArgs = {
|
|
9
|
+
...args,
|
|
10
|
+
isEditor: false,
|
|
11
|
+
isJSXConverter: true
|
|
12
|
+
};
|
|
13
|
+
// If Component is provided, use it
|
|
14
|
+
if (viewDef.Component) {
|
|
15
|
+
return viewDef.Component(converterArgs);
|
|
16
|
+
}
|
|
17
|
+
// If html is provided (as a function or string), use it
|
|
18
|
+
// Note: Using span instead of div to avoid forcing block-level semantics
|
|
19
|
+
if (viewDef.html) {
|
|
20
|
+
const htmlContent = typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html;
|
|
21
|
+
return /*#__PURE__*/ _jsxDEV("span", {
|
|
22
|
+
dangerouslySetInnerHTML: {
|
|
23
|
+
__html: htmlContent
|
|
24
|
+
}
|
|
25
|
+
}, void 0, false, {
|
|
26
|
+
fileName: "src/features/converters/lexicalToJSX/converter/index.tsx",
|
|
27
|
+
lineNumber: 34,
|
|
28
|
+
columnNumber: 14
|
|
29
|
+
}, this);
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Converts a LexicalEditorNodeMap into JSXConverters
|
|
36
|
+
*/ function nodeMapToConverters(nodeMap) {
|
|
37
|
+
const converters = {};
|
|
38
|
+
for (const [nodeType, value] of Object.entries(nodeMap)){
|
|
39
|
+
if (!value || typeof value !== 'object') {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Handle special keys: blocks, inlineBlocks
|
|
43
|
+
if (nodeType === 'blocks') {
|
|
44
|
+
converters.blocks = {};
|
|
45
|
+
for (const [blockType, _viewDef] of Object.entries(value)){
|
|
46
|
+
const viewDef = _viewDef;
|
|
47
|
+
if (viewDef.Component || viewDef.html) {
|
|
48
|
+
converters.blocks[blockType] = createConverterFromNodeMapValue(viewDef);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (nodeType === 'inlineBlocks') {
|
|
54
|
+
converters.inlineBlocks = {};
|
|
55
|
+
for (const [blockType, _viewDef] of Object.entries(value)){
|
|
56
|
+
const viewDef = _viewDef;
|
|
57
|
+
if (viewDef.Component || viewDef.html) {
|
|
58
|
+
converters.inlineBlocks[blockType] = createConverterFromNodeMapValue(viewDef);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Handle regular node types
|
|
64
|
+
const viewDef = value;
|
|
65
|
+
if (viewDef.Component || viewDef.html) {
|
|
66
|
+
converters[nodeType] = createConverterFromNodeMapValue(viewDef);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return converters;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Serialized editor state to render.
|
|
73
|
+
*/ /**
|
|
74
|
+
* If true, disables indentation globally. If an array, disables for specific node `type` values.
|
|
75
|
+
*/ /**
|
|
76
|
+
* If true, disables text alignment globally. If an array, disables for specific node `type` values.
|
|
77
|
+
*/ /**
|
|
78
|
+
* You can use the lexical editor node map or view map as converters. NodeMap converters will override converters passed
|
|
79
|
+
* in the `converters` prop. If a LexicalEditorViewMap is provided, the `default` view will be used.
|
|
80
|
+
*/ export function convertLexicalToJSX({ converters, data, disableIndent, disableTextAlign, nodeMap }) {
|
|
5
81
|
if (hasText(data)) {
|
|
82
|
+
// Merge nodeMap converters with existing converters
|
|
83
|
+
// NodeMap converters override existing converters
|
|
84
|
+
const mergedConverters = nodeMap ? {
|
|
85
|
+
...converters,
|
|
86
|
+
...nodeMapToConverters(nodeMap)
|
|
87
|
+
} : converters;
|
|
6
88
|
return convertLexicalNodesToJSX({
|
|
7
|
-
converters,
|
|
89
|
+
converters: mergedConverters,
|
|
8
90
|
disableIndent,
|
|
9
91
|
disableTextAlign,
|
|
10
|
-
nodes: data
|
|
11
|
-
parent: data
|
|
92
|
+
nodes: data.root.children,
|
|
93
|
+
parent: data.root
|
|
12
94
|
});
|
|
13
95
|
}
|
|
14
96
|
return /*#__PURE__*/ _jsxDEV(_Fragment, {}, void 0, false);
|
|
@@ -60,7 +142,7 @@ export function convertLexicalNodesToJSX({ converters, disableIndent, disableTex
|
|
|
60
142
|
children: "unknown node"
|
|
61
143
|
}, i, false, {
|
|
62
144
|
fileName: "src/features/converters/lexicalToJSX/converter/index.tsx",
|
|
63
|
-
lineNumber:
|
|
145
|
+
lineNumber: 201,
|
|
64
146
|
columnNumber: 21
|
|
65
147
|
}, this);
|
|
66
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\nexport type ConvertLexicalToJSXArgs = {\n converters: JSXConverters\n data: SerializedEditorState\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n}\n\nexport function convertLexicalToJSX({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n}: ConvertLexicalToJSXArgs): React.ReactNode {\n if (hasText(data)) {\n return convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes: data?.root?.children,\n parent: data?.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n"],"names":["React","hasText","convertLexicalToJSX","converters","data","disableIndent","disableTextAlign","convertLexicalNodesToJSX","nodes","root","children","parent","unknownConverter","unknown","jsxArray","map","node","i","converterForNode","type","blocks","fields","blockType","console","error","inlineBlocks","reactNode","converted","childIndex","nodesToJSX","args","span","style","Array","isArray","includes","format","textAlign","indent","paddingInlineStart","Number","isValidElement","newStyle","props","cloneElement","key","filter","Boolean"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/converter/index.tsx"],"sourcesContent":["/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type { LexicalEditorNodeMap, NodeMapValue } from '../../../../types.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\n/**\n * Creates a JSX converter from a NodeMapValue\n */\nfunction createConverterFromNodeMapValue(viewDef: NodeMapValue): JSXConverter {\n return (args) => {\n const converterArgs = {\n ...args,\n isEditor: false as const,\n isJSXConverter: true as const,\n }\n\n // If Component is provided, use it\n if (viewDef.Component) {\n return viewDef.Component(converterArgs)\n }\n\n // If html is provided (as a function or string), use it\n // Note: Using span instead of div to avoid forcing block-level semantics\n if (viewDef.html) {\n const htmlContent =\n typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html\n\n return <span dangerouslySetInnerHTML={{ __html: htmlContent }} />\n }\n\n return null\n }\n}\n\n/**\n * Converts a LexicalEditorNodeMap into JSXConverters\n */\nfunction nodeMapToConverters(nodeMap: LexicalEditorNodeMap): JSXConverters {\n const converters: JSXConverters = {}\n\n for (const [nodeType, value] of Object.entries(nodeMap)) {\n if (!value || typeof value !== 'object') {\n continue\n }\n\n // Handle special keys: blocks, inlineBlocks\n if (nodeType === 'blocks') {\n converters.blocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapValue\n if (viewDef.Component || viewDef.html) {\n converters.blocks[blockType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n continue\n }\n\n if (nodeType === 'inlineBlocks') {\n converters.inlineBlocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapValue\n if (viewDef.Component || viewDef.html) {\n converters.inlineBlocks[blockType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n continue\n }\n\n // Handle regular node types\n const viewDef = value as NodeMapValue\n\n if (viewDef.Component || viewDef.html) {\n converters[nodeType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n\n return converters\n}\n\nexport type ConvertLexicalToJSXArgs = {\n converters: JSXConverters\n /**\n * Serialized editor state to render.\n */\n data: SerializedEditorState\n /**\n * If true, disables indentation globally. If an array, disables for specific node `type` values.\n */\n disableIndent?: boolean | string[]\n /**\n * If true, disables text alignment globally. If an array, disables for specific node `type` values.\n */\n disableTextAlign?: boolean | string[]\n /**\n * You can use the lexical editor node map or view map as converters. NodeMap converters will override converters passed\n * in the `converters` prop. If a LexicalEditorViewMap is provided, the `default` view will be used.\n */\n nodeMap?: LexicalEditorNodeMap\n}\n\nexport function convertLexicalToJSX({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n nodeMap,\n}: ConvertLexicalToJSXArgs): React.ReactNode {\n if (hasText(data)) {\n // Merge nodeMap converters with existing converters\n // NodeMap converters override existing converters\n const mergedConverters = nodeMap\n ? {\n ...converters,\n ...nodeMapToConverters(nodeMap),\n }\n : converters\n\n return convertLexicalNodesToJSX({\n converters: mergedConverters,\n disableIndent,\n disableTextAlign,\n nodes: data.root.children,\n parent: data.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n"],"names":["React","hasText","createConverterFromNodeMapValue","viewDef","args","converterArgs","isEditor","isJSXConverter","Component","html","htmlContent","span","dangerouslySetInnerHTML","__html","nodeMapToConverters","nodeMap","converters","nodeType","value","Object","entries","blocks","blockType","_viewDef","inlineBlocks","convertLexicalToJSX","data","disableIndent","disableTextAlign","mergedConverters","convertLexicalNodesToJSX","nodes","root","children","parent","unknownConverter","unknown","jsxArray","map","node","i","converterForNode","type","fields","console","error","reactNode","converted","childIndex","nodesToJSX","style","Array","isArray","includes","format","textAlign","indent","paddingInlineStart","Number","isValidElement","newStyle","props","cloneElement","key","filter","Boolean"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { SerializedLexicalNode } from 'lexical';
|
|
2
2
|
import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js';
|
|
3
|
-
export type
|
|
3
|
+
export type JSXConverterArgs<TNode extends {
|
|
4
4
|
[key: string]: any;
|
|
5
5
|
type?: string;
|
|
6
|
-
} = SerializedLexicalNode> =
|
|
6
|
+
} = SerializedLexicalNode> = {
|
|
7
7
|
childIndex: number;
|
|
8
8
|
converters: JSXConverters;
|
|
9
|
-
node:
|
|
9
|
+
node: TNode;
|
|
10
10
|
nodesToJSX: (args: {
|
|
11
11
|
converters?: JSXConverters;
|
|
12
12
|
disableIndent?: boolean | string[];
|
|
@@ -15,8 +15,12 @@ export type JSXConverter<T extends {
|
|
|
15
15
|
parent?: SerializedLexicalNodeWithParent;
|
|
16
16
|
}) => React.ReactNode[];
|
|
17
17
|
parent: SerializedLexicalNodeWithParent;
|
|
18
|
-
}
|
|
19
|
-
export type
|
|
18
|
+
};
|
|
19
|
+
export type JSXConverter<TNode extends {
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
type?: string;
|
|
22
|
+
} = SerializedLexicalNode> = ((args: JSXConverterArgs<TNode>) => React.ReactNode) | React.ReactNode;
|
|
23
|
+
export type JSXConverters<TNodes extends {
|
|
20
24
|
[key: string]: any;
|
|
21
25
|
type?: string;
|
|
22
26
|
} = DefaultNodeTypes | SerializedBlockNode<{
|
|
@@ -30,27 +34,27 @@ export type JSXConverters<T extends {
|
|
|
30
34
|
[blockSlug: string]: JSXConverter<any>;
|
|
31
35
|
} | JSXConverter<any> | undefined;
|
|
32
36
|
} & {
|
|
33
|
-
[nodeType in Exclude<NonNullable<
|
|
37
|
+
[nodeType in Exclude<NonNullable<TNodes['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<Extract<TNodes, {
|
|
34
38
|
type: nodeType;
|
|
35
39
|
}>>;
|
|
36
40
|
} & {
|
|
37
41
|
blocks?: {
|
|
38
|
-
[K in Extract<Extract<
|
|
42
|
+
[K in Extract<Extract<TNodes, {
|
|
39
43
|
type: 'block';
|
|
40
44
|
}> extends SerializedBlockNode<infer B> ? B extends {
|
|
41
45
|
blockType: string;
|
|
42
|
-
} ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<
|
|
46
|
+
} ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<TNodes, {
|
|
43
47
|
type: 'block';
|
|
44
48
|
}> extends SerializedBlockNode<infer B> ? SerializedBlockNode<Extract<B, {
|
|
45
49
|
blockType: K;
|
|
46
50
|
}>> : SerializedBlockNode>;
|
|
47
51
|
};
|
|
48
52
|
inlineBlocks?: {
|
|
49
|
-
[K in Extract<Extract<
|
|
53
|
+
[K in Extract<Extract<TNodes, {
|
|
50
54
|
type: 'inlineBlock';
|
|
51
55
|
}> extends SerializedInlineBlockNode<infer B> ? B extends {
|
|
52
56
|
blockType: string;
|
|
53
|
-
} ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<
|
|
57
|
+
} ? B['blockType'] : never : never, string>]?: JSXConverter<Extract<TNodes, {
|
|
54
58
|
type: 'inlineBlock';
|
|
55
59
|
}> extends SerializedInlineBlockNode<infer B> ? SerializedInlineBlockNode<Extract<B, {
|
|
56
60
|
blockType: K;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAEpD,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\nexport type
|
|
1
|
+
{"version":3,"sources":["../../../../../src/features/converters/lexicalToJSX/converter/types.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\n\nexport type JSXConverterArgs<\n TNode extends { [key: string]: any; type?: string } = SerializedLexicalNode,\n> = {\n childIndex: number\n converters: JSXConverters\n node: TNode\n nodesToJSX: (args: {\n converters?: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent?: SerializedLexicalNodeWithParent\n }) => React.ReactNode[]\n parent: SerializedLexicalNodeWithParent\n}\nexport type JSXConverter<\n TNode extends { [key: string]: any; type?: string } = SerializedLexicalNode,\n> = ((args: JSXConverterArgs<TNode>) => React.ReactNode) | React.ReactNode\n\nexport type JSXConverters<\n TNodes extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided\n> = {\n [key: string]:\n | {\n [blockSlug: string]: JSXConverter<any>\n }\n | JSXConverter<any>\n | undefined\n} & {\n [nodeType in Exclude<NonNullable<TNodes['type']>, 'block' | 'inlineBlock'>]?: JSXConverter<\n Extract<TNodes, { type: nodeType }>\n >\n} & {\n blocks?: {\n [K in Extract<\n Extract<TNodes, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<TNodes, { type: 'block' }> extends SerializedBlockNode<infer B>\n ? SerializedBlockNode<Extract<B, { blockType: K }>>\n : SerializedBlockNode\n >\n }\n inlineBlocks?: {\n [K in Extract<\n Extract<TNodes, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? B extends { blockType: string }\n ? B['blockType']\n : never\n : never,\n string\n >]?: JSXConverter<\n Extract<TNodes, { type: 'inlineBlock' }> extends SerializedInlineBlockNode<infer B>\n ? SerializedInlineBlockNode<Extract<B, { blockType: K }>>\n : SerializedInlineBlockNode\n >\n }\n unknown?: JSXConverter<SerializedLexicalNode>\n}\nexport type SerializedLexicalNodeWithParent = {\n parent?: SerializedLexicalNode\n} & SerializedLexicalNode\n"],"names":[],"mappings":"AA8B4E,0FAA0F;AACnF,0FAA0F;AA2C7K,WAEyB"}
|
|
@@ -7,7 +7,7 @@ import { defaultJSXConverters, RichText } from '../../../../../exports/react/ind
|
|
|
7
7
|
import './style.scss';
|
|
8
8
|
export function RichTextPlugin() {
|
|
9
9
|
const [editor] = useLexicalComposerContext();
|
|
10
|
-
const [editorState, setEditorState] = useState(editor.getEditorState().toJSON());
|
|
10
|
+
const [editorState, setEditorState] = useState(()=>editor.getEditorState().toJSON());
|
|
11
11
|
useEffect(()=>{
|
|
12
12
|
return editor.registerUpdateListener(({ editorState })=>{
|
|
13
13
|
setEditorState(editorState.toJSON());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/debug/jsxConverter/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","useEffect","useState","defaultJSXConverters","RichText","RichTextPlugin","editor","editorState","setEditorState","getEditorState","toJSON","registerUpdateListener","div","className","converters","data"],"mappings":"AAAA;;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE3C,+DAA+D;AAC/D,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,wCAAuC;AACtF,OAAO,eAAc;AAErB,OAAO,SAASC;IACd,MAAM,CAACC,OAAO,GAAGN;IACjB,MAAM,CAACO,aAAaC,eAAe,GAAGN,
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/debug/jsxConverter/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(() => editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","useEffect","useState","defaultJSXConverters","RichText","RichTextPlugin","editor","editorState","setEditorState","getEditorState","toJSON","registerUpdateListener","div","className","converters","data"],"mappings":"AAAA;;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE3C,+DAA+D;AAC/D,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,wCAAuC;AACtF,OAAO,eAAc;AAErB,OAAO,SAASC;IACd,MAAM,CAACC,OAAO,GAAGN;IACjB,MAAM,CAACO,aAAaC,eAAe,GAAGN,SAAS,IAAMI,OAAOG,cAAc,GAAGC,MAAM;IAEnFT,UAAU;QACR,OAAOK,OAAOK,sBAAsB,CAAC,CAAC,EAAEJ,WAAW,EAAE;YACnDC,eAAeD,YAAYG,MAAM;QACnC;IACF,GAAG;QAACJ;KAAO;IAEX,qBACE,QAACM;QAAIC,WAAU;kBACb,cAAA,QAACT;YAASU,YAAYX;YAAsBY,MAAMR;;;;;;;;;;;AAGxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/features/link/nodes/LinkNode.ts"],"sourcesContent":["import type {\n BaseSelection,\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n LexicalUpdateJSON,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n} from 'lexical'\n\nimport type { LinkPayload } from '../client/plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n __id: string\n\n constructor({\n id,\n fields = {\n linkType: 'custom',\n newTab: false,\n },\n key,\n }: {\n fields?: LinkFields\n id: string\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__id = id\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new this({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'link'\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedLinkNode): LinkNode {\n const node = $createLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove this in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n if (serializedNode.version === 2 && !serializedNode.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n return node\n }\n\n override canBeEmpty(): false {\n return false\n }\n\n override canInsertTextAfter(): false {\n return false\n }\n\n override canInsertTextBefore(): false {\n return false\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n override exportJSON(): SerializedLinkNode {\n const fields = this.getFields()\n\n if (fields?.linkType === 'internal') {\n delete fields.url\n } else if (fields?.linkType === 'custom') {\n delete fields.doc\n }\n\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields,\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n override extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n getID(): string {\n return this.getLatest().__id\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true,\n ): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): this {\n const writable = this.getWritable()\n writable.__fields = fields\n return writable\n }\n\n setID(id: string): this {\n const writable = this.getWritable()\n writable.__id = id\n return writable\n }\n\n override updateDOM(prevNode: this, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedLinkNode>): this {\n return super\n .updateFromJSON(serializedNode)\n .setFields(serializedNode.fields)\n .setID(serializedNode.id as string)\n }\n}\n\nfunction $convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n id: new ObjectID.default().toHexString(),\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ id, fields }: { fields?: LinkFields; id?: string }): LinkNode {\n return $applyNodeReplacement(\n new LinkNode({\n id: id ?? new ObjectID.default().toHexString(),\n fields,\n }),\n )\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function $toggleLink(payload: ({ fields: LinkFields } & LinkPayload) | null): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && (payload === null || !payload.selectedNodes?.length)) {\n return\n }\n const nodes = $isRangeSelection(selection)\n ? selection.extract()\n : payload === null\n ? []\n : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n children.forEach((child) => {\n parent.insertBefore(child)\n })\n\n parent.remove()\n }\n })\n\n return\n }\n // Add or merge LinkNodes\n if (nodes?.length === 1) {\n const firstNode = nodes[0]!\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n linkNode.append(...children)\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null) {\n parent = parent.getParent()\n if (parent === null || predicate(parent)) {\n break\n }\n }\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n"],"names":["addClassNamesToElement","isHTMLAnchorElement","ObjectID","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","__id","constructor","id","fields","linkType","newTab","key","clone","node","__key","getType","importDOM","a","conversion","$convertAnchorElement","priority","importJSON","serializedNode","$createLinkNode","updateFromJSON","version","doc","value","default","toHexString","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","url","target","rel","manageRel","theme","link","exportJSON","getFields","returnObject","type","getID","extractWithChild","child","selection","destination","anchorNode","anchor","getNode","focusNode","focus","isParentOf","getTextContent","length","getLatest","insertNewAfter","restoreSelection","getParentOrThrow","linkNode","append","isInline","parsedUrl","URL","has","protocol","e","setFields","writable","getWritable","setID","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","$toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/features/link/nodes/LinkNode.ts"],"sourcesContent":["import type {\n BaseSelection,\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n LexicalUpdateJSON,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n} from 'lexical'\n\nimport type { LinkPayload } from '../client/plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n __id: string\n\n constructor({\n id,\n fields = {\n linkType: 'custom',\n newTab: false,\n },\n key,\n }: {\n fields?: LinkFields\n id: string\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__id = id\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new this({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'link'\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedLinkNode): LinkNode {\n const node = $createLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove this in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n if (serializedNode.version === 2 && !serializedNode.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n return node\n }\n\n override canBeEmpty(): false {\n return false\n }\n\n override canInsertTextAfter(): false {\n return false\n }\n\n override canInsertTextBefore(): false {\n return false\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n override exportJSON(): SerializedLinkNode {\n const fields = this.getFields()\n\n if (fields?.linkType === 'internal') {\n delete fields.url\n } else if (fields?.linkType === 'custom') {\n delete fields.doc\n }\n\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields,\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n override extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n getID(): string {\n return this.getLatest().__id\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true,\n ): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): this {\n const writable = this.getWritable()\n writable.__fields = fields\n return writable\n }\n\n setID(id: string): this {\n const writable = this.getWritable()\n writable.__id = id\n return writable\n }\n\n override updateDOM(prevNode: this, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedLinkNode>): this {\n return super\n .updateFromJSON(serializedNode)\n .setFields(serializedNode.fields)\n .setID(serializedNode.id as string)\n }\n}\n\nfunction $convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n id: new ObjectID.default().toHexString(),\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ id, fields }: { fields?: LinkFields; id?: string }): LinkNode {\n return $applyNodeReplacement(\n new LinkNode({\n id: id ?? new ObjectID.default().toHexString(),\n fields,\n }),\n )\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function $toggleLink(payload: ({ fields: LinkFields } & LinkPayload) | null): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && (payload === null || !payload.selectedNodes?.length)) {\n return\n }\n const nodes = $isRangeSelection(selection)\n ? selection.extract()\n : payload === null\n ? []\n : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n children.forEach((child) => {\n parent.insertBefore(child)\n })\n\n parent.remove()\n }\n })\n\n return\n }\n // Add or merge LinkNodes\n if (nodes?.length === 1) {\n const firstNode = nodes[0]!\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n linkNode.append(...children)\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null) {\n parent = parent.getParent()\n if (parent === null || predicate(parent)) {\n break\n }\n }\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n"],"names":["addClassNamesToElement","isHTMLAnchorElement","ObjectID","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","__id","id","fields","linkType","newTab","key","clone","node","__key","getType","importDOM","a","conversion","$convertAnchorElement","priority","importJSON","serializedNode","$createLinkNode","updateFromJSON","version","doc","value","default","toHexString","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","url","target","rel","manageRel","theme","link","exportJSON","getFields","returnObject","type","getID","extractWithChild","child","selection","destination","anchorNode","anchor","getNode","focusNode","focus","isParentOf","getTextContent","length","getLatest","insertNewAfter","restoreSelection","getParentOrThrow","linkNode","append","isInline","parsedUrl","URL","has","protocol","e","setFields","writable","getWritable","setID","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","$toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"mappings":"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"}
|
package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.tsx"],"sourcesContent":["import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n"],"names":["addClassNamesToElement","$applyNodeReplacement","DecoratorNode","React","Component","lazy","then","module","default","UnknownConvertedNodeComponent","UnknownConvertedNode","__data","
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.tsx"],"sourcesContent":["import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n"],"names":["addClassNamesToElement","$applyNodeReplacement","DecoratorNode","React","Component","lazy","then","module","default","UnknownConvertedNodeComponent","UnknownConvertedNode","__data","data","key","clone","node","__key","getType","importJSON","serializedNode","$createUnknownConvertedNode","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","decorate","exportJSON","type","version","isInline","updateDOM","prevNode","dom","$isUnknownConvertedNode"],"mappings":";AAGA,SAASA,sBAAsB,QAAQ,iBAAgB;AACvD,SAASC,qBAAqB,EAAEC,aAAa,QAAQ,UAAS;AAC9D,YAAYC,WAAW,QAAO;AAc9B,MAAMC,0BAAYD,MAAME,IAAI,CAAC,IAC3B,MAAM,CAAC,kBAAkBC,IAAI,CAAC,CAACC,SAAY,CAAA;YACzCC,SAASD,OAAOE,6BAA6B;QAC/C,CAAA;AAGF,kBAAkB,GAClB,OAAO,MAAMC,6BAA6BR;IACxCS,OAAgC;IAEhC,YAAY,EAAEC,IAAI,EAAEC,GAAG,EAAqD,CAAE;QAC5E,KAAK,CAACA;QACN,IAAI,CAACF,MAAM,GAAGC;IAChB;IAEA,OAAgBE,MAAMC,IAA0B,EAAwB;QACtE,OAAO,IAAI,IAAI,CAAC;YACdH,MAAMG,KAAKJ,MAAM;YACjBE,KAAKE,KAAKC,KAAK;QACjB;IACF;IAEA,OAAgBC,UAAkB;QAChC,OAAO;IACT;IAEA,OAAgBC,WAAWC,cAA8C,EAAwB;QAC/F,MAAMJ,OAAOK,4BAA4B;YAAER,MAAMO,eAAeP,IAAI;QAAC;QACrE,OAAOG;IACT;IAEAM,qBAA2B;QACzB,OAAO;IACT;IAEAC,sBAA4B;QAC1B,OAAO;IACT;IAESC,UAAUC,MAAoB,EAAe;QACpD,MAAMC,UAAUC,SAASC,aAAa,CAAC;QACvC3B,uBAAuByB,SAAS;QAChC,OAAOA;IACT;IAESG,WAAwB;QAC/B,qBAAO,QAACxB;YAAUQ,MAAM,IAAI,CAACD,MAAM;;;;;;IACrC;IAESkB,aAA6C;QACpD,OAAO;YACLC,MAAM,IAAI,CAACb,OAAO;YAClBL,MAAM,IAAI,CAACD,MAAM;YACjBoB,SAAS;QACX;IACF;IAEA,WAAW;IAEFC,WAAoB;QAC3B,OAAO;IACT;IAESC,UAAUC,QAAc,EAAEC,GAAgB,EAAW;QAC5D,OAAO;IACT;AACF;AAEA,OAAO,SAASf,4BAA4B,EAC1CR,IAAI,EAGL;IACC,OAAOX,sBACL,IAAIS,qBAAqB;QACvBE;IACF;AAEJ;AAEA,OAAO,SAASwB,wBACdrB,IAAoC;IAEpC,OAAOA,gBAAgBL;AACzB"}
|