From dc98409babb758be6e1c9d1189967a4530d730a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Wed, 1 Apr 2020 21:15:23 +0200 Subject: [PATCH] add custom event emitter --- packages/core/package.json | 1 - packages/core/src/Editor.ts | 6 +++-- packages/core/src/EventEmitter.ts | 42 +++++++++++++++++++++++++++++++ yarn.lock | 2 +- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/EventEmitter.ts diff --git a/packages/core/package.json b/packages/core/package.json index beea0d0f..66a9f78d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -15,7 +15,6 @@ "@types/prosemirror-dropcursor": "^1.0.0", "@types/prosemirror-gapcursor": "^1.0.1", "collect.js": "^4.20.3", - "events": "^3.1.0", "prosemirror-commands": "^1.1.3", "prosemirror-dropcursor": "^1.3.2", "prosemirror-gapcursor": "^1.1.4", diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index db6362c8..33ba50b1 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -1,4 +1,3 @@ -import { EventEmitter } from 'events' import { EditorState, TextSelection } from 'prosemirror-state' import { EditorView} from 'prosemirror-view' import { Schema, DOMParser, DOMSerializer } from 'prosemirror-model' @@ -19,6 +18,7 @@ import getSchemaTypeByName from './utils/getSchemaTypeByName' import ExtensionManager from './ExtensionManager' import Extension from './Extension' import Node from './Node' +import EventEmitter from './EventEmitter' type EditorContent = string | JSON | null type Command = (next: Function, editor: Editor, ...args: any) => any @@ -73,7 +73,9 @@ export class Editor extends EventEmitter { const command = this.commands[name] if (!command) { - throw new Error(`tiptap: command '${name}' not found.`) + // TODO: prevent vue devtools to throw error + // throw new Error(`tiptap: command '${name}' not found.`) + return } return (...args: any) => command(...args) diff --git a/packages/core/src/EventEmitter.ts b/packages/core/src/EventEmitter.ts new file mode 100644 index 00000000..f15c81ce --- /dev/null +++ b/packages/core/src/EventEmitter.ts @@ -0,0 +1,42 @@ +export default class EventEmitter { + + _callbacks: { [key: string]: Function[] } = {} + + on(event: string, fn: Function) { + if (!this._callbacks[event]) { + this._callbacks[event] = [] + } + + this._callbacks[event].push(fn) + + return this + } + + emit(event: string, ...args: any) { + const callbacks = this._callbacks[event] + + if (callbacks) { + callbacks.forEach(callback => callback.apply(this, args)) + } + + return this + } + + off(event: string, fn?: Function) { + const callbacks = this._callbacks[event] + + if (callbacks) { + if (fn) { + this._callbacks[event] = callbacks.filter(callback => callback !== fn) + } else { + delete this._callbacks[event] + } + } + + return this + } + + removeAllListeners() { + this._callbacks = {} + } +} diff --git a/yarn.lock b/yarn.lock index 6c4199f8..adbb67ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5541,7 +5541,7 @@ eventemitter3@^3.1.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== -events@^3.0.0, events@^3.1.0: +events@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==