diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 90c8f4a3..8afab00d 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -14,7 +14,7 @@ import createStyleTag from './utils/createStyleTag' import CommandManager from './CommandManager' import ExtensionManager from './ExtensionManager' import EventEmitter from './EventEmitter' -import { Extensions } from './types' +import { Extensions, UnionToIntersection, PickValue } from './types' import defaultPlugins from './plugins' import * as coreCommands from './commands' import style from './style' @@ -35,19 +35,13 @@ export interface CommandsSpec { [key: string]: CommandSpec } -export interface Commands {} +export interface AllExtensions {} -export type CommandNames = Extract - -export type SingleCommands = { - [Item in keyof Commands]: Commands[Item] extends (...args: any[]) => any - ? (...args: Parameters) => boolean - : never -} +export type SingleCommands = UnionToIntersection, 'addCommands'>>> export type ChainedCommands = { - [Item in keyof Commands]: Commands[Item] extends (...args: any[]) => any - ? (...args: Parameters) => ChainedCommands + [Item in keyof SingleCommands]: SingleCommands[Item] extends (...args: any[]) => any + ? (...args: Parameters) => ChainedCommands : never } & { run: () => boolean diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 972e8e68..7651db73 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -27,3 +27,9 @@ export type GlobalAttributes = { types: string[], attributes: Attributes, }[] + +export type PickValue = T[K] + +export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I)=>void) + ? I + : never diff --git a/packages/extension-blockquote/index.ts b/packages/extension-blockquote/index.ts index eeb9b511..dc6d5a01 100644 --- a/packages/extension-blockquote/index.ts +++ b/packages/extension-blockquote/index.ts @@ -1,17 +1,9 @@ import { Command, createNode } from '@tiptap/core' import { wrappingInputRule } from 'prosemirror-inputrules' -// export type BlockquoteCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// blockquote: BlockquoteCommand, -// } -// } - export const inputRegex = /^\s*>\s$/gm -export default createNode({ +const Blockquote = createNode({ name: 'blockquote', content: 'block*', @@ -32,7 +24,7 @@ export default createNode({ addCommands() { return { - blockquote: () => ({ commands }) => { + blockquote: (): Command => ({ commands }) => { return commands.toggleWrap('blockquote') }, } @@ -50,3 +42,11 @@ export default createNode({ ] }, }) + +export default Blockquote + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Blockquote: typeof Blockquote, + } +} diff --git a/packages/extension-bold/index.ts b/packages/extension-bold/index.ts index 21e6bf49..13efa0ec 100644 --- a/packages/extension-bold/index.ts +++ b/packages/extension-bold/index.ts @@ -15,7 +15,7 @@ export const starPasteRegex = /(?:^|\s)((?:\*\*)((?:[^*]+))(?:\*\*))/gm export const underscoreInputRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))$/gm export const underscorePasteRegex = /(?:^|\s)((?:__)((?:[^__]+))(?:__))/gm -export default createMark({ +const Bold = createMark({ name: 'bold', parseHTML() { @@ -40,7 +40,10 @@ export default createMark({ addCommands() { return { - bold: () => ({ commands }) => { + /** + * bold command + */ + bold: (): Command => ({ commands }) => { return commands.toggleMark('bold') }, } @@ -66,3 +69,11 @@ export default createMark({ ] }, }) + +export default Bold + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Bold: typeof Bold, + } +} diff --git a/packages/extension-bullet-list/index.ts b/packages/extension-bullet-list/index.ts index f1ed4b67..45e6bc18 100644 --- a/packages/extension-bullet-list/index.ts +++ b/packages/extension-bullet-list/index.ts @@ -1,15 +1,7 @@ import { Command, createNode } from '@tiptap/core' import { wrappingInputRule } from 'prosemirror-inputrules' -// export type BulletListCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// bulletList: BulletListCommand, -// } -// } - -export default createNode({ +const BulletList = createNode({ name: 'bullet_list', content: 'list_item+', @@ -28,7 +20,7 @@ export default createNode({ addCommands() { return { - bulletList: () => ({ commands }) => { + bulletList: (): Command => ({ commands }) => { return commands.toggleList('bullet_list', 'list_item') }, } @@ -46,3 +38,11 @@ export default createNode({ ] }, }) + +export default BulletList + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + BulletList: typeof BulletList, + } +} diff --git a/packages/extension-code-block/index.ts b/packages/extension-code-block/index.ts index f5ce9465..770bd619 100644 --- a/packages/extension-code-block/index.ts +++ b/packages/extension-code-block/index.ts @@ -5,18 +5,10 @@ export interface CodeBlockOptions { languageClassPrefix: string, } -// export type CodeBlockCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// codeBlock: CodeBlockCommand, -// } -// } - export const backtickInputRegex = /^```(?[a-z]*)? $/ export const tildeInputRegex = /^~~~(?[a-z]*)? $/ -export default createNode({ +const CodeBlock = createNode({ name: 'code_block', defaultOptions: { @@ -70,7 +62,7 @@ export default createNode({ addCommands() { return { - codeBlock: attrs => ({ commands }) => { + codeBlock: (attrs?: CodeBlockOptions): Command => ({ commands }) => { return commands.toggleBlockType('code_block', 'paragraph', attrs) }, } @@ -89,3 +81,11 @@ export default createNode({ ] }, }) + +export default CodeBlock + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + CodeBlock: typeof CodeBlock, + } +} diff --git a/packages/extension-code/index.ts b/packages/extension-code/index.ts index 94bf5a65..84baa6a4 100644 --- a/packages/extension-code/index.ts +++ b/packages/extension-code/index.ts @@ -2,18 +2,10 @@ import { Command, createMark, markInputRule, markPasteRule, } from '@tiptap/core' -// export type CodeCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// code: CodeCommand, -// } -// } - export const inputRegex = /(?:^|\s)((?:`)((?:[^`]+))(?:`))$/gm export const pasteRegex = /(?:^|\s)((?:`)((?:[^`]+))(?:`))/gm -export default createMark({ +const Code = createMark({ name: 'code', excludes: '_', @@ -30,7 +22,7 @@ export default createMark({ addCommands() { return { - code: () => ({ commands }) => { + code: (): Command => ({ commands }) => { return commands.toggleMark('code') }, } @@ -54,3 +46,11 @@ export default createMark({ ] }, }) + +export default Code + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Code: typeof Code, + } +} diff --git a/packages/extension-collaboration-cursor/index.ts b/packages/extension-collaboration-cursor/index.ts index 745b60ed..1fa870bd 100644 --- a/packages/extension-collaboration-cursor/index.ts +++ b/packages/extension-collaboration-cursor/index.ts @@ -8,18 +8,7 @@ export interface CollaborationCursorOptions { render (user: { name: string, color: string }): HTMLElement, } -// export type UserCommand = (attributes: { -// name: string, -// color: string, -// }) => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// user: UserCommand, -// } -// } - -export default createExtension({ +const CollaborationCursor = createExtension({ name: 'collaboration_cursor', defaultOptions: { @@ -43,7 +32,10 @@ export default createExtension({ addCommands() { return { - user: attributes => () => { + user: (attributes: { + name: string, + color: string, + }): Command => () => { this.options.provider.awareness.setLocalStateField('user', attributes) return true @@ -68,3 +60,11 @@ export default createExtension({ ] }, }) + +export default CollaborationCursor + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + CollaborationCursor: typeof CollaborationCursor, + } +} diff --git a/packages/extension-collaboration/index.ts b/packages/extension-collaboration/index.ts index 374eea75..a4570fb5 100644 --- a/packages/extension-collaboration/index.ts +++ b/packages/extension-collaboration/index.ts @@ -8,7 +8,7 @@ export interface CollaborationOptions { type: any, } -export default createExtension({ +const Collaboration = createExtension({ name: 'collaboration', defaultOptions: { @@ -31,3 +31,11 @@ export default createExtension({ } }, }) + +export default Collaboration + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Collaboration: typeof Collaboration, + } +} diff --git a/packages/extension-document/index.ts b/packages/extension-document/index.ts index 0bd04b43..d569b12f 100644 --- a/packages/extension-document/index.ts +++ b/packages/extension-document/index.ts @@ -1,7 +1,15 @@ import { createNode } from '@tiptap/core' -export default createNode({ +const Document = createNode({ name: 'document', topNode: true, content: 'block+', }) + +export default Document + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Document: typeof Document, + } +} diff --git a/packages/extension-focus/index.ts b/packages/extension-focus/index.ts index 311b9a37..4fe3a899 100644 --- a/packages/extension-focus/index.ts +++ b/packages/extension-focus/index.ts @@ -7,7 +7,7 @@ export interface FocusOptions { nested: boolean, } -export default createExtension({ +const Focus = createExtension({ name: 'focus', defaultOptions: { @@ -48,3 +48,11 @@ export default createExtension({ ] }, }) + +export default Focus + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Focus: typeof Focus, + } +} diff --git a/packages/extension-hard-break/index.ts b/packages/extension-hard-break/index.ts index e851024a..69c0d4dc 100644 --- a/packages/extension-hard-break/index.ts +++ b/packages/extension-hard-break/index.ts @@ -1,15 +1,7 @@ import { Command, createNode } from '@tiptap/core' import { chainCommands, exitCode } from 'prosemirror-commands' -// export type HardBreakCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// hardBreak: HardBreakCommand, -// } -// } - -export default createNode({ +const HardBreak = createNode({ name: 'hardBreak', inline: true, @@ -30,7 +22,7 @@ export default createNode({ addCommands() { return { - hardBreak: () => ({ + hardBreak: (): Command => ({ tr, state, dispatch, view, }) => { return chainCommands(exitCode, () => { @@ -48,3 +40,11 @@ export default createNode({ } }, }) + +export default HardBreak + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + HardBreak: typeof HardBreak, + } +} diff --git a/packages/extension-heading/index.ts b/packages/extension-heading/index.ts index 9bc8d1b6..223e6717 100644 --- a/packages/extension-heading/index.ts +++ b/packages/extension-heading/index.ts @@ -7,15 +7,7 @@ export interface HeadingOptions { levels: Level[], } -// export type HeadingCommand = (options: { level: Level }) => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// heading: HeadingCommand, -// } -// } - -export default createNode({ +const Heading = createNode({ name: 'heading', defaultOptions: { @@ -51,8 +43,11 @@ export default createNode({ addCommands() { return { - heading: attrs => ({ commands }) => { - return commands.toggleBlockType('heading', 'paragraph', attrs) + /** + * heading command + */ + heading: (options: { level: Level }): Command => ({ commands }) => { + return commands.toggleBlockType('heading', 'paragraph', options) }, } }, @@ -72,3 +67,11 @@ export default createNode({ }) }, }) + +export default Heading + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Heading: typeof Heading, + } +} diff --git a/packages/extension-history/index.ts b/packages/extension-history/index.ts index 88a4f3a5..51d4492f 100644 --- a/packages/extension-history/index.ts +++ b/packages/extension-history/index.ts @@ -1,23 +1,12 @@ import { Command, createExtension } from '@tiptap/core' -import { - history, - undo, - redo, -} from 'prosemirror-history' - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// undo: () => Command, -// redo: () => Command, -// } -// } +import { history, undo, redo } from 'prosemirror-history' export interface HistoryOptions { depth: number, newGroupDelay: number, } -export default createExtension({ +const History = createExtension({ name: 'history', defaultOptions: { @@ -27,10 +16,10 @@ export default createExtension({ addCommands() { return { - undo: () => ({ state, dispatch }) => { + undo: (): Command => ({ state, dispatch }) => { return undo(state, dispatch) }, - redo: () => ({ state, dispatch }) => { + redo: (): Command => ({ state, dispatch }) => { return redo(state, dispatch) }, } @@ -50,3 +39,11 @@ export default createExtension({ } }, }) + +export default History + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + History: typeof History, + } +} diff --git a/packages/extension-horizontal-rule/index.ts b/packages/extension-horizontal-rule/index.ts index c4d643f7..73f5b7d2 100644 --- a/packages/extension-horizontal-rule/index.ts +++ b/packages/extension-horizontal-rule/index.ts @@ -1,14 +1,6 @@ import { Command, createNode, nodeInputRule } from '@tiptap/core' -// export type HorizontalRuleCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// horizontalRule: HorizontalRuleCommand, -// } -// } - -export default createNode({ +const HorizontalRule = createNode({ name: 'horizontalRule', group: 'block', @@ -25,7 +17,7 @@ export default createNode({ addCommands() { return { - horizontalRule: () => ({ tr }) => { + horizontalRule: (): Command => ({ tr }) => { tr.replaceSelectionWith(this.type.create()) return true @@ -39,3 +31,11 @@ export default createNode({ ] }, }) + +export default HorizontalRule + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + HorizontalRule: typeof HorizontalRule, + } +} diff --git a/packages/extension-italic/index.ts b/packages/extension-italic/index.ts index 945c5808..4e1cafc9 100644 --- a/packages/extension-italic/index.ts +++ b/packages/extension-italic/index.ts @@ -2,20 +2,12 @@ import { Command, createMark, markInputRule, markPasteRule, } from '@tiptap/core' -// export type ItalicCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// italic: ItalicCommand, -// } -// } - export const starInputRegex = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))$/gm export const starPasteRegex = /(?:^|\s)((?:\*)((?:[^*]+))(?:\*))/gm export const underscoreInputRegex = /(?:^|\s)((?:_)((?:[^_]+))(?:_))$/gm export const underscorePasteRegex = /(?:^|\s)((?:_)((?:[^_]+))(?:_))/gm -export default createMark({ +const Italic = createMark({ name: 'italic', parseHTML() { @@ -39,7 +31,7 @@ export default createMark({ addCommands() { return { - italic: () => ({ commands }) => { + italic: (): Command => ({ commands }) => { return commands.toggleMark('italic') }, } @@ -65,3 +57,11 @@ export default createMark({ ] }, }) + +export default Italic + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Italic: typeof Italic, + } +} diff --git a/packages/extension-link/index.ts b/packages/extension-link/index.ts index 60763a00..9f348e30 100644 --- a/packages/extension-link/index.ts +++ b/packages/extension-link/index.ts @@ -9,17 +9,9 @@ export interface LinkOptions { rel: string, } -// export type LinkCommand = (options: {href?: string, target?: string}) => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// link: LinkCommand, -// } -// } - export const pasteRegex = /https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}\b(?:[-a-zA-Z0-9@:%_+.~#?&//=]*)/gi -export default createMark({ +const Link = createMark({ name: 'link', inclusive: false, @@ -66,12 +58,12 @@ export default createMark({ addCommands() { return { - link: attributes => ({ commands }) => { - if (!attributes.href) { + link: (options: { href?: string, target?: string }): Command => ({ commands }) => { + if (!options.href) { return commands.removeMark('link') } - return commands.updateMark('link', attributes) + return commands.updateMark('link', options) }, } }, @@ -113,3 +105,11 @@ export default createMark({ ] }, }) + +export default Link + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Link: typeof Link, + } +} diff --git a/packages/extension-list-item/index.ts b/packages/extension-list-item/index.ts index 84e88bd9..3bfa852a 100644 --- a/packages/extension-list-item/index.ts +++ b/packages/extension-list-item/index.ts @@ -1,6 +1,6 @@ import { createNode } from '@tiptap/core' -export default createNode({ +const ListItem = createNode({ name: 'list_item', content: 'paragraph block*', @@ -25,3 +25,11 @@ export default createNode({ } }, }) + +export default ListItem + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + ListItem: typeof ListItem, + } +} diff --git a/packages/extension-ordered-list/index.ts b/packages/extension-ordered-list/index.ts index 3e68d74b..e7a4abe0 100644 --- a/packages/extension-ordered-list/index.ts +++ b/packages/extension-ordered-list/index.ts @@ -1,15 +1,7 @@ import { Command, createNode } from '@tiptap/core' import { wrappingInputRule } from 'prosemirror-inputrules' -// export type OrderedListCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// orderedList: OrderedListCommand, -// } -// } - -export default createNode({ +const OrderedList = createNode({ name: 'ordered_list', content: 'list_item+', @@ -46,7 +38,7 @@ export default createNode({ addCommands() { return { - orderedList: () => ({ commands }) => { + orderedList: (): Command => ({ commands }) => { return commands.toggleList('ordered_list', 'list_item') }, } @@ -69,3 +61,11 @@ export default createNode({ ] }, }) + +export default OrderedList + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + OrderedList: typeof OrderedList, + } +} diff --git a/packages/extension-paragraph/index.ts b/packages/extension-paragraph/index.ts index 9309cb7c..20b56d36 100644 --- a/packages/extension-paragraph/index.ts +++ b/packages/extension-paragraph/index.ts @@ -1,15 +1,7 @@ -import { createNode } from '@tiptap/core' +import { Command, createNode } from '@tiptap/core' // import ParagraphComponent from './paragraph.vue' -// export type ParagraphCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// paragraph: ParagraphCommand, -// } -// } - -export default createNode({ +const Paragraph = createNode({ name: 'paragraph', group: 'block', @@ -58,7 +50,7 @@ export default createNode({ addCommands() { return { - paragraph: () => ({ commands }) => { + paragraph: (): Command => ({ commands }) => { return commands.toggleBlockType('paragraph', 'paragraph') }, } @@ -70,3 +62,11 @@ export default createNode({ } }, }) + +export default Paragraph + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Paragraph: typeof Paragraph, + } +} diff --git a/packages/extension-strike/index.ts b/packages/extension-strike/index.ts index f2da287f..caedb10a 100644 --- a/packages/extension-strike/index.ts +++ b/packages/extension-strike/index.ts @@ -2,18 +2,10 @@ import { Command, createMark, markInputRule, markPasteRule, } from '@tiptap/core' -// type StrikeCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// strike: StrikeCommand, -// } -// } - export const inputRegex = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))$/gm export const pasteRegex = /(?:^|\s)((?:~~)((?:[^~]+))(?:~~))/gm -export default createMark({ +const Strike = createMark({ name: 'strike', parseHTML() { @@ -40,7 +32,7 @@ export default createMark({ addCommands() { return { - strike: () => ({ commands }) => { + strike: (): Command => ({ commands }) => { return commands.toggleMark('strike') }, } @@ -64,3 +56,11 @@ export default createMark({ ] }, }) + +export default Strike + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Strike: typeof Strike, + } +} diff --git a/packages/extension-text/index.ts b/packages/extension-text/index.ts index e94a24ac..26c1609f 100644 --- a/packages/extension-text/index.ts +++ b/packages/extension-text/index.ts @@ -1,6 +1,14 @@ import { createNode } from '@tiptap/core' -export default createNode({ +const Text = createNode({ name: 'text', group: 'inline', }) + +export default Text + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Text: typeof Text, + } +} diff --git a/packages/extension-underline/index.ts b/packages/extension-underline/index.ts index 835b3d61..a9eeba86 100644 --- a/packages/extension-underline/index.ts +++ b/packages/extension-underline/index.ts @@ -1,14 +1,6 @@ import { Command, createMark } from '@tiptap/core' -// export type UnderlineCommand = () => Command - -// declare module '@tiptap/core/src/Editor' { -// interface Commands { -// underline: UnderlineCommand, -// } -// } - -export default createMark({ +const Underline = createMark({ name: 'underline', parseHTML() { @@ -29,7 +21,7 @@ export default createMark({ addCommands() { return { - underline: () => ({ commands }) => { + underline: (): Command => ({ commands }) => { return commands.toggleMark('underline') }, } @@ -41,3 +33,11 @@ export default createMark({ } }, }) + +export default Underline + +declare module '@tiptap/core/src/Editor' { + interface AllExtensions { + Underline: typeof Underline, + } +}