@samitouri / QOS-React / commits / 146df7c311

[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 };