| 'use strict'; |
| |
| // Modules |
| var webpack = require('webpack'); |
| var autoprefixer = require('autoprefixer'); |
| var HtmlWebpackPlugin = require('html-webpack-plugin'); |
| var ExtractTextPlugin = require('extract-text-webpack-plugin'); |
| var CopyWebpackPlugin = require('copy-webpack-plugin'); |
| var CompressionPlugin = require('compression-webpack-plugin'); |
| var AssetsPlugin = require('assets-webpack-plugin'); |
| var CopyWebpackPlugin = require('copy-webpack-plugin'); |
| var path = require('path'); |
| var UglifyJsPlugin = require('uglifyjs-webpack-plugin'); |
| |
| /** |
| * Env |
| * Get npm lifecycle event to identify the environment |
| */ |
| var ENV = process.env.npm_lifecycle_event; |
| var isTest = ENV === 'test' || ENV === 'test-watch'; |
| var isProd = ENV === 'build'; |
| |
| module.exports = [function makeWebpackConfig() { |
| /** |
| * Config |
| * Reference: http://webpack.github.io/docs/configuration.html |
| * This is the object where all configuration gets set |
| */ |
| var config = {}; |
| |
| /** |
| * Entry |
| * Reference: http://webpack.github.io/docs/configuration.html#entry |
| * Should be an empty object if it's generating a test build |
| * Karma will set this when it's a test build |
| */ |
| config.entry = isTest ? void 0 : { |
| app: './app/index.js' |
| |
| }; |
| |
| /** |
| * Output |
| * Reference: http://webpack.github.io/docs/configuration.html#output |
| * Should be an empty object if it's generating a test build |
| * Karma will handle setting it up for you when it's a test build |
| */ |
| config.output = isTest ? {} : { |
| // Absolute output directory |
| path: __dirname + '/dist', |
| |
| // Output path from the view of the page |
| // Uses webpack-dev-server in development |
| publicPath: '/', |
| |
| // Filename for entry points |
| // Only adds hash in build mode |
| filename: isProd ? '[name].[hash].js' : '[name].bundle.js', |
| |
| // Filename for non-entry points |
| // Only adds hash in build mode |
| chunkFilename: isProd ? '[name].[hash].js' : '[name].bundle.js' |
| }; |
| |
| /** |
| * Devtool |
| * Reference: http://webpack.github.io/docs/configuration.html#devtool |
| * Type of sourcemap to use per build type |
| */ |
| if (isTest) { |
| https: |
| // unix.stackexchange.com/questions/144208/find-files-without-extension |
| config.devtool = 'inline-source-map'; |
| } else if (isProd) { |
| config.devtool = 'source-map'; |
| } else { |
| config.devtool = 'eval-source-map'; |
| } |
| |
| /** |
| * Loaders |
| * Reference: |
| * http://webpack.github.io/docs/configuration.html#module-loaders |
| * List: http://webpack.github.io/docs/list-of-loaders.html |
| * This handles most of the magic responsible for converting modules |
| */ |
| |
| // Initialize module |
| config.module = { |
| rules: [ |
| { |
| // JS LOADER |
| // Reference: https://github.com/babel/babel-loader |
| // Transpile .js files using babel-loader |
| // Compiles ES6 and ES7 into ES5 code |
| test: /\.js$/, |
| use: 'babel-loader', |
| exclude: /node_modules/ |
| }, |
| { |
| // CSS LOADER |
| // Reference: https://github.com/webpack/css-loader |
| // Allow loading css through js |
| // |
| // Reference: https://github.com/postcss/postcss-loader |
| // Postprocess your css with PostCSS plugins |
| test: /\.css$/, |
| // Reference: https://github.com/webpack/extract-text-webpack-plugin |
| // Extract css files in production builds |
| // |
| // Reference: https://github.com/webpack/style-loader |
| // Use style-loader in development. |
| |
| loader: isTest ? 'null-loader' : ExtractTextPlugin.extract({ |
| fallback: 'style-loader', |
| use: [ |
| {loader: 'css-loader', query: {sourceMap: true}}, |
| {loader: 'postcss-loader'} |
| ], |
| }) |
| }, |
| { |
| // ASSET LOADER |
| // Reference: https://github.com/webpack/file-loader |
| // Copy png, jpg, jpeg, gif, svg, woff, woff2, ttf, eot files to |
| // output |
| // Rename the file using the asset hash |
| // Pass along the updated reference to your code |
| // You can add here any file extension you want to get copied to your |
| // output |
| test: /\.(png|jpg|jpeg|gif|svg|woff|woff2|ttf|eot|ico)$/, |
| loader: 'file-loader', |
| options: { |
| name(file) { |
| if (!isProd) { |
| return '[path][name].[ext]'; |
| } |
| |
| return '[hash].[ext]'; |
| } |
| } |
| }, |
| { |
| // HTML LOADER |
| // Reference: https://github.com/webpack/raw-loader |
| // Allow loading html through js |
| test: /\.html$/, |
| use: {loader: 'html-loader'} |
| }, |
| // JSON LOADER |
| {test: /\.json$/, loader: 'json-loader'}, { |
| test: /\.scss$/, |
| use: [ |
| { |
| loader: 'style-loader' // creates style nodes from JS strings |
| }, |
| { |
| loader: 'css-loader' // translates CSS into CommonJS |
| }, |
| { |
| loader: 'sass-loader' // compiles Sass to CSS |
| } |
| ] |
| } |
| ] |
| }; |
| |
| // ISTANBUL LOADER |
| // https://github.com/deepsweet/istanbul-instrumenter-loader |
| // Instrument JS files with istanbul-lib-instrument for subsequent code |
| // coverage reporting |
| // Skips node_modules and files that end with .spec.js |
| if (isTest) { |
| config.module.rules.push({ |
| enforce: 'pre', |
| test: /\.js$/, |
| exclude: [/node_modules/, /\.spec\.js$/], |
| loader: 'istanbul-instrumenter-loader', |
| query: {esModules: true} |
| }); |
| } |
| |
| /** |
| * PostCSS |
| * Reference: https://github.com/postcss/autoprefixer-core |
| * Add vendor prefixes to your css |
| */ |
| // NOTE: This is now handled in the `postcss.config.js` |
| // webpack2 has some issues, making the config file necessary |
| |
| /** |
| * Plugins |
| * Reference: http://webpack.github.io/docs/configuration.html#plugins |
| * List: http://webpack.github.io/docs/list-of-plugins.html |
| */ |
| config.plugins = [new webpack.LoaderOptionsPlugin({ |
| test: /\.scss$/i, |
| options: {postcss: {plugins: [autoprefixer]}}, |
| debug: !isProd |
| })]; |
| |
| // Skip rendering index.html in test mode |
| if (!isTest) { |
| // Reference: https://github.com/ampedandwired/html-webpack-plugin |
| // Render index.html |
| config.plugins.push( |
| new HtmlWebpackPlugin({ |
| template: './app/index.html', |
| inject: 'body', |
| favicon: './app/assets/images/favicon.ico' |
| }), |
| |
| // Reference: https://github.com/webpack/extract-text-webpack-plugin |
| // Extract css files |
| // Disabled when in test mode or not in build mode |
| new ExtractTextPlugin( |
| {filename: 'css/[name].css', disable: !isProd, allChunks: true})); |
| } |
| |
| // Add build specific plugins |
| if (isProd) { |
| config.plugins.push( |
| // Reference: |
| // http://webpack.github.io/docs/list-of-plugins.html#uglifyjsplugin |
| // Minify all javascript, switch loaders to minimizing mode |
| // TODO: openbmc/openbmc#2871 Mangling currently breaks the GUI. |
| new UglifyJsPlugin({uglifyOptions: {mangle: false}}), |
| |
| // Copy assets from the public folder |
| // Reference: https://github.com/kevlened/copy-webpack-plugin |
| new CopyWebpackPlugin([{from: __dirname + '/app/assets'}]), |
| new CompressionPlugin({deleteOriginalAssets: true})); |
| } |
| |
| /** |
| * Dev server configuration |
| * Reference: http://webpack.github.io/docs/configuration.html#devserver |
| * Reference: http://webpack.github.io/docs/webpack-dev-server.html |
| */ |
| config.devServer = {contentBase: './src/public', stats: 'minimal'}; |
| |
| return config; |
| }()]; |