1 | const resolvePreset = function (presetName) {
|
2 | return require.resolve(`babel-preset-${presetName}`);
|
3 | };
|
4 |
|
5 | const resolvePlugin = function (pluginName) {
|
6 | return require.resolve(`babel-plugin-${pluginName}`);
|
7 | };
|
8 |
|
9 | module.exports = function createOpts(env, react, { presets: otherPresets, plugins: otherPlugins } = {}) {
|
10 | const production = !env.endsWith('-dev');
|
11 |
|
12 | if (!production) {
|
13 | env = env.slice(0, -4);
|
14 | }
|
15 |
|
16 | if (env === 'doc') {
|
17 | return {
|
18 | presets: [
|
19 | 'jsdoc',
|
20 | 'jsdoc/object-rest',
|
21 | react && 'react',
|
22 | resolvePreset('stage-1'),
|
23 | ].filter(Boolean),
|
24 | plugins: [
|
25 | 'add-jsdoc-annotations',
|
26 | resolvePlugin('transform-flow-strip-types'),
|
27 | ]
|
28 | };
|
29 | }
|
30 |
|
31 | let presets;
|
32 | let browser;
|
33 | let modernBrowsers = false;
|
34 |
|
35 | switch (env) {
|
36 | case 'es5':
|
37 | throw new Error('use olderNode instead.');
|
38 |
|
39 | case 'test':
|
40 | case 'node6':
|
41 | presets = [
|
42 | 'es2015-node6/object-rest',
|
43 | react && 'react',
|
44 | resolvePreset('stage-1'),
|
45 | ];
|
46 | browser = false;
|
47 | break;
|
48 |
|
49 | case 'older-node':
|
50 | presets = [
|
51 | 'es2015',
|
52 | react && 'react',
|
53 | resolvePreset('stage-1'),
|
54 | ];
|
55 | browser = false;
|
56 | break;
|
57 |
|
58 | case 'webpack':
|
59 | presets = [
|
60 | ['es2015', { modules: false }],
|
61 | react && 'react',
|
62 | resolvePreset('stage-1'),
|
63 | ];
|
64 | browser = true;
|
65 | break;
|
66 |
|
67 | case 'webpack-modern-browsers':
|
68 | presets = [
|
69 | ['modern-browsers', { modules: false, objectRest: true }],
|
70 | react && 'react',
|
71 | resolvePreset('stage-1'),
|
72 | ];
|
73 | browser = true;
|
74 | modernBrowsers = true;
|
75 | break;
|
76 |
|
77 | case 'browsers':
|
78 | presets = [
|
79 | 'es2015',
|
80 | react && 'react',
|
81 | resolvePreset('stage-1'),
|
82 | ];
|
83 | browser = true;
|
84 | break;
|
85 |
|
86 | default:
|
87 | throw new Error(`Unsupported env ${env}`);
|
88 |
|
89 | }
|
90 |
|
91 | return {
|
92 | presets: presets.concat(otherPresets || []).filter(Boolean),
|
93 | plugins: [
|
94 | resolvePlugin('syntax-flow'),
|
95 | [resolvePlugin('import-rename'), { '^([a-z\\-]+|[\./]+)/src(.*)$': '$1$2' }],
|
96 | !production && resolvePlugin('tcomb-forked'),
|
97 | resolvePlugin('transform-flow-strip-types'),
|
98 | react && resolvePlugin('react-require'),
|
99 |
|
100 | !production && react && resolvePlugin('transform-react-jsx-self'),
|
101 | !production && react && resolvePlugin('transform-react-jsx-source'),
|
102 |
|
103 | [resolvePlugin('minify-replace'), {
|
104 | replacements: [
|
105 | {
|
106 | identifierName: 'PRODUCTION',
|
107 | replacement: { type: 'booleanLiteral', value: production },
|
108 | },
|
109 | {
|
110 | identifierName: 'BROWSER',
|
111 | replacement: { type: 'booleanLiteral', value: browser },
|
112 | },
|
113 | {
|
114 | identifierName: 'SERVER',
|
115 | replacement: { type: 'booleanLiteral', value: !browser },
|
116 | },
|
117 | {
|
118 | identifierName: 'NODEJS',
|
119 | replacement: { type: 'booleanLiteral', value: !browser },
|
120 | },
|
121 | ],
|
122 | }],
|
123 | resolvePlugin('minify-constant-folding'),
|
124 | [resolvePlugin('minify-dead-code-elimination'), { keepFnName: true, keepFnames: true }],
|
125 | resolvePlugin('minify-guarded-expressions'),
|
126 | resolvePlugin('discard-module-references'),
|
127 | ...(otherPlugins || []),
|
128 | ].filter(Boolean)
|
129 | };
|
130 | };
|