|
|
- 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.
-
|