diff options
author | 2022-08-11 12:36:34 -0500 | |
---|---|---|
committer | 2022-08-11 12:36:34 -0500 | |
commit | 4116128082121ee276d51cb245bf8095be4728a1 (patch) | |
tree | cf5b82544feb3597443c2fb3bc4e164ed5a1c932 /packages/integrations/mdx/src | |
parent | 5afb5ef7af95f9245c1010d35aaf508d4989cb4a (diff) | |
download | astro-4116128082121ee276d51cb245bf8095be4728a1.tar.gz astro-4116128082121ee276d51cb245bf8095be4728a1.tar.zst astro-4116128082121ee276d51cb245bf8095be4728a1.zip |
[MDX] Pass injected frontmatter to layouts (#4255)
* fix: move layout generation to remark plugin
* test: frontmatter injection in layout
* chore: changeset
* fix: remove content fallback
Diffstat (limited to 'packages/integrations/mdx/src')
-rw-r--r-- | packages/integrations/mdx/src/astro-data-utils.ts | 36 | ||||
-rw-r--r-- | packages/integrations/mdx/src/index.ts | 11 |
2 files changed, 37 insertions, 10 deletions
diff --git a/packages/integrations/mdx/src/astro-data-utils.ts b/packages/integrations/mdx/src/astro-data-utils.ts index fdad15b8f..0bc375c27 100644 --- a/packages/integrations/mdx/src/astro-data-utils.ts +++ b/packages/integrations/mdx/src/astro-data-utils.ts @@ -19,6 +19,42 @@ export function rehypeApplyFrontmatterExport(pageFrontmatter: Record<string, any const exportNodes = [ jsToTreeNode(`export const ${EXPORT_NAME} = ${JSON.stringify(frontmatter)};`), ]; + if (frontmatter.layout) { + exportNodes.unshift( + jsToTreeNode( + /** @see 'vite-plugin-markdown' for layout props reference */ + `import { jsx as layoutJsx } from 'astro/jsx-runtime'; + import Layout from ${JSON.stringify(frontmatter.layout)}; + + export default function ({ children }) { + const { layout, ...content } = frontmatter; + content.astro = {}; + Object.defineProperty(content.astro, 'headings', { + get() { + throw new Error('The "astro" property is no longer supported! To access "headings" from your layout, try using "Astro.props.headings."') + } + }); + Object.defineProperty(content.astro, 'html', { + get() { + throw new Error('The "astro" property is no longer supported! To access "html" from your layout, try using "Astro.props.compiledContent()."') + } + }); + Object.defineProperty(content.astro, 'source', { + get() { + throw new Error('The "astro" property is no longer supported! To access "source" from your layout, try using "Astro.props.rawContent()."') + } + }); + return layoutJsx(Layout, { + content, + frontmatter: content, + headings: getHeadings(), + 'server:root': true, + children, + }); + };` + ) + ); + } tree.children = exportNodes.concat(tree.children); }; } diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 05b803705..f92a10a53 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -98,16 +98,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { async transform(code, id) { if (!id.endsWith('mdx')) return; - let { data: frontmatter, content: pageContent } = parseFrontmatter(code, id); - if (frontmatter.layout) { - const { layout, ...contentProp } = frontmatter; - pageContent += `\n\nexport default async function({ children }) {\nconst Layout = (await import(${JSON.stringify( - frontmatter.layout - )})).default;\nconst frontmatter=${JSON.stringify( - contentProp - )};\nreturn <Layout frontmatter={frontmatter} content={frontmatter} headings={getHeadings()}>{children}</Layout> }`; - } - + const { data: frontmatter, content: pageContent } = parseFrontmatter(code, id); const compiled = await mdxCompile(new VFile({ value: pageContent, path: id }), { ...mdxPluginOpts, rehypePlugins: [ |