const webpack = require('webpack'); const merge = require('webpack-merge'); const path = require('path'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const ReplaceInFileWebpackPlugin = require('replace-in-file-webpack-plugin'); module.exports = (env, argv) => { var isDevServer = argv.mode === undefined; if (isDevServer && __dirname.indexOf(" ") !== -1) { throw new Error("Space in __dirname not allowed: " + __dirname); } const sharedSettings = { entry: { 'main': path.resolve(__dirname, 'App', 'boot.ts') }, resolve: { extensions: [".ts", ".js", ".json"] }, module: { rules: [ { //ts to js test: /\.ts$/, use: 'ts-loader' }, { //html to js test: /\.html$/, use: 'html-loader' }, { //css to js to inline style append test: /\.css$/, use: ['style-loader', 'css-loader'] }, { //less to css to js to inline style append test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] } ] } } const developmentSettings = { mode: 'development', output: { path: path.resolve(__dirname, "dist"), publicPath: "/", filename: 'main.js' }, devServer: { contentBase: './dist', historyApiFallback: true }, plugins: [ new CopyWebpackPlugin([ { from: path.resolve(__dirname, '*.html'), to: path.resolve(__dirname, 'dist', '[name].[ext]') } ]) ] }; const productionSettings = { mode: "production", plugins: [ new CopyWebpackPlugin([ { from: path.resolve(__dirname, '*.html'), to: path.resolve(__dirname, 'dist', '[name].[ext]') } ]), new ReplaceInFileWebpackPlugin( [ { dir: path.join(__dirname, 'dist'), test: /\.html$/, rules: [ { search: /((\?|\&)v\=)(.+?)(?=\"|\'|\&)/ig, replace: (match) => { return match.toString().substr(0, 3) + +new Date(); } } ] } ] ) ] } //to merge sharedSettings var dev = Object.assign({}, sharedSettings, developmentSettings); var prod = Object.assign({}, sharedSettings, productionSettings); //return dev or prod to webpack depending on --mode config (webpack-dev-server: argv.mode = undefined) return argv.mode === "development" || argv.mode === undefined ? dev : prod; };