| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| const path = require('path'); |
| const webpack = require('webpack'); |
| const BundleAnalyzerPlugin = |
| require('webpack-bundle-analyzer').BundleAnalyzerPlugin; |
| const HtmlWebpackPlugin = require('html-webpack-plugin'); |
| const CircularDependencyPlugin = require('circular-dependency-plugin'); |
| |
| const config = { |
| entry: { |
| 'mr-app': './static_src/elements/mr-app/mr-app.js', |
| 'mr-profile-page': |
| './static_src/elements/chdir/mr-profile-page/mr-profile-page.js', |
| 'ezt-element-package': './static_src/elements/ezt/ezt-element-package.js', |
| 'ezt-footer-scripts-package': |
| './static_src/elements/ezt/ezt-footer-scripts-package.js', |
| }, |
| devtool: 'eval-source-map', |
| plugins: [ |
| new CircularDependencyPlugin({ |
| // exclude detection of files based on a RegExp |
| exclude: /a\.js|node_modules/, |
| // add errors to webpack instead of warnings |
| failOnError: true, |
| // set the current working directory for displaying module paths |
| cwd: process.cwd(), |
| }), |
| new HtmlWebpackPlugin({ |
| chunks: ['mr-app'], |
| inject: false, |
| template: 'static_src/webpacked-scripts-template.html', |
| filename: '../../templates/webpack-out/mr-app.ezt', |
| }), |
| new HtmlWebpackPlugin({ |
| chunks: ['mr-profile-page'], |
| inject: false, |
| template: 'static_src/webpacked-scripts-template.html', |
| filename: '../../templates/webpack-out/mr-profile-page.ezt', |
| }), |
| new HtmlWebpackPlugin({ |
| chunks: ['ezt-element-package'], |
| inject: false, |
| template: 'static_src/webpacked-scripts-template.html', |
| filename: '../../templates/webpack-out/ezt-element-package.ezt', |
| }), |
| new HtmlWebpackPlugin({ |
| chunks: ['ezt-footer-scripts-package'], |
| inject: false, |
| template: 'static_src/webpacked-scripts-template.html', |
| filename: '../../templates/webpack-out/ezt-footer-scripts-package.ezt', |
| }), |
| ], |
| module: { |
| rules: [ |
| { |
| test: /\.(ts|tsx)$/, |
| exclude: /node_modules/, |
| use: ['babel-loader'], |
| }, |
| { |
| test: /\.css$/i, |
| use: [ |
| {loader: 'style-loader', options: {injectType: 'styleTag'}}, |
| { |
| loader: 'css-loader', |
| options: { |
| modules: true, |
| importLoaders: 1, |
| }, |
| }, |
| 'postcss-loader', |
| ], |
| }, |
| ], |
| }, |
| resolve: { |
| extensions: ['.js', '.ts', '.tsx'], |
| modules: ['node_modules', 'static_src'], |
| }, |
| output: { |
| filename: '[name].[contenthash].min.js', |
| path: path.resolve(__dirname, 'static/dist'), |
| // __webpack_public_path__ is used to dynamically set the public path to |
| // the App Engine version URL. |
| publicPath: '/static/dist/', |
| }, |
| externals: { |
| moment: 'moment', |
| }, |
| }; |
| |
| module.exports = (env, argv) => { |
| if (argv.mode === 'production') { |
| // Settings for deploying JS to production. |
| config.devtool = 'source-map'; |
| |
| config.plugins = config.plugins.concat([ |
| new webpack.DefinePlugin( |
| {'process.env.NODE_ENV': '"production"'}, |
| ), |
| ]); |
| } |
| |
| if (argv.analyze) { |
| config.plugins.push(new BundleAnalyzerPlugin()); |
| } |
| return config; |
| }; |