summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/astro/test/fixtures/react-component/src/components/ImportsThrowsAnError.jsx7
-rw-r--r--packages/astro/test/fixtures/react-component/src/components/ThrowsAnError.jsx15
-rw-r--r--packages/astro/test/fixtures/react-component/src/pages/error-rendering.astro11
-rw-r--r--packages/astro/test/react-component.test.js6
-rw-r--r--packages/integrations/react/server.js5
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) {