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.
- package/CHANGELOG.md +3 -1
- package/dist/cjs/classnames.development.js +3 -3
- package/dist/cjs/classnames.production.js +1 -1
- package/dist/cjs/promisify.development.js +1 -1
- package/dist/cjs/promisify.production.js +1 -1
- package/dist/cjs/vest.development.js +95 -66
- package/dist/cjs/vest.production.js +1 -1
- package/dist/es/classnames.development.js +3 -3
- package/dist/es/classnames.production.js +1 -1
- package/dist/es/promisify.development.js +1 -1
- package/dist/es/promisify.production.js +1 -1
- package/dist/es/vest.development.js +95 -66
- package/dist/es/vest.production.js +1 -1
- package/dist/umd/classnames.development.js +3 -3
- package/dist/umd/classnames.production.js +1 -1
- package/dist/umd/promisify.development.js +1 -1
- package/dist/umd/promisify.production.js +1 -1
- package/dist/umd/vest.development.js +95 -66
- package/dist/umd/vest.production.js +1 -1
- package/package.json +1 -1
- package/types/classnames.d.ts +2 -2
- package/types/vest.d.ts +9 -2
- package/docs/.nojekyll +0 -0
- package/docs/README.md +0 -113
- package/docs/_assets/favicon.ico +0 -0
- package/docs/_assets/vest-logo.png +0 -0
- package/docs/_sidebar.md +0 -14
- package/docs/cross_field_validations.md +0 -33
- package/docs/enforce.md +0 -11
- package/docs/exclusion.md +0 -129
- package/docs/getting_started.md +0 -72
- package/docs/group.md +0 -142
- package/docs/index.html +0 -41
- package/docs/migration.md +0 -202
- package/docs/n4s/rules.md +0 -1282
- package/docs/node.md +0 -36
- package/docs/optional.md +0 -103
- package/docs/result.md +0 -249
- package/docs/state.md +0 -102
- package/docs/test.md +0 -172
- package/docs/utilities.md +0 -109
- package/docs/warn.md +0 -82
|
@@ -602,7 +602,7 @@
|
|
|
602
602
|
|
|
603
603
|
function isProxySupported() {
|
|
604
604
|
try {
|
|
605
|
-
return
|
|
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('
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
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(
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
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(
|
|
1681
|
+
return addTo(0 /* ONLY */, 'tests', item);
|
|
1658
1682
|
}
|
|
1659
|
-
only.group = function (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(
|
|
1690
|
+
return addTo(1 /* SKIP */, 'tests', item);
|
|
1665
1691
|
}
|
|
1666
|
-
skip.group = function (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] =
|
|
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
|
|
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
|
|
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-
|
|
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
package/types/classnames.d.ts
CHANGED
|
@@ -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
|
|
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 {
|
|
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
|
-
|
|
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-
|
|
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
|
-

|
|
2
|
-
|
|
3
|
-
# Vest 🦺 Declarative Validation Testing
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-

|
|
7
|
-
|
|
8
|
-
[](https://badge.fury.io/js/vest) [](https://travis-ci.org/ealush/vest) [](https://snyk.io/test/npm/vest)
|
|
9
|
-

|
|
10
|
-
|
|
11
|
-
[](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
|
-

|
|
42
|
-
|
|
43
|
-
**Memoized async test**
|
|
44
|
-

|
|
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.
|
package/docs/_assets/favicon.ico
DELETED
|
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
|
-
```
|