summaryrefslogtreecommitdiff
path: root/packages/integrations/mdx/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/mdx/src/index.ts')
-rw-r--r--packages/integrations/mdx/src/index.ts66
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,