Skip to content

Commit

Permalink
Now works correctly in VM contexts which override the global Boolean …
Browse files Browse the repository at this point in the history
…object, fixes #20
  • Loading branch information
75lb committed Jul 31, 2016
1 parent 7913ed3 commit 5c0402f
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 40 deletions.
14 changes: 6 additions & 8 deletions es5/definition.js
Expand Up @@ -4,6 +4,8 @@ var _createClass = function () { function defineProperties(target, props) { for

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var t = require('typical');

var OptionDefinition = function () {
function OptionDefinition(definition) {
_classCallCheck(this, OptionDefinition);
Expand Down Expand Up @@ -41,19 +43,15 @@ var OptionDefinition = function () {
}, {
key: 'isBoolean',
value: function isBoolean() {
if (!this.type) {
if (this.type) {
return this.type === Boolean || t.isFunction(this.type) && this.type.name === 'Boolean';
} else {
return false;
} else { // Fall back to ES5 Method
var result = /^function\s+([\w\$]+)\s*\(/.exec( this.type.toString() );
if (result && result.length>=2 && result[1] == "Boolean") {
return true;
}
}
return false;
}
}]);

return OptionDefinition;
}();

module.exports = OptionDefinition;
module.exports = OptionDefinition;
16 changes: 6 additions & 10 deletions lib/definition.js
@@ -1,4 +1,6 @@
'use strict'
const t = require('typical')

/**
* @module definition
*/
Expand Down Expand Up @@ -236,17 +238,11 @@ class OptionDefinition {
}

isBoolean () {
if (!this.type) {
return false;
} else if (this.type.name == "Boolean") { // First try ES6 Method
return true;
} else { // Fall back to ES5 Method
var result = /^function\s+([\w\$]+)\s*\(/.exec( this.type.toString() );
if (result && result.length>=2 && result[1] == "Boolean") {
return true;
}
if (this.type) {
return this.type === Boolean || (t.isFunction(this.type) && this.type.name === 'Boolean')
} else {
return false
}
return false;
}
}

Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -31,7 +31,7 @@
"core-assert": "~0.2.0",
"coveralls": "^2.11.12",
"jsdoc-to-markdown": "^1.3.6",
"test-runner": "~0.1.4",
"test-runner": "~0.1.6",
"test-value": "^2.0.0"
},
"dependencies": {
Expand Down
2 changes: 0 additions & 2 deletions test/default-option.js
Expand Up @@ -32,7 +32,6 @@ test('defaultOption: after a boolean', function () {
cliArgs(definitions, [ '--one', 'sfsgf' ]),
{ one: true, two: 'sfsgf' }
)

})

test('defaultOption: multiple defaultOption values between other arg/value pairs', function () {
Expand Down Expand Up @@ -71,5 +70,4 @@ test('defaultOption: floating args present but no defaultOption', function () {
cliArgs(definitions, [ 'aaa', '--one', 'aaa', 'aaa' ]),
{ one: true }
)

})
8 changes: 0 additions & 8 deletions test/exceptions.js
Expand Up @@ -29,7 +29,6 @@ test('err-invalid-definition: throws if dev set a numeric alias', function () {
} catch (err) {
a.strictEqual(err.name, 'INVALID_ALIAS')
}

})

test('err-invalid-definition: throws if dev set an alias of "-"', function () {
Expand All @@ -44,7 +43,6 @@ test('err-invalid-definition: throws if dev set an alias of "-"', function () {
} catch (err) {
a.strictEqual(err.name, 'INVALID_ALIAS')
}

})

test('err-invalid-definition: multi-character alias', function () {
Expand All @@ -59,7 +57,6 @@ test('err-invalid-definition: multi-character alias', function () {
} catch (err) {
a.strictEqual(err.name, 'INVALID_ALIAS')
}

})

test('err-invalid-definition: invalid type values', function () {
Expand Down Expand Up @@ -88,7 +85,6 @@ test('err-invalid-definition: invalid type values', function () {
a.doesNotThrow(function () {
cliArgs([ { name: 'one', type: function () {} } ], argv)
}, /invalid/i)

})

test('err-invalid-definition: value without option definition', function () {
Expand Down Expand Up @@ -128,7 +124,6 @@ test('err-invalid-definition: value without option definition', function () {
} catch (err) {
a.strictEqual(err.name, 'UNKNOWN_OPTION', 'getOpts')
}

})

test('err-invalid-definition: duplicate name', function () {
Expand All @@ -144,7 +139,6 @@ test('err-invalid-definition: duplicate name', function () {
} catch (err) {
a.strictEqual(err.name, 'DUPLICATE_NAME')
}

})

test('err-invalid-definition: duplicate alias', function () {
Expand All @@ -160,7 +154,6 @@ test('err-invalid-definition: duplicate alias', function () {
} catch (err) {
a.strictEqual(err.name, 'DUPLICATE_ALIAS')
}

})

test('err-invalid-definition: multiple defaultOption', function () {
Expand All @@ -176,5 +169,4 @@ test('err-invalid-definition: multiple defaultOption', function () {
} catch (err) {
a.strictEqual(err.name, 'DUPLICATE_DEFAULT_OPTION')
}

})
38 changes: 34 additions & 4 deletions test/type-boolean.js
Expand Up @@ -3,11 +3,11 @@ var test = require('test-runner')
var cliArgs = require('../')
var a = require('core-assert')

var optionDefinitions = [
{ name: 'one', type: Boolean }
]

test('type-boolean: different values', function () {
var optionDefinitions = [
{ name: 'one', type: Boolean }
]

a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--one' ]),
{ one: true }
Expand All @@ -25,3 +25,33 @@ test('type-boolean: different values', function () {
{ one: true }
)
})

var origBoolean = Boolean

/* test in contexts which override the standard global Boolean constructor */
test('type-boolean: global Boolean overridden', function () {
function Boolean () {
return origBoolean.apply(origBoolean, arguments)
}

var optionDefinitions = [
{ name: 'one', type: Boolean }
]

a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--one', 'true' ]),
{ one: true }
)
a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--one', 'false' ]),
{ one: true }
)
a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--one', 'sfsgf' ]),
{ one: true }
)
a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--one' ]),
{ one: true }
)
})
23 changes: 17 additions & 6 deletions test/type-other.js
Expand Up @@ -3,13 +3,13 @@ var test = require('test-runner')
var cliArgs = require('../')
var a = require('core-assert')

var optionDefinitions = [
{ name: 'file', type: function (file) {
return file
}}
]

test('type-other: different values', function () {
var optionDefinitions = [
{ name: 'file', type: function (file) {
return file
}}
]

a.deepStrictEqual(
cliArgs(optionDefinitions, [ '--file', 'one.js' ]),
{ file: 'one.js' }
Expand All @@ -19,3 +19,14 @@ test('type-other: different values', function () {
{ file: null }
)
})

test('type-other: broken custom type function', function () {
var optionDefinitions = [
{ name: 'file', type: function (file) {
lasdfjsfakn
}}
]
a.throws(function () {
cliArgs(optionDefinitions, [ '--file', 'one.js' ])
})
})
1 change: 0 additions & 1 deletion test/type-string.js
Expand Up @@ -28,5 +28,4 @@ test.skip('type-string: pass a value resembling an option', function () {
cliArgs(optionDefinitions, [ '--one', '--yeah' ]),
{ one: '--yeah' }
)
t.end()
})

0 comments on commit 5c0402f

Please sign in to comment.