@payloadcms/richtext-lexical 3.0.0-beta.25 → 3.0.0-beta.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/components.d.ts +5 -0
- package/dist/exports/components.d.ts.map +1 -1
- package/dist/exports/components.js +5 -0
- package/dist/exports/components.js.map +1 -1
- package/dist/field/features/blockquote/feature.client.d.ts +1 -1
- package/dist/field/features/blockquote/feature.client.js +2 -2
- package/dist/field/features/blockquote/feature.client.js.map +1 -1
- package/dist/field/features/blockquote/feature.server.d.ts +1 -1
- package/dist/field/features/blockquote/feature.server.js +3 -3
- package/dist/field/features/blockquote/feature.server.js.map +1 -1
- package/dist/field/features/blocks/feature.server.d.ts +2 -5
- package/dist/field/features/blocks/feature.server.d.ts.map +1 -1
- package/dist/field/features/blocks/feature.server.js +2 -2
- package/dist/field/features/blocks/feature.server.js.map +1 -1
- package/dist/field/features/blocks/plugin/index.d.ts +3 -2
- package/dist/field/features/blocks/plugin/index.d.ts.map +1 -1
- package/dist/field/features/blocks/plugin/index.js +2 -2
- package/dist/field/features/blocks/plugin/index.js.map +1 -1
- package/dist/field/features/debug/testRecorder/plugin/index.d.ts +2 -2
- package/dist/field/features/debug/testRecorder/plugin/index.d.ts.map +1 -1
- package/dist/field/features/debug/testRecorder/plugin/index.js.map +1 -1
- package/dist/field/features/debug/treeView/plugin/index.d.ts +2 -2
- package/dist/field/features/debug/treeView/plugin/index.d.ts.map +1 -1
- package/dist/field/features/debug/treeView/plugin/index.js +2 -2
- package/dist/field/features/debug/treeView/plugin/index.js.map +1 -1
- package/dist/field/features/horizontalRule/plugin/index.d.ts +2 -1
- package/dist/field/features/horizontalRule/plugin/index.d.ts.map +1 -1
- package/dist/field/features/horizontalRule/plugin/index.js +2 -2
- package/dist/field/features/horizontalRule/plugin/index.js.map +1 -1
- package/dist/field/features/link/drawer/baseFields.d.ts +2 -2
- package/dist/field/features/link/drawer/baseFields.d.ts.map +1 -1
- package/dist/field/features/link/drawer/baseFields.js +2 -1
- package/dist/field/features/link/drawer/baseFields.js.map +1 -1
- package/dist/field/features/link/drawer/types.d.ts +2 -2
- package/dist/field/features/link/drawer/types.d.ts.map +1 -1
- package/dist/field/features/link/drawer/types.js.map +1 -1
- package/dist/field/features/link/feature.client.d.ts.map +1 -1
- package/dist/field/features/link/feature.client.js +11 -1
- package/dist/field/features/link/feature.client.js.map +1 -1
- package/dist/field/features/link/feature.server.d.ts +10 -3
- package/dist/field/features/link/feature.server.d.ts.map +1 -1
- package/dist/field/features/link/feature.server.js +3 -3
- package/dist/field/features/link/feature.server.js.map +1 -1
- package/dist/field/features/link/plugins/autoLink/index.d.ts +3 -2
- package/dist/field/features/link/plugins/autoLink/index.d.ts.map +1 -1
- package/dist/field/features/link/plugins/autoLink/index.js +2 -2
- package/dist/field/features/link/plugins/autoLink/index.js.map +1 -1
- package/dist/field/features/link/plugins/clickableLink/index.d.ts +3 -2
- package/dist/field/features/link/plugins/clickableLink/index.d.ts.map +1 -1
- package/dist/field/features/link/plugins/clickableLink/index.js +2 -2
- package/dist/field/features/link/plugins/clickableLink/index.js.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js +75 -68
- package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/index.d.ts +3 -4
- package/dist/field/features/link/plugins/floatingLinkEditor/index.d.ts.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/index.js.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/index.scss +2 -2
- package/dist/field/features/link/plugins/floatingLinkEditor/utilities.d.ts +3 -3
- package/dist/field/features/link/plugins/floatingLinkEditor/utilities.d.ts.map +1 -1
- package/dist/field/features/link/plugins/floatingLinkEditor/utilities.js +2 -2
- package/dist/field/features/link/plugins/floatingLinkEditor/utilities.js.map +1 -1
- package/dist/field/features/link/plugins/link/index.d.ts +3 -1
- package/dist/field/features/link/plugins/link/index.d.ts.map +1 -1
- package/dist/field/features/link/plugins/link/index.js +2 -2
- package/dist/field/features/link/plugins/link/index.js.map +1 -1
- package/dist/field/features/link/validate.js.map +1 -1
- package/dist/field/features/lists/checklist/plugin/index.d.ts +2 -2
- package/dist/field/features/lists/checklist/plugin/index.d.ts.map +1 -1
- package/dist/field/features/lists/checklist/plugin/index.js +2 -2
- package/dist/field/features/lists/checklist/plugin/index.js.map +1 -1
- package/dist/field/features/lists/plugin/index.d.ts +2 -2
- package/dist/field/features/lists/plugin/index.d.ts.map +1 -1
- package/dist/field/features/lists/plugin/index.js +2 -2
- package/dist/field/features/lists/plugin/index.js.map +1 -1
- package/dist/field/features/migrations/slateToLexical/converter/converters/blockquote/client.d.ts +1 -1
- package/dist/field/features/migrations/slateToLexical/converter/converters/blockquote/client.js +1 -1
- package/dist/field/features/migrations/slateToLexical/converter/converters/blockquote/client.js.map +1 -1
- package/dist/field/features/migrations/slateToLexical/converter/converters/blockquote/index.js +2 -2
- package/dist/field/features/migrations/slateToLexical/converter/converters/blockquote/index.js.map +1 -1
- package/dist/field/features/relationship/feature.client.d.ts.map +1 -1
- package/dist/field/features/relationship/feature.client.js +1 -5
- package/dist/field/features/relationship/feature.client.js.map +1 -1
- package/dist/field/features/relationship/feature.server.d.ts +10 -1
- package/dist/field/features/relationship/feature.server.d.ts.map +1 -1
- package/dist/field/features/relationship/feature.server.js +2 -2
- package/dist/field/features/relationship/feature.server.js.map +1 -1
- package/dist/field/features/relationship/nodes/components/RelationshipComponent.d.ts.map +1 -1
- package/dist/field/features/relationship/nodes/components/RelationshipComponent.js +4 -2
- package/dist/field/features/relationship/nodes/components/RelationshipComponent.js.map +1 -1
- package/dist/field/features/relationship/plugins/index.d.ts +2 -2
- package/dist/field/features/relationship/plugins/index.d.ts.map +1 -1
- package/dist/field/features/relationship/plugins/index.js +6 -6
- package/dist/field/features/relationship/plugins/index.js.map +1 -1
- package/dist/field/features/relationship/populationPromise.d.ts +2 -1
- package/dist/field/features/relationship/populationPromise.d.ts.map +1 -1
- package/dist/field/features/relationship/populationPromise.js +25 -21
- package/dist/field/features/relationship/populationPromise.js.map +1 -1
- package/dist/field/features/toolbars/fixed/Toolbar/index.d.ts +2 -4
- package/dist/field/features/toolbars/fixed/Toolbar/index.d.ts.map +1 -1
- package/dist/field/features/toolbars/fixed/Toolbar/index.js +2 -2
- package/dist/field/features/toolbars/fixed/Toolbar/index.js.map +1 -1
- package/dist/field/features/toolbars/fixed/Toolbar/index.scss +2 -2
- package/dist/field/features/toolbars/inline/Toolbar/index.d.ts +2 -4
- package/dist/field/features/toolbars/inline/Toolbar/index.d.ts.map +1 -1
- package/dist/field/features/toolbars/inline/Toolbar/index.js +25 -7
- package/dist/field/features/toolbars/inline/Toolbar/index.js.map +1 -1
- package/dist/field/features/toolbars/inline/Toolbar/index.scss +1 -1
- package/dist/field/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
- package/dist/field/features/toolbars/shared/ToolbarButton/index.js +12 -3
- package/dist/field/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.d.ts.map +1 -1
- package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.js +11 -3
- package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/field/features/types.d.ts +20 -12
- package/dist/field/features/types.d.ts.map +1 -1
- package/dist/field/features/types.js.map +1 -1
- package/dist/field/features/upload/component/index.d.ts.map +1 -1
- package/dist/field/features/upload/component/index.js +6 -2
- package/dist/field/features/upload/component/index.js.map +1 -1
- package/dist/field/features/upload/feature.server.d.ts +10 -3
- package/dist/field/features/upload/feature.server.d.ts.map +1 -1
- package/dist/field/features/upload/feature.server.js +2 -2
- package/dist/field/features/upload/feature.server.js.map +1 -1
- package/dist/field/features/upload/nodes/UploadNode.d.ts.map +1 -1
- package/dist/field/features/upload/nodes/UploadNode.js +18 -2
- package/dist/field/features/upload/nodes/UploadNode.js.map +1 -1
- package/dist/field/features/upload/plugin/index.d.ts +3 -2
- package/dist/field/features/upload/plugin/index.d.ts.map +1 -1
- package/dist/field/features/upload/plugin/index.js +2 -2
- package/dist/field/features/upload/plugin/index.js.map +1 -1
- package/dist/field/features/upload/populationPromise.d.ts.map +1 -1
- package/dist/field/features/upload/populationPromise.js +2 -1
- package/dist/field/features/upload/populationPromise.js.map +1 -1
- package/dist/field/features/upload/validate.d.ts.map +1 -1
- package/dist/field/features/upload/validate.js +3 -0
- package/dist/field/features/upload/validate.js.map +1 -1
- package/dist/field/lexical/EditorPlugin.d.ts +1 -0
- package/dist/field/lexical/EditorPlugin.d.ts.map +1 -1
- package/dist/field/lexical/EditorPlugin.js +6 -3
- package/dist/field/lexical/EditorPlugin.js.map +1 -1
- package/dist/field/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/field/lexical/LexicalEditor.js +5 -0
- package/dist/field/lexical/LexicalEditor.js.map +1 -1
- package/dist/field/lexical/config/client/sanitize.d.ts.map +1 -1
- package/dist/field/lexical/config/client/sanitize.js +1 -0
- package/dist/field/lexical/config/client/sanitize.js.map +1 -1
- package/dist/field/lexical/config/server/default.js +2 -2
- package/dist/field/lexical/config/server/default.js.map +1 -1
- package/dist/field/lexical/config/server/loader.d.ts +2 -1
- package/dist/field/lexical/config/server/loader.d.ts.map +1 -1
- package/dist/field/lexical/config/server/loader.js +2 -1
- package/dist/field/lexical/config/server/loader.js.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.d.ts +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.d.ts.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.js +2 -2
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.js.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js +6 -3
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.scss +8 -0
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts.map +1 -1
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js +25 -6
- package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js.map +1 -1
- package/dist/field/lexical/utils/setFloatingElemPosition.d.ts +11 -1
- package/dist/field/lexical/utils/setFloatingElemPosition.d.ts.map +1 -1
- package/dist/field/lexical/utils/setFloatingElemPosition.js +3 -2
- package/dist/field/lexical/utils/setFloatingElemPosition.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export { RichTextCell } from '../cell/index.js';
|
|
2
|
+
export { createClientComponent } from '../field/features/createClientComponent.js';
|
|
3
|
+
export { toolbarFormatGroupWithItems } from '../field/features/format/shared/toolbarFormatGroup.js';
|
|
4
|
+
export { toolbarAddDropdownGroupWithItems } from '../field/features/shared/toolbar/addDropdownGroup.js';
|
|
5
|
+
export { toolbarFeatureButtonsGroupWithItems } from '../field/features/shared/toolbar/featureButtonsGroup.js';
|
|
6
|
+
export { toolbarTextDropdownGroupWithItems } from '../field/features/shared/toolbar/textDropdownGroup.js';
|
|
2
7
|
export { ToolbarButton } from '../field/features/toolbars/shared/ToolbarButton/index.js';
|
|
3
8
|
export { ToolbarDropdown } from '../field/features/toolbars/shared/ToolbarDropdown/index.js';
|
|
4
9
|
export { RichTextField } from '../field/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/exports/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAA;
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/exports/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAA;AAElF,OAAO,EAAE,2BAA2B,EAAE,MAAM,uDAAuD,CAAA;AACnG,OAAO,EAAE,gCAAgC,EAAE,MAAM,sDAAsD,CAAA;AACvG,OAAO,EAAE,mCAAmC,EAAE,MAAM,yDAAyD,CAAA;AAC7G,OAAO,EAAE,iCAAiC,EAAE,MAAM,uDAAuD,CAAA;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,0DAA0D,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,4DAA4D,CAAA;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EACL,KAAK,sBAAsB,EAC3B,mBAAmB,EACnB,cAAc,GACf,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAA"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export { RichTextCell } from '../cell/index.js';
|
|
2
|
+
export { createClientComponent } from '../field/features/createClientComponent.js';
|
|
3
|
+
export { toolbarFormatGroupWithItems } from '../field/features/format/shared/toolbarFormatGroup.js';
|
|
4
|
+
export { toolbarAddDropdownGroupWithItems } from '../field/features/shared/toolbar/addDropdownGroup.js';
|
|
5
|
+
export { toolbarFeatureButtonsGroupWithItems } from '../field/features/shared/toolbar/featureButtonsGroup.js';
|
|
6
|
+
export { toolbarTextDropdownGroupWithItems } from '../field/features/shared/toolbar/textDropdownGroup.js';
|
|
2
7
|
export { ToolbarButton } from '../field/features/toolbars/shared/ToolbarButton/index.js';
|
|
3
8
|
export { ToolbarDropdown } from '../field/features/toolbars/shared/ToolbarDropdown/index.js';
|
|
4
9
|
export { RichTextField } from '../field/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exports/components.ts"],"sourcesContent":["export { RichTextCell } from '../cell/index.js'\nexport { ToolbarButton } from '../field/features/toolbars/shared/ToolbarButton/index.js'\
|
|
1
|
+
{"version":3,"sources":["../../src/exports/components.ts"],"sourcesContent":["export { RichTextCell } from '../cell/index.js'\nexport { createClientComponent } from '../field/features/createClientComponent.js'\n\nexport { toolbarFormatGroupWithItems } from '../field/features/format/shared/toolbarFormatGroup.js'\nexport { toolbarAddDropdownGroupWithItems } from '../field/features/shared/toolbar/addDropdownGroup.js'\nexport { toolbarFeatureButtonsGroupWithItems } from '../field/features/shared/toolbar/featureButtonsGroup.js'\nexport { toolbarTextDropdownGroupWithItems } from '../field/features/shared/toolbar/textDropdownGroup.js'\nexport { ToolbarButton } from '../field/features/toolbars/shared/ToolbarButton/index.js'\nexport { ToolbarDropdown } from '../field/features/toolbars/shared/ToolbarDropdown/index.js'\n\nexport { RichTextField } from '../field/index.js'\nexport {\n type EditorFocusContextType,\n EditorFocusProvider,\n useEditorFocus,\n} from '../field/lexical/EditorFocusProvider.js'\nexport { defaultEditorLexicalConfig } from '../field/lexical/config/client/default.js'\n"],"names":["RichTextCell","createClientComponent","toolbarFormatGroupWithItems","toolbarAddDropdownGroupWithItems","toolbarFeatureButtonsGroupWithItems","toolbarTextDropdownGroupWithItems","ToolbarButton","ToolbarDropdown","RichTextField","EditorFocusProvider","useEditorFocus","defaultEditorLexicalConfig"],"rangeMappings":";;;;;;;;;;","mappings":"AAAA,SAASA,YAAY,QAAQ,mBAAkB;AAC/C,SAASC,qBAAqB,QAAQ,6CAA4C;AAElF,SAASC,2BAA2B,QAAQ,wDAAuD;AACnG,SAASC,gCAAgC,QAAQ,uDAAsD;AACvG,SAASC,mCAAmC,QAAQ,0DAAyD;AAC7G,SAASC,iCAAiC,QAAQ,wDAAuD;AACzG,SAASC,aAAa,QAAQ,2DAA0D;AACxF,SAASC,eAAe,QAAQ,6DAA4D;AAE5F,SAASC,aAAa,QAAQ,oBAAmB;AACjD,SAEEC,mBAAmB,EACnBC,cAAc,QACT,0CAAyC;AAChD,SAASC,0BAA0B,QAAQ,4CAA2C"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/// <reference types="react" resolution-mode="require"/>
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const BlockquoteFeatureClientComponent: import("react").FC<undefined>;
|
|
3
3
|
//# sourceMappingURL=feature.client.d.ts.map
|
|
@@ -33,7 +33,7 @@ const toolbarGroups = [
|
|
|
33
33
|
}
|
|
34
34
|
])
|
|
35
35
|
];
|
|
36
|
-
const
|
|
36
|
+
const BlockquoteFeatureClient = (props)=>{
|
|
37
37
|
return {
|
|
38
38
|
clientFeatureProps: props,
|
|
39
39
|
feature: ()=>({
|
|
@@ -78,6 +78,6 @@ const BlockQuoteFeatureClient = (props)=>{
|
|
|
78
78
|
})
|
|
79
79
|
};
|
|
80
80
|
};
|
|
81
|
-
export const
|
|
81
|
+
export const BlockquoteFeatureClientComponent = createClientComponent(BlockquoteFeatureClient);
|
|
82
82
|
|
|
83
83
|
//# sourceMappingURL=feature.client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/field/features/blockquote/feature.client.tsx"],"sourcesContent":["'use client'\n\nimport { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../toolbars/types.js'\nimport type { FeatureProviderProviderClient } from '../types.js'\n\nimport { BlockquoteIcon } from '../../lexical/ui/icons/Blockquote/index.js'\nimport { createClientComponent } from '../createClientComponent.js'\nimport { toolbarTextDropdownGroupWithItems } from '../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: BlockquoteIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isQuoteNode(node) && !$isQuoteNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'blockquote',\n label: `Blockquote`,\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n order: 20,\n },\n ]),\n]\n\nconst
|
|
1
|
+
{"version":3,"sources":["../../../../src/field/features/blockquote/feature.client.tsx"],"sourcesContent":["'use client'\n\nimport { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../toolbars/types.js'\nimport type { FeatureProviderProviderClient } from '../types.js'\n\nimport { BlockquoteIcon } from '../../lexical/ui/icons/Blockquote/index.js'\nimport { createClientComponent } from '../createClientComponent.js'\nimport { toolbarTextDropdownGroupWithItems } from '../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: BlockquoteIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isQuoteNode(node) && !$isQuoteNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'blockquote',\n label: `Blockquote`,\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n order: 20,\n },\n ]),\n]\n\nconst BlockquoteFeatureClient: FeatureProviderProviderClient<undefined> = (props) => {\n return {\n clientFeatureProps: props,\n feature: () => ({\n clientFeatureProps: props,\n markdownTransformers: [MarkdownTransformer],\n nodes: [QuoteNode],\n\n slashMenu: {\n groups: [\n {\n items: [\n {\n Icon: BlockquoteIcon,\n key: 'blockquote',\n keywords: ['quote', 'blockquote'],\n label: 'Blockquote',\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n },\n ],\n key: 'basic',\n label: 'Basic',\n },\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }),\n }\n}\n\nexport const BlockquoteFeatureClientComponent = createClientComponent(BlockquoteFeatureClient)\n"],"names":["$createQuoteNode","$isQuoteNode","QuoteNode","$setBlocksType","$getSelection","$isRangeSelection","BlockquoteIcon","createClientComponent","toolbarTextDropdownGroupWithItems","MarkdownTransformer","toolbarGroups","ChildComponent","isActive","selection","node","getNodes","getParent","key","label","onSelect","editor","update","order","BlockquoteFeatureClient","props","clientFeatureProps","feature","markdownTransformers","nodes","slashMenu","groups","items","Icon","keywords","toolbarFixed","toolbarInline","BlockquoteFeatureClientComponent"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAEA,SAASA,gBAAgB,EAAEC,YAAY,EAAEC,SAAS,QAAQ,qBAAoB;AAC9E,SAASC,cAAc,QAAQ,qBAAoB;AACnD,SAASC,aAAa,EAAEC,iBAAiB,QAAQ,UAAS;AAK1D,SAASC,cAAc,QAAQ,6CAA4C;AAC3E,SAASC,qBAAqB,QAAQ,8BAA6B;AACnE,SAASC,iCAAiC,QAAQ,yCAAwC;AAC1F,SAASC,mBAAmB,QAAQ,2BAA0B;AAE9D,MAAMC,gBAAgC;IACpCF,kCAAkC;QAChC;YACEG,gBAAgBL;YAChBM,UAAU,CAAC,EAAEC,SAAS,EAAE;gBACtB,IAAI,CAACR,kBAAkBQ,YAAY;oBACjC,OAAO;gBACT;gBACA,KAAK,MAAMC,QAAQD,UAAUE,QAAQ,GAAI;oBACvC,IAAI,CAACd,aAAaa,SAAS,CAACb,aAAaa,KAAKE,SAAS,KAAK;wBAC1D,OAAO;oBACT;gBACF;gBACA,OAAO;YACT;YACAC,KAAK;YACLC,OAAO,CAAC,UAAU,CAAC;YACnBC,UAAU,CAAC,EAAEC,MAAM,EAAE;gBACnBA,OAAOC,MAAM,CAAC;oBACZ,MAAMR,YAAYT;oBAClBD,eAAeU,WAAW,IAAMb;gBAClC;YACF;YACAsB,OAAO;QACT;KACD;CACF;AAED,MAAMC,0BAAoE,CAACC;IACzE,OAAO;QACLC,oBAAoBD;QACpBE,SAAS,IAAO,CAAA;gBACdD,oBAAoBD;gBACpBG,sBAAsB;oBAAClB;iBAAoB;gBAC3CmB,OAAO;oBAAC1B;iBAAU;gBAElB2B,WAAW;oBACTC,QAAQ;wBACN;4BACEC,OAAO;gCACL;oCACEC,MAAM1B;oCACNW,KAAK;oCACLgB,UAAU;wCAAC;wCAAS;qCAAa;oCACjCf,OAAO;oCACPC,UAAU,CAAC,EAAEC,MAAM,EAAE;wCACnBA,OAAOC,MAAM,CAAC;4CACZ,MAAMR,YAAYT;4CAClBD,eAAeU,WAAW,IAAMb;wCAClC;oCACF;gCACF;6BACD;4BACDiB,KAAK;4BACLC,OAAO;wBACT;qBACD;gBACH;gBACAgB,cAAc;oBACZJ,QAAQpB;gBACV;gBACAyB,eAAe;oBACbL,QAAQpB;gBACV;YACF,CAAA;IACF;AACF;AAEA,OAAO,MAAM0B,mCAAmC7B,sBAAsBgB,yBAAwB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { FeatureProviderProviderServer } from '../types.js';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const BlockquoteFeature: FeatureProviderProviderServer<undefined, undefined>;
|
|
3
3
|
//# sourceMappingURL=feature.server.d.ts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { QuoteNode } from '@lexical/rich-text';
|
|
2
2
|
import { convertLexicalNodesToHTML } from '../converters/html/converter/index.js';
|
|
3
3
|
import { createNode } from '../typeUtilities.js';
|
|
4
|
-
import {
|
|
4
|
+
import { BlockquoteFeatureClientComponent } from './feature.client.js';
|
|
5
5
|
import { MarkdownTransformer } from './markdownTransformer.js';
|
|
6
|
-
export const
|
|
6
|
+
export const BlockquoteFeature = (props)=>{
|
|
7
7
|
return {
|
|
8
8
|
feature: ()=>{
|
|
9
9
|
return {
|
|
10
|
-
ClientComponent:
|
|
10
|
+
ClientComponent: BlockquoteFeatureClientComponent,
|
|
11
11
|
clientFeatureProps: null,
|
|
12
12
|
markdownTransformers: [
|
|
13
13
|
MarkdownTransformer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/field/features/blockquote/feature.server.ts"],"sourcesContent":["import { QuoteNode } from '@lexical/rich-text'\n\nimport type { FeatureProviderProviderServer } from '../types.js'\n\nimport { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'\nimport { createNode } from '../typeUtilities.js'\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/field/features/blockquote/feature.server.ts"],"sourcesContent":["import { QuoteNode } from '@lexical/rich-text'\n\nimport type { FeatureProviderProviderServer } from '../types.js'\n\nimport { convertLexicalNodesToHTML } from '../converters/html/converter/index.js'\nimport { createNode } from '../typeUtilities.js'\nimport { BlockquoteFeatureClientComponent } from './feature.client.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\n\nexport const BlockquoteFeature: FeatureProviderProviderServer<undefined, undefined> = (props) => {\n return {\n feature: () => {\n return {\n ClientComponent: BlockquoteFeatureClientComponent,\n clientFeatureProps: null,\n markdownTransformers: [MarkdownTransformer],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({ converters, node, parent, payload }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n lexicalNodes: node.children,\n parent: {\n ...node,\n parent,\n },\n payload,\n })\n\n return `<blockquote>${childrenText}</blockquote>`\n },\n nodeTypes: [QuoteNode.getType()],\n },\n },\n node: QuoteNode,\n }),\n ],\n serverFeatureProps: props,\n }\n },\n key: 'blockquote',\n serverFeatureProps: props,\n }\n}\n"],"names":["QuoteNode","convertLexicalNodesToHTML","createNode","BlockquoteFeatureClientComponent","MarkdownTransformer","BlockquoteFeature","props","feature","ClientComponent","clientFeatureProps","markdownTransformers","nodes","converters","html","converter","node","parent","payload","childrenText","lexicalNodes","children","nodeTypes","getType","serverFeatureProps","key"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAoB;AAI9C,SAASC,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,UAAU,QAAQ,sBAAqB;AAChD,SAASC,gCAAgC,QAAQ,sBAAqB;AACtE,SAASC,mBAAmB,QAAQ,2BAA0B;AAE9D,OAAO,MAAMC,oBAAyE,CAACC;IACrF,OAAO;QACLC,SAAS;YACP,OAAO;gBACLC,iBAAiBL;gBACjBM,oBAAoB;gBACpBC,sBAAsB;oBAACN;iBAAoB;gBAC3CO,OAAO;oBACLT,WAAW;wBACTU,YAAY;4BACVC,MAAM;gCACJC,WAAW,OAAO,EAAEF,UAAU,EAAEG,IAAI,EAAEC,MAAM,EAAEC,OAAO,EAAE;oCACrD,MAAMC,eAAe,MAAMjB,0BAA0B;wCACnDW;wCACAO,cAAcJ,KAAKK,QAAQ;wCAC3BJ,QAAQ;4CACN,GAAGD,IAAI;4CACPC;wCACF;wCACAC;oCACF;oCAEA,OAAO,CAAC,YAAY,EAAEC,aAAa,aAAa,CAAC;gCACnD;gCACAG,WAAW;oCAACrB,UAAUsB,OAAO;iCAAG;4BAClC;wBACF;wBACAP,MAAMf;oBACR;iBACD;gBACDuB,oBAAoBjB;YACtB;QACF;QACAkB,KAAK;QACLD,oBAAoBjB;IACtB;AACF,EAAC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import type { Block
|
|
1
|
+
import type { Block } from 'payload/types';
|
|
2
2
|
import type { FeatureProviderProviderServer } from '../types.js';
|
|
3
3
|
import type { BlocksFeatureClientProps } from './feature.client.js';
|
|
4
|
-
export type LexicalBlock = Omit<Block, 'fields'> & {
|
|
5
|
-
fields: FieldWithRichTextRequiredEditor[];
|
|
6
|
-
};
|
|
7
4
|
export type BlocksFeatureProps = {
|
|
8
|
-
blocks:
|
|
5
|
+
blocks: Block[];
|
|
9
6
|
};
|
|
10
7
|
export declare const BlocksFeature: FeatureProviderProviderServer<BlocksFeatureProps, BlocksFeatureClientProps>;
|
|
11
8
|
//# sourceMappingURL=feature.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../../src/field/features/blocks/feature.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAqB
|
|
1
|
+
{"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../../src/field/features/blocks/feature.server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAA;AAM7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAQnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,6BAA6B,CACvD,kBAAkB,EAClB,wBAAwB,CAsKzB,CAAA"}
|
|
@@ -8,7 +8,7 @@ import { blockPopulationPromiseHOC } from './populationPromise.js';
|
|
|
8
8
|
import { blockValidationHOC } from './validate.js';
|
|
9
9
|
export const BlocksFeature = (props)=>{
|
|
10
10
|
return {
|
|
11
|
-
feature: async ({ config: _config })=>{
|
|
11
|
+
feature: async ({ config: _config, isRoot })=>{
|
|
12
12
|
if (props?.blocks?.length) {
|
|
13
13
|
const validRelationships = _config.collections.map((c)=>c.slug) || [];
|
|
14
14
|
for (const block of props.blocks){
|
|
@@ -17,7 +17,7 @@ export const BlocksFeature = (props)=>{
|
|
|
17
17
|
block.fields = await sanitizeFields({
|
|
18
18
|
config: _config,
|
|
19
19
|
fields: block.fields,
|
|
20
|
-
requireFieldLevelRichTextEditor:
|
|
20
|
+
requireFieldLevelRichTextEditor: isRoot,
|
|
21
21
|
validRelationships
|
|
22
22
|
});
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/field/features/blocks/feature.server.ts"],"sourcesContent":["import type { Config } from 'payload/config'\nimport type { Block, BlockField, Field
|
|
1
|
+
{"version":3,"sources":["../../../../src/field/features/blocks/feature.server.ts"],"sourcesContent":["import type { Config } from 'payload/config'\nimport type { Block, BlockField, Field } from 'payload/types'\n\nimport { traverseFields } from '@payloadcms/next/utilities'\nimport { baseBlockFields, sanitizeFields } from 'payload/config'\nimport { fieldsToJSONSchema, formatLabels } from 'payload/utilities'\n\nimport type { FeatureProviderProviderServer } from '../types.js'\nimport type { BlocksFeatureClientProps } from './feature.client.js'\n\nimport { createNode } from '../typeUtilities.js'\nimport { BlocksFeatureClientComponent } from './feature.client.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { blockPopulationPromiseHOC } from './populationPromise.js'\nimport { blockValidationHOC } from './validate.js'\n\nexport type BlocksFeatureProps = {\n blocks: Block[]\n}\n\nexport const BlocksFeature: FeatureProviderProviderServer<\n BlocksFeatureProps,\n BlocksFeatureClientProps\n> = (props) => {\n return {\n feature: async ({ config: _config, isRoot }) => {\n if (props?.blocks?.length) {\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const block of props.blocks) {\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n config: _config as unknown as Config,\n fields: block.fields,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n // Build clientProps\n const clientProps: BlocksFeatureClientProps = {\n reducedBlocks: [],\n }\n for (const block of props.blocks) {\n clientProps.reducedBlocks.push({\n slug: block.slug,\n fieldMap: [],\n imageAltText: block.imageAltText,\n imageURL: block.imageURL,\n labels: block.labels,\n })\n }\n\n return {\n ClientComponent: BlocksFeatureClientComponent,\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ config, i18n, props }) => {\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n /**\n * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these\n * sub-fields from the component map. Thus, we need to put them in the component map here.\n */\n const schemaMap = new Map<string, Field[]>()\n\n for (const block of props.blocks) {\n schemaMap.set(block.slug, block.fields || [])\n\n traverseFields({\n config,\n fields: block.fields,\n i18n,\n schemaMap,\n schemaPath: block.slug,\n validRelationships,\n })\n }\n\n return schemaMap\n },\n generatedTypes: {\n modifyOutputSchema: ({\n collectionIDFieldTypes,\n config,\n currentSchema,\n field,\n interfaceNameDefinitions,\n }) => {\n if (!props?.blocks?.length) {\n return currentSchema\n }\n\n const blocksField: BlockField = {\n name: field?.name + '_lexical_blocks',\n type: 'blocks',\n blocks: props.blocks,\n }\n // This is only done so that interfaceNameDefinitions sets those block's interfaceNames.\n // we don't actually use the JSON Schema itself in the generated types yet.\n fieldsToJSONSchema(\n collectionIDFieldTypes,\n [blocksField],\n interfaceNameDefinitions,\n config,\n )\n\n return currentSchema\n },\n },\n nodes: [\n createNode({\n /* // TODO: Implement these hooks once docWithLocales / originalSiblingDoc => node matching has been figured out\n hooks: {\n beforeChange: [\n async ({ context, findMany, node, operation, overrideAccess, req }) => {\n const blockType = node.fields.blockType\n\n const block = deepCopyObject(\n props.blocks.find((block) => block.slug === blockType),\n )\n\n\n await beforeChangeTraverseFields({\n id: null,\n collection: null,\n context,\n data: node.fields,\n doc: node.fields,\n fields: sanitizedBlock.fields,\n global: null,\n mergeLocaleActions: [],\n operation:\n operation === 'create' || operation === 'update' ? operation : 'update',\n overrideAccess,\n path: '',\n req,\n siblingData: node.fields,\n siblingDoc: node.fields,\n })\n\n\n return node\n },\n ],\n beforeValidate: [\n async ({ context, findMany, node, operation, overrideAccess, req }) => {\n const blockType = node.fields.blockType\n\n const block = deepCopyObject(\n props.blocks.find((block) => block.slug === blockType),\n )\n\n\n\n await beforeValidateTraverseFields({\n id: null,\n collection: null,\n context,\n data: node.fields,\n doc: node.fields,\n fields: sanitizedBlock.fields,\n global: null,\n operation:\n operation === 'create' || operation === 'update' ? operation : 'update',\n overrideAccess,\n req,\n siblingData: node.fields,\n siblingDoc: node.fields,\n })\n\n return node\n },\n ],\n },*/\n node: BlockNode,\n populationPromises: [blockPopulationPromiseHOC(props)],\n validations: [blockValidationHOC(props)],\n }),\n ],\n serverFeatureProps: props,\n }\n },\n key: 'blocks',\n serverFeatureProps: props,\n }\n}\n"],"names":["traverseFields","baseBlockFields","sanitizeFields","fieldsToJSONSchema","formatLabels","createNode","BlocksFeatureClientComponent","BlockNode","blockPopulationPromiseHOC","blockValidationHOC","BlocksFeature","props","feature","config","_config","isRoot","blocks","length","validRelationships","collections","map","c","slug","block","fields","concat","labels","requireFieldLevelRichTextEditor","clientProps","reducedBlocks","push","fieldMap","imageAltText","imageURL","ClientComponent","clientFeatureProps","generateSchemaMap","i18n","schemaMap","Map","set","schemaPath","generatedTypes","modifyOutputSchema","collectionIDFieldTypes","currentSchema","field","interfaceNameDefinitions","blocksField","name","type","nodes","node","populationPromises","validations","serverFeatureProps","key"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { PluginComponent } from '../../types.js';
|
|
2
|
+
import type { BlocksFeatureClientProps } from '../feature.client.js';
|
|
2
3
|
import type { BlockFields } from '../nodes/BlocksNode.js';
|
|
3
4
|
export type InsertBlockPayload = Exclude<BlockFields, 'id'>;
|
|
4
|
-
export declare
|
|
5
|
+
export declare const BlocksPlugin: PluginComponent<BlocksFeatureClientProps>;
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/blocks/plugin/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/blocks/plugin/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAMzD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;AAE3D,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,wBAAwB,CA8ClE,CAAA"}
|
|
@@ -6,7 +6,7 @@ import React, { useEffect } from 'react';
|
|
|
6
6
|
import { BlocksDrawerComponent } from '../drawer/index.js';
|
|
7
7
|
import { $createBlockNode, BlockNode } from '../nodes/BlocksNode.js';
|
|
8
8
|
import { INSERT_BLOCK_COMMAND } from './commands.js';
|
|
9
|
-
export
|
|
9
|
+
export const BlocksPlugin = ()=>{
|
|
10
10
|
const [editor] = useLexicalComposerContext();
|
|
11
11
|
useEffect(()=>{
|
|
12
12
|
if (!editor.hasNodes([
|
|
@@ -35,6 +35,6 @@ export function BlocksPlugin() {
|
|
|
35
35
|
editor
|
|
36
36
|
]);
|
|
37
37
|
return /*#__PURE__*/ React.createElement(BlocksDrawerComponent, null);
|
|
38
|
-
}
|
|
38
|
+
};
|
|
39
39
|
|
|
40
40
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/field/features/blocks/plugin/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { BlockFields } from '../nodes/BlocksNode.js'\n\nimport { BlocksDrawerComponent } from '../drawer/index.js'\nimport { $createBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport { INSERT_BLOCK_COMMAND } from './commands.js'\n\nexport type InsertBlockPayload = Exclude<BlockFields, 'id'>\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../../../../src/field/features/blocks/plugin/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../types.js'\nimport type { BlocksFeatureClientProps } from '../feature.client.js'\nimport type { BlockFields } from '../nodes/BlocksNode.js'\n\nimport { BlocksDrawerComponent } from '../drawer/index.js'\nimport { $createBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport { INSERT_BLOCK_COMMAND } from './commands.js'\n\nexport type InsertBlockPayload = Exclude<BlockFields, 'id'>\n\nexport const BlocksPlugin: PluginComponent<BlocksFeatureClientProps> = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!editor.hasNodes([BlockNode])) {\n throw new Error('BlocksPlugin: BlocksNode not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand<InsertBlockPayload>(\n INSERT_BLOCK_COMMAND,\n (payload: InsertBlockPayload) => {\n editor.update(() => {\n const blockNode = $createBlockNode(payload)\n\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const { focus } = selection\n const focusNode = focus.getNode()\n\n // First, delete currently selected node if it's an empty paragraph and if there are sufficient\n // paragraph nodes (more than 1) left in the parent node, so that we don't \"trap\" the user\n if (\n $isParagraphNode(focusNode) &&\n focusNode.getTextContentSize() === 0 &&\n focusNode\n .getParent()\n .getChildren()\n .filter((node) => $isParagraphNode(node)).length > 1\n ) {\n focusNode.remove()\n }\n\n $insertNodeToNearestRoot(blockNode)\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [editor])\n\n return <BlocksDrawerComponent />\n}\n"],"names":["useLexicalComposerContext","$insertNodeToNearestRoot","mergeRegister","$getPreviousSelection","$getSelection","$isParagraphNode","$isRangeSelection","COMMAND_PRIORITY_EDITOR","React","useEffect","BlocksDrawerComponent","$createBlockNode","BlockNode","INSERT_BLOCK_COMMAND","BlocksPlugin","editor","hasNodes","Error","registerCommand","payload","update","blockNode","selection","focus","focusNode","getNode","getTextContentSize","getParent","getChildren","filter","node","length","remove"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AACA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,wBAAwB,EAAEC,aAAa,QAAQ,iBAAgB;AACxE,SACEC,qBAAqB,EACrBC,aAAa,EACbC,gBAAgB,EAChBC,iBAAiB,EACjBC,uBAAuB,QAClB,UAAS;AAChB,OAAOC,SAASC,SAAS,QAAQ,QAAO;AAMxC,SAASC,qBAAqB,QAAQ,qBAAoB;AAC1D,SAASC,gBAAgB,EAAEC,SAAS,QAAQ,yBAAwB;AACpE,SAASC,oBAAoB,QAAQ,gBAAe;AAIpD,OAAO,MAAMC,eAA0D;IACrE,MAAM,CAACC,OAAO,GAAGf;IAEjBS,UAAU;QACR,IAAI,CAACM,OAAOC,QAAQ,CAAC;YAACJ;SAAU,GAAG;YACjC,MAAM,IAAIK,MAAM;QAClB;QAEA,OAAOf,cACLa,OAAOG,eAAe,CACpBL,sBACA,CAACM;YACCJ,OAAOK,MAAM,CAAC;gBACZ,MAAMC,YAAYV,iBAAiBQ;gBAEnC,MAAMG,YAAYlB,mBAAmBD;gBAErC,IAAIG,kBAAkBgB,YAAY;oBAChC,MAAM,EAAEC,KAAK,EAAE,GAAGD;oBAClB,MAAME,YAAYD,MAAME,OAAO;oBAE/B,+FAA+F;oBAC/F,0FAA0F;oBAC1F,IACEpB,iBAAiBmB,cACjBA,UAAUE,kBAAkB,OAAO,KACnCF,UACGG,SAAS,GACTC,WAAW,GACXC,MAAM,CAAC,CAACC,OAASzB,iBAAiByB,OAAOC,MAAM,GAAG,GACrD;wBACAP,UAAUQ,MAAM;oBAClB;oBAEA/B,yBAAyBoB;gBAC3B;YACF;YAEA,OAAO;QACT,GACAd;IAGN,GAAG;QAACQ;KAAO;IAEX,qBAAO,oBAACL;AACV,EAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { PluginComponent } from '../../../types.js';
|
|
2
2
|
import './index.scss';
|
|
3
3
|
export declare function isSelectAll(event: KeyboardEvent): boolean;
|
|
4
|
-
export declare const TestRecorderPlugin:
|
|
4
|
+
export declare const TestRecorderPlugin: PluginComponent<undefined>;
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/debug/testRecorder/plugin/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/debug/testRecorder/plugin/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGxD,OAAO,cAAc,CAAA;AA8ErB,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEzD;AAmWD,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,SAAS,CAYzD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/field/features/debug/testRecorder/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport { IS_APPLE } from '../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.keyCode === 65 && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'Enter',\n 'Backspace',\n 'Delete',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = window.getSelection()\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = window.getSelection()\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = window.getSelection()\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$createTextNode","$getRoot","React","useCallback","useEffect","useLayoutEffect","useRef","useState","IS_APPLE","copy","text","textArea","document","createElement","value","style","position","opacity","body","appendChild","focus","select","result","execCommand","console","log","error","removeChild","download","filename","a","setAttribute","encodeURIComponent","display","click","formatStep","step","formatOneStep","name","x","y","anchorPath","toString","anchorOffset","focusPath","focusOffset","formattedStep","count","join","isSelectAll","event","keyCode","metaKey","ctrlKey","sanitizeSelection","selection","anchorNode","focusNode","getPathFromNodeToEditor","node","rootElement","currentNode","path","undefined","unshift","Array","from","parentNode","childNodes","indexOf","keyPresses","Set","useTestRecorder","editor","steps","setSteps","isRecording","setIsRecording","setCurrentInnerHTML","templatedTest","setTemplatedTest","previousSelectionRef","skipNextSelectionChangeRef","preRef","getCurrentEditor","generateTestContent","getRootElement","browserSelection","window","getSelection","contains","map","pushStep","currentSteps","currentIndex","length","lastStep","slice","onKeyDown","key","has","onKeyUp","registerRootListener","prevRootElement","removeEventListener","addEventListener","current","scrollTo","scrollHeight","testContent","removeUpdateListener","registerUpdateListener","dirtyElements","dirtyLeaves","editorState","currentSelection","_selection","previousSelection","skipNextSelectionChange","size","innerHTML","toggleEditorSelection","currentEditor","update","root","clear","append","currentIsRecording","onSnapshotClick","onCopyClick","onDownloadClick","button","className","id","onClick","e","preventDefault","title","type","output","div","pre","ref","TestRecorderPlugin","testRecorderButton","testRecorderOutput","Fragment","p"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAGA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,oBAAoB,EAAEC,eAAe,EAAEC,QAAQ,QAAQ,UAAS;AACzE,YAAYC,WAAW,QAAO;AAC9B,SAASC,WAAW,EAAEC,SAAS,EAAEC,eAAe,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAEjF,SAASC,QAAQ,QAAQ,2CAA0C;AACnE,OAAO,eAAc;AAErB,MAAMC,OAAO,CAACC;IACZ,MAAMC,WAAWC,SAASC,aAAa,CAAC;IACxCF,SAASG,KAAK,GAAGJ,QAAQ;IACzBC,SAASI,KAAK,CAACC,QAAQ,GAAG;IAC1BL,SAASI,KAAK,CAACE,OAAO,GAAG;IACzBL,SAASM,IAAI,EAAEC,YAAYR;IAC3BA,SAASS,KAAK;IACdT,SAASU,MAAM;IACf,IAAI;QACF,MAAMC,SAASV,SAASW,WAAW,CAAC;QACpC,sCAAsC;QACtCC,QAAQC,GAAG,CAACH;IACd,EAAE,OAAOI,OAAO;QACdF,QAAQE,KAAK,CAACA;IAChB;IACAd,SAASM,IAAI,EAAES,YAAYhB;AAC7B;AAEA,MAAMiB,WAAW,CAACC,UAAkBnB;IAClC,MAAMoB,IAAIlB,SAASC,aAAa,CAAC;IACjCiB,EAAEC,YAAY,CAAC,QAAQ,mCAAmCC,mBAAmBtB,QAAQ;IACrFoB,EAAEC,YAAY,CAAC,YAAYF;IAC3BC,EAAEf,KAAK,CAACkB,OAAO,GAAG;IAClBrB,SAASM,IAAI,EAAEC,YAAYW;IAC3BA,EAAEI,KAAK;IACPtB,SAASM,IAAI,EAAES,YAAYG;AAC7B;AAEA,MAAMK,aAAa,CAACC;IAClB,MAAMC,gBAAgB,CAACC,MAAcxB;QACnC,OAAQwB;YACN,KAAK;gBAAS;oBACZ,OAAO,CAAC,6BAA6B,EAAExB,MAAMyB,CAAC,CAAC,EAAE,EAAEzB,MAAM0B,CAAC,CAAC,EAAE,CAAC;gBAChE;YACA,KAAK;gBAAS;oBACZ,OAAO,CAAC,iCAAiC,EAAE1B,MAAM,GAAG,CAAC;gBACvD;YACA,KAAK;gBAAW;oBACd,OAAO,CAAC,mCAAmC,EAAEA,MAAM,GAAG,CAAC;gBACzD;YACA,KAAK;gBAAS;oBACZ,OAAO,CAAC,iCAAiC,EAAEA,MAAM,GAAG,CAAC;gBACvD;YACA,KAAK;gBAAQ;oBACX,OAAO,CAAC,gCAAgC,EAAEA,MAAM,GAAG,CAAC;gBACtD;YACA,KAAK;gBAAa;oBAChB,OAAO,CAAC,4BAA4B,CAAC;gBACvC;YACA,KAAK;gBAAY;oBACf,OAAO,CAAC;;qBAEK,EAAEA,MAAM2B,UAAU,CAACC,QAAQ,GAAG;sBAC7B,EAAE5B,MAAM6B,YAAY,CAAC;oBACvB,EAAE7B,MAAM8B,SAAS,CAACF,QAAQ,GAAG;qBAC5B,EAAE5B,MAAM+B,WAAW,CAAC;;AAEzC,CAAC;gBACK;YACA;gBACE,OAAO,CAAC,CAAC;QACb;IACF;IACA,MAAMC,gBAAgBT,cAAcD,KAAKE,IAAI,EAAEF,KAAKtB,KAAK;IACzD,OAAQsB,KAAKW,KAAK;QAChB,KAAK;YACH,OAAOD;QACT,KAAK;YACH,OAAO;gBAACA;gBAAeA;aAAc,CAACE,IAAI,CAAC,CAAC,EAAE,CAAC;QACjD;YACE,OAAO,CAAC,mBAAmB,EAAEZ,KAAKW,KAAK,CAAC;EAC5C,EAAED,cAAc;QACV,CAAC;IACP;AACF;AAEA,OAAO,SAASG,YAAYC,KAAoB;IAC9C,OAAOA,MAAMC,OAAO,KAAK,MAAO3C,CAAAA,WAAW0C,MAAME,OAAO,GAAGF,MAAMG,OAAO,AAAD;AACzE;AAEA,oCAAoC;AACpC,SAASC,kBAAkBC,SAAoB;IAC7C,MAAM,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGF;IAClC,IAAI,EAAEZ,YAAY,EAAEE,WAAW,EAAE,GAAGU;IACpC,IAAIZ,iBAAiB,GAAG;QACtBA;IACF;IACA,IAAIE,gBAAgB,GAAG;QACrBA;IACF;IACA,OAAO;QAAEW;QAAYb;QAAcc;QAAWZ;IAAY;AAC5D;AAEA,SAASa,wBAAwBC,IAAU,EAAEC,WAA+B;IAC1E,IAAIC,cAAuCF;IAC3C,MAAMG,OAAO,EAAE;IACf,MAAOD,gBAAgBD,YAAa;QAClC,IAAIC,gBAAgB,QAAQA,gBAAgBE,WAAW;YACrDD,KAAKE,OAAO,CACVC,MAAMC,IAAI,CAACL,aAAaM,YAAYC,cAAc,EAAE,EAAEC,OAAO,CAACR;QAElE;QACAA,cAAcA,aAAaM;IAC7B;IACA,OAAOL;AACT;AAEA,MAAMQ,aAAa,IAAIC,IAAI;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAWD,SAASC,gBAAgBC,MAAqB;IAC5C,MAAM,CAACC,OAAOC,SAAS,GAAGpE,SAAgB,EAAE;IAC5C,MAAM,CAACqE,aAAaC,eAAe,GAAGtE,SAAS;IAC/C,MAAM,GAAGuE,oBAAoB,GAAGvE,SAAS;IACzC,MAAM,CAACwE,eAAeC,iBAAiB,GAAGzE,SAAS;IACnD,MAAM0E,uBAAuB3E,OAA6B;IAC1D,MAAM4E,6BAA6B5E,OAAO;IAC1C,MAAM6E,SAAS7E,OAAuB;IAEtC,MAAM8E,mBAAmBjF,YAAY;QACnC,OAAOsE;IACT,GAAG;QAACA;KAAO;IAEX,MAAMY,sBAAsBlF,YAAY;QACtC,MAAMyD,cAAca,OAAOa,cAAc;QACzC,MAAMC,mBAAmBC,OAAOC,YAAY;QAE5C,IACE7B,eAAe,QACf2B,oBAAoB,QACpBA,iBAAiB/B,UAAU,IAAI,QAC/B+B,iBAAiB9B,SAAS,IAAI,QAC9B,CAACG,YAAY8B,QAAQ,CAACH,iBAAiB/B,UAAU,KACjD,CAACI,YAAY8B,QAAQ,CAACH,iBAAiB9B,SAAS,GAChD;YACA,OAAO;QACT;QAEA,OAAO,CAAC;;;;;;;;;;;;;;;;;AAiBZ,EAAEiB,MAAMiB,GAAG,CAACxD,YAAYa,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE;;;IAG/B,CAAC;IACH,GAAG;QAACyB;QAAQC;KAAM;IAElB,6DAA6D;IAC7D,4DAA4D;IAC5D,MAAMkB,WAAWzF,YACf,CAACmC,MAAcxB;QACb6D,SAAS,CAACkB;YACR,wBAAwB;YACxB,MAAMC,eAAepB,MAAMqB,MAAM,GAAG;YACpC,MAAMC,WAAWtB,KAAK,CAACoB,aAAa;YACpC,IAAIE,UAAU;gBACZ,IAAIA,SAAS1D,IAAI,KAAKA,MAAM;oBAC1B,IAAIA,SAAS,QAAQ;wBACnB,4CAA4C;wBAC5C,OAAO;+BACFoC,MAAMuB,KAAK,CAAC,GAAGH;4BAClB;gCAAE,GAAGE,QAAQ;gCAAElF,OAAOkF,SAASlF,KAAK,GAAGA;4BAAM;yBAC9C;oBACH,OAAO;wBACL,oEAAoE;wBACpE,IAAIkF,SAASlF,KAAK,KAAKA,OAAO;4BAC5B,OAAO;mCAAI4D,MAAMuB,KAAK,CAAC,GAAGH;gCAAe;oCAAE,GAAGE,QAAQ;oCAAEjD,OAAOiD,SAASjD,KAAK,GAAG;gCAAE;6BAAE;wBACtF;oBACF;gBACF;YACF;YACA,yCAAyC;YACzC,OAAO;mBAAI8C;gBAAc;oBAAEvD;oBAAMS,OAAO;oBAAGjC;gBAAM;aAAE;QACrD;IACF,GACA;QAAC4D;QAAOC;KAAS;IAGnBtE,gBAAgB;QACd,MAAM6F,YAAY,CAAChD;YACjB,IAAI,CAAC0B,aAAa;gBAChB;YACF;YACA,MAAMuB,MAAMjD,MAAMiD,GAAG;YACrB,IAAIlD,YAAYC,QAAQ;gBACtB0C,SAAS,aAAa;YACxB,OAAO,IAAItB,WAAW8B,GAAG,CAACD,MAAM;gBAC9BP,SAAS,SAAS1C,MAAMiD,GAAG;YAC7B,OAAO,IAAI;mBAAIA;aAAI,CAACJ,MAAM,GAAG,GAAG;gBAC9BH,SAAS,WAAW1C,MAAMiD,GAAG;YAC/B,OAAO;gBACLP,SAAS,QAAQ1C,MAAMiD,GAAG;YAC5B;QACF;QAEA,MAAME,UAAU,CAACnD;YACf,IAAI,CAAC0B,aAAa;gBAChB;YACF;YACA,MAAMuB,MAAMjD,MAAMiD,GAAG;YACrB,IAAI,CAAC7B,WAAW8B,GAAG,CAACD,QAAQ;mBAAIA;aAAI,CAACJ,MAAM,GAAG,GAAG;gBAC/CH,SAAS,SAAS1C,MAAMiD,GAAG;YAC7B;QACF;QAEA,OAAO1B,OAAO6B,oBAAoB,CAChC,CAAC1C,aAAiC2C;YAChC,IAAIA,oBAAoB,MAAM;gBAC5BA,gBAAgBC,mBAAmB,CAAC,WAAWN;gBAC/CK,gBAAgBC,mBAAmB,CAAC,SAASH;YAC/C;YACA,IAAIzC,gBAAgB,MAAM;gBACxBA,YAAY6C,gBAAgB,CAAC,WAAWP;gBACxCtC,YAAY6C,gBAAgB,CAAC,SAASJ;YACxC;QACF;IAEJ,GAAG;QAAC5B;QAAQG;QAAagB;KAAS;IAElCvF,gBAAgB;QACd,IAAI8E,OAAOuB,OAAO,EAAE;YAClBvB,OAAOuB,OAAO,CAACC,QAAQ,CAAC,GAAGxB,OAAOuB,OAAO,CAACE,YAAY;QACxD;IACF,GAAG;QAACvB;KAAoB;IAExBjF,UAAU;QACR,IAAIsE,OAAO;YACT,MAAMmC,cAAcxB;YACpB,IAAIwB,gBAAgB,MAAM;gBACxB7B,iBAAiB6B;YACnB;YACA,IAAI1B,OAAOuB,OAAO,EAAE;gBAClBvB,OAAOuB,OAAO,CAACC,QAAQ,CAAC,GAAGxB,OAAOuB,OAAO,CAACE,YAAY;YACxD;QACF;IACF,GAAG;QAACvB;QAAqBX;KAAM;IAE/BtE,UAAU;QACR,MAAM0G,uBAAuBrC,OAAOsC,sBAAsB,CACxD,CAAC,EAAEC,aAAa,EAAEC,WAAW,EAAEC,WAAW,EAAE;YAC1C,IAAI,CAACtC,aAAa;gBAChB;YACF;YACA,MAAMuC,mBAAmBD,YAAYE,UAAU;YAC/C,MAAMC,oBAAoBpC,qBAAqByB,OAAO;YACtD,MAAMY,0BAA0BpC,2BAA2BwB,OAAO;YAClE,IAAIW,sBAAsBF,kBAAkB;gBAC1C,IAAIF,YAAYM,IAAI,KAAK,KAAKP,cAAcO,IAAI,KAAK,KAAK,CAACD,yBAAyB;oBAClF,MAAM/B,mBAAmBC,OAAOC,YAAY;oBAC5C,IACEF,oBACCA,CAAAA,iBAAiB/B,UAAU,IAAI,QAAQ+B,iBAAiB9B,SAAS,IAAI,IAAG,GACzE;wBACA;oBACF;gBACF;gBACAwB,qBAAqByB,OAAO,GAAGS;YACjC;YACAjC,2BAA2BwB,OAAO,GAAG;YACrC,MAAMG,cAAcxB;YACpB,IAAIwB,gBAAgB,MAAM;gBACxB7B,iBAAiB6B;YACnB;QACF;QAEF,OAAOC;IACT,GAAG;QAACrC;QAAQY;QAAqBT;QAAagB;KAAS;IAEvD,iBAAiB;IACjBxF,UAAU;QACR,IAAI,CAACwE,aAAa;YAChB;QACF;QACA,MAAMkC,uBAAuBrC,OAAOsC,sBAAsB,CAAC;YACzD,MAAMnD,cAAca,OAAOa,cAAc;YACzC,IAAI1B,gBAAgB,MAAM;gBACxBkB,oBAAoBlB,aAAa4D;YACnC;QACF;QACA,OAAOV;IACT,GAAG;QAACrC;QAAQG;KAAY;IAExB,mCAAmC;IACnC,MAAM6C,wBAAwBtH,YAC5B,CAACuH;QACC,IAAI,CAAC9C,aAAa;YAChB8C,cAAcC,MAAM,CAAC;gBACnB,MAAMC,OAAO3H;gBACb2H,KAAKC,KAAK;gBACV,MAAMnH,OAAOV;gBACb4H,KAAKE,MAAM,CAAC/H,uBAAuB+H,MAAM,CAACpH;gBAC1CA,KAAKW,MAAM;YACb;YACAsD,SAAS,EAAE;QACb;QACAE,eAAe,CAACkD,qBAAuB,CAACA;IAC1C,GACA;QAACnD;KAAY;IAGf,MAAMoD,kBAAkB7H,YAAY;QAClC,IAAI,CAACyE,aAAa;YAChB;QACF;QACA,MAAMW,mBAAmBC,OAAOC,YAAY;QAC5C,IACEF,qBAAqB,QACrBA,iBAAiB/B,UAAU,IAAI,QAC/B+B,iBAAiB9B,SAAS,IAAI,MAC9B;YACA;QACF;QACA,MAAM,EAAED,UAAU,EAAEb,YAAY,EAAEc,SAAS,EAAEZ,WAAW,EAAE,GAAGS,kBAAkBiC;QAC/E,MAAM3B,cAAcwB,mBAAmBE,cAAc;QACrD,IAAI7C;QACJ,IAAIe,eAAe,MAAM;YACvBf,aAAaiB,wBAAwBF,YAAYI;QACnD;QACA,IAAIhB;QACJ,IAAIa,cAAc,MAAM;YACtBb,YAAYc,wBAAwBD,WAAWG;QACjD;QACAgC,SAAS,YAAY;YACnBpC;YACAb;YACAF;YACAgB;YACAZ;YACAD;QACF;IACF,GAAG;QAACgD;QAAUhB;QAAaQ;KAAiB;IAE5C,MAAM6C,cAAc9H,YAAY;QAC9BM,KAAK4E;IACP,GAAG;QAACA;KAAoB;IAExB,MAAM6C,kBAAkB/H,YAAY;QAClCyB,SAAS,WAAWyD;IACtB,GAAG;QAACA;KAAoB;IAExB,MAAM8C,uBACJ,oBAACA;QACCC,WAAW,CAAC,kBAAkB,EAAExD,cAAc,WAAW,GAAG,CAAC;QAC7DyD,IAAG;QACHC,SAAS,CAACC;YACRd,sBAAsBrC;YACtBmD,EAAEC,cAAc;QAClB;QACAC,OAAO7D,cAAc,0BAA0B;QAC/C8D,MAAK;OAEJ9D,cAAc,0BAA0B;IAG7C,MAAM+D,SAAS/D,4BACb,oBAACgE;QAAIR,WAAU;qBACb,oBAACQ;QAAIR,WAAU;qBACb,oBAACD;QACCC,WAAU;QACVC,IAAG;QACHC,SAAS,CAACC;YACRP;YACAO,EAAEC,cAAc;QAClB;QACAC,OAAM;QACNC,MAAK;OACN,kCAGD,oBAACP;QACCC,WAAU;QACVC,IAAG;QACHC,SAAS,CAACC;YACRN;YACAM,EAAEC,cAAc;QAClB;QACAC,OAAM;QACNC,MAAK;OACN,uBAGD,oBAACP;QACCC,WAAU;QACVC,IAAG;QACHC,SAAS,CAACC;YACRL;YACAK,EAAEC,cAAc;QAClB;QACAC,OAAM;QACNC,MAAK;OACN,4BAIH,oBAACG;QAAIR,IAAG;QAAgBS,KAAK3D;OAC1BJ,kBAGH;IAEJ,OAAO;QAACoD;QAAQQ;KAAO;AACzB;AACA,OAAO,MAAMI,qBAA+B;IAC1C,MAAM,CAACtE,OAAO,GAAG3E;IACjB,MAAM,CAACkJ,oBAAoBC,mBAAmB,GAAGzE,gBAAgBC;IAEjE,qBACE,oBAACvE,MAAMgJ,QAAQ,sBACb,oBAACC,WAAE,OACFH,oBACAC,kCACD,oBAACE,WAAE;AAGT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/field/features/debug/testRecorder/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { PluginComponent } from '../../../types.js'\n\nimport { IS_APPLE } from '../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.keyCode === 65 && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'Enter',\n 'Backspace',\n 'Delete',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = window.getSelection()\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = window.getSelection()\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = window.getSelection()\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$createTextNode","$getRoot","React","useCallback","useEffect","useLayoutEffect","useRef","useState","IS_APPLE","copy","text","textArea","document","createElement","value","style","position","opacity","body","appendChild","focus","select","result","execCommand","console","log","error","removeChild","download","filename","a","setAttribute","encodeURIComponent","display","click","formatStep","step","formatOneStep","name","x","y","anchorPath","toString","anchorOffset","focusPath","focusOffset","formattedStep","count","join","isSelectAll","event","keyCode","metaKey","ctrlKey","sanitizeSelection","selection","anchorNode","focusNode","getPathFromNodeToEditor","node","rootElement","currentNode","path","undefined","unshift","Array","from","parentNode","childNodes","indexOf","keyPresses","Set","useTestRecorder","editor","steps","setSteps","isRecording","setIsRecording","setCurrentInnerHTML","templatedTest","setTemplatedTest","previousSelectionRef","skipNextSelectionChangeRef","preRef","getCurrentEditor","generateTestContent","getRootElement","browserSelection","window","getSelection","contains","map","pushStep","currentSteps","currentIndex","length","lastStep","slice","onKeyDown","key","has","onKeyUp","registerRootListener","prevRootElement","removeEventListener","addEventListener","current","scrollTo","scrollHeight","testContent","removeUpdateListener","registerUpdateListener","dirtyElements","dirtyLeaves","editorState","currentSelection","_selection","previousSelection","skipNextSelectionChange","size","innerHTML","toggleEditorSelection","currentEditor","update","root","clear","append","currentIsRecording","onSnapshotClick","onCopyClick","onDownloadClick","button","className","id","onClick","e","preventDefault","title","type","output","div","pre","ref","TestRecorderPlugin","testRecorderButton","testRecorderOutput","Fragment","p"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { PluginComponent } from '../../../types.js';
|
|
2
2
|
import './index.scss';
|
|
3
|
-
export declare
|
|
3
|
+
export declare const TreeViewPlugin: PluginComponent<undefined>;
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/debug/treeView/plugin/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/debug/treeView/plugin/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC,SAAS,CAarD,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext
|
|
|
3
3
|
import { TreeView } from '@lexical/react/LexicalTreeView.js';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import './index.scss';
|
|
6
|
-
export
|
|
6
|
+
export const TreeViewPlugin = ()=>{
|
|
7
7
|
const [editor] = useLexicalComposerContext();
|
|
8
8
|
return /*#__PURE__*/ React.createElement(TreeView, {
|
|
9
9
|
editor: editor,
|
|
@@ -14,6 +14,6 @@ export function TreeViewPlugin() {
|
|
|
14
14
|
treeTypeButtonClassName: "debug-treetype-button",
|
|
15
15
|
viewClassName: "tree-view-output"
|
|
16
16
|
});
|
|
17
|
-
}
|
|
17
|
+
};
|
|
18
18
|
|
|
19
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/field/features/debug/treeView/plugin/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TreeView } from '@lexical/react/LexicalTreeView.js'\nimport * as React from 'react'\n\nimport './index.scss'\n\nexport
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/field/features/debug/treeView/plugin/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TreeView } from '@lexical/react/LexicalTreeView.js'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../types.js'\n\nimport './index.scss'\n\nexport const TreeViewPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n return (\n <TreeView\n editor={editor}\n timeTravelButtonClassName=\"debug-timetravel-button\"\n timeTravelPanelButtonClassName=\"debug-timetravel-panel-button\"\n timeTravelPanelClassName=\"debug-timetravel-panel\"\n timeTravelPanelSliderClassName=\"debug-timetravel-panel-slider\"\n treeTypeButtonClassName=\"debug-treetype-button\"\n viewClassName=\"tree-view-output\"\n />\n )\n}\n"],"names":["useLexicalComposerContext","TreeView","React","TreeViewPlugin","editor","timeTravelButtonClassName","timeTravelPanelButtonClassName","timeTravelPanelClassName","timeTravelPanelSliderClassName","treeTypeButtonClassName","viewClassName"],"rangeMappings":";;;;;;;;;;;;;;;;","mappings":"AAAA;AACA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,QAAQ,QAAQ,oCAAmC;AAC5D,YAAYC,WAAW,QAAO;AAI9B,OAAO,eAAc;AAErB,OAAO,MAAMC,iBAA6C;IACxD,MAAM,CAACC,OAAO,GAAGJ;IACjB,qBACE,oBAACC;QACCG,QAAQA;QACRC,2BAA0B;QAC1BC,gCAA+B;QAC/BC,0BAAyB;QACzBC,gCAA+B;QAC/BC,yBAAwB;QACxBC,eAAc;;AAGpB,EAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { PluginComponent } from '../../types.js';
|
|
1
2
|
import './index.scss';
|
|
2
3
|
/**
|
|
3
4
|
* Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.
|
|
4
5
|
*/
|
|
5
|
-
export declare
|
|
6
|
+
export declare const HorizontalRulePlugin: PluginComponent<undefined>;
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/horizontalRule/plugin/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/horizontalRule/plugin/index.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAMrD,OAAO,cAAc,CAAA;AAErB;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAAC,SAAS,CA2B3D,CAAA"}
|
|
@@ -7,7 +7,7 @@ import { $createHorizontalRuleNode, INSERT_HORIZONTAL_RULE_COMMAND } from '../no
|
|
|
7
7
|
import './index.scss';
|
|
8
8
|
/**
|
|
9
9
|
* Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.
|
|
10
|
-
*/ export
|
|
10
|
+
*/ export const HorizontalRulePlugin = ()=>{
|
|
11
11
|
const [editor] = useLexicalComposerContext();
|
|
12
12
|
useEffect(()=>{
|
|
13
13
|
return editor.registerCommand(INSERT_HORIZONTAL_RULE_COMMAND, (type)=>{
|
|
@@ -26,6 +26,6 @@ import './index.scss';
|
|
|
26
26
|
editor
|
|
27
27
|
]);
|
|
28
28
|
return null;
|
|
29
|
-
}
|
|
29
|
+
};
|
|
30
30
|
|
|
31
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/field/features/horizontalRule/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 {\n $createHorizontalRuleNode,\n INSERT_HORIZONTAL_RULE_COMMAND,\n} 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
|
|
1
|
+
{"version":3,"sources":["../../../../../src/field/features/horizontalRule/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 '../../types.js'\n\nimport {\n $createHorizontalRuleNode,\n INSERT_HORIZONTAL_RULE_COMMAND,\n} 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"],"names":["useLexicalComposerContext","$insertNodeToNearestRoot","$getSelection","$isRangeSelection","COMMAND_PRIORITY_EDITOR","useEffect","$createHorizontalRuleNode","INSERT_HORIZONTAL_RULE_COMMAND","HorizontalRulePlugin","editor","registerCommand","type","selection","focusNode","focus","getNode","horizontalRuleNode"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAEA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,wBAAwB,QAAQ,iBAAgB;AACzD,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,uBAAuB,QAAQ,UAAS;AACnF,SAASC,SAAS,QAAQ,QAAO;AAIjC,SACEC,yBAAyB,EACzBC,8BAA8B,QACzB,iCAAgC;AACvC,OAAO,eAAc;AAErB;;CAEC,GACD,OAAO,MAAMC,uBAAmD;IAC9D,MAAM,CAACC,OAAO,GAAGT;IAEjBK,UAAU;QACR,OAAOI,OAAOC,eAAe,CAC3BH,gCACA,CAACI;YACC,MAAMC,YAAYV;YAElB,IAAI,CAACC,kBAAkBS,YAAY;gBACjC,OAAO;YACT;YAEA,MAAMC,YAAYD,UAAUE,KAAK,CAACC,OAAO;YAEzC,IAAIF,cAAc,MAAM;gBACtB,MAAMG,qBAAqBV;gBAC3BL,yBAAyBe;YAC3B;YAEA,OAAO;QACT,GACAZ;IAEJ,GAAG;QAACK;KAAO;IAEX,OAAO;AACT,EAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { SanitizedConfig } from 'payload/config';
|
|
2
|
-
import type {
|
|
3
|
-
export declare const getBaseFields: (config: SanitizedConfig, enabledCollections: false | string[], disabledCollections: false | string[]) =>
|
|
2
|
+
import type { Field } from 'payload/types';
|
|
3
|
+
export declare const getBaseFields: (config: SanitizedConfig, enabledCollections: false | string[], disabledCollections: false | string[], maxDepth?: number) => Field[];
|
|
4
4
|
//# sourceMappingURL=baseFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/link/drawer/baseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../../../../src/field/features/link/drawer/baseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAyB,MAAM,eAAe,CAAA;AAIjE,eAAO,MAAM,aAAa,WAChB,eAAe,sBACH,KAAK,GAAG,MAAM,EAAE,uBACf,KAAK,GAAG,MAAM,EAAE,aAC1B,MAAM,KAChB,KAAK,EAsGP,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { validateUrl } from '../../../lexical/utils/url.js';
|
|
2
|
-
export const getBaseFields = (config, enabledCollections, disabledCollections)=>{
|
|
2
|
+
export const getBaseFields = (config, enabledCollections, disabledCollections, maxDepth)=>{
|
|
3
3
|
let enabledRelations;
|
|
4
4
|
/**
|
|
5
5
|
* Figure out which relations should be enabled (enabledRelations) based on a collection's admin.enableRichTextLink property,
|
|
@@ -78,6 +78,7 @@ export const getBaseFields = (config, enabledCollections, disabledCollections)=>
|
|
|
78
78
|
}
|
|
79
79
|
} : null,
|
|
80
80
|
label: ({ t })=>t('fields:chooseDocumentToLink'),
|
|
81
|
+
maxDepth,
|
|
81
82
|
relationTo: enabledRelations,
|
|
82
83
|
required: true
|
|
83
84
|
});
|