From 618bcc038266782ab4730023d7876552f10a4413 Mon Sep 17 00:00:00 2001 From: Dominik Perpeet Date: Mon, 19 Jun 2017 11:49:25 +0200 Subject: [PATCH] build: Update webpack config Make building more convenient, add linting and distribute html files. --- .gitignore | 2 +- package.json | 6 +++ webpack.config.js | 113 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 111 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 885dafa..d78b367 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ *~ *.retry node_modules/ -build/ \ No newline at end of file +dist/ diff --git a/package.json b/package.json index b2467f5..988ade1 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,12 @@ "babel-loader": "^7.0.0", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-preset-env": "^1.5.2", + "copy-webpack-plugin": "~3.0.1", + "eslint": "^3.0.0", + "eslint-loader": "~1.6.1", + "eslint-plugin-react": "~6.9.0", + "jshint": "~2.9.1", + "jshint-loader": "~0.8.3", "webpack": "^2.6.1" }, "dependencies": { diff --git a/webpack.config.js b/webpack.config.js index d862669..0addb49 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,18 +1,113 @@ const path = require("path"); +const copy = require("copy-webpack-plugin"); +const fs = require("fs"); + +/* These can be overridden, typically from the Makefile.am */ +const srcdir = (process.env.SRCDIR || __dirname) + path.sep + "src"; +const builddir = (process.env.SRCDIR || __dirname); +const distdir = builddir + path.sep + "dist"; +const section = process.env.ONLYDIR || null; + +var info = { + entries: { + "index": [ + "./index.js" + ] + }, + files: [ + "index.html" + ] +}; + +var output = { + path: distdir, + filename: "[name].js", + sourceMapFilename: "[file].map", +}; + +/* + * Note that we're avoiding the use of path.join as webpack and nodejs + * want relative paths that start with ./ explicitly. + * + * In addition we mimic the VPATH style functionality of GNU Makefile + * where we first check builddir, and then srcdir. + */ + +function vpath(/* ... */) { + var filename = Array.prototype.join.call(arguments, path.sep); + var expanded = builddir + path.sep + filename; + if (fs.existsSync(expanded)) + return expanded; + expanded = srcdir + path.sep + filename; + return expanded; +} + +/* Qualify all the paths in entries */ +Object.keys(info.entries).forEach(function(key) { + if (section && key.indexOf(section) !== 0) { + delete info.entries[key]; + return; + } + + info.entries[key] = info.entries[key].map(function(value) { + if (value.indexOf("/") === -1) + return value; + else + return vpath(value); + }); +}); + +/* Qualify all the paths in files listed */ +var files = []; +info.files.forEach(function(value) { + if (!section || value.indexOf(section) === 0) + files.push({ from: vpath("src", value), to: value }); +}); +info.files = files; + +var plugins = [ + new copy(info.files) +]; module.exports = { - entry: ["./src/index.js"], - output: { - filename: "bundle.js", - path: path.resolve(__dirname, "build") - }, + entry: info.entries, + output: output, module: { rules: [ { - exclude: /node_modules/, - loader: 'babel-loader', - test: /\.js$/ + enforce: 'pre', + exclude: /node_modules/, + loader: 'jshint-loader', + test: /\.js$/ + }, + { + enforce: 'pre', + exclude: /node_modules/, + loader: 'eslint-loader', + test: /\.jsx$/ + }, + { + enforce: 'pre', + exclude: /node_modules/, + loader: 'jshint-loader?esversion=6', + test: /\.es6$/ + }, + { + exclude: /node_modules/, + loader: 'babel-loader', + test: /\.js$/ + }, + { + exclude: /node_modules/, + loader: 'babel-loader', + test: /\.jsx$/ + }, + { + exclude: /node_modules/, + loader: 'babel-loader', + test: /\.es6$/ } ] - } + }, + plugins: plugins }