import fs from 'fs'; import path from 'path'; import webpack from 'webpack'; import merge from 'webpack-merge'; import autoprefixer from 'autoprefixer'; import ExtractTextPlugin from 'extract-text-webpack-plugin'; import OptimizeJsPlugin from 'optimize-js-plugin'; import OptimizeCssAssetsPlugin from 'optimize-css-assets-webpack-plugin'; import mediaPacker from 'css-mqpacker'; import config from '../config'; import baseConfig from './base'; const version = process.env.VERSION || require('../../package.json').version; function getDirectories(src) { return fs.readdirSync(src).filter((file) => { return fs.statSync(path.join(src, file)).isDirectory(); }); } const componentsPath = 'src/components'; const components = getDirectories(path.resolve(__dirname, '../../', componentsPath)); baseConfig.entry = { 'vue-material': ['./src/index.js'], 'components/mdCore/index': ['./src/core'] }; components.forEach((component) => { baseConfig.entry[path.join('components', component, 'index')] = ['./' + path.join(componentsPath, component)]; }); export default merge(baseConfig, { output: { path: config.rootPath, filename: '[name].js', library: 'VueMaterial', libraryTarget: 'umd' }, module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { loaders: { css: ExtractTextPlugin.extract({ use: 'css-loader', fallback: 'vue-style-loader' }), scss: ExtractTextPlugin.extract({ use: 'css-loader!sass-loader', fallback: 'vue-style-loader' }) }, postcss: [ autoprefixer({ browsers: ['last 3 versions', 'not IE < 10'] }), mediaPacker() ] } }, { test: /\.css$/, loader: ExtractTextPlugin.extract({ use: 'css-loader', fallback: 'vue-style-loader' }) }, { test: /\.scss$/, loader: ExtractTextPlugin.extract({ use: 'css-loader!sass-loader', fallback: 'vue-style-loader' }) } ] }, externals: { vue: { commonjs: 'vue', commonjs2: 'vue', amd: 'vue', root: 'Vue', var: 'Vue' } }, plugins: [ new webpack.LoaderOptionsPlugin({ minimize: true, debug: false }), new webpack.optimize.UglifyJsPlugin({ compress: { warnings: false, screw_ie8: true, conditionals: true, unused: true, comparisons: true, sequences: true, dead_code: true, evaluate: true, join_vars: true, if_return: true }, output: { comments: false }, sourceMap: false }), new OptimizeJsPlugin({ sourceMap: false }), new webpack.BannerPlugin({ banner: `/*! * Vue Material v${version} * Made with love by Marcos Moura * Released under the MIT License. */ `, raw: true, entryOnly: true }), new ExtractTextPlugin('[name].css'), new OptimizeCssAssetsPlugin({ canPrint: false }) ] });