diff --git a/packages/react-reconciler/src/ReactFiberCache.js b/packages/react-reconciler/src/ReactFiberCache.js index 08a1406904..379425fc22 100644 --- a/packages/react-reconciler/src/ReactFiberCache.js +++ b/packages/react-reconciler/src/ReactFiberCache.js @@ -7,13 +7,15 @@ * @flow */ -import type {AsyncDispatcher} from './ReactInternalTypes'; +import type {AsyncDispatcher, Fiber} from './ReactInternalTypes'; import type {Cache} from './ReactFiberCacheComponent'; import {enableCache} from 'shared/ReactFeatureFlags'; import {readContext} from './ReactFiberNewContext'; import {CacheContext} from './ReactFiberCacheComponent'; +import {disableStringRefs} from 'shared/ReactFeatureFlags'; + function getCacheForType(resourceType: () => T): T { if (!enableCache) { throw new Error('Not implemented.'); @@ -27,6 +29,13 @@ function getCacheForType(resourceType: () => T): T { return cacheForType; } -export const DefaultAsyncDispatcher: AsyncDispatcher = { +export const DefaultAsyncDispatcher: AsyncDispatcher = ({ getCacheForType, -}; +}: any); + +if (__DEV__ || !disableStringRefs) { + DefaultAsyncDispatcher.getOwner = (): null | Fiber => { + // TODO + return null; + }; +} diff --git a/packages/react-reconciler/src/ReactInternalTypes.js b/packages/react-reconciler/src/ReactInternalTypes.js index db5078e3f5..6fa9142e2d 100644 --- a/packages/react-reconciler/src/ReactInternalTypes.js +++ b/packages/react-reconciler/src/ReactInternalTypes.js @@ -436,4 +436,6 @@ export type Dispatcher = { export type AsyncDispatcher = { getCacheForType: (resourceType: () => T) => T, + // DEV-only (or !disableStringRefs) + getOwner: () => null | Fiber | ReactComponentInfo, }; diff --git a/packages/react-server/src/ReactFizzCache.js b/packages/react-server/src/ReactFizzCache.js index c77b650e79..8e8cb2e219 100644 --- a/packages/react-server/src/ReactFizzCache.js +++ b/packages/react-server/src/ReactFizzCache.js @@ -9,10 +9,19 @@ import type {AsyncDispatcher} from 'react-reconciler/src/ReactInternalTypes'; +import {disableStringRefs} from 'shared/ReactFeatureFlags'; + function getCacheForType(resourceType: () => T): T { throw new Error('Not implemented.'); } -export const DefaultAsyncDispatcher: AsyncDispatcher = { +export const DefaultAsyncDispatcher: AsyncDispatcher = ({ getCacheForType, -}; +}: any); + +if (__DEV__ || !disableStringRefs) { + // Fizz never tracks owner but the JSX runtime looks for this. + DefaultAsyncDispatcher.getOwner = (): null => { + return null; + }; +} diff --git a/packages/react-server/src/flight/ReactFlightServerCache.js b/packages/react-server/src/flight/ReactFlightServerCache.js index eefc5f9f3e..8ff0cd5bc9 100644 --- a/packages/react-server/src/flight/ReactFlightServerCache.js +++ b/packages/react-server/src/flight/ReactFlightServerCache.js @@ -7,10 +7,14 @@ * @flow */ +import type {ReactComponentInfo} from 'shared/ReactTypes'; + import type {AsyncDispatcher} from 'react-reconciler/src/ReactInternalTypes'; import {resolveRequest, getCache} from '../ReactFlightServer'; +import {disableStringRefs} from 'shared/ReactFeatureFlags'; + function resolveCache(): Map { const request = resolveRequest(); if (request) { @@ -19,7 +23,7 @@ function resolveCache(): Map { return new Map(); } -export const DefaultAsyncDispatcher: AsyncDispatcher = { +export const DefaultAsyncDispatcher: AsyncDispatcher = ({ getCacheForType(resourceType: () => T): T { const cache = resolveCache(); let entry: T | void = (cache.get(resourceType): any); @@ -30,4 +34,16 @@ export const DefaultAsyncDispatcher: AsyncDispatcher = { } return entry; }, -}; +}: any); + +if (__DEV__) { + DefaultAsyncDispatcher.getOwner = (): null | ReactComponentInfo => { + // TODO + return null; + }; +} else if (!disableStringRefs) { + // Server Components never use string refs but the JSX runtime looks for it. + DefaultAsyncDispatcher.getOwner = (): null | ReactComponentInfo => { + return null; + }; +} diff --git a/packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js b/packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js index 35b59b61d1..bc2d4bee79 100644 --- a/packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js +++ b/packages/react-suspense-test-utils/src/ReactSuspenseTestUtils.js @@ -22,6 +22,9 @@ export function waitForSuspense(fn: () => T): Promise { } return entry; }, + getOwner(): null { + return null; + }, }; // Not using async/await because we don't compile it. return new Promise((resolve, reject) => {