'use strict'; // eslint-disable-line const webpack = require('webpack'); const merge = require('webpack-merge'); const CleanPlugin = require('clean-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const StyleLintPlugin = require('stylelint-webpack-plugin'); const CopyGlobsPlugin = require('copy-globs-webpack-plugin'); const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin'); const config = require('./config'); const assetsFilenames = (config.enabled.cacheBusting) ? config.cacheBusting : '[name]'; let webpackConfig = { context: config.paths.assets, entry: config.entry, devtool: (config.enabled.sourceMaps ? '#source-map' : undefined), output: { path: config.paths.dist, publicPath: config.publicPath, filename: `scripts/${assetsFilenames}.js`, }, stats: { hash: false, version: false, timings: false, children: false, errors: false, errorDetails: false, warnings: false, chunks: false, modules: false, reasons: false, source: false, publicPath: false, }, module: { rules: [ { enforce: 'pre', test: /\.js$/, include: config.paths.assets, use: 'eslint', }, { enforce: 'pre', test: /\.(js|s?[ca]ss)$/, include: config.paths.assets, loader: 'import-glob', }, { test: /\.js$/, exclude: [/(node_modules|bower_components)(?![/|\\](bootstrap|foundation-sites))/], use: [ { loader: 'cache' }, { loader: 'buble', options: { objectAssign: 'Object.assign' } }, ], }, { test: /\.css$/, include: config.paths.assets, use: ExtractTextPlugin.extract({ fallback: 'style', use: [ { loader: 'cache' }, { loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, { loader: 'postcss', options: { config: { path: __dirname, ctx: config }, sourceMap: config.enabled.sourceMaps, }, }, ], }), }, { test: /\.scss$/, include: config.paths.assets, use: ExtractTextPlugin.extract({ fallback: 'style', use: [ { loader: 'cache' }, { loader: 'css', options: { sourceMap: config.enabled.sourceMaps } }, { loader: 'postcss', options: { config: { path: __dirname, ctx: config }, sourceMap: config.enabled.sourceMaps, }, }, { loader: 'resolve-url', options: { sourceMap: config.enabled.sourceMaps } }, { loader: 'sass', options: { sourceMap: config.enabled.sourceMaps } }, ], }), }, { test: /\.(ttf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, include: config.paths.assets, loader: 'url', options: { limit: 4096, name: `[path]${assetsFilenames}.[ext]`, }, }, { test: /\.(ttf|eot|woff2?|png|jpe?g|gif|svg|ico)$/, include: /node_modules|bower_components/, loader: 'url', options: { limit: 4096, outputPath: 'vendor/', name: `${config.cacheBusting}.[ext]`, }, }, ], }, resolve: { modules: [ config.paths.assets, 'node_modules', 'bower_components', ], enforceExtension: false, }, resolveLoader: { moduleExtensions: ['-loader'], }, externals: { jquery: 'jQuery', }, plugins: [ new CleanPlugin([config.paths.dist], { root: config.paths.root, verbose: false, }), /** * It would be nice to switch to copy-webpack-plugin, but * unfortunately it doesn't provide a reliable way of * tracking the before/after file names */ new CopyGlobsPlugin({ pattern: config.copy, output: `[path]${assetsFilenames}.[ext]`, manifest: config.manifest, }), new ExtractTextPlugin({ filename: `styles/${assetsFilenames}.css`, allChunks: true, disable: (config.enabled.watcher), }), new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery', Popper: 'popper.js/dist/umd/popper.js', }), new webpack.LoaderOptionsPlugin({ minimize: config.enabled.optimize, debug: config.enabled.watcher, stats: { colors: true }, }), new webpack.LoaderOptionsPlugin({ test: /\.s?css$/, options: { output: { path: config.paths.dist }, context: config.paths.assets, }, }), new webpack.LoaderOptionsPlugin({ test: /\.js$/, options: { eslint: { failOnWarning: false, failOnError: true }, }, }), new StyleLintPlugin({ failOnError: !config.enabled.watcher, syntax: 'scss', }), new FriendlyErrorsWebpackPlugin(), ], }; /* eslint-disable global-require */ /** Let's only load dependencies as needed */ if (config.enabled.optimize) { webpackConfig = merge(webpackConfig, require('./webpack.config.optimize')); } if (config.env.production) { webpackConfig.plugins.push(new webpack.NoEmitOnErrorsPlugin()); } if (config.enabled.cacheBusting) { const WebpackAssetsManifest = require('webpack-assets-manifest'); webpackConfig.plugins.push( new WebpackAssetsManifest({ output: 'assets.json', space: 2, writeToDisk: false, assets: config.manifest, replacer: require('./util/assetManifestsFormatter'), }) ); } if (config.enabled.watcher) { webpackConfig.entry = require('./util/addHotMiddleware')(webpackConfig.entry); webpackConfig = merge(webpackConfig, require('./webpack.config.watch')); } module.exports = webpackConfig;