UNPKG

3.17 kBJavaScriptView Raw
1"use strict";
2
3const browserslist = require('browserslist');
4
5const semver = require('semver');
6
7const {
8 ifAnyDep,
9 parseEnv,
10 appDirectory,
11 pkg
12} = require('../utils');
13
14const {
15 BABEL_ENV,
16 NODE_ENV,
17 BUILD_FORMAT
18} = process.env;
19const isTest = (BABEL_ENV || NODE_ENV) === 'test';
20const isPreact = parseEnv('BUILD_PREACT', false);
21const isRollup = parseEnv('BUILD_ROLLUP', false);
22const isUMD = BUILD_FORMAT === 'umd';
23const isCJS = BUILD_FORMAT === 'cjs';
24const isWebpack = parseEnv('BUILD_WEBPACK', false);
25const treeshake = parseEnv('BUILD_TREESHAKE', isRollup || isWebpack);
26const alias = parseEnv('BUILD_ALIAS', isPreact ? {
27 react: 'preact'
28} : null);
29const hasBabelRuntimeDep = Boolean(pkg.dependencies && pkg.dependencies['@babel/runtime']);
30const 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.';
31
32if (!treeshake && !hasBabelRuntimeDep && !isTest) {
33 throw new Error(RUNTIME_HELPERS_WARN);
34} else if (treeshake && !isUMD && !hasBabelRuntimeDep) {
35 console.warn(RUNTIME_HELPERS_WARN);
36}
37/**
38 * use the strategy declared by browserslist to load browsers configuration.
39 * fallback to the default if don't found custom configuration
40 * @see https://github.com/browserslist/browserslist/blob/master/node.js#L139
41 */
42
43
44const browsersConfig = browserslist.loadConfig({
45 path: appDirectory
46}) || ['ie 10', 'ios 7'];
47const envTargets = isTest ? {
48 node: 'current'
49} : isWebpack || isRollup ? {
50 browsers: browsersConfig
51} : {
52 node: getNodeVersion(pkg)
53};
54const envOptions = {
55 modules: false,
56 loose: true,
57 targets: envTargets
58};
59
60module.exports = () => ({
61 presets: [[require.resolve('@babel/preset-env'), envOptions], ifAnyDep(['react', 'preact'], [require.resolve('@babel/preset-react'), {
62 pragma: isPreact ? 'React.h' : undefined
63 }]), ifAnyDep(['flow-bin'], [require.resolve('@babel/preset-flow')])].filter(Boolean),
64 plugins: [[require.resolve('@babel/plugin-transform-runtime'), {
65 useESModules: treeshake && !isCJS
66 }], require.resolve('babel-plugin-macros'), alias ? [require.resolve('babel-plugin-module-resolver'), {
67 root: ['./src'],
68 alias
69 }] : null, [require.resolve('babel-plugin-transform-react-remove-prop-types'), isPreact ? {
70 removeImport: true
71 } : {
72 mode: 'unsafe-wrap'
73 }], isUMD ? require.resolve('babel-plugin-transform-inline-environment-variables') : null, [require.resolve('@babel/plugin-proposal-class-properties'), {
74 loose: true
75 }], require.resolve('babel-plugin-minify-dead-code-elimination'), treeshake ? null : require.resolve('@babel/plugin-transform-modules-commonjs')].filter(Boolean)
76});
77
78function getNodeVersion({
79 engines: {
80 node: nodeVersion = '8'
81 } = {}
82}) {
83 const oldestVersion = semver.validRange(nodeVersion).replace(/[>=<|]/g, ' ').split(' ').filter(Boolean).sort(semver.compare)[0];
84
85 if (!oldestVersion) {
86 throw new Error(`Unable to determine the oldest version in the range in your package.json at engines.node: "${nodeVersion}". Please attempt to make it less ambiguous.`);
87 }
88
89 return oldestVersion;
90}
\No newline at end of file