index.js 4.33 KiB
/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
'use strict';
module.exports = function(api, opts) {
  if (!opts) {
    opts = {};
  // 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;
  var isEnvDevelopment = env === 'development';
  var isEnvProduction = env === 'production';
  var isEnvTest = env === 'test';
  if (!isEnvDevelopment && !isEnvProduction && !isEnvTest) {
    throw new Error(
      '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) +
        '.'
  return {
    presets: [
      isEnvTest && [
        // ES features necessary for user's Node version
        require('@babel/preset-env').default,
          targets: {
            node: '6.12',
      (isEnvProduction || isEnvDevelopment) && [
        // Latest stable ECMAScript features
        require('@babel/preset-env').default,
          // `entry` transforms `@babel/polyfill` into individual requires for
          // the targeted browsers. This is safer than `usage` which performs
          // static code analysis to determine what's required.
          // This is probably a fine default to help trim down bundles when
          // end-users inevitably import '@babel/polyfill'.
          useBuiltIns: 'entry',
          // Do not transform modules to CJS
          modules: false,
        require('@babel/preset-react').default,
          // Adds component stack to warning messages
          // Adds __self attribute to JSX which React will use for some warnings
          development: isEnvDevelopment || isEnvTest,
      [require('@babel/preset-flow').default],
    ].filter(Boolean),
    plugins: [
      // Experimental macros support. Will be documented after it's had some time
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
// in the wild. require('babel-plugin-macros'), // 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('@babel/plugin-transform-destructuring').default, // class { handleClick = () => { } } require('@babel/plugin-proposal-class-properties').default, // 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 } [ require('@babel/plugin-proposal-object-rest-spread').default, { useBuiltIns: true, }, ], // Transforms JSX [ require('@babel/plugin-transform-react-jsx').default, { useBuiltIns: true, }, ], // Polyfills the runtime needed for async/await and generators [ require('@babel/plugin-transform-runtime').default, { helpers: false, polyfill: false, regenerator: true, }, ], isEnvProduction && [ // Remove PropTypes from production build require('babel-plugin-transform-react-remove-prop-types').default, { removeImport: true, }, ], // function* () { yield 42; yield 43; } !isEnvTest && [ require('@babel/plugin-transform-regenerator').default, { // Async functions are converted to generators by @babel/preset-env async: false, }, ], // Adds syntax support for import() require('@babel/plugin-syntax-dynamic-import').default, isEnvTest && // Transform dynamic import to require require('babel-plugin-transform-dynamic-import').default, ].filter(Boolean), }; };