vest 4.0.0-dev-7acb76 → 4.0.0-dev-31f012

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +3 -1
  2. package/dist/cjs/classnames.development.js +3 -3
  3. package/dist/cjs/classnames.production.js +1 -1
  4. package/dist/cjs/promisify.development.js +1 -1
  5. package/dist/cjs/promisify.production.js +1 -1
  6. package/dist/cjs/vest.development.js +95 -66
  7. package/dist/cjs/vest.production.js +1 -1
  8. package/dist/es/classnames.development.js +3 -3
  9. package/dist/es/classnames.production.js +1 -1
  10. package/dist/es/promisify.development.js +1 -1
  11. package/dist/es/promisify.production.js +1 -1
  12. package/dist/es/vest.development.js +95 -66
  13. package/dist/es/vest.production.js +1 -1
  14. package/dist/umd/classnames.development.js +3 -3
  15. package/dist/umd/classnames.production.js +1 -1
  16. package/dist/umd/promisify.development.js +1 -1
  17. package/dist/umd/promisify.production.js +1 -1
  18. package/dist/umd/vest.development.js +95 -66
  19. package/dist/umd/vest.production.js +1 -1
  20. package/package.json +1 -1
  21. package/types/classnames.d.ts +2 -2
  22. package/types/vest.d.ts +9 -2
  23. package/docs/.nojekyll +0 -0
  24. package/docs/README.md +0 -113
  25. package/docs/_assets/favicon.ico +0 -0
  26. package/docs/_assets/vest-logo.png +0 -0
  27. package/docs/_sidebar.md +0 -14
  28. package/docs/cross_field_validations.md +0 -33
  29. package/docs/enforce.md +0 -11
  30. package/docs/exclusion.md +0 -129
  31. package/docs/getting_started.md +0 -72
  32. package/docs/group.md +0 -142
  33. package/docs/index.html +0 -41
  34. package/docs/migration.md +0 -202
  35. package/docs/n4s/rules.md +0 -1282
  36. package/docs/node.md +0 -36
  37. package/docs/optional.md +0 -103
  38. package/docs/result.md +0 -249
  39. package/docs/state.md +0 -102
  40. package/docs/test.md +0 -172
  41. package/docs/utilities.md +0 -109
  42. package/docs/warn.md +0 -82
@@ -602,7 +602,7 @@
602
602
 
603
603
  function isProxySupported() {
604
604
  try {
605
- return typeof Proxy === 'function';
605
+ return isFunction(Proxy);
606
606
  }
607
607
  catch (_a) {
608
608
  return false;
@@ -1145,35 +1145,6 @@
1145
1145
  return !!(fieldName && testObject.fieldName === fieldName);
1146
1146
  }
1147
1147
 
1148
- function omitOptionalTests() {
1149
- var optionalFields = useOptionalFields()[0];
1150
- if (isEmpty(optionalFields)) {
1151
- return;
1152
- }
1153
- var shouldOmit = {};
1154
- useSetTests(function (tests) {
1155
- return transform(tests, function (testObject) {
1156
- var fieldName = testObject.fieldName;
1157
- if (shouldOmit.hasOwnProperty(fieldName)) {
1158
- omit(testObject);
1159
- }
1160
- else {
1161
- var optionalConfig = optionalFields[fieldName];
1162
- if (isFunction(optionalConfig)) {
1163
- shouldOmit[fieldName] = optionalConfig();
1164
- omit(testObject);
1165
- }
1166
- }
1167
- return testObject;
1168
- });
1169
- });
1170
- function omit(testObject) {
1171
- if (shouldOmit[testObject.fieldName]) {
1172
- testObject.omit();
1173
- }
1174
- }
1175
- }
1176
-
1177
1148
  /**
1178
1149
  * Checks if a given field, or the suite as a whole still have remaining tests.
1179
1150
  */
@@ -1524,15 +1495,6 @@
1524
1495
  });
1525
1496
  }
1526
1497
 
1527
- /**
1528
- * Removes test object from suite state
1529
- */
1530
- function removeTestFromState (testObject) {
1531
- useSetTests(function (tests) {
1532
- return transform(tests, function (test) { return (testObject !== test ? test : null); });
1533
- });
1534
- }
1535
-
1536
1498
  function createBus() {
1537
1499
  var listeners = {};
1538
1500
  return {
@@ -1558,6 +1520,44 @@
1558
1520
  };
1559
1521
  }
1560
1522
 
1523
+ function omitOptionalTests() {
1524
+ var optionalFields = useOptionalFields()[0];
1525
+ if (isEmpty(optionalFields)) {
1526
+ return;
1527
+ }
1528
+ var shouldOmit = {};
1529
+ useSetTests(function (tests) {
1530
+ return transform(tests, function (testObject) {
1531
+ var fieldName = testObject.fieldName;
1532
+ if (shouldOmit.hasOwnProperty(fieldName)) {
1533
+ omit(testObject);
1534
+ }
1535
+ else {
1536
+ var optionalConfig = optionalFields[fieldName];
1537
+ if (isFunction(optionalConfig)) {
1538
+ shouldOmit[fieldName] = optionalConfig();
1539
+ omit(testObject);
1540
+ }
1541
+ }
1542
+ return testObject;
1543
+ });
1544
+ });
1545
+ function omit(testObject) {
1546
+ if (shouldOmit[testObject.fieldName]) {
1547
+ testObject.omit();
1548
+ }
1549
+ }
1550
+ }
1551
+
1552
+ /**
1553
+ * Removes test object from suite state
1554
+ */
1555
+ function removeTestFromState (testObject) {
1556
+ useSetTests(function (tests) {
1557
+ return transform(tests, function (test) { return (testObject !== test ? test : null); });
1558
+ });
1559
+ }
1560
+
1561
1561
  function callEach(arr) {
1562
1562
  return arr.forEach(function (fn) { return fn(); });
1563
1563
  }
@@ -1585,6 +1585,8 @@
1585
1585
 
