UNPKG

3.55 kBJavaScriptView Raw
1const resolvePreset = function (presetName) {
2 return require.resolve(`babel-preset-${presetName}`);
3};
4
5const resolvePlugin = function (pluginName) {
6 return require.resolve(`babel-plugin-${pluginName}`);
7};
8
9module.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 [require('babel-plugin-import-export-rename'), { '^([a-z\\-]+|[\./]+)/src(.*)$': '$1$2' }],
96 require('babel-plugin-transform-export-default-name-forked'),
97 !production && resolvePlugin('tcomb-forked'),
98 resolvePlugin('transform-flow-strip-types'),
99 react && resolvePlugin('react-require'),
100 // browser && 'react-hot-loader/babel',
101 !production && react && resolvePlugin('transform-react-jsx-self'),
102 !production && react && resolvePlugin('transform-react-jsx-source'),
103
104 [resolvePlugin('minify-replace'), {
105 replacements: [
106 {
107 identifierName: 'PRODUCTION',
108 replacement: { type: 'booleanLiteral', value: production },
109 },
110 {
111 identifierName: 'BROWSER',
112 replacement: { type: 'booleanLiteral', value: browser },
113 },
114 {
115 identifierName: 'SERVER',
116 replacement: { type: 'booleanLiteral', value: !browser },
117 },
118 {
119 identifierName: 'NODEJS',
120 replacement: { type: 'booleanLiteral', value: !browser },
121 },
122 ],
123 }],
124 resolvePlugin('minify-constant-folding'),
125 [resolvePlugin('minify-dead-code-elimination'), { keepFnName: true, keepFnames: true }],
126 resolvePlugin('minify-guarded-expressions'),
127 resolvePlugin('discard-module-references'),
128 ...(otherPlugins || []),
129 ].filter(Boolean)
130 };
131};