diff options
Diffstat (limited to 'packages/integrations/markdoc/src/runtime.ts')
-rw-r--r-- | packages/integrations/markdoc/src/runtime.ts | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/packages/integrations/markdoc/src/runtime.ts b/packages/integrations/markdoc/src/runtime.ts index 3164cda13..4c5614b56 100644 --- a/packages/integrations/markdoc/src/runtime.ts +++ b/packages/integrations/markdoc/src/runtime.ts @@ -1,32 +1,56 @@ import type { MarkdownHeading } from '@astrojs/markdown-remark'; -import Markdoc, { - type ConfigType as MarkdocConfig, - type RenderableTreeNode, -} from '@markdoc/markdoc'; +import Markdoc, { type RenderableTreeNode } from '@markdoc/markdoc'; import type { ContentEntryModule } from 'astro'; -import { setupHeadingConfig } from './nodes/index.js'; +import { setupHeadingConfig } from './heading-ids.js'; +import type { AstroMarkdocConfig } from './config.js'; +import { MarkdocError } from './utils.js'; /** Used to call `Markdoc.transform()` and `Markdoc.Ast` in runtime modules */ export { default as Markdoc } from '@markdoc/markdoc'; /** * Merge user config with default config and set up context (ex. heading ID slugger) - * Called on each file's individual transform + * Called on each file's individual transform. + * TODO: virtual module to merge configs per-build instead of per-file? */ -export function setupConfig(userConfig: MarkdocConfig, entry: ContentEntryModule): MarkdocConfig { - const defaultConfig: MarkdocConfig = { - // `setupXConfig()` could become a "plugin" convention as well? +export function setupConfig( + userConfig: AstroMarkdocConfig, + entry: ContentEntryModule, + markdocConfigPath?: string +): Omit<AstroMarkdocConfig, 'extends'> { + let defaultConfig: AstroMarkdocConfig = { ...setupHeadingConfig(), variables: { entry }, }; + + if (userConfig.extends) { + for (const extension of userConfig.extends) { + if (extension instanceof Promise) { + throw new MarkdocError({ + message: 'An extension passed to `extends` in your markdoc config returns a Promise.', + hint: 'Call `await` for async extensions. Example: `extends: [await myExtension()]`', + location: { + file: markdocConfigPath, + }, + }); + } + + defaultConfig = mergeConfig(defaultConfig, extension); + } + } + return mergeConfig(defaultConfig, userConfig); } /** Merge function from `@markdoc/markdoc` internals */ -function mergeConfig(configA: MarkdocConfig, configB: MarkdocConfig): MarkdocConfig { +function mergeConfig(configA: AstroMarkdocConfig, configB: AstroMarkdocConfig): AstroMarkdocConfig { return { ...configA, ...configB, + ctx: { + ...configA.ctx, + ...configB.ctx, + }, tags: { ...configA.tags, ...configB.tags, |