Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Flight] Follow ups to bundler configs #18352

Merged
merged 1 commit into from Mar 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/react-client/src/ReactFlightClient.js
Expand Up @@ -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';

Expand Down
Expand Up @@ -8,8 +8,13 @@
*/

export {
resolveModuleReference,
preloadModule,
loadModule,
requireModule,
} from 'ReactFlightDOMRelayClientIntegration';

export type {ModuleMetaData} from 'ReactFlightDOMRelayClientIntegration';
export type {
ModuleReference,
ModuleMetaData,
} from 'ReactFlightDOMRelayClientIntegration';
Expand Up @@ -20,7 +20,7 @@ import {resolveModelToJSON} from 'react-server/src/ReactFlightServer';
import {
emitModel,
emitError,
resolveResourceMetaData,
resolveModuleMetaData as resolveModuleMetaDataImpl,
} from 'ReactFlightDOMRelayServerIntegration';

export type {
Expand All @@ -35,7 +35,7 @@ export function resolveModuleMetaData(
config: BundlerConfig,
resource: ModuleReference,
): ModuleMetaData {
return resolveResourceMetaData(resource);
return resolveModuleMetaDataImpl(resource);
}

type JSONValue =
Expand Down
Expand Up @@ -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();
},
};
Expand Down
Expand Up @@ -23,7 +23,7 @@ const ReactFlightDOMRelayServerIntegration = {
});
},
close(destination) {},
resolveResourceMetaData(resource) {
resolveModuleMetaDataImpl(resource) {
return resource;
},
};
Expand Down
Expand Up @@ -10,8 +10,18 @@
export type ModuleMetaData = {
id: string,
chunks: Array<string>,
name: string,
};

// eslint-disable-next-line no-unused-vars
export type ModuleReference<T> = ModuleMetaData;

export function resolveModuleReference<T>(
moduleData: ModuleMetaData,
): ModuleReference<T> {
return moduleData;
}

type Thenable = {
then(resolve: () => mixed, reject: (mixed) => mixed): mixed,
...
Expand All @@ -26,12 +36,11 @@ const chunkCache: Map<string, null | Thenable> = 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<T>(moduleData: ModuleReference<T>): void {
loadModule(moduleData);
}

export function loadModule<T>(moduleData: ModuleReference<T>): null | Thenable {
let chunks = moduleData.chunks;
let anyRemainingThenable = null;
for (let i = 0; i < chunks.length; i++) {
Expand All @@ -48,6 +57,6 @@ export function preloadModule(moduleData: ModuleMetaData): null | Thenable {
return anyRemainingThenable;
}

export function requireModule<T>(moduleData: ModuleMetaData): T {
return __webpack_require__(moduleData.id).default;
export function requireModule<T>(moduleData: ModuleReference<T>): T {
return __webpack_require__(moduleData.id)[moduleData.name];
}
17 changes: 13 additions & 4 deletions scripts/flow/react-relay-hooks.js
Expand Up @@ -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<T>(
moduleData: ModuleMetaData,
): ModuleReference<T>;
declare export function preloadModule<T>(
moduleReference: ModuleReference<T>,
): void;
declare export function loadModule<T>(
moduleReference: ModuleReference<T>,
): null | Thenable;
declare export function requireModule<T>(moduleData: ModuleMetaData): T;
declare export function requireModule<T>(
moduleReference: ModuleReference<T>,
): T;
}