UNPKG

3.97 kBJavaScriptView Raw
1const path = require('path');
2
3const defaultOptions = {
4 spec: false,
5 flow: false,
6 loose: true,
7 react: true,
8 es2015: true,
9 esnext: true,
10 strict: true,
11 helpers: false,
12 runtime: true,
13 modules: true,
14 optimize: false,
15 typecheck: false,
16 development: false
17};
18
19function preset(context, options) {
20 const {
21 spec,
22 flow,
23 loose,
24 react,
25 es2015,
26 esnext,
27 strict,
28 modules,
29 helpers,
30 runtime,
31 optimize,
32 typecheck,
33 development
34 } = Object.assign({}, defaultOptions, options);
35
36 const plugins = [];
37
38 if (strict) {
39 plugins.push(
40 require('babel-plugin-transform-strict-mode')
41 );
42 }
43
44 if (helpers) {
45 plugins.push(
46 require('babel-plugin-external-helpers')
47 );
48 }
49
50 if (runtime) {
51 plugins.push(
52 [require.resolve('babel-plugin-transform-runtime'), {
53 helpers: true,
54 polyfill: true,
55 regenerator: false,
56 // Resolve the Babel runtime relative to the config.
57 moduleName: path.dirname(require.resolve('babel-runtime/package'))
58 }]
59 );
60 }
61
62 if (esnext) {
63 plugins.push(
64 require('babel-plugin-transform-class-properties'),
65 [require('babel-plugin-transform-object-rest-spread'), { useBuiltIns: runtime }],
66 require('babel-plugin-transform-export-extensions')
67 );
68 }
69
70 plugins.push(require('babel-plugin-syntax-flow'));
71 if (flow) {
72 plugins.push(require('babel-plugin-transform-flow-comments'));
73 } else {
74 plugins.push(require('babel-plugin-transform-flow-strip-types'));
75 }
76
77 if (react) {
78 plugins.push(
79 require('babel-plugin-syntax-jsx'),
80 [require('babel-plugin-transform-react-jsx'), { useBuiltIns: runtime }],
81 require('babel-plugin-transform-react-display-name')
82 );
83
84 if (development) {
85 plugins.push(
86 // Adds component stack to warning messages
87 require.resolve('babel-plugin-transform-react-jsx-source'),
88 // Adds __self attribute to JSX which React will use for some warnings
89 require.resolve('babel-plugin-transform-react-jsx-self')
90 );
91 }
92
93 if (optimize) {
94 plugins.push(
95 require('babel-plugin-transform-react-constant-elements'),
96 require('babel-plugin-transform-react-inline-elements')
97 );
98 }
99 }
100
101 if (es2015) {
102 plugins.push(
103 [require('babel-plugin-transform-es2015-template-literals'), { loose, spec }],
104 require('babel-plugin-transform-es2015-literals'),
105 require('babel-plugin-transform-es2015-function-name'),
106 [require('babel-plugin-transform-es2015-arrow-functions'), { spec }],
107 require('babel-plugin-transform-es2015-block-scoped-functions'),
108 [require('babel-plugin-transform-es2015-classes'), { loose }],
109 require('babel-plugin-transform-es2015-object-super'),
110 require('babel-plugin-transform-es2015-shorthand-properties'),
111 require('babel-plugin-transform-es2015-duplicate-keys'),
112 [require('babel-plugin-transform-es2015-computed-properties'), { loose }],
113 [require('babel-plugin-transform-es2015-for-of'), { loose }],
114 require('babel-plugin-transform-es2015-sticky-regex'),
115 require('babel-plugin-transform-es2015-unicode-regex'),
116 require('babel-plugin-check-es2015-constants'),
117 [require('babel-plugin-transform-es2015-spread'), { loose }],
118 require('babel-plugin-transform-es2015-parameters'),
119 [require('babel-plugin-transform-es2015-destructuring'), { loose }],
120 require('babel-plugin-transform-es2015-block-scoping'),
121 require('babel-plugin-transform-es2015-typeof-symbol')
122 );
123
124 if (modules) {
125 plugins.push(
126 [require('babel-plugin-transform-es2015-modules-commonjs'), { loose }]
127 );
128 }
129 }
130
131 if (typecheck) {
132 plugins.push(
133 require('babel-plugin-typecheck')
134 );
135 }
136
137 if (optimize) {
138 plugins.push(
139 require('babel-plugin-lodash')
140 );
141 }
142
143 return {
144 plugins
145 };
146}
147
148module.exports = preset;