UNPKG

ceri-dev-server

Version:

a small development server for building ceri components

193 lines (176 loc) 5.71 kB
(function() { var ext, fs, fstools, getKarmaCfg, getLocalKarmaCfg, getLocalWebpackCfg, getWebpackCfg, ip, karma, merge, path, resolvePath, slice = [].slice; path = require("path"); ip = require("ip"); fs = require("fs"); merge = require("webpack-merge"); ext = path.extname(__filename); if (ext === ".coffee") { require("coffee-script/register"); } fstools = require("./fstools"); karma = null; resolvePath = function() { var args, tmp; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; tmp = path.resolve.apply(null, args); if (!fstools.isDirectory(tmp)) { throw new Error(tmp + " doesn't exist or is no directory"); } return tmp; }; getLocalWebpackCfg = function(options) { var dir, extension, filename, i, j, len, len1, ref, ref1; ref = ["cwd", "workingDir"]; for (i = 0, len = ref.length; i < len; i++) { dir = ref[i]; ref1 = ["coffee", "js", "json"]; for (j = 0, len1 = ref1.length; j < len1; j++) { extension = ref1[j]; filename = options[dir] + "/webpack.config." + extension; if (fstools.isFile(filename)) { if (extension === "coffee") { require("coffee-script/register"); } return require(filename); } } } return {}; }; getWebpackCfg = function(options) { var entry, localWebpackCfg; localWebpackCfg = getLocalWebpackCfg(options); entry = options.test ? {} : { entry: { index: [options.libDir + "/ceri-dev-client" + ext] }, output: { path: options["static"] + "/", publicPath: "", filename: "[name]_bundle.js" } }; return merge(require(options.libDir + "/webpack.config")(options), entry, localWebpackCfg, { context: options.workingDir }); }; getLocalKarmaCfg = function(options) { var dir, extension, filename, i, j, len, len1, ref, ref1; ref = ["cwd", "workingDir"]; for (i = 0, len = ref.length; i < len; i++) { dir = ref[i]; ref1 = ["coffee", "js"]; for (j = 0, len1 = ref1.length; j < len1; j++) { extension = ref1[j]; filename = options[dir] + "/karma.conf." + extension; if (fstools.isFile(filename)) { if (extension === "coffee") { require("coffee-script/register"); } return karma.config.parseConfig(filename); } } } return {}; }; getKarmaCfg = function(options) { var cfg, files, localCfg; localCfg = getLocalKarmaCfg(options); if (!localCfg.files) { files = options.workingDir + ("/**/*.+(" + (options.extensions.join("|")) + ")"); localCfg.files = [files]; localCfg.preprocessors = {}; localCfg.preprocessors[files] = ["webpack", "sourcemap"]; } if (localCfg.autoWatch == null) { localCfg.autoWatch = options.watch === true; } if (localCfg.singleRun == null) { localCfg.singleRun = options.watch !== true; } if (options.browsers) { localCfg.browsers = options.browsers; } cfg = karma.config.parseConfig(path.resolve(options.libDir, "karma.config" + ext), localCfg); cfg.webpack = merge(getWebpackCfg(options), cfg.webpack); return cfg; }; module.exports = function(options) { var chokidar, compiler, koa, koaHotDevWebpack, server, webconf, webpack; options = Object.assign({ port: 8080, folder: "dev", extensions: ["js", "coffee"], ext: ext, ip: ip.address(), libDir: __dirname, pkgDir: resolvePath(__dirname, ".."), cwd: process.cwd(), "static": "", test: false, watch: false }, options); options.workingDir = resolvePath(options.folder); if (options["static"]) { options["static"] = path.resolve(options["static"]); } if (options.test) { karma = require("karma"); server = new karma.Server(getKarmaCfg(options)); return server.start(); } else { webconf = getWebpackCfg(options); if (options["static"]) { require("mkdirp").sync(options["static"]); webpack = require("webpack"); compiler = webpack(webconf); return compiler.run(function(err, stats) { if (err) { throw err; } console.log(stats.toString({ colors: true })); if (stats.hasErrors() || stats.hasWarnings()) { return console.log("please fix the warnings and errors with webpack first"); } }); } else { koa = require("koa"); koa = new koa(); koaHotDevWebpack = require("koa-hot-dev-webpack"); koa.use(require("koa-static")(options.workingDir, { index: false })); koa.use(koaHotDevWebpack(webconf)); chokidar = require("chokidar"); if (ext === ".coffee") { chokidar.watch(options.libDir, { ignoreInitial: true }).on("all", function(event, path) { return koaHotDevWebpack.invalidate(); }); } chokidar.watch(options.workingDir, { ignoreInitial: true }).on("add", function(event, path) { return koaHotDevWebpack.invalidate(); }); if (options.koa) { return koa; } else { server = require("http").createServer(koa.callback()); server.listen(options.port, function() { return console.log("listening on http://" + options.ip + ":" + options.port + "/"); }); return server; } } } }; if (process.argv[0] === "coffee") { module.exports(); } }).call(this);