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,
}
}]);
}
});
};