diff options
Diffstat (limited to 'packages')
5 files changed, 43 insertions, 1 deletions
diff --git a/packages/astro/test/fixtures/react-component/src/components/ImportsThrowsAnError.jsx b/packages/astro/test/fixtures/react-component/src/components/ImportsThrowsAnError.jsx new file mode 100644 index 000000000..d6ff21dc3 --- /dev/null +++ b/packages/astro/test/fixtures/react-component/src/components/ImportsThrowsAnError.jsx @@ -0,0 +1,7 @@ +import ThrowsAnError from "./ThrowsAnError"; + +export default function() { + return <> + <ThrowsAnError /> + </> +} diff --git a/packages/astro/test/fixtures/react-component/src/components/ThrowsAnError.jsx b/packages/astro/test/fixtures/react-component/src/components/ThrowsAnError.jsx new file mode 100644 index 000000000..cf970e38c --- /dev/null +++ b/packages/astro/test/fixtures/react-component/src/components/ThrowsAnError.jsx @@ -0,0 +1,15 @@ +import { useState } from 'react'; + +export default function() { + let player = undefined; + // This is tested in dev mode, so make it work during the build to prevent + // breaking other tests. + if(import.meta.env.MODE === 'production') { + player = {}; + } + const [] = useState(player.currentTime || null); + + return ( + <div>Should have thrown</div> + ) +} diff --git a/packages/astro/test/fixtures/react-component/src/pages/error-rendering.astro b/packages/astro/test/fixtures/react-component/src/pages/error-rendering.astro new file mode 100644 index 000000000..6984a6da5 --- /dev/null +++ b/packages/astro/test/fixtures/react-component/src/pages/error-rendering.astro @@ -0,0 +1,11 @@ +--- +import ImportsThrowsAnError from '../components/ImportsThrowsAnError'; +--- +<html> +<head> + <title>Testing</title> +</head> +<body> + <ImportsThrowsAnError /> +</body> +</html> diff --git a/packages/astro/test/react-component.test.js b/packages/astro/test/react-component.test.js index e18f7129c..19bd42a43 100644 --- a/packages/astro/test/react-component.test.js +++ b/packages/astro/test/react-component.test.js @@ -94,6 +94,7 @@ describe('React Components', () => { if (isWindows) return; describe('dev', () => { + /** @type {import('./test-utils').Fixture} */ let devServer; before(async () => { @@ -145,5 +146,10 @@ describe('React Components', () => { // test 1: react/jsx-runtime is used for the component expect(jsxRuntime).to.be.ok; }); + + it('When a nested component throws it does not crash the server', async () => { + const res = await fixture.fetch('/error-rendering'); + await res.arrayBuffer(); + }); }); }); diff --git a/packages/integrations/react/server.js b/packages/integrations/react/server.js index c4e77bb91..d8c0c25fb 100644 --- a/packages/integrations/react/server.js +++ b/packages/integrations/react/server.js @@ -121,8 +121,11 @@ async function renderToPipeableStreamAsync(vnode) { async function renderToStaticNodeStreamAsync(vnode) { const Writable = await getNodeWritable(); let html = ''; - return new Promise((resolve) => { + return new Promise((resolve, reject) => { let stream = ReactDOM.renderToStaticNodeStream(vnode); + stream.on('error', err => { + reject(err); + }); stream.pipe( new Writable({ write(chunk, _encoding, callback) { |