summaryrefslogtreecommitdiff
path: root/packages/integrations/markdoc/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/markdoc/src')
-rw-r--r--packages/integrations/markdoc/src/config.ts26
-rw-r--r--packages/integrations/markdoc/src/heading-ids.ts13
-rw-r--r--packages/integrations/markdoc/src/index.ts8
-rw-r--r--packages/integrations/markdoc/src/load-config.ts8
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);