UNPKG

enum-fp

Version:

Functional enum type for javascript with simple pattern matching

297 lines (296 loc) 8.83 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for Type.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="prettify.css" /> <link rel="stylesheet" href="base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="index.html">All files</a> Type.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">97.22% </span> <span class="quiet">Statements</span> <span class='fraction'>35/36</span> </div> <div class='fl pad1y space-right2'> <span class="strong">96.55% </span> <span class="quiet">Branches</span> <span class='fraction'>28/29</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>18/18</span> </div> <div class='fl pad1y space-right2'> <span class="strong">96.55% </span> <span class="quiet">Lines</span> <span class='fraction'>28/29</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">126x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">26x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">23x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">193x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">197x</span> <span class="cline-any cline-yes">14x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">183x</span> <span class="cline-any cline-yes">183x</span> <span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">42x</span> <span class="cline-any cline-yes">34x</span> <span class="cline-any cline-yes">13x</span> <span class="cline-any cline-yes">12x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">22x</span> <span class="cline-any cline-yes">11x</span> <span class="cline-any cline-yes">21x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">12x</span> <span class="cline-any cline-yes">11x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">4x</span> <span class="cline-any cline-yes">78x</span> <span class="cline-any cline-yes">69x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">67x</span> <span class="cline-any cline-yes">67x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">67x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">54x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { values, isList, isObject, createEnumFactory } from './utils'; &nbsp; // Tiny ArgLessEnum to bypass the circular dependency shithole const ArgLessEnum = createEnumFactory({ createConstructor: (Type, constr) =&gt; (...args) =&gt; ({ ...constr, args }), }); &nbsp; // type Type = Type|String; &nbsp; // Cant use Type to define Type so ArgLessEnum const Type = ArgLessEnum([ 'Any', 'String', 'Number', 'Bool', &nbsp; 'List', 'Map', 'Record', &nbsp; 'Func', 'Enum', 'OneOf', ]); &nbsp; // validateList :: (Type, [a]) -&gt; Boolean const validateList = (innerType, list) =&gt; isList(list) &amp;&amp; ( (innerType &amp;&amp; list.length &gt; 0) ? list.length === [...list].filter(isOfType(innerType)).length : true ); &nbsp; // validateRecord :: Object Type -&gt; Object a -&gt; Boolean export const validateRecord = (shape, obj) =&gt; validateArgs(values(shape), values(obj)); &nbsp; // isOfType :: Type -&gt; a -&gt; Boolean export const isOfType = type =&gt; value =&gt; { // Dynamic argument description if(typeof type === 'string' &amp;&amp; value !== undefined) return true; &nbsp; <span class="missing-if-branch" title="else path not taken" >E</span>if (Type.isConstructor(type)) { return !!Type.match(type, { Any: () =&gt; true, String: () =&gt; typeof value === 'string', Number: () =&gt; typeof value === 'number', Bool: () =&gt; typeof value === 'boolean', Func: () =&gt; typeof value === 'function', &nbsp; List: innerType =&gt; validateList(innerType, value), Map: innerType =&gt; innerType &amp;&amp; isObject(value) &amp;&amp; validateList(innerType, values(value)), Record: shape =&gt; isObject(value) &amp;&amp; (shape ? validateRecord(shape, value) : true), &nbsp; OneOf: typeList =&gt; !![...typeList].filter(type =&gt; isOfType(type)(value)).length, Enum: InnerType =&gt; value &amp;&amp; InnerType.isConstructor(value), }); } &nbsp; <span class="cstat-no" title="statement not covered" > return false;</span> }; &nbsp; // validateArgs :: ([Type], [a]) -&gt; Bool export const validateArgs = (typeList, valueList) =&gt; { if(typeList.length !== valueList.length) return false; if(typeList.length === 0) return true; &nbsp; const [type, ...types] = typeList; const [val, ...vals] = valueList; &nbsp; if(!isOfType(type)(val)) return false; &nbsp; return types.length &gt; 0 ? validateArgs(types, vals) : true; }; &nbsp; export default Type; &nbsp; &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank">istanbul</a> at Fri Nov 23 2018 11:40:43 GMT+0530 (India Standard Time) </div> </div> <script src="prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="sorter.js"></script> </body> </html>