UNPKG

2.58 kBJavaScriptView Raw
1const path = require('path')
2
3const env = process.env.BABEL_ENV || process.env.NODE_ENV
4const isTest = env === 'test'
5
6const 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
18module.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 // Enable flow and typescript by default at the same time
34 // typescript transforms will only be applied to .ts .tsx files
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 // Strip flow types before any other transform, emulating the behavior
67 // order as-if the browser supported all of the succeeding features
68 isFlowEnabled && require('@babel/plugin-transform-flow-strip-types'),
69 // JSX config
70 isVueJSX && require('@babel/plugin-syntax-jsx'),
71 isVueJSX && require('babel-plugin-transform-vue-jsx'),
72 // stage-3 features
73 require('@babel/plugin-syntax-dynamic-import'),
74 [
75 require('@babel/plugin-proposal-class-properties'),
76 {
77 // Enable loose mode to use assignment instead of defineProperty
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}