Files
mattermost/webapp/webpack.config.js
2016-09-23 10:22:35 -04:00

181 lines
4.8 KiB
JavaScript

const webpack = require('webpack');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const nodeExternals = require('webpack-node-externals');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const NPM_TARGET = process.env.npm_lifecycle_event; //eslint-disable-line no-process-env
var DEV = false;
var FULLMAP = false;
var TEST = false;
if (NPM_TARGET === 'run' || NPM_TARGET === 'run-fullmap') {
DEV = true;
if (NPM_TARGET === 'run-fullmap') {
FULLMAP = true;
}
}
if (NPM_TARGET === 'test') {
DEV = false;
TEST = true;
}
var config = {
entry: ['babel-polyfill', './root.jsx', 'root.html'],
output: {
path: 'dist',
publicPath: '/static/',
filename: '[name].[hash].js',
chunkFilename: '[name].[chunkhash].js'
},
module: {
loaders: [
{
test: /\.jsx?$/,
loader: 'babel',
exclude: /(node_modules|non_npm_dependencies)/,
query: {
presets: [
'react',
['es2015', {modules: false}],
'stage-0'
],
plugins: ['transform-runtime'],
cacheDirectory: DEV
}
},
{
test: /\.json$/,
exclude: /manifest\.json$/,
loader: 'json'
},
{
test: /manifest\.json$/,
loader: 'file?name=files/[hash].[ext]'
},
{
test: /(node_modules|non_npm_dependencies)\/.+\.(js|jsx)$/,
loader: 'imports',
query: {
$: 'jquery',
jQuery: 'jquery'
}
},
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
{
test: /\.css$/,
loaders: ['style', 'css']
},
{
test: /\.(png|eot|tiff|svg|woff2|woff|ttf|gif|mp3|jpg)$/,
loaders: [
'file?name=files/[hash].[ext]',
'image-webpack'
]
},
{
test: /\.html$/,
loader: 'html?attrs=link:href'
}
]
},
plugins: [
new webpack.ProvidePlugin({
'window.jQuery': 'jquery'
}),
new CopyWebpackPlugin([
{from: 'images/emoji', to: 'emoji'},
{from: 'images/logo-email.png', to: 'images'},
{from: 'images/circles.png', to: 'images'},
{from: 'images/favicon', to: 'images/favicon'},
{from: 'images/appIcons.png', to: 'images'}
]),
new webpack.LoaderOptionsPlugin({
minimize: !DEV,
debug: false
}),
new webpack.LoaderOptionsPlugin({
options: {
sassLoader: {
includePaths: ['node_modules/compass-mixins/lib']
}
}
}),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
}),
new webpack.optimize.CommonsChunkPlugin({
minChunks: 2,
children: true
})
],
resolve: {
alias: {
jquery: 'jquery/dist/jquery',
superagent: 'node_modules/superagent/lib/client'
},
modules: [
'node_modules',
'non_npm_dependencies',
path.resolve(__dirname)
]
}
};
// Development mode configuration
if (DEV) {
if (FULLMAP) {
config.devtool = 'source-map';
} else {
config.devtool = 'eval-cheap-module-source-map';
}
}
// Production mode configuration
if (!DEV) {
config.devtool = 'source-map';
config.plugins.push(
new webpack.optimize.UglifyJsPlugin({
'screw-ie8': true,
mangle: {
toplevel: false
},
compress: {
warnings: false
},
comments: false
})
);
config.plugins.push(
new webpack.optimize.OccurrenceOrderPlugin(true)
);
config.plugins.push(
new webpack.optimize.DedupePlugin()
);
}
// Test mode configuration
if (TEST) {
config.entry = ['babel-polyfill', './root.jsx'];
config.target = 'node';
config.externals = [nodeExternals()];
} else {
// For some reason this breaks mocha. So it goes here.
config.plugins.push(
new HtmlWebpackPlugin({
filename: 'root.html',
inject: 'head',
template: 'root.html'
})
);
}
module.exports = config;