@samitouri / QOS-React-2 / commits / 2dc5bebd46

Fix error handling in `resolveClientReference` (#31332)

When a React Server Consumer Manifest does not include an entry for a client reference ID, we must not try to look up the export name (or `'*'`) for the client reference. Otherwise this will fail with `TypeError: Cannot read properties of undefined (reading '...')` instead of the custom error we intended to throw.

Hendrik Liebau committed Oct 23, 2024 at 17:36 UTC 2dc5bebd46d5254f9a02fd58d408acb33c288639
4 files changed +12 -12
packages/react-server-dom-turbopack/src/client/ReactFlightClientConfigBundlerNode.js
+3 -3
@@ -62,19 +62,19 @@ export function resolveClientReference<T>(
62 metadata: ClientReferenceMetadata,
63 ): ClientReference<T> {
64 const moduleExports = bundlerConfig[metadata[ID]];
65 - let resolvedModuleData = moduleExports[metadata[NAME]];
65 + let resolvedModuleData = moduleExports && moduleExports[metadata[NAME]];
66 let name;
67 if (resolvedModuleData) {
68 // The potentially aliased name.
69 name = resolvedModuleData.name;
70 } else {
71 // If we don't have this specific name, we might have the full module.
72 - resolvedModuleData = moduleExports['*'];
72 + resolvedModuleData = moduleExports && moduleExports['*'];
73 if (!resolvedModuleData) {
74 throw new Error(
75 'Could not find the module "' +
76 metadata[ID] +
77 - '" in the React SSR Manifest. ' +
77 + '" in the React Server Consumer Manifest. ' +
78 'This is probably a bug in the React Server Components bundler.',
79 );
80 }
packages/react-server-dom-turbopack/src/client/ReactFlightClientConfigBundlerTurbopack.js
+3 -3
@@ -68,19 +68,19 @@ export function resolveClientReference<T>(
68 ): ClientReference<T> {
69 if (bundlerConfig) {
70 const moduleExports = bundlerConfig[metadata[ID]];
71 - let resolvedModuleData = moduleExports[metadata[NAME]];
71 + let resolvedModuleData = moduleExports && moduleExports[metadata[NAME]];
72 let name;
73 if (resolvedModuleData) {
74 // The potentially aliased name.
75 name = resolvedModuleData.name;
76 } else {
77 // If we don't have this specific name, we might have the full module.
78 - resolvedModuleData = moduleExports['*'];
78 + resolvedModuleData = moduleExports && moduleExports['*'];
79 if (!resolvedModuleData) {
80 throw new Error(
81 'Could not find the module "' +
82 metadata[ID] +
83 - '" in the React SSR Manifest. ' +
83 + '" in the React Server Consumer Manifest. ' +
84 'This is probably a bug in the React Server Components bundler.',
85 );
86 }
packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerNode.js
+3 -3
@@ -62,19 +62,19 @@ export function resolveClientReference<T>(
62 metadata: ClientReferenceMetadata,
63 ): ClientReference<T> {
64 const moduleExports = bundlerConfig[metadata[ID]];
65 - let resolvedModuleData = moduleExports[metadata[NAME]];
65 + let resolvedModuleData = moduleExports && moduleExports[metadata[NAME]];
66 let name;
67 if (resolvedModuleData) {
68 // The potentially aliased name.
69 name = resolvedModuleData.name;
70 } else {
71 // If we don't have this specific name, we might have the full module.
72 - resolvedModuleData = moduleExports['*'];
72 + resolvedModuleData = moduleExports && moduleExports['*'];
73 if (!resolvedModuleData) {
74 throw new Error(
75 'Could not find the module "' +
76 metadata[ID] +
77 - '" in the React SSR Manifest. ' +
77 + '" in the React Server Consumer Manifest. ' +
78 'This is probably a bug in the React Server Components bundler.',
79 );
80 }
packages/react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack.js
+3 -3
@@ -68,19 +68,19 @@ export function resolveClientReference<T>(
68 ): ClientReference<T> {
69 if (bundlerConfig) {
70 const moduleExports = bundlerConfig[metadata[ID]];
71 - let resolvedModuleData = moduleExports[metadata[NAME]];
71 + let resolvedModuleData = moduleExports && moduleExports[metadata[NAME]];
72 let name;
73 if (resolvedModuleData) {
74 // The potentially aliased name.
75 name = resolvedModuleData.name;
76 } else {
77 // If we don't have this specific name, we might have the full module.
78 - resolvedModuleData = moduleExports['*'];
78 + resolvedModuleData = moduleExports && moduleExports['*'];
79 if (!resolvedModuleData) {
80 throw new Error(
81 'Could not find the module "' +
82 metadata[ID] +
83 - '" in the React SSR Manifest. ' +
83 + '" in the React Server Consumer Manifest. ' +
84 'This is probably a bug in the React Server Components bundler.',
85 );
86 }