Spaces:
Sleeping
Sleeping
aproba | |
====== | |
A ridiculously light-weight function argument validator | |
``` | |
var validate = require("aproba") | |
function myfunc(a, b, c) { | |
// `a` must be a string, `b` a number, `c` a function | |
validate('SNF', arguments) // [a,b,c] is also valid | |
} | |
myfunc('test', 23, function () {}) // ok | |
myfunc(123, 23, function () {}) // type error | |
myfunc('test', 23) // missing arg error | |
myfunc('test', 23, function () {}, true) // too many args error | |
``` | |
Valid types are: | |
| type | description | |
| :--: | :---------- | |
| * | matches any type | |
| A | `Array.isArray` OR an `arguments` object | |
| S | typeof == string | |
| 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` **(special: see below)** | |
| Z | == `null` | |
Validation failures throw one of three exception types, distinguished by a | |
`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`. | |
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 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. | |
### Browser support | |
This has no dependencies and should work in browsers, though you'll have | |
noisier stack traces. | |
### Why this exists | |
I wanted a very simple argument validator. It needed to do two things: | |
1. Be more concise and easier to use than assertions | |
2. Not encourage an infinite bikeshed of DSLs | |
This is why types are specified by a single character and there's no such | |
thing as an optional argument. | |
This is not intended to validate user data. This is specifically about | |
asserting the interface of your functions. | |
If you need greater validation, I encourage you to write them by hand or | |
look elsewhere. | |