index.js 4.69 KB
Newer Older
1
2
3
/**
 * Copyright (c) 2015-present, Facebook, Inc.
 *
Sophie Alpert's avatar
Sophie Alpert committed
4
5
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
6
7
8
 */
'use strict';

9
const plugins = [
10
11
12
  // Experimental macros support. Will be documented after it's had some time
  // in the wild.
  require.resolve('babel-plugin-macros'),
13
14
15
16
  // Necessary to include regardless of the environment because
  // in practice some other transforms (such as object-rest-spread)
  // don't work without it: https://github.com/babel/babel/issues/7215
  require.resolve('babel-plugin-transform-es2015-destructuring'),
17
18
19
20
21
  // class { handleClick = () => { } }
  require.resolve('babel-plugin-transform-class-properties'),
  // The following two plugins use Object.assign directly, instead of Babel's
  // extends helper. Note that this assumes `Object.assign` is available.
  // { ...todo, completed: true }
22
23
24
25
26
27
  [
    require.resolve('babel-plugin-transform-object-rest-spread'),
    {
      useBuiltIns: true,
    },
  ],
28
  // Transforms JSX
29
30
31
32
33
34
  [
    require.resolve('babel-plugin-transform-react-jsx'),
    {
      useBuiltIns: true,
    },
  ],
35
  // Polyfills the runtime needed for async/await and generators
36
37
38
39
40
41
42
43
  [
    require.resolve('babel-plugin-transform-runtime'),
    {
      helpers: false,
      polyfill: false,
      regenerator: true,
    },
  ],
44
];
45
46
47
48
49
50
51
52
53
54

// This is similar to how `env` works in Babel:
// https://babeljs.io/docs/usage/babelrc/#env-option
// We are not using `env` because it’s ignored in versions > babel-core@6.10.4:
// https://github.com/babel/babel/issues/4539
// https://github.com/facebookincubator/create-react-app/issues/720
// It’s also nice that we can enforce `NODE_ENV` being specified.
var env = process.env.BABEL_ENV || process.env.NODE_ENV;
if (env !== 'development' && env !== 'test' && env !== 'production') {
  throw new Error(
55
56
57
58
59
    'Using `babel-preset-react-app` requires that you specify `NODE_ENV` or ' +
      '`BABEL_ENV` environment variables. Valid values are "development", ' +
      '"test", and "production". Instead, received: ' +
      JSON.stringify(env) +
      '.'
60
61
  );
}
62

63
if (env === 'development' || env === 'test') {
64
65
66
67
68
69
  // The following two plugins are currently necessary to make React warnings
  // include more valuable information. They are included here because they are
  // currently not enabled in babel-preset-react. See the below threads for more info:
  // https://github.com/babel/babel/issues/4702
  // https://github.com/babel/babel/pull/3540#issuecomment-228673661
  // https://github.com/facebookincubator/create-react-app/issues/989
70
71
72
73
  plugins.push.apply(plugins, [
    // Adds component stack to warning messages
    require.resolve('babel-plugin-transform-react-jsx-source'),
    // Adds __self attribute to JSX which React will use for some warnings
74
    require.resolve('babel-plugin-transform-react-jsx-self'),
75
76
  ]);
}
77
78
79
80
81

if (env === 'test') {
  module.exports = {
    presets: [
      // ES features necessary for user's Node version
82
83
84
85
86
87
      [
        require('babel-preset-env').default,
        {
          targets: {
            node: 'current',
          },
88
        },
89
      ],
90
      // JSX, Flow
91
      require.resolve('babel-preset-react'),
92
    ],
93
94
    plugins: plugins.concat([
      // Compiles import() to a deferred require()
95
96
      require.resolve('babel-plugin-dynamic-import-node'),
    ]),
97
98
99
100
101
  };
} else {
  module.exports = {
    presets: [
      // Latest stable ECMAScript features
102
103
104
105
106
107
108
109
110
111
112
113
      [
        require.resolve('babel-preset-env'),
        {
          targets: {
            // React parses on ie 9, so we should too
            ie: 9,
            // We currently minify with uglify
            // Remove after https://github.com/mishoo/UglifyJS2/issues/448
            uglify: true,
          },
          // Disable polyfill transforms
          useBuiltIns: false,
114
115
          // Do not transform modules to CJS
          modules: false,
Joe Haddad's avatar
Joe Haddad committed
116
        },
117
      ],
118
      // JSX, Flow
119
      require.resolve('babel-preset-react'),
120
    ],
121
122
    plugins: plugins.concat([
      // function* () { yield 42; yield 43; }
123
124
125
      [
        require.resolve('babel-plugin-transform-regenerator'),
        {
126
          // Async functions are converted to generators by babel-preset-env
127
128
129
          async: false,
        },
      ],
130
131
      // Adds syntax support for import()
      require.resolve('babel-plugin-syntax-dynamic-import'),
132
    ]),
133
134
135
136
  };

  if (env === 'production') {
    // Optimization: hoist JSX that never changes out of render()
137
    // Disabled because of issues: https://github.com/facebookincubator/create-react-app/issues/553
138
139
140
141
    // TODO: Enable again when these issues are resolved.
    // plugins.push.apply(plugins, [
    //   require.resolve('babel-plugin-transform-react-constant-elements')
    // ]);
142
  }
143
}