summaryrefslogtreecommitdiff
path: root/packages/integrations/markdoc/src/runtime.ts
diff options
context:
space:
mode:
authorGravatar Ben Holmes <hey@bholmes.dev> 2023-05-24 16:52:22 -0400
committerGravatar GitHub <noreply@github.com> 2023-05-24 16:52:22 -0400
commit1efaef6be0265c68eac706623778e8ad23b33247 (patch)
tree3002f8ee7580157b7cb7df7e8741aa1c0b03448b /packages/integrations/markdoc/src/runtime.ts
parent7851f9258fae2f54795470253df9ce4bcd5f9cb0 (diff)
downloadastro-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.ts44
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,