Files
mattermost/webapp/webpack.config.js
Christopher Speller 2bbedd9def Updating client dependencies. Switching to yarn. (#6433)
* Updating client dependancies. Switching to using yarn.

* Updating React

* Moving pure components to using function syntax (performance gains with newer react version)

* Updating client dependancies.

* Ignore .yarninstall

* Enabling pre-lockfile because it's the entire point of using yarn.

* Removing old webpack config

* Moving to new prop-types

* Fixing ESLint Errors

* Updating jest snapshots.

* Cleaning up package.json
2017-05-18 09:28:18 -04:00

329 lines
8.4 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;
}
const STANDARD_EXCLUDE = [
path.join(__dirname, 'node_modules'),
path.join(__dirname, 'non_npm_dependencies')
];
var MYSTATS = {
// Add asset Information
assets: false,
// Sort assets by a field
assetsSort: '',
// Add information about cached (not built) modules
cached: true,
// Show cached assets (setting this to `false` only shows emitted files)
cachedAssets: true,
// Add children information
children: true,
// Add chunk information (setting this to `false` allows for a less verbose output)
chunks: true,
// Add built modules information to chunk information
chunkModules: true,
// Add the origins of chunks and chunk merging info
chunkOrigins: true,
// Sort the chunks by a field
chunksSort: '',
// `webpack --colors` equivalent
colors: true,
// Display the distance from the entry point for each module
depth: true,
// Display the entry points with the corresponding bundles
entrypoints: true,
// Add errors
errors: true,
// Add details to errors (like resolving log)
errorDetails: true,
// Exclude modules which match one of the given strings or regular expressions
exclude: [],
// Add the hash of the compilation
hash: true,
// Set the maximum number of modules to be shown
maxModules: 0,
// Add built modules information
modules: false,
// Sort the modules by a field
modulesSort: '!size',
// Show performance hint when file size exceeds `performance.maxAssetSize`
performance: true,
// Show the exports of the modules
providedExports: true,
// Add public path information
publicPath: true,
// Add information about the reasons why modules are included
reasons: true,
// Add the source code of modules
source: true,
// Add timing information
timings: true,
// Show which exports of a module are used
usedExports: true,
// Add webpack version information
version: true,
// Add warnings
warnings: true,
// Filter warnings to be shown (since webpack 2.4.0),
// can be a String, Regexp, a function getting the warning and returning a boolean
// or an Array of a combination of the above. First match wins.
warningsFilter: ''
};
var config = {
entry: ['babel-polyfill', 'whatwg-fetch', './root.jsx', 'root.html'],
output: {
path: path.join(__dirname, 'dist'),
publicPath: '/static/',
filename: '[name].[hash].js',
chunkFilename: '[name].[chunkhash].js'
},
module: {
rules: [
{
test: /\.(js|jsx)?$/,
exclude: STANDARD_EXCLUDE,
use: [
{
loader: 'babel-loader',
options: {
presets: [
'react',
['es2015', {modules: false}],
'stage-0'
],
plugins: ['transform-runtime'],
cacheDirectory: true
}
}
]
},
{
test: /\.json$/,
exclude: /manifest\.json$/,
use: [
{
loader: 'json-loader'
}
]
},
{
test: /manifest\.json$/,
use: [
{
loader: 'file-loader?name=files/[hash].[ext]'
}
]
},
{
test: /(node_modules|non_npm_dependencies)(\\|\/).+\.(js|jsx)$/,
use: [
{
loader: 'imports-loader',
options: {
$: 'jquery',
jQuery: 'jquery'
}
}
]
},
{
test: /\.scss$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader'
},
{
loader: 'sass-loader',
options: {
includePaths: ['node_modules/compass-mixins/lib']
}
}
]
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader'
}
]
},
{
test: /\.(png|eot|tiff|svg|woff2|woff|ttf|gif|mp3|jpg)$/,
use: [
{
loader: 'file-loader',
options: {
name: 'files/[hash].[ext]'
}
},
{
loader: 'image-webpack-loader',
options: {}
}
]
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: {
attrs: 'link:href'
}
}
]
}
]
},
resolve: {
modules: [
'node_modules',
'non_npm_dependencies',
path.resolve(__dirname)
],
alias: {
jquery: 'jquery/dist/jquery',
superagent: 'node_modules/superagent/lib/client'
}
},
performance: {
hints: 'warning'
},
target: 'web',
stats: MYSTATS,
plugins: [
new webpack.ProvidePlugin({
'window.jQuery': 'jquery'
}),
new webpack.LoaderOptionsPlugin({
minimize: !DEV,
debug: false
}),
new webpack.optimize.CommonsChunkPlugin({
minChunks: 2,
children: true
})
]
};
// Development mode configuration
if (DEV) {
if (FULLMAP) {
config.devtool = 'source-map';
} else {
config.devtool = 'cheap-module-eval-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,
sourceMap: true
})
);
config.plugins.push(
new webpack.optimize.OccurrenceOrderPlugin(true)
);
config.plugins.push(
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify('production')
}
})
);
}
// Test mode configuration
if (TEST) {
config.entry = ['babel-polyfill', './root.jsx'];
config.target = 'node';
config.externals = [nodeExternals()];
} else {
// For some reason these break mocha. So they go here.
config.plugins.push(
new HtmlWebpackPlugin({
filename: 'root.html',
inject: 'head',
template: 'root.html'
})
);
config.plugins.push(
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'}
])
);
}
module.exports = config;