const { NODE_ENV, CLI } = process.env

const __TEST__ = NODE_ENV === 'test'
const __CLI__ = !!CLI

module.exports = (api) => {

  if (api) {
    api.cache(true);
  }

  return {
    presets: [
      [
        require('@babel/preset-env'),
        {
          loose: true,
          modules: __TEST__ || __CLI__ ? 'commonjs' : false,
          targets: {
            electron: '1.8',
            node: 'current',
          },
        },
      ],
      require('@babel/preset-flow'),
      require('@babel/preset-react'),
    ],
    plugins: [
      [require('babel-plugin-module-resolver'), { root: ['src'] }],
      [
        require('babel-plugin-styled-components'),
        {
          displayName: true,
          ssr: __TEST__,
        },
      ],
      // Stage 0
      "@babel/plugin-proposal-function-bind",

      // Stage 1
      "@babel/plugin-proposal-export-default-from",
      "@babel/plugin-proposal-logical-assignment-operators",
      ["@babel/plugin-proposal-optional-chaining", { "loose": false }],
      ["@babel/plugin-proposal-pipeline-operator", { "proposal": "minimal" }],
      ["@babel/plugin-proposal-nullish-coalescing-operator", { "loose": false }],
      "@babel/plugin-proposal-do-expressions",

      // Stage 2
      ["@babel/plugin-proposal-decorators", { "legacy": true }],
      "@babel/plugin-proposal-function-sent",
      "@babel/plugin-proposal-export-namespace-from",
      "@babel/plugin-proposal-numeric-separator",
      "@babel/plugin-proposal-throw-expressions",

      // Stage 3
      "@babel/plugin-syntax-dynamic-import",
      "@babel/plugin-syntax-import-meta",
      ["@babel/plugin-proposal-class-properties", { "loose": false }],
      "@babel/plugin-proposal-json-strings"
    ],
  }
}