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