1 |
|
2 |
|
3 |
|
4 | import { memoize } from './Schemable';
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | export function literal() {
|
12 | var values = [];
|
13 | for (var _i = 0; _i < arguments.length; _i++) {
|
14 | values[_i] = arguments[_i];
|
15 | }
|
16 | return {
|
17 | is: function (u) { return values.findIndex(function (a) { return a === u; }) !== -1; }
|
18 | };
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | export var never = {
|
27 | is: function (_u) { return false; }
|
28 | };
|
29 |
|
30 |
|
31 |
|
32 | export var string = {
|
33 | is: function (u) { return typeof u === 'string'; }
|
34 | };
|
35 |
|
36 |
|
37 |
|
38 | export var number = {
|
39 | is: function (u) { return typeof u === 'number'; }
|
40 | };
|
41 |
|
42 |
|
43 |
|
44 | export var boolean = {
|
45 | is: function (u) { return typeof u === 'boolean'; }
|
46 | };
|
47 |
|
48 |
|
49 |
|
50 | export var UnknownArray = {
|
51 | is: Array.isArray
|
52 | };
|
53 |
|
54 |
|
55 |
|
56 | export var UnknownRecord = {
|
57 | is: function (u) { return Object.prototype.toString.call(u) === '[object Object]'; }
|
58 | };
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | export function refinement(from, refinement) {
|
66 | return {
|
67 | is: function (u) { return from.is(u) && refinement(u); }
|
68 | };
|
69 | }
|
70 |
|
71 |
|
72 |
|
73 | export function nullable(or) {
|
74 | return {
|
75 | is: function (u) { return u === null || or.is(u); }
|
76 | };
|
77 | }
|
78 |
|
79 |
|
80 |
|
81 | export function type(properties) {
|
82 | return refinement(UnknownRecord, function (r) {
|
83 | for (var k in properties) {
|
84 | if (!(k in r) || !properties[k].is(r[k])) {
|
85 | return false;
|
86 | }
|
87 | }
|
88 | return true;
|
89 | });
|
90 | }
|
91 |
|
92 |
|
93 |
|
94 | export function partial(properties) {
|
95 | return refinement(UnknownRecord, function (r) {
|
96 | for (var k in properties) {
|
97 | var v = r[k];
|
98 | if (v !== undefined && !properties[k].is(v)) {
|
99 | return false;
|
100 | }
|
101 | }
|
102 | return true;
|
103 | });
|
104 | }
|
105 |
|
106 |
|
107 |
|
108 | export function record(codomain) {
|
109 | return refinement(UnknownRecord, function (r) {
|
110 | for (var k in r) {
|
111 | if (!codomain.is(r[k])) {
|
112 | return false;
|
113 | }
|
114 | }
|
115 | return true;
|
116 | });
|
117 | }
|
118 |
|
119 |
|
120 |
|
121 | export function array(items) {
|
122 | return refinement(UnknownArray, function (us) { return us.every(items.is); });
|
123 | }
|
124 |
|
125 |
|
126 |
|
127 | export function tuple() {
|
128 | var components = [];
|
129 | for (var _i = 0; _i < arguments.length; _i++) {
|
130 | components[_i] = arguments[_i];
|
131 | }
|
132 | return {
|
133 | is: function (u) { return Array.isArray(u) && u.length === components.length && components.every(function (c, i) { return c.is(u[i]); }); }
|
134 | };
|
135 | }
|
136 |
|
137 |
|
138 |
|
139 | export function intersection(left, right) {
|
140 | return {
|
141 | is: function (u) { return left.is(u) && right.is(u); }
|
142 | };
|
143 | }
|
144 |
|
145 |
|
146 |
|
147 | export function union() {
|
148 | var members = [];
|
149 | for (var _i = 0; _i < arguments.length; _i++) {
|
150 | members[_i] = arguments[_i];
|
151 | }
|
152 | return {
|
153 | is: function (u) { return members.some(function (m) { return m.is(u); }); }
|
154 | };
|
155 | }
|
156 |
|
157 |
|
158 |
|
159 | export function sum(tag) {
|
160 | return function (members) {
|
161 | return refinement(UnknownRecord, function (r) {
|
162 | var v = r[tag];
|
163 | if (string.is(v) && v in members) {
|
164 | return members[v].is(r);
|
165 | }
|
166 | return false;
|
167 | });
|
168 | };
|
169 | }
|
170 |
|
171 |
|
172 |
|
173 | export function lazy(f) {
|
174 | var get = memoize(f);
|
175 | return {
|
176 | is: function (u) { return get().is(u); }
|
177 | };
|
178 | }
|
179 | // -------------------------------------------------------------------------------------
|
180 | // instances
|
181 | // -------------------------------------------------------------------------------------
|
182 | /**
|
183 | * @since 2.2.0
|
184 | */
|
185 | export var URI = 'io-ts/Guard';
|
186 | /**
|
187 | * @since 2.2.3
|
188 | */
|
189 | export var schemableGuard = {
|
190 | URI: URI,
|
191 | literal: literal,
|
192 | string: string,
|
193 | number: number,
|
194 | boolean: boolean,
|
195 | nullable: nullable,
|
196 | type: type,
|
197 | partial: partial,
|
198 | record: record,
|
199 | array: array,
|
200 | tuple: tuple,
|
201 | intersection: intersection,
|
202 | sum: sum,
|
203 | lazy: function (_, f) { return lazy(f); },
|
204 | UnknownArray: UnknownArray,
|
205 | UnknownRecord: UnknownRecord,
|
206 | union: union,
|
207 | refinement: refinement
|
208 | };
|