diff options
Diffstat (limited to 'packages/integrations/markdoc')
-rw-r--r-- | packages/integrations/markdoc/README.md | 31 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/index.ts | 15 | ||||
-rw-r--r-- | packages/integrations/markdoc/src/runtime.ts | 8 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/fixtures/variables/astro.config.mjs (renamed from packages/integrations/markdoc/test/fixtures/entry-prop/astro.config.mjs) | 0 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/fixtures/variables/package.json (renamed from packages/integrations/markdoc/test/fixtures/entry-prop/package.json) | 2 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/fixtures/variables/src/content/blog/entry.mdoc (renamed from packages/integrations/markdoc/test/fixtures/entry-prop/src/content/blog/entry.mdoc) | 0 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/fixtures/variables/src/content/config.ts (renamed from packages/integrations/markdoc/test/fixtures/entry-prop/src/content/config.ts) | 0 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/fixtures/variables/src/pages/index.astro (renamed from packages/integrations/markdoc/test/fixtures/entry-prop/src/pages/index.astro) | 2 | ||||
-rw-r--r-- | packages/integrations/markdoc/test/variables.test.js (renamed from packages/integrations/markdoc/test/entry-prop.test.js) | 4 |
9 files changed, 33 insertions, 29 deletions
diff --git a/packages/integrations/markdoc/README.md b/packages/integrations/markdoc/README.md index 011f042ee..da5aeb46a 100644 --- a/packages/integrations/markdoc/README.md +++ b/packages/integrations/markdoc/README.md @@ -290,20 +290,6 @@ export default defineMarkdocConfig({ }) ``` -### Access frontmatter and content collection information from your templates - -You can access content collection information from your Markdoc templates using the `$entry` variable. This includes the entry `slug`, `collection` name, and frontmatter `data` parsed by your content collection schema (if any). This example renders the `title` frontmatter property as a heading: - -```md ---- -title: Welcome to Markdoc 👋 ---- - -# {% $entry.data.title %} -``` - -The `$entry` object matches [the `CollectionEntry` type](https://docs.astro.build/en/reference/api-reference/#collection-entry-type), excluding the `.render()` property. - ### Markdoc config The `markdoc.config.mjs|ts` file accepts [all Markdoc configuration options](https://markdoc.dev/docs/config), including [tags](https://markdoc.dev/docs/tags) and [functions](https://markdoc.dev/docs/functions). @@ -379,6 +365,23 @@ export default defineMarkdocConfig({ }) ``` +### Access frontmatter from your Markdoc content + +To access frontmatter, you can pass the entry `data` property [as a variable](#pass-markdoc-variables) where you render your content: + +```astro +--- +import { getEntry } from 'astro:content'; + +const entry = await getEntry('docs', 'why-markdoc'); +const { Content } = await entry.render(); +--- + +<Content frontmatter={entry.data} /> +``` + +This can now be accessed as `$frontmatter` in your Markdoc. + ## Examples * The [Astro Markdoc starter template](https://github.com/withastro/astro/tree/latest/examples/with-markdoc) shows how to use Markdoc files in your Astro project. diff --git a/packages/integrations/markdoc/src/index.ts b/packages/integrations/markdoc/src/index.ts index 0486a44b5..ef50768fe 100644 --- a/packages/integrations/markdoc/src/index.ts +++ b/packages/integrations/markdoc/src/index.ts @@ -11,6 +11,7 @@ import { bold, red, yellow } from 'kleur/colors'; import type * as rollup from 'rollup'; import { loadMarkdocConfig, type MarkdocConfigResult } from './load-config.js'; import { setupConfig } from './runtime.js'; +import path from 'node:path'; type SetupHookParams = HookParameters<'astro:config:setup'> & { // `contentEntryType` is not a public API @@ -61,10 +62,13 @@ export default function markdocIntegration(legacyConfig?: any): AstroIntegration addContentEntryType({ extensions: ['.mdoc'], getEntryInfo, - async getRenderModule({ entry, viteId }) { + async getRenderModule({ contents, fileUrl, viteId }) { + const entry = getEntryInfo({ contents, fileUrl }); const ast = Markdoc.parse(entry.body); const pluginContext = this; - const markdocConfig = await setupConfig(userMarkdocConfig, entry); + const markdocConfig = await setupConfig(userMarkdocConfig); + + const filePath = fileURLToPath(fileUrl); const validationErrors = Markdoc.validate(ast, markdocConfig).filter((e) => { return ( @@ -77,10 +81,11 @@ export default function markdocIntegration(legacyConfig?: any): AstroIntegration }); if (validationErrors.length) { // Heuristic: take number of newlines for `rawData` and add 2 for the `---` fences - const frontmatterBlockOffset = entry._internal.rawData.split('\n').length + 2; + const frontmatterBlockOffset = entry.rawData.split('\n').length + 2; + const rootRelativePath = path.relative(fileURLToPath(astroConfig.root), filePath); throw new MarkdocError({ message: [ - `**${String(entry.collection)} → ${String(entry.id)}** contains invalid content:`, + `**${String(rootRelativePath)}** contains invalid content:`, ...validationErrors.map((e) => `- ${e.error.message}`), ].join('\n'), location: { @@ -96,7 +101,7 @@ export default function markdocIntegration(legacyConfig?: any): AstroIntegration await emitOptimizedImages(ast.children, { astroConfig, pluginContext, - filePath: entry._internal.filePath, + filePath, }); } diff --git a/packages/integrations/markdoc/src/runtime.ts b/packages/integrations/markdoc/src/runtime.ts index 5bf7e4412..a1861c68c 100644 --- a/packages/integrations/markdoc/src/runtime.ts +++ b/packages/integrations/markdoc/src/runtime.ts @@ -13,13 +13,9 @@ export { default as Markdoc } from '@markdoc/markdoc'; * TODO: virtual module to merge configs per-build instead of per-file? */ export async function setupConfig( - userConfig: AstroMarkdocConfig, - entry: ContentEntryModule + userConfig: AstroMarkdocConfig ): Promise<Omit<AstroMarkdocConfig, 'extends'>> { - let defaultConfig: AstroMarkdocConfig = { - ...setupHeadingConfig(), - variables: { entry }, - }; + let defaultConfig: AstroMarkdocConfig = setupHeadingConfig(); if (userConfig.extends) { for (let extension of userConfig.extends) { diff --git a/packages/integrations/markdoc/test/fixtures/entry-prop/astro.config.mjs b/packages/integrations/markdoc/test/fixtures/variables/astro.config.mjs index 29d846359..29d846359 100644 --- a/packages/integrations/markdoc/test/fixtures/entry-prop/astro.config.mjs +++ b/packages/integrations/markdoc/test/fixtures/variables/astro.config.mjs diff --git a/packages/integrations/markdoc/test/fixtures/entry-prop/package.json b/packages/integrations/markdoc/test/fixtures/variables/package.json index 149f6c35a..0ac7a3c82 100644 --- a/packages/integrations/markdoc/test/fixtures/entry-prop/package.json +++ b/packages/integrations/markdoc/test/fixtures/variables/package.json @@ -1,5 +1,5 @@ { - "name": "@test/markdoc-entry-prop", + "name": "@test/markdoc-variables", "version": "0.0.0", "private": true, "dependencies": { diff --git a/packages/integrations/markdoc/test/fixtures/entry-prop/src/content/blog/entry.mdoc b/packages/integrations/markdoc/test/fixtures/variables/src/content/blog/entry.mdoc index 151d5a81d..151d5a81d 100644 --- a/packages/integrations/markdoc/test/fixtures/entry-prop/src/content/blog/entry.mdoc +++ b/packages/integrations/markdoc/test/fixtures/variables/src/content/blog/entry.mdoc diff --git a/packages/integrations/markdoc/test/fixtures/entry-prop/src/content/config.ts b/packages/integrations/markdoc/test/fixtures/variables/src/content/config.ts index ff473d4af..ff473d4af 100644 --- a/packages/integrations/markdoc/test/fixtures/entry-prop/src/content/config.ts +++ b/packages/integrations/markdoc/test/fixtures/variables/src/content/config.ts diff --git a/packages/integrations/markdoc/test/fixtures/entry-prop/src/pages/index.astro b/packages/integrations/markdoc/test/fixtures/variables/src/pages/index.astro index d14187651..a2766faf0 100644 --- a/packages/integrations/markdoc/test/fixtures/entry-prop/src/pages/index.astro +++ b/packages/integrations/markdoc/test/fixtures/variables/src/pages/index.astro @@ -14,6 +14,6 @@ const { Content } = await entry.render(); <title>Astro</title> </head> <body> - <Content /> + <Content {entry} /> </body> </html> diff --git a/packages/integrations/markdoc/test/entry-prop.test.js b/packages/integrations/markdoc/test/variables.test.js index b47ccf739..90d5fe276 100644 --- a/packages/integrations/markdoc/test/entry-prop.test.js +++ b/packages/integrations/markdoc/test/variables.test.js @@ -3,9 +3,9 @@ import { expect } from 'chai'; import { loadFixture } from '../../../astro/test/test-utils.js'; import markdoc from '../dist/index.js'; -const root = new URL('./fixtures/entry-prop/', import.meta.url); +const root = new URL('./fixtures/variables/', import.meta.url); -describe('Markdoc - Entry prop', () => { +describe('Markdoc - Variables', () => { let baseFixture; before(async () => { |