fusion-cli/build/get-babel-config.js (101 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 */
const modernBrowserVersions = require('./modern-browser-versions.js');
/*::
type Target = "node-native" | "node-bundled" | "browser-modern" | "browser-legacy";
type JSXTransformOpts = {
pragma?: string,
pragmaFrag?: string,
};
type BabelConfigOpts =
| {|
specOnly: true,
target: Target,
plugins?: Array<any>,
presets?: Array<any>,
|}
| {|
specOnly: false,
dev: boolean,
target: Target,
plugins?: Array<any>,
presets?: Array<any>,
jsx?: JSXTransformOpts,
assumeNoImportSideEffects?: boolean,
fusionTransforms: boolean
|};
*/
module.exports = function getBabelConfig(opts /*: BabelConfigOpts */) {
const {target, plugins, presets} = opts;
// Shared base env preset options
let envPresetOpts /*: Object*/ = {
useBuiltIns: 'entry',
corejs: '3.0.0',
};
// Shared base configuration
let config = {
plugins: [
require.resolve('@babel/plugin-syntax-dynamic-import'),
[
require.resolve('@rtsao/plugin-proposal-class-properties'),
{loose: false},
],
opts.dev &&
require.resolve('babel-plugin-transform-styletron-display-name'),
].filter(Boolean),
presets: [[require.resolve('@babel/preset-env'), envPresetOpts]],
babelrc: false,
};
if (opts.specOnly === false) {
let {jsx, assumeNoImportSideEffects, dev, fusionTransforms} = opts;
if (!jsx) {
jsx = {};
}
config.presets.push([
require.resolve('@babel/preset-react'),
{
pragma: jsx.pragma,
pragmaFrag: jsx.pragmaFrag,
development: dev,
},
]);
config.plugins.unshift(
require.resolve('@babel/plugin-transform-flow-strip-types')
);
if (fusionTransforms) {
config.presets.push([fusionPreset, {target, assumeNoImportSideEffects}]);
} else {
config.plugins.push(require.resolve('./babel-plugins/babel-plugin-gql'));
}
}
if (target === 'node-native') {
envPresetOpts.modules = 'commonjs';
envPresetOpts.targets = {
node: 'current',
};
config.plugins.push(require.resolve('babel-plugin-dynamic-import-node'));
} else if (target === 'node-bundled') {
envPresetOpts.modules = false;
envPresetOpts.targets = {
node: 'current',
};
} else if (target === 'browser-modern') {
envPresetOpts.modules = false;
envPresetOpts.targets = modernBrowserVersions;
envPresetOpts.useBuiltIns = 'entry';
} else if (target === 'browser-legacy') {
envPresetOpts.modules = false;
envPresetOpts.targets = {
ie: 9,
};
}
if (plugins) {
// Note: babel plugins run first to last, so custom plugins go first
config.plugins.unshift(...plugins);
}
if (presets) {
// Note: babel presets run last to first, so custom plugins go last
config.presets.push(...presets);
}
return config;
};
/*::
type FusionPresetOpts = {
target: Target,
assumeNoImportSideEffects: boolean,
};
*/
/**
* This is abstracted into preset for the following reasoning:
* The tree shake plugin needs to run after JSX transform.
* However, the JSX transform is inside the React preset.
* Because plugins run before presets, the tree shake plugin
* must also live in a preset.
*/
function fusionPreset(
context /*: any */,
{target, assumeNoImportSideEffects} /*: FusionPresetOpts */
) {
const targetEnv =
target === 'node-native' || target === 'node-bundled' ? 'node' : 'browser';
return {
plugins: [
require.resolve('./babel-plugins/babel-plugin-gql'),
require.resolve('./babel-plugins/babel-plugin-asseturl'),
require.resolve('./babel-plugins/babel-plugin-pure-create-plugin'),
require.resolve('./babel-plugins/babel-plugin-sync-chunk-ids'),
require.resolve('./babel-plugins/babel-plugin-sw'),
require.resolve('./babel-plugins/babel-plugin-sync-chunk-paths'),
require.resolve('./babel-plugins/babel-plugin-chunkid'),
require.resolve('./babel-plugins/babel-plugin-workerurl'),
[
require.resolve('babel-plugin-transform-cup-globals'),
{target: targetEnv},
],
assumeNoImportSideEffects && [
require.resolve('babel-plugin-transform-prune-unused-imports'),
{
falsyExpressions:
targetEnv === 'node' ? ['__BROWSER__'] : ['__NODE__'],
},
],
].filter(Boolean),
};
}