Skip to content

Commit 92f46d9

Browse files
committed
Inject Flight Client getCurrentComponentInfo into DevTools in DEV
We could inject it in prod too but so far the only feature this exposes is only available in DEV anyway. I also only call injectIntoDevTools in the browser builds since we don't really support DevTools on the server.
1 parent f046fe9 commit 92f46d9

18 files changed

+120
-0
lines changed

packages/react-client/src/ReactFlightClient.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ import {
5858
createStringDecoder,
5959
prepareDestinationForModule,
6060
bindToConsole,
61+
rendererVersion,
62+
rendererPackageName,
6163
} from './ReactFlightClientConfig';
6264

6365
import {createBoundServerReference} from './ReactFlightReplyClient';
@@ -76,6 +78,10 @@ import getComponentNameFromType from 'shared/getComponentNameFromType';
7678

7779
import {getOwnerStackByComponentInfoInDev} from 'shared/ReactComponentInfoStack';
7880

81+
import {injectInternals} from './ReactFlightClientDevToolsHook';
82+
83+
import ReactVersion from 'shared/ReactVersion';
84+
7985
import isArray from 'shared/isArray';
8086

8187
import * as React from 'react';
@@ -2921,3 +2927,21 @@ export function close(response: Response): void {
29212927
// ref count of pending chunks.
29222928
reportGlobalError(response, new Error('Connection closed.'));
29232929
}
2930+
2931+
function getCurrentOwnerInDEV(): null | ReactComponentInfo {
2932+
return currentOwnerInDEV;
2933+
}
2934+
2935+
export function injectIntoDevTools(): boolean {
2936+
const internals: Object = {
2937+
bundleType: __DEV__ ? 1 : 0, // Might add PROFILE later.
2938+
version: rendererVersion,
2939+
rendererPackageName: rendererPackageName,
2940+
currentDispatcherRef: ReactSharedInternals,
2941+
// Enables DevTools to detect reconciler version rather than renderer version
2942+
// which may not match for third party renderers.
2943+
reconcilerVersion: ReactVersion,
2944+
getCurrentComponentInfo: getCurrentOwnerInDEV,
2945+
};
2946+
return injectInternals(internals);
2947+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
declare const __REACT_DEVTOOLS_GLOBAL_HOOK__: Object | void;
11+
12+
export function injectInternals(internals: Object): boolean {
13+
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
14+
// No DevTools
15+
return false;
16+
}
17+
const hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
18+
if (hook.isDisabled) {
19+
// This isn't a real property on the hook, but it can be set to opt out
20+
// of DevTools integration and associated warnings and logs.
21+
// https://github.com/facebook/react/issues/3877
22+
return true;
23+
}
24+
if (!hook.supportsFlight) {
25+
// DevTools exists, even though it doesn't support Flight.
26+
return true;
27+
}
28+
try {
29+
hook.inject(internals);
30+
} catch (err) {
31+
// Catch all errors because it is unsafe to throw during initialization.
32+
if (__DEV__) {
33+
console.error('React instrumentation encountered an error: %s.', err);
34+
}
35+
}
36+
if (hook.checkDCE) {
37+
// This is the real DevTools.
38+
return true;
39+
} else {
40+
// This is likely a hook installed by Fast Refresh runtime.
41+
return false;
42+
}
43+
}

packages/react-client/src/forks/ReactFlightClientConfig.custom.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,6 @@ export const readPartialStringChunk = $$$config.readPartialStringChunk;
4949
export const readFinalStringChunk = $$$config.readFinalStringChunk;
5050

5151
export const bindToConsole = $$$config.bindToConsole;
52+
53+
export const rendererVersion = $$$config.rendererVersion;
54+
export const rendererPackageName = $$$config.rendererPackageName;

packages/react-client/src/forks/ReactFlightClientConfig.dom-browser-esm.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-esm';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigBrowser';
1215
export * from 'react-server-dom-esm/src/client/ReactFlightClientConfigBundlerESM';

packages/react-client/src/forks/ReactFlightClientConfig.dom-browser-turbopack.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-turbopack';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigBrowser';
1215
export * from 'react-server-dom-turbopack/src/client/ReactFlightClientConfigBundlerTurbopack';

packages/react-client/src/forks/ReactFlightClientConfig.dom-browser.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-webpack';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigBrowser';
1215
export * from 'react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack';

packages/react-client/src/forks/ReactFlightClientConfig.dom-bun.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-bun';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigPlain';
1215
export * from 'react-dom-bindings/src/shared/ReactFlightClientConfigDOM';

packages/react-client/src/forks/ReactFlightClientConfig.dom-edge-turbopack.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-turbopack';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigServer';
1215
export * from 'react-server-dom-turbopack/src/client/ReactFlightClientConfigBundlerTurbopack';

packages/react-client/src/forks/ReactFlightClientConfig.dom-edge-webpack.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'react-server-dom-webpack';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigServer';
1215
export * from 'react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack';

packages/react-client/src/forks/ReactFlightClientConfig.dom-legacy.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
* @flow
88
*/
99

10+
export {default as rendererVersion} from 'shared/ReactVersion';
11+
export const rendererPackageName = 'not-used';
12+
1013
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
1114
export * from 'react-client/src/ReactClientConsoleConfigBrowser';
1215

0 commit comments

Comments
 (0)