95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
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.
 | 
						|
 |