diff --git a/packages/react-client/src/ReactFlightClient.js b/packages/react-client/src/ReactFlightClient.js index fd2af77004c9..06818eaf028f 100644 --- a/packages/react-client/src/ReactFlightClient.js +++ b/packages/react-client/src/ReactFlightClient.js @@ -9,10 +9,15 @@ import {REACT_ELEMENT_TYPE} from 'shared/ReactSymbols'; -// import type {ModuleMetaData} from './ReactFlightClientHostConfig'; +// import type { +// ModuleReference, +// ModuleMetaData, +// } from './ReactFlightClientHostConfig'; // import { +// resolveModuleReference, // preloadModule, +// loadModule, // requireModule, // } from './ReactFlightClientHostConfig'; diff --git a/packages/react-flight-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js b/packages/react-flight-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js index 7f86dcfb19ca..44ff4435616e 100644 --- a/packages/react-flight-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js +++ b/packages/react-flight-dom-relay/src/ReactFlightDOMRelayClientHostConfig.js @@ -8,8 +8,13 @@ */ export { + resolveModuleReference, preloadModule, + loadModule, requireModule, } from 'ReactFlightDOMRelayClientIntegration'; -export type {ModuleMetaData} from 'ReactFlightDOMRelayClientIntegration'; +export type { + ModuleReference, + ModuleMetaData, +} from 'ReactFlightDOMRelayClientIntegration'; diff --git a/packages/react-flight-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js b/packages/react-flight-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js index 4b5fd5b33f3e..80ad7d6077b4 100644 --- a/packages/react-flight-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js +++ b/packages/react-flight-dom-relay/src/ReactFlightDOMRelayServerHostConfig.js @@ -20,7 +20,7 @@ import {resolveModelToJSON} from 'react-server/src/ReactFlightServer'; import { emitModel, emitError, - resolveResourceMetaData, + resolveModuleMetaData as resolveModuleMetaDataImpl, } from 'ReactFlightDOMRelayServerIntegration'; export type { @@ -35,7 +35,7 @@ export function resolveModuleMetaData( config: BundlerConfig, resource: ModuleReference, ): ModuleMetaData { - return resolveResourceMetaData(resource); + return resolveModuleMetaDataImpl(resource); } type JSONValue = diff --git a/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayClientIntegration.js b/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayClientIntegration.js index 0df7d51104ff..75a2f4536059 100644 --- a/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayClientIntegration.js +++ b/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayClientIntegration.js @@ -14,10 +14,14 @@ function getFakeModule() { } const ReactFlightDOMRelayClientIntegration = { - preloadModule(jsResource) { + resolveModuleReference(moduleData) { + return moduleData; + }, + preloadModule(moduleReference) {}, + loadModule(moduleReference) { return null; }, - requireModule(jsResource) { + requireModule(moduleReference) { return getFakeModule(); }, }; diff --git a/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayServerIntegration.js b/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayServerIntegration.js index 89304a070de4..9b0f970c75e7 100644 --- a/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayServerIntegration.js +++ b/packages/react-flight-dom-relay/src/__mocks__/ReactFlightDOMRelayServerIntegration.js @@ -23,7 +23,7 @@ const ReactFlightDOMRelayServerIntegration = { }); }, close(destination) {}, - resolveResourceMetaData(resource) { + resolveModuleMetaDataImpl(resource) { return resource; }, }; diff --git a/packages/react-flight-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js b/packages/react-flight-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js index f3866e851256..570ab39a9e27 100644 --- a/packages/react-flight-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js +++ b/packages/react-flight-dom-webpack/src/ReactFlightClientWebpackBundlerConfig.js @@ -10,8 +10,18 @@ export type ModuleMetaData = { id: string, chunks: Array, + name: string, }; +// eslint-disable-next-line no-unused-vars +export type ModuleReference = ModuleMetaData; + +export function resolveModuleReference( + moduleData: ModuleMetaData, +): ModuleReference { + return moduleData; +} + type Thenable = { then(resolve: () => mixed, reject: (mixed) => mixed): mixed, ... @@ -26,12 +36,11 @@ const chunkCache: Map = new Map(); // Returning null means that all dependencies are fulfilled and we // can synchronously require the module now. A thenable is returned // that when resolved, means we can try again. -export function preloadModule(moduleData: ModuleMetaData): null | Thenable { - let moduleEntry = require.cache[moduleData.id]; - if (moduleEntry) { - // Fast exit if this module has already been loaded. - return null; - } +export function preloadModule(moduleData: ModuleReference): void { + loadModule(moduleData); +} + +export function loadModule(moduleData: ModuleReference): null | Thenable { let chunks = moduleData.chunks; let anyRemainingThenable = null; for (let i = 0; i < chunks.length; i++) { @@ -48,6 +57,6 @@ export function preloadModule(moduleData: ModuleMetaData): null | Thenable { return anyRemainingThenable; } -export function requireModule(moduleData: ModuleMetaData): T { - return __webpack_require__(moduleData.id).default; +export function requireModule(moduleData: ModuleReference): T { + return __webpack_require__(moduleData.id)[moduleData.name]; } diff --git a/scripts/flow/react-relay-hooks.js b/scripts/flow/react-relay-hooks.js index b7a2806fa36f..bdd5f43d3103 100644 --- a/scripts/flow/react-relay-hooks.js +++ b/scripts/flow/react-relay-hooks.js @@ -37,15 +37,24 @@ declare module 'ReactFlightDOMRelayServerIntegration' { declare export opaque type ModuleReference; declare export opaque type ModuleMetaData; - declare export function resolveResourceMetaData( - resource: ModuleReference, + declare export function resolveModuleMetaData( + resourceReference: ModuleReference, ): ModuleMetaData; } declare module 'ReactFlightDOMRelayClientIntegration' { + declare export opaque type ModuleReference; declare export opaque type ModuleMetaData; - declare export function preloadModule( + declare export function resolveModuleReference( moduleData: ModuleMetaData, + ): ModuleReference; + declare export function preloadModule( + moduleReference: ModuleReference, + ): void; + declare export function loadModule( + moduleReference: ModuleReference, ): null | Thenable; - declare export function requireModule(moduleData: ModuleMetaData): T; + declare export function requireModule( + moduleReference: ModuleReference, + ): T; }