beez-confbuilder
Version:
Build configuration files for beez project template.
501 lines (383 loc) • 14 kB
JavaScript
/**
* @fileOverview beez confbuilder
* @name index.js<beez-confbuilder>
* @author fkei <kei.topaz@gmail.com>
* @license MIT
*/
var fs = require('fs');
var colors = require('colors');
var _ = require('underscore');
var beezlib = require('beezlib');
var BeezConfBuilder = function () {
this.logger = beezlib.logger;
this.VERSION = '0.2.6';
this.encode = 'utf8';
};
/**
* The all(build/env/key) configuration files for beez
*
* @param {String} srcdir templete directory root path
* @param {String} env environment name example) 'local'
* @param {Object} options example) {indent : ' '}
*
* @return {Object} build data { build: {env: String}, "env": { env: String}, key: { env: Object} }
*/
BeezConfBuilder.prototype.build = function (srcdir, env, options) {
var ret = {
build: null,
env: null,
key: null
};
ret.build = this.buildrjs(srcdir, env, options);
ret.env = this.buildenv(srcdir, env, options);
ret.key = this.buildkey(srcdir, env, options);
return ret;
};
/**
* The all(build/env/key) configuration files for beez
*
* @param {Object} data write data example) { build: Object, "env": Object, key: { env: Object} }
* @param {String} dstdir output directory root path
* @param {Object} options fs.writeFileSync() options
*
* @return {Object} written files path { build: Array, "env": Array, key: { env: Array} }
*/
BeezConfBuilder.prototype.deploy = function (data, dstdirs, options) {
var ret = {
build: null,
env: null,
key: null
};
ret.build = this.deployrjs(data.build, dstdirs.build, options);
ret.env = this.deployenv(data.env, dstdirs.env, options);
ret.key = this.deploykey(data.key, dstdirs.key, options);
return ret;
};
/**
* The build BUILD configuration files for r.js(beez).
*
* @param {String} srcdir templete directory root path
* @param {String} env environment name example) 'local'
* @param {Object} options example) {indent : ' '}
*
* @return {Object} build data { env: String }
*/
BeezConfBuilder.prototype.buildrjs = function (srcdir, env, options) {
options = options || {};
var build_t = srcdir + '/build/build.template';
var build_js = srcdir + '/build/build.js';
// build check!!
if (!beezlib.fsys.isFileSync(build_js)) {
beezlib.logger.error('BUILD js file does not exist. path:', build_js);
return null;
}
if (!beezlib.fsys.isFileSync(build_t)) {
beezlib.logger.error('BUILD template file does not exist. path:', build_t);
return null;
}
var json_t = beezlib.fsys.readFileFnJSONSync(build_js);
if (!(json_t.environment && json_t.environment[env])) {
beezlib.logger.info('Skip because there is no overwriting data. build.[env].js env:', env);
return null;
}
var json = beezlib.obj.copy(json_t.environment[env], json_t.template);
// convert modules Object to Array
var modules = [];
_.each((json.modules || {}), function(m) {
modules.push(m);
});
json.modules = modules;
var template = fs.readFileSync(build_t, { encoding: this.encode });
var ret = {};
ret[env] = this.compile(json, template, options);
//beezlib.logger.debug(ret);
return ret;
};
/**
* The build ENV configuration files for beez
*
* @param {String} srcdir templete directory root path
* @param {String} env environment name example) 'local'
* @param {Object} options example) {indent : ' '}
*
* @return {Object} build data { env: String }
*/
BeezConfBuilder.prototype.buildenv = function (srcdir, env, options) {
options = options || {};
var env_t = srcdir + '/env/env.template';
var env_js = srcdir + '/env/env.js';
// env check!!
if (!beezlib.fsys.isFileSync(env_js)) {
beezlib.logger.error('ENV js file does not exist. path:', env_js);
return null;
}
if (!beezlib.fsys.isFileSync(env_t)) {
beezlib.logger.error('ENV template file does not exist. path:', env_t);
return null;
}
var json_t = beezlib.fsys.readFileFnJSONSync(env_js);
if (!(json_t.environment && json_t.environment[env])) {
beezlib.logger.info('Skip because there is no overwriting data. [env].js env:', env);
return null;
}
var json = beezlib.obj.copy(json_t.environment[env], json_t.template);
var template = fs.readFileSync(env_t, { encoding: this.encode });
var ret = {};
ret[env] = this.compile(json, template, options);
//beezlib.logger.debug(ret);
return ret;
};
/**
* The build KEY configuration files for beez
*
* @param {String} srcdir templete directory root path
* @param {String} env environment name example) 'local'
* @param {Object} options example) {indent : ' '}
*
* @return {Object} build data { env: {key: String} }
*/
BeezConfBuilder.prototype.buildkey = function (srcdir, env, options) {
options = options || {};
var key_t = srcdir + '/key/key.template';
var key_js = srcdir + '/key/key.js';
// key check!!
if (!beezlib.fsys.isFileSync(key_js)) {
beezlib.logger.error('KEY js file does not exist. path:', key_js);
return null;
}
if (!beezlib.fsys.isFileSync(key_t)) {
beezlib.logger.error('KEY template file does not exist. path:', key_t);
return null;
}
var json_t = beezlib.fsys.readFileFnJSONSync(key_js);
if (!(json_t.environment && json_t.environment[env])) {
beezlib.logger.info('Skip because there is no overwriting data. [key].js env:', env);
return null;
}
var template = fs.readFileSync(key_t, { encoding: this.encode });
var ret_d = {};
_.each(json_t.environment[env], function (data, key) {
var json = beezlib.obj.copy(json_t.environment[env][key], json_t.template);
var json_key = {};
json_key[key] = json;
var ret_s = this.compile(json_key, template, options);
beezlib.logger.debug('build [key].js key:', key);
//beezlib.logger.debug(ret_s);
ret_d[key] = ret_s;
}, this);
var ret = {};
ret[env] = ret_d;
//beezlib.logger.debug(ret);
return ret;
};
/**
* The deploy BUILD configuration files for r.js(beez)
*
* @param {Object} data write data example) { env: String }
* @param {String} dstdir output directory root path
* @param {Object} options fs.writeFileSync() options
*
* @return {Array} written files path
*/
BeezConfBuilder.prototype.deployrjs = function (data, dstdir, options) {
options = options || {};
var ret = [];
if (!beezlib.fsys.isDirectorySync(dstdir)) {
beezlib.logger.error('BUILD dstdir dose not exist. path:', dstdir);
return ret;
}
_.each(data, function (json, env) {
var key_dstpath = dstdir + '/build.' + env + '.js';
if (this.writeFileSync(key_dstpath, json, options)) {
ret.push(key_dstpath);
}
}, this);
beezlib.logger.debug('Update BUILD file. paths:', ret);
return ret;
};
/**
* The deploy ENV configuration files for beez
*
* @param {Object} data write data example) { env: String }
* @param {String} dstdir output directory root path
* @param {Object} options fs.writeFileSync() options
*
* @return {Array} written files path
*/
BeezConfBuilder.prototype.deployenv = function (data, dstdir, options) {
options = options || {};
var ret = [];
if (!beezlib.fsys.isDirectorySync(dstdir)) {
beezlib.logger.error('ENV dstdir dose not exist. path:', dstdir);
return ret;
}
_.each(data, function (json, env) {
var key_dstpath = dstdir + '/' + env + '.js';
if (this.writeFileSync(key_dstpath, json, options)) {
ret.push(key_dstpath);
}
}, this);
beezlib.logger.debug('Update ENV file. paths:', ret);
return ret;
};
/**
* The deploy KEY configuration files for beez
*
* @param {Object} data write data example) { env: Object }
* @param {String} dstdir output directory root path
* @param {Object} options fs.writeFileSync() options
*
* @return {Array} written files path
*/
BeezConfBuilder.prototype.deploykey = function (data, dstdir, options) {
options = options || {};
var ret = [];
if (!beezlib.fsys.isDirectorySync(dstdir)) {
beezlib.logger.error('ENV(KEY) dstdir dose not exist. path:', dstdir);
return ret;
}
_.each(data, function (json_env, env) {
var env_dstdir = dstdir + '/' + env;
if (!beezlib.fsys.isDirectorySync(env_dstdir)) {
//beezlib.logger.error('KEY dstdir dose not exist. path:', env_dstdir);
beezlib.fsys.mkdirpSync(env_dstdir);
beezlib.logger.info('Created KEY dstdir directory. path:', env_dstdir);
}
_.each(json_env, function (json, key) {
var key_dstpath = env_dstdir + '/' + key + '.js';
if (this.writeFileSync(key_dstpath, json, options)) {
ret.push(key_dstpath);
}
}, this);
}, this);
beezlib.logger.debug('Update KEY file. paths:', ret);
return ret;
};
/**
* wrap fs.writeFileSync()
*
* @param {String} filePath fs.writeFileSync() file path
* @param {String} data fs.writeFileSync() write data
* @param {Object} options fs.writeFileSync() options
*
* @return {Boolean} ok=true or ng=false
*/
BeezConfBuilder.prototype.writeFileSync = function (filePath, data, options) {
try {
fs.writeFileSync(filePath, data, options);
return true;
} catch (e) {
beezlib.logger.error(e.stack);
return false;
}
};
/**
* Compile template file.
*
* @param {Object} data
* @param {String} template underscore.template text data
* @param {Object} options
* @return {String} Text data
*/
BeezConfBuilder.prototype.compile = function (data, template, options) {
options = options || {};
var indent = options.indent || ' ';
var compiled = _.template(template);
return compiled({
data: JSON.stringify(data, null, indent)
});
};
/**
* Command-line: build and deploy
*/
BeezConfBuilder.prototype.commander = function () {
var commander = require('commander');
commander
.option('-s --srcdir <srcdir>', 'Source directory root path.')
.option('-p --pjdir <pjdir>', 'Directory path of output Beez Project.')
.option('-d --pjconfname <pjconfname>', 'Setting directory name for Beez Project. default) conf')
.option('-e --env <env>', 'Environment name. default) "local"')
.option('-i --indent <indent>', 'Output json file indent. default) space 4')
.option('-l --loglevel <loglevel>', 'Log level. default) INFO\n\tDEBUG: 1\n\tINFO: 2\n\tWARN: 3\n\tERROR: 4\n\tFATAL: 5', parseInt)
.option('--encoding <encoding>', 'Write file encoding. default) "utf8"')
.option('--no_mkdirp', 'If destination directory is not exist, stop to create new one.')
.parse(process.argv)
;
var options = {
srcdir: commander.srcdir,
pjdir: commander.pjdir,
pjconfname: commander.pjconfname || 'conf',
env: commander.env || 'local',
indent: commander.indent || ' ',
loglevel: commander.loglevel || this.logger.LEVELS.INFO,
encoding: commander.encoding || 'utf8',
nomkdirp: commander.no_mkdirp
};
return this.runner(options);
};
/**
* Command-line: build and deploy
*/
BeezConfBuilder.prototype.runner = function (options) {
this.logger.level = options.loglevel;
beezlib.logger.debug('srcdir:', options.srcdir);
beezlib.logger.debug('pjdir:', options.pjdir);
beezlib.logger.debug('env:', options.env);
beezlib.logger.debug('indent:', options.indent);
beezlib.logger.debug('Log level:', options.loglevel);
beezlib.logger.debug('encoding:', options.encoding);
beezlib.logger.debug('nomkdirp:', options.nomkdirp);
colors.setTheme(beezlib.constant.LOGGER_COLOR_THEME);
this.logger.colors = true;
// check src
if (!options.srcdir) {
beezlib.logger.error('-s --srcdir option is required.');
return 2;
}
if (!beezlib.fsys.isDirectorySync(options.srcdir)) {
beezlib.logger.error('Path of -s,--srcdir does not exist. srcdir:', options.srcdir);
return 2;
}
// mkdirp
if (!options.nomkdirp) {
beezlib.fsys.mkdirpSync(options.pjdir);
beezlib.logger.info('create a new directory. pjdir:', options.pjdir);
}
// check pj
if (!options.pjdir) {
beezlib.logger.error('-p --pjdir option is required.');
return 2;
}
if (!beezlib.fsys.isDirectorySync(options.pjdir)) {
beezlib.logger.error('Path of -p,--pjdir does not exist. pjdir:', options.pjdir);
return 2;
}
// build!!
var json = this.build(options.srcdir, options.env, {
indent: options.indent
});
if (json.build === null || json.env === null || json.key === null) {
beezlib.logger.error('conf files build error.', JSON.stringify(json, null, options.indent));
return 1;
}
var dstdirs = {};
dstdirs.build = options.pjdir;
dstdirs.env = options.pjdir + '/' + options.pjconfname;
dstdirs.key = options.pjdir + '/' + options.pjconfname;
if (!options.nomkdirp) {
beezlib.fsys.mkdirpSync(dstdirs.env);
beezlib.logger.info('create a new directory. envdir:', dstdirs.env);
beezlib.fsys.mkdirpSync(dstdirs.key);
beezlib.logger.info('create a new directory. keydir:', dstdirs.key);
}
var list = this.deploy(json, dstdirs, {
encoding: options.encoding
});
if (list.build.length === 1 && list.env.length === 1 && 0 < list.key.length) {
beezlib.logger.info('Success!! output:', options.pjdir);
return 0;
}
beezlib.logger.error('Error is not assumed that occur.', JSON.stringify(list, null, options.indent));
return 1;
};
module.exports = new BeezConfBuilder();