diff options
Diffstat (limited to 'packages/integrations/mdx/src/index.ts')
-rw-r--r-- | packages/integrations/mdx/src/index.ts | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 901ffb6bd..3e9cc945c 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -3,14 +3,15 @@ import { toRemarkInitializeAstroData } from '@astrojs/markdown-remark/dist/inter import { compile as mdxCompile } from '@mdx-js/mdx'; import { PluggableList } from '@mdx-js/mdx/lib/core.js'; import mdxPlugin, { Options as MdxRollupPluginOptions } from '@mdx-js/rollup'; -import type { AstroIntegration } from 'astro'; +import type { AstroIntegration, ContentEntryType, HookParameters } from 'astro'; import { parse as parseESM } from 'es-module-lexer'; import fs from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; import type { Options as RemarkRehypeOptions } from 'remark-rehype'; import { VFile } from 'vfile'; import type { Plugin as VitePlugin } from 'vite'; import { getRehypePlugins, getRemarkPlugins, recmaInjectImportMetaEnvPlugin } from './plugins.js'; -import { getFileInfo, parseFrontmatter } from './utils.js'; +import { getFileInfo, parseFrontmatter, ignoreStringPlugins } from './utils.js'; export type MdxOptions = Omit<typeof markdownConfigDefaults, 'remarkPlugins' | 'rehypePlugins'> & { extendMarkdownConfig: boolean; @@ -22,19 +23,54 @@ export type MdxOptions = Omit<typeof markdownConfigDefaults, 'remarkPlugins' | ' remarkRehype: RemarkRehypeOptions; }; -export default function mdx(partialMdxOptions: Partial<MdxOptions> = {}): AstroIntegration { + +type IntegrationWithPrivateHooks = { + name: string; + hooks: Omit<AstroIntegration['hooks'], 'astro:config:setup'> & { + 'astro:config:setup': (params: HookParameters<'astro:config:setup'> & { + // `addPageExtension` and `contentEntryType` are not a public APIs + // Add type defs here + addPageExtension: (extension: string) => void + addContentEntryType: (contentEntryType: ContentEntryType) => void + }) => void | Promise<void>; + }; +}; + +export default function mdx(partialMdxOptions: Partial<MdxOptions> = {}): IntegrationWithPrivateHooks { return { name: '@astrojs/mdx', hooks: { - 'astro:config:setup': async ({ updateConfig, config, addPageExtension, command }: any) => { + 'astro:config:setup': async ({ + updateConfig, + config, + addPageExtension, + addContentEntryType, + command, + }) => { addPageExtension('.mdx'); + addContentEntryType({ + extensions: ['.mdx'], + async getEntryInfo({ fileUrl, contents }: { fileUrl: URL; contents: string }) { + const parsed = parseFrontmatter(contents, fileURLToPath(fileUrl)); + return { + data: parsed.data, + body: parsed.content, + slug: parsed.data.slug, + rawData: parsed.matter, + }; + }, + contentModuleTypes: await fs.readFile( + new URL('../template/content-module-types.d.ts', import.meta.url), + 'utf-8' + ), + }); const extendMarkdownConfig = - partialMdxOptions.extendMarkdownConfig ?? defaultOptions.extendMarkdownConfig; + partialMdxOptions.extendMarkdownConfig ?? defaultMdxOptions.extendMarkdownConfig; const mdxOptions = applyDefaultOptions({ options: partialMdxOptions, - defaults: extendMarkdownConfig ? config.markdown : defaultOptions, + defaults: markdownConfigToMdxOptions(extendMarkdownConfig ? config.markdown : markdownConfigDefaults), }); const mdxPluginOpts: MdxRollupPluginOptions = { @@ -149,14 +185,20 @@ export default function mdx(partialMdxOptions: Partial<MdxOptions> = {}): AstroI }; } -const defaultOptions: MdxOptions = { - ...markdownConfigDefaults, +const defaultMdxOptions = { extendMarkdownConfig: true, recmaPlugins: [], - remarkPlugins: [], - rehypePlugins: [], - remarkRehype: {}, -}; +} + +function markdownConfigToMdxOptions(markdownConfig: typeof markdownConfigDefaults): MdxOptions { + return { + ...defaultMdxOptions, + ...markdownConfig, + remarkPlugins: ignoreStringPlugins(markdownConfig.remarkPlugins), + rehypePlugins: ignoreStringPlugins(markdownConfig.rehypePlugins), + remarkRehype: markdownConfig.remarkRehype as any ?? {}, + }; +} function applyDefaultOptions({ options, |