diff --git a/packages/react-client/src/__tests__/ReactFlight-test.js b/packages/react-client/src/__tests__/ReactFlight-test.js index bd2d98736addd..61f80e20553f1 100644 --- a/packages/react-client/src/__tests__/ReactFlight-test.js +++ b/packages/react-client/src/__tests__/ReactFlight-test.js @@ -690,14 +690,22 @@ describe('ReactFlight', () => { const transport = ReactNoopFlightServer.render(); - await act(async () => { - const rootModel = await ReactNoopFlightClient.read(transport); - ReactNoop.render(rootModel); - }); - expect(ReactNoop).toMatchRenderedOutput('Loading...'); - spyOnDevAndProd(console, 'error').mockImplementation(() => {}); await load(); - expect(console.error).toHaveBeenCalledTimes(1); + + await expect(async () => { + await act(async () => { + const rootModel = await ReactNoopFlightClient.read(transport); + ReactNoop.render(rootModel); + }); + }).rejects.toThrow( + __DEV__ + ? 'Element type is invalid: expected a string (for built-in components) or a class/function ' + + '(for composite components) but got:
. ' + + 'Did you accidentally export a JSX literal instead of a component?' + : 'Element type is invalid: expected a string (for built-in components) or a class/function ' + + '(for composite components) but got: object.', + ); + expect(ReactNoop).toMatchRenderedOutput(null); }); it('can render a lazy element', async () => { diff --git a/packages/react-server/src/ReactFlightServer.js b/packages/react-server/src/ReactFlightServer.js index 40a32948e1951..074114d62c4fb 100644 --- a/packages/react-server/src/ReactFlightServer.js +++ b/packages/react-server/src/ReactFlightServer.js @@ -110,7 +110,6 @@ import { } from 'shared/ReactSymbols'; import { - describeValueForErrorMessage, describeObjectForErrorMessage, isSimpleObject, jsxPropsParents, @@ -1591,6 +1590,14 @@ function renderElement( validated, ); } + case REACT_ELEMENT_TYPE: { + // This is invalid but we'll let the client determine that it is. + if (__DEV__) { + // Disable the key warning that would happen otherwise because this + // element gets serialized inside an array. We'll error later anyway. + type._store.validated = 1; + } + } } } // For anything else, try it on the client instead.