| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 | const webpack = require('webpack')const path = require('path')const fs = require('fs-extra')const CleanWebpackPlugin = require('clean-webpack-plugin')const CopyWebpackPlugin = require('copy-webpack-plugin')const HtmlWebpackPlugin = require('html-webpack-plugin')const HtmlWebpackPugPlugin = require('html-webpack-pug-plugin')const MiniCssExtractPlugin = require('mini-css-extract-plugin')const OfflinePlugin = require('offline-plugin')const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin')const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')const SimpleProgressWebpackPlugin = require('simple-progress-webpack-plugin')const babelConfig = fs.readJsonSync(path.join(process.cwd(), '.babelrc'))const cacheDir = '.webpack-cache/cache'const babelDir = path.join(process.cwd(), '.webpack-cache/babel')process.noDeprecation = truemodule.exports = {  mode: 'production',  entry: {    client: './client/index.js'  },  output: {    path: path.join(process.cwd(), 'assets'),    publicPath: '/',    filename: 'js/[name].js',    chunkFilename: 'js/[name].js',    globalObject: 'this'  },  module: {    rules: [      {        test: /\.js$/,        exclude: /node_modules/,        use: [          {            loader: 'cache-loader',            options: {              cacheDirectory: cacheDir            }          },          {            loader: 'babel-loader',            options: {              ...babelConfig,              cacheDirectory: babelDir            }          }        ]      },      {        test: /\.css$/,        use: [          'style-loader',          MiniCssExtractPlugin.loader,          'css-loader',          'postcss-loader'        ]      },      {        test: /\.scss$/,        use: [          {            loader: 'cache-loader',            options: {              cacheDirectory: cacheDir            }          },          'style-loader',          MiniCssExtractPlugin.loader,          'css-loader',          'postcss-loader',          {            loader: 'sass-loader',            options: {              sourceMap: false            }          }        ]      },      {        test: /\.styl$/,        use: [          'style-loader',          MiniCssExtractPlugin.loader,          'css-loader',          'postcss-loader',          'stylus-loader'        ]      },      {        test: /\.vue$/,        loader: 'vue-loader',        options: {          loaders: {            scss: [              'vue-style-loader',              MiniCssExtractPlugin.loader,              'css-loader',              'postcss-loader',              {                loader: 'sass-loader',                options: {                  sourceMap: false                }              },              {                loader: 'sass-resources-loader',                options: {                  resources: path.join(process.cwd(), '/client/scss/global.scss')                }              }            ],            js: [              {                loader: 'cache-loader',                options: {                  cacheDirectory: cacheDir                }              },              {                loader: 'babel-loader',                options: {                  babelrc: path.join(process.cwd(), '.babelrc'),                  cacheDirectory: babelDir                }              }            ]          }        }      },      {        test: /\.(png|jpg|gif)$/,        use: [          {            loader: 'url-loader',            options: {              limit: 8192            }          }        ]      },      {        test: /\.svg$/,        exclude: [          path.join(process.cwd(), 'client/svg')        ],        use: [          {            loader: 'file-loader',            options: {              name: '[name].[ext]',              outputPath: 'svg/'            }          }        ]      },      {        test: /\.svg$/,        include: [          path.join(process.cwd(), 'client/svg')        ],        use: [          {            loader: 'raw-loader'          }        ]      },      {        test: /\.(graphql|gql)$/,        exclude: /node_modules/,        loader: 'graphql-tag/loader'      },      {        test: /.jsx$/,        loader: 'babel-loader',        exclude: /node_modules/,        options: {          presets: ['es2015', 'react']        }      },      {        test: /\.flow$/,        loader: 'ignore-loader'      }    ]  },  plugins: [    new webpack.BannerPlugin('Wiki.js - wiki.js.org - Licensed under AGPL'),    new CopyWebpackPlugin([      { from: 'client/static' },      { from: './node_modules/graphql-voyager/dist/voyager.worker.js', to: 'js/' }    ], {}),    new MiniCssExtractPlugin({      filename: 'css/bundle.css',      chunkFilename: 'css/[name].css'    }),    new HtmlWebpackPlugin({      template: 'dev/templates/master.pug',      filename: '../server/views/master.pug',      hash: true,      inject: 'head'    }),    new HtmlWebpackPugPlugin(),    new ScriptExtHtmlWebpackPlugin({      sync: 'runtime.js',      defaultAttribute: 'async'    }),    new SimpleProgressWebpackPlugin({      format: 'expanded'    }),    new CleanWebpackPlugin([      'assets/js/*.*',      'assets/css/*.*',      'assets/*.js',      'assets/*.json'    ], {      root: process.cwd(),      verbose: false    }),    new OptimizeCssAssetsPlugin({      cssProcessorOptions: { discardComments: { removeAll: true } },      canPrint: true    }),    new OfflinePlugin({      ServiceWorker: {        minify: false      },      publicPath: '/',      externals: ['/'],      caches: {        main: [          'js/client.js'        ],        additional: [          ':externals:'        ],        optional: [          'js/*.chunk.js'        ]      },      safeToUseOptionalCaches: true    })  ],  optimization: {    namedModules: true,    namedChunks: true,    splitChunks: {      name: 'vendor',      minChunks: 2    },    runtimeChunk: 'single'  },  resolve: {    mainFields: ['browser', 'main', 'module'],    symlinks: true,    alias: {      '@': path.join(process.cwd(), 'client'),      'vue$': 'vue/dist/vue.esm.js',      'gql': path.join(process.cwd(), 'client/graph'),      'mdi': path.resolve(process.cwd(), 'node_modules/vue-material-design-icons'),      // Duplicates fixes:      'apollo-link': path.join(process.cwd(), 'node_modules/apollo-link'),      'apollo-utilities': path.join(process.cwd(), 'node_modules/apollo-utilities'),      'uc.micro': path.join(process.cwd(), 'node_modules/uc.micro')    },    extensions: [      '.js',      '.json',      'jsx',      '.vue'    ],    modules: [      'node_modules'    ]  },  node: {    fs: 'empty'  },  stats: {    children: false,    entrypoints: false  },  target: 'web'}
 |