type WebpackMap = {
[filepath: string]: {
[name: string]: ModuleMetaData,
},
};
export type BundlerConfig = WebpackMap;
export type ModuleReference<T> = {
$$typeof: symbol,
filepath: string,
name: string,
async: boolean,
};
export type ModuleMetaData = {
id: string,
chunks: Array<string>,
name: string,
async: boolean,
};
export type ModuleKey = string;
const MODULE_TAG = Symbol.for('react.module.reference');
export function getModuleKey(reference: ModuleReference<any>): ModuleKey {
return (
reference.filepath +
'#' +
reference.name +
(reference.async ? '#async' : '')
);
}
export function isModuleReference(reference: Object): boolean {
return reference.$$typeof === MODULE_TAG;
}
export function resolveModuleMetaData<T>(
config: BundlerConfig,
moduleReference: ModuleReference<T>,
): ModuleMetaData {
const resolvedModuleData =
config[moduleReference.filepath][moduleReference.name];
if (moduleReference.async) {
return {
id: resolvedModuleData.id,
chunks: resolvedModuleData.chunks,
name: resolvedModuleData.name,
async: true,
};
} else {
return resolvedModuleData;
}
}