From 641c1a95de9099e1e6cb1fa08f69c2950ef93aa6 Mon Sep 17 00:00:00 2001 From: Niclas Thobaben Date: Wed, 7 Jul 2021 18:21:01 +0200 Subject: [PATCH] refactor new cli mechanism --- src/cmd/cmd.generate.js | 6 ++++-- src/cmd/cmd.version.js | 22 +++++++++++++++++++--- src/index.js | 25 ++++++++++++------------- src/loader.js | 39 +++++++++++++++++++++++++++++++++++++++ tests/cmd.version.test.js | 8 ++++++++ 5 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 src/loader.js create mode 100644 tests/cmd.version.test.js diff --git a/src/cmd/cmd.generate.js b/src/cmd/cmd.generate.js index a99b8ac..ece207e 100644 --- a/src/cmd/cmd.generate.js +++ b/src/cmd/cmd.generate.js @@ -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 } \ No newline at end of file diff --git a/src/cmd/cmd.version.js b/src/cmd/cmd.version.js index 6cfa296..75da9b0 100644 --- a/src/cmd/cmd.version.js +++ b/src/cmd/cmd.version.js @@ -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.', + } + } } \ No newline at end of file diff --git a/src/index.js b/src/index.js index 4a4c1ae..fe1e4ea 100644 --- a/src/index.js +++ b/src/index.js @@ -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); \ No newline at end of file + +try { + command.run(args) +}catch(err) { + console.error(err) + printCommandUsage(command) +} diff --git a/src/loader.js b/src/loader.js new file mode 100644 index 0000000..da7ebcb --- /dev/null +++ b/src/loader.js @@ -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 \ No newline at end of file diff --git a/tests/cmd.version.test.js b/tests/cmd.version.test.js new file mode 100644 index 0000000..001b616 --- /dev/null +++ b/tests/cmd.version.test.js @@ -0,0 +1,8 @@ +const assert = require('assert').strict + +describe("version command", () => { + it('should return only the version if not in verbose mode', () => { + + expect() + }) +})