summaryrefslogtreecommitdiff
path: root/packages/integrations/markdoc
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/markdoc')
-rw-r--r--packages/integrations/markdoc/README.md31
-rw-r--r--packages/integrations/markdoc/src/index.ts15
-rw-r--r--packages/integrations/markdoc/src/runtime.ts8
-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 () => {