From dca42879e4839c001b1260d17d219f68b6d973b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Wed, 9 Sep 2020 21:06:57 +0200 Subject: [PATCH] refactoring --- packages/core/src/ExtensionManager.ts | 78 +++++-------------- .../core/src/utils/resolveExtensionConfig.ts | 35 +++++++++ 2 files changed, 53 insertions(+), 60 deletions(-) create mode 100644 packages/core/src/utils/resolveExtensionConfig.ts diff --git a/packages/core/src/ExtensionManager.ts b/packages/core/src/ExtensionManager.ts index 3ee1cdc6..cb4917b9 100644 --- a/packages/core/src/ExtensionManager.ts +++ b/packages/core/src/ExtensionManager.ts @@ -10,6 +10,7 @@ import Extension from './Extension' import Node from './Node' import Mark from './Mark' import capitalize from './utils/capitalize' +import resolveExtensionConfig from './utils/resolveExtensionConfig' type Extensions = (Extension | Node | Mark)[] @@ -23,17 +24,25 @@ export default class ExtensionManager { this.extensions = extensions this.extensions.forEach(extension => { - this.resolveConfig(extension, 'name') - this.resolveConfig(extension, 'defaults') - this.resolveConfig(extension, 'topNode') - this.resolveConfig(extension, 'schema', ['name', 'options']) + resolveExtensionConfig(extension, 'name') + resolveExtensionConfig(extension, 'defaults') + resolveExtensionConfig(extension, 'topNode') + + const name = extension.config.name + const options = deepmerge(extension.config.defaults, extension.options) + + resolveExtensionConfig(extension, 'schema', { name, options }) editor.on('schemaCreated', () => { - this.resolveConfig(extension, 'commands', ['name', 'options', 'editor', 'type']) - this.resolveConfig(extension, 'inputRules', ['name', 'options', 'editor', 'type']) - this.resolveConfig(extension, 'pasteRules', ['name', 'options', 'editor', 'type']) - this.resolveConfig(extension, 'keys', ['name', 'options', 'editor', 'type']) - this.resolveConfig(extension, 'plugins', ['name', 'options', 'editor', 'type']) + const type = extension.type === 'node' + ? this.editor.schema.nodes[extension.config.name] + : this.editor.schema.marks[extension.config.name] + + resolveExtensionConfig(extension, 'commands', { name, options, editor, type }) + resolveExtensionConfig(extension, 'inputRules', { name, options, editor, type }) + resolveExtensionConfig(extension, 'pasteRules', { name, options, editor, type }) + resolveExtensionConfig(extension, 'keys', { name, options, editor, type }) + resolveExtensionConfig(extension, 'plugins', { name, options, editor, type }) if (extension.config.commands) { this.editor.registerCommands(extension.config.commands) @@ -42,57 +51,6 @@ export default class ExtensionManager { }) } - resolveConfig( - extension: Extension | Node | Mark, - name: string, - propValues: ('name' | 'options' | 'editor' | 'type')[] = [] - ) { - if (!extension.configs[name]) { - return - } - - extension.config[name] = extension.configs[name] - .reduce((accumulator, { stategy, value: rawValue }) => { - const props: any = {} - - if (propValues.includes('name')) { - props.name = extension.config.name - } - - if (propValues.includes('options')) { - props.options = deepmerge(extension.config.defaults, extension.options) - } - - if (propValues.includes('editor')) { - props.editor = this.editor - } - - if (propValues.includes('type')) { - props.type = extension.type === 'node' - ? this.editor.schema.nodes[extension.config.name] - : this.editor.schema.marks[extension.config.name] - } - - const value = typeof rawValue === 'function' - ? rawValue(props) - : rawValue - - if (accumulator === undefined) { - return value - } - - if (stategy === 'overwrite') { - return value - } - - if (stategy === 'extend') { - return deepmerge(accumulator, value) - } - - return accumulator - }, undefined) - } - get topNode() { const topNode = collect(this.extensions).firstWhere('config.topNode', true) diff --git a/packages/core/src/utils/resolveExtensionConfig.ts b/packages/core/src/utils/resolveExtensionConfig.ts new file mode 100644 index 00000000..384e0268 --- /dev/null +++ b/packages/core/src/utils/resolveExtensionConfig.ts @@ -0,0 +1,35 @@ +import deepmerge from 'deepmerge' +import Extension from '../Extension' +import Node from '../Node' +import Mark from '../Mark' + +export default function resolveExtensionConfig( + extension: Extension | Node | Mark, + name: string, + props = {}, +): void { + if (!extension.configs[name]) { + return + } + + extension.config[name] = extension.configs[name] + .reduce((accumulator, { stategy, value: rawValue }) => { + const value = typeof rawValue === 'function' + ? rawValue(props) + : rawValue + + if (accumulator === undefined) { + return value + } + + if (stategy === 'overwrite') { + return value + } + + if (stategy === 'extend') { + return deepmerge(accumulator, value) + } + + return accumulator + }, undefined) +} \ No newline at end of file