1 | "use strict";
|
2 |
|
3 | const browserslist = require('browserslist');
|
4 |
|
5 | const semver = require('semver');
|
6 |
|
7 | const {
|
8 | ifAnyDep,
|
9 | parseEnv,
|
10 | appDirectory,
|
11 | pkg
|
12 | } = require('../utils');
|
13 |
|
14 | const {
|
15 | BABEL_ENV,
|
16 | NODE_ENV,
|
17 | BUILD_FORMAT
|
18 | } = process.env;
|
19 | const isTest = (BABEL_ENV || NODE_ENV) === 'test';
|
20 | const isPreact = parseEnv('BUILD_PREACT', false);
|
21 | const isRollup = parseEnv('BUILD_ROLLUP', false);
|
22 | const isUMD = BUILD_FORMAT === 'umd';
|
23 | const isCJS = BUILD_FORMAT === 'cjs';
|
24 | const isWebpack = parseEnv('BUILD_WEBPACK', false);
|
25 | const treeshake = parseEnv('BUILD_TREESHAKE', isRollup || isWebpack);
|
26 | const alias = parseEnv('BUILD_ALIAS', isPreact ? {
|
27 | react: 'preact'
|
28 | } : null);
|
29 | const hasBabelRuntimeDep = Boolean(pkg.dependencies && pkg.dependencies['@babel/runtime']);
|
30 | 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.';
|
31 |
|
32 | if (!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 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 | const browsersConfig = browserslist.loadConfig({
|
45 | path: appDirectory
|
46 | }) || ['ie 10', 'ios 7'];
|
47 | const envTargets = isTest ? {
|
48 | node: 'current'
|
49 | } : isWebpack || isRollup ? {
|
50 | browsers: browsersConfig
|
51 | } : {
|
52 | node: getNodeVersion(pkg)
|
53 | };
|
54 | const envOptions = {
|
55 | modules: false,
|
56 | loose: true,
|
57 | targets: envTargets
|
58 | };
|
59 |
|
60 | module.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 |
|
78 | function 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 |