refactor new cli mechanism

feature/linter
Niclas Thobaben 2021-07-07 18:21:01 +02:00
parent f2f26ffbf6
commit 641c1a95de
5 changed files with 82 additions and 18 deletions

View File

@ -76,11 +76,13 @@ function generateTemplate(config) {
fs.writeFileSync(config.output, output);
}
module.exports = function(args) {
function run(args) {
if(args.silent) {
return doSilentGeneration(args);
}
return doInteractiveGeneration(args);
}
module.exports = {
run
}

View File

@ -1,6 +1,22 @@
module.exports = function(args) {
function printVersion(verbose) {
let { version, description, name } = require('../../package.json');
let output = verbose ? { name, description, version } : { version }
console.log(output);
return output
}
let { name, description, version } = require('../package.json');
console.log({ name, description, version });
function run(args) {
return printVersion(args.v || args.verbose)
}
module.exports = {
name: 'version',
description: 'Output the current version of apicli.',
run,
usage: {
options: {
'-v, --verbose': 'verbose output. Includes name and description.',
}
}
}

View File

@ -2,23 +2,22 @@
const path = require('path');
const fs = require('fs');
const loader = require('./loader')
let required_command = process.argv[2]
let args = require('args-parser')(process.argv);
let commands = loader.load()
let command = commands[required_command]
let cmds = fs.readdirSync(path.join(__dirname, 'cmd'))
.filter(file => file.startsWith("cmd"))
.reduce((result, item) => {
let name = item.replace(/^cmd\./, '').replace(/\.js$/, '');
result[name] = path.join(__dirname, 'cmd', item);
return result
}, {})
if(!cmds[required_command]) {
if(!command) {
console.error(`Command '${required_command}' not found!`);
console.log("Available commands:")
Object.keys(cmds).forEach(item => console.log(`\t${item}`))
process.exit(-1);
command = commands.help
}
require(cmds[required_command])(args);
try {
command.run(args)
}catch(err) {
console.error(err)
printCommandUsage(command)
}

39
src/loader.js 100644
View File

@ -0,0 +1,39 @@
const fs = require('fs')
const path = require('path')
function printCommandUsage(command) {
console.log(`- <${command.name}> ${command.description || ''}`)
if(command.usage && command.usage.options) {
Object.entries(command.usage.options)
.forEach(entry => console.log(`\t ${entry[0]} | ${entry[1]}`))
}
}
function printCompleteUsage(commands) {
Object.values(commands).forEach(printCommandUsage)
}
function load() {
let commands = fs.readdirSync(path.join(__dirname, 'cmd'))
.filter(file => file.startsWith("cmd"))
.reduce((result, item) => {
let name = item.replace(/^cmd\./, '').replace(/\.js$/, '');
let command_path = path.join(__dirname, 'cmd', item);
let command = require(command_path)
command.name = result.name || name
command.printUsage = () => printCommandUsage(command)
result[name] = command
return result
}, {})
commands.help = { name: 'help', run: () => printCompleteUsage(commands) }
commands['?'] = { name: '?', run: () => printCompleteUsage(commands) }
return commands
}
module.exports.load = load

View File

@ -0,0 +1,8 @@
const assert = require('assert').strict
describe("version command", () => {
it('should return only the version if not in verbose mode', () => {
expect()
})
})