UNPKG

generator-enyo

Version:

Enyo bootplate Yeoman generator

243 lines (235 loc) 6.93 kB
/* * bootplate.js * * Build and manipulate preset/custom configurations of Enyo bootplate */ var fs = require('fs'), path = require('path'), shell = require('shelljs'), vm = require('vm'), os = require('os'), mixin = require("./mixin.js"), bower = require('./bower.js'), libmgr = require('./libmgr.js'), exec = require("./simplified-exec.js"); var ONYX = "onyx", MOONSTONE = "moonstone", SUNSTONE = "sunstone", GARNET = "garnet", SAMPLER = "sampler", DEPLOY_SCRIPT = "tools" + path.sep + "deploy", LIB_DIR = "lib", BASE_DIR = "bootplate", ENYO_DIR = "enyo", UTF8 = "utf8", CONFIG = JSON.parse(fs.readFileSync(path.join(__dirname, "../bootplate.json"), {encoding:"utf8"})); function baseSetup(dir, bpGit, enyo, tag, callback) { bower.bowerrc(".", function(err) { if(err) { callback(err); } else { bower.installNoSave(bpGit + tag, BASE_DIR, "inherit", function(err2) { if(err2) { console.error("Unable to setup base bootplate code."); callback(err2); } else { shell.cp("-fr", BASE_DIR + "/*", "."); shell.rm("-fr", path.join(BASE_DIR)); shell.rm("-f", path.join(".bower.json")); if(fs.existsSync("README-CORDOVA-WEBOS.md")) { shell.rm("-f", path.join("README-CORDOVA-WEBOS.md")); } var installEnyo = function() { bower.installNoSave(enyo + tag, ENYO_DIR, "inherit", function(err3) { if(err3) { console.error("Unable to setup enyo core framework."); callback(err3); } else { bower.bowerrc(LIB_DIR, callback); } }); } if(fs.existsSync("package.json")) { exec.npm_install("inherit", function(err3) { if(err3) { console.warn("Unable to npm install dependencies; try running the command yourself") } console.log(" "); installEnyo() }); } else { installEnyo(); } } }); } }) } function resolveTag(version, defVersion, latest) { var tag = ""; if(version) { tag = "#" + version; } else if(defVersion && !latest) { tag = "#" + defVersion; } return tag; } function enyoVersion(callback) { var enyoBowerJSON = path.join("enyo/.bower.json"); if(fs.existsSync(enyoBowerJSON)) { fs.readFile(enyoBowerJSON, {encoding:"utf8"}, function(err, data) { try { var obj = JSON.parse(data || {}); callback(obj.version); } catch(e) { callback(); } }); } else { callback(); } } function updateEnyo(tag, callback) { bower.bowerrc(".", function(err) { if(!err) { bower.initialize([{name:ENYO_DIR, component:CONFIG.enyo + tag}], function(err2) { if(err2) { // revert to "lib" bower location on a failed updated bower.bowerrc(LIB_DIR, function(err3) { callback(err2); }); } else { bower.bowerrc(LIB_DIR, callback); } }); } else { callback(err); } }); } module.exports = { create: function(opts, callback) { opts.path = opts.path || process.cwd(); var conf = mixin(CONFIG, opts.config || {}); opts.mode = opts.mode || conf.defaultMode; var cwd = process.cwd(); var tag = resolveTag(opts.version, conf.defaultVersion, opts.latest); shell.mkdir("-p", path.join(opts.path, LIB_DIR)); process.chdir(opts.path); var base = conf.repos["bootplate-" + opts.mode] || conf.repos["bootplate-" + conf.defaultMode]; if(!fs.existsSync(ENYO_DIR)) { baseSetup(opts.path, base, conf.enyo, tag, function(err) { if(err) { callback(err); } else { var depends = []; if(conf.modes[opts.mode]) { for(var i=0; i<conf.modes[opts.mode].length; i++) { var name = conf.modes[opts.mode][i]; if(conf.repos[name]) { depends.push({name: name, component: conf.repos[name] + tag}); } } } bower.initialize(depends, function(err2) { if(err2) { console.error("Unable to setup bootplate libraries.") callback(err2); } else { libmgr.initialize(conf.modes[opts.mode] || [], function(err3) { process.chdir(cwd); callback(err3, opts); }); } }); } }); } else { callback(new Error("Bootplate project already exists at " + opts.path)); } }, addLib: function(opts, callback) { opts.path = opts.path || process.cwd(); var conf = mixin(CONFIG, opts.config || {}); process.chdir(opts.path); if(!opts.remote) { if(conf.repos[opts.name] || conf.repos["enyo-" + opts.name]) { opts.remote = conf.repos[opts.name] || conf.repos["enyo-" + opts.name]; if(!(CONFIG.repos[opts.name] || CONFIG.repos["enyo-" + opts.name])) { opts.latest = true; } } else { callback(new Error(opts.name + " unable be resolved")); return; } } else { opts.latest = true; } enyoVersion(function(version) { var tag = resolveTag(opts.version, version, opts.latest); bower.install(opts.remote + tag, opts.name, function(err) { if(err) { callback(err); } else { libmgr.addLib(opts.name, callback); } }); }); }, removeLib: function(opts, callback) { opts.path = opts.path || process.cwd(); process.chdir(opts.path); if(!fs.existsSync(path.join(LIB_DIR, opts.name)) && fs.existsSync(path.join(LIB_DIR, "enyo-" + opts.name))) { opts.name = "enyo-" + opts.name; } bower.uninstall(opts.name, function(err) { if(err) { callback(err); } else { libmgr.removeLib(opts.name, callback); } }); }, listLibs: function(custConfig) { var conf = mixin(CONFIG, custConfig || {}); var repos = Object.keys(conf.repos); var ignored = ["garnet", "sunstone"]; for(var i=0; i<repos.length; i++) { if(repos[i].indexOf("bootplate-")===0 || ignored.indexOf(repos[i])>-1) { repos.splice(i, 1); i--; } } return repos; }, update: function(opts, callback) { opts.path = opts.path || process.cwd(); process.chdir(opts.path); var tag = resolveTag(opts.version, CONFIG.defaultVersion, opts.latest); if(fs.existsSync("bower.json")) { shell.mv("-f", "bower.json", "bower.json.bak"); updateEnyo(tag, function(err) { shell.mv("-f", "bower.json.bak", "bower.json"); if(!err) { bower.updateTo(tag, function(name, component) { return (CONFIG.repos[name] && CONFIG.repos[name]===component); }, function(err2) { callback(err2, tag); }); } else { callback(err, tag); } }); } else { console.error("Bower.json is missing. What happened to bower.json? :("); callback(new Error("Unable to read current dependencies."), tag); } }, deploy: function(opts, callback) { if(!opts) opts = {}; opts.path = opts.path || process.cwd(); process.chdir(opts.path); exec.script(DEPLOY_SCRIPT, "inherit", callback); } };