indigojs
Version:
IndigoJS is an open source, JavaScript/NodeJS localization framework
150 lines (124 loc) • 5.85 kB
JavaScript
;
var stdio = require('stdio'),
fs = require('fs'),
path = require('path'),
exec = require('child_process').exec,
pkg = require('../../package.json');
(function() {
if (process.argv.slice(2).indexOf('-v') !== -1) {
console.log(pkg.name + ' ' + pkg.version);
return;
}
var defaultPort = 8125,
ops = stdio.getopt({
'version': {key: 'v', description: 'display indigojs version'},
'name': {key: 'n', args: 1, mandatory: true, description: 'application name'},
'template': {key: 't', args: 1, description: 'application template "spa" (Single-Page Application) or "fpa" (IFrame-Page Application) (default is "fpa")'},
'dir': {key: 'd', args: 1, description: 'path to the webroot directory (defaults /web)'},
'static': {key: 's', args: 1, description: 'name of static directory under webroot (defaults /static)'},
'component': {key: 'x', args: 1, description: 'base path which loads component resource files (defaults /component)'},
'port': {key: 'p', args: 1, description: 'server port number (defaults ' + defaultPort + ')'},
'uri': {key: 'u', args: 1, description: 'default routing path/uri (defaults /%APPNAME%)'},
'routers': {key: 'r', args: 1, description: 'path to the routers files (defaults /routers)'},
'controllers': {key: 'c', args: 1, description: 'path to the controllers directory (defaults /controllers)'},
'locales': {key: 'l', args: 1, description: 'path to the localization files directory (defaults /locales)'},
'env': {key: 'e', args: 1, description: 'software environment (dev/prod)'}
});
var dir = '.',
webdir = getDir(ops.dir || 'web'),
staticDir = getDir(ops.static || 'static'),
compDir = getDir(ops.component || 'component'),
localesDir = getDir(ops.locales || 'locales'),
routersDir = getDir(ops.routers || 'routers'),
controllersDir = getDir(ops.controllers || 'controllers'),
lines = fs.readFileSync(__dirname + '/package.json', 'utf-8').
replace(/{{name}}/g, ops.name).
replace(/{{version}}/g, pkg.version);
createFile(dir, '/package.json', lines);
lines = fs.readFileSync(__dirname + '/index.js', 'utf-8');
createFile(dir, '/index.js', lines);
lines = fs.readFileSync(__dirname + '/index.js', 'utf-8');
createFile(dir, '/index.js', lines);
lines = fs.readFileSync(__dirname + '/.jshintrc', 'utf-8');
createFile(dir, '/.jshintrc', lines);
lines = fs.readFileSync(__dirname + '/gitignore', 'utf-8').replace(/{{webdir}}/g, webdir);
createFile(dir, '/.gitignore', lines);
lines = fs.readFileSync(__dirname + '/.jshintignore', 'utf-8').replace(/{{webdir}}/g, webdir);
createFile(dir, '/.jshintignore', lines);
lines = fs.readFileSync(__dirname + '/.bowerrc', 'utf-8').replace(/{{webdir}}/g, webdir);
createFile(dir, '/.bowerrc', lines);
lines = fs.readFileSync(__dirname + '/constant.less', 'utf-8').replace(/{{static}}/g, staticDir);
createFile(webdir + '/default/less', '/constant.less', lines);
lines = fs.readFileSync(__dirname + '/Gruntfile.js', 'utf-8').replace(/{{webdir}}/g, webdir);
createFile(dir, '/Gruntfile.js', lines);
lines = fs.readFileSync(__dirname + '/app.json', 'utf-8').
replace(/{{env}}/g, ops.env || 'dev').
replace(/{{port}}/g, ops.port || defaultPort).
replace(/{{webdir}}/g, webdir).
replace(/{{app_template}}/g, ops.template === 'spa' ? ops.template : 'fpa').
replace(/{{static}}/g, staticDir).
replace(/{{component}}/g, compDir).
replace(/{{locales}}/g, localesDir).
replace(/{{routers}}/g, routersDir);
createFile('/config', '/app.json', lines);
lines = fs.readFileSync(__dirname + '/locales.json', 'utf-8');
createFile('/config', '/locales.json', lines);
lines = fs.readFileSync(__dirname + '/en_locales.json', 'utf-8').
replace(/{{name}}/g, ops.name).
replace(/{{year}}/g, new Date().getFullYear());
createFile(localesDir + '/en', '/common.json', lines);
lines = fs.readFileSync(__dirname + '/static.js', 'utf-8');
createFile(routersDir, '/static.js', lines);
lines = fs.readFileSync(__dirname + '/router.js', 'utf-8').
replace(/{{uri}}/g, ops.uri || '/' + ops.name).
replace(/{{routers}}/g, routersDir).
replace(/{{controllers}}/g, controllersDir);
createFile(routersDir, '/router.js', lines);
lines = fs.readFileSync(__dirname + '/controller.js', 'utf-8');
createFile(controllersDir, '/controller.js', lines);
copySync(__dirname + '/web', '.' + webdir);
console.log('\Installing bower libraries...');
exec('bower install indigojs', function(error, stdout, stderr) {
if (error) {
return console.error(stderr);
}
console.log(stdout);
console.log('\nThank you for using IndigoJS!');
console.log('\nPlease run commands:');
console.log('npm install --production');
console.log('npm start');
console.log('\nURL: http://localhost:%s%s/index', ops.port || defaultPort, ops.uri || '/' + ops.name);
});
})();
function createFile(dir, file, lines) {
if (dir.charAt(0) === '/') {
dir = '.' + dir;
}
console.log('creating %s%s', dir, file);
mkdir(dir);
fs.writeFileSync(dir + file, lines);
}
function getDir(dir) {
return dir.substr(0, 1) === '/' ? dir : '/' + dir;
}
function copySync(src, dest) {
if (fs.existsSync(src)) {
if (fs.statSync(src).isDirectory()) {
mkdir(dest);
fs.readdirSync(src).forEach(function(file) {
copySync(path.join(src, file), path.join(dest, file));
});
} else {
fs.createReadStream(src).pipe(fs.createWriteStream(dest));
}
}
}
function mkdir(dir) {
dir.split('/').forEach((dir, index, splits) => {
const parent = splits.slice(0, index).join('/'),
dirPath = path.resolve(parent, dir);
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath);
}
});
}