summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/aproba
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/aproba')
-rw-r--r--deps/npm/node_modules/aproba/README.md36
-rw-r--r--deps/npm/node_modules/aproba/index.js101
-rw-r--r--deps/npm/node_modules/aproba/package.json53
3 files changed, 130 insertions, 60 deletions
diff --git a/deps/npm/node_modules/aproba/README.md b/deps/npm/node_modules/aproba/README.md
index 8246a9cc6e..a9d38222a7 100644
--- a/deps/npm/node_modules/aproba/README.md
+++ b/deps/npm/node_modules/aproba/README.md
@@ -29,7 +29,8 @@ N | typeof == number
F | typeof == function
O | typeof == object and not type A and not type E
B | typeof == boolean
-E | instanceof Error OR null
+E | instanceof Error OR null **(special: see below)**
+Z | == null
Validation failures throw one of three exception types, distinguished by a
`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`.
@@ -37,8 +38,37 @@ Validation failures throw one of three exception types, distinguished by a
If you pass in an invalid type then it will throw with a code of
`EUNKNOWNTYPE`.
-If an error argument is found and is not null then the remaining arguments
-will not be validated.
+If an **error** argument is found and is not null then the remaining
+arguments are optional. That is, if you say `ESO` then that's like using a
+non-magical `E` in: `E|ESO|ZSO`.
+
+### But I have optional arguments?!
+
+You can provide more than one signature by separating them with pipes `|`.
+If any signature matches the arguments then they'll be considered valid.
+
+So for example, say you wanted to write a signature for
+`fs.createWriteStream`. The docs for it describe it thusly:
+
+```
+fs.createWriteStream(path[, options])
+```
+
+This would be a signature of `SO|S`. That is, a string and and object, or
+just a string.
+
+Now, if you read the full `fs` docs, you'll see that actually path can ALSO
+be a buffer. And options can be a string, that is:
+```
+path <String> | <Buffer>
+options <String> | <Object>
+```
+
+To reproduce this you have to fully enumerate all of the possible
+combinations and that implies a signature of `SO|SS|OO|OS|S|O`. The
+awkwardness is a feature: It reminds you of the complexity you're adding to
+your API when you do this sort of thing.
+
### Why this exists
diff --git a/deps/npm/node_modules/aproba/index.js b/deps/npm/node_modules/aproba/index.js
index bb5ac3cda6..bc6ed1f17b 100644
--- a/deps/npm/node_modules/aproba/index.js
+++ b/deps/npm/node_modules/aproba/index.js
@@ -1,36 +1,64 @@
'use strict'
function isArguments (thingy) {
- return typeof thingy === 'object' && thingy.hasOwnProperty('callee')
+ return thingy != null && typeof thingy === 'object' && thingy.hasOwnProperty('callee')
}
var types = {
- '*': ['any', function () { return true }],
- A: ['array', function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }],
- S: ['string', function (thingy) { return typeof thingy === 'string' }],
- N: ['number', function (thingy) { return typeof thingy === 'number' }],
- F: ['function', function (thingy) { return typeof thingy === 'function' }],
- O: ['object', function (thingy) { return typeof thingy === 'object' && !types.A[1](thingy) && !types.E[1](thingy) }],
- B: ['boolean', function (thingy) { return typeof thingy === 'boolean' }],
- E: ['error', function (thingy) { return thingy instanceof Error }]
-}
-
-var validate = module.exports = function (schema, args) {
- if (!schema) throw missingRequiredArg(0, 'schema')
+ '*': {label: 'any', check: function () { return true }},
+ A: {label: 'array', check: function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }},
+ S: {label: 'string', check: function (thingy) { return typeof thingy === 'string' }},
+ N: {label: 'number', check: function (thingy) { return typeof thingy === 'number' }},
+ F: {label: 'function', check: function (thingy) { return typeof thingy === 'function' }},
+ O: {label: 'object', check: function (thingy) { return typeof thingy === 'object' && thingy != null && !types.A.check(thingy) && !types.E.check(thingy) }},
+ B: {label: 'boolean', check: function (thingy) { return typeof thingy === 'boolean' }},
+ E: {label: 'error', check: function (thingy) { return thingy instanceof Error }},
+ Z: {label: 'null', check: function (thingy) { return thingy == null }}
+}
+
+var validate = module.exports = function (rawSchemas, args) {
+ if (arguments.length !== 2) throw wrongNumberOfArgs(['SA'], arguments.length)
+ if (!rawSchemas) throw missingRequiredArg(0, 'rawSchemas')
if (!args) throw missingRequiredArg(1, 'args')
- if (!types.S[1](schema)) throw invalidType(0, 'string', schema)
- if (!types.A[1](args)) throw invalidType(1, 'array', args)
- for (var ii = 0; ii < schema.length; ++ii) {
- var type = schema[ii]
- if (!types[type]) throw unknownType(ii, type)
- var typeLabel = types[type][0]
- var typeCheck = types[type][1]
- if (type === 'E' && args[ii] == null) continue
- if (args[ii] == null) throw missingRequiredArg(ii)
- if (!typeCheck(args[ii])) throw invalidType(ii, typeLabel, args[ii])
- if (type === 'E') return
+ if (!types.S.check(rawSchemas)) throw invalidType(0, ['string'], rawSchemas)
+ if (!types.A.check(args)) throw invalidType(1, ['array'], args)
+ var schemas = rawSchemas.split('|')
+ var arity = {}
+ function addSchema (schema) {
+ var group = arity[schema.length] = arity[schema.length] || []
+ if (group.indexOf(schema) === -1) group.push(schema)
+ }
+ schemas.forEach(function (schema) {
+ for (var ii = 0; ii < schema.length; ++ii) {
+ var type = schema[ii]
+ if (!types[type]) throw unknownType(ii, type)
+ }
+ if (/E.*E/.test(schema)) throw moreThanOneError(schema)
+ addSchema(schema)
+ if (/E/.test(schema)) {
+ addSchema(schema.replace(/E.*$/, 'E'))
+ addSchema(schema.replace(/E/, 'Z'))
+ if (schema.length === 1) addSchema('')
+ }
+ })
+ var matching = arity[args.length]
+ if (!matching) {
+ throw wrongNumberOfArgs(Object.keys(arity), args.length)
+ }
+ for (var ii = 0; ii < args.length; ++ii) {
+ var newMatching = matching.filter(function (schema) {
+ var type = schema[ii]
+ var typeCheck = types[type].check
+ return typeCheck(args[ii])
+ })
+ if (!newMatching.length) {
+ var labels = matching.map(function (schema) {
+ return types[schema[ii]].label
+ }).filter(function (schema) { return schema != null })
+ throw invalidType(ii, labels, args[ii])
+ }
+ matching = newMatching
}
- if (schema.length < args.length) throw tooManyArgs(schema.length, args.length)
}
function missingRequiredArg (num) {
@@ -41,17 +69,30 @@ function unknownType (num, type) {
return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1))
}
-function invalidType (num, expectedType, value) {
+function invalidType (num, expectedTypes, value) {
var valueType
Object.keys(types).forEach(function (typeCode) {
- if (types[typeCode][1](value)) valueType = types[typeCode][0]
+ if (types[typeCode].check(value)) valueType = types[typeCode].label
})
return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' +
- expectedType + ' but got ' + valueType)
+ englishList(expectedTypes) + ' but got ' + valueType)
+}
+
+function englishList (list) {
+ return list.join(', ').replace(/, ([^,]+)$/, ' or $1')
+}
+
+function wrongNumberOfArgs (expected, got) {
+ var english = englishList(expected)
+ var args = expected.every(function (ex) { return ex.length === 1 })
+ ? 'argument'
+ : 'arguments'
+ return newException('EWRONGARGCOUNT', 'Expected ' + english + ' ' + args + ' but got ' + got)
}
-function tooManyArgs (expected, got) {
- return newException('ETOOMANYARGS', 'Too many arguments, expected ' + expected + ' and got ' + got)
+function moreThanOneError (schema) {
+ return newException('ETOOMANYERRORTYPES',
+ 'Only one error type per argument signature is allowed, more than one found in "' + schema + '"')
}
function newException (code, msg) {
diff --git a/deps/npm/node_modules/aproba/package.json b/deps/npm/node_modules/aproba/package.json
index b5e08a31c1..dfe2377542 100644
--- a/deps/npm/node_modules/aproba/package.json
+++ b/deps/npm/node_modules/aproba/package.json
@@ -2,52 +2,51 @@
"_args": [
[
{
- "raw": "aproba@~1.0.3",
+ "raw": "aproba@latest",
"scope": null,
"escapedName": "aproba",
"name": "aproba",
- "rawSpec": "~1.0.3",
- "spec": ">=1.0.3 <1.1.0",
- "type": "range"
+ "rawSpec": "latest",
+ "spec": "latest",
+ "type": "tag"
},
- "/Users/rebecca/code/npm"
+ "/Users/zkat/Documents/code/npm"
]
],
- "_from": "aproba@>=1.0.3 <1.1.0",
- "_id": "aproba@1.0.4",
+ "_from": "aproba@latest",
+ "_id": "aproba@1.1.1",
"_inCache": true,
- "_installable": true,
"_location": "/aproba",
- "_nodeVersion": "4.4.0",
+ "_nodeVersion": "7.5.0",
"_npmOperationalInternal": {
- "host": "packages-12-west.internal.npmjs.com",
- "tmp": "tmp/aproba-1.0.4.tgz_1466718885402_0.5348939662799239"
+ "host": "packages-18-east.internal.npmjs.com",
+ "tmp": "tmp/aproba-1.1.1.tgz_1486593129508_0.5718816472217441"
},
"_npmUser": {
"name": "iarna",
"email": "me@re-becca.org"
},
- "_npmVersion": "3.10.2",
+ "_npmVersion": "4.2.0",
"_phantomChildren": {},
"_requested": {
- "raw": "aproba@~1.0.3",
+ "raw": "aproba@latest",
"scope": null,
"escapedName": "aproba",
"name": "aproba",
- "rawSpec": "~1.0.3",
- "spec": ">=1.0.3 <1.1.0",
- "type": "range"
+ "rawSpec": "latest",
+ "spec": "latest",
+ "type": "tag"
},
"_requiredBy": [
"#USER",
"/",
"/npmlog/gauge"
],
- "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz",
- "_shasum": "2713680775e7614c8ba186c065d4e2e52d1072c0",
+ "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz",
+ "_shasum": "95d3600f07710aa0e9298c726ad5ecf2eacbabab",
"_shrinkwrap": null,
- "_spec": "aproba@~1.0.3",
- "_where": "/Users/rebecca/code/npm",
+ "_spec": "aproba@latest",
+ "_where": "/Users/zkat/Documents/code/npm",
"author": {
"name": "Rebecca Turner",
"email": "me@re-becca.org"
@@ -58,20 +57,20 @@
"dependencies": {},
"description": "A rediculously light-weight argument validator",
"devDependencies": {
- "standard": "^7.1.2",
- "tap": "^5.7.3"
+ "standard": "^8.6.0",
+ "tap": "^10.0.2"
},
"directories": {
"test": "test"
},
"dist": {
- "shasum": "2713680775e7614c8ba186c065d4e2e52d1072c0",
- "tarball": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz"
+ "shasum": "95d3600f07710aa0e9298c726ad5ecf2eacbabab",
+ "tarball": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz"
},
"files": [
"index.js"
],
- "gitHead": "c6c8f82d519b9ec3816f20f23a9101083c022200",
+ "gitHead": "e7c76b4b42356092db3cd9e2d9388a0134845eb2",
"homepage": "https://github.com/iarna/aproba",
"keywords": [
"argument",
@@ -93,7 +92,7 @@
"url": "git+https://github.com/iarna/aproba.git"
},
"scripts": {
- "test": "standard && tap test/*.js"
+ "test": "standard && tap -j3 test/*.js"
},
- "version": "1.0.4"
+ "version": "1.1.1"
}