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