feat: add parentConfig to extension context for more extendable extensions, fix #259
This commit is contained in:
21
packages/core/src/helpers/createExtensionContext.ts
Normal file
21
packages/core/src/helpers/createExtensionContext.ts
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user