ceri-dev-server
Version:
a small development server for building ceri components
193 lines (176 loc) • 5.71 kB
JavaScript
(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);