diff options
Diffstat (limited to 'packages/integrations/markdoc/src')
-rw-r--r-- | packages/integrations/markdoc/src/config.ts | 26 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/heading-ids.ts | 13 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/index.ts | 8 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/load-config.ts | 8 |
4 files changed, 38 insertions, 17 deletions
diff --git a/packages/integrations/markdoc/src/config.ts b/packages/integrations/markdoc/src/config.ts index 23ff744f7..2c2f2c677 100644 --- a/packages/integrations/markdoc/src/config.ts +++ b/packages/integrations/markdoc/src/config.ts @@ -1,12 +1,26 @@ -import type { ConfigType as MarkdocConfig } from '@markdoc/markdoc'; +import type { AstroInstance } from 'astro'; +import type { + ConfigType as MarkdocConfig, + Config, + NodeType, + Schema, + MaybePromise, +} from '@markdoc/markdoc'; import _Markdoc from '@markdoc/markdoc'; import { heading } from './heading-ids.js'; -export type AstroMarkdocConfig<C extends Record<string, any> = Record<string, any>> = - MarkdocConfig & { - ctx?: C; - extends?: ResolvedAstroMarkdocConfig[]; - }; +type Render = AstroInstance['default'] | string; + +export type AstroMarkdocConfig<C extends Record<string, any> = Record<string, any>> = Omit< + MarkdocConfig, + 'tags' | 'nodes' +> & + Partial<{ + tags: Record<string, Schema<Config, Render>>; + nodes: Partial<Record<NodeType, Schema<Config, Render>>>; + ctx: C; + extends: MaybePromise<ResolvedAstroMarkdocConfig>[]; + }>; export type ResolvedAstroMarkdocConfig = Omit<AstroMarkdocConfig, 'extends'>; diff --git a/packages/integrations/markdoc/src/heading-ids.ts b/packages/integrations/markdoc/src/heading-ids.ts index 5e54af9a7..41773250e 100644 --- a/packages/integrations/markdoc/src/heading-ids.ts +++ b/packages/integrations/markdoc/src/heading-ids.ts @@ -1,6 +1,9 @@ -import Markdoc, { type RenderableTreeNode, type Schema } from '@markdoc/markdoc'; +import Markdoc, { + type RenderableTreeNode, + type Schema, + type Config as MarkdocConfig, +} from '@markdoc/markdoc'; import Slugger from 'github-slugger'; -import type { AstroMarkdocConfig } from './config.js'; import { getTextContent } from './runtime.js'; import { MarkdocError } from './utils.js'; @@ -19,9 +22,9 @@ function getSlug( return slug; } -type HeadingIdConfig = AstroMarkdocConfig<{ - headingSlugger: Slugger; -}>; +type HeadingIdConfig = MarkdocConfig & { + ctx: { headingSlugger: Slugger }; +}; /* Expose standalone node for users to import in their config. diff --git a/packages/integrations/markdoc/src/index.ts b/packages/integrations/markdoc/src/index.ts index c2d3e8734..781ae392e 100644 --- a/packages/integrations/markdoc/src/index.ts +++ b/packages/integrations/markdoc/src/index.ts @@ -1,5 +1,5 @@ /* eslint-disable no-console */ -import type { Node } from '@markdoc/markdoc'; +import type { Config as MarkdocConfig, Node } from '@markdoc/markdoc'; import Markdoc from '@markdoc/markdoc'; import type { AstroConfig, AstroIntegration, ContentEntryType, HookParameters } from 'astro'; import fs from 'node:fs'; @@ -85,7 +85,11 @@ export default function markdocIntegration(legacyConfig?: any): AstroIntegration const filePath = fileURLToPath(fileUrl); - const validationErrors = Markdoc.validate(ast, markdocConfig).filter((e) => { + const validationErrors = Markdoc.validate( + ast, + /* Raised generics issue with Markdoc core https://github.com/markdoc/markdoc/discussions/400 */ + markdocConfig as MarkdocConfig + ).filter((e) => { return ( // Ignore `variable-undefined` errors. // Variables can be configured at runtime, diff --git a/packages/integrations/markdoc/src/load-config.ts b/packages/integrations/markdoc/src/load-config.ts index 4a8b2f9cd..e04cc441b 100644 --- a/packages/integrations/markdoc/src/load-config.ts +++ b/packages/integrations/markdoc/src/load-config.ts @@ -1,8 +1,8 @@ -import type { Config as MarkdocConfig } from '@markdoc/markdoc'; import type { AstroConfig } from 'astro'; import { build as esbuild } from 'esbuild'; import * as fs from 'node:fs'; import { fileURLToPath } from 'node:url'; +import type { AstroMarkdocConfig } from './config.js'; const SUPPORTED_MARKDOC_CONFIG_FILES = [ 'markdoc.config.js', @@ -12,7 +12,7 @@ const SUPPORTED_MARKDOC_CONFIG_FILES = [ ]; export type MarkdocConfigResult = { - config: MarkdocConfig; + config: AstroMarkdocConfig; fileUrl: URL; }; @@ -33,7 +33,7 @@ export async function loadMarkdocConfig( markdocConfigUrl, astroConfig, }); - const config: MarkdocConfig = await loadConfigFromBundledFile(astroConfig.root, code); + const config: AstroMarkdocConfig = await loadConfigFromBundledFile(astroConfig.root, code); return { config, @@ -93,7 +93,7 @@ async function bundleConfigFile({ * with ESM only * @see https://github.com/vitejs/vite/blob/main/packages/vite/src/node/config.ts#L1074 */ -async function loadConfigFromBundledFile(root: URL, code: string): Promise<MarkdocConfig> { +async function loadConfigFromBundledFile(root: URL, code: string): Promise<AstroMarkdocConfig> { // Write it to disk, load it with native Node ESM, then delete the file. const tmpFileUrl = new URL(`markdoc.config.timestamp-${Date.now()}.mjs`, root); fs.writeFileSync(tmpFileUrl, code); |