const path = require('path');
const htmlWebpackTemplate = require('html-webpack-template');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const PnpWebpackPlugin = require('pnp-webpack-plugin');
const postcssPresetEnv = require('postcss-preset-env');
const Config = require('webpack-chain');
const config = new Config();
config.entry('index').add(path.resolve(__dirname, 'src/app/index.tsx'));
config.module
.rule('ts')
.test(/\.ts(x?)$/)
.exclude.add(/node_modules/)
.end()
.use('babel')
.loader('babel-loader')
.end()
.use('ts')
.loader('ts-loader')
.end();
config.module
.rule('js')
.test(/\.js(x?)$/)
.exclude.add(/node_modules/)
.end()
.use('babel')
.loader('babel-loader')
.end();
config.module
.rule('css')
.test(/\.css$/)
.use('style')
.loader('style-loader')
.end()
.use('css')
.loader('css-loader')
.end();
config.module
.rule('sass')
.test(/\.(scss|sass)$/)
.use('style')
.loader('style-loader')
.end()
.use('css')
.loader('css-loader')
.end()
.use('postcss')
.loader('postcss-loader')
.options({
plugins: () => [postcssPresetEnv(/* pluginOptions */)],
})
.end()
.use('sass')
.loader('sass-loader')
.end();
config.module
.rule('file')
.test(/\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot)$/i)
.use('url')
.loader('url-loader')
.options({
limit: 8192,
});
config.resolve.extensions
.add('*')
.add('.js')
.add('.jsx')
.add('.ts')
.add('.tsx')
.end()
.plugin('pnp')
.use(PnpWebpackPlugin);
config.resolveLoader.plugin('pnp').use(PnpWebpackPlugin.moduleLoader(module));
config.output
.path(path.resolve(__dirname, 'dist/'))
.filename('[name].[hash].js')
.chunkFilename('[name].[hash].js')
.publicPath('/');
config.plugin('html').use(HtmlWebpackPlugin, [
{
inject: false,
template: htmlWebpackTemplate,
appMountId: 'app',
mobile: true,
headHtmlSnippet: `
`,
title: 'Timeline',
},
]);
module.exports = config;