feat: add parentConfig to extension context for more extendable extensions, fix #259

This commit is contained in:
Philipp Kühn
2021-04-12 11:11:02 +02:00
parent 8090bc63c1
commit 5e1ec5d2a6
12 changed files with 218 additions and 42 deletions

View File

@@ -0,0 +1,21 @@
import { AnyExtension, AnyObject } from '../types'
export default function createExtensionContext<T>(
extension: AnyExtension,
data: T,
): T & { parentConfig: AnyObject } {
const context = {
...data,
get parentConfig() {
return Object.fromEntries(Object.entries(extension.parentConfig).map(([key, value]) => {
if (typeof value !== 'function') {
return [key, value]
}
return [key, value.bind(context)]
}))
},
}
return context
}

View File

@@ -1,3 +1,4 @@
import createExtensionContext from './createExtensionContext'
import splitExtensions from './splitExtensions'
import {
Extensions,
@@ -24,9 +25,9 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
}
extensions.forEach(extension => {
const context = {
const context = createExtensionContext(extension, {
options: extension.options,
}
})
if (!extension.config.addGlobalAttributes) {
return
@@ -53,9 +54,9 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
})
nodeAndMarkExtensions.forEach(extension => {
const context = {
const context = createExtensionContext(extension, {
options: extension.options,
}
})
if (!extension.config.addAttributes) {
return

View File

@@ -1,6 +1,7 @@
import { NodeSpec, MarkSpec, Schema } from 'prosemirror-model'
import { Extensions } from '../types'
import { ExtensionConfig, NodeConfig, MarkConfig } from '..'
import createExtensionContext from './createExtensionContext'
import splitExtensions from './splitExtensions'
import getAttributesFromExtensions from './getAttributesFromExtensions'
import getRenderedAttributes from './getRenderedAttributes'
@@ -45,7 +46,9 @@ export default function getSchema(extensions: Extensions): Schema {
const nodes = Object.fromEntries(nodeExtensions.map(extension => {
const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.config.name)
const context = { options: extension.options }
const context = createExtensionContext(extension, {
options: extension.options,
})
const extraNodeFields = nodeSchemaExtenders.reduce((fields, nodeSchemaExtender) => {
const extraFields = callOrReturn(nodeSchemaExtender, context, extension)
@@ -91,7 +94,9 @@ export default function getSchema(extensions: Extensions): Schema {
const marks = Object.fromEntries(markExtensions.map(extension => {
const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.config.name)
const context = { options: extension.options }
const context = createExtensionContext(extension, {
options: extension.options,
})
const extraMarkFields = markSchemaExtenders.reduce((fields, markSchemaExtender) => {
const extraFields = callOrReturn(markSchemaExtender, context, extension)