export default()

in packages/plugin-webpack5-typescript/src/index.ts [42:127]


export default (api: PluginAPI, opts: PluginOptions) => {
  const {
    tsconfig = resolve(api.getCwd(), 'tsconfig.json'),
    ignoreWebpackModuleDependencyWarning,
    typescript = { useBabel: true },
  } = opts;

  api.on('onChainWebpack', async (config: WebpackChain) => {
    config
      .entry('index')
      .clear()
      .add('./index')
      .end()
      .resolve
      .extensions
      .merge(['.js', '.jsx', '.ts', '.tsx'])
      .end();
    
    if (!opts.disablePolyfill) {
      config
        .entry('index')
        .prepend(require.resolve('core-js'));
    }

    if (!tsconfig || !existsSync(tsconfig)) {
      warn(
        `Cannot find typescript config file: ${tsconfig}\n` +
        'The (.ts|.tsx) files will not be resolved.'
      );
    }
    if (ignoreWebpackModuleDependencyWarning) {
      config
        .plugin('ignoreWebpackModuleDependencyWarning')
        .use(IgnoreNotFoundExportPlugin, [[new RegExp(`^${resolve(api.getCwd(), 'src')}.*\\.tsx?$`)]]);
    }

    const tsRule = config
      .module
      .rule('ts')
      .test(/\.tsx?$/);

    tsRule
      .exclude
      .add(/node_modules/)
      .end();

    const addLoader = ({ loader, options }: ILoader) => {
      return tsRule.use(loader).loader(loader).options(options);
    };

    if (!typescript.useBabel){
      addLoader({
        loader: require.resolve('thread-loader'),
        options: {
          workers: require('os').cpus().length - 1,
        }
      });
  
      addLoader({
        loader: require.resolve('ts-loader'),
        options: {
          configFile: tsconfig,
          happyPackMode: true
        }
      });
    } else {
      const babelOption = opts.babelOption ? opts.babelOption : getBabelOption(opts);

      addLoader({
        loader: require.resolve('babel-loader'),
        options: babelOption,
      });
    }

    if (!typescript.disableTypeChecker) {
      config
        .plugin('ForkTsCheckerWebpackPlugin')
        .use(ForkTsCheckerWebpackPlugin, [{
          typescript: {
            memoryLimit: 4089,
            configFile: tsconfig,
          }
        }]);
    }
  });
};