summaryrefslogtreecommitdiff
path: root/packages/integrations/mdx/src
diff options
context:
space:
mode:
authorGravatar Ben Holmes <hey@bholmes.dev> 2022-08-11 12:36:34 -0500
committerGravatar GitHub <noreply@github.com> 2022-08-11 12:36:34 -0500
commit4116128082121ee276d51cb245bf8095be4728a1 (patch)
treecf5b82544feb3597443c2fb3bc4e164ed5a1c932 /packages/integrations/mdx/src
parent5afb5ef7af95f9245c1010d35aaf508d4989cb4a (diff)
downloadastro-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.ts36
-rw-r--r--packages/integrations/mdx/src/index.ts11
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: [