const CompressionPlugin = require('compression-webpack-plugin'); const webpack = require('webpack'); const LimitChunkCountPlugin = webpack.optimize.LimitChunkCountPlugin; module.exports = { css: { loaderOptions: { sass: { prependData: () => { const envName = process.env.VUE_APP_ENV_NAME; const hasCustomStyles = process.env.CUSTOM_STYLES === 'true' ? true : false; if (hasCustomStyles && envName !== undefined) { // If there is an env name defined, import Sass // overrides. // It is important that these imports stay in this // order to make sure enviroment overrides // take precedence over the default BMC styles return ` @import "@/assets/styles/bmc/helpers"; @import "@/env/assets/styles/_${envName}"; @import "@/assets/styles/bootstrap/_helpers"; `; } else { // Include helper imports so single file components // do not need to include helper imports // BMC Helpers must be imported before Bootstrap helpers to // take advantage of Bootstrap's use of the Sass !default // statement. Moving this helper after results in Bootstrap // variables taking precedence over BMC's return ` @import "@/assets/styles/bmc/helpers"; @import "@/assets/styles/bootstrap/_helpers"; `; } }, }, }, }, devServer: { https: true, proxy: { '/': { target: process.env.BASE_URL, headers: { Connection: 'keep-alive', }, onProxyRes: (proxyRes) => { // This header is ignored in the browser so removing // it so we don't see warnings in the browser console delete proxyRes.headers['strict-transport-security']; }, }, }, port: 8000, }, productionSourceMap: false, chainWebpack: (config) => { config.module .rule('vue') .use('vue-svg-inline-loader') .loader('vue-svg-inline-loader'); config.module .rule('ico') .test(/\.ico$/) .use('file-loader') .loader('file-loader') .options({ name: '[name].[contenthash:8].[ext]', }); }, configureWebpack: (config) => { config.plugins.push( new LimitChunkCountPlugin({ maxChunks: 1, }), ); config.optimization.splitChunks = { cacheGroups: { default: false, }, }; const crypto = require('crypto'); const crypto_orig_createHash = crypto.createHash; crypto.createHash = (algorithm) => crypto_orig_createHash(algorithm == 'md4' ? 'sha256' : algorithm); const envName = process.env.VUE_APP_ENV_NAME; const hasCustomStore = process.env.CUSTOM_STORE === 'true' ? true : false; const hasCustomRouter = process.env.CUSTOM_ROUTER === 'true' ? true : false; const hasCustomAppNav = process.env.CUSTOM_APP_NAV === 'true' ? true : false; if (envName !== undefined) { if (hasCustomStore) { // If env has custom store, resolve all store modules. Currently found // in src/router/index.js src/store/api.js and src/main.js config.resolve.alias['./store$'] = `@/env/store/${envName}.js`; config.resolve.alias['../store$'] = `@/env/store/${envName}.js`; } if (hasCustomRouter) { // If env has custom router, resolve routes in src/router/index.js config.resolve.alias['./routes$'] = `@/env/router/${envName}.js`; } if (hasCustomAppNav) { // If env has custom AppNavigation, resolve AppNavigationMixin module in src/components/AppNavigation/AppNavigation.vue config.resolve.alias['./AppNavigationMixin$'] = `@/env/components/AppNavigation/${envName}.js`; } } if (process.env.NODE_ENV === 'production') { config.plugins.push( new CompressionPlugin({ deleteOriginalAssets: true, }), ); } config.performance = { hints: 'warning', maxEntrypointSize: 512000, maxAssetSize: 512000, }; config.optimization.runtimeChunk = false; }, pluginOptions: { i18n: { localeDir: 'locales', enableInSFC: true, }, }, };