UNPKG

cordova-elm-template-jumpstart

Version:

Cordova template to jumpstart development using Elm and Webpack

85 lines (75 loc) 2.72 kB
#!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); } };