fix(build): compose markdown `preConfig` hook when extending configs

x-ref: #5205

Co-authored-by: Jonathan Doughty <jonathandoughty04@gmail.com>
pull/5328/head
Divyansh Singh 2 months ago
parent ef64198b4b
commit c39a85a2ac

@ -1,15 +1,18 @@
import type { MarkdownItAsync } from 'markdown-it-async' import type { MarkdownItAsync } from 'markdown-it-async'
import { mergeConfig } from 'node/config' import { mergeConfig, type UserConfig } from 'node/config'
describe('node/config', () => { describe('node/config', () => {
test('merges markdown config hooks from extended configs', async () => { test('merges markdown hooks from extended configs', async () => {
const calls: string[] = [] const calls: string[] = []
const md = {} as MarkdownItAsync const md = {} as MarkdownItAsync
const merged = mergeConfig( const merged = mergeConfig<UserConfig, UserConfig>(
{ {
markdown: { markdown: {
lineNumbers: true, lineNumbers: true,
preConfig() {
calls.push('base-pre')
},
config() { config() {
calls.push('base') calls.push('base')
} }
@ -20,6 +23,9 @@ describe('node/config', () => {
attrs: { attrs: {
allowedAttributes: ['id'] allowedAttributes: ['id']
}, },
async preConfig() {
calls.push('extended-pre')
},
async config() { async config() {
calls.push('extended') calls.push('extended')
} }
@ -32,8 +38,36 @@ describe('node/config', () => {
allowedAttributes: ['id'] allowedAttributes: ['id']
}) })
await merged.markdown?.preConfig?.(md)
await merged.markdown?.config?.(md)
expect(calls).toEqual(['base-pre', 'extended-pre', 'base', 'extended'])
})
test('keeps one-sided markdown hooks when the other config omits them', async () => {
const calls: string[] = []
const md = {} as MarkdownItAsync
const merged = mergeConfig<UserConfig, UserConfig>(
{
markdown: {
preConfig() {
calls.push('base-pre')
}
}
},
{
markdown: {
config() {
calls.push('extended')
}
}
}
)
await merged.markdown?.preConfig?.(md)
await merged.markdown?.config?.(md) await merged.markdown?.config?.(md)
expect(calls).toEqual(['base', 'extended']) expect(calls).toEqual(['base-pre', 'extended'])
}) })
}) })

@ -332,15 +332,22 @@ export function mergeConfig<A extends object, B extends object>(
function mergeMarkdownConfig(a: MarkdownOptions, b: MarkdownOptions) { function mergeMarkdownConfig(a: MarkdownOptions, b: MarkdownOptions) {
const merged = mergeConfig(a, b, false) const merged = mergeConfig(a, b, false)
const baseConfig = a.config merged.preConfig = mergeMarkdownHooks(a.preConfig, b.preConfig)
const extendedConfig = b.config merged.config = mergeMarkdownHooks(a.config, b.config)
if (baseConfig && extendedConfig) { return merged
merged.config = async (md) => { }
await baseConfig(md)
await extendedConfig(md) function mergeMarkdownHooks(
base: MarkdownOptions['config'],
extended: MarkdownOptions['config']
): MarkdownOptions['config'] {
if (!base || !extended) {
return base ?? extended
} }
return async (md) => {
await base(md)
await extended(md)
} }
return merged
} }
export async function resolveSiteData( export async function resolveSiteData(

Loading…
Cancel
Save