diff --git a/packages/tiptap/src/Editor.js b/packages/tiptap/src/Editor.js index 36df54ab..053e3b24 100644 --- a/packages/tiptap/src/Editor.js +++ b/packages/tiptap/src/Editor.js @@ -67,6 +67,10 @@ export default class Editor { view: this.view, state: this.state, }) + + // give extension manager access to our view and state + this.extensions.state = this.state + this.extensions.view = this.view } setOptions(options) { diff --git a/packages/tiptap/src/Utils/Extension.js b/packages/tiptap/src/Utils/Extension.js index 92461dbe..d6579eef 100644 --- a/packages/tiptap/src/Utils/Extension.js +++ b/packages/tiptap/src/Utils/Extension.js @@ -15,6 +15,10 @@ export default class Extension { return 'extension' } + get update() { + return () => {} + } + get defaultOptions() { return {} } diff --git a/packages/tiptap/src/Utils/ExtensionManager.js b/packages/tiptap/src/Utils/ExtensionManager.js index 2ced93f4..b5cce07b 100644 --- a/packages/tiptap/src/Utils/ExtensionManager.js +++ b/packages/tiptap/src/Utils/ExtensionManager.js @@ -15,6 +15,28 @@ export default class ExtensionManager { }), {}) } + get options() { + const { state, view } = this + return this.extensions + // { name, options, update = () => {} } + .reduce((nodes, extension) => ({ + ...nodes, + [extension.name]: new Proxy(extension.options, { + set(obj, prop, value) { + const changed = (obj[prop] !== value) + + obj[prop] = value + + if (changed) { + extension.update({ state, view }) + } + + return true + }, + }), + }), {}) + } + get marks() { return this.extensions .filter(extension => extension.type === 'mark')