From 57c350e718dca253543d61cb8a12b4b7b5cb3bf8 Mon Sep 17 00:00:00 2001 From: darlanmendonca Date: Mon, 14 Mar 2016 12:52:52 -0300 Subject: [PATCH] write module with es6 --- .babelrc | 3 ++ app/index.js | 6 +-- app/parser.es5.js | 87 ++++++++++++++++++++++++++++++++++++ app/parser.js | 83 ++++++++++++++++++++-------------- package.json | 10 ++++- scripts/test | 4 +- scripts/transpile | 6 +++ test/unit/parser.spec.es5.js | 81 +++++++++++++++++++++++++++++++++ test/unit/parser.spec.js | 15 ++++--- 9 files changed, 249 insertions(+), 46 deletions(-) create mode 100644 .babelrc create mode 100644 app/parser.es5.js create mode 100755 scripts/transpile create mode 100644 test/unit/parser.spec.es5.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c13c5f6 --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["es2015"] +} diff --git a/app/index.js b/app/index.js index c3f22d5..78c7181 100644 --- a/app/index.js +++ b/app/index.js @@ -1,10 +1,10 @@ 'use strict'; +module.exports = parser(); + function parser() { var args = process.argv.slice(2); - args = require('./parser')(args); + args = require('./parser.es5.js')(args); return args; } - -module.exports = parser(); diff --git a/app/parser.es5.js b/app/parser.es5.js new file mode 100644 index 0000000..637286a --- /dev/null +++ b/app/parser.es5.js @@ -0,0 +1,87 @@ +'use strict'; + +module.exports = parser; + +function typeCast(value) { + var isNumber = value !== true && !isNaN(value); + var isFalse = value === 'false'; + var isTrue = value === 'true'; + + // to number + value = isNumber ? Number(value) : value; + + // to boolean + value = isFalse ? false : isTrue ? true : value; + + return value; +}; + +function setArgs(args) { + // if unit test, receive a args in string + // then parsed this to generate a array like a process.argv + if (typeof args === 'string') { + args = args.split(' '); + args.forEach(removeQuotes); + } + + return args; + + function removeQuotes(value, index) { + var arg = value.replace(/(\"|\')/g, ''); + args[index] = arg; + } +}; + +function parser(args) { + var object = {}; + var regs = { + flag: /--(.+)/, + flaghWithEqual: /--(.+)=(.+)/, + shortFlag: /-(.+)/ + }; + + args = setArgs(args); + args.forEach(parse); + + return object; + + function parse(arg, index, array) { + var key = void 0; + var value = true; + + var isLongFlagWithEqual = regs.flaghWithEqual.test(arg); + var isLongFlag = regs.flag.test(arg); + var isShortFlag = regs.shortFlag.test(arg); + var isValue = regs.flag.test(array[index - 1]); + + if (isLongFlagWithEqual) { + var explode = arg.match(regs.flaghWithEqual); + key = explode[1]; + value = explode[2]; + } else if (isLongFlag) { + key = arg.replace(regs.flag, '$1'); + } else if (isShortFlag) { + key = arg.replace(regs.shortFlag, '$1').split(''); + } else if (isValue) { + key = array[index - 1].replace(regs.flag, '$1'); + value = arg; + } + + value = typeCast(value); + + if (key) { + // if has array (short flags) + if (Array.isArray(key)) { + var applyValue = function applyValue(key) { + object[key] = value; + }; + + key.forEach(applyValue); + } + // if has flag or value of flag + else { + object[key] = value; + } + } + } +}; diff --git a/app/parser.js b/app/parser.js index 8b1af66..2774bfc 100644 --- a/app/parser.js +++ b/app/parser.js @@ -1,58 +1,75 @@ 'use strict'; -var util = require('util'); +module.exports = parser; + +function typeCast(value) { + let isNumber = value !== true && !isNaN(value); + let isFalse = value === 'false'; + let isTrue = value === 'true'; -var typeCast = function(value) { - // try cast // to number - value = value !== true && !isNaN(value) ? Number(value) : value; + value = isNumber + ? Number(value) + : value; + // to boolean - value = value === 'false' ? false : value === 'true' ? true : value; + value = isFalse + ? false : + isTrue + ? true + : value; return value; }; -var setArgs = function(args) { +function setArgs(args) { // if unit test, receive a args in string // then parsed this to generate a array like a process.argv if (typeof args === 'string') { args = args.split(' '); - args.forEach(function(value, index) { - // remove quotes - var arg = args[index].replace(/(\"|\')/g, ''); - args[index] = arg; - }); + args.forEach(removeQuotes); } + return args; -}; -module.exports = function (args) { - args = setArgs(args); + function removeQuotes(value, index) { + let arg = value.replace(/(\"|\')/g, ''); + args[index] = arg; + } +}; - var object = {}; - var regs = { +function parser(args) { + let object = {}; + let regs = { flag: /--(.+)/, flaghWithEqual: /--(.+)=(.+)/, shortFlag: /-(.+)/ }; - args.forEach(function(arg, index, array) { - var key; - var value = true; + args = setArgs(args); + args.forEach(parse); + + return object; + + function parse(arg, index, array) { + let key; + let value = true; + + let isLongFlagWithEqual = regs.flaghWithEqual.test(arg); + let isLongFlag = regs.flag.test(arg); + let isShortFlag = regs.shortFlag.test(arg); + let isValue = regs.flag.test(array[index - 1]); - if (regs.flaghWithEqual.test(arg)) { // isLongFlagWithEqual - var explode = arg.match(regs.flaghWithEqual); + if (isLongFlagWithEqual) { + let explode = arg.match(regs.flaghWithEqual); key = explode[1]; value = explode[2]; - } - else if (regs.flag.test(arg)) { // isLongFlag + } else if (isLongFlag) { key = arg.replace(regs.flag, '$1'); - } - else if (regs.shortFlag.test(arg)) { // isShortFlag + } else if (isShortFlag) { key = arg.replace(regs.shortFlag, '$1').split(''); - } - else if (regs.flag.test(array[index - 1])) { // isValue + } else if (isValue) { key = array[index - 1].replace(regs.flag, '$1'); value = arg; } @@ -61,17 +78,17 @@ module.exports = function (args) { if (key) { // if has array (short flags) - if (util.isArray(key)) { - key.forEach(function(key) { + if (Array.isArray(key)) { + key.forEach(applyValue); + + function applyValue(key) { object[key] = value; - }); + } } // if has flag or value of flag else { object[key] = value; } } - }); - - return object; + } }; diff --git a/package.json b/package.json index ec25de1..4842a85 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "Convert shell arguments passed to the npm, node, or nodemon, and convert this arguments to json", "main": "app/index.js", "scripts": { + "transpile": "scripts/transpile", + "pretest": "npm run transpile", "test": "scripts/test" }, "repository": { @@ -31,7 +33,11 @@ "istanbul": "^0.4.0", "jshint-stylish": "^2.0.1", "mocha": "^2.3.3", - "coveralls": "^2.11.4", - "istanbul": "^0.4.0" + "coveralls": "^2.11.4" + }, + "dependencies": { + "babel-cli": "^6.6.5", + "babel-core": "^6.7.2", + "babel-preset-es2015": "^6.6.0" } } diff --git a/scripts/test b/scripts/test index f476290..74ae431 100755 --- a/scripts/test +++ b/scripts/test @@ -2,8 +2,8 @@ set -e -node node_modules/.bin/istanbul cover _mocha \ -test/unit/*.js +node node_modules/.bin/istanbul cover _mocha -- --bail \ +test/unit/parser.spec.es5.js if [ ! -z "$EXPORT_COVERAGE" ]; then cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js diff --git a/scripts/transpile b/scripts/transpile new file mode 100755 index 0000000..49f0dd3 --- /dev/null +++ b/scripts/transpile @@ -0,0 +1,6 @@ +#!/bin/bash + +set -e + +babel app/parser.js --out-file app/parser.es5.js; +babel test/unit/parser.spec.js --out-file test/unit/parser.spec.es5.js; diff --git a/test/unit/parser.spec.es5.js b/test/unit/parser.spec.es5.js new file mode 100644 index 0000000..2cb9d3e --- /dev/null +++ b/test/unit/parser.spec.es5.js @@ -0,0 +1,81 @@ +/* globals describe, it */ +'use strict'; + +var expect = require('chai').expect; +var parser = require('../../app/parser.js'); + +describe('parser - unit tests', function () { + describe('short flags (-f, -abc)', shortFlags); + describe('long flags (--test, --env production)', longFlags); + + function shortFlags() { + it('parse to true values', function () { + expect(parser('node index.js -f')).to.deep.equal({ f: true }); + + expect(parser('node index.js -abc')).to.deep.equal({ + a: true, + b: true, + c: true + }); + }); + } + + function longFlags() { + it('parse to boolean values', function () { + expect(parser('node index.js --test')).to.deep.equal({ test: true }); + + expect(parser('node index.js --test true --test2')).to.deep.equal({ + test: true, + test2: true + }); + + expect(parser('node index.js --test=true --test2="true"')).to.deep.equal({ + test: true, + test2: true + }); + + expect(parser('node index.js --test=false --test2="false"')).to.deep.equal({ + test: false, + test2: false + }); + + expect(parser('node index.js --no false')).to.deep.equal({ no: false }); + }); + + it('parse to number values', function () { + expect(parser('node index.js --number 3 --n 2')).to.deep.equal({ + number: 3, + n: 2 + }); + + expect(parser('node index.js --number "3" --n "2"')).to.deep.equal({ + number: 3, + n: 2 + }); + + expect(parser('node index.js --number="3" --n=2')).to.deep.equal({ + number: 3, + n: 2 + }); + }); + + it('parse to string values', function () { + expect(parser('node index.js --test production --env sandbox')).to.deep.equal({ + test: 'production', + env: 'sandbox' + }); + + expect(parser('node index.js --test "production"')).to.deep.equal({ + test: 'production' + }); + + expect(parser('node index.js --test \'production\'')).to.deep.equal({ + test: 'production' + }); + + expect(parser('node index.js --test=production')).to.deep.equal({ + test: 'production' + }); + }); + } +}); diff --git a/test/unit/parser.spec.js b/test/unit/parser.spec.js index ded8bf9..65bbb09 100644 --- a/test/unit/parser.spec.js +++ b/test/unit/parser.spec.js @@ -1,11 +1,14 @@ /* globals describe, it */ 'use strict'; -var expect = require('chai').expect; -var parser = require('../../app/parser.js'); +let expect = require('chai').expect; +let parser = require('../../app/parser.js'); describe('parser - unit tests', function() { - describe('short flags (-f, -abc)', function() { + describe('short flags (-f, -abc)', shortFlags); + describe('long flags (--test, --env production)', longFlags); + + function shortFlags() { it('parse to true values', function () { expect(parser('node index.js -f')) .to.deep.equal({f: true}); @@ -17,9 +20,9 @@ describe('parser - unit tests', function() { c: true }); }); - }); + } - describe('long flags (--test, --env production)', function() { + function longFlags() { it('parse to boolean values', function () { expect(parser('node index.js --test')) .to.deep.equal({test: true}); @@ -88,6 +91,6 @@ describe('parser - unit tests', function() { test: 'production' }); }); - }); + } });