Skip to content

Commit

Permalink
write module with es6
Browse files Browse the repository at this point in the history
  • Loading branch information
darlanmendonca committed Mar 14, 2016
1 parent 0dea890 commit 57c350e
Show file tree
Hide file tree
Showing 9 changed files with 249 additions and 46 deletions.
3 changes: 3 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"presets": ["es2015"]
}
6 changes: 3 additions & 3 deletions app/index.js
Original file line number Diff line number Diff line change
@@ -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();
87 changes: 87 additions & 0 deletions app/parser.es5.js
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
};
83 changes: 50 additions & 33 deletions app/parser.js
Original file line number Diff line number Diff line change
@@ -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;
}
Expand All @@ -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;
}
};
10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -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"
}
}
4 changes: 2 additions & 2 deletions scripts/test
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions scripts/transpile
Original file line number Diff line number Diff line change
@@ -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;
81 changes: 81 additions & 0 deletions test/unit/parser.spec.es5.js
Original file line number Diff line number Diff line change
@@ -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'
});
});
}
});
15 changes: 9 additions & 6 deletions test/unit/parser.spec.js
Original file line number Diff line number Diff line change
@@ -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});
Expand All @@ -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});
Expand Down Expand Up @@ -88,6 +91,6 @@ describe('parser - unit tests', function() {
test: 'production'
});
});
});
}
});

0 comments on commit 57c350e

Please sign in to comment.