You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					95 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					95 lines
				
				2.7 KiB
			| 
											3 years ago
										 | 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. | ||
|  | 
 |