Skip to content

Commit

Permalink
fix(renderer): omitting internal symbol from user components
Browse files Browse the repository at this point in the history
  • Loading branch information
Xetera committed Apr 19, 2024
1 parent 77822a8 commit b57b8cf
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .changeset/wild-mice-battle.md
@@ -0,0 +1,5 @@
---
"@astrojs/mdx": patch
---

Omitting compiler-internal symbol from user components to fix breaking error messages
2 changes: 2 additions & 0 deletions packages/astro/src/runtime/server/jsx.ts
Expand Up @@ -84,6 +84,8 @@ Did you forget to import the component or is it possible there is a typo?`);
}
if (typeof vnode.type === 'function') {
if (vnode.props[hasTriedRenderComponentSymbol]) {
// omitting compiler-internals from user components
delete vnode.props[hasTriedRenderComponentSymbol];
const output = await vnode.type(vnode.props ?? {});
if (output?.[AstroJSX] || !output) {
return await renderJSXVNode(result, output);
Expand Down
@@ -0,0 +1,6 @@
import mdx from '@astrojs/mdx';
import react from '@astrojs/react';

export default {
integrations: [mdx(), react()],
}
@@ -0,0 +1,11 @@
{
"name": "@test/mdx-plus-react-errors",
"private": true,
"dependencies": {
"@astrojs/mdx": "workspace:*",
"@astrojs/react": "workspace:*",
"astro": "workspace:*",
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
@@ -0,0 +1,8 @@
import { useState } from "react";

export default function BrokenComponent() {
useState(0);
a;

return <p>Whoops!</p>;
};
@@ -0,0 +1,12 @@
import { z, defineCollection } from "astro:content";

const filesSchema = () => {
return z.object({});
};

const filesCollection = defineCollection({
type: "content",
schema: filesSchema(),
});

export const collections = { files: filesCollection, };
@@ -0,0 +1,4 @@

import BrokenComponent from '../../components/BrokenComponent'

<BrokenComponent {...props} />
@@ -0,0 +1,9 @@
---
import { getCollection } from "astro:content";
const files = await getCollection("files");
const { Content } = await files[0].render();
---

<Content />

33 changes: 33 additions & 0 deletions packages/integrations/mdx/test/mdx-plus-react-errors.test.js
@@ -0,0 +1,33 @@
import * as assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import { loadFixture } from '../../../astro/test/test-utils.js';

function hookError() {
const error = console.error;
const errors = [];
console.error = function (...args) {
errors.push(args);
};
return () => {
console.error = error;
return errors;
};
}

describe('MDX and React with build errors', () => {
let fixture;
let unhook;

it('shows correct error messages on build error', async () => {
try {
fixture = await loadFixture({
root: new URL('./fixtures/mdx-plus-react-errors/', import.meta.url),
});
unhook = hookError();
await fixture.build();
} catch (err) {
assert.equal(err.message, 'a is not defined');
}
unhook();
});
});
18 changes: 18 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit b57b8cf

Please sign in to comment.