diff options
author | 2023-05-24 16:52:22 -0400 | |
---|---|---|
committer | 2023-05-24 16:52:22 -0400 | |
commit | 1efaef6be0265c68eac706623778e8ad23b33247 (patch) | |
tree | 3002f8ee7580157b7cb7df7e8741aa1c0b03448b /packages/integrations/markdoc/src/runtime.ts | |
parent | 7851f9258fae2f54795470253df9ce4bcd5f9cb0 (diff) | |
download | astro-1efaef6be0265c68eac706623778e8ad23b33247.tar.gz astro-1efaef6be0265c68eac706623778e8ad23b33247.tar.zst astro-1efaef6be0265c68eac706623778e8ad23b33247.zip |
Markdoc - Shiki (#7187)
* chore: remove unused util
* chore: changeset
* deps: shiki
* wip: first stab at shiki markdoc config
* feat: get shiki working!
* refactor: return HTML string directly from transform
* chore: move shiki to markdoc dev dep
* refactor: use async cache with clear docs on why
* test: transform units with Shiki config options
* refactor: switch to `extends` model
* refactor: nodes/ -> extensions/
* feat: raise friendly error for Promise extensions
* docs: README
* chore: lint
* chore: dead file
* chore: lowercase for fuzzy find please
* fix: bad ctx spread
* chore: clean up cache, add shiki imp error
* chore: add shiki to optional peer deps
* chore: hoist those consts
* docs: more explicit "install shiki now please"
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
* oops bad find and replace
* chore: update changeset
* nit: period haunts me
---------
Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
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, |