'use strict' const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const { VueLoaderPlugin } = require('vue-loader') const ESLintPlugin = require('eslint-webpack-plugin'); const ExtraneousFileCleanupPlugin = require('webpack-extraneous-file-cleanup-plugin'); const CompressionPlugin = require("compression-webpack-plugin"); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const CircularDependencyPlugin = require('circular-dependency-plugin') const utils = require('./utils') const themePath = 'web/themes/custom/materiotheme' const langPath = 'web/sites/default/files/lang' const isDev = process.env.NODE_ENV === 'development'; module.exports = { resolve: { extensions: ['.js', '.vue', '.json'], alias: { // 'vue': 'vue/dist/vue.js', 'vue' : isDev ? 'vue/dist/vue.js' : 'vue/dist/vue.min.js', 'theme': utils.resolve(themePath), 'vuejs': utils.resolve(themePath+'/vuejs'), 'assets': utils.resolve(themePath+'/assets'), // locales are exported by strings_i18n_json_export from drupal 'locales': utils.resolve(langPath) } }, entry: { 'main': utils.resolve(themePath + '/assets/scripts/main.js'), // 'lang-en': utils.resolve(langPath + '/en.json'), 'print': utils.resolve(themePath + '/assets/styles/print.scss'), 'email': utils.resolve(themePath + '/assets/styles/email.scss'), // 'mdi': utils.resolve(themePath + '/assets/styles/mdi/scss/materialdesignicons.scss') }, output: { publicPath: '/themes/custom/materiotheme/assets/dist/', path: utils.resolve(themePath + '/assets/dist/'), filename: '[name].js', chunkFilename: '[name].[chunkhash].bundle.js' }, module: { rules: [ // { // test: /\.(js|vue)$/, // loader: 'eslint-loader', // enforce: 'pre', // exclude: /node_modules/, // options: { // emitError: true, // emitWarning: true // } // }, { test: /\.vue$/, use: 'vue-loader' }, // { // resourceQuery: /blockType=i18n/, // type: 'javascript/auto', // loader: '@kazupon/vue-i18n-loader' // }, // { // test: /\.js$/, // use: { // loader: 'babel-loader', // } // }, { test: /\.(graphql|gql)$/, exclude: /node_modules/, loader: 'graphql-tag/loader' }, { test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, use: { loader: 'url-loader', options: { limit: 10000, name: utils.assetsPath('fonts/[name].[hash:7].[ext]') } } } // { // test: /\.graphql?$/, // use: [ // { // loader: 'webpack-graphql-loader', // options: { // // validate: true, // // schema: "./path/to/schema.json", // // removeUnusedFragments: true // // etc. See "Loader Options" below // } // } // ] // } // , { // test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, // use: { // loader: 'url-loader', // options: { // limit: 10000, // name: utils.assetsPath('img/[name].[hash:7].[ext]') // } // } // }, { // test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, // use: { // loader: 'url-loader', // options: { // limit: 10000, // name: utils.assetsPath('media/[name].[hash:7].[ext]') // } // } // } // { // test: /\.css$/, // use: [MiniCssExtractPlugin.loader, 'css-loader'], // }, ] }, optimization: { splitChunks: { cacheGroups: { // vsa: { // test: /[\\/]node_modules[\\/](vue-simple-accordion)[\\/]/, // name: 'vsa', // chunks: 'all', // usedExports: true // }, vclb: { test: /[\\/]node_modules[\\/](vue-cool-lightbox)[\\/]/, name: 'vclb', chunks: 'all', usedExports: true }, // vue_page_article: { // test: /[\\/]web[\\/]themes[\\/]custom[\\/]materiotheme[\\/]vuejs[\\/]components[\\/]Pages[\\/]Article.vue/, // name: 'vue_page_article', // chunks: 'all' // } }, }, }, plugins: [ new MiniCssExtractPlugin({ filename: '[name].css' }), new VueLoaderPlugin(), new ESLintPlugin({ // fix: true // exclude: ['web/.eslintrc.json'] // cache: false, // ignore: true, // useEslintrc: false, }), new ExtraneousFileCleanupPlugin({ extensions: ['.js'], paths: [utils.resolve(themePath + '/assets/dist/')], minBytes: 4096 }), new CompressionPlugin(), /** * All files inside webpack's output.path directory will be removed once, but the * directory itself will not be. If using webpack 4+'s default configuration, * everything under /dist/ will be removed. * Use cleanOnceBeforeBuildPatterns to override this behavior. * * During rebuilds, all webpack assets that are not used anymore * will be removed automatically. * * See `Options and Defaults` for information */ new CleanWebpackPlugin(), new CircularDependencyPlugin({ // exclude detection of files based on a RegExp exclude: /a\.js|node_modules/, // include specific files based on a RegExp // include: /dir/, // add errors to webpack instead of warnings failOnError: false, // allow import cycles that include an asyncronous import, // e.g. via import(/* webpackMode: "weak" */ './file.js') allowAsyncCycles: false, // set the current working directory for displaying module paths // cwd: process.cwd(), }) ] }