UNPKG

jmms

Version:

Jmms cli tools, Jmms is a java meta-micro-service framework

228 lines (191 loc) 6.1 kB
const meow = require('meow'); const chalk = require('chalk'); const log = require('../generators/log'); const yeoman = require('yeoman-environment'); const table = require('text-table'); const metas = require('../generators/metas'); const pkg = require('../package.json'); const fs = require('fs'); const env = yeoman.createEnv(); const binName = Object.keys(pkg.bin)[0]; const init = () => { Object.keys(metas).forEach((generator) => { const meta = metas[generator]; meta.generator = generator; if(!meta.path) { meta.path = generator; } //set all option's name if(meta.opts) { Object.keys(meta.opts).forEach(key=>{ meta.opts[key].name = key; }); } if(meta.childs && Object.keys(meta.childs).length > 0) { //register self. if(meta.self) { env.register(require.resolve(`../generators/${meta.path}`), `${binName}:${meta.generator}`); } //register sub generators Object.keys(meta.childs).forEach((subGenerator) => { const child = meta.childs[subGenerator]; child.generator = subGenerator; if(!child.path) { child.path = child.generator; } //set option's name if(child.opts) { Object.keys(child.opts).forEach(key=>{ child.opts[key].name = key; }); } //register sub generator const path = require.resolve(`../generators/${meta.path}/${child.path}`) env.register(path,`${binName}:${meta.generator}:${child.generator}`); }); //register parent generator is exists. if(fs.existsSync('../generators/' + meta.generator + '/index.js')) { env.register(require.resolve(`../generators/${meta.path}`), `${binName}:${meta.generator}`); } }else { //register generator env.register(require.resolve(`../generators/${meta.path}`), `${binName}:${meta.generator}`); } }); return this; } const printSubCommandsAndExit = (command, childs) => { const rows = []; Object.keys(childs).forEach(key => { const child = childs[key]; rows.push([ '', '', command + ' ' + child.generator, '- ' + child.desc ]) }); log.info('\n Sub Commands:\n') log.info(table(rows) + '\n'); process.exit(0); } /** Run the generator command */ const run = (meta, help) => { const argv = process.argv.slice(3); const info = meow({help:false, pkg, argv}); var args = info.input; var opts = info.flags; var generator; if(meta.childs && Object.keys(meta.childs).length > 0) { if(args.length == 0) { if(meta.self) { generator = meta.generator; }else { if(!help) { log.error(`Missing sub command of ${chalk.yellow(meta.generator)}`); } printSubCommandsAndExit(meta.generator, meta.childs); } }else { const subGenerator = args[0]; const child = meta.childs[subGenerator]; if(!child) { log.error(`${chalk.yellow(subGenerator)} is not a known sub command of ${chalk.yellow(meta.generator)}`); printSubCommandsAndExit(meta.generator, meta.childs); } generator = meta.generator + ':' + child.generator; meta = child; args = args.slice(1); } }else { generator = meta.generator; } const yoCommand = binName + ':' + generator; const cliCommand = yoCommand.replace(new RegExp(':', 'g'), ' '); if(help) { opts.help = true; } opts.meta = meta; opts.args = args; opts.generator = generator; opts.cliCommand = cliCommand; if(opts.args.length > 0) { env.run(`${yoCommand} ${opts.args.join(' ')}`, opts); }else { env.run(`${yoCommand}`, opts); } } /* Converts the yo generator to commander's command name */ const toCommandName = (generator, meta) => { var cmd = generator; /* if(meta.arg) { var required = meta.arg.required == true; if(required) { cmd = cmd + ' <' + meta.arg.name + '>'; }else{ cmd = cmd + ' [' + meta.arg.name + ']'; } } */ //cmd = cmd + ' [options]'; return cmd; } /** * Converts the yo option to commander's option flags. * * Examples: * .option('-C, --chdir <path>', 'change the working directory') * .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf') * .option('-T, --no-tests', 'ignore test hook') */ const toCommandOptionFlags = (opt) => { var s = ''; if(opt.alias) { s += `-${opt.alias}, `; }else { s += ' , '; } s += `--${opt.name}`; return s; } /** * Converts the yo option's desc to commander option's desc . */ const toCommandOptionDesc = (opt) => { var s = ''; if(opt.desc) { s += opt.desc; if(opt.type) { s += ', type {' + opt.type + '}'; } if(opt.defaults) { s += ', defaults ' + opt.defaults; } } return s; } /* Converts the commander's args to yo's generator options const toGeneratorOptions = (meta, args, argv) => { var options = meow({help:false, pkg, argv}).flags const arg = meta.arg; if(arg) { if(args) { options[arg.name] = args; }else if(arg.defaults) { options[arg.name] = arg.defaults; } } options.meta = meta; return options; } */ module.exports = { init, metas, toCommandName, toCommandOptionFlags, toCommandOptionDesc, //toGeneratorOptions, run }