'use strict'; const path = require('path'); const config = require('../config'); const VueLoaderPlugin = require('vue-loader/lib/plugin'); const {isDev, styleRule, assetsPath} = require('./utils'); function resolve(dir) { return path.join(__dirname, '..', dir); } const createLintingRule = () => ({ test: /\.(js|vue)$/, loader: 'eslint-loader', enforce: 'pre', include: [resolve('src'), resolve('test')], options: { formatter: require('eslint-friendly-formatter'), emitWarning: !config.dev.showEslintErrorsInOverlay, }, }); //todo: mini-css-extract-plugin? upgrade to webpack 4, then use this //https://github.com/webpack-contrib/mini-css-extract-plugin //todo: do we need postcss? module.exports = { context: path.resolve(__dirname, '../'), entry: { app: './src/main.js', }, output: { path: config.build.assetsRoot, filename: '[name].js', publicPath: isDev ? config.dev.assetsPublicPath : config.build.assetsPublicPath, }, resolve: { extensions: ['.js', '.vue', '.json', '.gql', '.graphql', '.scss'], alias: { '@': resolve('src'), styles: resolve('src/styles'), gql: resolve('src/graphql/gql') }, }, module: { rules: [ ...(config.dev.useEslint ? [createLintingRule()] : []), { test: /\.vue$/, loader: 'vue-loader', options: { transformAssetUrls: { video: ['src', 'poster'], source: 'src', img: 'src', image: 'xlink:href', }, }, }, { test: /\.js$/, loader: 'babel-loader', options: { presets: ['@babel/preset-env'], }, include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')], }, { test: /\.(gql|graphql)$/, loader: 'graphql-tag/loader', exclude: /node_modules/ }, { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: assetsPath('img/[name].[hash:7].[ext]'), }, }, { test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: assetsPath('media/[name].[hash:7].[ext]'), }, }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, loader: 'url-loader', options: { limit: 10000, name: assetsPath('fonts/[name].[hash:7].[ext]'), }, }, styleRule(false), // css rule styleRule(true), // sass rule ], }, plugins: [ new VueLoaderPlugin(), ], node: { // prevent webpack from injecting useless setImmediate polyfill because Vue // source contains it (although only uses it if it's native). setImmediate: false, // prevent webpack from injecting mocks to Node native modules // that does not make sense for the client dgram: 'empty', fs: 'empty', net: 'empty', tls: 'empty', child_process: 'empty', }, };