143 lines
3.9 KiB
JavaScript
143 lines
3.9 KiB
JavaScript
var webpack = require('webpack'),
|
||
path = require('path'),
|
||
autoprefixer = require('autoprefixer'),
|
||
Clean = require("clean-webpack-plugin"),
|
||
AssetsPlugin = require('assets-webpack-plugin'),
|
||
ExtractTextPlugin = require('extract-text-webpack-plugin'),
|
||
OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'),
|
||
cssnano = require('cssnano');
|
||
|
||
var SAGE_ENV = process.env.SAGE_ENV || 'development',
|
||
webpackConfig;
|
||
|
||
var sage = {
|
||
publicPath: '/app/themes/sage/dist/',
|
||
dist: path.join(__dirname, 'dist'),
|
||
manifest: 'assets.json',
|
||
// set to true to extract css in dev mode (prevents "hot" update)
|
||
extractStyles: false
|
||
};
|
||
|
||
// format output for Sage : { "name.ext": "hash.ext" }
|
||
var assetsPluginProcessOutput = function (assets) {
|
||
var results = {},
|
||
name,
|
||
ext;
|
||
|
||
for (name in assets) {
|
||
if (assets.hasOwnProperty(name)) {
|
||
for (ext in assets[name]) {
|
||
if (assets[name].hasOwnProperty(ext)) {
|
||
results[name + '.' + ext] = assets[name][ext];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return JSON.stringify(results);
|
||
}
|
||
|
||
webpackConfig = {
|
||
entry: {
|
||
main: [
|
||
'./assets/scripts/main'
|
||
],
|
||
customizer: [
|
||
'./assets/scripts/customizer'
|
||
]
|
||
},
|
||
output: {
|
||
path: sage.dist,
|
||
publicPath: sage.publicPath
|
||
},
|
||
module: {
|
||
preLoaders: [
|
||
{
|
||
test: /\.jsx?$/,
|
||
exclude: /node_modules/,
|
||
loader: 'eslint'
|
||
}
|
||
],
|
||
loaders: [
|
||
{
|
||
test: /\.js$/,
|
||
exclude: /node_modules/,
|
||
loaders: ['monkey-hot', 'babel']
|
||
},
|
||
{
|
||
test: /\.css$/,
|
||
exclude: /node_modules/,
|
||
loader: ExtractTextPlugin.extract('style', 'css?sourceMap!postcss')
|
||
},
|
||
{
|
||
test: /\.scss$/,
|
||
exclude: /node_modules/,
|
||
loader: ExtractTextPlugin.extract('style', 'css?sourceMap!postcss!sass?sourceMap')
|
||
},
|
||
{
|
||
test: /\.(ttf|eot|svg)$/,
|
||
loader: 'url?limit=10000'
|
||
},
|
||
{
|
||
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||
loader: 'url?limit=10000&mimetype=application/font-woff'
|
||
},
|
||
{
|
||
test: /\.(png|jpg|jpeg|gif)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
|
||
loader: 'file-loader'
|
||
}
|
||
],
|
||
},
|
||
resolve: { extensions: [ '', '.js', '.json' ] },
|
||
externals: {
|
||
jquery: 'jQuery'
|
||
},
|
||
plugins: [
|
||
new Clean([sage.dist]),
|
||
new webpack.ProvidePlugin({
|
||
$: 'jquery',
|
||
jQuery: 'jquery',
|
||
'window.jQuery': 'jquery',
|
||
'window.Tether': 'tether'
|
||
}),
|
||
new AssetsPlugin({
|
||
path: sage.dist,
|
||
filename: sage.manifest,
|
||
fullPath: false,
|
||
processOutput: assetsPluginProcessOutput,
|
||
})
|
||
],
|
||
postcss: [ autoprefixer ],
|
||
eslint: {
|
||
failOnWarning: false,
|
||
failOnError: true,
|
||
}
|
||
};
|
||
|
||
if ( SAGE_ENV === 'development' ) {
|
||
// development
|
||
webpackConfig.entry.main.push('webpack-hot-middleware/client?reload=true');
|
||
webpackConfig.entry.customizer.push('webpack-hot-middleware/client?reload=true');
|
||
webpackConfig.output.filename = '[name].js';
|
||
webpackConfig.output.sourceMapFilename = '[file].map';
|
||
webpackConfig.output.pathinfo = true;
|
||
webpackConfig.debug = true;
|
||
webpackConfig.devtool = '#cheap-module-source-map';
|
||
webpackConfig.plugins.push(new webpack.optimize.OccurenceOrderPlugin());
|
||
webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
|
||
webpackConfig.plugins.push(new webpack.NoErrorsPlugin());
|
||
webpackConfig.plugins.push(new ExtractTextPlugin('[name].css', { disable: !sage.extractStyles }));
|
||
} else {
|
||
// production
|
||
webpackConfig.output.filename = '[name].[hash].js';
|
||
webpackConfig.output.sourceMapFilename = '[file].[hash].map';
|
||
webpackConfig.plugins.push(new ExtractTextPlugin('[name].[hash].css'));
|
||
webpackConfig.plugins.push(new webpack.optimize.UglifyJsPlugin());
|
||
webpackConfig.plugins.push(new OptimizeCssAssetsPlugin({
|
||
cssProcessor: cssnano,
|
||
cssProcessorOptions: { discardComments: { removeAll: true } },
|
||
canPrint: true
|
||
}));
|
||
}
|
||
|
||
module.exports = webpackConfig;
|