From 22c28b2247222a3aba5e63915c500652566cf0b3 Mon Sep 17 00:00:00 2001 From: Niclas Thobaben Date: Wed, 7 Jul 2021 22:15:50 +0200 Subject: [PATCH] added linter command --- src/cmd/cmd.lint.js | 19 ++++++++++++++++++- src/linter.js | 25 ++++++++++++++++++++----- src/loader.js | 13 ++----------- src/utils.js | 9 +++++++++ 4 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 src/utils.js diff --git a/src/cmd/cmd.lint.js b/src/cmd/cmd.lint.js index 7012772..fc6eac2 100644 --- a/src/cmd/cmd.lint.js +++ b/src/cmd/cmd.lint.js @@ -1,5 +1,22 @@ +const linter = require('../linter') +const path = require('path') + module.exports = { run(args) { - + if(!args.spec) { + throw 'No spec provided!' + } + + let spec = require(path.resolve(process.cwd(), args.spec)) + let result = linter.lint(spec) + if(!result.success) { + console.error('Errors while linting!') + process.exit(-1) + } + }, + usage: { + options: { + '--spec ': "path to the api spec to lint." + } } } \ No newline at end of file diff --git a/src/linter.js b/src/linter.js index 64adcfe..29aca58 100644 --- a/src/linter.js +++ b/src/linter.js @@ -1,4 +1,5 @@ const objectPath = require('object-path'); +const utils = require('./utils') const NAME_REGEX = /^[a-z0-9_-]+$/; const DESCRIPTION_REGEX = /^[A-Z]{1}.+\.$/ @@ -28,15 +29,29 @@ function regex(regex) { return (path, input, msgs) => { input = input && input.trim() if(!input.match(regex)) { - return `Property '${path}' must only comply to pattern ${regex}! value=${input}` + return `Property '${path}' must comply to pattern ${regex}! value=${input}` } } } const linterMappings = [ - { path: 'name', linters: [ required(), length({ min: 4 }), regex(NAME_REGEX) ] }, - { path: 'description', linters: [ required(), length({ min: 4 }), regex(DESCRIPTION_REGEX) ] } + { + path: 'name', + linters: [ + { label: 'is set', validator: required() }, + { label: 'has at least 4 characters', validator: length({ min: 4 }) }, + { label: 'format is valid', validator: regex(NAME_REGEX) } + ] + }, + { + path: 'description', + linters: [ + { label: 'is set', validator: required() }, + { label: 'has at least 4 characters', validator: length({ min: 4 }) }, + { label: 'format is valid', validator: regex(DESCRIPTION_REGEX) } + ] + } ] @@ -47,13 +62,13 @@ module.exports.lint = function(spec) { linterMappings.forEach(element => { let value = objectPath.get(spec, element.path); element.linters.forEach(linter => { - let msg = linter(element.path, value) + let msg = linter.validator(element.path, value) if(msg) { results.success = false } msg = msg || 'OK' results[element.path] = msg; - console.log(element.path, msg) + console.log(utils.formatColumns(utils.formatColumns(element.path, linter.label, 12), msg)) }); }); return results; diff --git a/src/loader.js b/src/loader.js index 1fef2b6..0e29a82 100644 --- a/src/loader.js +++ b/src/loader.js @@ -1,21 +1,12 @@ const fs = require('fs') const path = require('path') +const utils = require('./utils') const default_options = { '-v': 'Verbose output level=debug.', '-vv': 'Verbose output level=trace.' } -function printColumns(left, right) { - let indent = 48 - left.length - let result = left + ' '; - for(let i = 0; i < indent; i++) { - result += '.' - } - result += ' ' + right - return result -} - function printCommandUsage(command) { if(command.name === '?' || command.name === 'help') { return @@ -23,7 +14,7 @@ function printCommandUsage(command) { console.log(`\n[${command.name}]\n${command.description || ''}`) if(command.usage && command.usage.options) { Object.entries(command.usage.options) - .forEach(entry => console.log(`\t ${printColumns(entry[0], entry[1])}`)) + .forEach(entry => console.log(`\t ${utils.formatColumns(entry[0], entry[1], 48, '.')}`)) } } diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..2c6dd92 --- /dev/null +++ b/src/utils.js @@ -0,0 +1,9 @@ +module.exports.formatColumns = (left, right, size=48, symbol=' ') => { + let indent = size - left.length + let result = left + ' '; + for(let i = 0; i < indent; i++) { + result += symbol + } + result += ' ' + right + return result +} \ No newline at end of file