@payloadcms/richtext-lexical 3.16.1-canary.9004205 → 3.17.1
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/bundled.css +1 -1
- package/dist/exports/client/index.js +8 -8
- package/dist/exports/client/index.js.map +3 -3
- package/dist/features/link/client/plugins/floatingLinkEditor/types.d.ts +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/types.d.ts.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/types.js.map +1 -1
- package/dist/features/link/client/plugins/link/index.d.ts.map +1 -1
- package/dist/features/link/client/plugins/link/index.js +4 -0
- package/dist/features/link/client/plugins/link/index.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.d.ts +2 -2
- package/dist/features/link/nodes/LinkNode.d.ts.map +1 -1
- package/dist/features/link/nodes/LinkNode.js +66 -66
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3B,aAAa,CAAC,EAAE,WAAW,EAAE,CAAA;IAC7B;;OAEG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,CAAA;CACpB,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;IAC3B,aAAa,CAAC,EAAE,WAAW,EAAE,CAAA;IAC7B;;OAEG;IACH,IAAI,EAAE,IAAI,GAAG,MAAM,CAAA;CACpB,GAAG,IAAI,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/types.ts"],"sourcesContent":["import type { LexicalNode } from 'lexical'\n\nimport type { LinkFields } from '../../../nodes/types.js'\n\n/**\n * The payload of a link node\n * This can be delivered from the link node to the drawer, or from the drawer/anything to the TOGGLE_LINK_COMMAND\n */\nexport type LinkPayload = {\n /**\n * The fields of the link node. Undefined fields will be taken from the default values of the link node\n */\n fields: Partial<LinkFields>\n selectedNodes?: LexicalNode[]\n /**\n * The text content of the link node - will be displayed in the drawer\n */\n text: null | string\n}\n"],"mappings":"AAIA;;;GAIA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/types.ts"],"sourcesContent":["import type { LexicalNode } from 'lexical'\n\nimport type { LinkFields } from '../../../nodes/types.js'\n\n/**\n * The payload of a link node\n * This can be delivered from the link node to the drawer, or from the drawer/anything to the TOGGLE_LINK_COMMAND\n */\nexport type LinkPayload = {\n /**\n * The fields of the link node. Undefined fields will be taken from the default values of the link node\n */\n fields: Partial<LinkFields>\n selectedNodes?: LexicalNode[]\n /**\n * The text content of the link node - will be displayed in the drawer\n */\n text: null | string\n} | null\n"],"mappings":"AAIA;;;GAIA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/link/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAMjD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/link/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAMjD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,WAAW,CAiEnD,CAAA"}
|
|
@@ -21,6 +21,10 @@ export const LinkPlugin = t0 => {
|
|
|
21
21
|
throw new Error("LinkPlugin: LinkNode not registered on editor");
|
|
22
22
|
}
|
|
23
23
|
return mergeRegister(editor.registerCommand(TOGGLE_LINK_COMMAND, payload => {
|
|
24
|
+
if (payload === null) {
|
|
25
|
+
$toggleLink(null);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
24
28
|
if (!payload.fields?.linkType) {
|
|
25
29
|
payload.fields.linkType = clientProps.defaultLinkType;
|
|
26
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isElementNode","$isRangeSelection","COMMAND_PRIORITY_LOW","PASTE_COMMAND","useEffect","validateUrl","$toggleLink","LinkNode","TOGGLE_LINK_COMMAND","LinkPlugin","t0","$","clientProps","editor","t1","t2","defaultLinkType","defaultLinkURL","hasNodes","Error","registerCommand","payload","fields","linkType","url","event","selection","isCollapsed","ClipboardEvent","clipboardData","clipboardText","getData","getNodes","some","_temp","linkFields","doc","newTab","dispatchCommand","text","preventDefault","node"],"sources":["../../../../../../src/features/link/client/plugins/link/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n PASTE_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\nimport type { LinkPayload } from '../floatingLinkEditor/types.js'\n\nimport { validateUrl } from '../../../../../lexical/utils/url.js'\nimport { $toggleLink, LinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\n\nexport const LinkPlugin: PluginComponent<ClientProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!editor.hasNodes([LinkNode])) {\n throw new Error('LinkPlugin: LinkNode not registered on editor')\n }\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: LinkPayload) => {\n if (!payload.fields?.linkType) {\n payload.fields.linkType = clientProps.defaultLinkType as any\n }\n if (!payload.fields?.url) {\n payload.fields.url = clientProps.defaultLinkURL as any\n }\n $toggleLink(payload as { fields: LinkFields } & LinkPayload)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const selection = $getSelection()\n if (\n !$isRangeSelection(selection) ||\n selection.isCollapsed() ||\n !(event instanceof ClipboardEvent) ||\n event.clipboardData == null\n ) {\n return false\n }\n const clipboardText = event.clipboardData.getData('text')\n if (!validateUrl(clipboardText)) {\n return false\n }\n // If we select nodes that are elements then avoid applying the link.\n if (!selection.getNodes().some((node) => $isElementNode(node))) {\n const linkFields: LinkFields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: clipboardText,\n }\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: linkFields,\n text: null,\n })\n event.preventDefault()\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [clientProps.defaultLinkType, clientProps.defaultLinkURL, editor])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,aAAa,QAAQ;AAC9B,SACEC,aAAa,EACbC,cAAc,EACdC,iBAAiB,EACjBC,oBAAoB,EACpBC,aAAa,QACR;AACP,SAASC,SAAS,QAAQ;AAO1B,SAASC,WAAW,QAAQ;AAC5B,SAASC,WAAW,EAAEC,QAAQ,EAAEC,mBAAmB,QAAQ;AAE3D,OAAO,MAAMC,UAAA,GAA2CC,EAAA;EAAA,MAAAC,CAAA,GAAAf,EAAA;EAAC;IAAAgB;EAAA,IAAAF,EAAe;EACtE,OAAAG,MAAA,IAAiBhB,yBAAA;EAAA,IAAAiB,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAJ,CAAA,QAAAC,WAAA,CAAAI,eAAA,IAAAL,CAAA,QAAAC,WAAA,CAAAK,cAAA,IAAAN,CAAA,QAAAE,MAAA;IAEPC,EAAA,GAAAA,CAAA;MAAA,KACHD,MAAA,CAAAK,QAAA,EAAAX,QAAA,CAA0B;QAAA,UAAAY,KAAA,CACb;MAAA;MAAA,OAEXrB,aAAA,CACLe,MAAA,CAAAO,eAAA,CAAAZ,mBAAA,EAAAa,OAAA;QAAA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isElementNode","$isRangeSelection","COMMAND_PRIORITY_LOW","PASTE_COMMAND","useEffect","validateUrl","$toggleLink","LinkNode","TOGGLE_LINK_COMMAND","LinkPlugin","t0","$","clientProps","editor","t1","t2","defaultLinkType","defaultLinkURL","hasNodes","Error","registerCommand","payload","fields","linkType","url","event","selection","isCollapsed","ClipboardEvent","clipboardData","clipboardText","getData","getNodes","some","_temp","linkFields","doc","newTab","dispatchCommand","text","preventDefault","node"],"sources":["../../../../../../src/features/link/client/plugins/link/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n PASTE_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\nimport type { LinkPayload } from '../floatingLinkEditor/types.js'\n\nimport { validateUrl } from '../../../../../lexical/utils/url.js'\nimport { $toggleLink, LinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\n\nexport const LinkPlugin: PluginComponent<ClientProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!editor.hasNodes([LinkNode])) {\n throw new Error('LinkPlugin: LinkNode not registered on editor')\n }\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: LinkPayload) => {\n if (payload === null) {\n $toggleLink(null)\n return true\n }\n if (!payload.fields?.linkType) {\n payload.fields.linkType = clientProps.defaultLinkType as any\n }\n if (!payload.fields?.url) {\n payload.fields.url = clientProps.defaultLinkURL as any\n }\n $toggleLink(payload as { fields: LinkFields } & LinkPayload)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const selection = $getSelection()\n if (\n !$isRangeSelection(selection) ||\n selection.isCollapsed() ||\n !(event instanceof ClipboardEvent) ||\n event.clipboardData == null\n ) {\n return false\n }\n const clipboardText = event.clipboardData.getData('text')\n if (!validateUrl(clipboardText)) {\n return false\n }\n // If we select nodes that are elements then avoid applying the link.\n if (!selection.getNodes().some((node) => $isElementNode(node))) {\n const linkFields: LinkFields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: clipboardText,\n }\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: linkFields,\n text: null,\n })\n event.preventDefault()\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [clientProps.defaultLinkType, clientProps.defaultLinkURL, editor])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,aAAa,QAAQ;AAC9B,SACEC,aAAa,EACbC,cAAc,EACdC,iBAAiB,EACjBC,oBAAoB,EACpBC,aAAa,QACR;AACP,SAASC,SAAS,QAAQ;AAO1B,SAASC,WAAW,QAAQ;AAC5B,SAASC,WAAW,EAAEC,QAAQ,EAAEC,mBAAmB,QAAQ;AAE3D,OAAO,MAAMC,UAAA,GAA2CC,EAAA;EAAA,MAAAC,CAAA,GAAAf,EAAA;EAAC;IAAAgB;EAAA,IAAAF,EAAe;EACtE,OAAAG,MAAA,IAAiBhB,yBAAA;EAAA,IAAAiB,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAJ,CAAA,QAAAC,WAAA,CAAAI,eAAA,IAAAL,CAAA,QAAAC,WAAA,CAAAK,cAAA,IAAAN,CAAA,QAAAE,MAAA;IAEPC,EAAA,GAAAA,CAAA;MAAA,KACHD,MAAA,CAAAK,QAAA,EAAAX,QAAA,CAA0B;QAAA,UAAAY,KAAA,CACb;MAAA;MAAA,OAEXrB,aAAA,CACLe,MAAA,CAAAO,eAAA,CAAAZ,mBAAA,EAAAa,OAAA;QAAA,IAGQA,OAAA,SAAY;UACdf,WAAA,KAAY;UAAA;QAAA;QAAA,KAGTe,OAAA,CAAAC,MAAA,EAAAC,QAAA;UACHF,OAAA,CAAAC,MAAA,CAAAC,QAAA,GAA0BX,WAAA,CAAAI,eAAA;QAAA;QAAA,KAEvBK,OAAA,CAAAC,MAAA,EAAAE,GAAA;UACHH,OAAA,CAAAC,MAAA,CAAAE,GAAA,GAAqBZ,WAAA,CAAAK,cAAA;QAAA;QAEvBX,WAAA,CAAYe,OAAA;QAAA;MAAA,GAAAnB,oBAGd,GAEFW,MAAA,CAAAO,eAAA,CAAAjB,aAAA,EAAAsB,KAAA;QAGI,MAAAC,SAAA,GAAkB3B,aAAA;QAAA,IAEhB,CAACE,iBAAA,CAAkByB,SAAA,KACnBA,SAAA,CAAAC,WAAA,CAAqB,OACnBF,KAAA,YAAAG,cAA8B,KAChCH,KAAA,CAAAI,aAAA,QAAuB;UAAA;QAAA;QAIzB,MAAAC,aAAA,GAAsBL,KAAA,CAAAI,aAAA,CAAAE,OAAA,CAA4B;QAAA,KAC7C1B,WAAA,CAAYyB,aAAA;UAAA;QAAA;QAAA,KAIZJ,SAAA,CAAAM,QAAA,CAAkB,EAAAC,IAAA,CAAAC,KAAiC;UACtD,MAAAC,UAAA;YAAAC,GAAA;YAAAb,QAAA,EAEY;YAAAc,MAAA;YAAAb,GAAA,EAELM;UAAA;UAEPjB,MAAA,CAAAyB,eAAA,CAAA9B,mBAAA;YAAAc,MAAA,EACUa,UAAA;YAAAI,IAAA;UAAA,CAEV;UACAd,KAAA,CAAAe,cAAA,CAAoB;UAAA;QAAA;QAAA;MAAA,GAAAtC,oBAKxB;IAAA;IAGHa,EAAA,IAACH,WAAA,CAAAI,eAAA,EAA6BJ,WAAA,CAAAK,cAAA,EAA4BJ,MAAA;IAAOF,CAAA,MAAAC,WAAA,CAAAI,eAAA;IAAAL,CAAA,MAAAC,WAAA,CAAAK,cAAA;IAAAN,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAG,EAAA;IAAAH,CAAA,MAAAI,EAAA;EAAA;IAAAD,EAAA,GAAAH,CAAA;IAAAI,EAAA,GAAAJ,CAAA;EAAA;EA3DpEP,SAAA,CAAUU,EA2DV,EAAGC,EAAiE;EAAA;AAAA,CAGtE;AAjEwD,SAAAmB,MAAAO,IAAA;EAAA,OA2CLzC,cAAA,CAAeyC,IAAA;AAAA","ignoreList":[]}
|
|
@@ -35,7 +35,7 @@ export declare function $createLinkNode({ id, fields }: {
|
|
|
35
35
|
}): LinkNode;
|
|
36
36
|
export declare function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode;
|
|
37
37
|
export declare const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null>;
|
|
38
|
-
export declare function $toggleLink(payload: {
|
|
38
|
+
export declare function $toggleLink(payload: ({
|
|
39
39
|
fields: LinkFields;
|
|
40
|
-
} & LinkPayload): void;
|
|
40
|
+
} & LinkPayload) | null): void;
|
|
41
41
|
//# sourceMappingURL=LinkNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkNode.d.ts","sourceRoot":"","sources":["../../../../src/features/link/nodes/LinkNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAEhB,YAAY,EACZ,WAAW,IAAI,eAAe,EAC9B,cAAc,EACd,WAAW,EACX,OAAO,EACP,cAAc,EACf,MAAM,SAAS,CAAA;AAIhB,OAAO,EAOL,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIhE,oBAAoB;AACpB,qBAAa,QAAS,SAAQ,WAAW;IACvC,QAAQ,EAAE,UAAU,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;gBAEA,EACV,EAAE,EACF,MAKC,EACD,GAAG,GACJ,EAAE;QACD,MAAM,EAAE,UAAU,CAAA;QAClB,EAAE,EAAE,MAAM,CAAA;QACV,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;IAMD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAQtC,MAAM,CAAC,OAAO,IAAI,MAAM;IAIxB,MAAM,CAAC,SAAS,IAAI,gBAAgB,GAAG,IAAI;IAS3C,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,kBAAkB,GAAG,QAAQ;IAyB/D,UAAU,IAAI,KAAK;IAInB,kBAAkB,IAAI,KAAK;IAI3B,mBAAmB,IAAI,KAAK;IAI5B,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,iBAAiB;IAiBlD,UAAU,IAAI,kBAAkB;IAchC,gBAAgB,CACd,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,OAAO,GAAG,MAAM,GAC5B,OAAO;IAeV,SAAS,IAAI,UAAU;IAIvB,KAAK,IAAI,MAAM;IAIf,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,gBAAgB,UAAO,GAAG,eAAe,GAAG,IAAI;IAU1F,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAahC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO;CA8BxF;AAqBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAO7F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,QAAQ,CAElF;AAED,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAC7B,CAAA;AAEtC,wBAAgB,WAAW,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"LinkNode.d.ts","sourceRoot":"","sources":["../../../../src/features/link/nodes/LinkNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAEhB,YAAY,EACZ,WAAW,IAAI,eAAe,EAC9B,cAAc,EACd,WAAW,EACX,OAAO,EACP,cAAc,EACf,MAAM,SAAS,CAAA;AAIhB,OAAO,EAOL,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAIhE,oBAAoB;AACpB,qBAAa,QAAS,SAAQ,WAAW;IACvC,QAAQ,EAAE,UAAU,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;gBAEA,EACV,EAAE,EACF,MAKC,EACD,GAAG,GACJ,EAAE;QACD,MAAM,EAAE,UAAU,CAAA;QAClB,EAAE,EAAE,MAAM,CAAA;QACV,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;IAMD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAQtC,MAAM,CAAC,OAAO,IAAI,MAAM;IAIxB,MAAM,CAAC,SAAS,IAAI,gBAAgB,GAAG,IAAI;IAS3C,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,kBAAkB,GAAG,QAAQ;IAyB/D,UAAU,IAAI,KAAK;IAInB,kBAAkB,IAAI,KAAK;IAI3B,mBAAmB,IAAI,KAAK;IAI5B,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,iBAAiB;IAiBlD,UAAU,IAAI,kBAAkB;IAchC,gBAAgB,CACd,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,OAAO,GAAG,MAAM,GAC5B,OAAO;IAeV,SAAS,IAAI,UAAU;IAIvB,KAAK,IAAI,MAAM;IAIf,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,gBAAgB,UAAO,GAAG,eAAe,GAAG,IAAI;IAU1F,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAahC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAKnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO;CA8BxF;AAqBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,CAO7F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,QAAQ,CAElF;AAED,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAC7B,CAAA;AAEtC,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,CAkHxF"}
|
|
@@ -198,10 +198,10 @@ export function $isLinkNode(node) {
|
|
|
198
198
|
export const TOGGLE_LINK_COMMAND = createCommand('TOGGLE_LINK_COMMAND');
|
|
199
199
|
export function $toggleLink(payload) {
|
|
200
200
|
const selection = $getSelection();
|
|
201
|
-
if (!$isRangeSelection(selection) && !payload.selectedNodes?.length) {
|
|
201
|
+
if (!$isRangeSelection(selection) && (payload === null || !payload.selectedNodes?.length)) {
|
|
202
202
|
return;
|
|
203
203
|
}
|
|
204
|
-
const nodes = $isRangeSelection(selection) ? selection.extract() : payload.selectedNodes;
|
|
204
|
+
const nodes = $isRangeSelection(selection) ? selection.extract() : payload === null ? [] : payload.selectedNodes;
|
|
205
205
|
if (payload === null) {
|
|
206
206
|
// Remove LinkNodes
|
|
207
207
|
nodes?.forEach(node => {
|
|
@@ -214,81 +214,81 @@ export function $toggleLink(payload) {
|
|
|
214
214
|
parent.remove();
|
|
215
215
|
}
|
|
216
216
|
});
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
return;
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Add or merge LinkNodes
|
|
220
|
+
if (nodes?.length === 1) {
|
|
221
|
+
const firstNode = nodes[0];
|
|
222
|
+
// if the first node is a LinkNode or if its
|
|
223
|
+
// parent is a LinkNode, we update the URL, target and rel.
|
|
224
|
+
const linkNode = $isLinkNode(firstNode) ? firstNode : $getLinkAncestor(firstNode);
|
|
225
|
+
if (linkNode !== null) {
|
|
226
|
+
linkNode.setFields(payload.fields);
|
|
227
|
+
if (payload.text != null && payload.text !== linkNode.getTextContent()) {
|
|
228
|
+
// remove all children and add child with new textcontent:
|
|
229
|
+
linkNode.append($createTextNode(payload.text));
|
|
230
|
+
linkNode.getChildren().forEach(child => {
|
|
231
|
+
if (child !== linkNode.getLastChild()) {
|
|
232
|
+
child.remove();
|
|
233
|
+
}
|
|
234
|
+
});
|
|
236
235
|
}
|
|
236
|
+
return;
|
|
237
237
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
238
|
+
}
|
|
239
|
+
let prevParent = null;
|
|
240
|
+
let linkNode = null;
|
|
241
|
+
nodes?.forEach(node => {
|
|
242
|
+
const parent = node.getParent();
|
|
243
|
+
if (parent === linkNode || parent === null || $isElementNode(node) && !node.isInline()) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if ($isLinkNode(parent)) {
|
|
247
|
+
linkNode = parent;
|
|
248
|
+
parent.setFields(payload.fields);
|
|
249
|
+
if (payload.text != null && payload.text !== parent.getTextContent()) {
|
|
250
|
+
// remove all children and add child with new textcontent:
|
|
251
|
+
parent.append($createTextNode(payload.text));
|
|
252
|
+
parent.getChildren().forEach(child => {
|
|
253
|
+
if (child !== parent.getLastChild()) {
|
|
254
|
+
child.remove();
|
|
255
|
+
}
|
|
256
|
+
});
|
|
244
257
|
}
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (!parent.is(prevParent)) {
|
|
261
|
+
prevParent = parent;
|
|
262
|
+
linkNode = $createLinkNode({
|
|
263
|
+
fields: payload.fields
|
|
264
|
+
});
|
|
245
265
|
if ($isLinkNode(parent)) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if (payload.text != null && payload.text !== parent.getTextContent()) {
|
|
249
|
-
// remove all children and add child with new textcontent:
|
|
250
|
-
parent.append($createTextNode(payload.text));
|
|
251
|
-
parent.getChildren().forEach(child => {
|
|
252
|
-
if (child !== parent.getLastChild()) {
|
|
253
|
-
child.remove();
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
if (!parent.is(prevParent)) {
|
|
260
|
-
prevParent = parent;
|
|
261
|
-
linkNode = $createLinkNode({
|
|
262
|
-
fields: payload.fields
|
|
263
|
-
});
|
|
264
|
-
if ($isLinkNode(parent)) {
|
|
265
|
-
if (node.getPreviousSibling() === null) {
|
|
266
|
-
parent.insertBefore(linkNode);
|
|
267
|
-
} else {
|
|
268
|
-
parent.insertAfter(linkNode);
|
|
269
|
-
}
|
|
266
|
+
if (node.getPreviousSibling() === null) {
|
|
267
|
+
parent.insertBefore(linkNode);
|
|
270
268
|
} else {
|
|
271
|
-
|
|
269
|
+
parent.insertAfter(linkNode);
|
|
272
270
|
}
|
|
271
|
+
} else {
|
|
272
|
+
node.insertBefore(linkNode);
|
|
273
273
|
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
278
|
-
if (linkNode !== null) {
|
|
279
|
-
const children = node.getChildren();
|
|
280
|
-
for (let i = 0; i < children.length; i += 1) {
|
|
281
|
-
linkNode.append(children[i]);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
node.remove();
|
|
274
|
+
}
|
|
275
|
+
if ($isLinkNode(node)) {
|
|
276
|
+
if (node.is(linkNode)) {
|
|
285
277
|
return;
|
|
286
278
|
}
|
|
287
279
|
if (linkNode !== null) {
|
|
288
|
-
|
|
280
|
+
const children = node.getChildren();
|
|
281
|
+
for (let i = 0; i < children.length; i += 1) {
|
|
282
|
+
linkNode.append(children[i]);
|
|
283
|
+
}
|
|
289
284
|
}
|
|
290
|
-
|
|
291
|
-
|
|
285
|
+
node.remove();
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (linkNode !== null) {
|
|
289
|
+
linkNode.append(node);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
292
|
}
|
|
293
293
|
function $getLinkAncestor(node) {
|
|
294
294
|
return $getAncestor(node, ancestor => $isLinkNode(ancestor));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkNode.js","names":["addClassNamesToElement","isHTMLAnchorElement","ObjectID","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","__id","constructor","id","fields","doc","linkType","newTab","url","key","clone","node","__key","getType","importDOM","a","conversion","$convertAnchorElement","priority","importJSON","serializedNode","version","value","default","toHexString","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","target","rel","manageRel","theme","link","exportJSON","returnObject","type","getFields","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","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","$toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","i","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"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 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 doc: null,\n linkType: 'custom',\n newTab: false,\n url: '',\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 clone(node: LinkNode): LinkNode {\n return new LinkNode({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static getType(): string {\n return 'link'\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static importJSON(serializedNode: SerializedLinkNode): LinkNode {\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\n const node = $createLinkNode({\n id: serializedNode.id,\n fields: serializedNode.fields,\n })\n node.setFormat(serializedNode.format)\n node.setIndent(serializedNode.indent)\n node.setDirection(serializedNode.direction)\n return node\n }\n\n canBeEmpty(): false {\n return false\n }\n\n canInsertTextAfter(): false {\n return false\n }\n\n canInsertTextBefore(): false {\n return false\n }\n\n 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 exportJSON(): SerializedLinkNode {\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields: this.getFields(),\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n 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 insertNewAfter(selection: RangeSelection, restoreSelection = true): 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 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): void {\n const writable = this.getWritable()\n writable.__fields = fields\n }\n\n updateDOM(prevNode: LinkNode, 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\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): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && !payload.selectedNodes?.length) {\n return\n }\n const nodes = $isRangeSelection(selection) ? selection.extract() : 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 for (let i = 0; i < children.length; i += 1) {\n parent.insertBefore(children[i])\n }\n\n parent.remove()\n }\n })\n } else {\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\n for (let i = 0; i < children.length; i += 1) {\n linkNode.append(children[i])\n }\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"LinkNode.js","names":["addClassNamesToElement","isHTMLAnchorElement","ObjectID","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","createCommand","ElementNode","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","__id","constructor","id","fields","doc","linkType","newTab","url","key","clone","node","__key","getType","importDOM","a","conversion","$convertAnchorElement","priority","importJSON","serializedNode","version","value","default","toHexString","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","target","rel","manageRel","theme","link","exportJSON","returnObject","type","getFields","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","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","$toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","i","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"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 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 doc: null,\n linkType: 'custom',\n newTab: false,\n url: '',\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 clone(node: LinkNode): LinkNode {\n return new LinkNode({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static getType(): string {\n return 'link'\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static importJSON(serializedNode: SerializedLinkNode): LinkNode {\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\n const node = $createLinkNode({\n id: serializedNode.id,\n fields: serializedNode.fields,\n })\n node.setFormat(serializedNode.format)\n node.setIndent(serializedNode.indent)\n node.setDirection(serializedNode.direction)\n return node\n }\n\n canBeEmpty(): false {\n return false\n }\n\n canInsertTextAfter(): false {\n return false\n }\n\n canInsertTextBefore(): false {\n return false\n }\n\n 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 exportJSON(): SerializedLinkNode {\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields: this.getFields(),\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n 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 insertNewAfter(selection: RangeSelection, restoreSelection = true): 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 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): void {\n const writable = this.getWritable()\n writable.__fields = fields\n }\n\n updateDOM(prevNode: LinkNode, 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\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 for (let i = 0; i < children.length; i += 1) {\n parent.insertBefore(children[i])\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\n for (let i = 0; i < children.length; i += 1) {\n linkNode.append(children[i])\n }\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"],"mappings":"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","ignoreList":[]}
|