UNPKG

conditional

Version:

A preconditions package based on Google's Preconditions library

350 lines (250 loc) 22.4 kB
<!DOCTYPE html> <html> <head> <title>main.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="debug_wrapper.html"> debug_wrapper.coffee </a> <a class="source" href="main.html"> main.coffee </a> <a class="source" href="util.html"> util.coffee </a> <a class="source" href="argument_test.html"> argument_test.coffee </a> <a class="source" href="common_test.html"> common_test.coffee </a> <a class="source" href="contains_test.html"> contains_test.coffee </a> <a class="source" href="defined_test.html"> defined_test.coffee </a> <a class="source" href="equals_test.html"> equals_test.coffee </a> <a class="source" href="not_empty_test.html"> not_empty_test.coffee </a> <a class="source" href="not_null_test.html"> not_null_test.coffee </a> <a class="source" href="number_type_test.html"> number_type_test.coffee </a> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>main.coffee</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre>{ isObject isArray, isNotArray isNumeric isString isEmptyString isNotUndefined isUndefined isEqual isNotPrimitive isPrimitive xor } = <span class="hljs-built_in">require</span> <span class="hljs-string">'./util'</span> debug = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./debug_wrapper'</span>)</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>throw error in a checker by default</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-title">DEFAULT_CALLBACK</span> = <span class="hljs-params">(err)</span> -&gt;</span> <span class="hljs-keyword">throw</span> err <span class="hljs-keyword">if</span> err? <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(<span class="hljs-property">@name</span>, <span class="hljs-property">@defaultMessage</span>, <span class="hljs-property">@negate</span> = <span class="hljs-literal">false</span>, <span class="hljs-property">@argc</span> = <span class="hljs-number">1</span>)</span> -&gt;</span> <span class="hljs-built_in">module</span>.exports[<span class="hljs-property">@name</span>] = <span class="hljs-function">=&gt;</span> <span class="hljs-property">@check</span>.apply @, arguments debug <span class="hljs-string">"registered checker '<span class="hljs-subst">#{<span class="hljs-property">@name</span>}</span>'"</span> <span class="hljs-attribute">check</span>: <span class="hljs-function">-&gt;</span> message = arguments[<span class="hljs-property">@argc</span>] callback = arguments[<span class="hljs-property">@argc</span> + <span class="hljs-number">1</span>] || DEFAULT_CALLBACK <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span> message <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span> callback = message message = <span class="hljs-literal">null</span> args = [] <span class="hljs-attribute">Array</span>::push.call args, arg <span class="hljs-keyword">for</span> arg <span class="hljs-keyword">in</span> <span class="hljs-attribute">Array</span>::splice.call arguments, <span class="hljs-number">0</span>, <span class="hljs-property">@argc</span> message ?= <span class="hljs-property">@getErrorMessage</span>.apply @, args <span class="hljs-keyword">try</span> <span class="hljs-property">@invokeError</span> message <span class="hljs-keyword">unless</span> xor <span class="hljs-property">@doCheck</span>.apply(@, args), <span class="hljs-property">@negate</span> callback <span class="hljs-literal">null</span> <span class="hljs-keyword">catch</span> e callback e <span class="hljs-attribute">invokeError</span>: <span class="hljs-function">-&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Error <span class="hljs-string">'something went wrong'</span> <span class="hljs-attribute">doCheck</span>: <span class="hljs-function">-&gt;</span> <span class="hljs-literal">false</span> <span class="hljs-attribute">getErrorMessage</span>: <span class="hljs-function">-&gt;</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">typeof</span> <span class="hljs-property">@defaultMessage</span> <span class="hljs-keyword">is</span> <span class="hljs-string">'function'</span> <span class="hljs-property">@defaultMessage</span>.apply(@, arguments) <span class="hljs-keyword">else</span> <span class="hljs-property">@defaultMessage</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ArgumentChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.INVALID_ARGUMENT)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(condition)</span> -&gt;</span> isString(condition) <span class="hljs-keyword">or</span> isNumeric(condition) <span class="hljs-keyword">or</span> condition <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NumberTypeChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.INVALID_TYPE)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> isNumeric value <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> InvalidTypeError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ContainsChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate, <span class="hljs-number">2</span> <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value, object)</span> -&gt;</span> argumentChecker.check object, <span class="hljs-string">'invalid collection value'</span> <span class="hljs-keyword">switch</span> <span class="hljs-keyword">when</span> isString object <span class="hljs-keyword">not</span> ((<span class="hljs-keyword">not</span> isString value) <span class="hljs-keyword">or</span> (value.length &gt; object.length) <span class="hljs-keyword">or</span> ((isEmptyString(object) ^ isEmptyString(value))) <span class="hljs-keyword">or</span> (<span class="hljs-keyword">not</span> (isEmptyString(object) <span class="hljs-keyword">or</span> value <span class="hljs-keyword">in</span> object))) <span class="hljs-keyword">when</span> isArray object <span class="hljs-keyword">then</span> value <span class="hljs-keyword">in</span> object <span class="hljs-keyword">when</span> isNumeric object <span class="hljs-keyword">then</span> ~object.toString().indexOf value <span class="hljs-keyword">else</span> value <span class="hljs-keyword">of</span> object <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnknownValueError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EqualsChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate, <span class="hljs-number">2</span> <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(actual, expected)</span> -&gt;</span> argumentChecker.check isNotUndefined(expected), <span class="hljs-string">'invalid value expected'</span> isEqual actual, expected <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UnknownValueError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DefinedChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.UNDEFINED_VALUE)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> isNotUndefined value <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> UndefinedValueError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmptyChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.ILLEGAL_VALUE)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> value <span class="hljs-keyword">is</span> <span class="hljs-literal">null</span> <span class="hljs-keyword">or</span> isUndefined(value) <span class="hljs-keyword">or</span> (isNotPrimitive(value) <span class="hljs-keyword">and</span> ((hasOwnProperty.call(value, <span class="hljs-string">'length'</span>) <span class="hljs-keyword">and</span> value.length <span class="hljs-keyword">is</span> <span class="hljs-number">0</span>) <span class="hljs-keyword">or</span> (<span class="hljs-keyword">typeof</span> value <span class="hljs-keyword">is</span> <span class="hljs-string">'object'</span> <span class="hljs-keyword">and</span> Object.keys(value).length <span class="hljs-keyword">is</span> <span class="hljs-number">0</span>))) <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalValueError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">StateChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ArgumentChecker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, <span class="hljs-literal">false</span>, DEFAULT_MESSAGES.ILLEGAL_STATE <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalStateError message <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NullChecker</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Checker</span></span> <span class="hljs-attribute">constructor</span>: <span class="hljs-function"><span class="hljs-params">(name, negate, message = DEFAULT_MESSAGES.NULL_VALUE)</span> -&gt;</span> <span class="hljs-keyword">super</span> name, message, negate <span class="hljs-attribute">doCheck</span>: <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> isUndefined(value) <span class="hljs-keyword">or</span> value <span class="hljs-keyword">is</span> <span class="hljs-literal">null</span> <span class="hljs-attribute">invokeError</span>: <span class="hljs-function"><span class="hljs-params">(message)</span> -&gt;</span> <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalValueError message DEFAULT_MESSAGES = INVALID_ARGUMENT : <span class="hljs-string">'invalid argument'</span> INVALID_TYPE : <span class="hljs-string">'invalid type'</span> UNKNOWN_VALUE : <span class="hljs-string">'unknown value'</span> UNDEFINED_VALUE : <span class="hljs-string">'undefined value'</span> ILLEGAL_VALUE : <span class="hljs-string">'illegal value'</span> ILLEGAL_STATE : <span class="hljs-string">'illegal state'</span> NULL_VALUE : <span class="hljs-string">'value is null'</span> <span class="hljs-function"> <span class="hljs-title">AbstractError</span> = <span class="hljs-params">(<span class="hljs-property">@message</span>)</span> -&gt;</span> Error.call(@) Error.captureStackTrace(@, arguments.callee) <span class="hljs-property">@name</span> = arguments.callee?.caller?.name <span class="hljs-keyword">or</span> <span class="hljs-string">'Error'</span> AbstractError.prototype.__proto__ = Error.prototype <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalArgumentError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">InvalidTypeError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UnknownValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UndefinedValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalValueError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">IllegalStateError</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AbstractError</span></span></pre></div></div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>export all preconditions</p> </div> <div class="content"><div class='highlight'><pre>argumentChecker = <span class="hljs-keyword">new</span> ArgumentChecker <span class="hljs-string">'checkArgument'</span> <span class="hljs-keyword">new</span> NumberTypeChecker <span class="hljs-string">'checkNumberType'</span> <span class="hljs-keyword">new</span> NumberTypeChecker <span class="hljs-string">'checkNotNumberType'</span>, <span class="hljs-literal">true</span> <span class="hljs-keyword">new</span> ContainsChecker <span class="hljs-string">'checkContains'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(value, object)</span> -&gt;</span> <span class="hljs-string">"unknown value '<span class="hljs-subst">#{value}</span>'"</span> <span class="hljs-keyword">new</span> ContainsChecker <span class="hljs-string">'checkDoesNotContain'</span>, <span class="hljs-literal">true</span>, <span class="hljs-function"><span class="hljs-params">(value, object)</span> -&gt;</span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is a known value"</span> <span class="hljs-keyword">new</span> EqualsChecker <span class="hljs-string">'checkEquals'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(actual, expected)</span> -&gt;</span> <span class="hljs-string">"expected '<span class="hljs-subst">#{expected}</span>' but got '<span class="hljs-subst">#{actual}</span>'"</span> <span class="hljs-keyword">new</span> EqualsChecker <span class="hljs-string">'checkDoesNotEqual'</span>, <span class="hljs-literal">true</span>, <span class="hljs-function"><span class="hljs-params">(actual)</span> -&gt;</span> <span class="hljs-string">"did not expect value '<span class="hljs-subst">#{actual}</span>'"</span> <span class="hljs-keyword">new</span> DefinedChecker <span class="hljs-string">'checkDefined'</span> <span class="hljs-keyword">new</span> DefinedChecker <span class="hljs-string">'checkUndefined'</span>, <span class="hljs-literal">true</span>, <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is a defined value"</span> <span class="hljs-keyword">new</span> EmptyChecker <span class="hljs-string">'checkEmpty'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is not empty"</span> <span class="hljs-keyword">new</span> EmptyChecker <span class="hljs-string">'checkNotEmpty'</span>, <span class="hljs-literal">true</span> <span class="hljs-keyword">new</span> StateChecker <span class="hljs-string">'checkState'</span> <span class="hljs-keyword">new</span> NullChecker <span class="hljs-string">'checkNull'</span>, <span class="hljs-literal">false</span>, <span class="hljs-function"><span class="hljs-params">(value)</span> -&gt;</span> <span class="hljs-string">"'<span class="hljs-subst">#{value}</span>' is not null"</span> <span class="hljs-keyword">new</span> NullChecker <span class="hljs-string">'checkNotNull'</span>, <span class="hljs-literal">true</span></pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>export error types</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-built_in">module</span>.exports.IllegalArgumentError = IllegalArgumentError <span class="hljs-built_in">module</span>.exports.InvalidTypeError = InvalidTypeError <span class="hljs-built_in">module</span>.exports.UnknownValueError = UnknownValueError <span class="hljs-built_in">module</span>.exports.UndefinedValueError = UndefinedValueError <span class="hljs-built_in">module</span>.exports.IllegalValueError = IllegalValueError <span class="hljs-built_in">module</span>.exports.IllegalStateError = IllegalStateError</pre></div></div> </li> </ul> </div> </body> </html>