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,17 +332,24 @@ 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) {
merged.config = async (md) => {
await baseConfig(md)
await extendedConfig(md)
}
}
return merged return merged
} }
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)
}
}
export async function resolveSiteData( export async function resolveSiteData(
root: string, root: string,
userConfig?: UserConfig, userConfig?: UserConfig,

Loading…
Cancel
Save