var path = require("path") var webpack = require('webpack') var ExtractTextPlugin = require('extract-text-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') var deepExtend = require('deep-extend') const {gitDescribeSync} = require('git-describe') const os = require("os") var pkg = require("./package.json") let gitInfo try { gitInfo = gitDescribeSync(__dirname) } catch(e) { gitInfo = { hash: "noGit", dirty: false } } var commonRules = [ { test: /\.(js(x)?)(\?.*)?$/, use: [{ loader: "babel-loader", options: { retainLines: true } }], include: [ path.join(__dirname, "src") ] }, { test: /\.(txt|yaml)(\?.*)?$/, loader: "raw-loader" }, { test: /\.(png|jpg|jpeg|gif|svg)(\?.*)?$/, loader: "url-loader?limit=10000" }, { test: /\.(woff|woff2)(\?.*)?$/, loader: "url-loader?limit=100000" }, { test: /\.(ttf|eot)(\?.*)?$/, loader: "file-loader" } ] module.exports = function(rules, options) { // Special options, that have logic in this file // ...with defaults var specialOptions = deepExtend({}, { hot: false, separateStylesheets: true, minimize: false, longTermCaching: false, sourcemaps: false, }, options._special) var plugins = [] if( specialOptions.separateStylesheets ) { plugins.push(new ExtractTextPlugin({ filename: "[name].css" + (specialOptions.longTermCaching ? "?[contenthash]" : ""), allChunks: true })) } if( specialOptions.minimize ) { // production mode plugins.push( new webpack.optimize.UglifyJsPlugin({ sourceMap: true, }), new webpack.LoaderOptionsPlugin({ options: { context: __dirname } }) ) plugins.push( new webpack.NoEmitOnErrorsPlugin()) } else { // development mode plugins.push(new CopyWebpackPlugin([ { from: 'test/e2e/specs', to: 'test-specs' } ])) } plugins.push( new webpack.DefinePlugin({ "process.env": { NODE_ENV: specialOptions.minimize ? JSON.stringify("production") : null, WEBPACK_INLINE_STYLES: !specialOptions.separateStylesheets }, "buildInfo": JSON.stringify({ PACKAGE_VERSION: (pkg.version), GIT_COMMIT: gitInfo.hash, GIT_DIRTY: gitInfo.dirty, HOSTNAME: os.hostname(), BUILD_TIME: new Date().toUTCString() }) })) delete options._special var completeConfig = deepExtend({ entry: {}, output: { path: path.join(__dirname, "dist"), publicPath: "/", filename: "[name].js", chunkFilename: "[name].js" }, target: "web", // yaml-js has a reference to `fs`, this is a workaround node: { fs: "empty" }, module: { rules: commonRules.concat(rules), }, resolveLoader: { modules: [path.join(__dirname, "node_modules")], }, externals: { "buffertools": true // json-react-schema/deeper depends on buffertools, which fails. }, resolve: { modules: [ path.join(__dirname, "./src"), "node_modules" ], extensions: [".web.js", ".js", ".jsx", ".json", ".less"], alias: { base: "getbase/src/less/base", } }, devtool: specialOptions.sourcemaps ? "nosource-source-map" : null, plugins, }, options) return completeConfig }