Skip to content

Commit 103a6fb

Browse files
committed
More accurate naming
1 parent a58ff7c commit 103a6fb

File tree

3 files changed

+61
-32
lines changed

3 files changed

+61
-32
lines changed

packages/react-devtools-shared/src/__tests__/inspectedElement-test.js

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,10 @@ describe('InspectedElement', () => {
818818
it('should support Thenables in React 19', async () => {
819819
const Example = () => null;
820820

821+
class SubclassedPromise extends Promise {}
822+
823+
const plainThenable = {then() {}};
824+
const subclassedPromise = new SubclassedPromise(() => {});
821825
const unusedPromise = Promise.resolve();
822826
const usedFulfilledPromise = Promise.resolve();
823827
const usedFulfilledRichPromise = Promise.resolve({
@@ -845,6 +849,8 @@ describe('InspectedElement', () => {
845849
render(
846850
<>
847851
<Example
852+
plainThenable={plainThenable}
853+
subclassedPromise={subclassedPromise}
848854
unusedPromise={unusedPromise}
849855
usedFulfilledPromise={usedFulfilledPromise}
850856
usedFulfilledRichPromise={usedFulfilledRichPromise}
@@ -872,32 +878,40 @@ describe('InspectedElement', () => {
872878
const inspectedElement = await inspectElementAtIndex(0);
873879

874880
expect(inspectedElement.props).toMatchInlineSnapshot(`
875-
{
876-
"unusedPromise": Dehydrated {
877-
"preview_short": Promise,
878-
"preview_long": Promise,
879-
},
880-
"usedFulfilledPromise": {
881-
"value": undefined,
882-
},
883-
"usedFulfilledRichPromise": {
884-
"value": Dehydrated {
885-
"preview_short": {…},
886-
"preview_long": {some: {…}},
881+
{
882+
"plainThenable": Dehydrated {
883+
"preview_short": Thenable,
884+
"preview_long": Thenable,
887885
},
888-
},
889-
"usedPendingPromise": Dehydrated {
890-
"preview_short": pending Thenable,
891-
"preview_long": pending Thenable,
892-
},
893-
"usedRejectedPromise": {
894-
"reason": Dehydrated {
895-
"preview_short": Error,
896-
"preview_long": Error,
886+
"subclassedPromise": Dehydrated {
887+
"preview_short": SubclassedPromise,
888+
"preview_long": SubclassedPromise,
897889
},
898-
},
899-
}
900-
`);
890+
"unusedPromise": Dehydrated {
891+
"preview_short": Promise,
892+
"preview_long": Promise,
893+
},
894+
"usedFulfilledPromise": {
895+
"value": undefined,
896+
},
897+
"usedFulfilledRichPromise": {
898+
"value": Dehydrated {
899+
"preview_short": {…},
900+
"preview_long": {some: {…}},
901+
},
902+
},
903+
"usedPendingPromise": Dehydrated {
904+
"preview_short": pending Promise,
905+
"preview_long": pending Promise,
906+
},
907+
"usedRejectedPromise": {
908+
"reason": Dehydrated {
909+
"preview_short": Error,
910+
"preview_long": Error,
911+
},
912+
},
913+
}
914+
`);
901915
});
902916

903917
it('should support Promises in React 18', async () => {

packages/react-devtools-shared/src/hydration.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ export function dehydrate(
324324
type: type,
325325
preview_short: formatDataForPreview(data, false),
326326
preview_long: formatDataForPreview(data, true),
327-
name: 'fulfilled Promise',
327+
name: 'fulfilled Thenable',
328328
};
329329

330330
unserializableValue.value = dehydrate(
@@ -346,7 +346,7 @@ export function dehydrate(
346346
type: type,
347347
preview_short: formatDataForPreview(data, false),
348348
preview_long: formatDataForPreview(data, true),
349-
name: 'fulfilled Promise',
349+
name: 'rejected Thenable',
350350
};
351351

352352
unserializableValue.reason = dehydrate(

packages/react-devtools-shared/src/utils.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -938,25 +938,40 @@ export function formatDataForPreview(
938938
return 'unserializable';
939939
}
940940
case 'thenable':
941+
let displayName: string;
942+
if (isPlainObject(data)) {
943+
displayName = 'Thenable';
944+
} else {
945+
let resolvedConstructorName = data.constructor.name;
946+
if (typeof resolvedConstructorName !== 'string') {
947+
resolvedConstructorName =
948+
Object.getPrototypeOf(data).constructor.name;
949+
}
950+
if (typeof resolvedConstructorName === 'string') {
951+
displayName = resolvedConstructorName;
952+
} else {
953+
displayName = 'Thenable';
954+
}
955+
}
941956
switch (data.status) {
942957
case 'pending':
943-
return 'pending Thenable';
958+
return `pending ${displayName}`;
944959
case 'fulfilled':
945960
if (showFormattedValue) {
946961
const formatted = formatDataForPreview(data.value, false);
947-
return `fulfilled Thenable {${truncateForDisplay(formatted)}}`;
962+
return `fulfilled ${displayName} {${truncateForDisplay(formatted)}}`;
948963
} else {
949-
return 'fulfilled Thenable {…}';
964+
return `fulfilled ${displayName} {}`;
950965
}
951966
case 'rejected':
952967
if (showFormattedValue) {
953968
const formatted = formatDataForPreview(data.reason, false);
954-
return `rejected Thenable {${truncateForDisplay(formatted)}}`;
969+
return `rejected ${displayName} {${truncateForDisplay(formatted)}}`;
955970
} else {
956-
return 'rejected Thenable {…}';
971+
return `rejected ${displayName} {}`;
957972
}
958973
default:
959-
return Object.getPrototypeOf(data).constructor.name;
974+
return displayName;
960975
}
961976
case 'object':
962977
if (showFormattedValue) {

0 commit comments

Comments
 (0)