vikings-cli
Version:
Vikings services project generator
185 lines (139 loc) • 5.41 kB
JavaScript
const cli = require('commander');
const chalk = require('chalk');
const fs = require('fs-extra');
const path = require('path');
const recursive = require("recursive-readdir");
const exec = require('child_process').execSync;
let version = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'), 'utf8')).version;
let templateDirectory = path.join(__dirname, 'template');
let destPath = '.';
cli
.version(version)
.option('-p, --path <path>', 'set destination directory path. defaults to ./<name>')
.option('-a, --author <author>', 'set destination directory path. defaults to ./<name>')
cli
.command('init <name>')
.description('initialize new Vikings service project')
.option("-t, --template <path>", "template path. defaults to vikings pre-defined")
.action(function(name, options) {
destPath = path.join(cli.path || destPath, name + '-service');
templateDirectory = options.template || templateDirectory;
let exists = fs.existsSync(destPath);
if (exists) {
fs.removeSync(destPath);
}
fs.copySync(templateDirectory, destPath);
recursive(destPath, (err, files) => {
// `files` is an array of absolute file paths
for (let file of files) {
if (path.basename(file).match('PROJECT_NAME')) {
fs.move(file, file.replace('PROJECT_NAME', name));
}
if (path.basename(file).match('Project_Name')) {
fs.move(file, file.replace('Project_Name', ('' + name.slice(0,1)).toUpperCase() + name.slice(1)));
}
if (!file.match('assets')) {
let content = fs.readFileSync(file, 'utf8');
let projectName = name.toLowerCase();
let ProjectName = projectName.replace(projectName.substring(0,1),
projectName.substring(0,1).toUpperCase());
content = content.replace(/\[PROJECT_NAME\]/g, ProjectName)
.replace(/\[pROJECT_NAME\]/g, projectName)
.replace(/\[AUTHOR\]/g, cli.author || 'Ignitial');
fs.writeFileSync(file, content, 'utf8');
}
}
});
console.log('done');
});
cli
.command('update <name>')
.description('updates nodeJS library for all child folders. Useful for vikings-ignition update for all services')
.option("-v, --version <version>", "lib version. Default to latest")
.action(function(name, options) {
let cwd = process.cwd();
destPath = path.join(process.cwd(), cli.path || destPath);
let exists = fs.existsSync(destPath);
if (exists) {
let folders = fs.readdirSync(destPath);
for (let folder of folders) {
let targetFolder = path.join(destPath, folder);
process.chdir(targetFolder);
console.log('call update [%s] for [%s]', name, targetFolder);
exec('npm update ' + name + ' --global-style --save')
}
} else {
console.error('destination folder missing');
}
console.log('done');
});
cli
.command('build <name1>,...,<nameN>')
.description('builds Docker containers for named services')
.action(function(services, options) {
services = services.split(',');
let cwd = process.cwd();
destPath = path.join(process.cwd(), cli.path || destPath);
console.log(destPath, services)
let exists = fs.existsSync(destPath);
if (exists) {
let folders = fs.readdirSync(destPath);
for (let folder of folders) {
let service = folder.replace('-service', '');
if (services.indexOf(service) >= 0) {
let targetFolder = path.join(destPath, folder);
process.chdir(targetFolder);
console.log('docker build . --force-rm -t ignitial/' + service + '-service')
exec('docker build . --force-rm -t ignitial/' + service + '-service');
}
}
}
console.log('done');
});
cli
.command('start <name1>,...,<nameN>')
.description('starts named services as Docker containers')
.action(function(services, options) {
services = services.split(',');
for (let service of services) {
try {
exec('docker rm -f ' + service);
} catch(err) {
console.log('container ' + service + ' does not exist');
}
let cmd = 'docker run -d --link nats:nats -e '
+ 'DATASYNC_NATS_SERVERS="[ \\\"nats://nats:4222\\\" ]" --name '
+ service + ' ignitial/' + service + '-service';
console.log(cmd);
exec(cmd);
}
console.log('done');
});
cli
.command('stop <name1>,...,<nameN>')
.description('starts named services as Docker containers')
.action(function(services, options) {
services = services.split(',');
for (let service of services) {
exec('docker stop ' + service);
}
console.log('done');
});
cli
.command('remove <name1>,...,<nameN>')
.description('removes Docker containers for selected services')
.action(function(services, options) {
services = services.split(',');
for (let service of services) {
exec('docker rm -f ' + service);
}
console.log('done');
});
if (!process.argv.slice(2).length) {
cli.outputHelp(make_red);
}
cli.parse(process.argv);
function make_red(txt) {
return chalk.red(txt); //display the help text in red on the console
}