/** * 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 * @format */ 'use strict'; const TerminalReporter = require('metro/src/lib/TerminalReporter'); const blacklist = require('./blacklist'); const getMaxWorkers = require('metro/src/lib/getMaxWorkers'); const os = require('os'); const path = require('path'); const { providesModuleNodeModules, assetExts, sourceExts, platforms, DEFAULT_METRO_MINIFIER_PATH, defaultCreateModuleIdFactory, } = require('./defaults'); const {FileStore} = require('metro-cache'); const {Terminal} = require('metro-core'); import type {ConfigT} from '../configTypes.flow'; const getDefaultValues = (projectRoot: ?string): ConfigT => ({ resolver: { allowPnp: true, assetExts, platforms, sourceExts, providesModuleNodeModules: providesModuleNodeModules.slice(), resolverMainFields: ['browser', 'main'], extraNodeModules: {}, resolveRequest: null, hasteImplModulePath: undefined, blacklistRE: blacklist(), useWatchman: true, virtualMapper: file => [file], }, serializer: { polyfillModuleNames: [], getRunModuleStatement: (moduleId: number | string) => `__r(${JSON.stringify(moduleId)});`, getPolyfills: () => [], postProcessBundleSourcemap: ({code, map, outFileName}) => ({code, map}), getModulesRunBeforeMainModule: () => [], processModuleFilter: module => true, createModuleIdFactory: defaultCreateModuleIdFactory, experimentalSerializerHook: () => {}, customSerializer: null, }, server: { useGlobalHotkey: true, port: 8080, enableVisualizer: false, enhanceMiddleware: middleware => middleware, }, transformer: { assetPlugins: [], asyncRequireModulePath: 'metro/src/lib/bundle-modules/asyncRequire', assetRegistryPath: 'missing-asset-registry-path', babelTransformerPath: 'metro-babel-transformer', dynamicDepsInPackages: 'throwAtRuntime', enableBabelRCLookup: true, enableBabelRuntime: true, getTransformOptions: async () => ({ transform: {experimentalImportSupport: false, inlineRequires: false}, preloadedModules: false, ramGroups: [], }), minifierConfig: { mangle: { toplevel: false, }, output: { ascii_only: true, quote_style: 3, wrap_iife: true, }, sourceMap: { includeSources: false, }, toplevel: false, compress: { // reduce_funcs inlines single-use functions, which cause perf regressions. reduce_funcs: false, }, }, minifierPath: DEFAULT_METRO_MINIFIER_PATH, optimizationSizeLimit: 150 * 1024, // 150 KiB. postMinifyProcess: x => x, transformVariants: {default: {}}, workerPath: 'metro/src/DeltaBundler/Worker', publicPath: '/assets', }, cacheStores: [ new FileStore({ root: path.join(os.tmpdir(), 'metro-cache'), }), ], cacheVersion: '1.0', // We assume the default project path is two levels up from // node_modules/metro/ projectRoot: projectRoot || path.resolve(__dirname, '../../..'), stickyWorkers: true, watchFolders: [], transformerPath: require.resolve('metro/src/JSTransformer/worker.js'), maxWorkers: getMaxWorkers(), resetCache: false, reporter: new TerminalReporter(new Terminal(process.stdout)), visualizer: {presets: []}, }); async function getDefaultConfig(rootPath: ?string): Promise<ConfigT> { // We can add more logic here to get a sensible default configuration, for // now we just return a stub. return getDefaultValues(rootPath); } module.exports = getDefaultConfig; module.exports.getDefaultValues = getDefaultValues;