UNPKG

kcd-common-tools

Version:

Common build tools for projects by Kent C. Dodds

148 lines (123 loc) 3.47 kB
/* eslint-env node */ var webpack = require('webpack'); var WebpackNotifierPlugin = require('webpack-notifier'); var _ = require('lodash'); var assignOverrides = require('../utils/assign-overrides'); var here = require('../utils/here'); var packageJson = require(here('package.json')); var kcdCommon = packageJson.kcdCommon || {}; var context = process.env.NODE_ENV || 'development'; var configFns = { development: getDevConfig, production: getProdConfig, test: getTestConfig, 'test:ci': getTestCIConfig }; var config = configFns[context](); addCommonPlugins(); config = assignOverrides(config, kcdCommon.webpack, context); console.log('building version %s in %s mode', packageJson.version, context); module.exports = config; function getDevConfig() { var exclude = /node_modules/; var devConfig = { context: here('src'), entry: './index.js', output: { filename: packageJson.main, libraryTarget: 'umd' }, stats: { colors: true, reasons: true }, plugins: [], resolve: { extensions: ['', '.js'] }, module: { loaders: [ {test: /\.html$/, loaders: getLoaders(['raw']), exclude: exclude}, {test: /\.js$/, loaders: getLoaders(['ng-annotate', 'babel', 'eslint']), exclude: exclude} ] }, eslint: { emitError: false, failOnError: false, failOnWarning: false, quiet: true } }; if (process.env.CI !== 'true') { devConfig.plugins = [ new WebpackNotifierPlugin() ]; } return devConfig; } function getProdConfig(noUglify) { var prodConfig = _.merge({}, getDevConfig(), { output: { filename: packageJson.main.replace(/\.js$/, '.min.js') }, devtool: 'source-map', eslint: { emitError: true, failOnError: true } }); prodConfig.plugins = [ new webpack.optimize.DedupePlugin(), new webpack.optimize.OccurenceOrderPlugin(), new webpack.optimize.AggressiveMergingPlugin() ]; // allow getting rid of the UglifyJsPlugin // https://github.com/webpack/webpack/issues/1079 if (!noUglify) { prodConfig.plugins.push(new webpack.optimize.UglifyJsPlugin({ compress: {warnings: false} })); } return prodConfig; } function getTestConfig() { return _.merge({}, getDevConfig(), { entry: './index.test.js', plugins: [] }); } function getTestCIConfig() { var noUglify = true; return _.merge({}, getProdConfig(noUglify), { entry: './index.test.js', module: { postLoaders: [ {test: /\.js$/, loader: 'uglify', exclude: /\.test\.js$/} ] }, 'uglify-loader': { compress: {warnings: false} } }); } function getLoaders(loaders) { return _.filter(loaders, function(loader) { return packageJson.devDependencies.hasOwnProperty(loader + '-loader'); }); } function addCommonPlugins() { config.plugins = config.plugins || []; config.plugins.unshift(new webpack.BannerPlugin(getBanner(), {raw: true})); // put the global variables before everything else config.plugins.unshift(new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), VERSION: JSON.stringify(packageJson.version) })); } function getBanner() { return '//! ' + packageJson.name + ' version ' + packageJson.version + ' built with ♥ by ' + (packageJson.contributors || [packageJson.author]).join(', ') + ' (ó ì_í)=óò=(ì_í ò)\n'; }