[Fiber] Make DevTools Config use Static Injection (#30522)
We use static dependency injection. We shouldn't use this dynamic dependency injection we do for DevTools internals. There's also meta programming like spreading and stuff that isn't needed. This moves the config from `injectIntoDevTools` to the FiberConfig so it can be statically resolved. Closure Compiler has some trouble generating optimal code for this anyway so ideally we'd refactor this further but at least this is better and saves a few bytes and avoids some code paths (when minified).
Sebastian Markbåge committed
Jul 30, 2024 at 15:03 UTC
146df7c311831a1d5b35f3783dae4a7030638fcf
16 files changed
+141
-171
packages/react-art/src/ReactART.js
+3
-6
@@ -155,12 +155,7 @@ class Text extends React.Component {
155
}
156
}
157
158
-injectIntoDevTools({
159
- findFiberByHostInstance: () => null,
160
- bundleType: __DEV__ ? 1 : 0,
161
- version: ReactVersion,
162
- rendererPackageName: 'react-art',
163
-});
158
+injectIntoDevTools();
159
160
/** API */
161
@@ -169,3 +164,5 @@ export const Group = TYPES.GROUP;
164
export const Shape = TYPES.SHAPE;
165
export const Path = Mode.Path;
166
export {LinearGradient, Pattern, RadialGradient, Surface, Text, Transform};
167
+
168
+export {ReactVersion as version};
packages/react-art/src/ReactFiberConfigART.js
+6
-2
@@ -17,6 +17,10 @@ import {
17
NoEventPriority,
18
} from 'react-reconciler/src/ReactEventPriorities';
19
20
+export {default as rendererVersion} from 'shared/ReactVersion';
21
+export const rendererPackageName = 'react-art';
22
+export const extraDevToolsConfig = null;
23
+
24
const pooledTransform = new Transform();
25
26
const NO_CONTEXT = {};
@@ -441,8 +445,8 @@ export function clearContainer(container) {
445
// TODO Implement this
446
}
447
444
-export function getInstanceFromNode(node) {
445
- throw new Error('Not implemented.');
448
+export function getInstanceFromNode(node): null {
449
+ return null;
450
}
451
452
export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {
packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js
+7
-4
@@ -26,7 +26,8 @@ import type {
26
PreinitModuleScriptOptions,
27
} from 'react-dom/src/shared/ReactDOMTypes';
28
29
-import {NotPending} from 'react-dom-bindings/src/shared/ReactDOMFormActions';
29
+import {NotPending} from '../shared/ReactDOMFormActions';
30
+
31
import {getCurrentRootHostContainer} from 'react-reconciler/src/ReactFiberHostContext';
32
33
import hasOwnProperty from 'shared/hasOwnProperty';
@@ -106,6 +107,10 @@ import {requestFormReset as requestFormResetOnFiber} from 'react-reconciler/src/
107
108
import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals';
109
110
+export {default as rendererVersion} from 'shared/ReactVersion';
111
+export const rendererPackageName = 'react-dom';
112
+export const extraDevToolsConfig = null;
113
+
114
export type Type = string;
115
export type Props = {
116
autoFocus?: boolean,
@@ -616,9 +621,7 @@ const localRequestAnimationFrame =
621
? requestAnimationFrame
622
: scheduleTimeout;
623
619
-export function getInstanceFromNode(node: HTMLElement): null | Object {
620
- return getClosestInstanceFromNode(node) || null;
621
-}
624
+export {getClosestInstanceFromNode as getInstanceFromNode};
625
626
export function preparePortalMount(portalInstance: Instance): void {
627
listenToAllSupportedEvents(portalInstance);
packages/react-dom/src/client/ReactDOMClient.js
+1
-7
@@ -16,7 +16,6 @@ import {
16
import {canUseDOM} from 'shared/ExecutionEnvironment';
17
import ReactVersion from 'shared/ReactVersion';
18
19
-import {getClosestInstanceFromNode} from 'react-dom-bindings/src/client/ReactDOMComponentTree';
19
import Internals from 'shared/ReactDOMSharedInternals';
20
21
import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomorphicReactVersion';
@@ -52,12 +51,7 @@ Internals.findDOMNode = findDOMNode;
51
52
export {ReactVersion as version, createRoot, hydrateRoot};
53
55
-const foundDevTools = injectIntoDevTools({
56
- findFiberByHostInstance: getClosestInstanceFromNode,
57
- bundleType: __DEV__ ? 1 : 0,
58
- version: ReactVersion,
59
- rendererPackageName: 'react-dom',
60
-});
54
+const foundDevTools = injectIntoDevTools();
55
56
if (__DEV__) {
57
if (!foundDevTools && canUseDOM && window.top === window.self) {
packages/react-dom/src/client/ReactDOMClientFB.js
+1
-7
@@ -29,7 +29,6 @@ import {ensureCorrectIsomorphicReactVersion} from '../shared/ensureCorrectIsomor
29
ensureCorrectIsomorphicReactVersion();
30
31
import {
32
- getClosestInstanceFromNode,
32
getInstanceFromNode,
33
getNodeFromInstance,
34
getFiberCurrentPropsFromNode,
@@ -147,12 +146,7 @@ Internals.Events /* Events */ = [
146
unstable_batchedUpdates,
147
];
148
150
-const foundDevTools = injectIntoDevTools({
151
- findFiberByHostInstance: getClosestInstanceFromNode,
152
- bundleType: __DEV__ ? 1 : 0,
153
- version: ReactVersion,
154
- rendererPackageName: 'react-dom',
155
-});
149
+const foundDevTools = injectIntoDevTools();
150
151
if (__DEV__) {
152
if (!foundDevTools && canUseDOM && window.top === window.self) {
packages/react-native-renderer/src/ReactFabric.js
+2
-22
@@ -28,14 +28,8 @@ import {
28
29
import {createPortal as createPortalImpl} from 'react-reconciler/src/ReactPortal';
30
import {setBatchingImplementation} from './legacy-events/ReactGenericBatching';
31
-import ReactVersion from 'shared/ReactVersion';
31
33
-import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
34
-import {
35
- getInspectorDataForViewTag,
36
- getInspectorDataForViewAtPoint,
37
- getInspectorDataForInstance,
38
-} from './ReactNativeFiberInspector';
32
+import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
33
import {LegacyRoot, ConcurrentRoot} from 'react-reconciler/src/ReactRootTags';
34
import {
35
findHostInstance_DEPRECATED,
@@ -209,18 +203,4 @@ export {
203
isChildPublicInstance,
204
};
205
212
-injectIntoDevTools({
213
- // $FlowExpectedError[incompatible-call] The type of `Instance` in `getClosestInstanceFromNode` does not match in Fabric and the legacy renderer, so it fails to typecheck here.
214
- findFiberByHostInstance: getClosestInstanceFromNode,
215
- bundleType: __DEV__ ? 1 : 0,
216
- version: ReactVersion,
217
- rendererPackageName: 'react-native-renderer',
218
- rendererConfig: {
219
- getInspectorDataForInstance,
220
- getInspectorDataForViewTag: getInspectorDataForViewTag,
221
- getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
222
- null,
223
- findNodeHandle,
224
- ),
225
- },
226
-});
206
+injectIntoDevTools();
packages/react-native-renderer/src/ReactFiberConfigFabric.js
+17
-3
@@ -48,11 +48,27 @@ const {
48
unstable_getCurrentEventPriority: fabricGetCurrentEventPriority,
49
} = nativeFabricUIManager;
50
51
+import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
52
+
53
+import {
54
+ getInspectorDataForViewTag,
55
+ getInspectorDataForViewAtPoint,
56
+ getInspectorDataForInstance,
57
+} from './ReactNativeFiberInspector';
58
+
59
import {
60
enableFabricCompleteRootInCommitPhase,
61
passChildrenWhenCloningPersistedNodes,
62
} from 'shared/ReactFeatureFlags';
63
64
+export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
65
+export const rendererPackageName = 'react-native-renderer';
66
+export const extraDevToolsConfig = {
67
+ getInspectorDataForInstance,
68
+ getInspectorDataForViewTag,
69
+ getInspectorDataForViewAtPoint,
70
+};
71
+
72
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
73
74
// Counter for uniquely identifying views.
@@ -487,9 +503,7 @@ export function replaceContainerChildren(
503
}
504
}
505
490
-export function getInstanceFromNode(node: any): empty {
491
- throw new Error('Not yet implemented.');
492
-}
506
+export {getClosestInstanceFromNode as getInstanceFromNode};
507
508
export function beforeActiveInstanceBlur(
509
internalInstanceHandle: InternalInstanceHandle,
packages/react-native-renderer/src/ReactFiberConfigNative.js
+16
-3
@@ -21,6 +21,7 @@ import {
21
precacheFiberNode,
22
uncacheFiberNode,
23
updateFiberProps,
24
+ getClosestInstanceFromNode,
25
} from './ReactNativeComponentTree';
26
import ReactNativeFiberHostComponent from './ReactNativeFiberHostComponent';
27
@@ -31,6 +32,20 @@ import {
32
} from 'react-reconciler/src/ReactEventPriorities';
33
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
34
35
+import {
36
+ getInspectorDataForViewTag,
37
+ getInspectorDataForViewAtPoint,
38
+ getInspectorDataForInstance,
39
+} from './ReactNativeFiberInspector';
40
+
41
+export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
42
+export const rendererPackageName = 'react-native-renderer';
43
+export const extraDevToolsConfig = {
44
+ getInspectorDataForInstance,
45
+ getInspectorDataForViewTag,
46
+ getInspectorDataForViewAtPoint,
47
+};
48
+
49
const {get: getViewConfigForType} = ReactNativeViewConfigRegistry;
50
51
export type Type = string;
@@ -506,9 +521,7 @@ export function unhideTextInstance(
521
throw new Error('Not yet implemented.');
522
}
523
509
-export function getInstanceFromNode(node: any): empty {
510
- throw new Error('Not yet implemented.');
511
-}
524
+export {getClosestInstanceFromNode as getInstanceFromNode};
525
526
export function beforeActiveInstanceBlur(internalInstanceHandle: Object) {
527
// noop
packages/react-native-renderer/src/ReactNativeFiberInspector.js
+7
-9
@@ -23,7 +23,10 @@ import {
23
} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
24
import {enableGetInspectorDataForInstanceInProduction} from 'shared/ReactFeatureFlags';
25
import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
26
-import {getNodeFromInternalInstanceHandle} from './ReactNativePublicCompat';
26
+import {
27
+ getNodeFromInternalInstanceHandle,
28
+ findNodeHandle,
29
+} from './ReactNativePublicCompat';
30
import {getStackByFiberInDevAndProd} from 'react-reconciler/src/ReactFiberComponentStack';
31
32
const emptyObject = {};
@@ -35,7 +38,7 @@ if (__DEV__) {
38
function createHierarchy(fiberHierarchy) {
39
return fiberHierarchy.map(fiber => ({
40
name: getComponentNameFromType(fiber.type),
38
- getInspectorData: findNodeHandle => {
41
+ getInspectorData: () => {
42
return {
43
props: getHostProps(fiber),
44
measure: callback => {
@@ -49,10 +52,7 @@ function createHierarchy(fiberHierarchy) {
52
if (node) {
53
nativeFabricUIManager.measure(node, callback);
54
} else {
52
- return UIManager.measure(
53
- getHostNode(fiber, findNodeHandle),
54
- callback,
55
- );
55
+ return UIManager.measure(getHostNode(fiber), callback);
56
}
57
},
58
};
@@ -60,8 +60,7 @@ function createHierarchy(fiberHierarchy) {
60
}));
61
}
62
63
-// $FlowFixMe[missing-local-annot]
64
-function getHostNode(fiber: Fiber | null, findNodeHandle) {
63
+function getHostNode(fiber: Fiber | null) {
64
if (__DEV__ || enableGetInspectorDataForInstanceInProduction) {
65
let hostNode;
66
// look for children first for the hostNode
@@ -179,7 +178,6 @@ function getInspectorDataForViewTag(viewTag: number): InspectorData {
178
}
179
180
function getInspectorDataForViewAtPoint(
182
- findNodeHandle: (componentOrHandle: any) => ?number,
181
inspectedView: Object,
182
locationX: number,
183
locationY: number,
packages/react-native-renderer/src/ReactNativeRenderer.js
+2
-20
@@ -32,16 +32,11 @@ import {
32
setBatchingImplementation,
33
batchedUpdates,
34
} from './legacy-events/ReactGenericBatching';
35
-import ReactVersion from 'shared/ReactVersion';
35
// Modules provided by RN:
36
import {UIManager} from 'react-native/Libraries/ReactPrivate/ReactNativePrivateInterface';
37
38
import {getClosestInstanceFromNode} from './ReactNativeComponentTree';
40
-import {
41
- getInspectorDataForViewTag,
42
- getInspectorDataForViewAtPoint,
43
- getInspectorDataForInstance,
44
-} from './ReactNativeFiberInspector';
39
+import {getInspectorDataForInstance} from './ReactNativeFiberInspector';
40
import {LegacyRoot} from 'react-reconciler/src/ReactRootTags';
41
import {
42
findHostInstance_DEPRECATED,
@@ -233,17 +228,4 @@ export {
228
isChildPublicInstance,
229
};
230
236
-injectIntoDevTools({
237
- findFiberByHostInstance: getClosestInstanceFromNode,
238
- bundleType: __DEV__ ? 1 : 0,
239
- version: ReactVersion,
240
- rendererPackageName: 'react-native-renderer',
241
- rendererConfig: {
242
- getInspectorDataForInstance,
243
- getInspectorDataForViewTag: getInspectorDataForViewTag,
244
- getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
245
- null,
246
- findNodeHandle,
247
- ),
248
- },
249
-});
231
+injectIntoDevTools();
packages/react-noop-renderer/src/createReactNoop.js
+4
@@ -42,6 +42,7 @@ import {
42
} from 'shared/ReactFeatureFlags';
43
44
import ReactSharedInternals from 'shared/ReactSharedInternals';
45
+import ReactVersion from 'shared/ReactVersion';
46
47
type Container = {
48
rootID: string,
@@ -367,6 +368,9 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
368
}
369
370
const sharedHostConfig = {
371
+ rendererVersion: ReactVersion,
372
+ rendererPackageName: 'react-noop',
373
+
374
supportsSingletons: false,
375
376
getRootHostContext() {
packages/react-reconciler/src/ReactFiberDevToolsHook.js
+3
-30
@@ -17,7 +17,6 @@ import type {EventPriority} from './ReactEventPriorities';
17
// React which this hook might be in.
18
type DevToolsProfilingHooks = any;
19
20
-import {getLabelForLane, TotalLanes} from 'react-reconciler/src/ReactFiberLane';
20
import {DidCapture} from './ReactFiberFlags';
21
import {
22
consoleManagedByDevToolsDuringStrictMode,
@@ -75,17 +74,6 @@ export function injectInternals(internals: Object): boolean {
74
return true;
75
}
76
try {
78
- if (enableSchedulingProfiler) {
79
- // Conditionally inject these hooks only if Timeline profiler is supported by this build.
80
- // This gives DevTools a way to feature detect that isn't tied to version number
81
- // (since profiling and timeline are controlled by different feature flags).
82
- internals = {
83
- ...internals,
84
- getLaneLabelMap,
85
- injectProfilingHooks,
86
- };
87
- }
88
-
77
rendererID = hook.inject(internals);
78
79
// We have successfully injected, so now it is safe to set up hooks.
@@ -235,27 +223,12 @@ export function setIsStrictModeForDevtools(newIsStrictMode: boolean) {
223
224
// Profiler API hooks
225
238
-function injectProfilingHooks(profilingHooks: DevToolsProfilingHooks): void {
226
+export function injectProfilingHooks(
227
+ profilingHooks: DevToolsProfilingHooks,
228
+): void {
229
injectedProfilingHooks = profilingHooks;
230
}
231
242
-function getLaneLabelMap(): Map<Lane, string> | null {
243
- if (enableSchedulingProfiler) {
244
- const map: Map<Lane, string> = new Map();
245
-
246
- let lane = 1;
247
- for (let index = 0; index < TotalLanes; index++) {
248
- const label = ((getLabelForLane(lane): any): string);
249
- map.set(lane, label);
250
- lane *= 2;
251
- }
252
-
253
- return map;
254
- } else {
255
- return null;
256
- }
257
-}
258
-
232
export function markCommitStarted(lanes: Lanes): void {
233
if (enableSchedulingProfiler) {
234
if (
packages/react-reconciler/src/ReactFiberReconciler.js
+62
-50
@@ -15,8 +15,6 @@ import type {
15
} from './ReactInternalTypes';
16
import type {RootTag} from './ReactRootTags';
17
import type {
18
- Instance,
19
- TextInstance,
18
Container,
19
PublicInstance,
20
RendererInspectionConfig,
@@ -42,7 +40,13 @@ import getComponentNameFromFiber from 'react-reconciler/src/getComponentNameFrom
40
import isArray from 'shared/isArray';
41
import {enableSchedulingProfiler} from 'shared/ReactFeatureFlags';
42
import ReactSharedInternals from 'shared/ReactSharedInternals';
45
-import {getPublicInstance} from './ReactFiberConfig';
43
+import {
44
+ getPublicInstance,
45
+ getInstanceFromNode,
46
+ rendererVersion,
47
+ rendererPackageName,
48
+ extraDevToolsConfig,
49
+} from './ReactFiberConfig';
50
import {
51
findCurrentUnmaskedContext,
52
processChildContext,
@@ -55,6 +59,7 @@ import {
59
injectInternals,
60
markRenderScheduled,
61
onScheduleRoot,
62
+ injectProfilingHooks,
63
} from './ReactFiberDevToolsHook';
64
import {
65
requestUpdateLane,
@@ -113,23 +118,10 @@ export {
118
defaultOnCaughtError,
119
defaultOnRecoverableError,
120
} from './ReactFiberErrorLogger';
121
+import {getLabelForLane, TotalLanes} from 'react-reconciler/src/ReactFiberLane';
122
123
type OpaqueRoot = FiberRoot;
124
119
-// 0 is PROD, 1 is DEV.
120
-// Might add PROFILE later.
121
-type BundleType = 0 | 1;
122
-
123
-type DevToolsConfig = {
124
- bundleType: BundleType,
125
- version: string,
126
- rendererPackageName: string,
127
- // Note: this actually *does* depend on Fiber internal fields.
128
- // Used by "inspect clicked DOM element" in React DevTools.
129
- findFiberByHostInstance?: (instance: Instance | TextInstance) => Fiber | null,
130
- rendererConfig?: RendererInspectionConfig,
131
-};
132
-
125
let didWarnAboutNestedUpdates;
126
let didWarnAboutFindNodeInStrictMode;
127
@@ -827,45 +819,65 @@ if (__DEV__) {
819
};
820
}
821
830
-function emptyFindFiberByHostInstance(
831
- instance: Instance | TextInstance,
832
-): Fiber | null {
833
- return null;
834
-}
835
-
822
function getCurrentFiberForDevTools() {
823
return ReactCurrentFiberCurrent;
824
}
825
840
-export function injectIntoDevTools(devToolsConfig: DevToolsConfig): boolean {
841
- const {findFiberByHostInstance} = devToolsConfig;
842
-
843
- return injectInternals({
844
- bundleType: devToolsConfig.bundleType,
845
- version: devToolsConfig.version,
846
- rendererPackageName: devToolsConfig.rendererPackageName,
847
- rendererConfig: devToolsConfig.rendererConfig,
848
- overrideHookState,
849
- overrideHookStateDeletePath,
850
- overrideHookStateRenamePath,
851
- overrideProps,
852
- overridePropsDeletePath,
853
- overridePropsRenamePath,
854
- setErrorHandler,
855
- setSuspenseHandler,
856
- scheduleUpdate,
826
+function getLaneLabelMap(): Map<Lane, string> | null {
827
+ if (enableSchedulingProfiler) {
828
+ const map: Map<Lane, string> = new Map();
829
+
830
+ let lane = 1;
831
+ for (let index = 0; index < TotalLanes; index++) {
832
+ const label = ((getLabelForLane(lane): any): string);
833
+ map.set(lane, label);
834
+ lane *= 2;
835
+ }
836
+
837
+ return map;
838
+ } else {
839
+ return null;
840
+ }
841
+}
842
+
843
+export function injectIntoDevTools(): boolean {
844
+ const internals: Object = {
845
+ bundleType: __DEV__ ? 1 : 0, // Might add PROFILE later.
846
+ version: rendererVersion,
847
+ rendererPackageName: rendererPackageName,
848
currentDispatcherRef: ReactSharedInternals,
858
- findFiberByHostInstance:
859
- findFiberByHostInstance || emptyFindFiberByHostInstance,
860
- // React Refresh
861
- findHostInstancesForRefresh: __DEV__ ? findHostInstancesForRefresh : null,
862
- scheduleRefresh: __DEV__ ? scheduleRefresh : null,
863
- scheduleRoot: __DEV__ ? scheduleRoot : null,
864
- setRefreshHandler: __DEV__ ? setRefreshHandler : null,
865
- // Enables DevTools to append owner stacks to error messages in DEV mode.
866
- getCurrentFiber: __DEV__ ? getCurrentFiberForDevTools : null,
849
+ findFiberByHostInstance: getInstanceFromNode,
850
// Enables DevTools to detect reconciler version rather than renderer version
851
// which may not match for third party renderers.
852
reconcilerVersion: ReactVersion,
870
- });
853
+ };
854
+ if (extraDevToolsConfig !== null) {
855
+ internals.rendererConfig = (extraDevToolsConfig: RendererInspectionConfig);
856
+ }
857
+ if (__DEV__) {
858
+ internals.overrideHookState = overrideHookState;
859
+ internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
860
+ internals.overrideHookStateRenamePath = overrideHookStateRenamePath;
861
+ internals.overrideProps = overrideProps;
862
+ internals.overridePropsDeletePath = overridePropsDeletePath;
863
+ internals.overridePropsRenamePath = overridePropsRenamePath;
864
+ internals.scheduleUpdate = scheduleUpdate;
865
+ internals.setErrorHandler = setErrorHandler;
866
+ internals.setSuspenseHandler = setSuspenseHandler;
867
+ // React Refresh
868
+ internals.findHostInstancesForRefresh = findHostInstancesForRefresh;
869
+ internals.scheduleRefresh = scheduleRefresh;
870
+ internals.scheduleRoot = scheduleRoot;
871
+ internals.setRefreshHandler = setRefreshHandler;
872
+ // Enables DevTools to append owner stacks to error messages in DEV mode.
873
+ internals.getCurrentFiber = getCurrentFiberForDevTools;
874
+ }
875
+ if (enableSchedulingProfiler) {
876
+ // Conditionally inject these hooks only if Timeline profiler is supported by this build.
877
+ // This gives DevTools a way to feature detect that isn't tied to version number
878
+ // (since profiling and timeline are controlled by different feature flags).
879
+ internals.getLaneLabelMap = getLaneLabelMap;
880
+ internals.injectProfilingHooks = injectProfilingHooks;
881
+ }
882
+ return injectInternals(internals);
883
}
packages/react-reconciler/src/forks/ReactFiberConfig.custom.js
+4
@@ -42,6 +42,10 @@ export opaque type TransitionStatus = mixed;
42
export opaque type FormInstance = mixed;
43
export type EventResponder = any;
44
45
+export const rendererVersion = $$$config.rendererVersion;
46
+export const rendererPackageName = $$$config.rendererPackageName;
47
+export const extraDevToolsConfig = $$$config.extraDevToolsConfig;
48
+
49
export const getPublicInstance = $$$config.getPublicInstance;
50
export const getRootHostContext = $$$config.getRootHostContext;
51
export const getChildHostContext = $$$config.getChildHostContext;
packages/react-test-renderer/src/ReactFiberConfigTestHost.js
+4
@@ -14,6 +14,10 @@ import {
14
type EventPriority,
15
} from 'react-reconciler/src/ReactEventPriorities';
16
17
+export {default as rendererVersion} from 'shared/ReactVersion'; // TODO: Consider exporting the react-native version.
18
+export const rendererPackageName = 'react-test-renderer';
19
+export const extraDevToolsConfig = null;
20
+
21
export type Type = string;
22
export type Props = Object;
23
export type Container = {
packages/react-test-renderer/src/ReactTestRenderer.js
+2
-8
@@ -633,18 +633,12 @@ function wrapFiber(fiber: Fiber): ReactTestInstance {
633
}
634
635
// Enable ReactTestRenderer to be used to test DevTools integration.
636
-injectIntoDevTools({
637
- findFiberByHostInstance: (() => {
638
- throw new Error('TestRenderer does not support findFiberByHostInstance()');
639
- }: any),
640
- bundleType: __DEV__ ? 1 : 0,
641
- version: ReactVersion,
642
- rendererPackageName: 'react-test-renderer',
643
-});
636
+injectIntoDevTools();
637
638
export {
639
Scheduler as _Scheduler,
640
create,
641
batchedUpdates as unstable_batchedUpdates,
642
act,
643
+ ReactVersion as version,
644
};