2020-01-25 11:41:34 +03:00
const cssnano = require ( 'cssnano' ) ;
2020-01-28 10:30:39 +03:00
const fastGlob = require ( 'fast-glob' ) ;
const FixStyleOnlyEntriesPlugin = require ( 'webpack-fix-style-only-entries' ) ;
2020-01-25 11:41:34 +03:00
const MiniCssExtractPlugin = require ( 'mini-css-extract-plugin' ) ;
const OptimizeCSSAssetsPlugin = require ( 'optimize-css-assets-webpack-plugin' ) ;
const PostCSSPresetEnv = require ( 'postcss-preset-env' ) ;
2020-01-28 10:30:39 +03:00
const PostCSSSafeParser = require ( 'postcss-safe-parser' ) ;
2020-02-11 20:02:41 +03:00
const SpriteLoaderPlugin = require ( 'svg-sprite-loader/plugin' ) ;
2020-01-28 10:30:39 +03:00
const TerserPlugin = require ( 'terser-webpack-plugin' ) ;
const VueLoaderPlugin = require ( 'vue-loader/lib/plugin' ) ;
2020-03-11 22:34:54 +03:00
const { statSync } = require ( 'fs' ) ;
const { resolve , parse } = require ( 'path' ) ;
const { SourceMapDevToolPlugin } = require ( 'webpack' ) ;
2020-01-28 10:30:39 +03:00
2020-03-11 22:34:54 +03:00
const glob = ( pattern ) => fastGlob . sync ( pattern , { cwd : _ _dirname , absolute : true } ) ;
2020-02-11 20:02:41 +03:00
2020-01-28 10:30:39 +03:00
const themes = { } ;
2020-02-11 20:02:41 +03:00
for ( const path of glob ( 'web_src/less/themes/*.less' ) ) {
2020-01-28 10:30:39 +03:00
themes [ parse ( path ) . name ] = [ path ] ;
}
2019-11-13 17:52:13 +03:00
2020-02-23 11:47:42 +03:00
const isProduction = process . env . NODE _ENV !== 'development' ;
2019-11-13 17:52:13 +03:00
module . exports = {
2020-02-23 11:47:42 +03:00
mode : isProduction ? 'production' : 'development' ,
2019-11-13 17:52:13 +03:00
entry : {
2020-01-28 10:30:39 +03:00
index : [
resolve ( _ _dirname , 'web_src/js/index.js' ) ,
resolve ( _ _dirname , 'web_src/less/index.less' ) ,
] ,
swagger : [
2020-02-07 20:09:30 +03:00
resolve ( _ _dirname , 'web_src/js/standalone/swagger.js' ) ,
2020-01-28 10:30:39 +03:00
] ,
jquery : [
resolve ( _ _dirname , 'web_src/js/jquery.js' ) ,
] ,
2020-02-11 20:02:41 +03:00
icons : glob ( 'node_modules/@primer/octicons/build/svg/**/*.svg' ) ,
2020-01-28 10:30:39 +03:00
... themes ,
2019-11-13 17:52:13 +03:00
} ,
2020-01-14 21:02:08 +03:00
devtool : false ,
2019-11-13 17:52:13 +03:00
output : {
2020-01-28 10:30:39 +03:00
path : resolve ( _ _dirname , 'public' ) ,
2020-01-25 11:41:34 +03:00
filename : 'js/[name].js' ,
chunkFilename : 'js/[name].js' ,
2019-11-13 17:52:13 +03:00
} ,
optimization : {
2020-02-23 11:47:42 +03:00
minimize : isProduction ,
2020-01-25 11:41:34 +03:00
minimizer : [
new TerserPlugin ( {
sourceMap : true ,
extractComments : false ,
terserOptions : {
2020-04-13 16:02:31 +03:00
keep _fnames : /^(HTML|SVG)/ , // https://github.com/fgnass/domino/issues/144
2020-01-25 11:41:34 +03:00
output : {
comments : false ,
} ,
2019-11-18 00:39:06 +03:00
} ,
2020-01-25 11:41:34 +03:00
} ) ,
new OptimizeCSSAssetsPlugin ( {
cssProcessor : cssnano ,
cssProcessorOptions : {
parser : PostCSSSafeParser ,
} ,
cssProcessorPluginOptions : {
preset : [
'default' ,
{
discardComments : {
removeAll : true ,
} ,
} ,
] ,
} ,
} ) ,
] ,
2020-01-29 00:57:20 +03:00
splitChunks : {
chunks : 'async' ,
name : ( _ , chunks ) => chunks . map ( ( item ) => item . name ) . join ( '-' ) ,
}
2019-11-13 17:52:13 +03:00
} ,
2019-11-15 00:39:51 +03:00
module : {
rules : [
2020-01-20 13:07:30 +03:00
{
test : /\.vue$/ ,
exclude : /node_modules/ ,
2020-01-25 11:41:34 +03:00
loader : 'vue-loader' ,
2020-01-20 13:07:30 +03:00
} ,
2020-03-17 22:08:15 +03:00
{
test : require . resolve ( 'jquery-datetimepicker' ) ,
use : 'imports-loader?define=>false,exports=>false' ,
} ,
2020-04-13 16:02:31 +03:00
{
test : /\.worker\.js$/ ,
use : [
{
loader : 'worker-loader' ,
options : {
name : '[name].js' ,
inline : true ,
fallback : false ,
} ,
} ,
] ,
} ,
2019-11-15 00:39:51 +03:00
{
test : /\.js$/ ,
exclude : /node_modules/ ,
2020-01-22 09:35:29 +03:00
use : [
{
loader : 'babel-loader' ,
options : {
2020-02-01 18:12:41 +03:00
cacheDirectory : true ,
cacheCompression : false ,
cacheIdentifier : [
resolve ( _ _dirname , 'package.json' ) ,
resolve ( _ _dirname , 'package-lock.json' ) ,
resolve ( _ _dirname , 'webpack.config.js' ) ,
] . map ( ( path ) => statSync ( path ) . mtime . getTime ( ) ) . join ( ':' ) ,
2020-02-23 11:47:42 +03:00
sourceMaps : true ,
2020-01-22 09:35:29 +03:00
presets : [
[
'@babel/preset-env' ,
{
useBuiltIns : 'usage' ,
corejs : 3 ,
2020-01-25 11:41:34 +03:00
} ,
] ,
2020-01-20 13:07:30 +03:00
] ,
2020-01-22 09:35:29 +03:00
plugins : [
[
'@babel/plugin-transform-runtime' ,
{
regenerator : true ,
}
] ,
'@babel/plugin-proposal-object-rest-spread' ,
] ,
2020-01-25 11:41:34 +03:00
} ,
2020-01-22 09:35:29 +03:00
} ,
] ,
2019-11-18 00:39:06 +03:00
} ,
{
2020-01-28 10:30:39 +03:00
test : /\.(less|css)$/i ,
2020-01-25 11:41:34 +03:00
use : [
{
loader : MiniCssExtractPlugin . loader ,
} ,
{
loader : 'css-loader' ,
options : {
2020-01-28 10:30:39 +03:00
importLoaders : 2 ,
url : false ,
2020-01-25 11:41:34 +03:00
}
} ,
{
loader : 'postcss-loader' ,
options : {
plugins : ( ) => [
PostCSSPresetEnv ( ) ,
] ,
} ,
} ,
2020-01-28 10:30:39 +03:00
{
loader : 'less-loader' ,
} ,
2020-01-25 11:41:34 +03:00
] ,
2019-11-18 00:39:06 +03:00
} ,
2020-02-11 20:02:41 +03:00
{
test : /\.svg$/ ,
use : [
{
loader : 'svg-sprite-loader' ,
options : {
extract : true ,
spriteFilename : 'img/svg/icons.svg' ,
symbolId : ( path ) => {
2020-03-11 22:34:54 +03:00
const { name } = parse ( path ) ;
2020-02-11 20:02:41 +03:00
if ( /@primer[/\\]octicons/ . test ( path ) ) {
return ` octicon- ${ name } ` ;
}
return name ;
} ,
} ,
} ,
{
loader : 'svgo-loader' ,
} ,
] ,
} ,
2020-01-25 11:41:34 +03:00
] ,
2020-01-14 21:02:08 +03:00
} ,
plugins : [
2020-01-20 13:07:30 +03:00
new VueLoaderPlugin ( ) ,
2020-02-11 20:02:41 +03:00
// avoid generating useless js output files for css- and svg-only chunks
2020-01-28 10:30:39 +03:00
new FixStyleOnlyEntriesPlugin ( {
2020-02-11 20:02:41 +03:00
extensions : [ 'less' , 'scss' , 'css' , 'svg' ] ,
2020-01-28 10:30:39 +03:00
silent : true ,
} ) ,
2020-01-25 11:41:34 +03:00
new MiniCssExtractPlugin ( {
filename : 'css/[name].css' ,
chunkFilename : 'css/[name].css' ,
} ) ,
2020-01-14 21:02:08 +03:00
new SourceMapDevToolPlugin ( {
2020-01-25 11:41:34 +03:00
filename : 'js/[name].js.map' ,
2020-01-29 00:57:20 +03:00
include : [
'js/index.js' ,
2020-01-14 21:02:08 +03:00
] ,
} ) ,
2020-02-11 20:02:41 +03:00
new SpriteLoaderPlugin ( {
plainSprite : true ,
} ) ,
2020-01-14 21:02:08 +03:00
] ,
performance : {
2020-03-18 01:57:17 +03:00
hints : false ,
2020-01-14 21:02:08 +03:00
} ,
2020-01-22 09:35:29 +03:00
resolve : {
symlinks : false ,
2020-02-24 00:34:28 +03:00
alias : {
vue$ : 'vue/dist/vue.esm.js' , // needed because vue's default export is the runtime only
} ,
2020-01-25 11:41:34 +03:00
} ,
2020-02-23 11:47:42 +03:00
watchOptions : {
ignored : [
'node_modules/**' ,
] ,
} ,
2019-11-13 17:52:13 +03:00
} ;