summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/good-adults-punch.md5
-rw-r--r--packages/integrations/markdoc/src/content-entry-type.ts4
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/astro.config.mjs7
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/markdoc.config.ts31
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/package.json9
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/Code.astro12
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/CustomMarquee.astro1
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/content/blog/with-components.mdoc17
-rw-r--r--packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/pages/index.astro19
-rw-r--r--packages/integrations/markdoc/test/render-extends-components.test.js64
-rw-r--r--pnpm-lock.yaml9
11 files changed, 176 insertions, 2 deletions
diff --git a/.changeset/good-adults-punch.md b/.changeset/good-adults-punch.md
new file mode 100644
index 000000000..0ae575c51
--- /dev/null
+++ b/.changeset/good-adults-punch.md
@@ -0,0 +1,5 @@
+---
+'@astrojs/markdoc': patch
+---
+
+Fixes an issue preventing to use Astro components as Markdoc tags and nodes when configured using the `extends` property.
diff --git a/packages/integrations/markdoc/src/content-entry-type.ts b/packages/integrations/markdoc/src/content-entry-type.ts
index 791def315..303251d66 100644
--- a/packages/integrations/markdoc/src/content-entry-type.ts
+++ b/packages/integrations/markdoc/src/content-entry-type.ts
@@ -78,13 +78,13 @@ export async function getContentEntryType({
// Only include component imports for tags used in the document.
// Avoids style and script bleed.
for (const tag of usedTags) {
- const render = userMarkdocConfig.tags?.[tag]?.render;
+ const render = markdocConfig.tags?.[tag]?.render;
if (isComponentConfig(render)) {
componentConfigByTagMap[tag] = render;
}
}
let componentConfigByNodeMap: Record<string, ComponentConfig> = {};
- for (const [nodeType, schema] of Object.entries(userMarkdocConfig.nodes ?? {})) {
+ for (const [nodeType, schema] of Object.entries(markdocConfig.nodes ?? {})) {
const render = schema?.render;
if (isComponentConfig(render)) {
componentConfigByNodeMap[nodeType] = render;
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/astro.config.mjs b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/astro.config.mjs
new file mode 100644
index 000000000..1bd8ba93f
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/astro.config.mjs
@@ -0,0 +1,7 @@
+import markdoc from '@astrojs/markdoc';
+import { defineConfig } from 'astro/config';
+
+// https://astro.build/config
+export default defineConfig({
+ integrations: [markdoc()],
+});
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/markdoc.config.ts b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/markdoc.config.ts
new file mode 100644
index 000000000..8daba3746
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/markdoc.config.ts
@@ -0,0 +1,31 @@
+import { component, defineMarkdocConfig } from '@astrojs/markdoc/config';
+
+export default defineMarkdocConfig({
+ extends: [preset()],
+});
+
+function preset() {
+ return {
+ nodes: {
+ fence: {
+ render: component('./src/components/Code.astro'),
+ attributes: {
+ language: { type: String },
+ content: { type: String },
+ },
+ },
+ },
+ tags: {
+ 'marquee-element': {
+ render: component('./src/components/CustomMarquee.astro'),
+ attributes: {
+ direction: {
+ type: String,
+ default: 'left',
+ matches: ['left', 'right', 'up', 'down'],
+ },
+ },
+ },
+ },
+ }
+}
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/package.json b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/package.json
new file mode 100644
index 000000000..962a2b8a7
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "@test/markdoc-render-with-extends-components",
+ "version": "0.0.0",
+ "private": true,
+ "dependencies": {
+ "@astrojs/markdoc": "workspace:*",
+ "astro": "workspace:*"
+ }
+}
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/Code.astro b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/Code.astro
new file mode 100644
index 000000000..18bf1399f
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/Code.astro
@@ -0,0 +1,12 @@
+---
+import { Code } from 'astro/components';
+
+type Props = {
+ content: string;
+ language: string;
+}
+
+const { content, language } = Astro.props as Props;
+---
+
+<Code lang={language} code={content} />
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/CustomMarquee.astro b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/CustomMarquee.astro
new file mode 100644
index 000000000..3108b9973
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/components/CustomMarquee.astro
@@ -0,0 +1 @@
+<marquee data-custom-marquee {...Astro.props}><slot /></marquee>
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/content/blog/with-components.mdoc b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/content/blog/with-components.mdoc
new file mode 100644
index 000000000..61f404a97
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/content/blog/with-components.mdoc
@@ -0,0 +1,17 @@
+---
+title: Post with components
+---
+
+## Post with components
+
+This uses a custom marquee component with a shortcode:
+
+{% marquee-element direction="right" %}
+I'm a marquee too!
+{% /marquee-element %}
+
+And a code component for code blocks:
+
+```js
+const isRenderedWithShiki = true;
+```
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/pages/index.astro b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/pages/index.astro
new file mode 100644
index 000000000..52239acce
--- /dev/null
+++ b/packages/integrations/markdoc/test/fixtures/render-with-extends-components/src/pages/index.astro
@@ -0,0 +1,19 @@
+---
+import { getEntryBySlug } from "astro:content";
+
+const post = await getEntryBySlug('blog', 'with-components');
+const { Content } = await post.render();
+---
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Content</title>
+</head>
+<body>
+ <Content />
+</body>
+</html>
diff --git a/packages/integrations/markdoc/test/render-extends-components.test.js b/packages/integrations/markdoc/test/render-extends-components.test.js
new file mode 100644
index 000000000..8d1778d3e
--- /dev/null
+++ b/packages/integrations/markdoc/test/render-extends-components.test.js
@@ -0,0 +1,64 @@
+import assert from 'node:assert/strict';
+import { after, before, describe, it } from 'node:test';
+import { parseHTML } from 'linkedom';
+import { loadFixture } from '../../../astro/test/test-utils.js';
+
+const root = new URL('./fixtures/render-with-extends-components/', import.meta.url);
+
+describe('Markdoc - render components defined in `extends`', () => {
+ let fixture;
+
+ before(async () => {
+ fixture = await loadFixture({
+ root,
+ });
+ });
+
+ describe('dev', () => {
+ let devServer;
+
+ before(async () => {
+ devServer = await fixture.startDevServer();
+ });
+
+ after(async () => {
+ await devServer.stop();
+ });
+
+ it('renders content - with components', async () => {
+ const res = await fixture.fetch('/');
+ const html = await res.text();
+
+ renderComponentsChecks(html);
+ });
+ });
+
+ describe('build', () => {
+ before(async () => {
+ await fixture.build();
+ });
+
+ it('renders content - with components', async () => {
+ const html = await fixture.readFile('/index.html');
+
+ renderComponentsChecks(html);
+ });
+ });
+});
+
+/** @param {string} html */
+function renderComponentsChecks(html) {
+ const { document } = parseHTML(html);
+ const h2 = document.querySelector('h2');
+ assert.equal(h2.textContent, 'Post with components');
+
+ // Renders custom shortcode component
+ const marquee = document.querySelector('marquee');
+ assert.notEqual(marquee, null);
+ assert.equal(marquee.hasAttribute('data-custom-marquee'), true);
+
+ // Renders Astro Code component
+ const pre = document.querySelector('pre');
+ assert.notEqual(pre, null);
+ assert.equal(pre.className, 'astro-code github-dark');
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a0458718b..246d75897 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4744,6 +4744,15 @@ importers:
specifier: workspace:*
version: link:../../../../../astro
+ packages/integrations/markdoc/test/fixtures/render-with-extends-components:
+ dependencies:
+ '@astrojs/markdoc':
+ specifier: workspace:*
+ version: link:../../..
+ astro:
+ specifier: workspace:*
+ version: link:../../../../../astro
+
packages/integrations/markdoc/test/fixtures/render-with-indented-components:
dependencies:
'@astrojs/markdoc':