import { Plugin } from 'prosemirror-state' import { Editor } from './Editor' import { GlobalAttributes } from './types' export interface ExtensionSpec { /** * Name */ name?: string, /** * Default options */ defaultOptions?: Options, /** * Global attributes */ addGlobalAttributes?: (this: { options: Options, }) => GlobalAttributes, /** * Commands */ addCommands?: (this: { options: Options, editor: Editor, }) => Commands, /** * Keyboard shortcuts */ addKeyboardShortcuts?: (this: { options: Options, editor: Editor, }) => { [key: string]: any }, /** * Input rules */ addInputRules?: (this: { options: Options, editor: Editor, }) => any[], /** * Paste rules */ addPasteRules?: (this: { options: Options, editor: Editor, }) => any[], /** * ProseMirror plugins */ addProseMirrorPlugins?: (this: { options: Options, editor: Editor, }) => Plugin[], } // /** // * Extension interface for internal usage // */ // export type Extension = Required & { // type: string, // options: { // [key: string]: any // }, // }> // /** // * Default extension // */ // export const defaultExtension: Extension = { // name: 'extension', // type: 'extension', // options: {}, // addGlobalAttributes: () => [], // addCommands: () => ({}), // addKeyboardShortcuts: () => ({}), // addInputRules: () => [], // addPasteRules: () => [], // addProseMirrorPlugins: () => [], // } // export function createExtension(config: ExtensionSpec) { // const extend = (extendedConfig: Partial>) => { // return createExtension({ // ...config, // ...extendedConfig, // } as ExtensionSpec) // } // const setOptions = (options?: Partial) => { // const { defaultOptions, ...rest } = config // return { // ...defaultExtension, // ...rest, // options: { // ...defaultOptions, // ...options, // } as Options, // } // } // return Object.assign(setOptions, { config, extend }) // } export class Extension { config: Required = { name: 'extension', defaultOptions: {}, addGlobalAttributes: () => [], addCommands: () => ({}), addKeyboardShortcuts: () => ({}), addInputRules: () => [], addPasteRules: () => [], addProseMirrorPlugins: () => [], } options!: Options constructor(config: ExtensionSpec) { this.config = { ...this.config, ...config, } this.options = this.config.defaultOptions } static create(config: ExtensionSpec) { return new Extension(config) } set(options: Options) { this.options = { ...this.config.defaultOptions, ...options, } } extend(extendedConfig: Partial>) { return new Extension({ ...this.config, ...extendedConfig, } as ExtensionSpec) } }