vest 3.2.8-dev-6d7c74 → 3.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/any.d.ts +3 -0
- package/any.js +1 -0
- package/classNames.d.ts +14 -0
- package/classNames.js +1 -0
- package/docs/.nojekyll +0 -0
- package/docs/README.md +115 -0
- package/docs/_assets/favicon.ico +0 -0
- package/docs/_assets/vest-logo.png +0 -0
- package/docs/_sidebar.md +19 -0
- package/docs/_sidebar.md.bak +14 -0
- package/docs/cross_field_validations.md +79 -0
- package/docs/enforce.md +18 -0
- package/docs/enforce.md.bak +13 -0
- package/docs/exclusion.md +128 -0
- package/docs/getting_started.md +79 -0
- package/docs/group.md +142 -0
- package/docs/index.html +41 -0
- package/docs/migration.md +107 -0
- package/docs/n4s/compound.md +187 -0
- package/docs/n4s/custom.md +52 -0
- package/docs/n4s/external.md +54 -0
- package/docs/n4s/rules.md +1282 -0
- package/docs/n4s/template.md +53 -0
- package/docs/node.md +43 -0
- package/docs/optional.md +51 -0
- package/docs/result.md +238 -0
- package/docs/state.md +102 -0
- package/docs/test.md +172 -0
- package/docs/utilities.md +105 -0
- package/docs/warn.md +82 -0
- package/enforce.d.ts +230 -0
- package/esm/package.json +1 -0
- package/esm/vest.es.development.js +2493 -0
- package/esm/vest.es.production.js +2490 -0
- package/esm/vest.es.production.min.js +1 -0
- package/package.json +65 -12
- package/promisify.d.ts +7 -0
- package/{dist/umd/promisify.production.js → promisify.js} +1 -1
- package/schema.d.ts +26 -0
- package/schema.js +1 -0
- package/vest.cjs.development.js +2494 -0
- package/vest.cjs.production.js +2491 -0
- package/vest.cjs.production.min.js +1 -0
- package/vest.d.ts +254 -0
- package/vest.js +7 -0
- package/vest.umd.development.js +2711 -0
- package/vest.umd.production.js +2708 -0
- package/vest.umd.production.min.js +1 -0
- package/vestResult.d.ts +105 -0
- package/CHANGELOG.md +0 -94
- package/LICENSE +0 -21
- package/classnames/index.js +0 -7
- package/classnames/package.json +0 -1
- package/dist/cjs/classnames.development.js +0 -67
- package/dist/cjs/classnames.production.js +0 -1
- package/dist/cjs/promisify.development.js +0 -20
- package/dist/cjs/promisify.production.js +0 -1
- package/dist/cjs/vest.development.js +0 -1616
- package/dist/cjs/vest.production.js +0 -1
- package/dist/es/classnames.development.js +0 -65
- package/dist/es/classnames.production.js +0 -1
- package/dist/es/promisify.development.js +0 -18
- package/dist/es/promisify.production.js +0 -1
- package/dist/es/vest.development.js +0 -1604
- package/dist/es/vest.production.js +0 -1
- package/dist/umd/classnames.development.js +0 -73
- package/dist/umd/classnames.production.js +0 -1
- package/dist/umd/promisify.development.js +0 -26
- package/dist/umd/vest.development.js +0 -1622
- package/dist/umd/vest.production.js +0 -1
- package/index.js +0 -7
- package/promisify/index.js +0 -7
- package/promisify/package.json +0 -1
- package/types/classnames.d.ts +0 -71
- package/types/classnames.d.ts.map +0 -1
- package/types/promisify.d.ts +0 -61
- package/types/promisify.d.ts.map +0 -1
- package/types/vest.d.ts +0 -271
- package/types/vest.d.ts.map +0 -1
|
@@ -1,1604 +0,0 @@
|
|
|
1
|
-
/*! *****************************************************************************
|
|
2
|
-
Copyright (c) Microsoft Corporation.
|
|
3
|
-
|
|
4
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
-
purpose with or without fee is hereby granted.
|
|
6
|
-
|
|
7
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
-
***************************************************************************** */
|
|
15
|
-
var __assign = function () {
|
|
16
|
-
__assign = Object.assign || function __assign(t) {
|
|
17
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
18
|
-
s = arguments[i];
|
|
19
|
-
|
|
20
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return t;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
27
|
-
};
|
|
28
|
-
function __spreadArray(to, from, pack) {
|
|
29
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
30
|
-
if (ar || !(i in from)) {
|
|
31
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
32
|
-
ar[i] = from[i];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return to.concat(ar || from);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
var assign = Object.assign;
|
|
39
|
-
|
|
40
|
-
function mapFirst(array, callback) {
|
|
41
|
-
var broke = false;
|
|
42
|
-
var breakoutValue = null;
|
|
43
|
-
for (var i = 0; i < array.length; i++) {
|
|
44
|
-
callback(array[i], breakout);
|
|
45
|
-
if (broke) {
|
|
46
|
-
return breakoutValue;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function breakout(value) {
|
|
50
|
-
broke = true;
|
|
51
|
-
breakoutValue = value;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Throws a timed out error.
|
|
57
|
-
*/
|
|
58
|
-
function throwError(message, type) {
|
|
59
|
-
if (type === void 0) { type = Error; }
|
|
60
|
-
throw new type(message);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function bindNot(fn) {
|
|
64
|
-
return function () {
|
|
65
|
-
var args = [];
|
|
66
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
67
|
-
args[_i] = arguments[_i];
|
|
68
|
-
}
|
|
69
|
-
return !fn.apply(void 0, args);
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* A safe hasOwnProperty access
|
|
75
|
-
*/
|
|
76
|
-
function hasOwnProperty(obj, key) {
|
|
77
|
-
return Object.prototype.hasOwnProperty.call(obj, key);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function isNumber(value) {
|
|
81
|
-
return Boolean(typeof value === 'number');
|
|
82
|
-
}
|
|
83
|
-
var isNotNumber = bindNot(isNumber);
|
|
84
|
-
|
|
85
|
-
function lengthEquals(value, arg1) {
|
|
86
|
-
return value.length === Number(arg1);
|
|
87
|
-
}
|
|
88
|
-
var lengthNotEquals = bindNot(lengthEquals);
|
|
89
|
-
|
|
90
|
-
function isEmpty(value) {
|
|
91
|
-
if (!value) {
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
else if (isNumber(value)) {
|
|
95
|
-
return value === 0;
|
|
96
|
-
}
|
|
97
|
-
else if (hasOwnProperty(value, 'length')) {
|
|
98
|
-
return lengthEquals(value, 0);
|
|
99
|
-
}
|
|
100
|
-
else if (typeof value === 'object') {
|
|
101
|
-
return lengthEquals(Object.keys(value), 0);
|
|
102
|
-
}
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
var isNotEmpty = bindNot(isEmpty);
|
|
106
|
-
|
|
107
|
-
function failing() {
|
|
108
|
-
return { pass: false };
|
|
109
|
-
}
|
|
110
|
-
function passing() {
|
|
111
|
-
return { pass: true };
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function anyOf(value) {
|
|
115
|
-
var _a;
|
|
116
|
-
var rules = [];
|
|
117
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
118
|
-
rules[_i - 1] = arguments[_i];
|
|
119
|
-
}
|
|
120
|
-
return ((_a = mapFirst(rules, function (rule, breakout) {
|
|
121
|
-
var res = rule.run(value);
|
|
122
|
-
if (res.pass) {
|
|
123
|
-
breakout(res);
|
|
124
|
-
}
|
|
125
|
-
})) !== null && _a !== void 0 ? _a : failing);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function noneOf(value) {
|
|
129
|
-
var _a;
|
|
130
|
-
var rules = [];
|
|
131
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
132
|
-
rules[_i - 1] = arguments[_i];
|
|
133
|
-
}
|
|
134
|
-
return ((_a = mapFirst(rules, function (rule, breakout) {
|
|
135
|
-
var res = rule.run(value);
|
|
136
|
-
if (res.pass) {
|
|
137
|
-
breakout(failing());
|
|
138
|
-
}
|
|
139
|
-
})) !== null && _a !== void 0 ? _a : passing());
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function oneOf(value) {
|
|
143
|
-
var rules = [];
|
|
144
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
145
|
-
rules[_i - 1] = arguments[_i];
|
|
146
|
-
}
|
|
147
|
-
var passing = [];
|
|
148
|
-
rules.every(function (rule) {
|
|
149
|
-
if (passing.length > 1) {
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
var result = rule.run(value);
|
|
153
|
-
if (result.pass) {
|
|
154
|
-
passing.push(result);
|
|
155
|
-
}
|
|
156
|
-
return result.pass;
|
|
157
|
-
});
|
|
158
|
-
return { pass: passing.length === 1 };
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function allOf(value) {
|
|
162
|
-
var _a;
|
|
163
|
-
var rules = [];
|
|
164
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
165
|
-
rules[_i - 1] = arguments[_i];
|
|
166
|
-
}
|
|
167
|
-
return ((_a = mapFirst(rules, function (rule, breakout) {
|
|
168
|
-
var res = rule.run(value);
|
|
169
|
-
if (!res.pass) {
|
|
170
|
-
breakout(res);
|
|
171
|
-
}
|
|
172
|
-
})) !== null && _a !== void 0 ? _a : passing());
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
var compounds = /*#__PURE__*/Object.freeze({
|
|
176
|
-
__proto__: null,
|
|
177
|
-
anyOf: anyOf,
|
|
178
|
-
noneOf: noneOf,
|
|
179
|
-
oneOf: oneOf,
|
|
180
|
-
allOf: allOf
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
function isStringValue (v) {
|
|
184
|
-
return String(v) === v;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function endsWith(value, arg1) {
|
|
188
|
-
return isStringValue(value) && isStringValue(arg1) && value.endsWith(arg1);
|
|
189
|
-
}
|
|
190
|
-
var doesNotEndWith = bindNot(endsWith);
|
|
191
|
-
|
|
192
|
-
function equals(value, arg1) {
|
|
193
|
-
return value === arg1;
|
|
194
|
-
}
|
|
195
|
-
var notEquals = bindNot(equals);
|
|
196
|
-
|
|
197
|
-
function isNumeric(value) {
|
|
198
|
-
var str = String(value);
|
|
199
|
-
var num = Number(value);
|
|
200
|
-
var result = !isNaN(parseFloat(str)) && !isNaN(Number(value)) && isFinite(num);
|
|
201
|
-
return Boolean(result);
|
|
202
|
-
}
|
|
203
|
-
var isNotNumeric = bindNot(isNumeric);
|
|
204
|
-
|
|
205
|
-
function greaterThan(value, gt) {
|
|
206
|
-
return isNumeric(value) && isNumeric(gt) && Number(value) > Number(gt);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function greaterThanOrEquals(value, gte) {
|
|
210
|
-
return isNumeric(value) && isNumeric(gte) && Number(value) >= Number(gte);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function inside(value, arg1) {
|
|
214
|
-
if (Array.isArray(arg1) && /^[s|n|b]/.test(typeof value)) {
|
|
215
|
-
return arg1.indexOf(value) !== -1;
|
|
216
|
-
}
|
|
217
|
-
// both value and arg1 are strings
|
|
218
|
-
if (isStringValue(arg1) && isStringValue(value)) {
|
|
219
|
-
return arg1.indexOf(value) !== -1;
|
|
220
|
-
}
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
var notInside = bindNot(inside);
|
|
224
|
-
|
|
225
|
-
// The module is named "isArrayValue" since it
|
|
226
|
-
// is conflicting with a nested npm dependency.
|
|
227
|
-
// We may need to revisit this in the future.
|
|
228
|
-
function isArray(value) {
|
|
229
|
-
return Boolean(Array.isArray(value));
|
|
230
|
-
}
|
|
231
|
-
var isNotArray = bindNot(isArray);
|
|
232
|
-
|
|
233
|
-
function lessThanOrEquals(value, lte) {
|
|
234
|
-
return isNumeric(value) && isNumeric(lte) && Number(value) <= Number(lte);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
function isBetween(value, min, max) {
|
|
238
|
-
return greaterThanOrEquals(value, min) && lessThanOrEquals(value, max);
|
|
239
|
-
}
|
|
240
|
-
var isNotBetween = bindNot(isBetween);
|
|
241
|
-
|
|
242
|
-
function isBoolean(value) {
|
|
243
|
-
return !!value === value;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
var isNotBoolean = bindNot(isBoolean);
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Validates that a given value is an even number
|
|
250
|
-
*/
|
|
251
|
-
var isEven = function (value) {
|
|
252
|
-
if (isNumeric(value)) {
|
|
253
|
-
return value % 2 === 0;
|
|
254
|
-
}
|
|
255
|
-
return false;
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
function isNaN$1(value) {
|
|
259
|
-
return Number.isNaN(value);
|
|
260
|
-
}
|
|
261
|
-
var isNotNaN = bindNot(isNaN$1);
|
|
262
|
-
|
|
263
|
-
function isNegative(value) {
|
|
264
|
-
if (isNumeric(value)) {
|
|
265
|
-
return Number(value) < 0;
|
|
266
|
-
}
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
var isPositive = bindNot(isNegative);
|
|
270
|
-
|
|
271
|
-
function isNull(value) {
|
|
272
|
-
return value === null;
|
|
273
|
-
}
|
|
274
|
-
var isNotNull = bindNot(isNull);
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Validates that a given value is an odd number
|
|
278
|
-
*/
|
|
279
|
-
var isOdd = function (value) {
|
|
280
|
-
if (isNumeric(value)) {
|
|
281
|
-
return value % 2 !== 0;
|
|
282
|
-
}
|
|
283
|
-
return false;
|
|
284
|
-
};
|
|
285
|
-
|
|
286
|
-
var isNotString = bindNot(isStringValue);
|
|
287
|
-
|
|
288
|
-
function isTruthy(value) {
|
|
289
|
-
return !!value;
|
|
290
|
-
}
|
|
291
|
-
var isFalsy = bindNot(isTruthy);
|
|
292
|
-
|
|
293
|
-
function isUndefined(value) {
|
|
294
|
-
return value === undefined;
|
|
295
|
-
}
|
|
296
|
-
var isNotUndefined = bindNot(isUndefined);
|
|
297
|
-
|
|
298
|
-
function lessThan(value, lt) {
|
|
299
|
-
return isNumeric(value) && isNumeric(lt) && Number(value) < Number(lt);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
function longerThan(value, arg1) {
|
|
303
|
-
return value.length > Number(arg1);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function longerThanOrEquals(value, arg1) {
|
|
307
|
-
return value.length >= Number(arg1);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
function matches(value, regex) {
|
|
311
|
-
if (regex instanceof RegExp) {
|
|
312
|
-
return regex.test(value);
|
|
313
|
-
}
|
|
314
|
-
else if (isStringValue(regex)) {
|
|
315
|
-
return new RegExp(regex).test(value);
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
var notMatches = bindNot(matches);
|
|
322
|
-
|
|
323
|
-
function numberEquals(value, eq) {
|
|
324
|
-
return isNumeric(value) && isNumeric(eq) && Number(value) === Number(eq);
|
|
325
|
-
}
|
|
326
|
-
var numberNotEquals = bindNot(numberEquals);
|
|
327
|
-
|
|
328
|
-
function shorterThan(value, arg1) {
|
|
329
|
-
return value.length < Number(arg1);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function shorterThanOrEquals(value, arg1) {
|
|
333
|
-
return value.length <= Number(arg1);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
function startsWith(value, arg1) {
|
|
337
|
-
return isStringValue(value) && isStringValue(arg1) && value.startsWith(arg1);
|
|
338
|
-
}
|
|
339
|
-
var doesNotStartWith = bindNot(startsWith);
|
|
340
|
-
|
|
341
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
342
|
-
function rules() {
|
|
343
|
-
return {
|
|
344
|
-
doesNotEndWith: doesNotEndWith,
|
|
345
|
-
doesNotStartWith: doesNotStartWith,
|
|
346
|
-
endsWith: endsWith,
|
|
347
|
-
equals: equals,
|
|
348
|
-
greaterThan: greaterThan,
|
|
349
|
-
greaterThanOrEquals: greaterThanOrEquals,
|
|
350
|
-
gt: greaterThan,
|
|
351
|
-
gte: greaterThanOrEquals,
|
|
352
|
-
inside: inside,
|
|
353
|
-
isArray: isArray,
|
|
354
|
-
isBetween: isBetween,
|
|
355
|
-
isBoolean: isBoolean,
|
|
356
|
-
isEmpty: isEmpty,
|
|
357
|
-
isEven: isEven,
|
|
358
|
-
isFalsy: isFalsy,
|
|
359
|
-
isNaN: isNaN$1,
|
|
360
|
-
isNegative: isNegative,
|
|
361
|
-
isNotArray: isNotArray,
|
|
362
|
-
isNotBetween: isNotBetween,
|
|
363
|
-
isNotBoolean: isNotBoolean,
|
|
364
|
-
isNotEmpty: isNotEmpty,
|
|
365
|
-
isNotNaN: isNotNaN,
|
|
366
|
-
isNotNull: isNotNull,
|
|
367
|
-
isNotNumber: isNotNumber,
|
|
368
|
-
isNotNumeric: isNotNumeric,
|
|
369
|
-
isNotString: isNotString,
|
|
370
|
-
isNotUndefined: isNotUndefined,
|
|
371
|
-
isNull: isNull,
|
|
372
|
-
isNumber: isNumber,
|
|
373
|
-
isNumeric: isNumeric,
|
|
374
|
-
isOdd: isOdd,
|
|
375
|
-
isPositive: isPositive,
|
|
376
|
-
isString: isStringValue,
|
|
377
|
-
isTruthy: isTruthy,
|
|
378
|
-
isUndefined: isUndefined,
|
|
379
|
-
lengthEquals: lengthEquals,
|
|
380
|
-
lengthNotEquals: lengthNotEquals,
|
|
381
|
-
lessThan: lessThan,
|
|
382
|
-
lessThanOrEquals: lessThanOrEquals,
|
|
383
|
-
longerThan: longerThan,
|
|
384
|
-
longerThanOrEquals: longerThanOrEquals,
|
|
385
|
-
lt: lessThan,
|
|
386
|
-
lte: lessThanOrEquals,
|
|
387
|
-
matches: matches,
|
|
388
|
-
notEquals: notEquals,
|
|
389
|
-
notInside: notInside,
|
|
390
|
-
notMatches: notMatches,
|
|
391
|
-
numberEquals: numberEquals,
|
|
392
|
-
numberNotEquals: numberNotEquals,
|
|
393
|
-
shorterThan: shorterThan,
|
|
394
|
-
shorterThanOrEquals: shorterThanOrEquals,
|
|
395
|
-
startsWith: startsWith
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
var baseRules = rules();
|
|
400
|
-
function getRule(ruleName) {
|
|
401
|
-
var _a;
|
|
402
|
-
return ((_a = baseRules[ruleName]) !== null && _a !== void 0 ? _a : compounds[ruleName] // eslint-disable-line import/namespace
|
|
403
|
-
);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
function isFunction(value) {
|
|
407
|
-
return typeof value === 'function';
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
function optionalFunctionValue(value) {
|
|
411
|
-
var args = [];
|
|
412
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
413
|
-
args[_i - 1] = arguments[_i];
|
|
414
|
-
}
|
|
415
|
-
return isFunction(value) ? value.apply(void 0, args) : value;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/**
|
|
419
|
-
* Transform the result of a rule into a standard format
|
|
420
|
-
*/
|
|
421
|
-
function transformResult(result, ruleName, value) {
|
|
422
|
-
var args = [];
|
|
423
|
-
for (var _i = 3; _i < arguments.length; _i++) {
|
|
424
|
-
args[_i - 3] = arguments[_i];
|
|
425
|
-
}
|
|
426
|
-
var defaultResult = getDefaultResult(value);
|
|
427
|
-
validateResult(result);
|
|
428
|
-
// if result is boolean
|
|
429
|
-
if (isBoolean(result)) {
|
|
430
|
-
return {
|
|
431
|
-
pass: result
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
else {
|
|
435
|
-
return __assign(__assign(__assign({}, defaultResult), { pass: result.pass }), (result.message && {
|
|
436
|
-
message: optionalFunctionValue.apply(void 0, __spreadArray([result.message,
|
|
437
|
-
ruleName,
|
|
438
|
-
value], args))
|
|
439
|
-
}));
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
function validateResult(result) {
|
|
443
|
-
// if result is boolean, or if result.pass is boolean
|
|
444
|
-
if (isBoolean(result) || (result && isBoolean(result.pass))) {
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
{
|
|
448
|
-
throwError('Incorrect return value for rule: ' + JSON.stringify(result));
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
function getDefaultResult(value) {
|
|
452
|
-
return {
|
|
453
|
-
message: "invalid " + typeof value + " value"
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
function EnforceBase(value) {
|
|
458
|
-
var proxy = new Proxy({}, {
|
|
459
|
-
get: function (_, ruleName) {
|
|
460
|
-
var rule = getRule(ruleName);
|
|
461
|
-
if (rule) {
|
|
462
|
-
return function () {
|
|
463
|
-
var args = [];
|
|
464
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
465
|
-
args[_i] = arguments[_i];
|
|
466
|
-
}
|
|
467
|
-
var transformedResult = transformResult.apply(void 0, __spreadArray([rule.apply(void 0, __spreadArray([value], args)), ruleName,
|
|
468
|
-
value], args));
|
|
469
|
-
if (!transformedResult.pass) {
|
|
470
|
-
if (isEmpty(transformedResult.message)) {
|
|
471
|
-
throwError("enforce/" + ruleName + " failed with " + JSON.stringify(value));
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
throw transformedResult.message;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return proxy;
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
return proxy;
|
|
483
|
-
}
|
|
484
|
-
var enforce = new Proxy(EnforceBase, {
|
|
485
|
-
get: function (_, key) {
|
|
486
|
-
var registeredRules = [];
|
|
487
|
-
if (key === 'extend') {
|
|
488
|
-
return function extend(customRules) {
|
|
489
|
-
assign(baseRules, customRules);
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
if (!getRule(key)) {
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
return addRegisteredRule(key);
|
|
496
|
-
function addRegisteredRule(ruleName) {
|
|
497
|
-
return function () {
|
|
498
|
-
var args = [];
|
|
499
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
500
|
-
args[_i] = arguments[_i];
|
|
501
|
-
}
|
|
502
|
-
var rule = getRule(ruleName);
|
|
503
|
-
registeredRules.push(function (value) {
|
|
504
|
-
return transformResult.apply(void 0, __spreadArray([rule.apply(void 0, __spreadArray([value], args)), ruleName, value], args));
|
|
505
|
-
});
|
|
506
|
-
var proxy = new Proxy({}, {
|
|
507
|
-
get: function (_, key) {
|
|
508
|
-
if (getRule(key)) {
|
|
509
|
-
return addRegisteredRule(key);
|
|
510
|
-
}
|
|
511
|
-
if (key === 'run') {
|
|
512
|
-
return function (value) {
|
|
513
|
-
var _a;
|
|
514
|
-
return ((_a = mapFirst(registeredRules, function (rule, breakout) {
|
|
515
|
-
var res = rule(value);
|
|
516
|
-
if (!res.pass) {
|
|
517
|
-
breakout(res);
|
|
518
|
-
}
|
|
519
|
-
})) !== null && _a !== void 0 ? _a : passing());
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
if (key === 'test') {
|
|
523
|
-
return function (value) { return proxy.run(value).pass; };
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
return proxy;
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
function asArray(possibleArg) {
|
|
534
|
-
return [].concat(possibleArg);
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
/**
|
|
538
|
-
* @returns a unique numeric id.
|
|
539
|
-
*/
|
|
540
|
-
var genId = (function (n) { return function () {
|
|
541
|
-
return "" + n++;
|
|
542
|
-
}; })(0);
|
|
543
|
-
|
|
544
|
-
function createState(onStateChange) {
|
|
545
|
-
var state = {
|
|
546
|
-
references: []
|
|
547
|
-
};
|
|
548
|
-
var registrations = [];
|
|
549
|
-
return {
|
|
550
|
-
registerStateKey: registerStateKey,
|
|
551
|
-
reset: reset
|
|
552
|
-
};
|
|
553
|
-
/**
|
|
554
|
-
* Registers a new key in the state, takes the initial value (may be a function that returns the initial value), returns a function.
|
|
555
|
-
*
|
|
556
|
-
* @example
|
|
557
|
-
*
|
|
558
|
-
* const useColor = state.registerStateKey("blue");
|
|
559
|
-
*
|
|
560
|
-
* let [color, setColor] = useColor(); // -> ["blue", Function]
|
|
561
|
-
*
|
|
562
|
-
* setColor("green");
|
|
563
|
-
*
|
|
564
|
-
* useColor()[0]; -> "green"
|
|
565
|
-
*/
|
|
566
|
-
function registerStateKey(initialState, onUpdate) {
|
|
567
|
-
var key = registrations.length;
|
|
568
|
-
registrations.push([initialState, onUpdate]);
|
|
569
|
-
return initKey(key, initialState);
|
|
570
|
-
}
|
|
571
|
-
function reset() {
|
|
572
|
-
state.references = [];
|
|
573
|
-
registrations.forEach(function (_a, index) {
|
|
574
|
-
var initialValue = _a[0];
|
|
575
|
-
return initKey(index, initialValue);
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
function initKey(key, initialState) {
|
|
579
|
-
current().push();
|
|
580
|
-
set(key, optionalFunctionValue(initialState));
|
|
581
|
-
return function useStateKey() {
|
|
582
|
-
return [
|
|
583
|
-
current()[key],
|
|
584
|
-
function (nextState) {
|
|
585
|
-
return set(key, optionalFunctionValue(nextState, current()[key]));
|
|
586
|
-
},
|
|
587
|
-
];
|
|
588
|
-
};
|
|
589
|
-
}
|
|
590
|
-
function current() {
|
|
591
|
-
return state.references;
|
|
592
|
-
}
|
|
593
|
-
function set(index, value) {
|
|
594
|
-
var prevValue = state.references[index];
|
|
595
|
-
state.references[index] = value;
|
|
596
|
-
var _a = registrations[index], onUpdate = _a[1];
|
|
597
|
-
if (isFunction(onUpdate)) {
|
|
598
|
-
onUpdate(value, prevValue);
|
|
599
|
-
}
|
|
600
|
-
if (isFunction(onStateChange)) {
|
|
601
|
-
onStateChange();
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
function createStateRef(state, _a) {
|
|
607
|
-
var suiteId = _a.suiteId;
|
|
608
|
-
return {
|
|
609
|
-
carryOverTests: state.registerStateKey(function () { return []; }),
|
|
610
|
-
lagging: state.registerStateKey(function () { return []; }),
|
|
611
|
-
optionalFields: state.registerStateKey(function () { return ({}); }),
|
|
612
|
-
pending: state.registerStateKey(function () { return []; }),
|
|
613
|
-
skippedTests: state.registerStateKey(function () { return []; }),
|
|
614
|
-
suiteId: state.registerStateKey(function () { return suiteId; }),
|
|
615
|
-
testCallbacks: state.registerStateKey(function () { return ({
|
|
616
|
-
fieldCallbacks: {},
|
|
617
|
-
doneCallbacks: []
|
|
618
|
-
}); }),
|
|
619
|
-
testObjects: state.registerStateKey(function () { return []; })
|
|
620
|
-
};
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
function createContext(init) {
|
|
624
|
-
var storage = { ancestry: [] };
|
|
625
|
-
return {
|
|
626
|
-
bind: bind,
|
|
627
|
-
run: run,
|
|
628
|
-
use: use,
|
|
629
|
-
useX: useX
|
|
630
|
-
};
|
|
631
|
-
function useX(errorMessage) {
|
|
632
|
-
var _a;
|
|
633
|
-
return ((_a = storage.ctx) !== null && _a !== void 0 ? _a : throwError(errorMessage !== null && errorMessage !== void 0 ? errorMessage : 'Context was used after it was closed'));
|
|
634
|
-
}
|
|
635
|
-
function run(ctxRef, fn) {
|
|
636
|
-
var _a;
|
|
637
|
-
var parentContext = use();
|
|
638
|
-
var out = __assign(__assign({}, (parentContext ? parentContext : {})), ((_a = init === null || init === void 0 ? void 0 : init(ctxRef, parentContext)) !== null && _a !== void 0 ? _a : ctxRef));
|
|
639
|
-
var ctx = set(Object.freeze(out));
|
|
640
|
-
storage.ancestry.unshift(ctx);
|
|
641
|
-
var res = fn(ctx);
|
|
642
|
-
clear();
|
|
643
|
-
return res;
|
|
644
|
-
}
|
|
645
|
-
function bind(ctxRef, fn) {
|
|
646
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
647
|
-
// @ts-ignore - this one's pretty hard to get right
|
|
648
|
-
var returnedFn = function () {
|
|
649
|
-
var runTimeArgs = [];
|
|
650
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
651
|
-
runTimeArgs[_i] = arguments[_i];
|
|
652
|
-
}
|
|
653
|
-
return run(ctxRef, function () {
|
|
654
|
-
return fn.apply(void 0, runTimeArgs);
|
|
655
|
-
});
|
|
656
|
-
};
|
|
657
|
-
return returnedFn;
|
|
658
|
-
}
|
|
659
|
-
function use() {
|
|
660
|
-
return storage.ctx;
|
|
661
|
-
}
|
|
662
|
-
function set(value) {
|
|
663
|
-
return (storage.ctx = value);
|
|
664
|
-
}
|
|
665
|
-
function clear() {
|
|
666
|
-
var _a;
|
|
667
|
-
storage.ancestry.shift();
|
|
668
|
-
set((_a = storage.ancestry[0]) !== null && _a !== void 0 ? _a : null);
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
var ctx = createContext(function (ctxRef, parentContext) {
|
|
673
|
-
return parentContext
|
|
674
|
-
? null
|
|
675
|
-
: assign({}, {
|
|
676
|
-
exclusion: {
|
|
677
|
-
tests: {},
|
|
678
|
-
groups: {}
|
|
679
|
-
}
|
|
680
|
-
}, ctxRef);
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
/**
|
|
684
|
-
* Creates a cache function
|
|
685
|
-
*/
|
|
686
|
-
function createCache(maxSize) {
|
|
687
|
-
if (maxSize === void 0) { maxSize = 10; }
|
|
688
|
-
var cacheStorage = [];
|
|
689
|
-
/**
|
|
690
|
-
* @param {any[]} deps dependency array.
|
|
691
|
-
* @param {Function} cache action function.
|
|
692
|
-
*/
|
|
693
|
-
var cache = function (deps, cacheAction) {
|
|
694
|
-
var cacheHit = cache.get(deps);
|
|
695
|
-
// cache hit is not null
|
|
696
|
-
if (cacheHit) {
|
|
697
|
-
return cacheHit[1];
|
|
698
|
-
}
|
|
699
|
-
var result = cacheAction();
|
|
700
|
-
cacheStorage.unshift([deps.concat(), result]);
|
|
701
|
-
if (cacheStorage.length > maxSize) {
|
|
702
|
-
cacheStorage.length = maxSize;
|
|
703
|
-
}
|
|
704
|
-
return result;
|
|
705
|
-
};
|
|
706
|
-
/**
|
|
707
|
-
* Retrieves an item from the cache.
|
|
708
|
-
* @param {deps} deps Dependency array
|
|
709
|
-
*/
|
|
710
|
-
cache.get = function (deps) {
|
|
711
|
-
return cacheStorage[cacheStorage.findIndex(function (_a) {
|
|
712
|
-
var cachedDeps = _a[0];
|
|
713
|
-
return lengthEquals(deps, cachedDeps.length) &&
|
|
714
|
-
deps.every(function (dep, i) { return dep === cachedDeps[i]; });
|
|
715
|
-
})] || null;
|
|
716
|
-
};
|
|
717
|
-
return cache;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
function useCarryOverTests() {
|
|
721
|
-
return useStateRef().carryOverTests();
|
|
722
|
-
}
|
|
723
|
-
function usePending() {
|
|
724
|
-
return useStateRef().pending();
|
|
725
|
-
}
|
|
726
|
-
function useLagging() {
|
|
727
|
-
return useStateRef().lagging();
|
|
728
|
-
}
|
|
729
|
-
function useSuiteId() {
|
|
730
|
-
return useStateRef().suiteId();
|
|
731
|
-
}
|
|
732
|
-
function useTestCallbacks() {
|
|
733
|
-
return useStateRef().testCallbacks();
|
|
734
|
-
}
|
|
735
|
-
function useTestObjects() {
|
|
736
|
-
return useStateRef().testObjects();
|
|
737
|
-
}
|
|
738
|
-
function useSkippedTests() {
|
|
739
|
-
return useStateRef().skippedTests();
|
|
740
|
-
}
|
|
741
|
-
function useOptionalFields() {
|
|
742
|
-
return useStateRef().optionalFields();
|
|
743
|
-
}
|
|
744
|
-
function useStateRef() {
|
|
745
|
-
return ctx.useX().stateRef;
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
/**
|
|
749
|
-
* Checks if a given tests, or the suite as a whole still have remaining tests.
|
|
750
|
-
*/
|
|
751
|
-
function hasRemainingTests(fieldName) {
|
|
752
|
-
var pending = usePending()[0];
|
|
753
|
-
var lagging = useLagging()[0];
|
|
754
|
-
var allIncomplete = pending.concat(lagging);
|
|
755
|
-
if (isEmpty(allIncomplete)) {
|
|
756
|
-
return false;
|
|
757
|
-
}
|
|
758
|
-
if (fieldName) {
|
|
759
|
-
return allIncomplete.some(function (testObject) { return testObject.fieldName === fieldName; });
|
|
760
|
-
}
|
|
761
|
-
return isNotEmpty(allIncomplete);
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
/**
|
|
765
|
-
* Reads the testObjects list and gets full validation result from it.
|
|
766
|
-
*/
|
|
767
|
-
function genTestsSummary() {
|
|
768
|
-
var testObjects = useTestObjects()[0];
|
|
769
|
-
var skippedTests = useSkippedTests()[0];
|
|
770
|
-
var summary = {
|
|
771
|
-
errorCount: 0,
|
|
772
|
-
groups: {},
|
|
773
|
-
testCount: 0,
|
|
774
|
-
tests: {},
|
|
775
|
-
warnCount: 0
|
|
776
|
-
};
|
|
777
|
-
appendSummary(testObjects);
|
|
778
|
-
appendSummary(skippedTests, true);
|
|
779
|
-
return countFailures(summary);
|
|
780
|
-
function appendSummary(testObjects, skipped) {
|
|
781
|
-
testObjects.forEach(function (testObject) {
|
|
782
|
-
var fieldName = testObject.fieldName, groupName = testObject.groupName;
|
|
783
|
-
summary.tests[fieldName] = genTestObject(summary.tests, testObject, skipped);
|
|
784
|
-
if (groupName) {
|
|
785
|
-
summary.groups[groupName] = summary.groups[groupName] || {};
|
|
786
|
-
summary.groups[groupName][fieldName] = genTestObject(summary.groups[groupName], testObject, skipped);
|
|
787
|
-
}
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
/**
|
|
792
|
-
* Counts the failed tests and adds global counters
|
|
793
|
-
*/
|
|
794
|
-
function countFailures(summary) {
|
|
795
|
-
for (var test in summary.tests) {
|
|
796
|
-
summary.errorCount += summary.tests[test].errorCount;
|
|
797
|
-
summary.warnCount += summary.tests[test].warnCount;
|
|
798
|
-
summary.testCount += summary.tests[test].testCount;
|
|
799
|
-
}
|
|
800
|
-
return summary;
|
|
801
|
-
}
|
|
802
|
-
function genTestObject(summaryKey, testObject, skipped) {
|
|
803
|
-
var fieldName = testObject.fieldName, isWarning = testObject.isWarning, failed = testObject.failed, message = testObject.message;
|
|
804
|
-
summaryKey[fieldName] = summaryKey[fieldName] || {
|
|
805
|
-
errorCount: 0,
|
|
806
|
-
warnCount: 0,
|
|
807
|
-
testCount: 0
|
|
808
|
-
};
|
|
809
|
-
var testKey = summaryKey[fieldName];
|
|
810
|
-
if (skipped) {
|
|
811
|
-
return testKey;
|
|
812
|
-
}
|
|
813
|
-
summaryKey[fieldName].testCount++;
|
|
814
|
-
// Adds to severity group
|
|
815
|
-
function addTo(countKey, group) {
|
|
816
|
-
testKey[countKey]++;
|
|
817
|
-
if (message) {
|
|
818
|
-
testKey[group] = (testKey[group] || []).concat(message);
|
|
819
|
-
}
|
|
820
|
-
}
|
|
821
|
-
if (failed) {
|
|
822
|
-
if (isWarning) {
|
|
823
|
-
addTo('warnCount', 'warnings');
|
|
824
|
-
}
|
|
825
|
-
else {
|
|
826
|
-
addTo('errorCount', 'errors');
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
return testKey;
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
function nonMatchingFieldName(testObject, fieldName) {
|
|
833
|
-
return !!(fieldName && testObject.fieldName !== fieldName);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
function either(a, b) {
|
|
837
|
-
return !!a !== !!b;
|
|
838
|
-
}
|
|
839
|
-
|
|
840
|
-
/**
|
|
841
|
-
* Checks that a given test object matches the currently specified severity level
|
|
842
|
-
*/
|
|
843
|
-
function nonMatchingSeverityProfile(severity, testObject) {
|
|
844
|
-
return either(severity === 'warnings', testObject.isWarning);
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
function collectFailureMessages(severity, testObjects, options) {
|
|
848
|
-
var _a;
|
|
849
|
-
if (options === void 0) { options = {}; }
|
|
850
|
-
var _b = options || {}, group = _b.group, fieldName = _b.fieldName;
|
|
851
|
-
var res = testObjects.reduce(function (collector, testObject) {
|
|
852
|
-
if (noMatch(testObject, severity, group, fieldName)) {
|
|
853
|
-
return collector;
|
|
854
|
-
}
|
|
855
|
-
if (!testObject.failed) {
|
|
856
|
-
return collector;
|
|
857
|
-
}
|
|
858
|
-
collector[testObject.fieldName] = (collector[testObject.fieldName] || []).concat(testObject.message || []);
|
|
859
|
-
return collector;
|
|
860
|
-
}, __assign({}, (fieldName && (_a = {}, _a[fieldName] = [], _a))));
|
|
861
|
-
return res;
|
|
862
|
-
}
|
|
863
|
-
function noGroupMatch(testObject, groupName) {
|
|
864
|
-
return !!(groupName && testObject.groupName !== groupName);
|
|
865
|
-
}
|
|
866
|
-
function noMatch(testObject, severity, group, fieldName) {
|
|
867
|
-
if (noGroupMatch(testObject, group)) {
|
|
868
|
-
return true;
|
|
869
|
-
}
|
|
870
|
-
if (nonMatchingFieldName(testObject, fieldName)) {
|
|
871
|
-
return true;
|
|
872
|
-
}
|
|
873
|
-
if (nonMatchingSeverityProfile(severity, testObject)) {
|
|
874
|
-
return true;
|
|
875
|
-
}
|
|
876
|
-
return false;
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
function getErrors(fieldName) {
|
|
880
|
-
return getFailures('errors', fieldName);
|
|
881
|
-
}
|
|
882
|
-
function getWarnings(fieldName) {
|
|
883
|
-
return getFailures('warnings', fieldName);
|
|
884
|
-
}
|
|
885
|
-
/**
|
|
886
|
-
* @returns suite or field's errors or warnings.
|
|
887
|
-
*/
|
|
888
|
-
function getFailures(severityKey, fieldName) {
|
|
889
|
-
var testObjects = useTestObjects()[0];
|
|
890
|
-
var failureMessages = collectFailureMessages(severityKey, testObjects, {
|
|
891
|
-
fieldName: fieldName
|
|
892
|
-
});
|
|
893
|
-
if (fieldName) {
|
|
894
|
-
return failureMessages[fieldName];
|
|
895
|
-
}
|
|
896
|
-
return failureMessages;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
function getErrorsByGroup(groupName, fieldName) {
|
|
900
|
-
var errors = getByGroup('errors', groupName, fieldName);
|
|
901
|
-
if (fieldName) {
|
|
902
|
-
return errors[fieldName];
|
|
903
|
-
}
|
|
904
|
-
return errors;
|
|
905
|
-
}
|
|
906
|
-
function getWarningsByGroup(groupName, fieldName) {
|
|
907
|
-
var errors = getByGroup('warnings', groupName, fieldName);
|
|
908
|
-
if (fieldName) {
|
|
909
|
-
return errors[fieldName];
|
|
910
|
-
}
|
|
911
|
-
return errors;
|
|
912
|
-
}
|
|
913
|
-
/**
|
|
914
|
-
* Gets failure messages by group.
|
|
915
|
-
*/
|
|
916
|
-
function getByGroup(severityKey, group, fieldName) {
|
|
917
|
-
if (!group) {
|
|
918
|
-
throwError("get" + severityKey[0].toUpperCase() + severityKey.slice(1) + "ByGroup requires a group name. Received `" + group + "` instead.");
|
|
919
|
-
}
|
|
920
|
-
var testObjects = useTestObjects()[0];
|
|
921
|
-
var failureMessages = collectFailureMessages(severityKey, testObjects, {
|
|
922
|
-
group: group,
|
|
923
|
-
fieldName: fieldName
|
|
924
|
-
});
|
|
925
|
-
return failureMessages;
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
/**
|
|
929
|
-
* Determines whether a certain test profile has failures.
|
|
930
|
-
*/
|
|
931
|
-
function hasFailuresLogic(testObject, severityKey, fieldName) {
|
|
932
|
-
if (!testObject.failed) {
|
|
933
|
-
return false;
|
|
934
|
-
}
|
|
935
|
-
if (nonMatchingFieldName(testObject, fieldName)) {
|
|
936
|
-
return false;
|
|
937
|
-
}
|
|
938
|
-
if (nonMatchingSeverityProfile(severityKey, testObject)) {
|
|
939
|
-
return false;
|
|
940
|
-
}
|
|
941
|
-
return true;
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
function hasErrors(fieldName) {
|
|
945
|
-
return has('errors', fieldName);
|
|
946
|
-
}
|
|
947
|
-
function hasWarnings(fieldName) {
|
|
948
|
-
return has('warnings', fieldName);
|
|
949
|
-
}
|
|
950
|
-
function has(severityKey, fieldName) {
|
|
951
|
-
var testObjects = useTestObjects()[0];
|
|
952
|
-
return testObjects.some(function (testObject) {
|
|
953
|
-
return hasFailuresLogic(testObject, severityKey, fieldName);
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
function hasErrorsByGroup(groupName, fieldName) {
|
|
958
|
-
return hasByGroup('errors', groupName, fieldName);
|
|
959
|
-
}
|
|
960
|
-
function hasWarningsByGroup(groupName, fieldName) {
|
|
961
|
-
return hasByGroup('warnings', groupName, fieldName);
|
|
962
|
-
}
|
|
963
|
-
/**
|
|
964
|
-
* Checks whether there are failures in a given group.
|
|
965
|
-
*/
|
|
966
|
-
function hasByGroup(severityKey, group, fieldName) {
|
|
967
|
-
var testObjects = useTestObjects()[0];
|
|
968
|
-
return testObjects.some(function (testObject) {
|
|
969
|
-
if (group !== testObject.groupName) {
|
|
970
|
-
return false;
|
|
971
|
-
}
|
|
972
|
-
return hasFailuresLogic(testObject, severityKey, fieldName);
|
|
973
|
-
});
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
function isValid(result) {
|
|
977
|
-
if (result.hasErrors()) {
|
|
978
|
-
return false;
|
|
979
|
-
}
|
|
980
|
-
var testObjects = useTestObjects()[0];
|
|
981
|
-
if (isEmpty(testObjects)) {
|
|
982
|
-
return false;
|
|
983
|
-
}
|
|
984
|
-
var pending = usePending()[0];
|
|
985
|
-
var lagging = useLagging()[0];
|
|
986
|
-
if (isNotEmpty(pending.concat(lagging).filter(function (testObject) { return !testObject.isWarning; }))) {
|
|
987
|
-
return false;
|
|
988
|
-
}
|
|
989
|
-
return noMissingRequiredTestRuns(result);
|
|
990
|
-
}
|
|
991
|
-
function noMissingRequiredTestRuns(result) {
|
|
992
|
-
var optionalFields = useOptionalFields()[0];
|
|
993
|
-
for (var test in result.tests) {
|
|
994
|
-
if (!optionalFields[test] && result.tests[test].testCount === 0) {
|
|
995
|
-
return false;
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
return true;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
var cache$1 = createCache(20);
|
|
1002
|
-
function produceDraft() {
|
|
1003
|
-
var testObjects = useTestObjects()[0];
|
|
1004
|
-
var ctxRef = { stateRef: useStateRef() };
|
|
1005
|
-
return cache$1([testObjects], ctx.bind(ctxRef, function () {
|
|
1006
|
-
return __assign(__assign({}, genTestsSummary()), { getErrors: ctx.bind(ctxRef, getErrors), getErrorsByGroup: ctx.bind(ctxRef, getErrorsByGroup), getWarnings: ctx.bind(ctxRef, getWarnings), getWarningsByGroup: ctx.bind(ctxRef, getWarningsByGroup), hasErrors: ctx.bind(ctxRef, hasErrors), hasErrorsByGroup: ctx.bind(ctxRef, hasErrorsByGroup), hasWarnings: ctx.bind(ctxRef, hasWarnings), hasWarningsByGroup: ctx.bind(ctxRef, hasWarningsByGroup), isValid: ctx.bind(ctxRef, function () { return isValid(produceDraft()); }) });
|
|
1007
|
-
}));
|
|
1008
|
-
}
|
|
1009
|
-
|
|
1010
|
-
var cache = createCache(20);
|
|
1011
|
-
function produceFullResult() {
|
|
1012
|
-
var testObjects = useTestObjects()[0];
|
|
1013
|
-
var ctxRef = { stateRef: useStateRef() };
|
|
1014
|
-
return cache([testObjects], ctx.bind(ctxRef, function () {
|
|
1015
|
-
return assign({}, produceDraft(), {
|
|
1016
|
-
done: ctx.bind(ctxRef, done)
|
|
1017
|
-
});
|
|
1018
|
-
}));
|
|
1019
|
-
}
|
|
1020
|
-
function shouldSkipDoneRegistration(callback, fieldName, output) {
|
|
1021
|
-
// If we do not have any test runs for the current field
|
|
1022
|
-
return !!(!isFunction(callback) ||
|
|
1023
|
-
(fieldName &&
|
|
1024
|
-
(!output.tests[fieldName] || output.tests[fieldName].testCount === 0)));
|
|
1025
|
-
}
|
|
1026
|
-
function shouldRunDoneCallback(fieldName) {
|
|
1027
|
-
// is suite finished || field name exists, and test is finished;
|
|
1028
|
-
return !!(!hasRemainingTests() ||
|
|
1029
|
-
(fieldName && !hasRemainingTests(fieldName)));
|
|
1030
|
-
}
|
|
1031
|
-
/**
|
|
1032
|
-
* Registers done callbacks.
|
|
1033
|
-
* @register {Object} Vest output object.
|
|
1034
|
-
*/
|
|
1035
|
-
var done = function done() {
|
|
1036
|
-
var args = [];
|
|
1037
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1038
|
-
args[_i] = arguments[_i];
|
|
1039
|
-
}
|
|
1040
|
-
var _a = args.reverse(), callback = _a[0], fieldName = _a[1];
|
|
1041
|
-
var stateRef = useStateRef();
|
|
1042
|
-
var output = produceFullResult();
|
|
1043
|
-
if (shouldSkipDoneRegistration(callback, fieldName, output)) {
|
|
1044
|
-
return output;
|
|
1045
|
-
}
|
|
1046
|
-
var deferredCallback = ctx.bind({ stateRef: stateRef }, function () {
|
|
1047
|
-
return callback(produceDraft());
|
|
1048
|
-
});
|
|
1049
|
-
if (shouldRunDoneCallback(fieldName)) {
|
|
1050
|
-
deferredCallback();
|
|
1051
|
-
return output;
|
|
1052
|
-
}
|
|
1053
|
-
var _b = useTestCallbacks(), setTestCallbacks = _b[1];
|
|
1054
|
-
setTestCallbacks(function (current) {
|
|
1055
|
-
if (fieldName) {
|
|
1056
|
-
current.fieldCallbacks[fieldName] = (current.fieldCallbacks[fieldName] || []).concat(deferredCallback);
|
|
1057
|
-
}
|
|
1058
|
-
else {
|
|
1059
|
-
current.doneCallbacks.push(deferredCallback);
|
|
1060
|
-
}
|
|
1061
|
-
return current;
|
|
1062
|
-
});
|
|
1063
|
-
return output;
|
|
1064
|
-
};
|
|
1065
|
-
|
|
1066
|
-
function create(suiteCallback) {
|
|
1067
|
-
if (!isFunction(suiteCallback)) {
|
|
1068
|
-
throwError('Suite initialization error. Expected `tests` to be a function.');
|
|
1069
|
-
}
|
|
1070
|
-
var handlers = [];
|
|
1071
|
-
var state = createState(function () {
|
|
1072
|
-
handlers.forEach(function (fn) {
|
|
1073
|
-
return fn({
|
|
1074
|
-
suiteState: stateRef,
|
|
1075
|
-
type: 'suiteStateUpdate'
|
|
1076
|
-
});
|
|
1077
|
-
});
|
|
1078
|
-
});
|
|
1079
|
-
var stateRef = createStateRef(state, { suiteId: genId() });
|
|
1080
|
-
var suite = assign(ctx.bind({ stateRef: stateRef }, function () {
|
|
1081
|
-
var args = [];
|
|
1082
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1083
|
-
args[_i] = arguments[_i];
|
|
1084
|
-
}
|
|
1085
|
-
var previousTestObjects = useTestObjects()[0];
|
|
1086
|
-
var _a = useCarryOverTests(), setCarryOverTests = _a[1];
|
|
1087
|
-
var pending = usePending()[0];
|
|
1088
|
-
var _b = useLagging(), prevLagging = _b[0], setLagging = _b[1];
|
|
1089
|
-
state.reset();
|
|
1090
|
-
setCarryOverTests(function () { return previousTestObjects; });
|
|
1091
|
-
// Move all the active pending tests to the lagging array
|
|
1092
|
-
setLagging(pending.concat(prevLagging));
|
|
1093
|
-
// Run the consumer's callback
|
|
1094
|
-
suiteCallback.apply(void 0, args);
|
|
1095
|
-
var res = produceFullResult();
|
|
1096
|
-
return res;
|
|
1097
|
-
}), {
|
|
1098
|
-
get: ctx.bind({ stateRef: stateRef }, produceDraft),
|
|
1099
|
-
remove: ctx.bind({ stateRef: stateRef }, function (name) {
|
|
1100
|
-
var testObjects = useTestObjects()[0];
|
|
1101
|
-
// We're mutating the array in `cancel`, so we have to first copy it.
|
|
1102
|
-
asArray(testObjects).forEach(function (testObject) {
|
|
1103
|
-
if (testObject.fieldName === name) {
|
|
1104
|
-
testObject.cancel();
|
|
1105
|
-
}
|
|
1106
|
-
});
|
|
1107
|
-
}),
|
|
1108
|
-
reset: state.reset,
|
|
1109
|
-
subscribe: function (handler) {
|
|
1110
|
-
if (!isFunction(handler))
|
|
1111
|
-
return;
|
|
1112
|
-
handlers.push(handler);
|
|
1113
|
-
handler({
|
|
1114
|
-
type: 'suiteSubscribeInit',
|
|
1115
|
-
suiteState: stateRef
|
|
1116
|
-
});
|
|
1117
|
-
}
|
|
1118
|
-
});
|
|
1119
|
-
return suite;
|
|
1120
|
-
}
|
|
1121
|
-
|
|
1122
|
-
/**
|
|
1123
|
-
* Error message to display when a hook was called outside of context.
|
|
1124
|
-
*/
|
|
1125
|
-
var ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.';
|
|
1126
|
-
|
|
1127
|
-
/**
|
|
1128
|
-
* Adds a field or multiple fields to inclusion group.
|
|
1129
|
-
*/
|
|
1130
|
-
function only(item) {
|
|
1131
|
-
return addTo('only', 'tests', item);
|
|
1132
|
-
}
|
|
1133
|
-
only.group = function (item) { return addTo('only', 'groups', item); };
|
|
1134
|
-
/**
|
|
1135
|
-
* Adds a field or multiple fields to exclusion group.
|
|
1136
|
-
* @param {String[]|String} item Item to be added to exclusion group.
|
|
1137
|
-
*/
|
|
1138
|
-
function skip(item) {
|
|
1139
|
-
return addTo('skip', 'tests', item);
|
|
1140
|
-
}
|
|
1141
|
-
skip.group = function (item) { return addTo('skip', 'groups', item); };
|
|
1142
|
-
//Checks whether a certain test profile excluded by any of the exclusion groups.
|
|
1143
|
-
// eslint-disable-next-line complexity
|
|
1144
|
-
function isExcluded(testObject) {
|
|
1145
|
-
var fieldName = testObject.fieldName, groupName = testObject.groupName;
|
|
1146
|
-
var context = ctx.useX();
|
|
1147
|
-
var exclusion = context.exclusion;
|
|
1148
|
-
var keyTests = exclusion.tests;
|
|
1149
|
-
var testValue = keyTests[fieldName];
|
|
1150
|
-
// if test is skipped
|
|
1151
|
-
// no need to proceed
|
|
1152
|
-
if (testValue === false) {
|
|
1153
|
-
return true;
|
|
1154
|
-
}
|
|
1155
|
-
var isTestIncluded = testValue === true;
|
|
1156
|
-
// If inside a group
|
|
1157
|
-
if (groupName) {
|
|
1158
|
-
if (isGroupExcluded(groupName)) {
|
|
1159
|
-
return true; // field excluded by group
|
|
1160
|
-
// if group is `only`ed
|
|
1161
|
-
}
|
|
1162
|
-
else if (exclusion.groups[groupName] === true) {
|
|
1163
|
-
if (isTestIncluded) {
|
|
1164
|
-
return false;
|
|
1165
|
-
}
|
|
1166
|
-
// If there is _ANY_ `only`ed test (and we already know this one isn't)
|
|
1167
|
-
if (hasIncludedTests(keyTests)) {
|
|
1168
|
-
return true; // Excluded implicitly
|
|
1169
|
-
}
|
|
1170
|
-
return keyTests[fieldName] === false;
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
// if field is only'ed
|
|
1174
|
-
if (isTestIncluded) {
|
|
1175
|
-
return false;
|
|
1176
|
-
}
|
|
1177
|
-
// If there is _ANY_ `only`ed test (and we already know this one isn't) return true
|
|
1178
|
-
// Otherwise return false
|
|
1179
|
-
return hasIncludedTests(keyTests);
|
|
1180
|
-
}
|
|
1181
|
-
/**
|
|
1182
|
-
* Checks whether a given group is excluded from running.
|
|
1183
|
-
* @param {String} groupName
|
|
1184
|
-
* @return {Boolean}
|
|
1185
|
-
*/
|
|
1186
|
-
function isGroupExcluded(groupName) {
|
|
1187
|
-
var context = ctx.useX();
|
|
1188
|
-
var exclusion = context.exclusion;
|
|
1189
|
-
var keyGroups = exclusion.groups;
|
|
1190
|
-
var groupPresent = hasOwnProperty(keyGroups, groupName);
|
|
1191
|
-
// When group is either only'ed or skipped
|
|
1192
|
-
if (groupPresent) {
|
|
1193
|
-
// Return true if group is skipped and false if only'ed
|
|
1194
|
-
return keyGroups[groupName] === false;
|
|
1195
|
-
}
|
|
1196
|
-
// Group is not present
|
|
1197
|
-
for (var group in keyGroups) {
|
|
1198
|
-
// If any other group is only'ed
|
|
1199
|
-
if (keyGroups[group] === true) {
|
|
1200
|
-
return true;
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
return false;
|
|
1204
|
-
}
|
|
1205
|
-
/**
|
|
1206
|
-
* Adds fields to a specified exclusion group.
|
|
1207
|
-
*/
|
|
1208
|
-
function addTo(exclusionGroup, itemType, item) {
|
|
1209
|
-
var context = ctx.useX(ERROR_HOOK_CALLED_OUTSIDE);
|
|
1210
|
-
if (!item) {
|
|
1211
|
-
return;
|
|
1212
|
-
}
|
|
1213
|
-
asArray(item).forEach(function (itemName) {
|
|
1214
|
-
if (!isStringValue(itemName)) {
|
|
1215
|
-
return;
|
|
1216
|
-
}
|
|
1217
|
-
context.exclusion[itemType][itemName] = exclusionGroup === 'only';
|
|
1218
|
-
});
|
|
1219
|
-
}
|
|
1220
|
-
/**
|
|
1221
|
-
* Checks if context has included tests
|
|
1222
|
-
*/
|
|
1223
|
-
function hasIncludedTests(keyTests) {
|
|
1224
|
-
for (var test in keyTests) {
|
|
1225
|
-
if (keyTests[test] === true) {
|
|
1226
|
-
return true; // excluded implicitly
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
return false;
|
|
1230
|
-
}
|
|
1231
|
-
|
|
1232
|
-
/**
|
|
1233
|
-
* @type {String} Error message to display when `warn` gets called outside of a test.
|
|
1234
|
-
*/
|
|
1235
|
-
var ERROR_OUTSIDE_OF_TEST = "warn hook called outside of a test callback. It won't have an effect."
|
|
1236
|
-
;
|
|
1237
|
-
/**
|
|
1238
|
-
* Sets a running test to warn only mode.
|
|
1239
|
-
*/
|
|
1240
|
-
function warn() {
|
|
1241
|
-
var ctx$1 = ctx.useX('warn ' + ERROR_HOOK_CALLED_OUTSIDE);
|
|
1242
|
-
if (!ctx$1.currentTest) {
|
|
1243
|
-
throwError(ERROR_OUTSIDE_OF_TEST);
|
|
1244
|
-
return;
|
|
1245
|
-
}
|
|
1246
|
-
ctx$1.currentTest.warn();
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
/**
|
|
1250
|
-
* Runs a group callback.
|
|
1251
|
-
*/
|
|
1252
|
-
function group(groupName, tests) {
|
|
1253
|
-
if (!isStringValue(groupName)) {
|
|
1254
|
-
throwGroupError(groupName);
|
|
1255
|
-
}
|
|
1256
|
-
if (!isFunction(tests)) {
|
|
1257
|
-
throwGroupError(tests);
|
|
1258
|
-
}
|
|
1259
|
-
// Running with the context applied
|
|
1260
|
-
ctx.bind({ groupName: groupName }, tests)();
|
|
1261
|
-
}
|
|
1262
|
-
function throwGroupError(value) {
|
|
1263
|
-
throwError("group initialization error. Expected \"" + value + "\" to be a string."
|
|
1264
|
-
);
|
|
1265
|
-
}
|
|
1266
|
-
|
|
1267
|
-
function optional(optionals) {
|
|
1268
|
-
var _a = useOptionalFields(), setOptionalFields = _a[1];
|
|
1269
|
-
setOptionalFields(function (state) {
|
|
1270
|
-
asArray(optionals).forEach(function (optionalField) {
|
|
1271
|
-
state[optionalField] = true;
|
|
1272
|
-
});
|
|
1273
|
-
return state;
|
|
1274
|
-
});
|
|
1275
|
-
}
|
|
1276
|
-
|
|
1277
|
-
/**
|
|
1278
|
-
* Removes first found element from array
|
|
1279
|
-
* WARNING: Mutates array
|
|
1280
|
-
*/
|
|
1281
|
-
function removeElementFromArray(array, element) {
|
|
1282
|
-
var index = array.indexOf(element);
|
|
1283
|
-
if (index !== -1) {
|
|
1284
|
-
array.splice(index, 1);
|
|
1285
|
-
}
|
|
1286
|
-
return array;
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
function isSameProfileTest(testObject1, testObject2) {
|
|
1290
|
-
return (testObject1.fieldName === testObject2.fieldName &&
|
|
1291
|
-
testObject1.groupName === testObject2.groupName);
|
|
1292
|
-
}
|
|
1293
|
-
|
|
1294
|
-
/**
|
|
1295
|
-
* Sets a test as pending in the state.
|
|
1296
|
-
*/
|
|
1297
|
-
function setPending(testObject) {
|
|
1298
|
-
var _a = useLagging(), lagging = _a[0], setLagging = _a[1];
|
|
1299
|
-
var _b = usePending(), setPending = _b[1];
|
|
1300
|
-
var nextLagging = asArray(lagging).reduce(function (lagging, laggingTestObject) {
|
|
1301
|
-
/**
|
|
1302
|
-
* If the test is of the same profile
|
|
1303
|
-
* (same name + same group) we cancel
|
|
1304
|
-
* it. Otherwise, it is lagging.
|
|
1305
|
-
*/
|
|
1306
|
-
if (isSameProfileTest(testObject, laggingTestObject) &&
|
|
1307
|
-
// This last case handles memoized tests
|
|
1308
|
-
// because that retain their od across runs
|
|
1309
|
-
laggingTestObject.id !== testObject.id) {
|
|
1310
|
-
laggingTestObject.cancel();
|
|
1311
|
-
}
|
|
1312
|
-
else {
|
|
1313
|
-
lagging.push(laggingTestObject);
|
|
1314
|
-
}
|
|
1315
|
-
return lagging;
|
|
1316
|
-
}, []);
|
|
1317
|
-
setLagging(function () { return nextLagging; });
|
|
1318
|
-
setPending(function (pending) { return pending.concat(testObject); });
|
|
1319
|
-
}
|
|
1320
|
-
/**
|
|
1321
|
-
* Removes a tests from the pending and lagging arrays.
|
|
1322
|
-
*/
|
|
1323
|
-
function removePending(testObject) {
|
|
1324
|
-
var _a = usePending(), setPending = _a[1];
|
|
1325
|
-
var _b = useLagging(), setLagging = _b[1];
|
|
1326
|
-
setPending(function (setPending) { return removeElementFromArray(setPending, testObject); });
|
|
1327
|
-
setLagging(function (lagging) { return removeElementFromArray(lagging, testObject); });
|
|
1328
|
-
}
|
|
1329
|
-
|
|
1330
|
-
/**
|
|
1331
|
-
* Removes test object from suite state
|
|
1332
|
-
*/
|
|
1333
|
-
function removeTestFromState (testObject) {
|
|
1334
|
-
var _a = useTestObjects(), setTestObjects = _a[1];
|
|
1335
|
-
setTestObjects(function (testObjects) {
|
|
1336
|
-
// using asArray to clear the cache.
|
|
1337
|
-
return asArray(removeElementFromArray(testObjects, testObject));
|
|
1338
|
-
});
|
|
1339
|
-
}
|
|
1340
|
-
|
|
1341
|
-
var VestTest = /** @class */ (function () {
|
|
1342
|
-
function VestTest(fieldName, testFn, _a) {
|
|
1343
|
-
var _b = _a === void 0 ? {} : _a, message = _b.message, groupName = _b.groupName;
|
|
1344
|
-
this.id = genId();
|
|
1345
|
-
this.failed = false;
|
|
1346
|
-
this.isWarning = false;
|
|
1347
|
-
this.canceled = false;
|
|
1348
|
-
this.fieldName = fieldName;
|
|
1349
|
-
this.testFn = testFn;
|
|
1350
|
-
if (groupName) {
|
|
1351
|
-
this.groupName = groupName;
|
|
1352
|
-
}
|
|
1353
|
-
if (message) {
|
|
1354
|
-
this.message = message;
|
|
1355
|
-
}
|
|
1356
|
-
}
|
|
1357
|
-
VestTest.prototype.run = function () {
|
|
1358
|
-
var result;
|
|
1359
|
-
try {
|
|
1360
|
-
result = this.testFn();
|
|
1361
|
-
}
|
|
1362
|
-
catch (error) {
|
|
1363
|
-
if (isUndefined(this.message) && isStringValue(error)) {
|
|
1364
|
-
this.message = error;
|
|
1365
|
-
}
|
|
1366
|
-
result = false;
|
|
1367
|
-
}
|
|
1368
|
-
if (result === false) {
|
|
1369
|
-
this.fail();
|
|
1370
|
-
}
|
|
1371
|
-
return result;
|
|
1372
|
-
};
|
|
1373
|
-
VestTest.prototype.fail = function () {
|
|
1374
|
-
this.failed = true;
|
|
1375
|
-
};
|
|
1376
|
-
VestTest.prototype.warn = function () {
|
|
1377
|
-
this.isWarning = true;
|
|
1378
|
-
};
|
|
1379
|
-
VestTest.prototype.cancel = function () {
|
|
1380
|
-
this.canceled = true;
|
|
1381
|
-
removePending(this);
|
|
1382
|
-
removeTestFromState(this);
|
|
1383
|
-
};
|
|
1384
|
-
VestTest.prototype.valueOf = function () {
|
|
1385
|
-
return this.failed !== true;
|
|
1386
|
-
};
|
|
1387
|
-
return VestTest;
|
|
1388
|
-
}());
|
|
1389
|
-
|
|
1390
|
-
function partition(array, predicate) {
|
|
1391
|
-
return array.reduce(function (partitions, value, number) {
|
|
1392
|
-
partitions[predicate(value, number, array) ? 0 : 1].push(value);
|
|
1393
|
-
return partitions;
|
|
1394
|
-
}, [[], []]);
|
|
1395
|
-
}
|
|
1396
|
-
|
|
1397
|
-
function mergeCarryOverTests(testObject) {
|
|
1398
|
-
var _a = useCarryOverTests(), carryOverTests = _a[0], setCarryOverTests = _a[1];
|
|
1399
|
-
var _b = useTestObjects(), setTestObjects = _b[1];
|
|
1400
|
-
var _c = partition(carryOverTests, function (carryOverTest) { return isSameProfileTest(carryOverTest, testObject); }), moveToTestObjects = _c[0], keepInCarryOvers = _c[1];
|
|
1401
|
-
setCarryOverTests(function () { return keepInCarryOvers; });
|
|
1402
|
-
setTestObjects(function (testObjects) { return testObjects.concat(moveToTestObjects); });
|
|
1403
|
-
}
|
|
1404
|
-
|
|
1405
|
-
function isPromise(value) {
|
|
1406
|
-
return value && isFunction(value.then);
|
|
1407
|
-
}
|
|
1408
|
-
|
|
1409
|
-
/**
|
|
1410
|
-
* Stores test object inside suite state.
|
|
1411
|
-
*/
|
|
1412
|
-
var addTestToState = (function (testObject) {
|
|
1413
|
-
var _a = useTestObjects(), setTestObjects = _a[1];
|
|
1414
|
-
setTestObjects(function (testObjects) { return testObjects.concat(testObject); });
|
|
1415
|
-
});
|
|
1416
|
-
|
|
1417
|
-
function callEach(arr) {
|
|
1418
|
-
return arr.forEach(function (fn) { return fn(); });
|
|
1419
|
-
}
|
|
1420
|
-
|
|
1421
|
-
/**
|
|
1422
|
-
* Runs async test.
|
|
1423
|
-
*/
|
|
1424
|
-
function runAsyncTest(testObject) {
|
|
1425
|
-
var asyncTest = testObject.asyncTest, message = testObject.message;
|
|
1426
|
-
if (!isPromise(asyncTest))
|
|
1427
|
-
return;
|
|
1428
|
-
var stateRef = useStateRef();
|
|
1429
|
-
var done = ctx.bind({ stateRef: stateRef }, function () {
|
|
1430
|
-
removePending(testObject);
|
|
1431
|
-
// This is for cases in which the suite state was already reset
|
|
1432
|
-
if (testObject.canceled) {
|
|
1433
|
-
return;
|
|
1434
|
-
}
|
|
1435
|
-
// Perform required done callback calls and cleanups after the test is finished
|
|
1436
|
-
runDoneCallbacks(testObject.fieldName);
|
|
1437
|
-
});
|
|
1438
|
-
var fail = ctx.bind({ stateRef: stateRef }, function (rejectionMessage) {
|
|
1439
|
-
testObject.message = isStringValue(rejectionMessage)
|
|
1440
|
-
? rejectionMessage
|
|
1441
|
-
: message;
|
|
1442
|
-
testObject.fail();
|
|
1443
|
-
// Spreading the array to invalidate the cache
|
|
1444
|
-
var _a = useTestObjects(), setTestObjects = _a[1];
|
|
1445
|
-
setTestObjects(function (testObjects) { return testObjects.slice(); });
|
|
1446
|
-
done();
|
|
1447
|
-
});
|
|
1448
|
-
try {
|
|
1449
|
-
asyncTest.then(done, fail);
|
|
1450
|
-
}
|
|
1451
|
-
catch (e) {
|
|
1452
|
-
fail();
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
/**
|
|
1456
|
-
* Runs done callback when async tests are finished running.
|
|
1457
|
-
*/
|
|
1458
|
-
function runDoneCallbacks(fieldName) {
|
|
1459
|
-
var _a = useTestCallbacks()[0], fieldCallbacks = _a.fieldCallbacks, doneCallbacks = _a.doneCallbacks;
|
|
1460
|
-
if (fieldName) {
|
|
1461
|
-
if (!hasRemainingTests(fieldName) &&
|
|
1462
|
-
Array.isArray(fieldCallbacks[fieldName])) {
|
|
1463
|
-
callEach(fieldCallbacks[fieldName]);
|
|
1464
|
-
}
|
|
1465
|
-
}
|
|
1466
|
-
if (!hasRemainingTests()) {
|
|
1467
|
-
callEach(doneCallbacks);
|
|
1468
|
-
}
|
|
1469
|
-
}
|
|
1470
|
-
|
|
1471
|
-
/**
|
|
1472
|
-
* Runs sync tests - or extracts promise.
|
|
1473
|
-
*/
|
|
1474
|
-
function runSyncTest(testObject) {
|
|
1475
|
-
return ctx.run({ currentTest: testObject }, function () {
|
|
1476
|
-
var result;
|
|
1477
|
-
try {
|
|
1478
|
-
result = testObject.testFn();
|
|
1479
|
-
}
|
|
1480
|
-
catch (e) {
|
|
1481
|
-
if (isUndefined(testObject.message) && isStringValue(e)) {
|
|
1482
|
-
testObject.message = e;
|
|
1483
|
-
}
|
|
1484
|
-
result = false;
|
|
1485
|
-
}
|
|
1486
|
-
if (result === false) {
|
|
1487
|
-
testObject.fail();
|
|
1488
|
-
}
|
|
1489
|
-
return result;
|
|
1490
|
-
});
|
|
1491
|
-
}
|
|
1492
|
-
|
|
1493
|
-
/**
|
|
1494
|
-
* Registers test, if async - adds to pending array
|
|
1495
|
-
*/
|
|
1496
|
-
function registerTest(testObject) {
|
|
1497
|
-
addTestToState(testObject);
|
|
1498
|
-
// Run test callback.
|
|
1499
|
-
// If a promise is returned, set as async and
|
|
1500
|
-
// Move to pending list.
|
|
1501
|
-
var result = runSyncTest(testObject);
|
|
1502
|
-
try {
|
|
1503
|
-
// try catch for safe property access
|
|
1504
|
-
// in case object is an enforce chain
|
|
1505
|
-
if (isPromise(result)) {
|
|
1506
|
-
testObject.asyncTest = result;
|
|
1507
|
-
setPending(testObject);
|
|
1508
|
-
runAsyncTest(testObject);
|
|
1509
|
-
}
|
|
1510
|
-
}
|
|
1511
|
-
catch (_a) {
|
|
1512
|
-
{
|
|
1513
|
-
throwError("Your test function " + testObject.fieldName + " returned " + JSON.stringify(result) + ". Only \"false\" or a Promise are supported. Return values may cause unexpected behavior.");
|
|
1514
|
-
}
|
|
1515
|
-
}
|
|
1516
|
-
}
|
|
1517
|
-
|
|
1518
|
-
/* eslint-disable jest/no-export */
|
|
1519
|
-
function bindTestEach(test) {
|
|
1520
|
-
/**
|
|
1521
|
-
* Run multiple tests using a parameter table
|
|
1522
|
-
*/
|
|
1523
|
-
function each(table) {
|
|
1524
|
-
if (!Array.isArray(table)) {
|
|
1525
|
-
throwError('test.each: Expected table to be an array.');
|
|
1526
|
-
}
|
|
1527
|
-
function eachReturn(fieldName) {
|
|
1528
|
-
var args = [];
|
|
1529
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1530
|
-
args[_i - 1] = arguments[_i];
|
|
1531
|
-
}
|
|
1532
|
-
var _a = args.reverse(), testFn = _a[0], message = _a[1];
|
|
1533
|
-
return table.map(function (item) {
|
|
1534
|
-
item = asArray(item);
|
|
1535
|
-
return test(optionalFunctionValue.apply(void 0, __spreadArray([fieldName], item)), optionalFunctionValue.apply(void 0, __spreadArray([message], item)), function () { return testFn.apply(void 0, item); });
|
|
1536
|
-
});
|
|
1537
|
-
}
|
|
1538
|
-
return eachReturn;
|
|
1539
|
-
}
|
|
1540
|
-
return each;
|
|
1541
|
-
}
|
|
1542
|
-
|
|
1543
|
-
/* eslint-disable jest/no-export */
|
|
1544
|
-
function bindTestMemo(test) {
|
|
1545
|
-
var cache = createCache(100); // arbitrary cache size
|
|
1546
|
-
function memo(fieldName) {
|
|
1547
|
-
var args = [];
|
|
1548
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1549
|
-
args[_i - 1] = arguments[_i];
|
|
1550
|
-
}
|
|
1551
|
-
var suiteId = useSuiteId()[0];
|
|
1552
|
-
var _a = args.reverse(), deps = _a[0], testFn = _a[1], msg = _a[2];
|
|
1553
|
-
// Implicit dependency for more specificity
|
|
1554
|
-
var dependencies = [suiteId, fieldName].concat(deps);
|
|
1555
|
-
var cached = cache.get(dependencies);
|
|
1556
|
-
if (isNull(cached)) {
|
|
1557
|
-
// Cache miss. Start fresh
|
|
1558
|
-
return cache(dependencies, function () { return test(fieldName, msg, testFn); });
|
|
1559
|
-
}
|
|
1560
|
-
var testObject = cached[1];
|
|
1561
|
-
if (isExcluded(testObject)) {
|
|
1562
|
-
return testObject;
|
|
1563
|
-
}
|
|
1564
|
-
addTestToState(testObject);
|
|
1565
|
-
if (testObject && isPromise(testObject.asyncTest)) {
|
|
1566
|
-
setPending(testObject);
|
|
1567
|
-
runAsyncTest(testObject);
|
|
1568
|
-
}
|
|
1569
|
-
return testObject;
|
|
1570
|
-
}
|
|
1571
|
-
return memo;
|
|
1572
|
-
}
|
|
1573
|
-
|
|
1574
|
-
function testBase(fieldName) {
|
|
1575
|
-
var args = [];
|
|
1576
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1577
|
-
args[_i - 1] = arguments[_i];
|
|
1578
|
-
}
|
|
1579
|
-
var _a = args.reverse(), testFn = _a[0], message = _a[1];
|
|
1580
|
-
var _b = useSkippedTests(), setSkippedTests = _b[1];
|
|
1581
|
-
var context = ctx.use();
|
|
1582
|
-
var testObject = new VestTest(fieldName, testFn, {
|
|
1583
|
-
message: message,
|
|
1584
|
-
groupName: context === null || context === void 0 ? void 0 : context.groupName
|
|
1585
|
-
});
|
|
1586
|
-
if (isExcluded(testObject)) {
|
|
1587
|
-
setSkippedTests(function (skippedTests) { return skippedTests.concat(testObject); });
|
|
1588
|
-
mergeCarryOverTests(testObject);
|
|
1589
|
-
return testObject;
|
|
1590
|
-
}
|
|
1591
|
-
if (!isFunction(testFn)) {
|
|
1592
|
-
return testObject;
|
|
1593
|
-
}
|
|
1594
|
-
registerTest(testObject);
|
|
1595
|
-
return testObject;
|
|
1596
|
-
}
|
|
1597
|
-
var test = assign(testBase, {
|
|
1598
|
-
each: bindTestEach(testBase),
|
|
1599
|
-
memo: bindTestMemo(testBase)
|
|
1600
|
-
});
|
|
1601
|
-
|
|
1602
|
-
var VERSION = "3.2.8-dev-6d7c74";
|
|
1603
|
-
|
|
1604
|
-
export { VERSION, create, enforce, group, only, optional, skip, test, warn };
|