import { Extension } from "@tiptap/core"; declare module "@tiptap/core" { // eslint-disable-next-line no-unused-vars interface Commands { customkeymap: { selectTextWithinNodeBoundaries: () => ReturnType; }; } } const CustomKeymap = Extension.create({ name: "CustomKeymap", addCommands() { return { selectTextWithinNodeBoundaries: () => ({ editor, commands }) => { const { state } = editor; const { tr } = state; const startNodePos = tr.selection.$from.start(); const endNodePos = tr.selection.$to.end(); return commands.setTextSelection({ from: startNodePos, to: endNodePos, }); }, }; }, addKeyboardShortcuts() { return { "Mod-a": ({ editor }) => { const { state } = editor; const { tr } = state; const startSelectionPos = tr.selection.from; const endSelectionPos = tr.selection.to; const startNodePos = tr.selection.$from.start(); const endNodePos = tr.selection.$to.end(); const isCurrentTextSelectionNotExtendedToNodeBoundaries = startSelectionPos > startNodePos || endSelectionPos < endNodePos; if (isCurrentTextSelectionNotExtendedToNodeBoundaries) { editor.chain().selectTextWithinNodeBoundaries().run(); return true; } return false; }, }; }, }); export default CustomKeymap;