1586
1586
  function initBus() {
1587
1587
  var bus = createBus();
1588
+ // Report a the completion of a test. There may be other tests with the same
1589
+ // name that are still running, or not yet started.
1588
1590
  bus.on(Events.TEST_COMPLETED, function (testObject) {
1589
1591
  if (testObject.isCanceled()) {
1590
1592
  return;
@@ -1593,6 +1595,22 @@
1593
1595
  runFieldCallbacks(testObject.fieldName);
1594
1596
  runDoneCallbacks();
1595
1597
  });
1598
+ // Report that the suite completed its synchronous test run.
1599
+ // Async operations may still be running.
1600
+ bus.on(Events.SUITE_COMPLETED, function () {
1601
+ // Remove tests that are optional and need to be omitted
1602
+ omitOptionalTests();
1603
+ });
1604
+ // Removes a certain field from the state.
1605
+ bus.on(Events.REMOVE_FIELD, function (fieldName) {
1606
+ var testObjects = useTestsFlat();
1607
+ testObjects.forEach(function (testObject) {
1608
+ if (matchingFieldName(testObject, fieldName)) {
1609
+ testObject.cancel();
1610
+ removeTestFromState(testObject);
1611
+ }
1612
+ });
1613
+ });
1596
1614
  return bus;
1597
1615
  }
1598
1616
  function useBus() {
@@ -1605,42 +1623,48 @@
1605
1623
  var Events;
1606
1624
  (function (Events) {
1607
1625
  Events["TEST_COMPLETED"] = "test_completed";
1626
+ Events["REMOVE_FIELD"] = "remove_field";
1627
+ Events["SUITE_COMPLETED"] = "suite_completed";
1608
1628
  })(Events || (Events = {}));
1609
1629
 
1610
1630
  // eslint-disable-next-line max-lines-per-function
1611
1631
  function create(suiteCallback) {
1612
1632
  if (!isFunction(suiteCallback)) {
1613
- throwError('Suite initialization error. Expected `tests` to be a function.');
1633
+ throwError('vest.create: Expected callback to be a function.');
1614
1634
  }
1635
+ // Event bus initialization
1615
1636
  var bus = initBus();
1637
+ // State initialization
1616
1638
  var state = createState();
1639
+ // State reference - this holds the actual state values
1617
1640
  var stateRef = createStateRef(state, { suiteId: genId() });
1618
- var suite = assign(ctx.bind({ stateRef: stateRef, bus: bus }, function () {
1641
+ // Create base context reference. All hooks will derive their data from this
1642
+ var ctxRef = { stateRef: stateRef, bus: bus };
1643
+ var suite = assign(
1644
+ // Bind the suite body to the context
1645
+ ctx.bind(ctxRef, function () {
1619
1646
  var args = [];
1620
1647
  for (var _i = 0; _i < arguments.length; _i++) {
1621
1648
  args[_i] = arguments[_i];
1622
1649
  }
1650
+ // Reset the state. Migrates current test objects to `prev` array.
1623
1651
  state.reset();
1624
- // Run the consumer's callback
1652
+ // Create a top level isolate
1625
1653
  isolate({ type: IsolateTypes.SUITE }, function () {
1654
+ // Run the consumer's callback
1626
1655
  suiteCallback.apply(void 0, args);
1627
1656
  });
1628
- omitOptionalTests();
1629
- var res = produceFullResult();
1630
- return res;
1657
+ // Report the suite is done registering tests
1658
+ // Async tests may still be running
1659
+ bus.emit(Events.SUITE_COMPLETED);
1660
+ // Return the result
1661
+ return produceFullResult();
1631
1662
  }), {
1632
- get: ctx.bind({ stateRef: stateRef }, produceDraft),
1633
- remove: ctx.bind({ stateRef: stateRef }, function (name) {
1634
- var testObjects = useTestsFlat();
1635
- // We're mutating the array in `cancel`, so we have to first copy it.
1636
- testObjects.forEach(function (testObject) {
1637
- if (matchingFieldName(testObject, name)) {
1638
- testObject.cancel();
1639
- removeTestFromState(testObject);
1640
- }
1641
- });
1642
- }),
1643
- reset: state.reset
1663
+ get: ctx.bind(ctxRef, produceDraft),
1664
+ reset: state.reset,
1665
+ remove: ctx.bind(ctxRef, function (fieldName) {
1666
+ bus.emit(Events.REMOVE_FIELD, fieldName);
1667
+ })
1644
1668
  });
1645
1669
  return suite;
1646
1670
  }
@@ -1654,16 +1678,20 @@
1654
1678
  * Adds a field or multiple fields to inclusion group.
1655
1679
  */
1656
1680
  function only(item) {
1657
- return addTo('only', 'tests', item);
1681
+ return addTo(0 /* ONLY */, 'tests', item);
1658
1682
  }
1659
- only.group = function (item) { return addTo('only', 'groups', item); };
1683
+ only.group = function (item) {
1684
+ return addTo(0 /* ONLY */, 'groups', item);
1685
+ };
1660
1686
  /**
1661
1687
  * Adds a field or multiple fields to exclusion group.
1662
1688
  */
1663
1689
  function skip(item) {
1664
- return addTo('skip', 'tests', item);
1690
+ return addTo(1 /* SKIP */, 'tests', item);
1665
1691
  }
1666
- skip.group = function (item) { return addTo('skip', 'groups', item); };
1692
+ skip.group = function (item) {
1693
+ return addTo(1 /* SKIP */, 'groups', item);
1694
+ };
1667
1695
  //Checks whether a certain test profile excluded by any of the exclusion groups.
1668
1696
  // eslint-disable-next-line complexity, max-statements
1669
1697
  function isExcluded(testObject) {
@@ -1735,7 +1763,8 @@
1735
1763
  if (!isStringValue(itemName)) {
1736
1764
  return;
1737
1765
  }
1738
- context.exclusion[itemType][itemName] = exclusionGroup === 'only';
1766
+ context.exclusion[itemType][itemName] =
1767
+ exclusionGroup === 0 /* ONLY */;
1739
1768
  });
1740
1769
  }
1741
1770
  /**
@@ -2002,7 +2031,7 @@
2002
2031
  * Registers test, if async - adds to pending array
2003
2032
  */
2004
2033
  function registerTest(testObject) {
2005
- var emit = useBus().emit;
2034
+ var bus = useBus();
2006
2035
  // Run test callback.
2007
2036
  // If a promise is returned, set as async and
2008
2037
  // Move to pending list.
@@ -2016,11 +2045,11 @@
2016
2045
  runAsyncTest(testObject);
2017
2046
  }
2018
2047
  else {
2019
- emit(Events.TEST_COMPLETED, testObject);
2048
+ bus.emit(Events.TEST_COMPLETED, testObject);
2020
2049
  }
2021
2050
  }
2022
2051
  catch (e) {
2023
- throwError("Your test function " + testObject.fieldName + " returned " + JSON.stringify(result) + ". Only \"false\" or a Promise are supported. Return values may cause unexpected behavior.");
2052
+ throwError("Your test function " + testObject.fieldName + " returned a value. Only \"false\" or Promise returns are supported.");
2024
2053
  }
2025
2054
  }
2026
2055
 
@@ -2186,7 +2215,7 @@
2186
2215
  memo: bindTestMemo(testBase)
2187
2216
  });
2188
2217
 
2189
- var VERSION = "4.0.0-dev-7acb76";
2218
+ var VERSION = "4.0.0-dev-31f012";
2190
2219
 
2191
2220
  exports.VERSION = VERSION;
