@interaktiv/dia-scripts
Version:
CLI toolbox with common scripts for most sort of projects at DIA
82 lines (73 loc) • 3.16 kB
JavaScript
;
const browserslist = require('browserslist');
const {
ifAnyDep,
parseEnv,
appDirectory,
pkg,
getSupportedNodeVersion
} = require('../utils');
const {
BABEL_ENV,
NODE_ENV,
BUILD_FORMAT
} = process.env;
const isTest = (BABEL_ENV || NODE_ENV) === 'test';
const isPreact = parseEnv('BUILD_PREACT', false);
const isRollup = parseEnv('BUILD_ROLLUP', false);
const isUMD = BUILD_FORMAT === 'umd';
const isCJS = BUILD_FORMAT === 'cjs';
const isWebpack = parseEnv('BUILD_WEBPACK', false);
const treeshake = parseEnv('BUILD_TREESHAKE', isRollup || isWebpack);
const alias = parseEnv('BUILD_ALIAS', isPreact ? {
react: 'preact'
} : null);
const hasBabelRuntimeDep = Boolean(pkg.dependencies && pkg.dependencies['@babel/runtime']);
const RUNTIME_HELPERS_WARN = 'You should add @babel/runtime as dependency to your package. It will allow reusing "babel helpers" from node_modules rather than bundling their copies into your files.';
if (treeshake === false && hasBabelRuntimeDep === false && isTest === false) {
throw new Error(RUNTIME_HELPERS_WARN);
} else if (treeshake && isUMD === false && hasBabelRuntimeDep === false) {
console.warn(RUNTIME_HELPERS_WARN);
}
/**
* Use the strategy declared by browserslist to load browsers configuration.
* fallback to the default if don't found custom configuration
*
* @see https://github.com/browserslist/browserslist/blob/master/node.js#L139
*/
const browsersConfig = browserslist.loadConfig({
path: appDirectory
}) || ['ie 10', 'ios 9'];
const minimumSupportedNodeVersion = getSupportedNodeVersion(pkg);
if (!minimumSupportedNodeVersion) {
throw new Error(`Unable to determine the oldest version in the range in your package.json at engines.node: "${pkg.engines.node}". Please attempt to make it less ambiguous.`);
}
const envTargets = [isTest ? {
node: 'current'
} : null, isWebpack || isRollup ? {
browsers: browsersConfig
} : null, {
node: minimumSupportedNodeVersion
}].filter(Boolean).shift();
const envOptions = {
modules: false,
loose: true,
targets: envTargets
}; // TODO: Make it possible to adjust source-dir via flag
module.exports = () => ({
presets: [[require.resolve('@babel/preset-env'), envOptions], ifAnyDep(['react', 'preact'], [require.resolve('@babel/preset-react'), {
pragma: isPreact ? 'React.h' : undefined
}]), ifAnyDep(['flow-bin'], [require.resolve('@babel/preset-flow')])].filter(Boolean),
plugins: [[require.resolve('@babel/plugin-transform-runtime'), {
useESModules: treeshake && isCJS === false
}], require.resolve('babel-plugin-macros'), alias ? [require.resolve('babel-plugin-module-resolver'), {
root: ['./src'],
alias
}] : null, [require.resolve('babel-plugin-transform-react-remove-prop-types'), isPreact ? {
removeImport: true
} : {
mode: 'unsafe-wrap'
}], isUMD ? require.resolve('babel-plugin-transform-inline-environment-variables') : null, [require.resolve('@babel/plugin-proposal-class-properties'), {
loose: true
}], require.resolve('babel-plugin-minify-dead-code-elimination'), treeshake ? null : require.resolve('@babel/plugin-transform-modules-commonjs')].filter(Boolean)
});