vest 3.3.0-dev-549cb1 → 4.0.0-dev-deabb8

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.
@@ -200,7 +200,7 @@
200
200
  return { allOf: allOf, anyOf: anyOf, noneOf: noneOf, oneOf: oneOf, optional: optional$1 };
201
201
  }
202
202
 
203
- function isStringValue (v) {
203
+ function isStringValue(v) {
204
204
  return String(v) === v;
205
205
  }
206
206
 
@@ -611,7 +611,7 @@
611
611
  return ruleReturn(result);
612
612
  }
613
613
  else {
614
- return ruleReturn(result.pass, optionalFunctionValue.apply(void 0, __spreadArray([result.message, ruleName, value], args)));
614
+ return ruleReturn(result.pass, optionalFunctionValue.apply(void 0, __spreadArray([result.message, ruleName, value], args, false)));
615
615
  }
616
616
  }
617
617
  function validateResult(result) {
@@ -645,9 +645,9 @@
645
645
  for (var _i = 0; _i < arguments.length; _i++) {
646
646
  args[_i] = arguments[_i];
647
647
  }
648
- var transformedResult = transformResult.apply(void 0, __spreadArray([ctx$1.run({ value: value }, function () { return rule.apply(void 0, __spreadArray([value], args)); }),
648
+ var transformedResult = transformResult.apply(void 0, __spreadArray([ctx$1.run({ value: value }, function () { return rule.apply(void 0, __spreadArray([value], args, false)); }),
649
649
  ruleName,
650
- value], args));
650
+ value], args, false));
651
651
  if (!transformedResult.pass) {
652
652
  if (isEmpty(transformedResult.message)) {
653
653
  throwError("enforce/" + ruleName + " failed with " + JSON.stringify(value));
@@ -677,7 +677,7 @@
677
677
  }
678
678
  var rule = getRule(ruleName);
679
679
  registeredRules.push(function (value) {
680
- return transformResult.apply(void 0, __spreadArray([rule.apply(void 0, __spreadArray([value], args)), ruleName, value], args));
680
+ return transformResult.apply(void 0, __spreadArray([rule.apply(void 0, __spreadArray([value], args, false)), ruleName, value], args, false));
681
681
  });
682
682
  var proxy = {
683
683
  run: function (value) {
@@ -897,10 +897,6 @@
897
897
  function createCache(maxSize) {
898
898
  if (maxSize === void 0) { maxSize = 10; }
899
899
  var cacheStorage = [];
900
- /**
901
- * @param {any[]} deps dependency array.
902
- * @param {Function} cache action function.
903
- */
904
900
  var cache = function (deps, cacheAction) {
905
901
  var cacheHit = cache.get(deps);
906
902
  // cache hit is not null
@@ -913,10 +909,17 @@
913
909
  }
914
910
  return result;
915
911
  };
916
- /**
917
- * Retrieves an item from the cache.
918
- * @param {deps} deps Dependency array
919
- */
912
+ // invalidate an item in the cache by its dependencies
913
+ cache.invalidate = function (deps) {
914
+ var index = cacheStorage.findIndex(function (_a) {
915
+ var cachedDeps = _a[0];
916
+ return lengthEquals(deps, cachedDeps.length) &&
917
+ deps.every(function (dep, i) { return dep === cachedDeps[i]; });
918
+ });
919
+ if (index > -1)
920
+ cacheStorage.splice(index, 1);
921
+ };
922
+ // Retrieves an item from the cache.
920
923
  cache.get = function (deps) {
921
924
  return cacheStorage[cacheStorage.findIndex(function (_a) {
922
925
  var cachedDeps = _a[0];
@@ -1109,6 +1112,13 @@
1109
1112
  return false;
1110
1113
  }
1111
1114
 
1115
+ function getFailuresArrayOrObject(group, fieldName) {
1116
+ if (fieldName) {
1117
+ return group[fieldName];
1118
+ }
1119
+ return group;
1120
+ }
1121
+
1112
1122
  function getErrors(fieldName) {
1113
1123
  return getFailures('errors', fieldName);
1114
1124
  }
@@ -1123,25 +1133,16 @@
1123
1133
  var failureMessages = collectFailureMessages(severityKey, testObjects, {
1124
1134
  fieldName: fieldName
1125
1135
  });
1126
- if (fieldName) {
1127
- return failureMessages[fieldName];
1128
- }
1129
- return failureMessages;
1136
+ return getFailuresArrayOrObject(failureMessages, fieldName);
1130
1137
  }
1131
1138
 
1132
1139
  function getErrorsByGroup(groupName, fieldName) {
1133
1140
  var errors = getByGroup('errors', groupName, fieldName);
1134
- if (fieldName) {
1135
- return errors[fieldName];
1136
- }
1137
- return errors;
1141
+ return getFailuresArrayOrObject(errors, fieldName);
1138
1142
  }
1139
1143
  function getWarningsByGroup(groupName, fieldName) {
1140
- var errors = getByGroup('warnings', groupName, fieldName);
1141
- if (fieldName) {
1142
- return errors[fieldName];
1143
- }
1144
- return errors;
1144
+ var warnings = getByGroup('warnings', groupName, fieldName);
1145
+ return getFailuresArrayOrObject(warnings, fieldName);
1145
1146
  }
1146
1147
  /**
1147
1148
  * Gets failure messages by group.
@@ -1323,22 +1324,90 @@
1323
1324
  });
1324
1325
  }
1325
1326
 
1327
+ function createBus() {
1328
+ var listeners = {};
1329
+ return {
1330
+ emit: function (event, data) {
1331
+ if (!listeners[event]) {
1332
+ return;
1333
+ }
1334
+ listeners[event].forEach(function (listener) {
1335
+ listener(data);
1336
+ });
1337
+ },
1338
+ on: function (event, handler) {
1339
+ if (!listeners[event]) {
1340
+ listeners[event] = [];
1341
+ }
1342
+ listeners[event].push(handler);
1343
+ return {
1344
+ off: function () {
1345
+ listeners[event] = listeners[event].filter(function (h) { return h !== handler; });
1346
+ }
1347
+ };
1348
+ }
1349
+ };
1350
+ }
1351
+
1352
+ function callEach(arr) {
1353
+ return arr.forEach(function (fn) { return fn(); });
1354
+ }
1355
+
1356
+ /**
1357
+ * Runs done callback per field when async tests are finished running.
1358
+ */
1359
+ function runFieldCallbacks(fieldName) {
1360
+ var fieldCallbacks = useTestCallbacks()[0].fieldCallbacks;
1361
+ if (fieldName) {
1362
+ if (!hasRemainingTests(fieldName) &&
1363
+ Array.isArray(fieldCallbacks[fieldName])) {
1364
+ callEach(fieldCallbacks[fieldName]);
1365
+ }
1366
+ }
1367
+ }
1368
+ /**
1369
+ * Runs unlabelled done callback when async tests are finished running.
1370
+ */
1371
+ function runDoneCallbacks() {
1372
+ var doneCallbacks = useTestCallbacks()[0].doneCallbacks;
1373
+ if (!hasRemainingTests()) {
1374
+ callEach(doneCallbacks);
1375
+ }
1376
+ }
1377
+
1378
+ function initBus() {
1379
+ var bus = createBus();
1380
+ bus.on(Events.TEST_COMPLETED, function (testObject) {
1381
+ if (testObject.isCanceled()) {
1382
+ return;
1383
+ }
1384
+ testObject.done();
1385
+ runFieldCallbacks(testObject.fieldName);
1386
+ runDoneCallbacks();
1387
+ });
1388
+ return bus;
1389
+ }
1390
+ function useBus() {
1391
+ var context = ctx.useX();
1392
+ if (!context.bus) {
1393
+ throwError();
1394
+ }
1395
+ return context.bus;
1396
+ }
1397
+ var Events;
1398
+ (function (Events) {
1399
+ Events["TEST_COMPLETED"] = "test_completed";
1400
+ })(Events || (Events = {}));
1401
+
1326
1402
  // eslint-disable-next-line max-lines-per-function
1327
1403
  function create(suiteCallback) {
1328
1404
  if (!isFunction(suiteCallback)) {
1329
1405
  throwError('Suite initialization error. Expected `tests` to be a function.');
1330
1406
  }
1331
- var handlers = [];
1332
- var state = createState(function () {
1333
- handlers.forEach(function (fn) {
1334
- return fn({
1335
- suiteState: stateRef,
1336
- type: 'suiteStateUpdate'
1337
- });
1338
- });
1339
- });
1407
+ var bus = initBus();
1408
+ var state = createState();
1340
1409
  var stateRef = createStateRef(state, { suiteId: genId() });
1341
- var suite = assign(ctx.bind({ stateRef: stateRef }, function () {
1410
+ var suite = assign(ctx.bind({ stateRef: stateRef, bus: bus }, function () {
1342
1411
  var args = [];
1343
1412
  for (var _i = 0; _i < arguments.length; _i++) {
1344
1413
  args[_i] = arguments[_i];
@@ -1362,16 +1431,7 @@
1362
1431
  }
1363
1432
  });
1364
1433
  }),
1365
- reset: state.reset,
1366
- subscribe: function (handler) {
1367
- if (!isFunction(handler))
1368
- return;
1369
- handlers.push(handler);
1370
- handler({
1371
- type: 'suiteSubscribeInit',
1372
- suiteState: stateRef
1373
- });
1374
- }
1434
+ reset: state.reset
1375
1435
  });
1376
1436
  return suite;
1377
1437
  }
@@ -1503,16 +1563,16 @@
1503
1563
  */
1504
1564
  function group(groupName, tests) {
1505
1565
  if (!isStringValue(groupName)) {
1506
- throwGroupError(groupName);
1566
+ throwGroupError('name must be a string');
1507
1567
  }
1508
1568
  if (!isFunction(tests)) {
1509
- throwGroupError(tests);
1569
+ throwGroupError('callback must be a function');
1510
1570
  }
1511
1571
  // Running with the context applied
1512
- ctx.bind({ groupName: groupName }, tests)();
1572
+ ctx.run({ groupName: groupName }, tests);
1513
1573
  }
1514
- function throwGroupError(value) {
1515
- throwError("group initialization error. Expected \"" + value + "\" to be a string.");
1574
+ function throwGroupError(error) {
1575
+ throwError("Wrong arguments passed to group. Group " + error + ".");
1516
1576
  }
1517
1577
 
1518
1578
  function optional(optionals) {
@@ -1549,6 +1609,7 @@
1549
1609
  }
1550
1610
 
1551
1611
  function shouldUseErrorAsMessage(message, error) {
1612
+ // kind of cheating with this safe guard, but it does the job
1552
1613
  return isUndefined(message) && isStringValue(error);
1553
1614
  }
1554
1615
 
@@ -1623,6 +1684,9 @@
1623
1684
  VestTest.prototype.isTested = function () {
1624
1685
  return this.hasFailures() || this.isPassing();
1625
1686
  };
1687
+ VestTest.prototype.isUntested = function () {
1688
+ return this.status === STATUS_UNTESTED;
1689
+ };
1626
1690
  VestTest.prototype.isFailing = function () {
1627
1691
  return this.status === STATUS_FAILED;
1628
1692
  };
@@ -1648,27 +1712,23 @@
1648
1712
  var STATUS_PENDING = 'PENDING';
1649
1713
  var STATUS_CANCELED = 'CANCELED';
1650
1714
 
1715
+ function isPromise(value) {
1716
+ return value && isFunction(value.then);
1717
+ }
1718
+
1651
1719
  function isSameProfileTest(testObject1, testObject2) {
1652
1720
  return (testObject1.fieldName === testObject2.fieldName &&
1653
1721
  testObject1.groupName === testObject2.groupName);
1654
1722
  }
1655
1723
 
1656
1724
  function cancelOverriddenPendingTest(prevRunTestObject, currentRunTestObject) {
1657
- if (isSameProfileTest(prevRunTestObject, currentRunTestObject) &&
1658
- prevRunTestObject.isPending() &&
1659
- currentRunTestObject !== prevRunTestObject) {
1725
+ if (currentRunTestObject !== prevRunTestObject &&
1726
+ isSameProfileTest(prevRunTestObject, currentRunTestObject) &&
1727
+ prevRunTestObject.isPending()) {
1660
1728
  prevRunTestObject.cancel();
1661
1729
  }
1662
1730
  }
1663
1731
 
1664
- function isPromise(value) {
1665
- return value && isFunction(value.then);
1666
- }
1667
-
1668
- function callEach(arr) {
1669
- return arr.forEach(function (fn) { return fn(); });
1670
- }
1671
-
1672
1732
  /**
1673
1733
  * Runs async test.
1674
1734
  */
@@ -1676,16 +1736,10 @@
1676
1736
  var asyncTest = testObject.asyncTest, message = testObject.message;
1677
1737
  if (!isPromise(asyncTest))
1678
1738
  return;
1739
+ var emit = useBus().emit;
1679
1740
  var stateRef = useStateRef();
1680
1741
  var done = ctx.bind({ stateRef: stateRef }, function () {
1681
- testObject.done();
1682
- // This is for cases in which the suite state was already reset
1683
- if (testObject.isCanceled()) {
1684
- return;
1685
- }
1686
- // Perform required done callback calls and cleanups after the test is finished
1687
- runFieldCallbacks(testObject.fieldName);
1688
- runDoneCallbacks();
1742
+ emit(Events.TEST_COMPLETED, testObject);
1689
1743
  });
1690
1744
  var fail = ctx.bind({ stateRef: stateRef }, function (rejectionMessage) {
1691
1745
  if (testObject.isCanceled()) {
@@ -1706,27 +1760,6 @@
1706
1760
  fail();
1707
1761
  }
1708
1762
  }
1709
- /**
1710
- * Runs done callback per field when async tests are finished running.
1711
- */
1712
- function runFieldCallbacks(fieldName) {
1713
- var fieldCallbacks = useTestCallbacks()[0].fieldCallbacks;
1714
- if (fieldName) {
1715
- if (!hasRemainingTests(fieldName) &&
1716
- Array.isArray(fieldCallbacks[fieldName])) {
1717
- callEach(fieldCallbacks[fieldName]);
1718
- }
1719
- }
1720
- }
1721
- /**
1722
- * Runs unlabelled done callback when async tests are finished running.
1723
- */
1724
- function runDoneCallbacks() {
1725
- var doneCallbacks = useTestCallbacks()[0].doneCallbacks;
1726
- if (!hasRemainingTests()) {
1727
- callEach(doneCallbacks);
1728
- }
1729
- }
1730
1763
 
1731
1764
  /**
1732
1765
  * Runs sync tests - or extracts promise.
@@ -1754,6 +1787,7 @@
1754
1787
  * Registers test, if async - adds to pending array
1755
1788
  */
1756
1789
  function registerTest(testObject) {
1790
+ var emit = useBus().emit;
1757
1791
  // Run test callback.
1758
1792
  // If a promise is returned, set as async and
1759
1793
  // Move to pending list.
@@ -1767,7 +1801,7 @@
1767
1801
  runAsyncTest(testObject);
1768
1802
  }
1769
1803
  else {
1770
- testObject.done();
1804
+ emit(Events.TEST_COMPLETED, testObject);
1771
1805
  }
1772
1806
  }
1773
1807
  catch (_a) {
@@ -1775,6 +1809,29 @@
1775
1809
  }
1776
1810
  }
1777
1811
 
1812
+ function registerPrevRunTest(testObject) {
1813
+ var prevRunTest = useTestAtCursor(testObject);
1814
+ if (isExcluded(testObject)) {
1815
+ testObject.skip();
1816
+ useSetNextCursorAt();
1817
+ return prevRunTest;
1818
+ }
1819
+ cancelOverriddenPendingTest(prevRunTest, testObject);
1820
+ useSetTestAtCursor(testObject);
1821
+ useSetNextCursorAt();
1822
+ registerTestObjectByTier(testObject);
1823
+ return testObject;
1824
+ }
1825
+ function registerTestObjectByTier(testObject) {
1826
+ if (testObject.isUntested()) {
1827
+ registerTest(testObject);
1828
+ }
1829
+ else if (isPromise(testObject.asyncTest)) {
1830
+ testObject.setPending();
1831
+ runAsyncTest(testObject);
1832
+ }
1833
+ }
1834
+
1778
1835
  function bindTestEach(test) {
1779
1836
  /**
1780
1837
  * Run multiple tests using a parameter table
@@ -1791,7 +1848,7 @@
1791
1848
  var _a = args.reverse(), testFn = _a[0], message = _a[1];
1792
1849
  return table.map(function (item) {
1793
1850
  item = asArray(item);
1794
- return test(optionalFunctionValue.apply(void 0, __spreadArray([fieldName], item)), optionalFunctionValue.apply(void 0, __spreadArray([message], item)), function () { return testFn.apply(void 0, item); });
1851
+ return test(optionalFunctionValue.apply(void 0, __spreadArray([fieldName], item, false)), optionalFunctionValue.apply(void 0, __spreadArray([message], item, false)), function () { return testFn.apply(void 0, item); });
1795
1852
  });
1796
1853
  }
1797
1854
  return eachReturn;
@@ -1814,32 +1871,20 @@
1814
1871
  // Implicit dependency for more specificity
1815
1872
  var dependencies = [suiteId, fieldName, cursorAt].concat(deps);
1816
1873
  var cached = cache.get(dependencies);
1817
- // Cache miss. Start fresh
1818
1874
  if (isNull(cached)) {
1875
+ // cache miss
1819
1876
  return cache(dependencies, function () { return test(fieldName, msg, testFn); });
1820
1877
  }
1821
- var testObject = cached[1];
1822
- var prevRunTest = useTestAtCursor(testObject);
1823
- if (isExcluded(testObject)) {
1824
- useSetNextCursorAt();
1825
- return prevRunTest;
1878
+ if (cached[1].isCanceled()) {
1879
+ // cache hit, but test is canceled
1880
+ cache.invalidate(dependencies);
1881
+ return cache(dependencies, function () { return test(fieldName, msg, testFn); });
1826
1882
  }
1827
- cancelOverriddenPendingTest(prevRunTest, testObject);
1828
- useSetTestAtCursor(testObject);
1829
- useSetNextCursorAt();
1830
- handleAsyncTest(testObject);
1831
- return testObject;
1883
+ return registerPrevRunTest(cached[1]);
1832
1884
  }
1833
1885
  return memo;
1834
1886
  }
1835
- function handleAsyncTest(testObject) {
1836
- if (testObject && isPromise(testObject.asyncTest)) {
1837
- testObject.setPending();
1838
- runAsyncTest(testObject);
1839
- }
1840
- }
1841
1887
 
1842
- // eslint-disable-next-line max-statements
1843
1888
  function testBase(fieldName) {
1844
1889
  var args = [];
1845
1890
  for (var _i = 1; _i < arguments.length; _i++) {
@@ -1851,26 +1896,14 @@
1851
1896
  message: message,
1852
1897
  groupName: context === null || context === void 0 ? void 0 : context.groupName
1853
1898
  });
1854
- var prevRunTest = useTestAtCursor(testObject);
1855
- if (isExcluded(testObject)) {
1856
- testObject.skip();
1857
- useSetNextCursorAt();
1858
- return prevRunTest;
1859
- }
1860
- cancelOverriddenPendingTest(prevRunTest, testObject);
1861
- useSetTestAtCursor(testObject);
1862
- useSetNextCursorAt(); // maybe somehow do this only in one place?
1863
- if (!isFunction(testFn))
1864
- return testObject;
1865
- registerTest(testObject);
1866
- return testObject;
1899
+ return registerPrevRunTest(testObject);
1867
1900
  }
1868
1901
  var test = assign(testBase, {
1869
1902
  each: bindTestEach(testBase),
1870
1903
  memo: bindTestMemo(testBase)
1871
1904
  });
1872
1905
 
1873
- var VERSION = "3.3.0-dev-549cb1";
1906
+ var VERSION = "4.0.0-dev-deabb8";
1874
1907
 
1875
1908
  exports.VERSION = VERSION;
1876
1909
  exports.create = create;
@@ -1 +1 @@
1
- "use strict";!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).vest={})}(this,(function(n){function t(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 r(n){return"function"==typeof n}function e(n,t){function r(n){e=!0,u=n}for(var e=!1,u=null,i=0;i<n.length;i++)if(t(n[i],r,i),e)return u}function u(n){for(var t=[],e=1;e<arguments.length;e++)t[e-1]=arguments[e];return r(n)?n.apply(void 0,t):n}function i(n,t){var r;return null!==(r=u(n))&&void 0!==r?r:t}function o(n,t){return n={pass:n},t&&(n.message=t),n}function s(n,t){try{return n.run(t)}catch(n){return o(!1)}}function a(n){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return!n.apply(void 0,t)}}function c(n,t){return n.length===Number(t)}function f(n,t){return n.length>Number(t)}function l(n){return null===n}function p(n){return void 0===n}function g(n){return String(n)===n}function d(n,t){return g(n)&&g(t)&&n.endsWith(t)}function v(n,t){return n===t}function h(n){var t=Number(n);return!(isNaN(parseFloat(String(n)))||isNaN(Number(n))||!isFinite(t))}function y(n,t){return h(n)&&h(t)&&Number(n)>Number(t)}function m(n,t){return h(n)&&h(t)&&Number(n)>=Number(t)}function b(n,t){return!!(Array.isArray(t)||g(t)&&g(n))&&-1!==t.indexOf(n)}function N(n){return!!Array.isArray(n)}function C(n,t){return h(n)&&h(t)&&Number(n)<=Number(t)}function O(n,t,r){return m(n,t)&&C(n,r)}function E(n){return!!n===n}function w(n){return"number"==typeof n}function S(n){if(n){if(w(n))return 0===n;if(Object.prototype.hasOwnProperty.call(n,"length"))return c(n,0);if("object"==typeof n)return c(Object.keys(n),0)}return!0}function x(n){return Number.isNaN(n)}function k(n){return!!h(n)&&0>Number(n)}function T(n){return!!n}function P(n,t){return h(n)&&h(t)&&Number(n)<Number(t)}function j(n,t){return t instanceof RegExp?t.test(n):!!g(t)&&new RegExp(t).test(n)}function F(n,t){return h(n)&&h(t)&&Number(n)===Number(t)}function A(n,t){return g(n)&&g(t)&&n.startsWith(t)}function W(n,t){throw Error(i(t,n))}function I(n){function t(t,u){var i,o,s=r();return t=Rn({},s||{},null!==(i=null==n?void 0:n(t,s))&&void 0!==i?i:t),i=e.ctx=Object.freeze(t),e.ancestry.unshift(i),u=u(i),e.ancestry.shift(),e.ctx=null!==(o=e.ancestry[0])&&void 0!==o?o:null,u}function r(){return e.ctx}var e={ancestry:[]};return{bind:function(n,r){return function(){for(var e=[],u=0;u<arguments.length;u++)e[u]=arguments[u];return t(n,(function(){return r.apply(void 0,e)}))}},run:t,use:r,useX:function(n){var t;return null!==(t=e.ctx)&&void 0!==t?t:W(i(n,"Context was used after it was closed"))}}}function R(){return null}function q(n,t){var r,e=function(r){var e=n[r],u=t[r];if(!(r=tt.run({value:e,set:!0,meta:{key:r}},(function(){return s(u,e)}))).pass)return{value:r}};for(r in t){var u=e(r);if("object"==typeof u)return u.value}return o(!0)}function B(n){for(var t in rt){var e=rt[t];r(e)&&n(t,e)}}function G(){return"function"==typeof Proxy}function K(n,r,e){for(var i=[],s=3;s<arguments.length;s++)i[s-3]=arguments[s];return E(n)||n&&E(n.pass)||W("Incorrect return value for rule: "+JSON.stringify(n)),E(n)?o(n):o(n.pass,u.apply(void 0,t([n.message,r,e],i)))}function X(n){function r(r,e,u){return function(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];if(!(o=K.apply(void 0,t([tt.run({value:n},(function(){return e.apply(void 0,t([n],i))})),u,n],i))).pass){if(!S(o.message))throw o.message;W("enforce/"+u+" failed with "+JSON.stringify(n))}return r}}var e={};if(!G())return B((function(n,t){e[n]=r(e,t,n)})),e;var u=new Proxy(e,{get:function(n,t){if(n=rt[t])return r(u,n,t)}});return u}function D(n){var r,s=[];return function n(a){return function(){for(var c=[],f=0;f<arguments.length;f++)c[f]=arguments[f];var l=rt[a];s.push((function(n){return K.apply(void 0,t([l.apply(void 0,t([n],c)),a,n],c))}));var p={run:function(n){return i(e(s,(function(t,e){var i,s=tt.run({value:n},(function(){return t(n)}));s.pass||e(o(!!s.pass,null!==(i=u(r,n,s.message))&&void 0!==i?i:s.message))})),o(!0))},test:function(n){return p.run(n).pass},message:function(n){return n&&(r=n),p}};return G()?p=new Proxy(p,{get:function(t,r){return rt[r]?n(r):t[r]}}):(B((function(t){p[t]=n(t)})),p)}}(n)}function U(n){var t,r={};for(t in n)r[t]=et.optional(n[t]);return r}function z(n,t){return!(!t||n.fieldName!==t)}function J(n){void 0===n&&(n=10);var t=[],r=function(e,u){var i=r.get(e);return i?i[1]:(u=u(),t.unshift([e.concat(),u]),t.length>n&&(t.length=n),u)};return r.get=function(n){return t[t.findIndex((function(t){var r=t[0];return c(n,r.length)&&n.every((function(n,t){return n===r[t]}))}))]||null},r}function L(){return it.useX().stateRef}function M(){return L().testObjects()}function V(n){var t=L().testObjectsCursor()[0];return _(n=i(L().prevTestObjects()[0][t],n)),n}function _(n){var t=L().testObjectsCursor()[0],r=M();n!==r[0][t]&&(0,r[1])((function(r){return(r=r.slice(0))[t]=n,r}))}function Y(){(0,L().testObjectsCursor()[1])((function(n){return n+1}))}function H(n){return!!L().optionalFields()[0][n]}function Q(){return M()[0].filter((function(n){return n.isPending()}))}function Z(n){var t=Q();return!S(t)&&(n?t.some((function(t){return z(t,n)})):Vn(t))}function $(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.isSkipped()||(n[e].testCount++,t.isFailing()?r("errorCount","errors"):t.isWarning()&&r("warnCount","warnings")),i}function nn(n,t,r){var e;void 0===r&&(r={});var u=(r=r||{}).group,i=r.fieldName;return t.reduce((function(t,r){return u&&r.groupName!==u||i&&!z(r,i)||"warnings"===n!=!!r.warns||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),In({},i&&((e={})[i]=[],e)))}function tn(n){return en("errors",n)}function rn(n){return en("warnings",n)}function en(n,t){return n=nn(n,M()[0],{fieldName:t}),t?n[t]:n}function un(n,t){return n=sn("errors",n,t),t?n[t]:n}function on(n,t){return n=sn("warnings",n,t),t?n[t]:n}function sn(n,t,r){return t||W("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),nn(n,M()[0],{group:t,fieldName:r})}function an(n,t,r){return!(!n.hasFailures()||r&&!z(n,r)||"warnings"===t!=!!n.warns)}function cn(n){return ln("errors",n)}function fn(n){return ln("warnings",n)}function ln(n,t){return M()[0].some((function(r){return an(r,n,t)}))}function pn(n,t){return dn("errors",n,t)}function gn(n,t){return dn("warnings",n,t)}function dn(n,t,r){return M()[0].some((function(e){return t===e.groupName&&an(e,n,r)}))}function vn(n,t){return!n.hasErrors(t)&&(!(S(M()[0])||t&&S(n.tests[t])||Vn(Q().filter((function(n){return!(t&&!z(n,t))&&!H(n.fieldName)}))))&&function(n){return M()[0].every((function(t){return!!(n&&!z(t,n)||H(t.fieldName))||t.isTested()}))}(t))}function hn(){var n=M()[0],t={stateRef:L()};return ot([n],it.bind(t,(function(){return Rn(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return M()[0].forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=$(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=$(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:it.bind(t,tn),getErrorsByGroup:it.bind(t,un),getWarnings:it.bind(t,rn),getWarningsByGroup:it.bind(t,on),hasErrors:it.bind(t,cn),hasErrorsByGroup:it.bind(t,pn),hasWarnings:it.bind(t,fn),hasWarningsByGroup:it.bind(t,gn),isValid:it.bind(t,(function(n){return vn(hn(),n)}))})})))}function yn(){var n=M()[0],t={stateRef:L()};return st([n],it.bind(t,(function(){return Rn({},hn(),{done:it.bind(t,at)})})))}function mn(n,t,e){return!(r(n)&&(!t||e.tests[t]&&0!==e.tests[t].testCount))}function bn(n){return!(Z()&&(!n||Z(n)))}function Nn(n,t){var r=it.bind({},n);(0,L().testCallbacks()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Cn(n){return wn("only","tests",n)}function On(n){return wn("skip","tests",n)}function En(n){var t=n.fieldName;n=n.groupName;var r=it.useX();if(r.skipped)return!0;var e=(r=r.exclusion).tests,u=e[t];if(!1===u)return!0;if(u=!0===u,n){n:{var i=it.useX().exclusion.groups;if(Object.prototype.hasOwnProperty.call(i,n))var o=!1===i[n];else{for(o in i)if(!0===i[o]){o=!0;break n}o=!1}}if(o)return!0;if(!0===r.groups[n])return!u&&(!!Sn(e)||!1===e[t])}return!u&&Sn(e)}function wn(n,t,r){var e=it.useX("hook called outside of a running suite.");r&&[].concat(r).forEach((function(r){g(r)&&(e.exclusion[t][r]="only"===n)}))}function Sn(n){for(var t in n)if(!0===n[t])return!0;return!1}function xn(n){W('group initialization error. Expected "'+n+'" to be a string.',"group name must be a string")}function kn(n,t){n.fieldName===t.fieldName&&n.groupName===t.groupName&&n.isPending()&&t!==n&&n.cancel()}function Tn(n){return n.forEach((function(n){return n()}))}function Pn(n){var t=n.asyncTest,e=n.message;if(t&&r(t.then)){var u=L(),i=it.bind({stateRef:u},(function(){if(n.done(),!n.isCanceled()){var t=n.fieldName,r=L().testCallbacks()[0].fieldCallbacks;t&&!Z(t)&&Array.isArray(r[t])&&Tn(r[t]),t=L().testCallbacks()[0].doneCallbacks,Z()||Tn(t)}}));u=it.bind({stateRef:u},(function(t){n.isCanceled()||(n.message=g(t)?t:e,n.fail(),(0,M()[1])((function(n){return n.slice(0)})),i())}));try{t.then(i,u)}catch(n){u()}}}function jn(n){return it.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){t=r,p(n.message)&&g(t)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}function Fn(n){var t;(t=n)&&(t=(t=n.asyncTest)&&r(t.then)),t&&(n.setPending(),Pn(n))}function An(n){for(var t=[],e=1;e<arguments.length;e++)t[e-1]=arguments[e];e=t.reverse(),t=e[0],e=e[1];var u=it.useX();if(u=V(e=new ct(n,t,{message:e,groupName:null==u?void 0:u.groupName})),En(e))return e.skip(),Y(),u;if(kn(u,e),_(e),Y(),!r(t))return e;t=jn(e);try{t&&r(t.then)?(e.asyncTest=t,e.setPending(),Pn(e)):e.done()}catch(n){W("Your test function "+e.fieldName+" returned "+JSON.stringify(t)+'. Only "false" or a Promise are supported. Return values may cause unexpected behavior.')}return e}var Wn,In=function(){return(In=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)},Rn=Object.assign,qn=a(c),Bn=a(l),Gn=a(p),Kn=a(d),Xn=a(v),Dn=a(h),Un=a(b),zn=a(N),Jn=a(O),Ln=a(E),Mn=a(w),Vn=a(S),_n=a(x),Yn=a(k),Hn=a(g),Qn=a(T),Zn=a(j),$n=a(F),nt=a(A),tt=I((function(n,t){var r={value:n.value,meta:n.meta||{}};return t?n.set?Rn(r,{parent:function(){return t?{value:t.value,meta:t.meta,parent:t.parent}:t}}):t:Rn(r,{parent:R})})),rt=Rn({condition:function(n,t){try{return t(n)}catch(n){return!1}},doesNotEndWith:Kn,doesNotStartWith:nt,endsWith:d,equals:v,greaterThan:y,greaterThanOrEquals:m,gt:y,gte:m,inside:b,isArray:N,isBetween:O,isBoolean:E,isEmpty:S,isEven:function(n){return!!h(n)&&0==n%2},isFalsy:Qn,isNaN:x,isNegative:k,isNotArray:zn,isNotBetween:Jn,isNotBoolean:Ln,isNotEmpty:Vn,isNotNaN:_n,isNotNull:Bn,isNotNumber:Mn,isNotNumeric:Dn,isNotString:Hn,isNotUndefined:Gn,isNull:l,isNumber:w,isNumeric:h,isOdd:function(n){return!!h(n)&&0!=n%2},isPositive:Yn,isString:g,isTruthy:T,isUndefined:p,lengthEquals:c,lengthNotEquals:qn,lessThan:P,lessThanOrEquals:C,longerThan:f,longerThanOrEquals:function(n,t){return n.length>=Number(t)},lt:P,lte:C,matches:j,notEquals:Xn,notInside:Un,notMatches:Zn,numberEquals:F,numberNotEquals:$n,shorterThan:function(n,t){return n.length<Number(t)},shorterThanOrEquals:function(n,t){return n.length<=Number(t)},startsWith:A},{allOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass||r(t)})),o(!0))},anyOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass&&r(t)})),o(!1))},noneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){s(t,n).pass&&r(o(!1))})),o(!0))},oneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var e=[];return t.some((function(t){if(f(e,1))return!1;(t=s(t,n)).pass&&e.push(t)})),o(c(e,1))},optional:function(n,t){return p(n)||null===n?o(!0):s(t,n)}},{shape:function(n,t){var r=q(n,t);if(!r.pass)return r;for(var e in n)if(!Object.prototype.hasOwnProperty.call(t,e))return o(!1);return o(!0)},loose:q,isArrayOf:function(n,t){return i(e(n,(function(n,r,e){(e=tt.run({value:n,set:!0,meta:{index:e}},(function(){return s(t,n)}))).pass||r(e)})),o(!0))}}),et=(Wn=In({context:function(){return tt.useX()},extend:function(n){Rn(rt,n)}},{partial:U}),G()?new Proxy(Rn(X,Wn),{get:function(n,t){return t in n?n[t]:rt[t]?D(t):void 0}}):(B((function(n){Wn[n]=D(n)})),Wn)),ut=function(n){return function(){return""+n++}}(0),it=I((function(n,t){return t?null:Rn({},{exclusion:{tests:{},groups:{}}},n)})),ot=J(20),st=J(20),at=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=yn(),mn(r,n,t))return t;var e=function(){return r(hn())};return bn(n)?(e(),t):(Nn(e,n),t)};Cn.group=function(n){return wn("only","groups",n)},On.group=function(n){return wn("skip","groups",n)};var ct=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message,e=e.groupName,this.id=ut(),this.warns=!1,this.status=ft,this.fieldName=n,this.testFn=t,e&&(this.groupName=e),r&&(this.message=r)}return n.prototype.run=function(){try{var n=this.testFn()}catch(t){n=t,p(this.message)&&g(n)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isCanceled()||(this.status=n)},n.prototype.setPending=function(){this.setStatus(vt)},n.prototype.fail=function(){this.setStatus(this.warns?gt:pt)},n.prototype.done=function(){this.isWarning()||this.isCanceled()||this.isFailing()||this.setStatus(dt)},n.prototype.warn=function(){this.warns=!0},n.prototype.skip=function(){this.setStatus(lt)},n.prototype.cancel=function(){this.setStatus(ht),function(n){(0,M()[1])((function(t){var r=t.indexOf(n);return-1!==r&&t.splice(r,1),[].concat(t)}))}(this)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isPending=function(){return this.status===vt},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isFailing=function(){return this.status===pt},n.prototype.isCanceled=function(){return this.status===ht},n.prototype.isSkipped=function(){return this.status===lt},n.prototype.isPassing=function(){return this.status===dt},n.prototype.isWarning=function(){return this.status===gt},n}(),ft="UNTESTED",lt="SKIPPED",pt="FAILED",gt="WARNING",dt="PASSING",vt="PENDING",ht="CANCELED",yt=Rn(An,{each:function(n){return function(r){return Array.isArray(r)||W("test.each: Expected table to be an array."),function(e){for(var i=[],o=1;o<arguments.length;o++)i[o-1]=arguments[o];var s=(i=i.reverse())[0],a=i[1];return r.map((function(r){return r=[].concat(r),n(u.apply(void 0,t([e],r)),u.apply(void 0,t([a],r)),(function(){return s.apply(void 0,r)}))}))}}}(An),memo:function(n){var t=J(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=L().suiteId()[0];var i=L().testObjectsCursor()[0],o=(e=e.reverse())[1],s=e[2];return e=[u,r,i].concat(e[0]),null===(u=t.get(e))?t(e,(function(){return n(r,s,o)})):(u=V(e=u[1]),En(e)?(Y(),u):(kn(u,e),_(e),Y(),Fn(e),e))}}(An)});n.VERSION="3.3.0-dev-549cb1",n.create=function(n){r(n)||W("Suite initialization error. Expected `tests` to be a function.");var t=[],e=function(n){function t(n,t){return i.references.push(),e(n,u(t)),function(){return[i.references[n],function(t){return e(n,u(t,i.references[n]))}]}}function e(t,e){var u=i.references[t];i.references[t]=e,r(t=o[t][1])&&t(e,u),r(n)&&n()}var i={references:[]},o=[];return{registerStateKey:function(n,r){var e=o.length;return o.push([n,r]),t(e,n)},reset:function(){i.references=[],o.forEach((function(n,r){return t(r,n[0])}))}}}((function(){t.forEach((function(n){return n({suiteState:i,type:"suiteStateUpdate"})}))})),i=function(n,t){var r=t.suiteId;return{optionalFields:n.registerStateKey((function(){return{}})),prevTestObjects:n.registerStateKey((function(){return[]})),suiteId:n.registerStateKey((function(){return r})),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(){return[]})),testObjectsCursor:n.registerStateKey((function(){return 0}))}}(e,{suiteId:ut()});return Rn(it.bind({stateRef:i},(function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var u=M()[0];return r=L().prevTestObjects()[1],e.reset(),r((function(){return u})),n.apply(void 0,t),yn()})),{get:it.bind({stateRef:i},hn),remove:it.bind({stateRef:i},(function(n){var t=M()[0];[].concat(t).forEach((function(t){z(t,n)&&t.cancel()}))})),reset:e.reset,subscribe:function(n){r(n)&&(t.push(n),n({type:"suiteSubscribeInit",suiteState:i}))}})},n.enforce=et,n.group=function(n,t){g(n)||xn(n),r(t)||xn(t),it.bind({groupName:n},t)()},n.only=Cn,n.optional=function(n){(0,L().optionalFields()[1])((function(t){return[].concat(n).forEach((function(n){t[n]=!0})),t}))},n.skip=On,n.skipWhen=function(n,t){it.run({skipped:u(n)},(function(){return t()}))},n.test=yt,n.warn=function(){var n=it.useX("warn hook called outside of a running suite.");n.currentTest||W("warn called outside of a test."),n.currentTest.warn()},Object.defineProperty(n,"__esModule",{value:!0})}));
1
+ "use strict";!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n="undefined"!=typeof globalThis?globalThis:n||self).vest={})}(this,(function(n){function t(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 r(n){return"function"==typeof n}function e(n,t){function r(n){e=!0,u=n}for(var e=!1,u=null,i=0;i<n.length;i++)if(t(n[i],r,i),e)return u}function u(n){for(var t=[],e=1;e<arguments.length;e++)t[e-1]=arguments[e];return r(n)?n.apply(void 0,t):n}function i(n,t){var r;return null!==(r=u(n))&&void 0!==r?r:t}function o(n,t){return n={pass:n},t&&(n.message=t),n}function s(n,t){try{return n.run(t)}catch(n){return o(!1)}}function a(n){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return!n.apply(void 0,t)}}function c(n,t){return n.length===Number(t)}function f(n,t){return n.length>Number(t)}function l(n){return null===n}function p(n){return void 0===n}function d(n){return String(n)===n}function g(n,t){return d(n)&&d(t)&&n.endsWith(t)}function v(n,t){return n===t}function h(n){var t=Number(n);return!(isNaN(parseFloat(String(n)))||isNaN(Number(n))||!isFinite(t))}function y(n,t){return h(n)&&h(t)&&Number(n)>Number(t)}function m(n,t){return h(n)&&h(t)&&Number(n)>=Number(t)}function b(n,t){return!!(Array.isArray(t)||d(t)&&d(n))&&-1!==t.indexOf(n)}function N(n){return!!Array.isArray(n)}function E(n,t){return h(n)&&h(t)&&Number(n)<=Number(t)}function C(n,t,r){return m(n,t)&&E(n,r)}function O(n){return!!n===n}function w(n){return"number"==typeof n}function T(n){if(n){if(w(n))return 0===n;if(Object.prototype.hasOwnProperty.call(n,"length"))return c(n,0);if("object"==typeof n)return c(Object.keys(n),0)}return!0}function S(n){return Number.isNaN(n)}function x(n){return!!h(n)&&0>Number(n)}function k(n){return!!n}function P(n,t){return h(n)&&h(t)&&Number(n)<Number(t)}function j(n,t){return t instanceof RegExp?t.test(n):!!d(t)&&new RegExp(t).test(n)}function F(n,t){return h(n)&&h(t)&&Number(n)===Number(t)}function W(n,t){return d(n)&&d(t)&&n.startsWith(t)}function A(n,t){throw Error(i(t,n))}function I(n){function t(t,u){var i,o,s=r();return t=An({},s||{},null!==(i=null==n?void 0:n(t,s))&&void 0!==i?i:t),i=e.ctx=Object.freeze(t),e.ancestry.unshift(i),u=u(i),e.ancestry.shift(),e.ctx=null!==(o=e.ancestry[0])&&void 0!==o?o:null,u}function r(){return e.ctx}var e={ancestry:[]};return{bind:function(n,r){return function(){for(var e=[],u=0;u<arguments.length;u++)e[u]=arguments[u];return t(n,(function(){return r.apply(void 0,e)}))}},run:t,use:r,useX:function(n){var t;return null!==(t=e.ctx)&&void 0!==t?t:A(i(n,"Context was used after it was closed"))}}}function R(){return null}function q(n,t){var r,e=function(r){var e=n[r],u=t[r];if(!(r=$n.run({value:e,set:!0,meta:{key:r}},(function(){return s(u,e)}))).pass)return{value:r}};for(r in t){var u=e(r);if("object"==typeof u)return u.value}return o(!0)}function B(n){for(var t in nt){var e=nt[t];r(e)&&n(t,e)}}function D(){return"function"==typeof Proxy}function G(n,r,e){for(var i=[],s=3;s<arguments.length;s++)i[s-3]=arguments[s];return O(n)||n&&O(n.pass)||A("Incorrect return value for rule: "+JSON.stringify(n)),O(n)?o(n):o(n.pass,u.apply(void 0,t([n.message,r,e],i,!1)))}function X(n){function r(r,e,u){return function(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];if(!(o=G.apply(void 0,t([$n.run({value:n},(function(){return e.apply(void 0,t([n],i,!1))})),u,n],i,!1))).pass){if(!T(o.message))throw o.message;A("enforce/"+u+" failed with "+JSON.stringify(n))}return r}}var e={};if(!D())return B((function(n,t){e[n]=r(e,t,n)})),e;var u=new Proxy(e,{get:function(n,t){if(n=nt[t])return r(u,n,t)}});return u}function K(n){var r,s=[];return function n(a){return function(){for(var c=[],f=0;f<arguments.length;f++)c[f]=arguments[f];var l=nt[a];s.push((function(n){return G.apply(void 0,t([l.apply(void 0,t([n],c,!1)),a,n],c,!1))}));var p={run:function(n){return i(e(s,(function(t,e){var i,s=$n.run({value:n},(function(){return t(n)}));s.pass||e(o(!!s.pass,null!==(i=u(r,n,s.message))&&void 0!==i?i:s.message))})),o(!0))},test:function(n){return p.run(n).pass},message:function(n){return n&&(r=n),p}};return D()?p=new Proxy(p,{get:function(t,r){return nt[r]?n(r):t[r]}}):(B((function(t){p[t]=n(t)})),p)}}(n)}function _(n){var t,r={};for(t in n)r[t]=tt.optional(n[t]);return r}function L(n,t){return!(!t||n.fieldName!==t)}function M(n){void 0===n&&(n=10);var t=[],r=function(e,u){var i=r.get(e);return i?i[1]:(u=u(),t.unshift([e.concat(),u]),t.length>n&&(t.length=n),u)};return r.invalidate=function(n){var r=t.findIndex((function(t){var r=t[0];return c(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 c(n,r.length)&&n.every((function(n,t){return n===r[t]}))}))]||null},r}function U(){return et.useX().stateRef}function J(){return U().testObjects()}function z(n){var t=U().testObjectsCursor()[0],r=J();n!==r[0][t]&&(0,r[1])((function(r){return(r=r.slice(0))[t]=n,r}))}function V(){(0,U().testObjectsCursor()[1])((function(n){return n+1}))}function Y(n){return!!U().optionalFields()[0][n]}function H(){return J()[0].filter((function(n){return n.isPending()}))}function Q(n){var t=H();return!T(t)&&(n?t.some((function(t){return L(t,n)})):Un(t))}function Z(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.isSkipped()||(n[e].testCount++,t.isFailing()?r("errorCount","errors"):t.isWarning()&&r("warnCount","warnings")),i}function $(n,t,r){var e;void 0===r&&(r={});var u=(r=r||{}).group,i=r.fieldName;return t.reduce((function(t,r){return u&&r.groupName!==u||i&&!L(r,i)||"warnings"===n!=!!r.warns||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),Wn({},i&&((e={})[i]=[],e)))}function nn(n){return rn("errors",n)}function tn(n){return rn("warnings",n)}function rn(n,t){return n=$(n,J()[0],{fieldName:t}),t?n[t]:n}function en(n,t){return n=on("errors",n,t),t?n[t]:n}function un(n,t){return n=on("warnings",n,t),t?n[t]:n}function on(n,t,r){return t||A("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),$(n,J()[0],{group:t,fieldName:r})}function sn(n,t,r){return!(!n.hasFailures()||r&&!L(n,r)||"warnings"===t!=!!n.warns)}function an(n){return fn("errors",n)}function cn(n){return fn("warnings",n)}function fn(n,t){return J()[0].some((function(r){return sn(r,n,t)}))}function ln(n,t){return dn("errors",n,t)}function pn(n,t){return dn("warnings",n,t)}function dn(n,t,r){return J()[0].some((function(e){return t===e.groupName&&sn(e,n,r)}))}function gn(n,t){return!n.hasErrors(t)&&(!(T(J()[0])||t&&T(n.tests[t])||Un(H().filter((function(n){return!(t&&!L(n,t))&&!Y(n.fieldName)}))))&&function(n){return J()[0].every((function(t){return!!(n&&!L(t,n)||Y(t.fieldName))||t.isTested()}))}(t))}function vn(){var n=J()[0],t={stateRef:U()};return ut([n],et.bind(t,(function(){return An(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return J()[0].forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=Z(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=Z(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:et.bind(t,nn),getErrorsByGroup:et.bind(t,en),getWarnings:et.bind(t,tn),getWarningsByGroup:et.bind(t,un),hasErrors:et.bind(t,an),hasErrorsByGroup:et.bind(t,ln),hasWarnings:et.bind(t,cn),hasWarningsByGroup:et.bind(t,pn),isValid:et.bind(t,(function(n){return gn(vn(),n)}))})})))}function hn(){var n=J()[0],t={stateRef:U()};return it([n],et.bind(t,(function(){return An({},vn(),{done:et.bind(t,ot)})})))}function yn(n,t,e){return!(r(n)&&(!t||e.tests[t]&&0!==e.tests[t].testCount))}function mn(n){return!(Q()&&(!n||Q(n)))}function bn(n,t){var r=et.bind({},n);(0,U().testCallbacks()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Nn(n){return n.forEach((function(n){return n()}))}function En(){var n=et.useX();return n.bus||A(),n.bus}function Cn(n){return wn("only","tests",n)}function On(n){return wn("skip","tests",n)}function wn(n,t,r){var e=et.useX("hook called outside of a running suite.");r&&[].concat(r).forEach((function(r){d(r)&&(e.exclusion[t][r]="only"===n)}))}function Tn(n){for(var t in n)if(!0===n[t])return!0;return!1}function Sn(n){A("Wrong arguments passed to group. Group "+n+".")}function xn(n){var t=n.asyncTest,e=n.message;if(t&&r(t.then)){var u=En().emit,i=U(),o=et.bind({stateRef:i},(function(){u(jn.TEST_COMPLETED,n)}));i=et.bind({stateRef:i},(function(t){n.isCanceled()||(n.message=d(t)?t:e,n.fail(),(0,J()[1])((function(n){return n.slice(0)})),o())}));try{t.then(o,i)}catch(n){i()}}}function kn(n){var t=U().testObjectsCursor()[0],e=U().prevTestObjects()[0];if(z(t=i(e[t],n)),function(n){var t=n.fieldName;n=n.groupName;var r=et.useX();if(r.skipped)return!0;var e=(r=r.exclusion).tests,u=e[t];if(!1===u)return!0;if(u=!0===u,n){n:{var i=et.useX().exclusion.groups;if(Object.prototype.hasOwnProperty.call(i,n))var o=!1===i[n];else{for(o in i)if(!0===i[o]){o=!0;break n}o=!1}}if(o)return!0;if(!0===r.groups[n])return!(u||!Tn(e)&&!1!==e[t])}return!u&&Tn(e)}(n))return n.skip(),V(),t;if(n!==t&&t.fieldName===n.fieldName&&t.groupName===n.groupName&&t.isPending()&&t.cancel(),z(n),V(),n.isUntested()){t=En().emit,e=function(n){return et.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){t=r,p(n.message)&&d(t)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}(n);try{e&&r(e.then)?(n.asyncTest=e,n.setPending(),xn(n)):t(jn.TEST_COMPLETED,n)}catch(t){A("Your test function "+n.fieldName+" returned "+JSON.stringify(e)+'. Only "false" or a Promise are supported. Return values may cause unexpected behavior.')}}else(t=n.asyncTest)&&r(t.then)&&(n.setPending(),xn(n));return n}function Pn(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];r=t.reverse(),t=r[0],r=r[1];var e=et.useX();return kn(t=new st(n,t,{message:r,groupName:null==e?void 0:e.groupName}))}var jn,Fn,Wn=function(){return Wn=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},Wn.apply(this,arguments)},An=Object.assign,In=a(c),Rn=a(l),qn=a(p),Bn=a(g),Dn=a(v),Gn=a(h),Xn=a(b),Kn=a(N),_n=a(C),Ln=a(O),Mn=a(w),Un=a(T),Jn=a(S),zn=a(x),Vn=a(d),Yn=a(k),Hn=a(j),Qn=a(F),Zn=a(W),$n=I((function(n,t){var r={value:n.value,meta:n.meta||{}};return t?n.set?An(r,{parent:function(){return t?{value:t.value,meta:t.meta,parent:t.parent}:t}}):t:An(r,{parent:R})})),nt=An({condition:function(n,t){try{return t(n)}catch(n){return!1}},doesNotEndWith:Bn,doesNotStartWith:Zn,endsWith:g,equals:v,greaterThan:y,greaterThanOrEquals:m,gt:y,gte:m,inside:b,isArray:N,isBetween:C,isBoolean:O,isEmpty:T,isEven:function(n){return!!h(n)&&0==n%2},isFalsy:Yn,isNaN:S,isNegative:x,isNotArray:Kn,isNotBetween:_n,isNotBoolean:Ln,isNotEmpty:Un,isNotNaN:Jn,isNotNull:Rn,isNotNumber:Mn,isNotNumeric:Gn,isNotString:Vn,isNotUndefined:qn,isNull:l,isNumber:w,isNumeric:h,isOdd:function(n){return!!h(n)&&0!=n%2},isPositive:zn,isString:d,isTruthy:k,isUndefined:p,lengthEquals:c,lengthNotEquals:In,lessThan:P,lessThanOrEquals:E,longerThan:f,longerThanOrEquals:function(n,t){return n.length>=Number(t)},lt:P,lte:E,matches:j,notEquals:Dn,notInside:Xn,notMatches:Hn,numberEquals:F,numberNotEquals:Qn,shorterThan:function(n,t){return n.length<Number(t)},shorterThanOrEquals:function(n,t){return n.length<=Number(t)},startsWith:W},{allOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass||r(t)})),o(!0))},anyOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass&&r(t)})),o(!1))},noneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){s(t,n).pass&&r(o(!1))})),o(!0))},oneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var e=[];return t.some((function(t){if(f(e,1))return!1;(t=s(t,n)).pass&&e.push(t)})),o(c(e,1))},optional:function(n,t){return p(n)||null===n?o(!0):s(t,n)}},{shape:function(n,t){var r=q(n,t);if(!r.pass)return r;for(var e in n)if(!Object.prototype.hasOwnProperty.call(t,e))return o(!1);return o(!0)},loose:q,isArrayOf:function(n,t){return i(e(n,(function(n,r,e){(e=$n.run({value:n,set:!0,meta:{index:e}},(function(){return s(t,n)}))).pass||r(e)})),o(!0))}}),tt=(Fn=Wn({context:function(){return $n.useX()},extend:function(n){An(nt,n)}},{partial:_}),D()?new Proxy(An(X,Fn),{get:function(n,t){return t in n?n[t]:nt[t]?K(t):void 0}}):(B((function(n){Fn[n]=K(n)})),Fn)),rt=function(n){return function(){return""+n++}}(0),et=I((function(n,t){return t?null:An({},{exclusion:{tests:{},groups:{}}},n)})),ut=M(20),it=M(20),ot=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=hn(),yn(r,n,t))return t;var e=function(){return r(vn())};return mn(n)?(e(),t):(bn(e,n),t)};(jn||(jn={})).TEST_COMPLETED="test_completed",Cn.group=function(n){return wn("only","groups",n)},On.group=function(n){return wn("skip","groups",n)};var st=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message,e=e.groupName,this.id=rt(),this.warns=!1,this.status=at,this.fieldName=n,this.testFn=t,e&&(this.groupName=e),r&&(this.message=r)}return n.prototype.run=function(){try{var n=this.testFn()}catch(t){n=t,p(this.message)&&d(n)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isCanceled()||(this.status=n)},n.prototype.setPending=function(){this.setStatus(dt)},n.prototype.fail=function(){this.setStatus(this.warns?lt:ft)},n.prototype.done=function(){this.isWarning()||this.isCanceled()||this.isFailing()||this.setStatus(pt)},n.prototype.warn=function(){this.warns=!0},n.prototype.skip=function(){this.setStatus(ct)},n.prototype.cancel=function(){this.setStatus(gt),function(n){(0,J()[1])((function(t){var r=t.indexOf(n);return-1!==r&&t.splice(r,1),[].concat(t)}))}(this)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isPending=function(){return this.status===dt},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isUntested=function(){return this.status===at},n.prototype.isFailing=function(){return this.status===ft},n.prototype.isCanceled=function(){return this.status===gt},n.prototype.isSkipped=function(){return this.status===ct},n.prototype.isPassing=function(){return this.status===pt},n.prototype.isWarning=function(){return this.status===lt},n}(),at="UNTESTED",ct="SKIPPED",ft="FAILED",lt="WARNING",pt="PASSING",dt="PENDING",gt="CANCELED",vt=An(Pn,{each:function(n){return function(r){return Array.isArray(r)||A("test.each: Expected table to be an array."),function(e){for(var i=[],o=1;o<arguments.length;o++)i[o-1]=arguments[o];var s=(i=i.reverse())[0],a=i[1];return r.map((function(r){return r=[].concat(r),n(u.apply(void 0,t([e],r,!1)),u.apply(void 0,t([a],r,!1)),(function(){return s.apply(void 0,r)}))}))}}}(Pn),memo:function(n){var t=M(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=U().suiteId()[0];var i=U().testObjectsCursor()[0],o=(e=e.reverse())[1],s=e[2];return e=[u,r,i].concat(e[0]),null===(u=t.get(e))?t(e,(function(){return n(r,s,o)})):u[1].isCanceled()?(t.invalidate(e),t(e,(function(){return n(r,s,o)}))):kn(u[1])}}(Pn)});n.VERSION="4.0.0-dev-deabb8",n.create=function(n){r(n)||A("Suite initialization error. Expected `tests` to be a function.");var t=function(){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(jn.TEST_COMPLETED,(function(n){if(!n.isCanceled()){n.done(),n=n.fieldName;var t=U().testCallbacks()[0].fieldCallbacks;n&&!Q(n)&&Array.isArray(t[n])&&Nn(t[n]),n=U().testCallbacks()[0].doneCallbacks,Q()||Nn(n)}})),n}(),e=function(n){function t(n,t){return i.references.push(),e(n,u(t)),function(){return[i.references[n],function(t){return e(n,u(t,i.references[n]))}]}}function e(t,e){var u=i.references[t];i.references[t]=e,r(t=o[t][1])&&t(e,u),r(n)&&n()}var i={references:[]},o=[];return{registerStateKey:function(n,r){var e=o.length;return o.push([n,r]),t(e,n)},reset:function(){i.references=[],o.forEach((function(n,r){return t(r,n[0])}))}}}(),i=function(n,t){var r=t.suiteId;return{optionalFields:n.registerStateKey((function(){return{}})),prevTestObjects:n.registerStateKey((function(){return[]})),suiteId:n.registerStateKey((function(){return r})),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(){return[]})),testObjectsCursor:n.registerStateKey((function(){return 0}))}}(e,{suiteId:rt()});return An(et.bind({stateRef:i,bus:t},(function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var u=J()[0];return r=U().prevTestObjects()[1],e.reset(),r((function(){return u})),n.apply(void 0,t),hn()})),{get:et.bind({stateRef:i},vn),remove:et.bind({stateRef:i},(function(n){var t=J()[0];[].concat(t).forEach((function(t){L(t,n)&&t.cancel()}))})),reset:e.reset})},n.enforce=tt,n.group=function(n,t){d(n)||Sn("name must be a string"),r(t)||Sn("callback must be a function"),et.run({groupName:n},t)},n.only=Cn,n.optional=function(n){(0,U().optionalFields()[1])((function(t){return[].concat(n).forEach((function(n){t[n]=!0})),t}))},n.skip=On,n.skipWhen=function(n,t){et.run({skipped:u(n)},(function(){return t()}))},n.test=vt,n.warn=function(){var n=et.useX("warn hook called outside of a running suite.");n.currentTest||A("warn called outside of a test."),n.currentTest.warn()},Object.defineProperty(n,"__esModule",{value:!0})}));
package/docs/migration.md CHANGED
@@ -42,6 +42,22 @@ import { create } from 'vest';
42
42
  create(() => {});
43
43
  ```
44
44
 
45
+ ### Renamed: classNames to classnames
46
+
47
+ Vest 3 included the `vest/classNames` import. It is now renamed to `vest/classnames`.
48
+
49
+ ### V3
50
+
51
+ ```js
52
+ import classNames from 'vest/classNames';
53
+ ```
54
+
55
+ ### V4
56
+
57
+ ```js
58
+ import classnames from 'vest/classnames';
59
+ ```
60
+
45
61
  ### Changed: Do not use if/else statements to conditionally run tests
46
62
 
47
63
  Vest version 4 relies on order of execution and remembers the result of each test based on its location in the suite, similar to the way [hooks in react](https://reactjs.org/docs/hooks-rules.html) work. This means that tests wrapped in an if/else statement make Vest go out of sync with the suite order, and unexecuted test results will be recorded. Instead of using if/else statements, you should use the `skipWhen` function that achieves the same result.
@@ -72,6 +88,9 @@ skipWhen(suite.hasErrors('password'), () => {
72
88
  // ...
73
89
  ```
74
90
 
91
+ **Note**
92
+ If you want to completely omit a test from your suite, and you know that it won't appear at all during the lifetime of your suite, you may use `if/else`.
93
+
75
94
  ### Removed: enforce.template
76
95
 
77
96
  enforce.template was mostly a shorthand for a "and" style enforcements. In reality it did not provide any substantial functionality that was not achievable without it, while it contributed to confusion regarding the api.