Skip to content

Commit 2d9d96b

Browse files
committed
[Flight] Add support for returning undefined from render (#26349)
## Summary Adds support for returning `undefined` from Server Components. Also fixes a bug where rendering an empty fragment would throw the same error as returning undefined. ## How did you test this change? - [x] test failed with same error message I got when returning undefined from Server Components in a Next.js app - [x] test passes after adding encoding for `undefined` DiffTrain build for [d1ad984](d1ad984)
1 parent fabd29a commit 2d9d96b

9 files changed

+39
-23
lines changed

compiled/facebook-www/REVISION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3706edb81c84ea01e68bfb477537ba9908e1bd70
1+
d1ad984db1591b131d16739a24dee4ba44886a09

compiled/facebook-www/ReactFlightDOMRelayClient-dev.classic.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,12 @@ function parseModelString(response, parentObject, key, value) {
555555
}
556556
}
557557

558+
case "u": {
559+
// matches "$undefined"
560+
// Special encoding for `undefined` which can't be serialized as JSON otherwise.
561+
return undefined;
562+
}
563+
558564
default: {
559565
// We assume that anything else is a reference ID.
560566
var _id3 = parseInt(value.substring(1), 16);

compiled/facebook-www/ReactFlightDOMRelayClient-dev.modern.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,12 @@ function parseModelString(response, parentObject, key, value) {
555555
}
556556
}
557557

558+
case "u": {
559+
// matches "$undefined"
560+
// Special encoding for `undefined` which can't be serialized as JSON otherwise.
561+
return undefined;
562+
}
563+
558564
default: {
559565
// We assume that anything else is a reference ID.
560566
var _id3 = parseInt(value.substring(1), 16);

compiled/facebook-www/ReactFlightDOMRelayClient-prod.classic.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ function parseModelString(response, parentObject, key, value) {
282282
default:
283283
throw parentObject.reason;
284284
}
285+
case "u":
286+
return;
285287
default:
286288
value = parseInt(value.substring(1), 16);
287289
response = getChunk(response, value);

compiled/facebook-www/ReactFlightDOMRelayClient-prod.modern.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ function parseModelString(response, parentObject, key, value) {
282282
default:
283283
throw parentObject.reason;
284284
}
285+
case "u":
286+
return;
285287
default:
286288
value = parseInt(value.substring(1), 16);
287289
response = getChunk(response, value);

compiled/facebook-www/ReactFlightDOMRelayServer-dev.classic.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,10 @@ function serializeProviderReference(name) {
16371637
return "$P" + name;
16381638
}
16391639

1640+
function serializeUndefined() {
1641+
return "$undefined";
1642+
}
1643+
16401644
function serializeClientReference(request, parent, key, clientReference) {
16411645
var clientReferenceKey = getClientReferenceKey(clientReference);
16421646
var writtenClientReferences = request.writtenClientReferences;
@@ -2235,14 +2239,14 @@ function resolveModelToJSON(request, parent, key, value) {
22352239
return escapeStringValue(value);
22362240
}
22372241

2238-
if (
2239-
typeof value === "boolean" ||
2240-
typeof value === "number" ||
2241-
typeof value === "undefined"
2242-
) {
2242+
if (typeof value === "boolean" || typeof value === "number") {
22432243
return value;
22442244
}
22452245

2246+
if (typeof value === "undefined") {
2247+
return serializeUndefined();
2248+
}
2249+
22462250
if (typeof value === "function") {
22472251
if (isClientReference(value)) {
22482252
return serializeClientReference(request, parent, key, value);

compiled/facebook-www/ReactFlightDOMRelayServer-dev.modern.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,10 @@ function serializeProviderReference(name) {
16371637
return "$P" + name;
16381638
}
16391639

1640+
function serializeUndefined() {
1641+
return "$undefined";
1642+
}
1643+
16401644
function serializeClientReference(request, parent, key, clientReference) {
16411645
var clientReferenceKey = getClientReferenceKey(clientReference);
16421646
var writtenClientReferences = request.writtenClientReferences;
@@ -2235,14 +2239,14 @@ function resolveModelToJSON(request, parent, key, value) {
22352239
return escapeStringValue(value);
22362240
}
22372241

2238-
if (
2239-
typeof value === "boolean" ||
2240-
typeof value === "number" ||
2241-
typeof value === "undefined"
2242-
) {
2242+
if (typeof value === "boolean" || typeof value === "number") {
22432243
return value;
22442244
}
22452245

2246+
if (typeof value === "undefined") {
2247+
return serializeUndefined();
2248+
}
2249+
22462250
if (typeof value === "function") {
22472251
if (isClientReference(value)) {
22482252
return serializeClientReference(request, parent, key, value);

compiled/facebook-www/ReactFlightDOMRelayServer-prod.classic.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -937,12 +937,8 @@ function resolveModelToJSON(request, parent, key, value) {
937937
}
938938
if ("string" === typeof value)
939939
return (request = "$" === value[0] ? "$" + value : value), request;
940-
if (
941-
"boolean" === typeof value ||
942-
"number" === typeof value ||
943-
"undefined" === typeof value
944-
)
945-
return value;
940+
if ("boolean" === typeof value || "number" === typeof value) return value;
941+
if ("undefined" === typeof value) return "$undefined";
946942
if ("function" === typeof value) {
947943
if (value instanceof JSResourceReferenceImpl)
948944
return serializeClientReference(request, parent, key, value);

compiled/facebook-www/ReactFlightDOMRelayServer-prod.modern.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -937,12 +937,8 @@ function resolveModelToJSON(request, parent, key, value) {
937937
}
938938
if ("string" === typeof value)
939939
return (request = "$" === value[0] ? "$" + value : value), request;
940-
if (
941-
"boolean" === typeof value ||
942-
"number" === typeof value ||
943-
"undefined" === typeof value
944-
)
945-
return value;
940+
if ("boolean" === typeof value || "number" === typeof value) return value;
941+
if ("undefined" === typeof value) return "$undefined";
946942
if ("function" === typeof value) {
947943
if (value instanceof JSResourceReferenceImpl)
948944
return serializeClientReference(request, parent, key, value);

0 commit comments

Comments
 (0)