@payloadcms/richtext-lexical 3.2.3-canary.2d2e7d5 → 3.2.3-canary.5e3c2f6

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.
Files changed (94) hide show
  1. package/dist/exports/client/{Field-JP7H7AZE.js → Field-KHGUSLMB.js} +2 -2
  2. package/dist/exports/client/{Field-JP7H7AZE.js.map → Field-KHGUSLMB.js.map} +2 -2
  3. package/dist/exports/client/{RelationshipComponent-XOQBVKA3.js → RelationshipComponent-F77EQHRG.js} +2 -2
  4. package/dist/exports/client/{chunk-YSJURFKK.js → chunk-4J2ONJMB.js} +2 -2
  5. package/dist/exports/client/{chunk-XCEM47RI.js → chunk-AXXPUMFU.js} +2 -2
  6. package/dist/exports/client/{chunk-5PBXL4HT.js → chunk-F26IQ5RE.js} +2 -2
  7. package/dist/exports/client/{chunk-5PBXL4HT.js.map → chunk-F26IQ5RE.js.map} +1 -1
  8. package/dist/exports/client/chunk-H3D3IU3G.js +2 -0
  9. package/dist/exports/client/{chunk-DOK5S7LE.js.map → chunk-H3D3IU3G.js.map} +2 -2
  10. package/dist/exports/client/{chunk-2CYU43GM.js → chunk-INBEEENE.js} +2 -2
  11. package/dist/exports/client/{chunk-2CYU43GM.js.map → chunk-INBEEENE.js.map} +1 -1
  12. package/dist/exports/client/{chunk-ZTAS32RX.js → chunk-PGMIO4IN.js} +2 -2
  13. package/dist/exports/client/{chunk-2L2Z4JHF.js → chunk-XOABLBHB.js} +2 -2
  14. package/dist/exports/client/{chunk-2L2Z4JHF.js.map → chunk-XOABLBHB.js.map} +1 -1
  15. package/dist/exports/client/{component-D6PKVJ2K.js → component-NSAU5Y76.js} +2 -2
  16. package/dist/exports/client/component-SX36AJXS.js +2 -0
  17. package/dist/exports/client/{component-ANB7VZLA.js.map → component-SX36AJXS.js.map} +2 -2
  18. package/dist/exports/client/componentInline-B5YNOX32.js +2 -0
  19. package/dist/exports/client/index.js +17 -17
  20. package/dist/exports/client/index.js.map +2 -2
  21. package/dist/features/blocks/client/component/BlockContent.js +8 -8
  22. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  23. package/dist/features/blocks/client/component/components/BlockCollapsible.js +5 -5
  24. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  25. package/dist/features/blocks/client/plugin/index.js +7 -4
  26. package/dist/features/blocks/client/plugin/index.js.map +1 -1
  27. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +3 -3
  28. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  29. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +3 -3
  30. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  31. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +6 -6
  32. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
  33. package/dist/features/experimental_table/client/utils/useDebounce.js +3 -3
  34. package/dist/features/experimental_table/client/utils/useDebounce.js.map +1 -1
  35. package/dist/features/horizontalRule/client/component/index.js +19 -18
  36. package/dist/features/horizontalRule/client/component/index.js.map +1 -1
  37. package/dist/features/horizontalRule/client/plugin/index.js +13 -12
  38. package/dist/features/horizontalRule/client/plugin/index.js.map +1 -1
  39. package/dist/features/indent/client/plugins/index.js +3 -3
  40. package/dist/features/indent/client/plugins/index.js.map +1 -1
  41. package/dist/features/link/client/plugins/autoLink/index.js +3 -3
  42. package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
  43. package/dist/features/link/client/plugins/link/index.js +9 -5
  44. package/dist/features/link/client/plugins/link/index.js.map +1 -1
  45. package/dist/features/relationship/client/drawer/index.js +13 -13
  46. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  47. package/dist/features/relationship/client/plugins/index.js +23 -19
  48. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  49. package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js +19 -18
  50. package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js.map +1 -1
  51. package/dist/features/toolbars/fixed/client/Toolbar/index.js +39 -31
  52. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  53. package/dist/features/toolbars/inline/client/Toolbar/index.js +31 -23
  54. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  55. package/dist/features/toolbars/shared/ToolbarButton/index.js +27 -26
  56. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  57. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +36 -36
  58. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  59. package/dist/features/upload/client/drawer/index.js +3 -3
  60. package/dist/features/upload/client/drawer/index.js.map +1 -1
  61. package/dist/features/upload/client/plugin/index.js +6 -3
  62. package/dist/features/upload/client/plugin/index.js.map +1 -1
  63. package/dist/field/index.js +7 -7
  64. package/dist/field/index.js.map +1 -1
  65. package/dist/lexical/LexicalEditor.js +15 -15
  66. package/dist/lexical/LexicalEditor.js.map +1 -1
  67. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +17 -17
  68. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  69. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +17 -17
  70. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  71. package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js +4 -4
  72. package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js.map +1 -1
  73. package/dist/lexical/plugins/TextPlugin/index.js +3 -3
  74. package/dist/lexical/plugins/TextPlugin/index.js.map +1 -1
  75. package/dist/lexical/ui/ContentEditable.js +3 -3
  76. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  77. package/dist/utilities/fieldsDrawer/Drawer.js +11 -11
  78. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  79. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +10 -10
  80. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  81. package/dist/utilities/fieldsDrawer/useLexicalDrawer.js +14 -14
  82. package/dist/utilities/fieldsDrawer/useLexicalDrawer.js.map +1 -1
  83. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +11 -11
  84. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  85. package/package.json +15 -15
  86. package/dist/exports/client/chunk-DOK5S7LE.js +0 -2
  87. package/dist/exports/client/component-ANB7VZLA.js +0 -2
  88. package/dist/exports/client/componentInline-OK3ZQ6YQ.js +0 -2
  89. /package/dist/exports/client/{RelationshipComponent-XOQBVKA3.js.map → RelationshipComponent-F77EQHRG.js.map} +0 -0
  90. /package/dist/exports/client/{chunk-YSJURFKK.js.map → chunk-4J2ONJMB.js.map} +0 -0
  91. /package/dist/exports/client/{chunk-XCEM47RI.js.map → chunk-AXXPUMFU.js.map} +0 -0
  92. /package/dist/exports/client/{chunk-ZTAS32RX.js.map → chunk-PGMIO4IN.js.map} +0 -0
  93. /package/dist/exports/client/{component-D6PKVJ2K.js.map → component-NSAU5Y76.js.map} +0 -0
  94. /package/dist/exports/client/{componentInline-OK3ZQ6YQ.js.map → componentInline-B5YNOX32.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TablePlugin","LexicalReactTablePlugin","INSERT_TABLE_COMMAND","TableNode","mergeRegister","formatDrawerSlug","useEditDepth","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","createCommand","createContext","useContext","useEffect","useMemo","useState","React","useEditorConfigContext","FieldsDrawer","useLexicalDrawer","OPEN_TABLE_DRAWER_COMMAND","CellContext","cellEditorConfig","cellEditorPlugins","set","TableContext","children","contextValue","setContextValue","_jsx","Provider","value","$","editor","cellContext","editDepth","fieldProps","t0","uuid","schemaPath","t1","t2","slug","depth","drawerSlug","toggleDrawer","t3","hasNodes","Error","registerCommand","rangeSelection","getEditorState","read","selection","t4","t5","_fields","data","columns","rows","dispatchCommand","String","t6","_jsxs","Fragment","drawerTitle","featureKey","handleDrawerSubmit","schemaPathSuffix","hasCellBackgroundColor","hasCellMerge"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TablePlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n EditorThemeClasses,\n Klass,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TablePlugin as LexicalReactTablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { INSERT_TABLE_COMMAND, TableNode } from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport './index.scss'\n\nexport type CellContextShape = {\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n set: (\n cellEditorConfig: CellEditorConfig | null,\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null,\n ) => void\n}\n\nexport type CellEditorConfig = Readonly<{\n namespace: string\n nodes?: ReadonlyArray<Klass<LexicalNode>>\n onError: (error: Error, editor: LexicalEditor) => void\n readOnly?: boolean\n theme?: EditorThemeClasses\n}>\n\nexport const OPEN_TABLE_DRAWER_COMMAND: LexicalCommand<{}> = createCommand(\n 'OPEN_EMBED_DRAWER_COMMAND',\n)\n\nexport const CellContext = createContext<CellContextShape>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n set: () => {\n // Empty\n },\n})\n\nexport function TableContext({ children }: { children: JSX.Element }) {\n const [contextValue, setContextValue] = useState<{\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n }>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n })\n return (\n <CellContext.Provider\n value={useMemo(\n () => ({\n cellEditorConfig: contextValue.cellEditorConfig,\n cellEditorPlugins: contextValue.cellEditorPlugins,\n set: (cellEditorConfig, cellEditorPlugins) => {\n setContextValue({ cellEditorConfig, cellEditorPlugins })\n },\n }),\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\n )}\n >\n {children}\n </CellContext.Provider>\n )\n}\n\nexport const TablePlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const cellContext = useContext(CellContext)\n const editDepth = useEditDepth()\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n\n const drawerSlug = formatDrawerSlug({\n slug: 'lexical-table-create-' + uuid,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([TableNode])) {\n throw new Error('TablePlugin: TableNode is not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand(\n OPEN_TABLE_DRAWER_COMMAND,\n () => {\n let rangeSelection: null | RangeSelection = null\n\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n rangeSelection = selection\n }\n })\n\n if (rangeSelection) {\n toggleDrawer()\n }\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [cellContext, editor, toggleDrawer])\n\n return (\n <React.Fragment>\n <FieldsDrawer\n drawerSlug={drawerSlug}\n drawerTitle=\"Create Table\"\n featureKey=\"experimental_table\"\n handleDrawerSubmit={(_fields, data) => {\n if (!data.columns || !data.rows) {\n return\n }\n\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {\n columns: String(data.columns),\n rows: String(data.rows),\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n <LexicalReactTablePlugin hasCellBackgroundColor={false} hasCellMerge />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TablePlugin","LexicalReactTablePlugin","INSERT_TABLE_COMMAND","TableNode","mergeRegister","formatDrawerSlug","useEditDepth","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","createCommand","createContext","useContext","useEffect","useMemo","useState","React","useEditorConfigContext","FieldsDrawer","useLexicalDrawer","OPEN_TABLE_DRAWER_COMMAND","CellContext","cellEditorConfig","cellEditorPlugins","set","TableContext","children","contextValue","setContextValue","_jsx","Provider","value","$","editor","cellContext","editDepth","fieldProps","t0","uuid","schemaPath","t1","t2","slug","depth","drawerSlug","toggleDrawer","t3","hasNodes","Error","registerCommand","rangeSelection","getEditorState","read","selection","t4","t5","_fields","data","columns","rows","dispatchCommand","String","t6","_jsxs","Fragment","drawerTitle","featureKey","handleDrawerSubmit","schemaPathSuffix","hasCellBackgroundColor","hasCellMerge"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TablePlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n EditorThemeClasses,\n Klass,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TablePlugin as LexicalReactTablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { INSERT_TABLE_COMMAND, TableNode } from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical'\nimport { createContext, useContext, useEffect, useMemo, useState } from 'react'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport './index.scss'\n\nexport type CellContextShape = {\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n set: (\n cellEditorConfig: CellEditorConfig | null,\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null,\n ) => void\n}\n\nexport type CellEditorConfig = Readonly<{\n namespace: string\n nodes?: ReadonlyArray<Klass<LexicalNode>>\n onError: (error: Error, editor: LexicalEditor) => void\n readOnly?: boolean\n theme?: EditorThemeClasses\n}>\n\nexport const OPEN_TABLE_DRAWER_COMMAND: LexicalCommand<{}> = createCommand(\n 'OPEN_EMBED_DRAWER_COMMAND',\n)\n\nexport const CellContext = createContext<CellContextShape>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n set: () => {\n // Empty\n },\n})\n\nexport function TableContext({ children }: { children: JSX.Element }) {\n const [contextValue, setContextValue] = useState<{\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n }>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n })\n return (\n <CellContext.Provider\n value={useMemo(\n () => ({\n cellEditorConfig: contextValue.cellEditorConfig,\n cellEditorPlugins: contextValue.cellEditorPlugins,\n set: (cellEditorConfig, cellEditorPlugins) => {\n setContextValue({ cellEditorConfig, cellEditorPlugins })\n },\n }),\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\n )}\n >\n {children}\n </CellContext.Provider>\n )\n}\n\nexport const TablePlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const cellContext = useContext(CellContext)\n const editDepth = useEditDepth()\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n\n const drawerSlug = formatDrawerSlug({\n slug: 'lexical-table-create-' + uuid,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([TableNode])) {\n throw new Error('TablePlugin: TableNode is not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand(\n OPEN_TABLE_DRAWER_COMMAND,\n () => {\n let rangeSelection: null | RangeSelection = null\n\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n rangeSelection = selection\n }\n })\n\n if (rangeSelection) {\n toggleDrawer()\n }\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [cellContext, editor, toggleDrawer])\n\n return (\n <React.Fragment>\n <FieldsDrawer\n drawerSlug={drawerSlug}\n drawerTitle=\"Create Table\"\n featureKey=\"experimental_table\"\n handleDrawerSubmit={(_fields, data) => {\n if (!data.columns || !data.rows) {\n return\n }\n\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {\n columns: String(data.columns),\n rows: String(data.rows),\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n <LexicalReactTablePlugin hasCellBackgroundColor={false} hasCellMerge />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ export function useDebounce(fn, ms, maxWait) {
8
8
  const debouncedRef = useRef(null);
9
9
  let t0;
10
10
  let t1;
11
- if ($[0] !== fn || $[1] !== ms || $[2] !== maxWait) {
11
+ if ($[0] !== fn || $[1] !== maxWait || $[2] !== ms) {
12
12
  t0 = () => {
13
13
  debouncedRef.current = debounce(fn, ms, {
14
14
  maxWait
@@ -19,8 +19,8 @@ export function useDebounce(fn, ms, maxWait) {
19
19
  };
20
20
  t1 = [fn, ms, maxWait];
21
21
  $[0] = fn;
22
- $[1] = ms;
23
- $[2] = maxWait;
22
+ $[1] = maxWait;
23
+ $[2] = ms;
24
24
  $[3] = t0;
25
25
  $[4] = t1;
26
26
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"useDebounce.js","names":["c","_c","useCallback","useEffect","useRef","debounce","useDebounce","fn","ms","maxWait","$","debouncedRef","t0","t1","current","cancel","t2","Symbol","for","t3","args","callback"],"sources":["../../../../../src/features/experimental_table/client/utils/useDebounce.ts"],"sourcesContent":["'use client'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport debounce from './debounce.js'\n\n// Define the type for debounced function that includes cancel method\ninterface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n}\n\nexport function useDebounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n maxWait?: number,\n) {\n // Update the ref type to include cancel method\n const debouncedRef = useRef<DebouncedFunction<T> | null>(null)\n\n useEffect(() => {\n debouncedRef.current = debounce(fn, ms, { maxWait }) as DebouncedFunction<T>\n\n return () => {\n debouncedRef.current?.cancel()\n }\n }, [fn, ms, maxWait])\n\n const callback = useCallback((...args: Parameters<T>) => {\n if (debouncedRef.current) {\n debouncedRef.current(...args)\n }\n }, [])\n\n return callback\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ;AAE/C,OAAOC,QAAA,MAAc;AAQrB,OAAO,SAAAC,YAAAC,EAAA,EAAAC,EAAA,EAAAC,OAAA;EAAA,MAAAC,CAAA,GAAAT,EAAA;EAML,MAAAU,YAAA,GAAqBP,MAAA,KAAoC;EAAA,IAAAQ,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAH,EAAA,IAAAG,CAAA,QAAAF,EAAA,IAAAE,CAAA,QAAAD,OAAA;IAE/CG,EAAA,GAAAA,CAAA;MACRD,YAAA,CAAAG,OAAA,GAAuBT,QAAA,CAASE,EAAA,EAAIC,EAAA;QAAAC;MAAA,CAAc;MAAA;QAGhDE,YAAA,CAAAG,OAAA,EAAAC,MAAA;MAAA;IAAA;IAEDF,EAAA,IAACN,EAAA,EAAIC,EAAA,EAAIC,OAAA;IAAQC,CAAA,MAAAH,EAAA;IAAAG,CAAA,MAAAF,EAAA;IAAAE,CAAA,MAAAD,OAAA;IAAAC,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EANpBP,SAAA,CAAUS,EAMV,EAAGC,EAAiB;EAAA,IAAAG,EAAA;EAAA,IAAAN,CAAA,QAAAO,MAAA,CAAAC,GAAA;IAESF,EAAA,GAAAA,CAAA,GAAAG,EAAA;MAAC,MAAAC,IAAA,GAAAD,EAAG;MAAA,IAC3BR,YAAA,CAAAG,OAAA;QACFH,YAAA,CAAAG,OAAA,IAAwBM,IAAA;MAAA;IAAA;IAE5BV,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAJA,MAAAW,QAAA,GAAiBL,EAIZ;EAAA,OAEEK,QAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"useDebounce.js","names":["c","_c","useCallback","useEffect","useRef","debounce","useDebounce","fn","ms","maxWait","$","debouncedRef","t0","t1","current","cancel","t2","Symbol","for","t3","args","callback"],"sources":["../../../../../src/features/experimental_table/client/utils/useDebounce.ts"],"sourcesContent":["'use client'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport debounce from './debounce.js'\n\n// Define the type for debounced function that includes cancel method\ninterface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n}\n\nexport function useDebounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n maxWait?: number,\n) {\n // Update the ref type to include cancel method\n const debouncedRef = useRef<DebouncedFunction<T> | null>(null)\n\n useEffect(() => {\n debouncedRef.current = debounce(fn, ms, { maxWait }) as DebouncedFunction<T>\n\n return () => {\n debouncedRef.current?.cancel()\n }\n }, [fn, ms, maxWait])\n\n const callback = useCallback((...args: Parameters<T>) => {\n if (debouncedRef.current) {\n debouncedRef.current(...args)\n }\n }, [])\n\n return callback\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AACA,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ;AAE/C,OAAOC,QAAA,MAAc;AAQrB,OAAO,SAAAC,YAAAC,EAAA,EAAAC,EAAA,EAAAC,OAAA;EAAA,MAAAC,CAAA,GAAAT,EAAA;EAML,MAAAU,YAAA,GAAqBP,MAAA,KAAoC;EAAA,IAAAQ,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAH,EAAA,IAAAG,CAAA,QAAAD,OAAA,IAAAC,CAAA,QAAAF,EAAA;IAE/CI,EAAA,GAAAA,CAAA;MACRD,YAAA,CAAAG,OAAA,GAAuBT,QAAA,CAASE,EAAA,EAAIC,EAAA;QAAAC;MAAA,CAAc;MAAA;QAGhDE,YAAA,CAAAG,OAAA,EAAAC,MAAA;MAAA;IAAA;IAEDF,EAAA,IAACN,EAAA,EAAIC,EAAA,EAAIC,OAAA;IAAQC,CAAA,MAAAH,EAAA;IAAAG,CAAA,MAAAD,OAAA;IAAAC,CAAA,MAAAF,EAAA;IAAAE,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EANpBP,SAAA,CAAUS,EAMV,EAAGC,EAAiB;EAAA,IAAAG,EAAA;EAAA,IAAAN,CAAA,QAAAO,MAAA,CAAAC,GAAA;IAESF,EAAA,GAAAA,CAAA,GAAAG,EAAA;MAAC,MAAAC,IAAA,GAAAD,EAAG;MAAA,IAC3BR,YAAA,CAAAG,OAAA;QACFH,YAAA,CAAAG,OAAA,IAAwBM,IAAA;MAAA;IAAA;IAE5BV,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAJA,MAAAW,QAAA,GAAiBL,EAIZ;EAAA,OAEEK,QAAA;AAAA","ignoreList":[]}
@@ -21,23 +21,19 @@ export function HorizontalRuleComponent(t0) {
21
21
  const [editor] = useLexicalComposerContext();
22
22
  const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey);
23
23
  let t1;
24
- if ($[0] !== isSelected || $[1] !== editor) {
24
+ if ($[0] !== editor || $[1] !== isSelected) {
25
25
  t1 = event => {
26
26
  const deleteSelection = $getSelection();
27
27
  if (isSelected && $isNodeSelection(deleteSelection)) {
28
28
  event.preventDefault();
29
29
  editor.update(() => {
30
- deleteSelection.getNodes().forEach(node => {
31
- if ($isHorizontalRuleNode(node)) {
32
- node.remove();
33
- }
34
- });
30
+ deleteSelection.getNodes().forEach(_temp);
35
31
  });
36
32
  }
37
33
  return false;
38
34
  };
39
- $[0] = isSelected;
40
- $[1] = editor;
35
+ $[0] = editor;
36
+ $[1] = isSelected;
41
37
  $[2] = t1;
42
38
  } else {
43
39
  t1 = $[2];
@@ -45,7 +41,7 @@ export function HorizontalRuleComponent(t0) {
45
41
  const $onDelete = t1;
46
42
  let t2;
47
43
  let t3;
48
- if ($[3] !== editor || $[4] !== nodeKey || $[5] !== clearSelection || $[6] !== setSelected || $[7] !== isSelected || $[8] !== $onDelete) {
44
+ if ($[3] !== $onDelete || $[4] !== clearSelection || $[5] !== editor || $[6] !== isSelected || $[7] !== nodeKey || $[8] !== setSelected) {
49
45
  t2 = () => mergeRegister(editor.registerCommand(CLICK_COMMAND, event_0 => {
50
46
  const hrElem = editor.getElementByKey(nodeKey);
51
47
  if (event_0.target === hrElem) {
@@ -58,12 +54,12 @@ export function HorizontalRuleComponent(t0) {
58
54
  return false;
59
55
  }, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW), editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW));
60
56
  t3 = [clearSelection, editor, isSelected, nodeKey, $onDelete, setSelected];
61
- $[3] = editor;
62
- $[4] = nodeKey;
63
- $[5] = clearSelection;
64
- $[6] = setSelected;
65
- $[7] = isSelected;
66
- $[8] = $onDelete;
57
+ $[3] = $onDelete;
58
+ $[4] = clearSelection;
59
+ $[5] = editor;
60
+ $[6] = isSelected;
61
+ $[7] = nodeKey;
62
+ $[8] = setSelected;
67
63
  $[9] = t2;
68
64
  $[10] = t3;
69
65
  } else {
@@ -73,7 +69,7 @@ export function HorizontalRuleComponent(t0) {
73
69
  useEffect(t2, t3);
74
70
  let t4;
75
71
  let t5;
76
- if ($[11] !== editor || $[12] !== nodeKey || $[13] !== isSelected) {
72
+ if ($[11] !== editor || $[12] !== isSelected || $[13] !== nodeKey) {
77
73
  t4 = () => {
78
74
  const hrElem_0 = editor.getElementByKey(nodeKey);
79
75
  if (hrElem_0 !== null) {
@@ -86,8 +82,8 @@ export function HorizontalRuleComponent(t0) {
86
82
  };
87
83
  t5 = [editor, isSelected, nodeKey];
88
84
  $[11] = editor;
89
- $[12] = nodeKey;
90
- $[13] = isSelected;
85
+ $[12] = isSelected;
86
+ $[13] = nodeKey;
91
87
  $[14] = t4;
92
88
  $[15] = t5;
93
89
  } else {
@@ -97,4 +93,9 @@ export function HorizontalRuleComponent(t0) {
97
93
  useEffect(t4, t5);
98
94
  return null;
99
95
  }
96
+ function _temp(node) {
97
+ if ($isHorizontalRuleNode(node)) {
98
+ node.remove();
99
+ }
100
+ }
100
101
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalNodeSelection","addClassNamesToElement","mergeRegister","removeClassNamesFromElement","$getSelection","$isNodeSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","useCallback","useEffect","$isHorizontalRuleNode","isSelectedClassName","HorizontalRuleComponent","t0","$","nodeKey","editor","isSelected","setSelected","clearSelection","t1","event","deleteSelection","preventDefault","update","getNodes","forEach","node","remove","$onDelete","t2","t3","registerCommand","event_0","hrElem","getElementByKey","target","shiftKey","t4","t5","hrElem_0"],"sources":["../../../../../src/features/horizontalRule/client/component/index.tsx"],"sourcesContent":["'use client'\n\nimport type { NodeKey } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection.js'\nimport { addClassNamesToElement, mergeRegister, removeClassNamesFromElement } from '@lexical/utils'\nimport {\n $getSelection,\n $isNodeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect } from 'react'\n\nimport { $isHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\n\nconst isSelectedClassName = 'selected'\n\n/**\n * React component rendered in the lexical editor, WITHIN the hr element created by createDOM of the HorizontalRuleNode.\n *\n * @param nodeKey every node has a unique key (this key is not saved to the database and thus may differ between sessions). It's useful for working with the CURRENT lexical editor state\n */\nexport function HorizontalRuleComponent({ nodeKey }: { nodeKey: NodeKey }) {\n const [editor] = useLexicalComposerContext()\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey)\n\n const $onDelete = useCallback(\n (event: KeyboardEvent) => {\n const deleteSelection = $getSelection()\n if (isSelected && $isNodeSelection(deleteSelection)) {\n event.preventDefault()\n editor.update(() => {\n deleteSelection.getNodes().forEach((node) => {\n if ($isHorizontalRuleNode(node)) {\n node.remove()\n }\n })\n })\n }\n return false\n },\n [editor, isSelected],\n )\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n CLICK_COMMAND,\n (event: MouseEvent) => {\n const hrElem = editor.getElementByKey(nodeKey)\n\n if (event.target === hrElem) {\n if (!event.shiftKey) {\n clearSelection()\n }\n setSelected(!isSelected)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n )\n }, [clearSelection, editor, isSelected, nodeKey, $onDelete, setSelected])\n\n useEffect(() => {\n const hrElem = editor.getElementByKey(nodeKey)\n if (hrElem !== null) {\n if (isSelected) {\n addClassNamesToElement(hrElem, isSelectedClassName)\n } else {\n removeClassNamesFromElement(hrElem, isSelectedClassName)\n }\n }\n }, [editor, isSelected, nodeKey])\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalNodeSelection","addClassNamesToElement","mergeRegister","removeClassNamesFromElement","$getSelection","$isNodeSelection","CLICK_COMMAND","COMMAND_PRIORITY_LOW","KEY_BACKSPACE_COMMAND","KEY_DELETE_COMMAND","useCallback","useEffect","$isHorizontalRuleNode","isSelectedClassName","HorizontalRuleComponent","t0","$","nodeKey","editor","isSelected","setSelected","clearSelection","t1","event","deleteSelection","preventDefault","update","getNodes","forEach","_temp","$onDelete","t2","t3","registerCommand","event_0","hrElem","getElementByKey","target","shiftKey","t4","t5","hrElem_0","node","remove"],"sources":["../../../../../src/features/horizontalRule/client/component/index.tsx"],"sourcesContent":["'use client'\n\nimport type { NodeKey } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection.js'\nimport { addClassNamesToElement, mergeRegister, removeClassNamesFromElement } from '@lexical/utils'\nimport {\n $getSelection,\n $isNodeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect } from 'react'\n\nimport { $isHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\n\nconst isSelectedClassName = 'selected'\n\n/**\n * React component rendered in the lexical editor, WITHIN the hr element created by createDOM of the HorizontalRuleNode.\n *\n * @param nodeKey every node has a unique key (this key is not saved to the database and thus may differ between sessions). It's useful for working with the CURRENT lexical editor state\n */\nexport function HorizontalRuleComponent({ nodeKey }: { nodeKey: NodeKey }) {\n const [editor] = useLexicalComposerContext()\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey)\n\n const $onDelete = useCallback(\n (event: KeyboardEvent) => {\n const deleteSelection = $getSelection()\n if (isSelected && $isNodeSelection(deleteSelection)) {\n event.preventDefault()\n editor.update(() => {\n deleteSelection.getNodes().forEach((node) => {\n if ($isHorizontalRuleNode(node)) {\n node.remove()\n }\n })\n })\n }\n return false\n },\n [editor, isSelected],\n )\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n CLICK_COMMAND,\n (event: MouseEvent) => {\n const hrElem = editor.getElementByKey(nodeKey)\n\n if (event.target === hrElem) {\n if (!event.shiftKey) {\n clearSelection()\n }\n setSelected(!isSelected)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n )\n }, [clearSelection, editor, isSelected, nodeKey, $onDelete, setSelected])\n\n useEffect(() => {\n const hrElem = editor.getElementByKey(nodeKey)\n if (hrElem !== null) {\n if (isSelected) {\n addClassNamesToElement(hrElem, isSelectedClassName)\n } else {\n removeClassNamesFromElement(hrElem, isSelectedClassName)\n }\n }\n }, [editor, isSelected, nodeKey])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAIA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,uBAAuB,QAAQ;AACxC,SAASC,sBAAsB,EAAEC,aAAa,EAAEC,2BAA2B,QAAQ;AACnF,SACEC,aAAa,EACbC,gBAAgB,EAChBC,aAAa,EACbC,oBAAoB,EACpBC,qBAAqB,EACrBC,kBAAkB,QACb;AACP,SAASC,WAAW,EAAEC,SAAS,QAAQ;AAEvC,SAASC,qBAAqB,QAAQ;AAEtC,MAAMC,mBAAA,GAAsB;AAE5B;;;;;AAKA,OAAO,SAAAC,wBAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAlB,EAAA;EAAiC;IAAAmB;EAAA,IAAAF,EAAiC;EACvE,OAAAG,MAAA,IAAiBnB,yBAAA;EACjB,OAAAoB,UAAA,EAAAC,WAAA,EAAAC,cAAA,IAAkDrB,uBAAA,CAAwBiB,OAAA;EAAA,IAAAK,EAAA;EAAA,IAAAN,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAG,UAAA;IAGxEG,EAAA,GAAAC,KAAA;MACE,MAAAC,eAAA,GAAwBpB,aAAA;MAAA,IACpBe,UAAA,IAAcd,gBAAA,CAAiBmB,eAAA;QACjCD,KAAA,CAAAE,cAAA,CAAoB;QACpBP,MAAA,CAAAQ,MAAA;UACEF,eAAA,CAAAG,QAAA,CAAwB,EAAAC,OAAA,CAAAC,KAIxB;QAAA,CACF;MAAA;MAAA;IAAA;IAGJb,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAG,UAAA;IAAAH,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAdF,MAAAc,SAAA,GAAkBR,EAeI;EAAA,IAAAS,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAhB,CAAA,QAAAc,SAAA,IAAAd,CAAA,QAAAK,cAAA,IAAAL,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAG,UAAA,IAAAH,CAAA,QAAAC,OAAA,IAAAD,CAAA,QAAAI,WAAA;IAGZW,EAAA,GAAAA,CAAA,KACD7B,aAAA,CACLgB,MAAA,CAAAe,eAAA,CAAA3B,aAAA,EAAA4B,OAAA;MAGI,MAAAC,MAAA,GAAejB,MAAA,CAAAkB,eAAA,CAAuBnB,OAAA;MAAA,IAElCM,OAAA,CAAAc,MAAA,KAAiBF,MAAA;QAAA,KACdZ,OAAA,CAAAe,QAAA;UACHjB,cAAA;QAAA;QAEFD,WAAA,EAAaD,UAAA;QAAA;MAAA;MAAA;IAAA,GAAAZ,oBAMjB,GAEFW,MAAA,CAAAe,eAAA,CAAAxB,kBAAA,EAA2CqB,SAAA,EAAAvB,oBAAW,GACtDW,MAAA,CAAAe,eAAA,CAAAzB,qBAAA,EAA8CsB,SAAA,EAAAvB,oBAAW;IAE1DyB,EAAA,IAACX,cAAA,EAAgBH,MAAA,EAAQC,UAAA,EAAYF,OAAA,EAASa,SAAA,EAAWV,WAAA;IAAYJ,CAAA,MAAAc,SAAA;IAAAd,CAAA,MAAAK,cAAA;IAAAL,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAG,UAAA;IAAAH,CAAA,MAAAC,OAAA;IAAAD,CAAA,MAAAI,WAAA;IAAAJ,CAAA,MAAAe,EAAA;IAAAf,CAAA,OAAAgB,EAAA;EAAA;IAAAD,EAAA,GAAAf,CAAA;IAAAgB,EAAA,GAAAhB,CAAA;EAAA;EAtBxEL,SAAA,CAAUoB,EAsBV,EAAGC,EAAqE;EAAA,IAAAO,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAxB,CAAA,SAAAE,MAAA,IAAAF,CAAA,SAAAG,UAAA,IAAAH,CAAA,SAAAC,OAAA;IAE9DsB,EAAA,GAAAA,CAAA;MACR,MAAAE,QAAA,GAAevB,MAAA,CAAAkB,eAAA,CAAuBnB,OAAA;MAAA,IAClCkB,QAAA,SAAW;QAAA,IACThB,UAAA;UACFlB,sBAAA,CAAuBkC,QAAA,EAAAtB,mBAAQ;QAAA;UAE/BV,2BAAA,CAA4BgC,QAAA,EAAAtB,mBAAQ;QAAA;MAAA;IAAA;IAGvC2B,EAAA,IAACtB,MAAA,EAAQC,UAAA,EAAYF,OAAA;IAAQD,CAAA,OAAAE,MAAA;IAAAF,CAAA,OAAAG,UAAA;IAAAH,CAAA,OAAAC,OAAA;IAAAD,CAAA,OAAAuB,EAAA;IAAAvB,CAAA,OAAAwB,EAAA;EAAA;IAAAD,EAAA,GAAAvB,CAAA;IAAAwB,EAAA,GAAAxB,CAAA;EAAA;EAThCL,SAAA,CAAU4B,EASV,EAAGC,EAA6B;EAAA;AAAA;AAvD3B,SAAAX,MAAAa,IAAA;EAAA,IAWS9B,qBAAA,CAAsB8B,IAAA;IACxBA,IAAA,CAAAC,MAAA,CAAW;EAAA;AAAA","ignoreList":[]}
@@ -16,18 +16,7 @@ export const HorizontalRulePlugin = () => {
16
16
  let t0;
17
17
  let t1;
18
18
  if ($[0] !== editor) {
19
- t0 = () => editor.registerCommand(INSERT_HORIZONTAL_RULE_COMMAND, type => {
20
- const selection = $getSelection();
21
- if (!$isRangeSelection(selection)) {
22
- return false;
23
- }
24
- const focusNode = selection.focus.getNode();
25
- if (focusNode !== null) {
26
- const horizontalRuleNode = $createHorizontalRuleNode();
27
- $insertNodeToNearestRoot(horizontalRuleNode);
28
- }
29
- return true;
30
- }, COMMAND_PRIORITY_EDITOR);
19
+ t0 = () => editor.registerCommand(INSERT_HORIZONTAL_RULE_COMMAND, _temp, COMMAND_PRIORITY_EDITOR);
31
20
  t1 = [editor];
32
21
  $[0] = editor;
33
22
  $[1] = t0;
@@ -39,4 +28,16 @@ export const HorizontalRulePlugin = () => {
39
28
  useEffect(t0, t1);
40
29
  return null;
41
30
  };
31
+ function _temp(type) {
32
+ const selection = $getSelection();
33
+ if (!$isRangeSelection(selection)) {
34
+ return false;
35
+ }
36
+ const focusNode = selection.focus.getNode();
37
+ if (focusNode !== null) {
38
+ const horizontalRuleNode = $createHorizontalRuleNode();
39
+ $insertNodeToNearestRoot(horizontalRuleNode);
40
+ }
41
+ return true;
42
+ }
42
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$insertNodeToNearestRoot","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","useEffect","INSERT_HORIZONTAL_RULE_COMMAND","$createHorizontalRuleNode","HorizontalRulePlugin","$","editor","t0","t1","registerCommand","type","selection","focusNode","focus","getNode","horizontalRuleNode"],"sources":["../../../../../src/features/horizontalRule/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../../server/nodes/HorizontalRuleNode.js'\nimport { $createHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\nimport './index.scss'\n\n/**\n * Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.\n */\nexport const HorizontalRulePlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand(\n INSERT_HORIZONTAL_RULE_COMMAND,\n (type) => {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const focusNode = selection.focus.getNode()\n\n if (focusNode !== null) {\n const horizontalRuleNode = $createHorizontalRuleNode()\n $insertNodeToNearestRoot(horizontalRuleNode)\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,wBAAwB,QAAQ;AACzC,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,uBAAuB,QAAQ;AAC1E,SAASC,SAAS,QAAQ;AAI1B,SAASC,8BAA8B,QAAQ;AAC/C,SAASC,yBAAyB,QAAQ;AAG1C;;;AAGA,OAAO,MAAMC,oBAAA,GAAmDA,CAAA;EAAA,MAAAC,CAAA,GAAAV,EAAA;EAC9D,OAAAW,MAAA,IAAiBV,yBAAA;EAAA,IAAAW,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAC,MAAA;IAEPC,EAAA,GAAAA,CAAA,KACDD,MAAA,CAAAG,eAAA,CAAAP,8BAAA,EAAAQ,IAAA;MAGH,MAAAC,SAAA,GAAkBb,aAAA;MAAA,KAEbC,iBAAA,CAAkBY,SAAA;QAAA;MAAA;MAIvB,MAAAC,SAAA,GAAkBD,SAAA,CAAAE,KAAA,CAAAC,OAAA,CAAuB;MAAA,IAErCF,SAAA,SAAc;QAChB,MAAAG,kBAAA,GAA2BZ,yBAAA;QAC3BN,wBAAA,CAAyBkB,kBAAA;MAAA;MAAA;IAAA,GAAAf,uBAK7B;IAEDQ,EAAA,IAACF,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EArBXJ,SAAA,CAAUM,EAqBV,EAAGC,EAAQ;EAAA;AAAA,CAGb","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$insertNodeToNearestRoot","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","useEffect","INSERT_HORIZONTAL_RULE_COMMAND","$createHorizontalRuleNode","HorizontalRulePlugin","$","editor","t0","t1","registerCommand","_temp","type","selection","focusNode","focus","getNode","horizontalRuleNode"],"sources":["../../../../../src/features/horizontalRule/client/plugin/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../../server/nodes/HorizontalRuleNode.js'\nimport { $createHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\nimport './index.scss'\n\n/**\n * Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.\n */\nexport const HorizontalRulePlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand(\n INSERT_HORIZONTAL_RULE_COMMAND,\n (type) => {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const focusNode = selection.focus.getNode()\n\n if (focusNode !== null) {\n const horizontalRuleNode = $createHorizontalRuleNode()\n $insertNodeToNearestRoot(horizontalRuleNode)\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,wBAAwB,QAAQ;AACzC,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,uBAAuB,QAAQ;AAC1E,SAASC,SAAS,QAAQ;AAI1B,SAASC,8BAA8B,QAAQ;AAC/C,SAASC,yBAAyB,QAAQ;AAG1C;;;AAGA,OAAO,MAAMC,oBAAA,GAAmDA,CAAA;EAAA,MAAAC,CAAA,GAAAV,EAAA;EAC9D,OAAAW,MAAA,IAAiBV,yBAAA;EAAA,IAAAW,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAC,MAAA;IAEPC,EAAA,GAAAA,CAAA,KACDD,MAAA,CAAAG,eAAA,CAAAP,8BAAA,EAAAQ,KAAA,EAAAV,uBAkBL;IAEDQ,EAAA,IAACF,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EArBXJ,SAAA,CAAUM,EAqBV,EAAGC,EAAQ;EAAA;AAAA,CAGb;AA3BgE,SAAAE,MAAAC,IAAA;EAOxD,MAAAC,SAAA,GAAkBd,aAAA;EAAA,KAEbC,iBAAA,CAAkBa,SAAA;IAAA;EAAA;EAIvB,MAAAC,SAAA,GAAkBD,SAAA,CAAAE,KAAA,CAAAC,OAAA,CAAuB;EAAA,IAErCF,SAAA,SAAc;IAChB,MAAAG,kBAAA,GAA2Bb,yBAAA;IAC3BN,wBAAA,CAAyBmB,kBAAA;EAAA;EAAA;AAAA","ignoreList":[]}
@@ -33,7 +33,7 @@ export const IndentPlugin = () => {
33
33
  useEffect(t0, t1);
34
34
  let t2;
35
35
  let t3;
36
- if ($[3] !== firefoxFlag || $[4] !== editor) {
36
+ if ($[3] !== editor || $[4] !== firefoxFlag) {
37
37
  t2 = () => {
38
38
  if (!firefoxFlag) {
39
39
  return;
@@ -52,8 +52,8 @@ export const IndentPlugin = () => {
52
52
  };
53
53
  };
54
54
  t3 = [editor, firefoxFlag];
55
- $[3] = firefoxFlag;
56
- $[4] = editor;
55
+ $[3] = editor;
56
+ $[4] = firefoxFlag;
57
57
  $[5] = t2;
58
58
  $[6] = t3;
59
59
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TabIndentationPlugin","mergeRegister","COMMAND_PRIORITY_NORMAL","FOCUS_COMMAND","KEY_ESCAPE_COMMAND","useEffect","useState","IndentPlugin","$","editor","firefoxFlag","setFirefoxFlag","t0","t1","registerCommand","getRootElement","blur","t2","t3","handleKeyDown","e","includes","key","shiftKey","parentElement","focus","document","addEventListener","removeEventListener","t4","Symbol","for","_jsx"],"sources":["../../../../../src/features/indent/client/plugins/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { mergeRegister } from '@lexical/utils'\nimport { COMMAND_PRIORITY_NORMAL, FOCUS_COMMAND, KEY_ESCAPE_COMMAND } from 'lexical'\nimport { useEffect, useState } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nexport const IndentPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n const [firefoxFlag, setFirefoxFlag] = useState<boolean>(false)\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<MouseEvent>(\n FOCUS_COMMAND,\n () => {\n setFirefoxFlag(false)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n setFirefoxFlag(true)\n editor.getRootElement()?.blur()\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [editor, setFirefoxFlag])\n\n useEffect(() => {\n if (!firefoxFlag) {\n return\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!['Escape', 'Shift'].includes(e.key)) {\n setFirefoxFlag(false)\n }\n // Pressing Shift+Tab after blurring refocuses the editor in Firefox\n // we focus parent to allow exiting the editor\n if (e.shiftKey && e.key === 'Tab') {\n editor.getRootElement()?.parentElement?.focus()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [editor, firefoxFlag])\n\n return <TabIndentationPlugin />\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,oBAAoB,QAAQ;AACrC,SAASC,aAAa,QAAQ;AAC9B,SAASC,uBAAuB,EAAEC,aAAa,EAAEC,kBAAkB,QAAQ;AAC3E,SAASC,SAAS,EAAEC,QAAQ,QAAQ;AAIpC,OAAO,MAAMC,YAAA,GAA2CA,CAAA;EAAA,MAAAC,CAAA,GAAAV,EAAA;EACtD,OAAAW,MAAA,IAAiBV,yBAAA;EAEjB,OAAAW,WAAA,EAAAC,cAAA,IAAsCL,QAAA,MAAkB;EAAA,IAAAM,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAC,MAAA;IAE9CG,EAAA,GAAAA,CAAA,KACDX,aAAA,CACLQ,MAAA,CAAAK,eAAA,CAAAX,aAAA;MAGIQ,cAAA,MAAe;MAAA;IAAA,GAAAT,uBAGjB,GAEFO,MAAA,CAAAK,eAAA,CAAAV,kBAAA;MAGIO,cAAA,KAAe;MACfF,MAAA,CAAAM,cAAA,CAAqB,GAAAC,IAAA;MAAA;IAAA,GAAAd,uBAGvB;IAGHW,EAAA,IAACJ,MAAA,EAAQE,cAAA;IAAeH,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EApB3BH,SAAA,CAAUO,EAoBV,EAAGC,EAAwB;EAAA,IAAAI,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAV,CAAA,QAAAE,WAAA,IAAAF,CAAA,QAAAC,MAAA;IAEjBQ,EAAA,GAAAA,CAAA;MAAA,KACHP,WAAA;QAAA;MAAA;MAIL,MAAAS,aAAA,GAAAC,CAAA;QAAA,KACO,CAAC,UAAU,SAAAC,QAAA,CAAkBD,CAAA,CAAAE,GAAK;UACrCX,cAAA,MAAe;QAAA;QAAA,IAIbS,CAAA,CAAAG,QAAA,IAAcH,CAAA,CAAAE,GAAA,KAAU;UAC1Bb,MAAA,CAAAM,cAAA,CAAqB,GAAAS,aAAA,EAAAC,KAAA;QAAA;MAAA;MAIzBC,QAAA,CAAAC,gBAAA,CAA0B,WAAWR,aAAA;MAAA;QAEnCO,QAAA,CAAAE,mBAAA,CAA6B,WAAWT,aAAA;MAAA;IAAA;IAEzCD,EAAA,IAACT,MAAA,EAAQC,WAAA;IAAYF,CAAA,MAAAE,WAAA;IAAAF,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAS,EAAA;IAAAT,CAAA,MAAAU,EAAA;EAAA;IAAAD,EAAA,GAAAT,CAAA;IAAAU,EAAA,GAAAV,CAAA;EAAA;EApBxBH,SAAA,CAAUY,EAoBV,EAAGC,EAAqB;EAAA,IAAAW,EAAA;EAAA,IAAArB,CAAA,QAAAsB,MAAA,CAAAC,GAAA;IAEjBF,EAAA,GAAAG,IAAA,CAAAhC,oBAAA,IAAC;IAAAQ,CAAA,MAAAqB,EAAA;EAAA;IAAAA,EAAA,GAAArB,CAAA;EAAA;EAAA,OAADqB,EAAC;AAAA,CACV","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TabIndentationPlugin","mergeRegister","COMMAND_PRIORITY_NORMAL","FOCUS_COMMAND","KEY_ESCAPE_COMMAND","useEffect","useState","IndentPlugin","$","editor","firefoxFlag","setFirefoxFlag","t0","t1","registerCommand","getRootElement","blur","t2","t3","handleKeyDown","e","includes","key","shiftKey","parentElement","focus","document","addEventListener","removeEventListener","t4","Symbol","for","_jsx"],"sources":["../../../../../src/features/indent/client/plugins/index.tsx"],"sourcesContent":["'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { mergeRegister } from '@lexical/utils'\nimport { COMMAND_PRIORITY_NORMAL, FOCUS_COMMAND, KEY_ESCAPE_COMMAND } from 'lexical'\nimport { useEffect, useState } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nexport const IndentPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n const [firefoxFlag, setFirefoxFlag] = useState<boolean>(false)\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<MouseEvent>(\n FOCUS_COMMAND,\n () => {\n setFirefoxFlag(false)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n setFirefoxFlag(true)\n editor.getRootElement()?.blur()\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [editor, setFirefoxFlag])\n\n useEffect(() => {\n if (!firefoxFlag) {\n return\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!['Escape', 'Shift'].includes(e.key)) {\n setFirefoxFlag(false)\n }\n // Pressing Shift+Tab after blurring refocuses the editor in Firefox\n // we focus parent to allow exiting the editor\n if (e.shiftKey && e.key === 'Tab') {\n editor.getRootElement()?.parentElement?.focus()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [editor, firefoxFlag])\n\n return <TabIndentationPlugin />\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,oBAAoB,QAAQ;AACrC,SAASC,aAAa,QAAQ;AAC9B,SAASC,uBAAuB,EAAEC,aAAa,EAAEC,kBAAkB,QAAQ;AAC3E,SAASC,SAAS,EAAEC,QAAQ,QAAQ;AAIpC,OAAO,MAAMC,YAAA,GAA2CA,CAAA;EAAA,MAAAC,CAAA,GAAAV,EAAA;EACtD,OAAAW,MAAA,IAAiBV,yBAAA;EAEjB,OAAAW,WAAA,EAAAC,cAAA,IAAsCL,QAAA,MAAkB;EAAA,IAAAM,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAL,CAAA,QAAAC,MAAA;IAE9CG,EAAA,GAAAA,CAAA,KACDX,aAAA,CACLQ,MAAA,CAAAK,eAAA,CAAAX,aAAA;MAGIQ,cAAA,MAAe;MAAA;IAAA,GAAAT,uBAGjB,GAEFO,MAAA,CAAAK,eAAA,CAAAV,kBAAA;MAGIO,cAAA,KAAe;MACfF,MAAA,CAAAM,cAAA,CAAqB,GAAAC,IAAA;MAAA;IAAA,GAAAd,uBAGvB;IAGHW,EAAA,IAACJ,MAAA,EAAQE,cAAA;IAAeH,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAI,EAAA;IAAAJ,CAAA,MAAAK,EAAA;EAAA;IAAAD,EAAA,GAAAJ,CAAA;IAAAK,EAAA,GAAAL,CAAA;EAAA;EApB3BH,SAAA,CAAUO,EAoBV,EAAGC,EAAwB;EAAA,IAAAI,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAV,CAAA,QAAAC,MAAA,IAAAD,CAAA,QAAAE,WAAA;IAEjBO,EAAA,GAAAA,CAAA;MAAA,KACHP,WAAA;QAAA;MAAA;MAIL,MAAAS,aAAA,GAAAC,CAAA;QAAA,KACO,CAAC,UAAU,SAAAC,QAAA,CAAkBD,CAAA,CAAAE,GAAK;UACrCX,cAAA,MAAe;QAAA;QAAA,IAIbS,CAAA,CAAAG,QAAA,IAAcH,CAAA,CAAAE,GAAA,KAAU;UAC1Bb,MAAA,CAAAM,cAAA,CAAqB,GAAAS,aAAA,EAAAC,KAAA;QAAA;MAAA;MAIzBC,QAAA,CAAAC,gBAAA,CAA0B,WAAWR,aAAA;MAAA;QAEnCO,QAAA,CAAAE,mBAAA,CAA6B,WAAWT,aAAA;MAAA;IAAA;IAEzCD,EAAA,IAACT,MAAA,EAAQC,WAAA;IAAYF,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,WAAA;IAAAF,CAAA,MAAAS,EAAA;IAAAT,CAAA,MAAAU,EAAA;EAAA;IAAAD,EAAA,GAAAT,CAAA;IAAAU,EAAA,GAAAV,CAAA;EAAA;EApBxBH,SAAA,CAAUY,EAoBV,EAAGC,EAAqB;EAAA,IAAAW,EAAA;EAAA,IAAArB,CAAA,QAAAsB,MAAA,CAAAC,GAAA;IAEjBF,EAAA,GAAAG,IAAA,CAAAhC,oBAAA,IAAC;IAAAQ,CAAA,MAAAqB,EAAA;EAAA;IAAAA,EAAA,GAAArB,CAAA;EAAA;EAAA,OAADqB,EAAC;AAAA,CACV","ignoreList":[]}
@@ -280,7 +280,7 @@ function useAutoLink(editor, matchers, onChange) {
280
280
  const $ = _c(5);
281
281
  let t0;
282
282
  let t1;
283
- if ($[0] !== editor || $[1] !== onChange || $[2] !== matchers) {
283
+ if ($[0] !== editor || $[1] !== matchers || $[2] !== onChange) {
284
284
  t0 = () => {
285
285
  if (!editor.hasNodes([AutoLinkNode])) {
286
286
  throw new Error("LexicalAutoLinkPlugin: AutoLinkNode not registered on editor");
@@ -308,8 +308,8 @@ function useAutoLink(editor, matchers, onChange) {
308
308
  };
309
309
  t1 = [editor, matchers, onChange];
310
310
  $[0] = editor;
311
- $[1] = onChange;
312
- $[2] = matchers;
311
+ $[1] = matchers;
312
+ $[2] = onChange;
313
313
  $[3] = t0;
314
314
  $[4] = t1;
315
315
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","i","PUNCTUATION_OR_SPACE","isSeparator","char","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","$createAutoLinkNode_","fields","linkType","linkNode","remainingTextNode","linkTextNode","splitText","textNode","setFormat","getFormat","setDetail","getDetail","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","endNode","selection","selectedTextNode","getNodes","find","undefined","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","$","t0","t1","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode as TextNodeValue,\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'\n\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) {\n return null\n }\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (let i = 0; i < matchers.length; i++) {\n const match = matchers[i](text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string): boolean {\n return PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0])\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1])\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction $createAutoLinkNode_(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n let remainingTextNode = nodes[0]\n let linkTextNode\n if (startIndex === 0) {\n ;[linkTextNode, remainingTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode, remainingTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes: LexicalNode[] = []\n let remainingTextNode\n for (let i = 1; i < nodes.length; i++) {\n const currentNode = nodes[i]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n linkNodes.push(linkTextNode)\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n }\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n textNode.setStyle(firstLinkTextNode.getStyle())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n return undefined\n}\n\nfunction $handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = $createAutoLinkNode_(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? previousSibling.getFields()?.url?.startsWith('mailto:')\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j])\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n throw new Error('LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n $handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)(?<![-.+():%])/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","i","PUNCTUATION_OR_SPACE","isSeparator","char","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","$createAutoLinkNode_","fields","linkType","linkNode","remainingTextNode","linkTextNode","splitText","textNode","setFormat","getFormat","setDetail","getDetail","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","endNode","selection","selectedTextNode","getNodes","find","undefined","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","$","t0","t1","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode as TextNodeValue,\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'\n\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) {\n return null\n }\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (let i = 0; i < matchers.length; i++) {\n const match = matchers[i](text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string): boolean {\n return PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0])\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1])\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction $createAutoLinkNode_(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n let remainingTextNode = nodes[0]\n let linkTextNode\n if (startIndex === 0) {\n ;[linkTextNode, remainingTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode, remainingTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes: LexicalNode[] = []\n let remainingTextNode\n for (let i = 1; i < nodes.length; i++) {\n const currentNode = nodes[i]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n linkNodes.push(linkTextNode)\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n }\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n textNode.setStyle(firstLinkTextNode.getStyle())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n return undefined\n}\n\nfunction $handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = $createAutoLinkNode_(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? previousSibling.getFields()?.url?.startsWith('mailto:')\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j])\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n throw new Error('LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n $handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)(?<![-.+():%])/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
@@ -17,10 +17,7 @@ export const LinkPlugin = () => {
17
17
  if (!editor.hasNodes([LinkNode])) {
18
18
  throw new Error("LinkPlugin: LinkNode not registered on editor");
19
19
  }
20
- return mergeRegister(editor.registerCommand(TOGGLE_LINK_COMMAND, payload => {
21
- $toggleLink(payload);
22
- return true;
23
- }, COMMAND_PRIORITY_LOW), editor.registerCommand(PASTE_COMMAND, event => {
20
+ return mergeRegister(editor.registerCommand(TOGGLE_LINK_COMMAND, _temp, COMMAND_PRIORITY_LOW), editor.registerCommand(PASTE_COMMAND, event => {
24
21
  const selection = $getSelection();
25
22
  if (!$isRangeSelection(selection) || selection.isCollapsed() || !(event instanceof ClipboardEvent) || event.clipboardData == null) {
26
23
  return false;
@@ -29,7 +26,7 @@ export const LinkPlugin = () => {
29
26
  if (!validateUrl(clipboardText)) {
30
27
  return false;
31
28
  }
32
- if (!selection.getNodes().some(node => $isElementNode(node))) {
29
+ if (!selection.getNodes().some(_temp2)) {
33
30
  const linkFields = {
34
31
  doc: null,
35
32
  linkType: "custom",
@@ -57,4 +54,11 @@ export const LinkPlugin = () => {
57
54
  useEffect(t0, t1);
58
55
  return null;
59
56
  };
57
+ function _temp(payload) {
58
+ $toggleLink(payload);
59
+ return true;
60
+ }
61
+ function _temp2(node) {
62
+ return $isElementNode(node);
63
+ }
60
64
  //# sourceMappingURL=index.js.map
@@ -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","$","editor","t0","t1","hasNodes","Error","registerCommand","payload","event","selection","isCollapsed","ClipboardEvent","clipboardData","clipboardText","getData","getNodes","some","node","linkFields","doc","linkType","newTab","url","dispatchCommand","fields","text","preventDefault"],"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> = () => {\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 $toggleLink(payload)\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 }, [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,GAA2CA,CAAA;EAAA,MAAAC,CAAA,GAAAd,EAAA;EACtD,OAAAe,MAAA,IAAiBd,yBAAA;EAAA,IAAAe,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAC,MAAA;IAEPC,EAAA,GAAAA,CAAA;MAAA,KACHD,MAAA,CAAAG,QAAA,EAAAP,QAAA,CAA0B;QAAA,UAAAQ,KAAA,CACb;MAAA;MAAA,OAEXjB,aAAA,CACLa,MAAA,CAAAK,eAAA,CAAAR,mBAAA,EAAAS,OAAA;QAGIX,WAAA,CAAYW,OAAA;QAAA;MAAA,GAAAf,oBAGd,GAEFS,MAAA,CAAAK,eAAA,CAAAb,aAAA,EAAAe,KAAA;QAGI,MAAAC,SAAA,GAAkBpB,aAAA;QAAA,IAEhB,CAACE,iBAAA,CAAkBkB,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,KAC7CnB,WAAA,CAAYkB,aAAA;UAAA;QAAA;QAAA,KAIZJ,SAAA,CAAAM,QAAA,CAAkB,EAAAC,IAAA,CAAAC,IAAA,IAAkB3B,cAAA,CAAe2B,IAAA;UACtD,MAAAC,UAAA;YAAAC,GAAA;YAAAC,QAAA,EAEY;YAAAC,MAAA;YAAAC,GAAA,EAELT;UAAA;UAEPZ,MAAA,CAAAsB,eAAA,CAAAzB,mBAAA;YAAA0B,MAAA,EACUN,UAAA;YAAAO,IAAA;UAAA,CAEV;UACAjB,KAAA,CAAAkB,cAAA,CAAoB;UAAA;QAAA;QAAA;MAAA,GAAAlC,oBAKxB;IAAA;IAGHW,EAAA,IAACF,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EAjDXN,SAAA,CAAUQ,EAiDV,EAAGC,EAAQ;EAAA;AAAA,CAGb","ignoreList":[]}
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","$","editor","t0","t1","hasNodes","Error","registerCommand","_temp","event","selection","isCollapsed","ClipboardEvent","clipboardData","clipboardText","getData","getNodes","some","_temp2","linkFields","doc","linkType","newTab","url","dispatchCommand","fields","text","preventDefault","payload","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> = () => {\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 $toggleLink(payload)\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 }, [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,GAA2CA,CAAA;EAAA,MAAAC,CAAA,GAAAd,EAAA;EACtD,OAAAe,MAAA,IAAiBd,yBAAA;EAAA,IAAAe,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAC,MAAA;IAEPC,EAAA,GAAAA,CAAA;MAAA,KACHD,MAAA,CAAAG,QAAA,EAAAP,QAAA,CAA0B;QAAA,UAAAQ,KAAA,CACb;MAAA;MAAA,OAEXjB,aAAA,CACLa,MAAA,CAAAK,eAAA,CAAAR,mBAAA,EAAAS,KAAA,EAAAf,oBAME,GAEFS,MAAA,CAAAK,eAAA,CAAAb,aAAA,EAAAe,KAAA;QAGI,MAAAC,SAAA,GAAkBpB,aAAA;QAAA,IAEhB,CAACE,iBAAA,CAAkBkB,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,KAC7CnB,WAAA,CAAYkB,aAAA;UAAA;QAAA;QAAA,KAIZJ,SAAA,CAAAM,QAAA,CAAkB,EAAAC,IAAA,CAAAC,MAAiC;UACtD,MAAAC,UAAA;YAAAC,GAAA;YAAAC,QAAA,EAEY;YAAAC,MAAA;YAAAC,GAAA,EAELT;UAAA;UAEPZ,MAAA,CAAAsB,eAAA,CAAAzB,mBAAA;YAAA0B,MAAA,EACUN,UAAA;YAAAO,IAAA;UAAA,CAEV;UACAjB,KAAA,CAAAkB,cAAA,CAAoB;UAAA;QAAA;QAAA;MAAA,GAAAlC,oBAKxB;IAAA;IAGHW,EAAA,IAACF,MAAA;IAAOD,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EAjDXN,SAAA,CAAUQ,EAiDV,EAAGC,EAAQ;EAAA;AAAA,CAGb;AAvDwD,SAAAI,MAAAoB,OAAA;EAW9C/B,WAAA,CAAY+B,OAAA;EAAA;AAAA;AAXkC,SAAAV,OAAAW,IAAA;EAAA,OAiCLtC,cAAA,CAAesC,IAAA;AAAA","ignoreList":[]}
@@ -51,13 +51,13 @@ const RelationshipDrawerComponent = t0 => {
51
51
  const [replaceNodeKey, setReplaceNodeKey] = useState(null);
52
52
  const t2 = enabledCollectionSlugs ? enabledCollectionSlugs : undefined;
53
53
  let t3;
54
- if ($[2] !== t2 || $[3] !== selectedCollectionSlug) {
54
+ if ($[2] !== selectedCollectionSlug || $[3] !== t2) {
55
55
  t3 = {
56
56
  collectionSlugs: t2,
57
57
  selectedCollection: selectedCollectionSlug
58
58
  };
59
- $[2] = t2;
60
- $[3] = selectedCollectionSlug;
59
+ $[2] = selectedCollectionSlug;
60
+ $[3] = t2;
61
61
  $[4] = t3;
62
62
  } else {
63
63
  t3 = $[4];
@@ -87,7 +87,7 @@ const RelationshipDrawerComponent = t0 => {
87
87
  }
88
88
  useEffect(t4, t5);
89
89
  let t6;
90
- if ($[9] !== editor || $[10] !== replaceNodeKey || $[11] !== closeListDrawer) {
90
+ if ($[9] !== closeListDrawer || $[10] !== editor || $[11] !== replaceNodeKey) {
91
91
  t6 = t7 => {
92
92
  const {
93
93
  collectionSlug,
@@ -101,9 +101,9 @@ const RelationshipDrawerComponent = t0 => {
101
101
  });
102
102
  closeListDrawer();
103
103
  };
104
- $[9] = editor;
105
- $[10] = replaceNodeKey;
106
- $[11] = closeListDrawer;
104
+ $[9] = closeListDrawer;
105
+ $[10] = editor;
106
+ $[11] = replaceNodeKey;
107
107
  $[12] = t6;
108
108
  } else {
109
109
  t6 = $[12];
@@ -120,22 +120,22 @@ const RelationshipDrawerComponent = t0 => {
120
120
  t7 = $[14];
121
121
  }
122
122
  let t8;
123
- if ($[15] !== isListDrawerOpen || $[16] !== enabledCollectionSlugs) {
123
+ if ($[15] !== enabledCollectionSlugs || $[16] !== isListDrawerOpen) {
124
124
  t8 = [isListDrawerOpen, enabledCollectionSlugs];
125
- $[15] = isListDrawerOpen;
126
- $[16] = enabledCollectionSlugs;
125
+ $[15] = enabledCollectionSlugs;
126
+ $[16] = isListDrawerOpen;
127
127
  $[17] = t8;
128
128
  } else {
129
129
  t8 = $[17];
130
130
  }
131
131
  useEffect(t7, t8);
132
132
  let t9;
133
- if ($[18] !== onSelect || $[19] !== ListDrawer) {
133
+ if ($[18] !== ListDrawer || $[19] !== onSelect) {
134
134
  t9 = _jsx(ListDrawer, {
135
135
  onSelect
136
136
  });
137
- $[18] = onSelect;
138
- $[19] = ListDrawer;
137
+ $[18] = ListDrawer;
138
+ $[19] = onSelect;
139
139
  $[20] = t9;
140
140
  } else {
141
141
  t9 = $[20];