2192
2221
  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 v(n){return String(n)===n}function d(n,t){return v(n)&&v(t)&&n.endsWith(t)}function h(n,t){return n===t}function g(n){var t=Number(n);return!(isNaN(parseFloat(String(n)))||isNaN(Number(n))||!isFinite(t))}function m(n,t){return g(n)&&g(t)&&Number(n)>Number(t)}function y(n,t){return g(n)&&g(t)&&Number(n)>=Number(t)}function N(n){return!!Array.isArray(n)}function b(n,t){return!!(N(t)||v(t)&&v(n))&&-1!==t.indexOf(n)}function E(n,t){return g(n)&&g(t)&&Number(n)<=Number(t)}function C(n,t,r){return y(n,t)&&E(n,r)}function O(n){return v(n)&&!n.trim()}function T(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 P(n){return Number.isNaN(n)}function x(n){return!!g(n)&&0>Number(n)}function k(n){return!!n}function F(n,t){return g(n)&&g(t)&&Number(n)<Number(t)}function A(n,t){return t instanceof RegExp?t.test(n):!!v(t)&&new RegExp(t).test(n)}function I(n,t){return g(n)&&g(t)&&Number(n)===Number(t)}function W(n,t){return v(n)&&v(t)&&n.startsWith(t)}function j(n,t){throw Error(i(t,n))}function R(n){function t(t,u){var i,o,s=r();return t=Bn({},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:j(i(n,"Context was used after it was closed"))}}}function X(){return null}function U(n,t){var r,e=function(r){var e=n[r],u=t[r];if(!(r=ct.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 D(n){for(var t in ft){var e=ft[t];r(e)&&n(t,e)}}function L(){return"function"==typeof Proxy}function G(n,r,e){for(var i=[],s=3;s<arguments.length;s++)i[s-3]=arguments[s];return T(n)||n&&T(n.pass)||j("Incorrect return value for rule: "+JSON.stringify(n)),T(n)?o(n):o(n.pass,u.apply(void 0,t([n.message,r,e],i)))}function q(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([ct.run({value:n},(function(){return e.apply(void 0,t([n],i))})),u,n],i))).pass){if(!S(o.message))throw o.message;j("enforce/"+u+" failed with "+JSON.stringify(n))}return r}}var e={};if(!L())return D((function(n,t){e[n]=r(e,t,n)})),e;var u=new Proxy(e,{get:function(n,t){if(n=ft[t])return r(u,n,t)}});return u}function B(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=ft[a];s.push((function(n){return G.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=ct.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 L()?p=new Proxy(p,{get:function(t,r){return ft[r]?n(r):t[r]}}):(D((function(t){p[t]=n(t)})),p)}}(n)}function _(n){var t,r={};for(t in n)r[t]=lt.optional(n[t]);return r}function K(n){return(n=[].concat(n))[n.length-1]}function H(){function n(){t=[0]}var t=[];return n(),{addLevel:function(){t.push(0)},cursorAt:function(){return K(t)},getCursor:function(){return[].concat(t)},next:function(){return t[t.length-1]++,K(t)},removeLevel:function(){t.pop()},reset:n}}function M(n,t){for(var r=[],e=0;e<n.length;e++){var u=n[e];N(u)?r.push(M(u,t)):(u=t(u),Kn(u)&&r.push(u))}return r}function J(n){return[].concat(n).reduce((function(n,t){return N(t)?n.concat(J(t)):[].concat(n).concat(t)}),[])}function V(n,t){var r=0;for(t=t.slice(0,-1);r<t.length;r++){var e=t[r];n[e]=i(n[e],[]),n=n[e]}return n}function z(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]),f(t,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 Y(){return dt.useX().stateRef}function Q(){(0,Y().testObjects()[1])((function(n){return{prev:n.prev,current:[].concat(n.current)}}))}function Z(n){(0,Y().testObjects()[1])((function(t){return{prev:t.prev,current:[].concat(n(t.current))}}))}function $(){return J(M(Y().testObjects()[0].current,(function(n){return n.isPending()?n:null})))}function nn(){var n=Y().testObjects()[0].current;return ht([n],(function(){return J(n)}))}function tn(){return dt.useX().testCursor.getCursor()}function rn(n,t){if(n=void 0===(n=n.type)?Ln.DEFAULT:n,r(t)){var e=tn();return dt.run({isolate:{type:n}},(function(){dt.useX().testCursor.addLevel(),Z((function(n){return V(n,e)[K(e)]=[],n}));var n=t();return dt.useX().testCursor.removeLevel(),dt.useX().testCursor.next(),n}))}}function en(n,t){return!(!t||n.fieldName!==t)}function un(){var n=Y().optionalFields()[0];if(!S(n)){var t={};Z((function(e){return M(e,(function(e){var u=e.fieldName;if(t.hasOwnProperty(u))t[e.fieldName]&&e.omit();else{var i=n[u];r(i)&&(t[u]=i(),t[e.fieldName]&&e.omit())}return e}))}))}}function on(n){var t=$();return!S(t)&&(n?t.some((function(t){return en(t,n)})):tt(t))}function sn(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 an(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&&!en(r,i)||"warnings"===n!=!!r.warns||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),qn({},i&&((e={})[i]=[],e)))}function cn(n){return ln("errors",n)}function fn(n){return ln("warnings",n)}function ln(n,t){return n=an(n,nn(),{fieldName:t}),t?n[t]:n}function pn(n,t){return n=dn("errors",n,t),t?n[t]:n}function vn(n,t){return n=dn("warnings",n,t),t?n[t]:n}function dn(n,t,r){return t||j("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),an(n,nn(),{group:t,fieldName:r})}function hn(n,t,r){return!(!n.hasFailures()||r&&!en(n,r)||"warnings"===t!=!!n.warns)}function gn(n){return yn("errors",n)}function mn(n){return yn("warnings",n)}function yn(n,t){return nn().some((function(r){return hn(r,n,t)}))}function Nn(n,t){return En("errors",n,t)}function bn(n,t){return En("warnings",n,t)}function En(n,t,r){return nn().some((function(e){return t===e.groupName&&hn(e,n,r)}))}function Cn(){var n=nn(),t={stateRef:Y()};return gt([n],dt.bind(t,(function(){return Bn(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return nn().forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=sn(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=sn(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:dt.bind(t,cn),getErrorsByGroup:dt.bind(t,pn),getWarnings:dt.bind(t,fn),getWarningsByGroup:dt.bind(t,vn),hasErrors:dt.bind(t,gn),hasErrorsByGroup:dt.bind(t,Nn),hasWarnings:dt.bind(t,mn),hasWarningsByGroup:dt.bind(t,bn),isValid:dt.bind(t,(function(n){var t=Cn(),r=nn().reduce((function(n,t){return n[t.fieldName]||t.isOmitted()&&(n[t.fieldName]=!0),n}),{});return(r=!!n&&!!r[n])?n=!0:t.hasErrors(n)?n=!1:n=!(S(r=nn())||n&&S(t.tests[n])||function(n){var t=Y().optionalFields()[0];return tt($().filter((function(r){return!(n&&!en(r,n))&&!0!==t[r.fieldName]})))}(n))&&function(n){var t=nn(),r=Y().optionalFields()[0];return t.every((function(t){return!(!n||en(t,n))||!0===r[t.fieldName]||t.isTested()||t.isOmitted()}))}(n),n}))})})))}function On(){var n=nn(),t={stateRef:Y()};return mt([n],dt.bind(t,(function(){return Bn({},Cn(),{done:dt.bind(t,yt)})})))}function Tn(n,t,e){return!(r(n)&&(!t||e.tests[t]&&0!==e.tests[t].testCount))}function wn(n){return!(on()&&(!n||on(n)))}function Sn(n,t){var r=dt.bind({},n);(0,Y().testCallbacks()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Pn(n){return n.forEach((function(n){return n()}))}function xn(){var n=dt.useX();return n.bus||j(),n.bus}function kn(n){return An("only","tests",n)}function Fn(n){return An("skip","tests",n)}function An(n,t,r){var e=dt.useX("hook called outside of a running suite.");r&&[].concat(r).forEach((function(r){v(r)&&(e.exclusion[t][r]="only"===n)}))}function In(n){for(var t in n)if(!0===n[t])return!0;return!1}function Wn(n){j("Wrong arguments passed to group. Group "+n+".")}function jn(n){var t=n.asyncTest,e=n.message;if(t&&r(t.then)){var u=xn().emit,i=Y(),o=dt.bind({stateRef:i},(function(){Q(),u(vt.TEST_COMPLETED,n)}));i=dt.bind({stateRef:i},(function(t){n.isCanceled()||(n.message=v(t)?t:e,n.fail(),o())}));try{t.then(o,i)}catch(n){i()}}}function Rn(n){var t=Y().testObjects(),r=t[1],e=t[0].prev;if(S(e))return Xn(n),n;if(function(n,t){return tt(n)&&!(n.fieldName===t.fieldName&&n.groupName===t.groupName)}(t=function(n){var t=tn();return V(n,t)[K(t)]}(e),n)){!function(n,t){dt.useX().isolate.type!==Ln.EACH&&function(n,t){setTimeout((function(){j(n,t)}),0)}("Vest Critical Error: Tests called in different order than previous run.\n expected: "+n.fieldName+"\n received: "+t.fieldName+"\n This happens when you conditionally call your tests using if/else.\n This might lead to incorrect validation results.\n Replacing if/else with skipWhen solves these issues.")}(t,n),t=V(e,tn());var u=dt.useX().testCursor.cursorAt();t.splice(u),r((function(n){return{prev:e,current:n.current}})),t=null}return Xn(n=i(t,n)),n}function Xn(n){var t=tn();Z((function(r){return V(r,t)[K(t)]=n,r}))}function Un(n){var t=Rn(n);if(function(n){var t=n.fieldName;n=n.groupName;var r=dt.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=dt.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||!In(e)&&!1!==e[t])}return!u&&In(e)}(n))return n.skip(),dt.useX().testCursor.next(),t;if(n!==t&&t.fieldName===n.fieldName&&t.groupName===n.groupName&&t.isPending()&&t.cancel(),Xn(n),dt.useX().testCursor.next(),n.isUntested()){t=xn().emit;var e=function(n){return dt.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){t=r,p(n.message)&&v(t)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}(n);try{e&&r(e.then)?(n.asyncTest=e,n.setPending(),jn(n)):t(vt.TEST_COMPLETED,n)}catch(t){j("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(),jn(n));return n}function Dn(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=dt.useX();return Un(t=new Nt(n,t,{message:r,groupName:null==e?void 0:e.groupName}))}var Ln,Gn,qn=function(){return(qn=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)},Bn=Object.assign,_n=a(c),Kn=a(l),Hn=a(p),Mn=a(d),Jn=a(h),Vn=a(g),zn=a(N),Yn=a(b),Qn=a(C),Zn=a(O),$n=a(T),nt=a(w),tt=a(S),rt=a(P),et=a(x),ut=a(v),it=a(k),ot=a(A),st=a(I),at=a(W),ct=R((function(n,t){var r={value:n.value,meta:n.meta||{}};return t?n.set?Bn(r,{parent:function(){return t?{value:t.value,meta:t.meta,parent:t.parent}:t}}):t:Bn(r,{parent:X})})),ft=Bn({condition:function(n,t){try{return t(n)}catch(n){return!1}},doesNotEndWith:Mn,doesNotStartWith:at,endsWith:d,equals:h,greaterThan:m,greaterThanOrEquals:y,gt:m,gte:y,inside:b,isArray:N,isBetween:C,isBlank:O,isBoolean:T,isEmpty:S,isEven:function(n){return!!g(n)&&0==n%2},isFalsy:it,isNaN:P,isNegative:x,isNotArray:zn,isNotBetween:Qn,isNotBlank:Zn,isNotBoolean:$n,isNotEmpty:tt,isNotNaN:rt,isNotNull:Kn,isNotNumber:nt,isNotNumeric:Vn,isNotString:ut,isNotUndefined:Hn,isNull:l,isNumber:w,isNumeric:g,isOdd:function(n){return!!g(n)&&0!=n%2},isPositive:et,isString:v,isTruthy:k,isUndefined:p,lengthEquals:c,lengthNotEquals:_n,lessThan:F,lessThanOrEquals:E,longerThan:f,longerThanOrEquals:function(n,t){return n.length>=Number(t)},lt:F,lte:E,matches:A,notEquals:Jn,notInside:Yn,notMatches:ot,numberEquals:I,numberNotEquals:st,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=U(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:U,isArrayOf:function(n,t){return i(e(n,(function(n,r,e){(e=ct.run({value:n,set:!0,meta:{index:e}},(function(){return s(t,n)}))).pass||r(e)})),o(!0))}}),lt=(Gn=qn({context:function(){return ct.useX()},extend:function(n){Bn(ft,n)}},{partial:_}),L()?new Proxy(Bn(q,Gn),{get:function(n,t){return t in n?n[t]:ft[t]?B(t):void 0}}):(D((function(n){Gn[n]=B(n)})),Gn)),pt=function(n){return function(){return""+n++}}(0);!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.GROUP=4]="GROUP"}(Ln||(Ln={}));var vt,dt=R((function(n,t){return t?null:Bn({},{isolate:{type:Ln.DEFAULT},testCursor:H(),exclusion:{tests:{},groups:{}}},n)})),ht=z(),gt=z(20),mt=z(20),yt=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=On(),Tn(r,n,t))return t;var e=function(){return r(Cn())};return wn(n)?(e(),t):(Sn(e,n),t)};(vt||(vt={})).TEST_COMPLETED="test_completed",kn.group=function(n){return An("only","groups",n)},Fn.group=function(n){return An("skip","groups",n)};var Nt=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message,e=e.groupName,this.id=pt(),this.warns=!1,this.status=bt,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)&&v(n)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isFinalStatus()&&n!==Pt||(this.status=n)},n.prototype.setPending=function(){this.setStatus(wt)},n.prototype.fail=function(){this.setStatus(this.warns?Ot:Ct)},n.prototype.done=function(){this.isFinalStatus()||this.setStatus(Tt)},n.prototype.warn=function(){this.warns=!0},n.prototype.isFinalStatus=function(){return this.hasFailures()||this.isCanceled()||this.isPassing()},n.prototype.skip=function(){this.isPending()||this.setStatus(Et)},n.prototype.cancel=function(){this.setStatus(St),Q()},n.prototype.omit=function(){this.setStatus(Pt)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isPending=function(){return this.status===wt},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isOmitted=function(){return this.status===Pt},n.prototype.isUntested=function(){return this.status===bt},n.prototype.isFailing=function(){return this.status===Ct},n.prototype.isCanceled=function(){return this.status===St},n.prototype.isSkipped=function(){return this.status===Et},n.prototype.isPassing=function(){return this.status===Tt},n.prototype.isWarning=function(){return this.status===Ot},n}(),bt="UNTESTED",Et="SKIPPED",Ct="FAILED",Ot="WARNING",Tt="PASSING",wt="PENDING",St="CANCELED",Pt="OMITTED",xt=Bn(Dn,{each:function(n){return function(r){return N(r)||j("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 rn({type:Ln.EACH},(function(){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)}))}))}))}}}(Dn),memo:function(n){var t=z(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=Y().suiteId()[0];var i=dt.useX().testCursor.cursorAt(),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)}))):Un(u[1])}}(Dn)});n.VERSION="4.0.0-dev-7acb76",n.create=function(n){r(n)||j("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(vt.TEST_COMPLETED,(function(n){if(!n.isCanceled()){n.done(),n=n.fieldName;var t=Y().testCallbacks()[0].fieldCallbacks;n&&!on(n)&&N(t[n])&&Pn(t[n]),n=Y().testCallbacks()[0].doneCallbacks,on()||Pn(n)}})),n}(),e=function(n){function t(n,t,r){return i.references.push(),e(n,u(t,r)),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(){var n=i.references;i.references=[],o.forEach((function(r,e){return t(e,r[0],n[e])}))}}}(),i=function(n,t){return t=t.suiteId,{optionalFields:n.registerStateKey((function(){return{}})),suiteId:n.registerStateKey(t),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(n){return{prev:n?n.current:[],current:[]}}))}}(e,{suiteId:pt()});return Bn(dt.bind({stateRef:i,bus:t},(function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return e.reset(),rn({type:Ln.SUITE},(function(){n.apply(void 0,t)})),un(),On()})),{get:dt.bind({stateRef:i},Cn),remove:dt.bind({stateRef:i},(function(n){nn().forEach((function(t){en(t,n)&&(t.cancel(),function(n){Z((function(t){return M(t,(function(t){return n!==t?t:null}))}))}(t))}))})),reset:e.reset})},n.enforce=lt,n.group=function(n,t){v(n)||Wn("name must be a string"),r(t)||Wn("callback must be a function"),rn({type:Ln.GROUP},(function(){dt.run({groupName:n},t)}))},n.only=kn,n.optional=function(n){(0,Y().optionalFields()[1])((function(t){if(N(n)||v(n))[].concat(n).forEach((function(n){t[n]=!0}));else for(var r in n)t[r]=n[r];return t}))},n.skip=Fn,n.skipWhen=function(n,t){rn({type:Ln.SKIP_WHEN},(function(){dt.run({skipped:u(n)},(function(){return t()}))}))},n.test=xt,n.warn=function(){var n=dt.useX("warn hook called outside of a running suite.");n.currentTest||j("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 v(n){return String(n)===n}function d(n,t){return v(n)&&v(t)&&n.endsWith(t)}function h(n,t){return n===t}function g(n){var t=Number(n);return!(isNaN(parseFloat(String(n)))||isNaN(Number(n))||!isFinite(t))}function m(n,t){return g(n)&&g(t)&&Number(n)>Number(t)}function y(n,t){return g(n)&&g(t)&&Number(n)>=Number(t)}function N(n){return!!Array.isArray(n)}function b(n,t){return!!(N(t)||v(t)&&v(n))&&-1!==t.indexOf(n)}function E(n,t){return g(n)&&g(t)&&Number(n)<=Number(t)}function C(n,t,r){return y(n,t)&&E(n,r)}function O(n){return v(n)&&!n.trim()}function T(n){return!!n===n}function S(n){return"number"==typeof n}function w(n){if(n){if(S(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 P(n){return Number.isNaN(n)}function x(n){return!!g(n)&&0>Number(n)}function F(n){return!!n}function k(n,t){return g(n)&&g(t)&&Number(n)<Number(t)}function I(n,t){return t instanceof RegExp?t.test(n):!!v(t)&&new RegExp(t).test(n)}function A(n,t){return g(n)&&g(t)&&Number(n)===Number(t)}function D(n,t){return v(n)&&v(t)&&n.startsWith(t)}function L(n,t){throw Error(i(t,n))}function W(n){function t(t,u){var i,o,s=r();return t=qn({},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:L(i(n,"Context was used after it was closed"))}}}function U(){return null}function j(n,t){var r,e=function(r){var e=n[r],u=t[r];if(!(r=ft.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 R(n){for(var t in lt){var e=lt[t];r(e)&&n(t,e)}}function X(){try{return r(Proxy)}catch(n){return!1}}function _(n,r,e){for(var i=[],s=3;s<arguments.length;s++)i[s-3]=arguments[s];return T(n)||n&&T(n.pass)||L("Incorrect return value for rule: "+JSON.stringify(n)),T(n)?o(n):o(n.pass,u.apply(void 0,t([n.message,r,e],i)))}function M(n){function r(r,e,u){return function(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];if(!(o=_.apply(void 0,t([ft.run({value:n},(function(){return e.apply(void 0,t([n],i))})),u,n],i))).pass){if(!w(o.message))throw o.message;L("enforce/"+u+" failed with "+JSON.stringify(n))}return r}}var e={};if(!X())return R((function(n,t){e[n]=r(e,t,n)})),e;var u=new Proxy(e,{get:function(n,t){if(n=lt[t])return r(u,n,t)}});return u}function G(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=lt[a];s.push((function(n){return _.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=ft.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 X()?p=new Proxy(p,{get:function(t,r){return lt[r]?n(r):t[r]}}):(R((function(t){p[t]=n(t)})),p)}}(n)}function q(n){var t,r={};for(t in n)r[t]=pt.optional(n[t]);return r}function B(n,t){return t=t.suiteId,{optionalFields:n.registerStateKey((function(){return{}})),suiteId:n.registerStateKey(t),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(n){return{prev:n?n.current:[],current:[]}}))}}function K(n){return(n=[].concat(n))[n.length-1]}function H(){function n(){t=[0]}var t=[];return n(),{addLevel:function(){t.push(0)},cursorAt:function(){return K(t)},getCursor:function(){return[].concat(t)},next:function(){return t[t.length-1]++,K(t)},removeLevel:function(){t.pop()},reset:n}}function V(n,t){for(var r=[],e=0;e<n.length;e++){var u=n[e];N(u)?r.push(V(u,t)):(u=t(u),Kn(u)&&r.push(u))}return r}function J(n){return[].concat(n).reduce((function(n,t){return N(t)?n.concat(J(t)):[].concat(n).concat(t)}),[])}function z(n,t){var r=0;for(t=t.slice(0,-1);r<t.length;r++){var e=t[r];n[e]=i(n[e],[]),n=n[e]}return n}function Y(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]),f(t,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 Q(){return ht.useX().stateRef}function Z(){(0,Q().testObjects()[1])((function(n){return{prev:n.prev,current:[].concat(n.current)}}))}function $(n){(0,Q().testObjects()[1])((function(t){return{prev:t.prev,current:[].concat(n(t.current))}}))}function nn(){return J(V(Q().testObjects()[0].current,(function(n){return n.isPending()?n:null})))}function tn(){var n=Q().testObjects()[0].current;return gt([n],(function(){return J(n)}))}function rn(){return ht.useX().testCursor.getCursor()}function en(n,t){if(n=void 0===(n=n.type)?_n.DEFAULT:n,r(t)){var e=rn();return ht.run({isolate:{type:n}},(function(){ht.useX().testCursor.addLevel(),$((function(n){return z(n,e)[K(e)]=[],n}));var n=t();return ht.useX().testCursor.removeLevel(),ht.useX().testCursor.next(),n}))}}function un(n,t){return!(!t||n.fieldName!==t)}function on(n){var t=nn();return!w(t)&&(n?t.some((function(t){return un(t,n)})):rt(t))}function sn(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 an(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&&!un(r,i)||"warnings"===n!=!!r.warns||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),Gn({},i&&((e={})[i]=[],e)))}function cn(n){return ln("errors",n)}function fn(n){return ln("warnings",n)}function ln(n,t){return n=an(n,tn(),{fieldName:t}),t?n[t]:n}function pn(n,t){return n=dn("errors",n,t),t?n[t]:n}function vn(n,t){return n=dn("warnings",n,t),t?n[t]:n}function dn(n,t,r){return t||L("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),an(n,tn(),{group:t,fieldName:r})}function hn(n,t,r){return!(!n.hasFailures()||r&&!un(n,r)||"warnings"===t!=!!n.warns)}function gn(n){return yn("errors",n)}function mn(n){return yn("warnings",n)}function yn(n,t){return tn().some((function(r){return hn(r,n,t)}))}function Nn(n,t){return En("errors",n,t)}function bn(n,t){return En("warnings",n,t)}function En(n,t,r){return tn().some((function(e){return t===e.groupName&&hn(e,n,r)}))}function Cn(){var n=tn(),t={stateRef:Q()};return mt([n],ht.bind(t,(function(){return qn(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return tn().forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=sn(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=sn(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:ht.bind(t,cn),getErrorsByGroup:ht.bind(t,pn),getWarnings:ht.bind(t,fn),getWarningsByGroup:ht.bind(t,vn),hasErrors:ht.bind(t,gn),hasErrorsByGroup:ht.bind(t,Nn),hasWarnings:ht.bind(t,mn),hasWarningsByGroup:ht.bind(t,bn),isValid:ht.bind(t,(function(n){var t=Cn(),r=tn().reduce((function(n,t){return n[t.fieldName]||t.isOmitted()&&(n[t.fieldName]=!0),n}),{});return(r=!!n&&!!r[n])?n=!0:t.hasErrors(n)?n=!1:n=!(w(r=tn())||n&&w(t.tests[n])||function(n){var t=Q().optionalFields()[0];return rt(nn().filter((function(r){return!(n&&!un(r,n))&&!0!==t[r.fieldName]})))}(n))&&function(n){var t=tn(),r=Q().optionalFields()[0];return t.every((function(t){return!(!n||un(t,n))||!0===r[t.fieldName]||t.isTested()||t.isOmitted()}))}(n),n}))})})))}function On(){var n=tn(),t={stateRef:Q()};return yt([n],ht.bind(t,(function(){return qn({},Cn(),{done:ht.bind(t,Nt)})})))}function Tn(n,t,e){return!(r(n)&&(!t||e.tests[t]&&0!==e.tests[t].testCount))}function Sn(n){return!(on()&&(!n||on(n)))}function wn(n,t){var r=ht.bind({},n);(0,Q().testCallbacks()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Pn(n){return n.forEach((function(n){return n()}))}function xn(){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(dt.TEST_COMPLETED,(function(n){if(!n.isCanceled()){n.done(),n=n.fieldName;var t=Q().testCallbacks()[0].fieldCallbacks;n&&!on(n)&&N(t[n])&&Pn(t[n]),n=Q().testCallbacks()[0].doneCallbacks,on()||Pn(n)}})),n.on(dt.SUITE_COMPLETED,(function(){!function(){var n=Q().optionalFields()[0];if(!w(n)){var t={};$((function(e){return V(e,(function(e){var u=e.fieldName;if(t.hasOwnProperty(u))t[e.fieldName]&&e.omit();else{var i=n[u];r(i)&&(t[u]=i(),t[e.fieldName]&&e.omit())}return e}))}))}}()})),n.on(dt.REMOVE_FIELD,(function(n){tn().forEach((function(t){un(t,n)&&(t.cancel(),function(n){$((function(t){return V(t,(function(t){return n!==t?t:null}))}))}(t))}))})),n}function Fn(){var n=ht.useX();return n.bus||L(),n.bus}function kn(n){return An(0,"tests",n)}function In(n){return An(1,"tests",n)}function An(n,t,r){var e=ht.useX("hook called outside of a running suite.");r&&[].concat(r).forEach((function(r){v(r)&&(e.exclusion[t][r]=0===n)}))}function Dn(n){for(var t in n)if(!0===n[t])return!0;return!1}function Ln(n){L("Wrong arguments passed to group. Group "+n+".")}function Wn(n){var t=n.asyncTest,e=n.message;if(t&&r(t.then)){var u=Fn().emit,i=Q(),o=ht.bind({stateRef:i},(function(){Z(),u(dt.TEST_COMPLETED,n)}));i=ht.bind({stateRef:i},(function(t){n.isCanceled()||(n.message=v(t)?t:e,n.fail(),o())}));try{t.then(o,i)}catch(n){i()}}}function Un(n){var t=Q().testObjects(),r=t[1],e=t[0].prev;if(w(e))return jn(n),n;if(function(n,t){return rt(n)&&!(n.fieldName===t.fieldName&&n.groupName===t.groupName)}(t=function(n){var t=rn();return z(n,t)[K(t)]}(e),n)){!function(n,t){ht.useX().isolate.type!==_n.EACH&&function(n,t){setTimeout((function(){L(n,t)}),0)}("Vest Critical Error: Tests called in different order than previous run.\n expected: "+n.fieldName+"\n received: "+t.fieldName+"\n This happens when you conditionally call your tests using if/else.\n This might lead to incorrect validation results.\n Replacing if/else with skipWhen solves these issues.")}(t,n),t=z(e,rn());var u=ht.useX().testCursor.cursorAt();t.splice(u),r((function(n){return{prev:e,current:n.current}})),t=null}return jn(n=i(t,n)),n}function jn(n){var t=rn();$((function(r){return z(r,t)[K(t)]=n,r}))}function Rn(n){var t=Un(n);if(function(n){var t=n.fieldName;n=n.groupName;var r=ht.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=ht.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||!Dn(e)&&!1!==e[t])}return!u&&Dn(e)}(n))return n.skip(),ht.useX().testCursor.next(),t;if(n!==t&&t.fieldName===n.fieldName&&t.groupName===n.groupName&&t.isPending()&&t.cancel(),jn(n),ht.useX().testCursor.next(),n.isUntested()){t=Fn();var e=function(n){return ht.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){t=r,p(n.message)&&v(t)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}(n);try{e&&r(e.then)?(n.asyncTest=e,n.setPending(),Wn(n)):t.emit(dt.TEST_COMPLETED,n)}catch(t){L("Your test function "+n.fieldName+' returned a value. Only "false" or Promise returns are supported.')}}else(t=n.asyncTest)&&r(t.then)&&(n.setPending(),Wn(n));return n}function Xn(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=ht.useX();return Rn(t=new bt(n,t,{message:r,groupName:null==e?void 0:e.groupName}))}var _n,Mn,Gn=function(){return(Gn=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)},qn=Object.assign,Bn=a(c),Kn=a(l),Hn=a(p),Vn=a(d),Jn=a(h),zn=a(g),Yn=a(N),Qn=a(b),Zn=a(C),$n=a(O),nt=a(T),tt=a(S),rt=a(w),et=a(P),ut=a(x),it=a(v),ot=a(F),st=a(I),at=a(A),ct=a(D),ft=W((function(n,t){var r={value:n.value,meta:n.meta||{}};return t?n.set?qn(r,{parent:function(){return t?{value:t.value,meta:t.meta,parent:t.parent}:t}}):t:qn(r,{parent:U})})),lt=qn({condition:function(n,t){try{return t(n)}catch(n){return!1}},doesNotEndWith:Vn,doesNotStartWith:ct,endsWith:d,equals:h,greaterThan:m,greaterThanOrEquals:y,gt:m,gte:y,inside:b,isArray:N,isBetween:C,isBlank:O,isBoolean:T,isEmpty:w,isEven:function(n){return!!g(n)&&0==n%2},isFalsy:ot,isNaN:P,isNegative:x,isNotArray:Yn,isNotBetween:Zn,isNotBlank:$n,isNotBoolean:nt,isNotEmpty:rt,isNotNaN:et,isNotNull:Kn,isNotNumber:tt,isNotNumeric:zn,isNotString:it,isNotUndefined:Hn,isNull:l,isNumber:S,isNumeric:g,isOdd:function(n){return!!g(n)&&0!=n%2},isPositive:ut,isString:v,isTruthy:F,isUndefined:p,lengthEquals:c,lengthNotEquals:Bn,lessThan:k,lessThanOrEquals:E,longerThan:f,longerThanOrEquals:function(n,t){return n.length>=Number(t)},lt:k,lte:E,matches:I,notEquals:Jn,notInside:Qn,notMatches:st,numberEquals:A,numberNotEquals:at,shorterThan:function(n,t){return n.length<Number(t)},shorterThanOrEquals:function(n,t){return n.length<=Number(t)},startsWith:D},{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=j(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:j,isArrayOf:function(n,t){return i(e(n,(function(n,r,e){(e=ft.run({value:n,set:!0,meta:{index:e}},(function(){return s(t,n)}))).pass||r(e)})),o(!0))}}),pt=(Mn=Gn({context:function(){return ft.useX()},extend:function(n){qn(lt,n)}},{partial:q}),X()?new Proxy(qn(M,Mn),{get:function(n,t){return t in n?n[t]:lt[t]?G(t):void 0}}):(R((function(n){Mn[n]=G(n)})),Mn)),vt=function(n){return function(){return""+n++}}(0);!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.GROUP=4]="GROUP"}(_n||(_n={}));var dt,ht=W((function(n,t){return t?null:qn({},{isolate:{type:_n.DEFAULT},testCursor:H(),exclusion:{tests:{},groups:{}}},n)})),gt=Y(),mt=Y(20),yt=Y(20),Nt=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=On(),Tn(r,n,t))return t;var e=function(){return r(Cn())};return Sn(n)?(e(),t):(wn(e,n),t)};!function(n){n.TEST_COMPLETED="test_completed",n.REMOVE_FIELD="remove_field",n.SUITE_COMPLETED="suite_completed"}(dt||(dt={})),kn.group=function(n){return An(0,"groups",n)},In.group=function(n){return An(1,"groups",n)};var bt=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message,e=e.groupName,this.id=vt(),this.warns=!1,this.status=Et,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)&&v(n)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isFinalStatus()&&n!==xt||(this.status=n)},n.prototype.setPending=function(){this.setStatus(wt)},n.prototype.fail=function(){this.setStatus(this.warns?Tt:Ot)},n.prototype.done=function(){this.isFinalStatus()||this.setStatus(St)},n.prototype.warn=function(){this.warns=!0},n.prototype.isFinalStatus=function(){return this.hasFailures()||this.isCanceled()||this.isPassing()},n.prototype.skip=function(){this.isPending()||this.setStatus(Ct)},n.prototype.cancel=function(){this.setStatus(Pt),Z()},n.prototype.omit=function(){this.setStatus(xt)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isPending=function(){return this.status===wt},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isOmitted=function(){return this.status===xt},n.prototype.isUntested=function(){return this.status===Et},n.prototype.isFailing=function(){return this.status===Ot},n.prototype.isCanceled=function(){return this.status===Pt},n.prototype.isSkipped=function(){return this.status===Ct},n.prototype.isPassing=function(){return this.status===St},n.prototype.isWarning=function(){return this.status===Tt},n}(),Et="UNTESTED",Ct="SKIPPED",Ot="FAILED",Tt="WARNING",St="PASSING",wt="PENDING",Pt="CANCELED",xt="OMITTED",Ft=qn(Xn,{each:function(n){return function(r){return N(r)||L("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 en({type:_n.EACH},(function(){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)}))}))}))}}}(Xn),memo:function(n){var t=Y(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=Q().suiteId()[0];var i=ht.useX().testCursor.cursorAt(),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)}))):Rn(u[1])}}(Xn)});n.VERSION="4.0.0-dev-31f012",n.create=function(n){r(n)||L("vest.create: Expected callback to be a function.");var t=xn(),e=function(n){function t(n,t,r){return i.references.push(),e(n,u(t,r)),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(){var n=i.references;i.references=[],o.forEach((function(r,e){return t(e,r[0],n[e])}))}}}(),i={stateRef:B(e,{suiteId:vt()}),bus:t};return qn(ht.bind(i,(function(){for(var r=[],u=0;u<arguments.length;u++)r[u]=arguments[u];return e.reset(),en({type:_n.SUITE},(function(){n.apply(void 0,r)})),t.emit(dt.SUITE_COMPLETED),On()})),{get:ht.bind(i,Cn),reset:e.reset,remove:ht.bind(i,(function(n){t.emit(dt.REMOVE_FIELD,n)}))})},n.enforce=pt,n.group=function(n,t){v(n)||Ln("name must be a string"),r(t)||Ln("callback must be a function"),en({type:_n.GROUP},(function(){ht.run({groupName:n},t)}))},n.only=kn,n.optional=function(n){(0,Q().optionalFields()[1])((function(t){if(N(n)||v(n))[].concat(n).forEach((function(n){t[n]=!0}));else for(var r in n)t[r]=n[r];return t}))},n.skip=In,n.skipWhen=function(n,t){en({type:_n.SKIP_WHEN},(function(){ht.run({skipped:u(n)},(function(){return t()}))}))},n.test=Ft,n.warn=function(){var n=ht.useX("warn hook called outside of a running suite.");n.currentTest||L("warn called outside of a test."),n.currentTest.warn()},Object.defineProperty(n,"__esModule",{value:!0})}));
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.0.0-dev-7acb76",
2
+ "version": "4.0.0-dev-31f012",
3
3
  "license": "MIT",
4
4
  "name": "vest",
5
5
  "author": "ealush",
@@ -59,7 +59,7 @@ interface IDone {
59
59
  /**
60
60
  * Creates a function that returns class names that match the validation result
61
61
  */
62
- declare function classNames(res: IVestResult | TDraftResult, classes?: TSupportedClasses): (fieldName: string) => string;
62
+ declare function classnames(res: IVestResult | TDraftResult, classes?: TSupportedClasses): (fieldName: string) => string;
63
63
  type TSupportedClasses = {
64
64
  valid?: string;
65
65
  tested?: string;
@@ -67,4 +67,4 @@ type TSupportedClasses = {
67
67
  warning?: string;
68
68
  untested?: string;
69
69
  };
70
- export { classNames as default };
70
+ export { classnames as default };
package/types/vest.d.ts CHANGED
@@ -149,7 +149,14 @@ declare const baseRules: {
149
149
  loose: typeof loose;
150
150
  isArrayOf: typeof isArrayOf;
151
151
  };
152
- type TRules<E = Record<string, unknown>> = Record<string, (...args: TArgs) => TRules & E> & {
152
+ /* eslint-disable @typescript-eslint/no-namespace, @typescript-eslint/no-empty-interface */
153
+ declare global {
154
+ namespace n4s {
155
+ interface EnforceCustomMatchers<R> {
156
+ }
157
+ }
158
+ }
159
+ type TRules<E = Record<string, unknown>> = n4s.EnforceCustomMatchers<TRules & E> & Record<string, (...args: TArgs) => TRules & E> & {
153
160
  [P in KCompounds]: (...args: DropFirst<Parameters<TCompounds[P]>> | TArgs) => TRules & E;
154
161
  } & {
155
162
  [P in KBaseRules]: (...args: DropFirst<Parameters<TBaseRules[P]>> | TArgs) => TRules & E;
@@ -318,5 +325,5 @@ declare const _default: typeof testBase & {
318
325
  };
319
326
  };
320
327
  declare const test: typeof _default;
321
- declare const VERSION = "4.0.0-dev-7acb76";
328
+ declare const VERSION = "4.0.0-dev-31f012";
322
329
  export { test, create, only, skip, warn, group, optional$0 as optional, skipWhen, enforce, VERSION };
package/docs/.nojekyll DELETED
File without changes
package/docs/README.md DELETED
@@ -1,113 +0,0 @@
1
- ![Vest](https://cdn.jsdelivr.net/gh/ealush/vest@assets/vest-logo.png 'Vest')
2
-
3
- # Vest 🦺 Declarative Validation Testing
4
-
5
- ![Github Stars](https://githubbadges.com/star.svg?user=ealush&repo=vest&style=flat)
6
- ![Npm downloads](https://img.shields.io/npm/dt/vest?label=Downloads&logo=npm)
7
-
8
- [![npm version](https://badge.fury.io/js/vest.svg)](https://badge.fury.io/js/vest) [![Build Status](https://travis-ci.org/ealush/vest.svg?branch=latest)](https://travis-ci.org/ealush/vest) [![Known Vulnerabilities](https://snyk.io/test/npm/vest/badge.svg)](https://snyk.io/test/npm/vest)
9
- ![minifiedSize](https://img.shields.io/bundlephobia/min/vest?color=blue&logo=npm)
10
-
11
- [![Join discord](https://img.shields.io/discord/757686103292641312?label=Join%20Discord&logo=discord&logoColor=green)](https://discord.gg/WmADZpJnSe)
12
-
13
- - [Documentation homepage](https://vestjs.dev)
14
- - **Try vest live**
15
- - [Vanilla JS Example](https://stackblitz.com/edit/vest-vanilla-support-example?file=validation.js)
16
- - ReactJS Examples:
17
- - [Example 1 (groups)](https://codesandbox.io/s/ecstatic-waterfall-4i2ne?file=/src/validate.js)
18
- - [Example 2 (Async)](https://codesandbox.io/s/youthful-williamson-loijb?file=/src/validate.js)
19
- - [Example 3](https://stackblitz.com/edit/vest-react-support-example?file=validation.js)
20
- - [Example 4](https://stackblitz.com/edit/vest-react-registration?file=validate.js)
21
- - [Example 5 (Password validator)](https://codesandbox.io/s/password-validator-example-6puvy?file=/src/validate.js)
22
- - [VueJS Example](https://codesandbox.io/s/vest-vue-example-1j6r8?file=/src/validations.js)
23
- - [Svelte Example](https://codesandbox.io/s/vestdocssvelteexample-k87t7?file=/validate.js)
24
-
25
- ## Tutorials
26
-
27
- [Step By Step React Tutorial](https://dev.to/ealush/dead-simple-form-validation-with-vest-5gf8)
28
-
29
- ## [Release Notes](https://github.com/ealush/vest/releases)
30
-
31
- ## 🦺 What is Vest?
32
-
33
- Vest is a validations library for JS apps that derives its syntax from modern JS unit testing frameworks such as Mocha or Jest. It is easy to learn due to its use of already common declarative patterns.
34
- It works great with user-input validation and with validating upon user interaction to provide the best possible user experience.
35
-
36
- The idea behind Vest is that your validations can be described as a 'spec' or a contract that reflects your form or feature structure. Your validations run in production, and they are framework agnostic - meaning Vest works well with React, Angular, Vue, or even without a framework at all.
37
-
38
- Using Vest for form validation can reduce bloat, improve feature readability and maintainability.
39
-
40
- **Basic Example**
41
- ![full](https://cdn.jsdelivr.net/gh/ealush/vest@assets/demos/full_3.gif 'full')
42
-
43
- **Memoized async test**
44
- ![memo](https://cdn.jsdelivr.net/gh/ealush/vest@assets/demos/memo.gif 'memo')
45
-
46
- ## ✅ Motivation
47
-
48
- 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.
49
-
50
- Vest tries to remediate this by separating validation logic from feature logic so it is easier to maintain over time and refactor when needed.
51
-
52
- ## ✨ Vest's features
53
-
54
- - 🎨 Framework agnostic (BYOUI)
55
- - ⚡️ Rich, extendable, assertions library (enforce) ([doc](http://vestjs.dev/#/enforce))
56
- - 🚥 Multiple validations for the same field
57
- - ⚠️ Warning (non failing) tests ([doc](http://vestjs.dev/#/warn))
58
- - 📝 Validate only the fields the user interacted with ([doc](http://vestjs.dev/#/exclusion))
59
- - ⏳ Memoize async validations to reduce calls to the server ([doc](http://vestjs.dev/#/test?id=testmemo-for-memoized-tests))
60
- - 🚦 Test grouping ([doc](http://vestjs.dev/#/group))
61
-
62
- ## Example code ([Run in sandbox](https://codesandbox.io/s/vest-react-tutorial-finished-ztt8t?file=/src/validate.js))
63
-
64
- ```js
65
- import { create, only, test, enforce, warn, skipWhen } from 'vest';
66
-
67
- export default create((data = {}, currentField) => {
68
- only(currentField);
69
-
70
- test('username', 'Username is required', () => {
71
- enforce(data.username).isNotEmpty();
72
- });
73
-
74
- test('username', 'Username is too short', () => {
75
- enforce(data.username).longerThanOrEquals(3);
76
- });
77
-
78
- test('password', 'Password is required', () => {
79
- enforce(data.password).isNotEmpty();
80
- });
81
-
82
- test('password', 'Password must be at least 6 chars long', () => {
83
- enforce(data.password).longerThanOrEquals(6);
84
- });
85
-
86
- test('password', 'Password is weak, Maybe add a number?', () => {
87
- warn();
88
- enforce(data.password).matches(/[0-9]/);
89
- });
90
-
91
- skipWhen(!data.password, () => {
92
- test('confirm_password', 'Passwords do not match', () => {
93
- enforce(data.confirm_password).equals(data.password);
94
- });
95
- });
96
-
97
- test('email', 'Email Address is not valid', () => {
98
- enforce(data.email).isEmail();
99
- });
100
-
101
- test('tos', () => {
102
- enforce(data.tos).isTruthy();
103
- });
104
- });
105
- ```
106
-
107
- ## Why Vest?
108
-
109
- - 🧠 Vest is really easy to learn. You can take your existing knowledge of unit tests and transfer it to validations.
110
- - ✏️ Vest takes into account user interaction and warn only validations.
111
- - 🧱 Your validations are structured, making it very simple to read and write. All validation files look the same.
112
- - 🖇 Your validation logic is separate from your feature logic, preventing the spaghetti code that's usually involved with writing validations.
113
- - 🧩 Validation logic is easy to share and reuse across features.
Binary file
Binary file
package/docs/_sidebar.md DELETED
@@ -1,14 +0,0 @@
1
- - [Getting Started](./getting_started)
2
- - [enforce](./enforce)
3
- - [The result object](./result)
4
- - [test](./test)
5
- - [How to fail a test](./test#failing_a_test)
6
- - [Warn only tests](./warn)
7
- - [Grouping tests](./group)
8
- - [Optional Tests](./optional)
9
- - Advanced cases
10
- - [Cross Field Validations](./cross_field_validations)
11
- - [Excluding or including tests](./exclusion)
12
- - [Using with node](./node)
13
- - [Utilities](./utilities)
14
- - [Migration Guides](./migration)
@@ -1,33 +0,0 @@
1
- # Cross Field Validations
2
-
3
- Sometimes it is not enough to only validate a field by itself, because its validity is dependant on the validity or invalidity of a different field.
4
-
5
- Take for example the password confirmation field, by itself it serves no purpose, and as long as the password itself is not field, you might choose to not validate it to begin with. That's an **AND** relationship between fields. There can also be an **OR** relationship between fields, for example - either email address or phone number have to be filled, but neither is required as long the other was filled by the user.
6
-
7
- All these cases can be easily handled with Vest in different ways, depending on your requirements and validation strategy.
8
-
9
- ## skipWhen for conditionally skipping a test
10
-
11
- Sometimes you might want to skip running a certain validation based on some criteria, for example - only test for password strength if password DOESN'T have Errors. You could access the intermediate validation result and use it mid-run.
12
-
13
- ```js
14
- import { create, test, enforce } from 'vest';
15
-
16
- const suite = create((data = {}) => {
17
- test('password', 'Password is required', () => {
18
- enforce(data.password).isNotEmpty();
19
- });
20
- skipWhen(suite.get().hasErrors('password'), () => {
21
- test('password', 'Password is weak', () => {
22
- enforce(data.password).longerThan(8);
23
- });
24
- });
25
- });
26
- export default suite;
27
- ```
28
-
29
- ## Optional tests
30
-
31
- By default, all the tests inside Vest are required in order for the suite to be considered as "valid". Sometimes your app's logic may allow tests not to be filled out and you want them not to be accounted for in the suites validity. The optional utility allows you to specify logic to determine if a test is optional or not, for example - if it depends on a different test.
32
-
33
- Read more in the [optional tests doc](./optional).
package/docs/enforce.md DELETED
@@ -1,11 +0,0 @@
1
- # Enforce
2
-
3
- Enforce is Vest's assertion library. It is used to validate values within, or outside of a Vest test.
4
-
5
- ```js
6
- import { enforce, test } from 'vest';
7
-
8
- test('username', 'Must be at least three characters long', () => {
9
- enforce(username).longerThan(2);
10
- });
11
- ```