From 91d4aa7e399693c72cf1c9e7994e1dec6c0a3746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Tue, 21 Apr 2020 23:22:27 +0200 Subject: [PATCH] improve type handling for commands --- packages/core/src/Editor.ts | 4 ++-- packages/core/src/commands/clearContent.ts | 6 ++++-- packages/core/src/commands/focus.ts | 6 ++++-- packages/core/src/commands/insertHTML.ts | 6 ++++-- packages/core/src/commands/insertText.ts | 6 ++++-- packages/core/src/commands/removeMarks.ts | 6 ++++-- packages/core/src/commands/setContent.ts | 16 ++++++++-------- packages/core/src/commands/toggleBlockType.ts | 16 ++++++++-------- packages/extension-bold/index.ts | 2 +- packages/extension-code/index.ts | 2 +- packages/extension-heading/index.ts | 4 ++-- packages/extension-history/index.ts | 4 ++-- packages/extension-italic/index.ts | 2 +- 13 files changed, 45 insertions(+), 35 deletions(-) diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index bd27c186..e9754f5a 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -21,7 +21,7 @@ import Node from './Node' import Mark from './Mark' import EventEmitter from './EventEmitter' -export type Command = (next: Function, editor: Editor, ...args: any) => any +export type Command = (next: Function, editor: Editor) => (...args: any) => any export interface CommandSpec { [key: string]: Command @@ -104,7 +104,7 @@ export class Editor extends EventEmitter { } this.commands[name] = this.chainCommand((...args: any) => { - return new Promise(resolve => callback(resolve, this.proxy, ...args)) + return new Promise(resolve => callback(resolve, this.proxy)(...args)) }) return this.proxy diff --git a/packages/core/src/commands/clearContent.ts b/packages/core/src/commands/clearContent.ts index db8c2a6a..59abd230 100644 --- a/packages/core/src/commands/clearContent.ts +++ b/packages/core/src/commands/clearContent.ts @@ -1,13 +1,15 @@ import { Editor } from '../Editor' import { TextSelection } from 'prosemirror-state' +type ClearContent = (emitUpdate?: Boolean) => any + declare module '../Editor' { interface Editor { - clearContent(emitUpdate?: Boolean): Editor, + clearContent: ClearContent, } } -export default function clearContent(next: Function, editor: Editor, emitUpdate = false): void { +export default (next: Function, editor: Editor, emitUpdate = false): ClearContent => emitUpdate => { editor.setContent('', emitUpdate) next() } diff --git a/packages/core/src/commands/focus.ts b/packages/core/src/commands/focus.ts index 00f8b3ee..af93f1ea 100644 --- a/packages/core/src/commands/focus.ts +++ b/packages/core/src/commands/focus.ts @@ -3,9 +3,11 @@ import { TextSelection } from 'prosemirror-state' import sleep from '../utils/sleep' import minMax from '../utils/minMax' +type Focus = (position?: Position) => any + declare module '../Editor' { interface Editor { - focus(position?: Position): Editor + focus: Focus, } } @@ -43,7 +45,7 @@ function resolveSelection(editor: Editor, position: Position = null): ResolvedSe } } -export default async function focus(next: Function, editor: Editor, position: Position = null): Promise { +export default (next: Function, editor: Editor, position: Position = null): Focus => async () => { const { view, state } = editor if ((view.hasFocus() && position === null)) { diff --git a/packages/core/src/commands/insertHTML.ts b/packages/core/src/commands/insertHTML.ts index f043ec31..3597a052 100644 --- a/packages/core/src/commands/insertHTML.ts +++ b/packages/core/src/commands/insertHTML.ts @@ -2,13 +2,15 @@ import { DOMParser } from 'prosemirror-model' import { Editor } from '../Editor' import elementFromString from '../utils/elementFromString' +type InsertHTML = (value: string) => any + declare module '../Editor' { interface Editor { - insertHTML(value: string): Editor, + insertHTML: InsertHTML, } } -export default function insertHTML(next: Function, editor: Editor, value: string): void { +export default (next: Function, editor: Editor, value: string): InsertHTML => () => { const { view, state } = editor const { selection } = state const element = elementFromString(value) diff --git a/packages/core/src/commands/insertText.ts b/packages/core/src/commands/insertText.ts index 9647fac0..2715c1bf 100644 --- a/packages/core/src/commands/insertText.ts +++ b/packages/core/src/commands/insertText.ts @@ -1,12 +1,14 @@ import { Editor } from '../Editor' +type InsertText = (value: string) => any + declare module '../Editor' { interface Editor { - insertText(value: string): Editor, + insertText: InsertText, } } -export default function insertText(next: Function, editor: Editor, value: string): void { +export default (next: Function, editor: Editor, value: string): InsertText => () => { const { view, state } = editor const transaction = state.tr.insertText(value) diff --git a/packages/core/src/commands/removeMarks.ts b/packages/core/src/commands/removeMarks.ts index a002c641..5514a60d 100644 --- a/packages/core/src/commands/removeMarks.ts +++ b/packages/core/src/commands/removeMarks.ts @@ -1,12 +1,14 @@ import { Editor } from '../Editor' +type RemoveMarks = () => any + declare module '../Editor' { interface Editor { - removeMarks(): Editor, + removeMarks: RemoveMarks, } } -export default function removeMarks(next: Function, editor: Editor): void { +export default (next: Function, editor: Editor): RemoveMarks => () => { const { state, view, schema } = editor const { selection, tr } = state const { from, to, empty } = selection diff --git a/packages/core/src/commands/setContent.ts b/packages/core/src/commands/setContent.ts index 472c7ae5..4daf4260 100644 --- a/packages/core/src/commands/setContent.ts +++ b/packages/core/src/commands/setContent.ts @@ -1,19 +1,19 @@ import { Editor } from '../Editor' import { TextSelection } from 'prosemirror-state' +type SetContent = ( + content: string, + emitUpdate?: Boolean, + parseOptions?: any, +) => any + declare module '../Editor' { interface Editor { - setContent(content: string, emitUpdate?: Boolean, parseOptions?: any): Editor, + setContent: SetContent, } } -export default function setContent( - next: Function, - editor: Editor, - content = null, - emitUpdate = false, - parseOptions = {}, -): void { +export default (next: Function, editor: Editor): SetContent => (content, emitUpdate, parseOptions) => { if (content === null) { next() return diff --git a/packages/core/src/commands/toggleBlockType.ts b/packages/core/src/commands/toggleBlockType.ts index 7181e2bc..fb794580 100644 --- a/packages/core/src/commands/toggleBlockType.ts +++ b/packages/core/src/commands/toggleBlockType.ts @@ -3,19 +3,19 @@ import { setBlockType } from 'prosemirror-commands' import { Editor } from '../Editor' import nodeIsActive from '../utils/nodeIsActive' +type ToggleBlockType = ( + type: NodeType, + toggleType: NodeType, + attrs?: {} +) => any + declare module '../Editor' { interface Editor { - toggleBlockType(type: NodeType, toggleType: NodeType, attrs?: {}): Editor, + toggleBlockType: ToggleBlockType, } } -export default function toggleBlockType( - next: Function, - editor: Editor, - type: NodeType, - toggleType: NodeType, - attrs?: {}, -): void { +export default (next: Function, editor: Editor): ToggleBlockType => (type, toggleType, attrs) => { const { view, state } = editor const isActive = nodeIsActive(state, type, attrs) diff --git a/packages/extension-bold/index.ts b/packages/extension-bold/index.ts index 88d633f8..37f812ff 100644 --- a/packages/extension-bold/index.ts +++ b/packages/extension-bold/index.ts @@ -34,7 +34,7 @@ export default class Bold extends Mark { commands(): CommandSpec { return { - bold: (next, { view }) => { + bold: (next, { view }) => () => { toggleMark(this.type)(view.state, view.dispatch) next() }, diff --git a/packages/extension-code/index.ts b/packages/extension-code/index.ts index 821eccfc..28a365f6 100644 --- a/packages/extension-code/index.ts +++ b/packages/extension-code/index.ts @@ -25,7 +25,7 @@ export default class Code extends Mark { commands(): CommandSpec { return { - code: (next, { view }) => { + code: (next, { view }) => () => { toggleMark(this.type)(view.state, view.dispatch) next() }, diff --git a/packages/extension-heading/index.ts b/packages/extension-heading/index.ts index 3594b326..b5e200d9 100644 --- a/packages/extension-heading/index.ts +++ b/packages/extension-heading/index.ts @@ -47,8 +47,8 @@ export default class Heading extends Node { commands(): CommandSpec { return { - heading: (next, editor, attrs) => { - editor.toggleBlockType(this.type, editor.schema.nodes.paragraph, attrs) + heading: next => attrs => { + this.editor.toggleBlockType(this.type, this.editor.schema.nodes.paragraph, attrs) next() }, } diff --git a/packages/extension-history/index.ts b/packages/extension-history/index.ts index 57366277..911e0e1f 100644 --- a/packages/extension-history/index.ts +++ b/packages/extension-history/index.ts @@ -34,11 +34,11 @@ export default class History extends Extension { commands(): CommandSpec { return { - undo: (next, { view }) => { + undo: (next, { view }) => () => { undo(view.state, view.dispatch) next() }, - redo: (next, { view }) => { + redo: (next, { view }) => () => { redo(view.state, view.dispatch) next() }, diff --git a/packages/extension-italic/index.ts b/packages/extension-italic/index.ts index fd1acdf2..3e80965a 100644 --- a/packages/extension-italic/index.ts +++ b/packages/extension-italic/index.ts @@ -26,7 +26,7 @@ export default class Italic extends Mark { commands(): CommandSpec { return { - italic: (next, { view }) => { + italic: (next, { view }) => () => { toggleMark(this.type)(view.state, view.dispatch) next() },