vest 4.0.0-next-084233 → 4.0.2-dev-6e9534

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/CHANGELOG.md CHANGED
@@ -4,96 +4,6 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## 4.0.0 - 2021-12-20
8
- ### Changed or removed
9
- - b5a0108 breaking(vest): remove test.each (ealush)
10
- - 7c43eab major(context): used named export in context (ealush)
11
- - e8652bc breaking(vest, enforce): prepare next major (ealush)
12
- - dab8e00 breaking(vest, enforce): prepare next major (ealush)
13
-
14
- ### Added
15
- - 0842334 feat(vest): expose Vest's context for future plugin support (ealush)
16
- - b0a9a14 feat(vest): use key prop to retain test state after reorder (#732) (Evyatar)
17
- - d3e7613 feat(vest): support custom optional logic (ealush)
18
- - be1cbf6 feat(vest): Add a parser export (ealush)
19
- - 2553748 feat(vest): isValid with field name (ealush)
20
- - ec5ceb9 feat(vest): handle execution order state refill with memoized tests (ealush)
21
- - 4032bd8 feat(vest): Make the state rely on execution order. Make skipWhen set skipped context. (undefined)
22
- - 220127b added(n4s): partial rule modifier (undefined)
23
- - b5ce72d feat(n4s): context propagation within enforce (undefined)
24
-
25
- ### Fixed and improved
26
- - 8ba9895 add(vest): omitWhen (#738) (Evyatar)
27
- - 1384c08 fix(vest): only.group works in conjunction with only (#734) (Evyatar)
28
- - README.md
29
- - 7daf6d2 rule(n4s): add isNullish rule, improve isBlank (ealush)
30
- - c4a4140 chore: organize imports (ealush)
31
- - 9f9b970 vx: improve package.json generation (ealush)
32
- - 0370fc1 n4s: extract non-required modules (ealush)
33
- - 03ba92c vx: support namespaced exports (ealush)
34
- - 38a54ae vx: support installing of local packages (ealush)
35
- - 7baedf2 n4s: use named export in entry (ealush)
36
- - 366001b patch(vest): better handling of skipped async tests (ealush)
37
- - 2380679 types(vest): allow unprovided suite name in tests (ealush)
38
- - f721b2d patch(vest): replace warns boolean flag with enum (ealush)
39
- - 0acb24d patch(vest): Pass draft result to skipWhen conditional (ealush)
40
- - e84cd9d patch(vest): add back optional suite name argument (ealush)
41
- - 8b30b66 patch(vest): make compose an external export (ealush)
42
- - ddfa9fd patch(vest): move creation functions to event bus (ealush)
43
- - fe83e88 patch: Some cleanups (ealush)
44
- - 9275707 fix(vest): prevent pending tests from being marked as skipped (ealush)
45
- - 94e00a8 patch(vest): Add isolate module for containing re-orders (ealush)
46
- - 5bcc14a patch(vest): refresh tests after cancel (ealush)
47
- - fd049e8 patch: add cursor util (ealush)
48
- - 9380c09 patch(vest): move cursor into context (ealush)
49
- - 49b72f4 patch(vest): automatically purge not-found test results (ealush)
50
- - 2dfedaf vx: correctly pass cli options to build script (ealush)
51
- - aae250a patch(vest): Throw error when tests are called in the wrong order (ealush)
52
- - a87824b vx: add types to exports (ealush)
53
- - cc9b4b0 organize vest state hooks (ealush)
54
- - df84261 patch(vest): infer omitted optional fields (ealush)
55
- - 2534cf6 vx: add dev bundle to exports (ealush)
56
- - 4d450aa fix(vest): prevent changing test status once it was finalized (ealush)
57
- - 8730e25 patch(vest): add cache invalidation for canceled tests (ealush)
58
- - 4cb2c6c types(vest): add safeguard around shouldUseErrorAsMessage (ealush)
59
- - c214a12 patch(vest): some cleanups (ealush)
60
- - 858458d patch(vest): remove duplicate code handling perv test registration (ealush)
61
- - ec69173 vx: use context directly from published package (ealush)
62
- - 962bc06 patch: run done callbacks via event (ealush)
63
- - d96f428 patch(vest): removed state subscription (ealush)
64
- - package.json
65
- - packages/anyone/package.json
66
- - packages/anyone/package.json
67
- - packages/vast/types/vast.d.ts
68
- - e4e1746 patch(vest): remove pending and lagging state (ealush)
69
- - 9d8fd21 patch(vest): convert boolean flags to a single status key (ealush)
70
- - dbb836e patch: simplify fieldname comparison (ealush)
71
- - 5a78179 patch(vest): add useAllIncomplete hook (ealush)
72
- - b5ae658 patch(vest): invalid accounts for warning tests as well (ealush)
73
- - 4563b8d patch(vest): isValid counts all required tests per field (ealush)
74
- - 3fe2f21 chore: cleanups (ealush)
75
- - .eslintrc.js
76
- - 149aab3 add(n4s): enforce.condition (ealush)
77
- - package.json
78
- - packages/anyone/package.json
79
- - 40ef071 chore: cleanup residue (undefined)
80
- - eeac20e chore: remove duplicate types (undefined)
81
- - packages/anyone/package.json
82
- - 4d88c04 patch: add nodejs exports (undefined)
83
- - 6e57aa1 patch: remove unused exports (undefined)
84
- - packages/anyone/package.json
85
- - 26af06b chore: reduce complexity, remove all lint errors (undefined)
86
- - packages/anyone/.npmignore
87
- - .github/PULL_REQUEST_TEMPLATE.md
88
- - 5be986d chore: cleanup unused code (ealush)
89
- - ba68539 lint: handling lint of all packages (ealush)
90
- - .gitignore
91
- - cca5130 patch(n4s): add ruleReturn default values (ealush)
92
- - 75306ff fix(n4s): make enforce compound runners fall back to correct response (ealush)
93
- - 4751584 fix(n4s): make enforce chaining work (ealush)
94
- - 73b28a1 chore: some lint fixes (ealush)
95
- - 4135ce3 add cli options support (ealush)
96
-
97
7
  ## 3.2.7 - 2021-07-17
98
8
 
99
9
  ### Fixed and improved
package/README.md CHANGED
@@ -1,3 +1,58 @@
1
- # Vest
1
+ # Vest - Declarative validations framework
2
2
 
3
- Home of the Vest source code.
3
+ [Vest Documentation](https://vestjs.dev)
4
+
5
+ [![Join Discord](https://badgen.net/discord/online-members/WmADZpJnSe?icon=discord&label=Discord)](https://discord.gg/WmADZpJnSe) [![Github Stars](https://badgen.net/github/stars/ealush/vest?color=yellow&label=Github%20🌟)](https://github.com/ealush/vest) [![Version](https://badgen.net/npm/v/vest?&icon=npm)](https://www.npmjs.com/package/vest) [![Downloads](https://badgen.net/npm/dt/vest?label=Downloads)](https://www.npmjs.com/package/vest) [![bundlephobia](https://badgen.net/bundlephobia/minzip/vest)](https://bundlephobia.com/package/vest) [![Status](https://badgen.net/github/status/ealush/vest)](https://github.com/ealush/vest/actions)
6
+
7
+ ![Vest](https://cdn.jsdelivr.net/gh/ealush/vest@assets/logo_250.png 'Vest')
8
+
9
+ Vest is a form-validation framework inspired by unit testing libraries like Mocha or Jest; It is designed to be easy to use and easy to learn by introducing their declarative syntax.
10
+
11
+ The idea behind Vest is that your validations can be described as a suite - a contract that reflects your form or feature structure. Vest is framework agnostic, meaning it can be used with any UI framework, or without any framework at all.
12
+
13
+ Using Vest for form validation can reduce bloat, improve feature readability and maintainability.
14
+
15
+ ```js
16
+ test('username', 'Username is required', () => {
17
+ enforce(data.username).isNotBlank();
18
+ });
19
+
20
+ test('username', 'Username must be at least 3 chars', () => {
21
+ enforce(data.username).longerThanOrEquals(3);
22
+ });
23
+ ```
24
+
25
+ ## Installation
26
+
27
+ ```
28
+ npm i vest
29
+ ```
30
+
31
+ ## Motivation
32
+
33
+ Writing forms is an integral part of building web apps, and even though it may seem trivial at first - as your feature grows over time, so does your validation logic grows in complexity.
34
+
35
+ Vest tries to remediate this by separating validation logic from feature logic, so it's easier to maintain over time and refactor when needed.
36
+
37
+ # Why Vest?
38
+
39
+ 💡 Vest is easy to Learn. Vest adopts the syntax and style of unit testing frameworks, so you can leverage the knowledge you already have to write your form validations.
40
+
41
+ 🎨 Vest is framework agnostic. You can use Vest with any UI framework out there.
42
+
43
+ 🧠 Vest takes care of all the annoying parts for you. It manages its validation state, handles async validations, and much more.
44
+
45
+ 🧩 Vest is extendable. You can easily add new kinds of validations to Vest according to your needs.
46
+
47
+ ♻️ Validation logic in Vest can be shared across multiple features in your app.
48
+
49
+ # Getting Started
50
+
51
+ [Vest Documentation](https://vestjs.dev)
52
+
53
+ Here are some code sandboxes to get you started:
54
+
55
+ - [React](https://codesandbox.io/s/react-28jwx)
56
+ - [Vue](https://codesandbox.io/s/vue-hsyt8)
57
+ - [Svelte](https://codesandbox.io/s/svelte-tsfhx)
58
+ - [Vanilla](https://codesandbox.io/s/vest-vanilla-js-35u8e)
@@ -187,6 +187,7 @@ var context = context$1.createContext(function (ctxRef, parentContext) {
187
187
  tests: {},
188
188
  groups: {}
189
189
  },
190
+ inclusion: {},
190
191
  isolate: {
191
192
  type: IsolateTypes.DEFAULT,
192
193
  keys: {
@@ -753,7 +754,7 @@ function __spreadArray(to, from, pack) {
753
754
  ar[i] = from[i];
754
755
  }
755
756
  }
756
- return to.concat(ar || from);
757
+ return to.concat(ar || Array.prototype.slice.call(from));
757
758
  }
758
759
 
759
760
  function either(a, b) {
@@ -771,7 +772,7 @@ function collectFailureMessages(severity, testObjects, options) {
771
772
  var _a;
772
773
  if (options === void 0) { options = {}; }
773
774
  var _b = options || {}, group = _b.group, fieldName = _b.fieldName;
774
- var res = testObjects.reduce(function (collector, testObject) {
775
+ return testObjects.reduce(function (collector, testObject) {
775
776
  if (noMatch(testObject, severity, group, fieldName)) {
776
777
  return collector;
777
778
  }
@@ -781,7 +782,6 @@ function collectFailureMessages(severity, testObjects, options) {
781
782
  collector[testObject.fieldName] = (collector[testObject.fieldName] || []).concat(testObject.message || []);
782
783
  return collector;
783
784
  }, __assign({}, (fieldName && (_a = {}, _a[fieldName] = [], _a))));
784
- return res;
785
785
  }
786
786
  function noGroupMatch(testObject, groupName) {
787
787
  return !!(groupName && testObject.groupName !== groupName);
@@ -839,11 +839,10 @@ function getByGroup(severityKey, group, fieldName) {
839
839
  throwError("get" + severityKey[0].toUpperCase() + severityKey.slice(1) + "ByGroup requires a group name. Received `" + group + "` instead.");
840
840
  }
841
841
  var testObjects = useTestsFlat();
842
- var failureMessages = collectFailureMessages(severityKey, testObjects, {
842
+ return collectFailureMessages(severityKey, testObjects, {
843
843
  group: group,
844
844
  fieldName: fieldName
845
845
  });
846
- return failureMessages;
847
846
  }
848
847
 
849
848
  /**
@@ -1100,10 +1099,10 @@ function callEach(arr) {
1100
1099
  */
1101
1100
  function runFieldCallbacks(fieldName) {
1102
1101
  var fieldCallbacks = useTestCallbacks()[0].fieldCallbacks;
1103
- if (fieldName) {
1104
- if (!hasRemainingTests(fieldName) && isArray(fieldCallbacks[fieldName])) {
1105
- callEach(fieldCallbacks[fieldName]);
1106
- }
1102
+ if (fieldName &&
1103
+ !hasRemainingTests(fieldName) &&
1104
+ isArray(fieldCallbacks[fieldName])) {
1105
+ callEach(fieldCallbacks[fieldName]);
1107
1106
  }
1108
1107
  }
1109
1108
  /**
@@ -1207,6 +1206,19 @@ function create() {
1207
1206
  return suite;
1208
1207
  }
1209
1208
 
1209
+ /**
1210
+ * Iterates over an array of items, allowing to run tests individually per item.
1211
+ *
1212
+ * Requires setting a "key" property on each item tested.
1213
+ *
1214
+ * @example
1215
+ *
1216
+ * each(itemsArray, (item) => {
1217
+ * test(item.name, 'Item value must not be empty', () => {
1218
+ * enforce(item.value).isNotEmpty();
1219
+ * }, item.id)
1220
+ * })
1221
+ */
1210
1222
  function each(list, callback) {
1211
1223
  if (!isFunction(callback)) {
1212
1224
  throwError('callback must be a function');
@@ -1224,7 +1236,11 @@ function each(list, callback) {
1224
1236
  var ERROR_HOOK_CALLED_OUTSIDE = 'hook called outside of a running suite.';
1225
1237
 
1226
1238
  /**
1227
- * Adds a field or multiple fields to inclusion group.
1239
+ * Adds a field or a list of fields into the inclusion list
1240
+ *
1241
+ * @example
1242
+ *
1243
+ * only('username');
1228
1244
  */
1229
1245
  function only(item) {
1230
1246
  return addTo(0 /* ONLY */, 'tests', item);
@@ -1233,7 +1249,11 @@ only.group = function (item) {
1233
1249
  return addTo(0 /* ONLY */, 'groups', item);
1234
1250
  };
1235
1251
  /**
1236
- * Adds a field or multiple fields to exclusion group.
1252
+ * Adds a field or a list of fields into the exclusion list
1253
+ *
1254
+ * @example
1255
+ *
1256
+ * skip('username');
1237
1257
  */
1238
1258
  function skip(item) {
1239
1259
  return addTo(1 /* SKIP */, 'tests', item);
@@ -1245,13 +1265,14 @@ function isExcludedIndividually() {
1245
1265
  return !!context.useX().skipped;
1246
1266
  }
1247
1267
  //Checks whether a certain test profile excluded by any of the exclusion groups.
1248
- // eslint-disable-next-line complexity, max-statements
1268
+ // eslint-disable-next-line complexity, max-statements, max-lines-per-function
1249
1269
  function isExcluded(testObject) {
1250
1270
  var fieldName = testObject.fieldName, groupName = testObject.groupName;
1251
1271
  if (isExcludedIndividually())
1252
1272
  return true;
1253
1273
  var context$1 = context.useX();
1254
1274
  var exclusion = context$1.exclusion;
1275
+ var inclusion = context$1.inclusion;
1255
1276
  var keyTests = exclusion.tests;
1256
1277
  var testValue = keyTests[fieldName];
1257
1278
  // if test is skipped
@@ -1281,8 +1302,12 @@ function isExcluded(testObject) {
1281
1302
  if (isTestIncluded)
1282
1303
  return false;
1283
1304
  // If there is _ANY_ `only`ed test (and we already know this one isn't) return true
1284
- // Otherwise return false
1285
- return hasIncludedTests(keyTests);
1305
+ if (hasIncludedTests(keyTests)) {
1306
+ // Check if inclusion rules for this field (`include` hook)
1307
+ return !optionalFunctionValue(inclusion[fieldName]);
1308
+ }
1309
+ // We're done here. This field is not excluded
1310
+ return false;
1286
1311
  }
1287
1312
  // eslint-disable-next-line max-statements
1288
1313
  function isMissingFromIncludedGroup(groupName) {
@@ -1363,7 +1388,13 @@ function hasIncludedTests(keyTests) {
1363
1388
  }
1364
1389
 
1365
1390
  /**
1366
- * Runs a group callback.
1391
+ * Runs tests within a group so that they can be controlled or queried separately.
1392
+ *
1393
+ * @example
1394
+ *
1395
+ * group('group_name', () => {
1396
+ * // Tests go here
1397
+ * });
1367
1398
  */
1368
1399
  function group(groupName, tests) {
1369
1400
  if (!isStringValue(groupName)) {
@@ -1381,6 +1412,38 @@ function throwGroupError(error) {
1381
1412
  throwError("Wrong arguments passed to group. Group " + error + ".");
1382
1413
  }
1383
1414
 
1415
+ function include(fieldName) {
1416
+ var context$1 = context.useX();
1417
+ var inclusion = context$1.inclusion, exclusion = context$1.exclusion;
1418
+ if (!fieldName) {
1419
+ return { when: when };
1420
+ }
1421
+ inclusion[fieldName] = defaultTo(exclusion.tests[fieldName], true);
1422
+ return { when: when };
1423
+ function when(condition) {
1424
+ var context$1 = context.useX();
1425
+ var inclusion = context$1.inclusion, exclusion = context$1.exclusion;
1426
+ inclusion[fieldName] = function () {
1427
+ if (hasOwnProperty(exclusion.tests, fieldName)) {
1428
+ return defaultTo(exclusion.tests[fieldName], true);
1429
+ }
1430
+ if (isStringValue(condition)) {
1431
+ return Boolean(exclusion.tests[condition]);
1432
+ }
1433
+ return optionalFunctionValue(condition, optionalFunctionValue(produceDraft));
1434
+ };
1435
+ }
1436
+ }
1437
+
1438
+ /**
1439
+ * Conditionally omits tests from the suite.
1440
+ *
1441
+ * @example
1442
+ *
1443
+ * omitWhen(res => res.hasErrors('username'), () => {
1444
+ * test('username', 'User already taken', async () => await doesUserExist(username)
1445
+ * });
1446
+ */
1384
1447
  function omitWhen(conditional, callback) {
1385
1448
  isolate({ type: IsolateTypes.OMIT_WHEN }, function () {
1386
1449
  context.run({
@@ -1392,6 +1455,17 @@ function isOmitted() {
1392
1455
  return !!context.useX().omitted;
1393
1456
  }
1394
1457
 
1458
+ /**
1459
+ * Marks a field as optional, either just by name, or by a given condition.
1460
+ *
1461
+ * @example
1462
+ *
1463
+ * optional('field_name');
1464
+ *
1465
+ * optional({
1466
+ * username: () => allowUsernameEmpty,
1467
+ * });
1468
+ */
1395
1469
  function optional(optionals) {
1396
1470
  var _a = useOptionalFields(), setOptionalFields = _a[1];
1397
1471
  setOptionalFields(function (state) {
@@ -1411,6 +1485,15 @@ function optional(optionals) {
1411
1485
  });
1412
1486
  }
1413
1487
 
1488
+ /**
1489
+ * Conditionally skips running tests within the callback.
1490
+ *
1491
+ * @example
1492
+ *
1493
+ * skipWhen(res => res.hasErrors('username'), () => {
1494
+ * test('username', 'User already taken', async () => await doesUserExist(username)
1495
+ * });
1496
+ */
1414
1497
  function skipWhen(conditional, callback) {
1415
1498
  isolate({ type: IsolateTypes.SKIP_WHEN }, function () {
1416
1499
  context.run({
@@ -1630,6 +1713,7 @@ function registerTestObjectByTier(testObject) {
1630
1713
  }
1631
1714
  }
1632
1715
 
1716
+ /* eslint-disable jest/valid-title */
1633
1717
  // eslint-disable-next-line max-lines-per-function
1634
1718
  function bindTestMemo(test) {
1635
1719
  var cache = createCache(100); // arbitrary cache size
@@ -1678,6 +1762,15 @@ function testBase(fieldName) {
1678
1762
  });
1679
1763
  return registerPrevRunTest(testObject);
1680
1764
  }
1765
+ /**
1766
+ * Represents a single case in a validation suite.
1767
+ *
1768
+ * @example
1769
+ *
1770
+ * test("username", "Username is required", () => {
1771
+ * enforce(data.username).isNotBlank();
1772
+ * });
1773
+ */
1681
1774
  var test = assign(testBase, {
1682
1775
  memo: bindTestMemo(testBase)
1683
1776
  });
@@ -1698,7 +1791,7 @@ function warn() {
1698
1791
  ctx.currentTest.warn();
1699
1792
  }
1700
1793
 
1701
- var VERSION = "4.0.0-next-084233";
1794
+ var VERSION = "4.0.2-dev-6e9534";
1702
1795
 
1703
1796
  Object.defineProperty(exports, 'enforce', {
1704
1797
  enumerable: true,
@@ -1711,6 +1804,7 @@ exports.context = context;
1711
1804
  exports.create = create;
1712
1805
  exports.each = each;
1713
1806
  exports.group = group;
1807
+ exports.include = include;
1714
1808
  exports.omitWhen = omitWhen;
1715
1809
  exports.only = only;
1716
1810
  exports.optional = optional;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var n,t,r=require("n4s"),e=require("context"),u=Object.assign,i=(n=0,function(){return""+n++});function o(n){return"function"==typeof n}function s(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return o(n)?n.apply(void 0,t):n}function c(n,t){var r;return null!==(r=s(n))&&void 0!==r?r:t}function a(n,t){throw Error(c(t,n))}function f(n,t){setTimeout((function(){a(n,t)}),0)}function l(n){function t(n,t,u){return e.references.push(),r(n,s(t,u)),function(){return[e.references[n],function(t){return r(n,s(t,e.references[n]))}]}}function r(t,r){var i=e.references[t];e.references[t]=r,o(t=u[t][1])&&t(r,i),o(n)&&n()}var e={references:[]},u=[];return{registerStateKey:function(n,r){var e=u.length;return u.push([n,r]),t(e,n)},reset:function(){var n=e.references;e.references=[],u.forEach((function(r,e){return t(e,r[0],n[e])}))}}}function p(n,t){var r=t.suiteId;return t=t.suiteName,{optionalFields:n.registerStateKey((function(){return{}})),suiteId:n.registerStateKey(r),suiteName:n.registerStateKey(t),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(n){return{prev:n?n.current:[],current:[]}}))}}function v(n){return[].concat(n)}function d(n){return(n=v(n))[n.length-1]}function g(){function n(){t=[0]}var t=[];return n(),{addLevel:function(){t.push(0)},cursorAt:function(){return d(t)},getCursor:function(){return v(t)},next:function(){return t[t.length-1]++,d(t)},removeLevel:function(){t.pop()},reset:n}}!function(n){n[n.DEFAULT=0]="DEFAULT",n[n.SUITE=1]="SUITE",n[n.EACH=2]="EACH",n[n.SKIP_WHEN=3]="SKIP_WHEN",n[n.OMIT_WHEN=4]="OMIT_WHEN",n[n.GROUP=5]="GROUP"}(t||(t={}));var h=e.createContext((function(n,r){return r?null:u({},{exclusion:{tests:{},groups:{}},isolate:{type:t.DEFAULT,keys:{current:{},prev:{}}},testCursor:g()},n)}));function m(n){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return!n.apply(void 0,t)}}function y(n){return!!Array.isArray(n)}function E(n){return null===n}var N=m(E);function b(n,t){for(var r=[],e=0;e<n.length;e++){var u=n[e];y(u)?r.push(b(u,t)):(u=t(u),N(u)&&r.push(u))}return r}function C(n,t,r){return k(n,t)[d(t)]=r,n}function T(n){return v(n).reduce((function(n,t){return y(t)?n.concat(T(t)):v(n).concat(t)}),[])}function k(n,t){var r=0;for(t=t.slice(0,-1);r<t.length;r++){var e=t[r];n[e]=c(n[e],[]),n=n[e]}return n}function S(n){return void 0===n}function O(n){return E(n)||S(n)}function P(n){return String(n)===n}function x(n,t){return S(n)&&P(t)}function I(n,t){return n.length===Number(t)}function w(n){void 0===n&&(n=1);var t=[],r=function(e,u){var i=r.get(e);return i?i[1]:(u=u(),t.unshift([e.concat(),u]),function(n,t){return n.length>Number(t)}(t,n)&&(t.length=n),u)};return r.invalidate=function(n){var r=t.findIndex((function(t){var r=t[0];return I(n,r.length)&&n.every((function(n,t){return n===r[t]}))}));-1<r&&t.splice(r,1)},r.get=function(n){return t[t.findIndex((function(t){var r=t[0];return I(n,r.length)&&n.every((function(n,t){return n===r[t]}))}))]||null},r}function F(){return h.useX().stateRef}function W(){return F().suiteId()[0]}function _(){return F().testCallbacks()}function D(){return F().optionalFields()}function L(){return F().testObjects()}function A(){(0,L()[1])((function(n){return{prev:n.prev,current:v(n.current)}}))}function X(n){(0,L()[1])((function(t){return{prev:t.prev,current:v(n(t.current))}}))}function U(){return T(b(L()[0].current,(function(n){return n.isPending()?n:null})))}var M,R=w();function G(){var n=L()[0].current;return R([n],(function(){return T(n)}))}!function(n){n.Error="error",n.Warning="warning"}(M||(M={}));var j=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message;var u=e.groupName;e=e.key,this.key=null,this.id=i(),this.severity=M.Error,this.status=H,this.fieldName=n,this.testFn=t,u&&(this.groupName=u),r&&(this.message=r),e&&(this.key=e)}return n.prototype.run=function(){try{var n=this.testFn()}catch(t){x(this.message,t)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isFinalStatus()&&n!==J||(this.status=n)},n.prototype.warns=function(){return this.severity===M.Warning},n.prototype.setPending=function(){this.setStatus(Y)},n.prototype.fail=function(){this.setStatus(this.warns()?B:V)},n.prototype.done=function(){this.isFinalStatus()||this.setStatus(q)},n.prototype.warn=function(){this.severity=M.Warning},n.prototype.isFinalStatus=function(){return this.hasFailures()||this.isCanceled()||this.isPassing()},n.prototype.skip=function(n){this.isPending()&&!n||this.setStatus(K)},n.prototype.cancel=function(){this.setStatus(z),A()},n.prototype.omit=function(){this.setStatus(J)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isNonActionable=function(){return this.isSkipped()||this.isOmitted()||this.isCanceled()},n.prototype.isPending=function(){return this.status===Y},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isOmitted=function(){return this.status===J},n.prototype.isUntested=function(){return this.status===H},n.prototype.isFailing=function(){return this.status===V},n.prototype.isCanceled=function(){return this.status===z},n.prototype.isSkipped=function(){return this.status===K},n.prototype.isPassing=function(){return this.status===q},n.prototype.isWarning=function(){return this.status===B},n}(),H="UNTESTED",K="SKIPPED",V="FAILED",B="WARNING",q="PASSING",Y="PENDING",z="CANCELED",J="OMITTED";function Q(){return h.useX().testCursor.getCursor()}function Z(){return h.useX().testCursor.cursorAt()}function $(){return h.useX().testCursor.next()}function nn(n,r){if(n=void 0===(n=n.type)?t.DEFAULT:n,o(r)){var e={current:{},prev:{}},u=Q();return h.run({isolate:{type:n,keys:e}},(function(){h.useX().testCursor.addLevel(),e.prev=v(k(L()[0].prev,Q())).reduce((function(n,t){return t instanceof j&&!O(t.key)?(n[t.key]=t,n):n}),{}),X((function(n){return C(n,u,[])}));var n=r();return h.useX().testCursor.removeLevel(),$(),n}))}}function tn(n,t){return Object.prototype.hasOwnProperty.call(n,t)}function rn(n){if(n){if(function(n){return"number"==typeof n}(n))return 0===n;if(tn(n,"length"))return I(n,0);if("object"==typeof n)return I(Object.keys(n),0)}return!0}var en=m(rn);function un(n,t){return!!t&&!on(n,t)}function on(n,t){return!(!t||n.fieldName!==t)}function sn(n){var t=U();return!rn(t)&&(n?t.some((function(t){return on(t,n)})):en(t))}function cn(n,t){function r(n,t){i[n]++,u&&(i[t]=(i[t]||[]).concat(u))}var e=t.fieldName,u=t.message;n[e]=n[e]||{errorCount:0,warnCount:0,testCount:0};var i=n[e];return t.isNonActionable()||(n[e].testCount++,t.isFailing()?r("errorCount","errors"):t.isWarning()&&r("warnCount","warnings")),i}var an=function(){return(an=Object.assign||function(n){for(var t,r=1,e=arguments.length;r<e;r++)for(var u in t=arguments[r])Object.prototype.hasOwnProperty.call(t,u)&&(n[u]=t[u]);return n}).apply(this,arguments)};function fn(n,t,r){if(r||2===arguments.length)for(var e,u=0,i=t.length;u<i;u++)!e&&u in t||(e||(e=Array.prototype.slice.call(t,0,u)),e[u]=t[u]);return n.concat(e||t)}function ln(n,t){return function(n,t){return!!n!=!!t}("warnings"===n,t.warns())}function pn(n,t,r){var e;void 0===r&&(r={});var u=(r=r||{}).group,i=r.fieldName;return t.reduce((function(t,r){return function(n,t,r,e){return!!(function(n,t){return!(!t||n.groupName===t)}(n,r)||un(n,e)||ln(t,n))}(r,n,u,i)||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),an({},i&&((e={})[i]=[],e)))}function vn(n,t){return t?n[t]:n}function dn(n){return hn("errors",n)}function gn(n){return hn("warnings",n)}function hn(n,t){return vn(n=pn(n,G(),{fieldName:t}),t)}function mn(n,t){return vn(n=En("errors",n,t),t)}function yn(n,t){return vn(n=En("warnings",n,t),t)}function En(n,t,r){return t||a("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),pn(n,G(),{group:t,fieldName:r})}function Nn(n,t,r){return!(!n.hasFailures()||un(n,r)||ln(t,n))}function bn(n){return Tn("errors",n)}function Cn(n){return Tn("warnings",n)}function Tn(n,t){return G().some((function(r){return Nn(r,n,t)}))}function kn(n,t){return On("errors",n,t)}function Sn(n,t){return On("warnings",n,t)}function On(n,t,r){return G().some((function(e){return t===e.groupName&&Nn(e,n,r)}))}function Pn(n,t){return!!function(n){var t=G().reduce((function(n,t){return n[t.fieldName]||t.isOmitted()&&(n[t.fieldName]=!0),n}),{});return!!n&&!!t[n]}(t)||!n.hasErrors(t)&&(!(rn(G())||function(n,t){return!!t&&rn(n.tests[t])}(n,t)||function(n){var t=D()[0];return en(U().filter((function(r){return!un(r,n)&&!0!==t[r.fieldName]})))}(t))&&function(n){var t=G(),r=D()[0];return t.every((function(t){return!!un(t,n)||(!0===r[t.fieldName]||t.isTested()||t.isOmitted())}))}(t))}var xn=w(20);function In(){var n=G(),t={stateRef:F()};return xn([n],h.bind(t,(function(){var n=F().suiteName()[0];return u(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return G().forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=cn(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=cn(n.groups[e],t))})),function(n){for(var t in n.tests)n.errorCount+=n.tests[t].errorCount,n.warnCount+=n.tests[t].warnCount,n.testCount+=n.tests[t].testCount;return n}(n)}(),{getErrors:h.bind(t,dn),getErrorsByGroup:h.bind(t,mn),getWarnings:h.bind(t,gn),getWarningsByGroup:h.bind(t,yn),hasErrors:h.bind(t,bn),hasErrorsByGroup:h.bind(t,kn),hasWarnings:h.bind(t,Cn),hasWarningsByGroup:h.bind(t,Sn),isValid:h.bind(t,(function(n){return Pn(In(),n)})),suiteName:n})})))}var wn=w(20);function Fn(){var n=G(),t={stateRef:F()};return wn([n],h.bind(t,(function(){return u({},In(),{done:h.bind(t,Ln)})})))}function Wn(n,t,r){return!(o(n)&&(!t||r.tests[t]&&!rn(r.tests[t].testCount)))}function _n(n){return!(sn()&&(!n||sn(n)))}var Dn,Ln=function(){for(var n=[],t=0;t<arguments.length;t++)n[t]=arguments[t];var r=(n=n.reverse())[0];if(n=n[1],t=Fn(),Wn(r,n,t))return t;var e=function(){return r(In())};return _n(n)?(e(),t):(An(e,n),t)};function An(n,t){var r=h.bind({},n);(0,_()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Xn(n){return n.forEach((function(n){return n()}))}function Un(){var n=function(){var n={};return{emit:function(t,r){n[t]&&n[t].forEach((function(n){n(r)}))},on:function(t,r){return n[t]||(n[t]=[]),n[t].push(r),{off:function(){n[t]=n[t].filter((function(n){return n!==r}))}}}}}();return n.on(Dn.TEST_COMPLETED,(function(n){n.isCanceled()||(n.done(),function(n){var t=_()[0].fieldCallbacks;n&&!sn(n)&&y(t[n])&&Xn(t[n])}(n.fieldName),function(){var n=_()[0].doneCallbacks;sn()||Xn(n)}())})),n.on(Dn.SUITE_COMPLETED,(function(){!function(){var n=D()[0];if(!rn(n)){var t={};X((function(r){return b(r,(function(r){var e=r.fieldName;if(t.hasOwnProperty(e))t[r.fieldName]&&r.omit();else{var u=n[e];o(u)&&(t[e]=u(),t[r.fieldName]&&r.omit())}return r}))}))}}()})),n.on(Dn.REMOVE_FIELD,(function(n){G().forEach((function(t){on(t,n)&&(t.cancel(),function(n){X((function(t){return b(t,(function(t){return n!==t?t:null}))}))}(t))}))})),n}function Mn(){var n=h.useX();return n.bus||a(),n.bus}!function(n){n.TEST_COMPLETED="test_completed",n.REMOVE_FIELD="remove_field",n.SUITE_COMPLETED="suite_completed"}(Dn||(Dn={}));function Rn(n){return Kn(0,"tests",n)}function Gn(n){return Kn(1,"tests",n)}function jn(){return!!h.useX().skipped}function Hn(n){var t=n.fieldName;if(n=n.groupName,jn())return!0;var r=h.useX().exclusion,e=r.tests,u=e[t];if(!1===u)return!0;if(u=!0===u,n){if(function(n){var t=h.useX().exclusion.groups;if(tn(t,n))return!1===t[n];for(var r in t)if(!0===t[r])return!0;return!1}(n))return!0;if(!0===r.groups[n])return!u&&(!!Vn(e)||!1===e[t])}return!!function(n){var t=h.useX().exclusion;return!!function(){var n,t=h.useX().exclusion;for(n in t.groups)if(t.groups[n])return!0;return!1}()&&(!n||(!(n in t.groups)||!t.groups[n]))}(n)||!u&&Vn(e)}function Kn(n,t,r){var e=h.useX("hook called outside of a running suite.");r&&v(r).forEach((function(r){P(r)&&(e.exclusion[t][r]=0===n)}))}function Vn(n){for(var t in n)if(!0===n[t])return!0;return!1}function Bn(n){a("Wrong arguments passed to group. Group "+n+".")}Rn.group=function(n){return Kn(0,"groups",n)},Gn.group=function(n){return Kn(1,"groups",n)};var qn=m(P);function Yn(n){return n&&o(n.then)}function zn(n,t){return n.fieldName===t.fieldName&&n.groupName===t.groupName}function Jn(n){var t=n.asyncTest,r=n.message;if(Yn(t)){var e=Mn().emit,u=F(),i=h.bind({stateRef:u},(function(){A(),e(Dn.TEST_COMPLETED,n)}));u=h.bind({stateRef:u},(function(t){n.isCanceled()||(n.message=P(t)?t:r,n.fail(),i())}));try{t.then(i,u)}catch(n){u()}}}function Qn(n){var t=Mn(),r=function(n){return h.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){x(n.message,r)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}(n);try{Yn(r)?(n.asyncTest=r,n.setPending(),Jn(n)):t.emit(Dn.TEST_COMPLETED,n)}catch(t){a("Your test function "+n.fieldName+' returned a value. Only "false" or Promise returns are supported.')}}function Zn(n){var r=L()[0].prev;return rn(r)?($n(n),n):(r=function(n){var t=Q();return function(n,t){return k(n,t)[d(t)]}(n,t)}(r),O(n.key)?(function(n,t){return en(n)&&!zn(n,t)}(r,n)&&(function(n,r){h.useX().isolate.type===t.EACH||f("Vest Critical Error: Tests called in different order than previous run.\n expected: "+n.fieldName+"\n received: "+r.fieldName+'\n This can happen on one of two reasons:\n 1. You\'re using if/else statements to conditionally select tests. Instead, use "skipWhen".\n 2. You are iterating over a list of tests, and their order changed. Use "each" and a custom key prop so that Vest retains their state.')}(r,n),function(){var n=L(),t=n[1],r=n[0].prev;n=k(r,Q());var e=Z();n.splice(e),t((function(n){return{prev:r,current:n.current}}))}(),r=null),$n(n=c(r,n)),n):($n(n=function(n,t){var r=function(n){return h.useX().isolate.keys.prev[n]}(n);return r&&(t=r),function(n,t){var r=h.useX().isolate.keys.current;O(r[n])?r[n]=t:f('Encountered the same test key "'+n+"\" twice. This may lead to tests overriding each other's results, or to tests being unexpectedly omitted.")}(n,t),t}(n.key,n)),n))}function $n(n){var t=Q();X((function(r){return C(r,t,n)}))}function nt(n){var t=Zn(n);return h.useX().omitted?(t.omit(),$(),t):Hn(n)?(t.skip(jn()),$(),t):(function(n,t){t!==n&&zn(n,t)&&n.isPending()&&n.cancel()}(t,n),$n(n),$(),function(n){n.isUntested()?Qn(n):Yn(n.asyncTest)&&(n.setPending(),Jn(n))}(n),n)}function tt(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var e=o(t[1])?t:fn([void 0],t);t=e[0],r=e[1],e=e[2],qn(n)&&et("fieldName","string"),o(r)||et("Test callback","function");var u=h.useX();return nt(t=new j(n,r,{message:t,groupName:u.groupName,key:e}))}var rt=u(tt,{memo:function(n){var t=w(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=Z();var i=(e=e.reverse())[0],o=e[1],s=e[2];return u=[W(),r,u].concat(i),E(e=t.get(u))?t(u,(function(){return n(r,s,o)})):e[1].isCanceled()?(t.invalidate(u),t(u,(function(){return n(r,s,o)}))):nt(e[1])}}(tt)});function et(n,t){a("Incompatible params passed to test function. "+n+" must be a "+t)}Object.defineProperty(exports,"enforce",{enumerable:!0,get:function(){return r.enforce}}),exports.VERSION="4.0.0-next-084233",exports.context=h,exports.create=function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var e=(n=n.reverse())[0];n=n[1],o(e)||a("vest.create: Expected callback to be a function.");var s=Un(),c=l();return n={stateRef:p(c,{suiteId:i(),suiteName:n}),bus:s},u(h.bind(n,(function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];return c.reset(),nn({type:t.SUITE},(function(){e.apply(void 0,n)})),s.emit(Dn.SUITE_COMPLETED),Fn()})),{get:h.bind(n,In),reset:c.reset,remove:h.bind(n,(function(n){s.emit(Dn.REMOVE_FIELD,n)}))})},exports.each=function(n,r){o(r)||a("callback must be a function"),nn({type:t.EACH},(function(){n.forEach((function(n,t){r(n,t)}))}))},exports.group=function(n,r){P(n)||Bn("name must be a string"),o(r)||Bn("callback must be a function"),nn({type:t.GROUP},(function(){h.run({groupName:n},r)}))},exports.omitWhen=function(n,r){nn({type:t.OMIT_WHEN},(function(){h.run({omitted:s(n,s(In))},(function(){return r()}))}))},exports.only=Rn,exports.optional=function(n){(0,D()[1])((function(t){if(y(n)||P(n))v(n).forEach((function(n){t[n]=!0}));else for(var r in n)t[r]=n[r];return t}))},exports.skip=Gn,exports.skipWhen=function(n,r){nn({type:t.SKIP_WHEN},(function(){h.run({skipped:s(n,s(In))},(function(){return r()}))}))},exports.test=rt,exports.warn=function(){var n=h.useX("warn hook called outside of a running suite.");n.currentTest||a("warn called outside of a test."),n.currentTest.warn()};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var n,t,e=require("n4s"),r=require("context"),u=Object.assign,i=(n=0,function(){return""+n++});function o(n){return"function"==typeof n}function s(n){for(var t=[],e=1;e<arguments.length;e++)t[e-1]=arguments[e];return o(n)?n.apply(void 0,t):n}function c(n,t){var e;return null!==(e=s(n))&&void 0!==e?e:t}function a(n,t){throw Error(c(t,n))}function f(n,t){setTimeout((function(){a(n,t)}),0)}function l(n){function t(n,t,u){return r.references.push(),e(n,s(t,u)),function(){return[r.references[n],function(t){return e(n,s(t,r.references[n]))}]}}function e(t,e){var i=r.references[t];r.references[t]=e,o(t=u[t][1])&&t(e,i),o(n)&&n()}var r={references:[]},u=[];return{registerStateKey:function(n,e){var r=u.length;return u.push([n,e]),t(r,n)},reset:function(){var n=r.references;r.references=[],u.forEach((function(e,r){return t(r,e[0],n[r])}))}}}function p(n,t){var e=t.suiteId;return t=t.suiteName,{optionalFields:n.registerStateKey((function(){return{}})),suiteId:n.registerStateKey(e),suiteName:n.registerStateKey(t),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(n){return{prev:n?n.current:[],current:[]}}))}}function v(n){return[].concat(n)}function d(n){return(n=v(n))[n.length-1]}function g(){function n(){t=[0]}var t=[];return n(),{addLevel:function(){t.push(0)},cursorAt:function(){return d(t)},getCursor:function(){return v(t)},next:function(){return t[t.length-1]++,d(t)},removeLevel:function(){t.pop()},reset:n}}!function(n){n[n.DEFAULT=0]="DEFAULT",n[n.SUITE=1]="SUITE",n[n.EACH=2]="EACH",n[n.SKIP_WHEN=3]="SKIP_WHEN",n[n.OMIT_WHEN=4]="OMIT_WHEN",n[n.GROUP=5]="GROUP"}(t||(t={}));var h=r.createContext((function(n,e){return e?null:u({},{exclusion:{tests:{},groups:{}},inclusion:{},isolate:{type:t.DEFAULT,keys:{current:{},prev:{}}},testCursor:g()},n)}));function m(n){return function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return!n.apply(void 0,t)}}function y(n){return!!Array.isArray(n)}function E(n){return null===n}var N=m(E);function b(n,t){for(var e=[],r=0;r<n.length;r++){var u=n[r];y(u)?e.push(b(u,t)):(u=t(u),N(u)&&e.push(u))}return e}function C(n,t,e){return k(n,t)[d(t)]=e,n}function T(n){return v(n).reduce((function(n,t){return y(t)?n.concat(T(t)):v(n).concat(t)}),[])}function k(n,t){var e=0;for(t=t.slice(0,-1);e<t.length;e++){var r=t[e];n[r]=c(n[r],[]),n=n[r]}return n}function S(n){return void 0===n}function O(n){return E(n)||S(n)}function x(n){return String(n)===n}function P(n,t){return S(n)&&x(t)}function I(n,t){return n.length===Number(t)}function w(n){void 0===n&&(n=1);var t=[],e=function(r,u){var i=e.get(r);return i?i[1]:(u=u(),t.unshift([r.concat(),u]),function(n,t){return n.length>Number(t)}(t,n)&&(t.length=n),u)};return e.invalidate=function(n){var e=t.findIndex((function(t){var e=t[0];return I(n,e.length)&&n.every((function(n,t){return n===e[t]}))}));-1<e&&t.splice(e,1)},e.get=function(n){return t[t.findIndex((function(t){var e=t[0];return I(n,e.length)&&n.every((function(n,t){return n===e[t]}))}))]||null},e}function F(){return h.useX().stateRef}function W(){return F().suiteId()[0]}function X(){return F().testCallbacks()}function _(){return F().optionalFields()}function A(){return F().testObjects()}function D(){(0,A()[1])((function(n){return{prev:n.prev,current:v(n.current)}}))}function L(n){(0,A()[1])((function(t){return{prev:t.prev,current:v(n(t.current))}}))}function U(){return T(b(A()[0].current,(function(n){return n.isPending()?n:null})))}var M,R=w();function G(){var n=A()[0].current;return R([n],(function(){return T(n)}))}!function(n){n.Error="error",n.Warning="warning"}(M||(M={}));var j=function(){function n(n,t,e){var r=void 0===e?{}:e;e=r.message;var u=r.groupName;r=r.key,this.key=null,this.id=i(),this.severity=M.Error,this.status=H,this.fieldName=n,this.testFn=t,u&&(this.groupName=u),e&&(this.message=e),r&&(this.key=r)}return n.prototype.run=function(){try{var n=this.testFn()}catch(t){P(this.message,t)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isFinalStatus()&&n!==J||(this.status=n)},n.prototype.warns=function(){return this.severity===M.Warning},n.prototype.setPending=function(){this.setStatus(Y)},n.prototype.fail=function(){this.setStatus(this.warns()?B:V)},n.prototype.done=function(){this.isFinalStatus()||this.setStatus(q)},n.prototype.warn=function(){this.severity=M.Warning},n.prototype.isFinalStatus=function(){return this.hasFailures()||this.isCanceled()||this.isPassing()},n.prototype.skip=function(n){this.isPending()&&!n||this.setStatus(K)},n.prototype.cancel=function(){this.setStatus(z),D()},n.prototype.omit=function(){this.setStatus(J)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isNonActionable=function(){return this.isSkipped()||this.isOmitted()||this.isCanceled()},n.prototype.isPending=function(){return this.status===Y},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isOmitted=function(){return this.status===J},n.prototype.isUntested=function(){return this.status===H},n.prototype.isFailing=function(){return this.status===V},n.prototype.isCanceled=function(){return this.status===z},n.prototype.isSkipped=function(){return this.status===K},n.prototype.isPassing=function(){return this.status===q},n.prototype.isWarning=function(){return this.status===B},n}(),H="UNTESTED",K="SKIPPED",V="FAILED",B="WARNING",q="PASSING",Y="PENDING",z="CANCELED",J="OMITTED";function Q(){return h.useX().testCursor.getCursor()}function Z(){return h.useX().testCursor.cursorAt()}function $(){return h.useX().testCursor.next()}function nn(n,e){if(n=void 0===(n=n.type)?t.DEFAULT:n,o(e)){var r={current:{},prev:{}},u=Q();return h.run({isolate:{type:n,keys:r}},(function(){h.useX().testCursor.addLevel(),r.prev=v(k(A()[0].prev,Q())).reduce((function(n,t){return t instanceof j&&!O(t.key)?(n[t.key]=t,n):n}),{}),L((function(n){return C(n,u,[])}));var n=e();return h.useX().testCursor.removeLevel(),$(),n}))}}function tn(n,t){return Object.prototype.hasOwnProperty.call(n,t)}function en(n){if(n){if(function(n){return"number"==typeof n}(n))return 0===n;if(tn(n,"length"))return I(n,0);if("object"==typeof n)return I(Object.keys(n),0)}return!0}var rn=m(en);function un(n,t){return!!t&&!on(n,t)}function on(n,t){return!(!t||n.fieldName!==t)}function sn(n){var t=U();return!en(t)&&(n?t.some((function(t){return on(t,n)})):rn(t))}function cn(n,t){function e(n,t){i[n]++,u&&(i[t]=(i[t]||[]).concat(u))}var r=t.fieldName,u=t.message;n[r]=n[r]||{errorCount:0,warnCount:0,testCount:0};var i=n[r];return t.isNonActionable()||(n[r].testCount++,t.isFailing()?e("errorCount","errors"):t.isWarning()&&e("warnCount","warnings")),i}var an=function(){return(an=Object.assign||function(n){for(var t,e=1,r=arguments.length;e<r;e++)for(var u in t=arguments[e])Object.prototype.hasOwnProperty.call(t,u)&&(n[u]=t[u]);return n}).apply(this,arguments)};function fn(n,t,e){if(e||2===arguments.length)for(var r,u=0,i=t.length;u<i;u++)!r&&u in t||(r||(r=Array.prototype.slice.call(t,0,u)),r[u]=t[u]);return n.concat(r||Array.prototype.slice.call(t))}function ln(n,t){return function(n,t){return!!n!=!!t}("warnings"===n,t.warns())}function pn(n,t,e){var r;void 0===e&&(e={});var u=(e=e||{}).group,i=e.fieldName;return t.reduce((function(t,e){return function(n,t,e,r){return!!(function(n,t){return!(!t||n.groupName===t)}(n,e)||un(n,r)||ln(t,n))}(e,n,u,i)||!e.hasFailures()||(t[e.fieldName]=(t[e.fieldName]||[]).concat(e.message||[])),t}),an({},i&&((r={})[i]=[],r)))}function vn(n,t){return t?n[t]:n}function dn(n){return hn("errors",n)}function gn(n){return hn("warnings",n)}function hn(n,t){return vn(n=pn(n,G(),{fieldName:t}),t)}function mn(n,t){return vn(n=En("errors",n,t),t)}function yn(n,t){return vn(n=En("warnings",n,t),t)}function En(n,t,e){return t||a("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),pn(n,G(),{group:t,fieldName:e})}function Nn(n,t,e){return!(!n.hasFailures()||un(n,e)||ln(t,n))}function bn(n){return Tn("errors",n)}function Cn(n){return Tn("warnings",n)}function Tn(n,t){return G().some((function(e){return Nn(e,n,t)}))}function kn(n,t){return On("errors",n,t)}function Sn(n,t){return On("warnings",n,t)}function On(n,t,e){return G().some((function(r){return t===r.groupName&&Nn(r,n,e)}))}function xn(n,t){return!!function(n){var t=G().reduce((function(n,t){return n[t.fieldName]||t.isOmitted()&&(n[t.fieldName]=!0),n}),{});return!!n&&!!t[n]}(t)||!n.hasErrors(t)&&(!(en(G())||function(n,t){return!!t&&en(n.tests[t])}(n,t)||function(n){var t=_()[0];return rn(U().filter((function(e){return!un(e,n)&&!0!==t[e.fieldName]})))}(t))&&function(n){var t=G(),e=_()[0];return t.every((function(t){return!!un(t,n)||(!0===e[t.fieldName]||t.isTested()||t.isOmitted())}))}(t))}var Pn=w(20);function In(){var n=G(),t={stateRef:F()};return Pn([n],h.bind(t,(function(){var n=F().suiteName()[0];return u(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return G().forEach((function(t){var e=t.fieldName,r=t.groupName;n.tests[e]=cn(n.tests,t),r&&(n.groups[r]=n.groups[r]||{},n.groups[r][e]=cn(n.groups[r],t))})),function(n){for(var t in n.tests)n.errorCount+=n.tests[t].errorCount,n.warnCount+=n.tests[t].warnCount,n.testCount+=n.tests[t].testCount;return n}(n)}(),{getErrors:h.bind(t,dn),getErrorsByGroup:h.bind(t,mn),getWarnings:h.bind(t,gn),getWarningsByGroup:h.bind(t,yn),hasErrors:h.bind(t,bn),hasErrorsByGroup:h.bind(t,kn),hasWarnings:h.bind(t,Cn),hasWarningsByGroup:h.bind(t,Sn),isValid:h.bind(t,(function(n){return xn(In(),n)})),suiteName:n})})))}var wn=w(20);function Fn(){var n=G(),t={stateRef:F()};return wn([n],h.bind(t,(function(){return u({},In(),{done:h.bind(t,An)})})))}function Wn(n,t,e){return!(o(n)&&(!t||e.tests[t]&&!en(e.tests[t].testCount)))}function Xn(n){return!(sn()&&(!n||sn(n)))}var _n,An=function(){for(var n=[],t=0;t<arguments.length;t++)n[t]=arguments[t];var e=(n=n.reverse())[0];if(n=n[1],t=Fn(),Wn(e,n,t))return t;var r=function(){return e(In())};return Xn(n)?(r(),t):(Dn(r,n),t)};function Dn(n,t){var e=h.bind({},n);(0,X()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(e):n.doneCallbacks.push(e),n}))}function Ln(n){return n.forEach((function(n){return n()}))}function Un(){var n=function(){var n={};return{emit:function(t,e){n[t]&&n[t].forEach((function(n){n(e)}))},on:function(t,e){return n[t]||(n[t]=[]),n[t].push(e),{off:function(){n[t]=n[t].filter((function(n){return n!==e}))}}}}}();return n.on(_n.TEST_COMPLETED,(function(n){n.isCanceled()||(n.done(),function(n){var t=X()[0].fieldCallbacks;n&&!sn(n)&&y(t[n])&&Ln(t[n])}(n.fieldName),function(){var n=X()[0].doneCallbacks;sn()||Ln(n)}())})),n.on(_n.SUITE_COMPLETED,(function(){!function(){var n=_()[0];if(!en(n)){var t={};L((function(e){return b(e,(function(e){var r=e.fieldName;if(t.hasOwnProperty(r))t[e.fieldName]&&e.omit();else{var u=n[r];o(u)&&(t[r]=u(),t[e.fieldName]&&e.omit())}return e}))}))}}()})),n.on(_n.REMOVE_FIELD,(function(n){G().forEach((function(t){on(t,n)&&(t.cancel(),function(n){L((function(t){return b(t,(function(t){return n!==t?t:null}))}))}(t))}))})),n}function Mn(){var n=h.useX();return n.bus||a(),n.bus}!function(n){n.TEST_COMPLETED="test_completed",n.REMOVE_FIELD="remove_field",n.SUITE_COMPLETED="suite_completed"}(_n||(_n={}));function Rn(n){return Kn(0,"tests",n)}function Gn(n){return Kn(1,"tests",n)}function jn(){return!!h.useX().skipped}function Hn(n){var t=n.fieldName;if(n=n.groupName,jn())return!0;var e=h.useX(),r=e.exclusion;e=e.inclusion;var u=r.tests,i=u[t];if(!1===i)return!0;if(i=!0===i,n){if(function(n){var t=h.useX().exclusion.groups;if(tn(t,n))return!1===t[n];for(var e in t)if(!0===t[e])return!0;return!1}(n))return!0;if(!0===r.groups[n])return!i&&(!!Vn(u)||!1===u[t])}return!!function(n){var t=h.useX().exclusion;return!!function(){var n,t=h.useX().exclusion;for(n in t.groups)if(t.groups[n])return!0;return!1}()&&(!n||(!(n in t.groups)||!t.groups[n]))}(n)||!i&&(!!Vn(u)&&!s(e[t]))}function Kn(n,t,e){var r=h.useX("hook called outside of a running suite.");e&&v(e).forEach((function(e){x(e)&&(r.exclusion[t][e]=0===n)}))}function Vn(n){for(var t in n)if(!0===n[t])return!0;return!1}function Bn(n){a("Wrong arguments passed to group. Group "+n+".")}Rn.group=function(n){return Kn(0,"groups",n)},Gn.group=function(n){return Kn(1,"groups",n)};var qn=m(x);function Yn(n){return n&&o(n.then)}function zn(n,t){return n.fieldName===t.fieldName&&n.groupName===t.groupName}function Jn(n){var t=n.asyncTest,e=n.message;if(Yn(t)){var r=Mn().emit,u=F(),i=h.bind({stateRef:u},(function(){D(),r(_n.TEST_COMPLETED,n)}));u=h.bind({stateRef:u},(function(t){n.isCanceled()||(n.message=x(t)?t:e,n.fail(),i())}));try{t.then(i,u)}catch(n){u()}}}function Qn(n){var t=Mn(),e=function(n){return h.run({currentTest:n},(function(){try{var t=n.testFn()}catch(e){P(n.message,e)&&(n.message=e),t=!1}return!1===t&&n.fail(),t}))}(n);try{Yn(e)?(n.asyncTest=e,n.setPending(),Jn(n)):t.emit(_n.TEST_COMPLETED,n)}catch(t){a("Your test function "+n.fieldName+' returned a value. Only "false" or Promise returns are supported.')}}function Zn(n){var e=A()[0].prev;return en(e)?($n(n),n):(e=function(n){var t=Q();return function(n,t){return k(n,t)[d(t)]}(n,t)}(e),O(n.key)?(function(n,t){return rn(n)&&!zn(n,t)}(e,n)&&(function(n,e){h.useX().isolate.type===t.EACH||f("Vest Critical Error: Tests called in different order than previous run.\n expected: "+n.fieldName+"\n received: "+e.fieldName+'\n This can happen on one of two reasons:\n 1. You\'re using if/else statements to conditionally select tests. Instead, use "skipWhen".\n 2. You are iterating over a list of tests, and their order changed. Use "each" and a custom key prop so that Vest retains their state.')}(e,n),function(){var n=A(),t=n[1],e=n[0].prev;n=k(e,Q());var r=Z();n.splice(r),t((function(n){return{prev:e,current:n.current}}))}(),e=null),$n(n=c(e,n)),n):($n(n=function(n,t){var e=function(n){return h.useX().isolate.keys.prev[n]}(n);return e&&(t=e),function(n,t){var e=h.useX().isolate.keys.current;O(e[n])?e[n]=t:f('Encountered the same test key "'+n+"\" twice. This may lead to tests overriding each other's results, or to tests being unexpectedly omitted.")}(n,t),t}(n.key,n)),n))}function $n(n){var t=Q();L((function(e){return C(e,t,n)}))}function nt(n){var t=Zn(n);return h.useX().omitted?(t.omit(),$(),t):Hn(n)?(t.skip(jn()),$(),t):(function(n,t){t!==n&&zn(n,t)&&n.isPending()&&n.cancel()}(t,n),$n(n),$(),function(n){n.isUntested()?Qn(n):Yn(n.asyncTest)&&(n.setPending(),Jn(n))}(n),n)}function tt(n){for(var t=[],e=1;e<arguments.length;e++)t[e-1]=arguments[e];var r=o(t[1])?t:fn([void 0],t);t=r[0],e=r[1],r=r[2],qn(n)&&rt("fieldName","string"),o(e)||rt("Test callback","function");var u=h.useX();return nt(t=new j(n,e,{message:t,groupName:u.groupName,key:r}))}var et=u(tt,{memo:function(n){var t=w(100);return function(e){for(var r=[],u=1;u<arguments.length;u++)r[u-1]=arguments[u];u=Z();var i=(r=r.reverse())[0],o=r[1],s=r[2];return u=[W(),e,u].concat(i),E(r=t.get(u))?t(u,(function(){return n(e,s,o)})):r[1].isCanceled()?(t.invalidate(u),t(u,(function(){return n(e,s,o)}))):nt(r[1])}}(tt)});function rt(n,t){a("Incompatible params passed to test function. "+n+" must be a "+t)}Object.defineProperty(exports,"enforce",{enumerable:!0,get:function(){return e.enforce}}),exports.VERSION="4.0.2-dev-6e9534",exports.context=h,exports.create=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var r=(n=n.reverse())[0];n=n[1],o(r)||a("vest.create: Expected callback to be a function.");var s=Un(),c=l();return n={stateRef:p(c,{suiteId:i(),suiteName:n}),bus:s},u(h.bind(n,(function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return c.reset(),nn({type:t.SUITE},(function(){r.apply(void 0,n)})),s.emit(_n.SUITE_COMPLETED),Fn()})),{get:h.bind(n,In),reset:c.reset,remove:h.bind(n,(function(n){s.emit(_n.REMOVE_FIELD,n)}))})},exports.each=function(n,e){o(e)||a("callback must be a function"),nn({type:t.EACH},(function(){n.forEach((function(n,t){e(n,t)}))}))},exports.group=function(n,e){x(n)||Bn("name must be a string"),o(e)||Bn("callback must be a function"),nn({type:t.GROUP},(function(){h.run({groupName:n},e)}))},exports.include=function(n){function t(t){var e=h.useX(),r=e.exclusion;e.inclusion[n]=function(){return tn(r.tests,n)?c(r.tests[n],!0):x(t)?!!r.tests[t]:s(t,s(In))}}var e=h.useX();return n?(e.inclusion[n]=c(e.exclusion.tests[n],!0),{when:t}):{when:t}},exports.omitWhen=function(n,e){nn({type:t.OMIT_WHEN},(function(){h.run({omitted:s(n,s(In))},(function(){return e()}))}))},exports.only=Rn,exports.optional=function(n){(0,_()[1])((function(t){if(y(n)||x(n))v(n).forEach((function(n){t[n]=!0}));else for(var e in n)t[e]=n[e];return t}))},exports.skip=Gn,exports.skipWhen=function(n,e){nn({type:t.SKIP_WHEN},(function(){h.run({skipped:s(n,s(In))},(function(){return e()}))}))},exports.test=et,exports.warn=function(){var n=h.useX("warn hook called outside of a running suite.");n.currentTest||a("warn called outside of a test."),n.currentTest.warn()};