From ede7c3a58c93700ee30c330f9993aac1335e1a9a Mon Sep 17 00:00:00 2001 From: RazzM13 <34776591+RazzM13@users.noreply.github.com> Date: Tue, 10 Apr 2018 15:55:07 +0300 Subject: [PATCH 1/5] Updated "--help" to account for the supported commands and to be shown by default in cases where the required arguments are not provided. --- src/index.ts | 128 +++++++++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 54 deletions(-) diff --git a/src/index.ts b/src/index.ts index 50b9dbd..b4e0fb5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,57 +5,62 @@ */ import program = require('commander'); +import docsBaseImport = require('./docs'); +import validatorBaseImport = require('./validator'); + require('colors'); +const util = require('util'); let version = require('../package').version; -let firstArg: string | undefined = undefined -let secondArg: string = undefined!; function list(val: string) { return val.split(','); } -program - .version(version) - .arguments(' ') - .option('-p, --parameters ', 'List of params', list) - .option('-p, --pseudo ', 'List of pseudo overrides', list) - // https://github.com/tj/commander.js/issues/108 - // might get fixed by https://github.com/tj/commander.js/issues/691 - // as a workaround, we can actually leave this out. It defaults to true and the unparsed parameter will be ignored. -// .option('--guess-parameters', 'Guess any parameters that are not explicitely passed in and have no Default. This is the default behaviour.') - .option('-G, --no-guess-parameters', 'Fail validation if a parameter with no Default is not passed') - .option('-g, --only-guess-parameters ', 'Guess the provided parameters, and fail validation if a parameter with no Default is passed', list) - .option('-v, --verbose', 'Verbose error messages') - .action(function (arg1, arg2) { - firstArg = arg1; - secondArg = arg2; - }); - - -program.parse(process.argv); +function doNoCommand() { + console.error('\nno command given!'); + process.exit(1); +} -if (typeof firstArg === 'undefined') { - console.error('no command given!'); +function doNoArgument() { + console.error('\nmissing required argument'); process.exit(1); } -import validatorBaseImport = require('./validator'); -import docsBaseImport = require('./docs'); +program +.version(version) +.action(function() { + program.help(); + doNoCommand(); +}) +.on('--help', function(){ + doNoCommand(); +}); -if(firstArg == "validate"){ +program +.command('validate') +.option('-p, --parameters ', 'List of params', list) +.option('-p, --pseudo ', 'List of pseudo overrides', list) +.option('--guess-parameters', 'Guess any parameters that are not explicitely passed in and have no Default. This is the default behaviour.') +.option('-G, --no-guess-parameters', 'Fail validation if a parameter with no Default is not passed') +.option('-g, --only-guess-parameters ', 'Guess the provided parameters, and fail validation if a parameter with no Default is passed', list) +.option('-v, --verbose', 'Verbose error messages') +.action(function(file, cmd) { + // Patch for CommanderJS bug that defaults this to true + if (cmd.parent.rawArgs.indexOf('--guess-parameters') != -1) { + cmd.guessParameters = true; + } const validator = require('./validator') as typeof validatorBaseImport; - - if(program.parameters){ - for(let param of program.parameters){ + if(cmd.parameters){ + for(let param of cmd.parameters){ // Set the parameter let kv = param.split('='); validator.addParameterValue(kv[0], kv[1]); } } - if(program.pseudo){ - for(let pseudo of program.pseudo){ + if(cmd.pseudo){ + for(let pseudo of cmd.pseudo){ // Set the parameter let kv = pseudo.split('='); validator.addPseudoValue(kv[0], kv[1]); @@ -63,10 +68,10 @@ if(firstArg == "validate"){ } let guessParameters: string[] | undefined; - if (program.guessParameters === false) { + if (cmd.guessParameters === false) { guessParameters = []; - } else if (program.onlyGuessParameters) { - guessParameters = program.onlyGuessParameters; + } else if (cmd.onlyGuessParameters) { + guessParameters = cmd.onlyGuessParameters; } else { guessParameters = undefined; } @@ -77,24 +82,24 @@ if(firstArg == "validate"){ let result = Object(); try { - result = validator.validateFile(secondArg, options); + result = validator.validateFile(file, options); } catch(err) { - let error: string = function(msg: string, errors: any) { - for (let error of Object.keys(errors)) { - if (RegExp(error).test(msg)) { - return errors[error]; - } + let error: string = function(msg: string, errors: any) { + for (let error of Object.keys(errors)) { + if (RegExp(error).test(msg)) { + return errors[error]; + } + } + return errors['']; + }(err.message, { + 'Could not find file .*. Check the input path.': 'No such file.', + '': 'Unable to parse template! Use --verbose for more information.' + }); + console.log(error); + if (cmd.verbose) { + console.error(err); } - return errors['']; - }(err.message, { - 'Could not find file .*. Check the input path.': 'No such file.', - '': 'Unable to parse template! Use --verbose for more information.' - }); - console.log(error); - if (program.verbose) { - console.error(err); - } - process.exit(1); + process.exit(1); } // Show the errors @@ -121,13 +126,28 @@ if(firstArg == "validate"){ if(result['templateValid'] === false){ console.log('Template invalid!'.red.bold); - process.exit(1) + process.exit(1); }else{ console.log('Template valid!'.green); - process.exit(0) + process.exit(0); } +}) +.on('--help', function(){ + doNoArgument(); +}); -}else if(firstArg == "docs"){ +program +.command('docs') +.action(function(reference) { const docs = require('./docs') as typeof docsBaseImport; - console.log(docs.getDoc(secondArg)) + console.log(docs.getDoc(reference)); +}) +.on('--help', function(){ + doNoArgument(); +}); + +if (process.argv.length < 4) { + process.argv.push('--help'); } + +program.parse(process.argv); From 2a8d9b632708d71ca4aa2d99f4e285e97f3db482 Mon Sep 17 00:00:00 2001 From: RazzM13 <34776591+RazzM13@users.noreply.github.com> Date: Fri, 20 Apr 2018 21:06:21 +0300 Subject: [PATCH 2/5] Fixed coding style for "index.ts" --- src/index.ts | 220 +++++++++++++++++++++++++-------------------------- 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/src/index.ts b/src/index.ts index b4e0fb5..6d3d6ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,134 +17,134 @@ function list(val: string) { } function doNoCommand() { - console.error('\nno command given!'); + console.error('\n', 'no command given!'); process.exit(1); } function doNoArgument() { - console.error('\nmissing required argument'); + console.error('\n', 'missing required argument'); process.exit(1); } program -.version(version) -.action(function() { - program.help(); - doNoCommand(); -}) -.on('--help', function(){ - doNoCommand(); -}); + .version(version) + .action(function() { + program.help(); + doNoCommand(); + }) + .on('--help', function() { + doNoCommand(); + }); program -.command('validate') -.option('-p, --parameters ', 'List of params', list) -.option('-p, --pseudo ', 'List of pseudo overrides', list) -.option('--guess-parameters', 'Guess any parameters that are not explicitely passed in and have no Default. This is the default behaviour.') -.option('-G, --no-guess-parameters', 'Fail validation if a parameter with no Default is not passed') -.option('-g, --only-guess-parameters ', 'Guess the provided parameters, and fail validation if a parameter with no Default is passed', list) -.option('-v, --verbose', 'Verbose error messages') -.action(function(file, cmd) { - // Patch for CommanderJS bug that defaults this to true - if (cmd.parent.rawArgs.indexOf('--guess-parameters') != -1) { - cmd.guessParameters = true; - } - - const validator = require('./validator') as typeof validatorBaseImport; - if(cmd.parameters){ - for(let param of cmd.parameters){ - // Set the parameter - let kv = param.split('='); - validator.addParameterValue(kv[0], kv[1]); + .command('validate') + .option('-p, --parameters ', 'List of params', list) + .option('-p, --pseudo ', 'List of pseudo overrides', list) + .option('--guess-parameters', 'Guess any parameters that are not explicitely passed in and have no Default. This is the default behaviour.') + .option('-G, --no-guess-parameters', 'Fail validation if a parameter with no Default is not passed') + .option('-g, --only-guess-parameters ', 'Guess the provided parameters, and fail validation if a parameter with no Default is passed', list) + .option('-v, --verbose', 'Verbose error messages') + .action(function(file, cmd) { + // Patch for CommanderJS bug that defaults this to true + if (cmd.parent.rawArgs.indexOf('--guess-parameters') != -1) { + cmd.guessParameters = true; } - } - if(cmd.pseudo){ - for(let pseudo of cmd.pseudo){ - // Set the parameter - let kv = pseudo.split('='); - validator.addPseudoValue(kv[0], kv[1]); + const validator = require('./validator') as typeof validatorBaseImport; + if(cmd.parameters) { + for(let param of cmd.parameters) { + // Set the parameter + let kv = param.split('='); + validator.addParameterValue(kv[0], kv[1]); + } + } + + if(cmd.pseudo) { + for(let pseudo of cmd.pseudo) { + // Set the parameter + let kv = pseudo.split('='); + validator.addPseudoValue(kv[0], kv[1]); + } } - } - - let guessParameters: string[] | undefined; - if (cmd.guessParameters === false) { - guessParameters = []; - } else if (cmd.onlyGuessParameters) { - guessParameters = cmd.onlyGuessParameters; - } else { - guessParameters = undefined; - } - - const options = { - guessParameters - }; - - let result = Object(); - try { - result = validator.validateFile(file, options); - } catch(err) { - let error: string = function(msg: string, errors: any) { - for (let error of Object.keys(errors)) { - if (RegExp(error).test(msg)) { - return errors[error]; + + let guessParameters: string[] | undefined; + if (cmd.guessParameters === false) { + guessParameters = []; + } else if (cmd.onlyGuessParameters) { + guessParameters = cmd.onlyGuessParameters; + } else { + guessParameters = undefined; + } + + const options = { + guessParameters + }; + + let result = Object(); + try { + result = validator.validateFile(file, options); + } catch(err) { + let error: string = function(msg: string, errors: any) { + for (let error of Object.keys(errors)) { + if (RegExp(error).test(msg)) { + return errors[error]; + } } + return errors['']; + }(err.message, { + 'Could not find file .*. Check the input path.': 'No such file.', + '': 'Unable to parse template! Use --verbose for more information.' + }); + console.log(error); + if (cmd.verbose) { + console.error(err); } - return errors['']; - }(err.message, { - 'Could not find file .*. Check the input path.': 'No such file.', - '': 'Unable to parse template! Use --verbose for more information.' - }); - console.log(error); - if (cmd.verbose) { - console.error(err); + process.exit(1); + } + + // Show the errors + console.log((result['errors']['info'].length + " infos").grey); + for(let info of result['errors']['info']) { + console.log('Resource: '+ info['resource'].grey); + console.log('Message: '+ info['message'].grey); + console.log('Documentation: '+ info['documentation'].grey + '\n'); + } + + console.log((result['errors']['warn'].length + " warn").yellow); + for(let warn of result['errors']['warn']) { + console.log('Resource: ' + warn['resource'].yellow); + console.log('Message: ' + warn['message'].yellow); + console.log('Documentation: ' + warn['documentation'].yellow + '\n'); + } + + console.log((result['errors']['crit'].length + " crit").red); + for(let crit of result['errors']['crit']) { + console.log('Resource: ' + crit['resource'].red); + console.log('Message: ' + crit['message'].red); + console.log('Documentation: ' + crit['documentation'].red + '\n'); + } + + if(result['templateValid'] === false) { + console.log('Template invalid!'.red.bold); + process.exit(1); + } else { + console.log('Template valid!'.green); + process.exit(0); } - process.exit(1); - } - - // Show the errors - console.log((result['errors']['info'].length + " infos").grey); - for(let info of result['errors']['info']){ - console.log('Resource: '+ info['resource'].grey); - console.log('Message: '+ info['message'].grey); - console.log('Documentation: '+ info['documentation'].grey + '\n'); - } - - console.log((result['errors']['warn'].length + " warn").yellow); - for(let warn of result['errors']['warn']){ - console.log('Resource: ' + warn['resource'].yellow); - console.log('Message: ' + warn['message'].yellow); - console.log('Documentation: ' + warn['documentation'].yellow + '\n'); - } - - console.log((result['errors']['crit'].length + " crit").red); - for(let crit of result['errors']['crit']){ - console.log('Resource: ' + crit['resource'].red); - console.log('Message: ' + crit['message'].red); - console.log('Documentation: ' + crit['documentation'].red + '\n'); - } - - if(result['templateValid'] === false){ - console.log('Template invalid!'.red.bold); - process.exit(1); - }else{ - console.log('Template valid!'.green); - process.exit(0); - } -}) -.on('--help', function(){ - doNoArgument(); -}); + }) + .on('--help', function() { + doNoArgument(); + }); program -.command('docs') -.action(function(reference) { - const docs = require('./docs') as typeof docsBaseImport; - console.log(docs.getDoc(reference)); -}) -.on('--help', function(){ - doNoArgument(); -}); + .command('docs') + .action(function(reference) { + const docs = require('./docs') as typeof docsBaseImport; + console.log(docs.getDoc(reference)); + }) + .on('--help', function() { + doNoArgument(); + }); if (process.argv.length < 4) { process.argv.push('--help'); From 1be8b9fac9e78b6d731b34cbd091f86aa45b03de Mon Sep 17 00:00:00 2001 From: RazzM13 <34776591+RazzM13@users.noreply.github.com> Date: Sun, 22 Apr 2018 13:24:19 +0300 Subject: [PATCH 3/5] Fixed punctuation and capitalization in error messages. --- src/index.ts | 4 ++-- src/test/indexTest.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index 1f00879..e1e8cf4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -31,12 +31,12 @@ function list(val: string) { } function doNoCommand() { - console.error('\n', 'no command given!'); + console.error('\n', 'No command provided!'); process.exit(1); } function doNoArgument() { - console.error('\n', 'missing required argument'); + console.error('\n', 'Missing required argument!'); process.exit(1); } diff --git a/src/test/indexTest.ts b/src/test/indexTest.ts index 16e4faf..bedd9f4 100644 --- a/src/test/indexTest.ts +++ b/src/test/indexTest.ts @@ -13,14 +13,14 @@ describe('index', () => { it('no parameters', (done) => { exec('node lib/index.js', function(error, stdout, stderr) { - expect(stderr).to.contain('no command given!'); + expect(stderr).to.contain('No command provided!'); done(); }); }).timeout(5000);; it('missing file parameter', (done) => { exec('node lib/index.js validate', function(error, stdout, stderr) { - expect(stderr).to.contain('missing required argument'); + expect(stderr).to.contain('Missing required argument!'); done(); }); }).timeout(5000);; From b8ec9c37a380cdbc670de3285039fcd2d52936ae Mon Sep 17 00:00:00 2001 From: RazzM13 <34776591+RazzM13@users.noreply.github.com> Date: Sun, 22 Apr 2018 13:59:13 +0300 Subject: [PATCH 4/5] Fixed usage text for both commands. --- src/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.ts b/src/index.ts index e1e8cf4..253a239 100644 --- a/src/index.ts +++ b/src/index.ts @@ -52,6 +52,7 @@ program program .command('validate') + .usage(' [options]') .option('-p, --parameters ', 'List of params', list) .option('-p, --pseudo ', 'List of pseudo overrides', list) .option('--guess-parameters', 'Guess any parameters that are not explicitely passed in and have no Default. This is the default behaviour.') @@ -152,6 +153,7 @@ program program .command('docs') + .usage(' [options]') .action(function(reference) { const docs = require('./docs') as typeof docsBaseImport; console.log(docs.getDoc(reference)); From 51957b5749309fbf3d01f27a0385767bfbae25e7 Mon Sep 17 00:00:00 2001 From: Marty Sweet Date: Mon, 23 Apr 2018 09:04:43 +0100 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81037f0..2852db7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ Versioning](http://semver.org/spec/v2.0.0.html). - Merge PR #135, fixing parts.join exception when !Join was called on non-array - Merge PR #141, allowing lists of values to be specified on the command line +### Changed +- Merge PR #136, updated usage prompt for a better CLI experience + ## [1.6.0] - 2018-04-05 ### Fixed - Merge PR #120, fixing dependency issue with "@types/colors"