/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
*/
'use strict';
const defaults = require('metro-config/src/defaults/defaults');
const virtualModule = require('./module').virtual;
const getPreludeCode = require('../lib/getPreludeCode');
import type {BuildResult, GraphFn, PostProcessModules} from './types.flow';
type BuildOptions = {|
+entryPointPaths: Iterable<string>,
+framework: string,
+getPolyfills: ({platform: ?string}) => $ReadOnlyArray<string>,
+graphFn: GraphFn,
+optimize: boolean,
+platform: string,
+postProcessModules: PostProcessModules,
+translateDefaultsPath: string => string,
|};
async function build(options: BuildOptions): Promise<BuildResult> {
const {
entryPointPaths,
getPolyfills,
graphFn,
optimize,
platform,
postProcessModules,
translateDefaultsPath,
} = options;
const graphOnlyModules = async m => (await graphFn(m)).modules;
const [graph, moduleSystem, polyfills] = await Promise.all([
(async () => {
const result = await graphFn(entryPointPaths);
const {modules, entryModules} = result;
const prModules = postProcessModules(modules, [...entryPointPaths]);
return {modules: prModules, entryModules};
})(),
graphOnlyModules([translateDefaultsPath(defaults.moduleSystem)]),
graphOnlyModules(getPolyfills({platform}).map(translateDefaultsPath)),
]);
const {entryModules} = graph;
const preludeScript = virtualModule(
getPreludeCode({
extraVars: {
__FRAMEWORK__: options.framework,
},
isDev: !optimize,
}),
'/<generated>/prelude.js',
);
const prependedScripts = [preludeScript, ...moduleSystem, ...polyfills];
return {
entryModules,
modules: [...prependedScripts, ...graph.modules],
};
}
module.exports = build;