diff --git a/.changeset/warm-socks-exercise.md b/.changeset/warm-socks-exercise.md new file mode 100644 index 000000000..f77694313 --- /dev/null +++ b/.changeset/warm-socks-exercise.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Add rawContent and compiledContent to MD layout props diff --git a/packages/astro/src/vite-plugin-markdown/index.ts b/packages/astro/src/vite-plugin-markdown/index.ts index 3279e573c..d025d669d 100644 --- a/packages/astro/src/vite-plugin-markdown/index.ts +++ b/packages/astro/src/vite-plugin-markdown/index.ts @@ -92,10 +92,28 @@ export default function markdown({ config, logging }: AstroPluginOptions): Plugi 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()."') + } + }); const contentFragment = h(Fragment, { 'set:html': html }); return ${ layout - ? `h(Layout, { content, frontmatter: content, headings: getHeadings(), 'server:root': true, children: contentFragment })` + ? `h(Layout, { + content, + frontmatter: content, + headings: getHeadings(), + rawContent, + compiledContent, + 'server:root': true, + children: contentFragment + })` : `contentFragment` }; } diff --git a/packages/astro/test/astro-markdown.test.js b/packages/astro/test/astro-markdown.test.js index cf0e7a0ac..c326bb548 100644 --- a/packages/astro/test/astro-markdown.test.js +++ b/packages/astro/test/astro-markdown.test.js @@ -89,6 +89,28 @@ describe('Astro Markdown', () => { expect(headingSlugs).to.contain('section-2'); }); + it('Passes compiled content to layout via "compiledContent" prop', async () => { + const html = await fixture.readFile('/with-layout/index.html'); + const $ = cheerio.load(html); + + const compiledContent = $('[data-compiled-content]'); + + expect(fixLineEndings(compiledContent.text()).trim()).to.equal( + `
{content.title}
{frontmatter.title}
+{compiledContent()}
+{rawContent()}
Layout rendered!