cordova-elm-template-jumpstart
Version:
Cordova template to jumpstart development using Elm and Webpack
85 lines (75 loc) • 2.72 kB
JavaScript
#!nodejs --harmony
const { spawnSync } = require("child_process");
const path = require("path");
const fs = require("fs");
const assert = require("assert");
const print = require("pretty-print");
const Promise = require("bluebird");
const _ = require("lodash");
module.exports = (ctx) => {
const
projectRoot = ctx.opts.projectRoot,
events = ctx.requireCordovaModule("cordova-common").events;
process.on("unhandledRejection", (reason, promise) => {
events.emit("error", reason);
});
const fail = (err) => {
events.emit("error", err);
print(err);
const reason = _.isError(err) ? err : new Error(err);
return Promise.reject(reason);
}
const exec = (cmd, args) => {
events.emit("verbose", "Spawning command: " + cmd + " " + _.join(args, " "));
const result = spawnSync(
cmd,
[].concat(args),
{ cwd: projectRoot, env: process.env, encoding: 'utf8' }
);
if(result.error) {
events.emit("error", result);
print(result);
throw result.error;
} else if(result.status != 0) {
print(result);
throw new Error(cmd + " " + _.join(args, " "), " returned status code: " + result.status);
} else {
events.emit("verbose", "Output of command: " + result.stdout);
return (result.stdout || "").trim();
}
};
try {
events.emit('info', "Loading WebPack from your npm modules");
const node_modules = exec("npm", ["root"]);
const webpackJs = path.join(node_modules, "webpack", "lib", "webpack.js");
if(!fs.existsSync(webpackJs)) {
exec("npm", ["install", "webpack"]);
assert(fs.existsSync(webpackJs), "webpack.js still does not exist after install -- looking for " + webpackJs);
}
const webpack = require(webpackJs);
events.emit('info', "Loading WebPack config file");
const webpackConfigJs = path.join(projectRoot, "webpack.config.js");
if(!fs.existsSync(webpackConfigJs)) {
throw "Webpack config not found at: " + webpackConfigJs;
}
const webpackConfig = require(webpackConfigJs);
events.emit('info', "Running Webpack bundling and transpilation");
return new Promise((resolve, reject) =>
webpack(webpackConfig, (err, stats) => {
if(err) {
events.emit("error", err);
reject(err);
}
if(stats.hasErrors()) {
events.emit("error", stats.toString({chunks: false, colors: false}));
reject(stats);
}
events.emit('info', "Webpack bundling and transpilation complete");
events.emit(stats.hasWarnings() ? "warn" : "info", stats.toString({chunks: true, colors: false}));
resolve(true);
})
);
} catch(e) {
return fail(e);
}
};