1 | const path = require('path')
|
2 |
|
3 | const env = process.env.BABEL_ENV || process.env.NODE_ENV
|
4 | const isTest = env === 'test'
|
5 |
|
6 | const validateBoolOption = (name, value, defaultValue) => {
|
7 | if (typeof value === 'undefined') {
|
8 | value = defaultValue
|
9 | }
|
10 |
|
11 | if (typeof value !== 'boolean') {
|
12 | throw new TypeError(`Poi babel preset: '${name}' option must be a boolean.`)
|
13 | }
|
14 |
|
15 | return value
|
16 | }
|
17 |
|
18 | module.exports = (
|
19 | context,
|
20 | {
|
21 | jsx = process.env.POI_JSX || 'react',
|
22 | jsxPragmaFrag,
|
23 | flow,
|
24 | typescript,
|
25 | env
|
26 | } = {}
|
27 | ) => {
|
28 | jsxPragmaFrag = jsxPragmaFrag || 'React.Fragment'
|
29 |
|
30 | const isVueJSX = jsx === 'vue'
|
31 | const isReactJSX = jsx === 'react'
|
32 |
|
33 |
|
34 |
|
35 | const isFlowEnabled = validateBoolOption('flow', flow, true)
|
36 | const isTypeScriptEnabled = validateBoolOption('typescript', typescript, true)
|
37 |
|
38 | const presets = [
|
39 | [
|
40 | require('@babel/preset-env'),
|
41 | Object.assign(
|
42 | {
|
43 | modules: isTest ? 'commonjs' : false,
|
44 | targets: isTest
|
45 | ? {
|
46 | node: 'current'
|
47 | }
|
48 | : {
|
49 | ie: 9
|
50 | }
|
51 | },
|
52 | env
|
53 | )
|
54 | ],
|
55 | !isVueJSX && [
|
56 | require('@babel/preset-react'),
|
57 | {
|
58 | pragma: isReactJSX ? 'React.createElement' : jsx,
|
59 | pragmaFrag: jsxPragmaFrag
|
60 | }
|
61 | ],
|
62 | isTypeScriptEnabled && require('@babel/preset-typescript')
|
63 | ].filter(Boolean)
|
64 |
|
65 | const plugins = [
|
66 |
|
67 |
|
68 | isFlowEnabled && require('@babel/plugin-transform-flow-strip-types'),
|
69 |
|
70 | isVueJSX && require('@babel/plugin-syntax-jsx'),
|
71 | isVueJSX && require('babel-plugin-transform-vue-jsx'),
|
72 |
|
73 | require('@babel/plugin-syntax-dynamic-import'),
|
74 | [
|
75 | require('@babel/plugin-proposal-class-properties'),
|
76 | {
|
77 |
|
78 | loose: true
|
79 | }
|
80 | ],
|
81 | [
|
82 | require('@babel/plugin-proposal-object-rest-spread'),
|
83 | {
|
84 | useBuiltIns: true
|
85 | }
|
86 | ],
|
87 | require('babel-plugin-macros'),
|
88 | [
|
89 | require('@babel/plugin-transform-runtime'),
|
90 | {
|
91 | helpers: false,
|
92 | regenerator: true,
|
93 | absoluteRuntime: path.dirname(
|
94 | require.resolve('@babel/runtime/package.json')
|
95 | )
|
96 | }
|
97 | ]
|
98 | ].filter(Boolean)
|
99 |
|
100 | return {
|
101 | presets,
|
102 | plugins
|
103 | }
|
104 | }
|