fusion-cli/build/load-fusionrc.js (137 lines of code) (raw):

/** Copyright (c) 2018 Uber Technologies, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow */ /* eslint-env node */ /* eslint-disable no-console */ const fs = require('fs'); const path = require('path'); /*:: type BundleResult = 'universal' | 'browser-only'; type TransformResult = 'all' | 'spec' | 'none'; export type FusionRC = { babel?: {plugins?: Array<any>, presets?: Array<any>}, splitChunks?: any, modernBuildOnly?: boolean, assumeNoImportSideEffects?: boolean, defaultImportSideEffects?: boolean | Array<string>, experimentalCompile?: boolean, experimentalTransformTest?: (modulePath: string, defaults: TransformResult) => TransformResult, experimentalBundleTest?: (modulePath: string, defaults: BundleResult) => BundleResult, nodeBuiltins?: {[string]: any}, jest?: {transformIgnorePatterns?: Array<string>}, zopfli?: boolean, gzip?: boolean, brotli?:boolean, }; */ module.exports = function validateConfig( dir /*: string */, silent /*: boolean */ = false ) /*: FusionRC */ { const configPath = path.join(dir, '.fusionrc.js'); let config; if (fs.existsSync(configPath)) { // $FlowFixMe config = require(configPath); if (!isValid(config, silent)) { throw new Error('.fusionrc.js is invalid'); } } else { config = {}; } return config; }; function isValid(config, silent) { if (!(typeof config === 'object' && config !== null)) { throw new Error('.fusionrc.js must export an object'); } if ( !Object.keys(config).every(key => [ 'babel', 'splitChunks', 'modernBuildOnly', 'defaultImportSideEffects', 'assumeNoImportSideEffects', 'experimentalCompile', 'experimentalTransformTest', 'experimentalBundleTest', 'nodeBuiltins', 'jest', 'brotli', 'zopfli', // TODO: Remove redundant zopfli option 'gzip', ].includes(key) ) ) { if (config.experimentalSideEffectsTest) { throw new Error( `experimentalSideEffectsTest has been removed. Use assumeNoImportSideEffects instead.` ); } throw new Error(`Invalid property in .fusionrc.js`); } if (config.experimentalCompile && config.experimentalTransformTest) { throw new Error( `Cannot use both experimentalCompile and experimentalTransformTest in .fusionrc.js` ); } if (config.experimentalCompile && config.experimentalBundleTest) { throw new Error( `Cannot use both experimentalCompile and experimentalBundleTest in .fusionrc.js` ); } if (config.experimentalCompile) { if (!silent) { console.log( 'WARNING: experimentalCompile is deprecated. Use experimentalTransformTest instead.' ); } config.experimentalTransformTest = (file, defaults) => { return 'all'; }; delete config.experimentalCompile; } if ( config.babel && !Object.keys(config.babel).every(el => ['plugins', 'presets'].includes(el)) ) { throw new Error( `Only "plugins" and "presets" are supported in fusionrc.js babel config` ); } if ( !( config.assumeNoImportSideEffects === false || config.assumeNoImportSideEffects === true || config.assumeNoImportSideEffects === void 0 ) ) { throw new Error( 'assumeNoImportSideEffects must be true, false, or undefined in fusionrc.js config' ); } if ( !( config.zopfli === false || config.zopfli === true || config.zopfli === void 0 ) ) { throw new Error('zopfli must be true, false, or undefined in fusionrc.js'); } if (config.zopfli === false || config.zopfli === true) { console.warn('`zopfli` option has been deprecated. Use `gzip` instead'); } if ( !(config.gzip === false || config.gzip === true || config.gzip === void 0) ) { throw new Error('gzip must be true, false, or undefined in fusionrc.js'); } if ( !( config.brotli === false || config.brotli === true || config.brotli === void 0 ) ) { throw new Error('brotli must be true, false, or undefined in fusionrc.js'); } if ( !( config.defaultImportSideEffects === void 0 || config.defaultImportSideEffects === true || config.defaultImportSideEffects === false || (Array.isArray(config.defaultImportSideEffects) && config.defaultImportSideEffects.every(item => typeof item === 'string')) ) ) { throw new Error( 'defaultImportSideEffects must be true, false, or an array of strings in fusionrc.js' ); } if ( config.defaultImportSideEffects !== void 0 && config.assumeNoImportSideEffects !== void 0 ) { throw new Error( `Cannot use both defaultImportSideEffects and assumeNoImportSideEffects in .fusionrc.js` ); } return true; }