// @see https://babeljs.io/docs/en/next/config-files#project-wide-configuration
module.exports = api => {
  api.cache(() => process.env.NODE_ENV);
  const isSite = api.env('site');
  const isCDNBundle = api.env('bundle');
  const isCommonJS = api.env('cjs');
  const isESModule = api.env('esm');
  const isTest = api.env('test');

  if (isSite) {
    return {
      presets: [
        'babel-preset-gatsby'
      ],
      plugins: [
        '@babel/plugin-proposal-optional-chaining',
        '@babel/plugin-proposal-nullish-coalescing-operator',
        'transform-inline-environment-variables',
        [
          '@babel/plugin-proposal-decorators',
          {
            legacy: true
          }
        ],
        [
          // import glsl as raw text
          'babel-plugin-inline-import',
          {
            extensions: [
              // 由于使用了 TS 的 resolveJsonModule 选项,JSON 可以直接引入,不需要当作纯文本
              // '.json',
              '.glsl'
            ]
          }
        ]
      ]
    };
  }

  return {
    presets: [
      [
        '@babel/env',
        {
          // https://babeljs.io/docs/en/babel-preset-env#usebuiltins
          // useBuiltIns: 'usage',
          ...isCDNBundle ? { corejs: '3.0.0' } : {},
          useBuiltIns: isCDNBundle ? 'usage' : false,
          // set `modules: false` when building CDN bundle, let rollup do commonjs works
          // @see https://github.com/rollup/rollup-plugin-babel#modules
          modules: (isCDNBundle || isESModule) ? false : 'auto',
          targets: {
            chrome: 58,
            browsers: [ 'ie >= 11' ]
          }
        }
      ],
      [
        '@babel/preset-react',
        {
          development: isCommonJS
        }
      ],
      '@babel/preset-typescript'
    ],
    plugins: [
      isCDNBundle ? {} : '@babel/plugin-transform-runtime',
      '@babel/plugin-proposal-object-rest-spread',
      '@babel/plugin-proposal-optional-chaining',
      '@babel/plugin-proposal-nullish-coalescing-operator',
      '@babel/plugin-syntax-async-generators',
      // '@babel/plugin-transform-parameters',
      'transform-node-env-inline',
      [
        '@babel/plugin-proposal-decorators',
        {
          legacy: true
        }
      ],
      [
        '@babel/plugin-proposal-class-properties',
        {
          // @see https://github.com/storybookjs/storybook/issues/6069#issuecomment-472544973
          loose: true
        }
      ],
      '@babel/plugin-syntax-dynamic-import',
      // let rollup do commonjs works
      // @see https://github.com/rollup/rollup-plugin-babel#modules
      (isCDNBundle || isESModule) ? {} : '@babel/plugin-transform-modules-commonjs',
      // 开发模式下以原始文本引入,便于调试
      isCDNBundle ? {} : [
        // import glsl as raw text
        'babel-plugin-inline-import',
        {
          extensions: [
            // 由于使用了 TS 的 resolveJsonModule 选项,JSON 可以直接引入,不需要当作纯文本
            // '.json',
            '.glsl'
          ]
        }
      ],
      isCDNBundle ? {} : [
        'transform-import-styles'
      ],
      [
        // @see https://github.com/babel/babel/issues/8741#issuecomment-509041135
        'const-enum',
        {
          transform: 'constObject'
        }
      ],
      // 按需引用 @see https://github.com/lodash/babel-plugin-lodash
      'lodash'
      // 内联 WebGL 常量 @see https://www.npmjs.com/package/babel-plugin-inline-webgl-constants
      // isCDNBundle ? 'inline-webgl-constants' : {},
    ],
    ignore: [
      // /node_modules\/(?![kdbush|supercluster|async])/,
      'node_modules',
      ...!isTest ? [
        '**/*.test.tsx',
        '**/*.test.ts',
        '**/*.story.tsx',
        '__snapshots__',
        '__tests__',
        '__stories__',
        '**/*/__snapshots__',
        '**/*/__tests__'
      ] : []
    ]
  };
};