enum-fp
Version:
Functional enum type for javascript with simple pattern matching
297 lines (296 loc) • 8.83 kB
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"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">126x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">26x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">23x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">193x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">197x</span>
<span class="cline-any cline-yes">14x</span>
<span class="cline-any cline-neutral"> </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"> </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"> </span>
<span class="cline-any cline-yes">12x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </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"> </span>
<span class="cline-any cline-yes">67x</span>
<span class="cline-any cline-yes">67x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">67x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">54x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { values, isList, isObject, createEnumFactory } from './utils';
// Tiny ArgLessEnum to bypass the circular dependency shithole
const ArgLessEnum = createEnumFactory({
createConstructor: (Type, constr) => (...args) => ({ ...constr, args }),
});
// type Type = Type|String;
// Cant use Type to define Type so ArgLessEnum
const Type = ArgLessEnum([
'Any',
'String',
'Number',
'Bool',
'List',
'Map',
'Record',
'Func',
'Enum',
'OneOf',
]);
// validateList :: (Type, [a]) -> Boolean
const validateList = (innerType, list) =>
isList(list) && (
(innerType && list.length > 0)
? list.length === [...list].filter(isOfType(innerType)).length
: true
);
// validateRecord :: Object Type -> Object a -> Boolean
export const validateRecord = (shape, obj) => validateArgs(values(shape), values(obj));
// isOfType :: Type -> a -> Boolean
export const isOfType = type => value => {
// Dynamic argument description
if(typeof type === 'string' && value !== undefined)
return true;
<span class="missing-if-branch" title="else path not taken" >E</span>if (Type.isConstructor(type)) {
return !!Type.match(type, {
Any: () => true,
String: () => typeof value === 'string',
Number: () => typeof value === 'number',
Bool: () => typeof value === 'boolean',
Func: () => typeof value === 'function',
List: innerType => validateList(innerType, value),
Map: innerType => innerType && isObject(value) && validateList(innerType, values(value)),
Record: shape => isObject(value) && (shape ? validateRecord(shape, value) : true),
OneOf: typeList => !![...typeList].filter(type => isOfType(type)(value)).length,
Enum: InnerType => value && InnerType.isConstructor(value),
});
}
<span class="cstat-no" title="statement not covered" > return false;</span>
};
// validateArgs :: ([Type], [a]) -> Bool
export const validateArgs = (typeList, valueList) => {
if(typeList.length !== valueList.length) return false;
if(typeList.length === 0) return true;
const [type, ...types] = typeList;
const [val, ...vals] = valueList;
if(!isOfType(type)(val)) return false;
return types.length > 0 ? validateArgs(types, vals) : true;
};
export default Type;
</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>