/* eslint-env node */ const ExtractTextPlugin = require('extract-text-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const _ = require('lodash'); const path = require('path'); const webpack = require('webpack'); const __DEV__ = process.env.NODE_ENV !== 'production'; function getClientEnvironment() { const allowedKeys = [ 'API_ENV', 'NODE_ENV', 'DISABLED_MONITORS', 'MESSENGER_RECIPIENT' ]; const env = Object.assign( {}, require('./config/api-env'), _.pick(process.env, allowedKeys) ); return { 'process.env': _.mapValues(env, envValue => JSON.stringify(envValue)) }; } const config = { cache: true, context: path.join(__dirname, 'src'), entry: { app: './index.js' }, output: { path: path.resolve(__dirname, 'dist'), filename: __DEV__ ? 'main.js' : 'main.[hash].js' }, module: { rules: [ { test: /\.js$/, use: ['babel-loader?cacheDirectory'], include: [ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules/angular-common-auth') ] }, { test: /\.html$/, loader: 'html-loader' }, { test: /\.css$/, loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }) }, { test: /\.(eot|svg|ttf|woff|woff2)$/, loader: 'file-loader?name=assets/fonts/[name].[ext]' }, { test: /\.(jpe?g|png|gif|svg)$/i, loader: 'file-loader?name=assets/img/[name].[ext]' } ] }, resolve: { modules: [path.join(__dirname, 'src'), 'node_modules'], alias: { components: path.resolve(__dirname, 'src/components'), enums: path.resolve(__dirname, 'src/enums'), libs: path.resolve(__dirname, 'src/libs') } }, devtool: __DEV__ ? 'cheap-source-map' : 'source-map', stats: 'errors-only', devServer: { contentBase: path.join(__dirname, 'dist'), port: 3000, overlay: true, inline: false, stats: { children: false, assets: false } }, plugins: [ new webpack.PrefetchPlugin( path.join(__dirname, 'src'), 'ng-components/index.js' ), new ExtractTextPlugin({ filename: __DEV__ ? 'main.css' : 'main.[hash].css', allChunks: true }), new webpack.DefinePlugin(getClientEnvironment()), new HtmlWebpackPlugin({ template: './index.html', favicon: './assets/img/favicon.png' }) ] }; if (!__DEV__) { // add angular injection annotation to js files config.module.rules[0].use.unshift('ng-annotate-loader'); // optimise minimise js config.plugins.push( new webpack.LoaderOptionsPlugin({ // https://webpack.js.org/guides/migrating/#uglifyjsplugin-minimize-loaders minimize: true }), new webpack.optimize.UglifyJsPlugin({ sourceMap: true }), new webpack.optimize.OccurrenceOrderPlugin() ); } module.exports = config;