UNPKG

vikings-cli

Version:

Vikings services project generator

185 lines (139 loc) 5.41 kB
#!/usr/bin/env node 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 }