vest 4.0.0-dev-deabb8 → 4.0.0-dev-8851ff

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.
@@ -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 d(n){return String(n)===n}function g(n,t){return d(n)&&d(t)&&n.endsWith(t)}function v(n,t){return n===t}function h(n){var t=Number(n);return!(isNaN(parseFloat(String(n)))||isNaN(Number(n))||!isFinite(t))}function y(n,t){return h(n)&&h(t)&&Number(n)>Number(t)}function m(n,t){return h(n)&&h(t)&&Number(n)>=Number(t)}function b(n,t){return!!(Array.isArray(t)||d(t)&&d(n))&&-1!==t.indexOf(n)}function N(n){return!!Array.isArray(n)}function E(n,t){return h(n)&&h(t)&&Number(n)<=Number(t)}function C(n,t,r){return m(n,t)&&E(n,r)}function O(n){return!!n===n}function w(n){return"number"==typeof n}function T(n){if(n){if(w(n))return 0===n;if(Object.prototype.hasOwnProperty.call(n,"length"))return c(n,0);if("object"==typeof n)return c(Object.keys(n),0)}return!0}function S(n){return Number.isNaN(n)}function x(n){return!!h(n)&&0>Number(n)}function k(n){return!!n}function P(n,t){return h(n)&&h(t)&&Number(n)<Number(t)}function j(n,t){return t instanceof RegExp?t.test(n):!!d(t)&&new RegExp(t).test(n)}function F(n,t){return h(n)&&h(t)&&Number(n)===Number(t)}function W(n,t){return d(n)&&d(t)&&n.startsWith(t)}function A(n,t){throw Error(i(t,n))}function I(n){function t(t,u){var i,o,s=r();return t=An({},s||{},null!==(i=null==n?void 0:n(t,s))&&void 0!==i?i:t),i=e.ctx=Object.freeze(t),e.ancestry.unshift(i),u=u(i),e.ancestry.shift(),e.ctx=null!==(o=e.ancestry[0])&&void 0!==o?o:null,u}function r(){return e.ctx}var e={ancestry:[]};return{bind:function(n,r){return function(){for(var e=[],u=0;u<arguments.length;u++)e[u]=arguments[u];return t(n,(function(){return r.apply(void 0,e)}))}},run:t,use:r,useX:function(n){var t;return null!==(t=e.ctx)&&void 0!==t?t:A(i(n,"Context was used after it was closed"))}}}function R(){return null}function q(n,t){var r,e=function(r){var e=n[r],u=t[r];if(!(r=$n.run({value:e,set:!0,meta:{key:r}},(function(){return s(u,e)}))).pass)return{value:r}};for(r in t){var u=e(r);if("object"==typeof u)return u.value}return o(!0)}function B(n){for(var t in nt){var e=nt[t];r(e)&&n(t,e)}}function D(){return"function"==typeof Proxy}function G(n,r,e){for(var i=[],s=3;s<arguments.length;s++)i[s-3]=arguments[s];return O(n)||n&&O(n.pass)||A("Incorrect return value for rule: "+JSON.stringify(n)),O(n)?o(n):o(n.pass,u.apply(void 0,t([n.message,r,e],i,!1)))}function X(n){function r(r,e,u){return function(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];if(!(o=G.apply(void 0,t([$n.run({value:n},(function(){return e.apply(void 0,t([n],i,!1))})),u,n],i,!1))).pass){if(!T(o.message))throw o.message;A("enforce/"+u+" failed with "+JSON.stringify(n))}return r}}var e={};if(!D())return B((function(n,t){e[n]=r(e,t,n)})),e;var u=new Proxy(e,{get:function(n,t){if(n=nt[t])return r(u,n,t)}});return u}function K(n){var r,s=[];return function n(a){return function(){for(var c=[],f=0;f<arguments.length;f++)c[f]=arguments[f];var l=nt[a];s.push((function(n){return G.apply(void 0,t([l.apply(void 0,t([n],c,!1)),a,n],c,!1))}));var p={run:function(n){return i(e(s,(function(t,e){var i,s=$n.run({value:n},(function(){return t(n)}));s.pass||e(o(!!s.pass,null!==(i=u(r,n,s.message))&&void 0!==i?i:s.message))})),o(!0))},test:function(n){return p.run(n).pass},message:function(n){return n&&(r=n),p}};return D()?p=new Proxy(p,{get:function(t,r){return nt[r]?n(r):t[r]}}):(B((function(t){p[t]=n(t)})),p)}}(n)}function _(n){var t,r={};for(t in n)r[t]=tt.optional(n[t]);return r}function L(n,t){return!(!t||n.fieldName!==t)}function M(n){void 0===n&&(n=10);var t=[],r=function(e,u){var i=r.get(e);return i?i[1]:(u=u(),t.unshift([e.concat(),u]),t.length>n&&(t.length=n),u)};return r.invalidate=function(n){var r=t.findIndex((function(t){var r=t[0];return c(n,r.length)&&n.every((function(n,t){return n===r[t]}))}));-1<r&&t.splice(r,1)},r.get=function(n){return t[t.findIndex((function(t){var r=t[0];return c(n,r.length)&&n.every((function(n,t){return n===r[t]}))}))]||null},r}function U(){return et.useX().stateRef}function J(){return U().testObjects()}function z(n){var t=U().testObjectsCursor()[0],r=J();n!==r[0][t]&&(0,r[1])((function(r){return(r=r.slice(0))[t]=n,r}))}function V(){(0,U().testObjectsCursor()[1])((function(n){return n+1}))}function Y(n){return!!U().optionalFields()[0][n]}function H(){return J()[0].filter((function(n){return n.isPending()}))}function Q(n){var t=H();return!T(t)&&(n?t.some((function(t){return L(t,n)})):Un(t))}function Z(n,t){function r(n,t){i[n]++,u&&(i[t]=(i[t]||[]).concat(u))}var e=t.fieldName,u=t.message;n[e]=n[e]||{errorCount:0,warnCount:0,testCount:0};var i=n[e];return t.isSkipped()||(n[e].testCount++,t.isFailing()?r("errorCount","errors"):t.isWarning()&&r("warnCount","warnings")),i}function $(n,t,r){var e;void 0===r&&(r={});var u=(r=r||{}).group,i=r.fieldName;return t.reduce((function(t,r){return u&&r.groupName!==u||i&&!L(r,i)||"warnings"===n!=!!r.warns||!r.hasFailures()||(t[r.fieldName]=(t[r.fieldName]||[]).concat(r.message||[])),t}),Wn({},i&&((e={})[i]=[],e)))}function nn(n){return rn("errors",n)}function tn(n){return rn("warnings",n)}function rn(n,t){return n=$(n,J()[0],{fieldName:t}),t?n[t]:n}function en(n,t){return n=on("errors",n,t),t?n[t]:n}function un(n,t){return n=on("warnings",n,t),t?n[t]:n}function on(n,t,r){return t||A("get"+n[0].toUpperCase()+n.slice(1)+"ByGroup requires a group name. Received `"+t+"` instead."),$(n,J()[0],{group:t,fieldName:r})}function sn(n,t,r){return!(!n.hasFailures()||r&&!L(n,r)||"warnings"===t!=!!n.warns)}function an(n){return fn("errors",n)}function cn(n){return fn("warnings",n)}function fn(n,t){return J()[0].some((function(r){return sn(r,n,t)}))}function ln(n,t){return dn("errors",n,t)}function pn(n,t){return dn("warnings",n,t)}function dn(n,t,r){return J()[0].some((function(e){return t===e.groupName&&sn(e,n,r)}))}function gn(n,t){return!n.hasErrors(t)&&(!(T(J()[0])||t&&T(n.tests[t])||Un(H().filter((function(n){return!(t&&!L(n,t))&&!Y(n.fieldName)}))))&&function(n){return J()[0].every((function(t){return!!(n&&!L(t,n)||Y(t.fieldName))||t.isTested()}))}(t))}function vn(){var n=J()[0],t={stateRef:U()};return ut([n],et.bind(t,(function(){return An(function(){var n={errorCount:0,groups:{},testCount:0,tests:{},warnCount:0};return J()[0].forEach((function(t){var r=t.fieldName,e=t.groupName;n.tests[r]=Z(n.tests,t),e&&(n.groups[e]=n.groups[e]||{},n.groups[e][r]=Z(n.groups[e],t))})),function(n){for(var t in n.tests)n.errorCount+=n.tests[t].errorCount,n.warnCount+=n.tests[t].warnCount,n.testCount+=n.tests[t].testCount;return n}(n)}(),{getErrors:et.bind(t,nn),getErrorsByGroup:et.bind(t,en),getWarnings:et.bind(t,tn),getWarningsByGroup:et.bind(t,un),hasErrors:et.bind(t,an),hasErrorsByGroup:et.bind(t,ln),hasWarnings:et.bind(t,cn),hasWarningsByGroup:et.bind(t,pn),isValid:et.bind(t,(function(n){return gn(vn(),n)}))})})))}function hn(){var n=J()[0],t={stateRef:U()};return it([n],et.bind(t,(function(){return An({},vn(),{done:et.bind(t,ot)})})))}function yn(n,t,e){return!(r(n)&&(!t||e.tests[t]&&0!==e.tests[t].testCount))}function mn(n){return!(Q()&&(!n||Q(n)))}function bn(n,t){var r=et.bind({},n);(0,U().testCallbacks()[1])((function(n){return t?n.fieldCallbacks[t]=(n.fieldCallbacks[t]||[]).concat(r):n.doneCallbacks.push(r),n}))}function Nn(n){return n.forEach((function(n){return n()}))}function En(){var n=et.useX();return n.bus||A(),n.bus}function Cn(n){return wn("only","tests",n)}function On(n){return wn("skip","tests",n)}function wn(n,t,r){var e=et.useX("hook called outside of a running suite.");r&&[].concat(r).forEach((function(r){d(r)&&(e.exclusion[t][r]="only"===n)}))}function Tn(n){for(var t in n)if(!0===n[t])return!0;return!1}function Sn(n){A("Wrong arguments passed to group. Group "+n+".")}function xn(n){var t=n.asyncTest,e=n.message;if(t&&r(t.then)){var u=En().emit,i=U(),o=et.bind({stateRef:i},(function(){u(jn.TEST_COMPLETED,n)}));i=et.bind({stateRef:i},(function(t){n.isCanceled()||(n.message=d(t)?t:e,n.fail(),(0,J()[1])((function(n){return n.slice(0)})),o())}));try{t.then(o,i)}catch(n){i()}}}function kn(n){var t=U().testObjectsCursor()[0],e=U().prevTestObjects()[0];if(z(t=i(e[t],n)),function(n){var t=n.fieldName;n=n.groupName;var r=et.useX();if(r.skipped)return!0;var e=(r=r.exclusion).tests,u=e[t];if(!1===u)return!0;if(u=!0===u,n){n:{var i=et.useX().exclusion.groups;if(Object.prototype.hasOwnProperty.call(i,n))var o=!1===i[n];else{for(o in i)if(!0===i[o]){o=!0;break n}o=!1}}if(o)return!0;if(!0===r.groups[n])return!(u||!Tn(e)&&!1!==e[t])}return!u&&Tn(e)}(n))return n.skip(),V(),t;if(n!==t&&t.fieldName===n.fieldName&&t.groupName===n.groupName&&t.isPending()&&t.cancel(),z(n),V(),n.isUntested()){t=En().emit,e=function(n){return et.run({currentTest:n},(function(){try{var t=n.testFn()}catch(r){t=r,p(n.message)&&d(t)&&(n.message=r),t=!1}return!1===t&&n.fail(),t}))}(n);try{e&&r(e.then)?(n.asyncTest=e,n.setPending(),xn(n)):t(jn.TEST_COMPLETED,n)}catch(t){A("Your test function "+n.fieldName+" returned "+JSON.stringify(e)+'. Only "false" or a Promise are supported. Return values may cause unexpected behavior.')}}else(t=n.asyncTest)&&r(t.then)&&(n.setPending(),xn(n));return n}function Pn(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];r=t.reverse(),t=r[0],r=r[1];var e=et.useX();return kn(t=new st(n,t,{message:r,groupName:null==e?void 0:e.groupName}))}var jn,Fn,Wn=function(){return Wn=Object.assign||function(n){for(var t,r=1,e=arguments.length;r<e;r++)for(var u in t=arguments[r])Object.prototype.hasOwnProperty.call(t,u)&&(n[u]=t[u]);return n},Wn.apply(this,arguments)},An=Object.assign,In=a(c),Rn=a(l),qn=a(p),Bn=a(g),Dn=a(v),Gn=a(h),Xn=a(b),Kn=a(N),_n=a(C),Ln=a(O),Mn=a(w),Un=a(T),Jn=a(S),zn=a(x),Vn=a(d),Yn=a(k),Hn=a(j),Qn=a(F),Zn=a(W),$n=I((function(n,t){var r={value:n.value,meta:n.meta||{}};return t?n.set?An(r,{parent:function(){return t?{value:t.value,meta:t.meta,parent:t.parent}:t}}):t:An(r,{parent:R})})),nt=An({condition:function(n,t){try{return t(n)}catch(n){return!1}},doesNotEndWith:Bn,doesNotStartWith:Zn,endsWith:g,equals:v,greaterThan:y,greaterThanOrEquals:m,gt:y,gte:m,inside:b,isArray:N,isBetween:C,isBoolean:O,isEmpty:T,isEven:function(n){return!!h(n)&&0==n%2},isFalsy:Yn,isNaN:S,isNegative:x,isNotArray:Kn,isNotBetween:_n,isNotBoolean:Ln,isNotEmpty:Un,isNotNaN:Jn,isNotNull:Rn,isNotNumber:Mn,isNotNumeric:Gn,isNotString:Vn,isNotUndefined:qn,isNull:l,isNumber:w,isNumeric:h,isOdd:function(n){return!!h(n)&&0!=n%2},isPositive:zn,isString:d,isTruthy:k,isUndefined:p,lengthEquals:c,lengthNotEquals:In,lessThan:P,lessThanOrEquals:E,longerThan:f,longerThanOrEquals:function(n,t){return n.length>=Number(t)},lt:P,lte:E,matches:j,notEquals:Dn,notInside:Xn,notMatches:Hn,numberEquals:F,numberNotEquals:Qn,shorterThan:function(n,t){return n.length<Number(t)},shorterThanOrEquals:function(n,t){return n.length<=Number(t)},startsWith:W},{allOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass||r(t)})),o(!0))},anyOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){(t=s(t,n)).pass&&r(t)})),o(!1))},noneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return i(e(t,(function(t,r){s(t,n).pass&&r(o(!1))})),o(!0))},oneOf:function(n){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];var e=[];return t.some((function(t){if(f(e,1))return!1;(t=s(t,n)).pass&&e.push(t)})),o(c(e,1))},optional:function(n,t){return p(n)||null===n?o(!0):s(t,n)}},{shape:function(n,t){var r=q(n,t);if(!r.pass)return r;for(var e in n)if(!Object.prototype.hasOwnProperty.call(t,e))return o(!1);return o(!0)},loose:q,isArrayOf:function(n,t){return i(e(n,(function(n,r,e){(e=$n.run({value:n,set:!0,meta:{index:e}},(function(){return s(t,n)}))).pass||r(e)})),o(!0))}}),tt=(Fn=Wn({context:function(){return $n.useX()},extend:function(n){An(nt,n)}},{partial:_}),D()?new Proxy(An(X,Fn),{get:function(n,t){return t in n?n[t]:nt[t]?K(t):void 0}}):(B((function(n){Fn[n]=K(n)})),Fn)),rt=function(n){return function(){return""+n++}}(0),et=I((function(n,t){return t?null:An({},{exclusion:{tests:{},groups:{}}},n)})),ut=M(20),it=M(20),ot=function(){for(var n=[],t=0;t<arguments.length;t++)n[t]=arguments[t];var r=(n=n.reverse())[0];if(n=n[1],t=hn(),yn(r,n,t))return t;var e=function(){return r(vn())};return mn(n)?(e(),t):(bn(e,n),t)};(jn||(jn={})).TEST_COMPLETED="test_completed",Cn.group=function(n){return wn("only","groups",n)},On.group=function(n){return wn("skip","groups",n)};var st=function(){function n(n,t,r){var e=void 0===r?{}:r;r=e.message,e=e.groupName,this.id=rt(),this.warns=!1,this.status=at,this.fieldName=n,this.testFn=t,e&&(this.groupName=e),r&&(this.message=r)}return n.prototype.run=function(){try{var n=this.testFn()}catch(t){n=t,p(this.message)&&d(n)&&(this.message=t),n=!1}return!1===n&&this.fail(),n},n.prototype.setStatus=function(n){this.isCanceled()||(this.status=n)},n.prototype.setPending=function(){this.setStatus(dt)},n.prototype.fail=function(){this.setStatus(this.warns?lt:ft)},n.prototype.done=function(){this.isWarning()||this.isCanceled()||this.isFailing()||this.setStatus(pt)},n.prototype.warn=function(){this.warns=!0},n.prototype.skip=function(){this.setStatus(ct)},n.prototype.cancel=function(){this.setStatus(gt),function(n){(0,J()[1])((function(t){var r=t.indexOf(n);return-1!==r&&t.splice(r,1),[].concat(t)}))}(this)},n.prototype.valueOf=function(){return!this.isFailing()},n.prototype.hasFailures=function(){return this.isFailing()||this.isWarning()},n.prototype.isPending=function(){return this.status===dt},n.prototype.isTested=function(){return this.hasFailures()||this.isPassing()},n.prototype.isUntested=function(){return this.status===at},n.prototype.isFailing=function(){return this.status===ft},n.prototype.isCanceled=function(){return this.status===gt},n.prototype.isSkipped=function(){return this.status===ct},n.prototype.isPassing=function(){return this.status===pt},n.prototype.isWarning=function(){return this.status===lt},n}(),at="UNTESTED",ct="SKIPPED",ft="FAILED",lt="WARNING",pt="PASSING",dt="PENDING",gt="CANCELED",vt=An(Pn,{each:function(n){return function(r){return Array.isArray(r)||A("test.each: Expected table to be an array."),function(e){for(var i=[],o=1;o<arguments.length;o++)i[o-1]=arguments[o];var s=(i=i.reverse())[0],a=i[1];return r.map((function(r){return r=[].concat(r),n(u.apply(void 0,t([e],r,!1)),u.apply(void 0,t([a],r,!1)),(function(){return s.apply(void 0,r)}))}))}}}(Pn),memo:function(n){var t=M(100);return function(r){for(var e=[],u=1;u<arguments.length;u++)e[u-1]=arguments[u];u=U().suiteId()[0];var i=U().testObjectsCursor()[0],o=(e=e.reverse())[1],s=e[2];return e=[u,r,i].concat(e[0]),null===(u=t.get(e))?t(e,(function(){return n(r,s,o)})):u[1].isCanceled()?(t.invalidate(e),t(e,(function(){return n(r,s,o)}))):kn(u[1])}}(Pn)});n.VERSION="4.0.0-dev-deabb8",n.create=function(n){r(n)||A("Suite initialization error. Expected `tests` to be a function.");var t=function(){var n=function(){var n={};return{emit:function(t,r){n[t]&&n[t].forEach((function(n){n(r)}))},on:function(t,r){return n[t]||(n[t]=[]),n[t].push(r),{off:function(){n[t]=n[t].filter((function(n){return n!==r}))}}}}}();return n.on(jn.TEST_COMPLETED,(function(n){if(!n.isCanceled()){n.done(),n=n.fieldName;var t=U().testCallbacks()[0].fieldCallbacks;n&&!Q(n)&&Array.isArray(t[n])&&Nn(t[n]),n=U().testCallbacks()[0].doneCallbacks,Q()||Nn(n)}})),n}(),e=function(n){function t(n,t){return i.references.push(),e(n,u(t)),function(){return[i.references[n],function(t){return e(n,u(t,i.references[n]))}]}}function e(t,e){var u=i.references[t];i.references[t]=e,r(t=o[t][1])&&t(e,u),r(n)&&n()}var i={references:[]},o=[];return{registerStateKey:function(n,r){var e=o.length;return o.push([n,r]),t(e,n)},reset:function(){i.references=[],o.forEach((function(n,r){return t(r,n[0])}))}}}(),i=function(n,t){var r=t.suiteId;return{optionalFields:n.registerStateKey((function(){return{}})),prevTestObjects:n.registerStateKey((function(){return[]})),suiteId:n.registerStateKey((function(){return r})),testCallbacks:n.registerStateKey((function(){return{fieldCallbacks:{},doneCallbacks:[]}})),testObjects:n.registerStateKey((function(){return[]})),testObjectsCursor:n.registerStateKey((function(){return 0}))}}(e,{suiteId:rt()});return An(et.bind({stateRef:i,bus:t},(function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var u=J()[0];return r=U().prevTestObjects()[1],e.reset(),r((function(){return u})),n.apply(void 0,t),hn()})),{get:et.bind({stateRef:i},vn),remove:et.bind({stateRef:i},(function(n){var t=J()[0];[].concat(t).forEach((function(t){L(t,n)&&t.cancel()}))})),reset:e.reset})},n.enforce=tt,n.group=function(n,t){d(n)||Sn("name must be a string"),r(t)||Sn("callback must be a function"),et.run({groupName:n},t)},n.only=Cn,n.optional=function(n){(0,U().optionalFields()[1])((function(t){return[].concat(n).forEach((function(n){t[n]=!0})),t}))},n.skip=On,n.skipWhen=function(n,t){et.run({skipped:u(n)},(function(){return t()}))},n.test=vt,n.warn=function(){var n=et.useX("warn hook called outside of a running suite.");n.currentTest||A("warn called outside of a test."),n.currentTest.warn()},Object.defineProperty(n,"__esModule",{value:!0})}));
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.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-8851ff",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})}));
package/docs/README.md CHANGED
@@ -0,0 +1,113 @@
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 CHANGED
@@ -5,7 +5,7 @@
5
5
  - [How to fail a test](./test#failing_a_test)
6
6
  - [Warn only tests](./warn)
7
7
  - [Grouping tests](./group)
8
- - [Understanding Vest's state](./state)
8
+ - [Optional Tests](./optional)
9
9
  - Advanced cases
10
10
  - [Cross Field Validations](./cross_field_validations)
11
11
  - [Excluding or including tests](./exclusion)
@@ -6,96 +6,17 @@ Take for example the password confirmation field, by itself it serves no purpose
6
6
 
7
7
  All these cases can be easily handled with Vest in different ways, depending on your requirements and validation strategy.
8
8
 
9
- ## The Any utility
9
+ ## skipWhen for conditionally skipping a test
10
10
 
11
- Your specific example can be handled with the `any` utility function. The `any` utility function takes a series of functions or expressions, and as long as at least one evaluates to `true`, it will mark your validation as passing.
12
-
13
- There are two possible ways to use `any`:
14
-
15
- ### Use any to run one of multiple tests
16
-
17
- the `any` utility will run each function until a passing test is found. This means that once one of the tests passes, the others won't run at all, saving you some performance.
18
-
19
- Demo: https://codesandbox.io/s/demo-forked-tdj92?file=/src/validate.js
20
-
21
- ```js
22
- import { create, test, enforce } from 'vest';
23
- import any from 'vest/any';
24
-
25
- export default create((data = {}) => {
26
- any(
27
- () =>
28
- test('email', 'Email or phone must be set', () => {
29
- enforce(data.email).isNotEmpty();
30
- }),
31
- () =>
32
- test('phone', 'Email or phone must be set', () => {
33
- enforce(data.phone).isNotEmpty();
34
- })
35
- );
36
- });
37
- ```
38
-
39
- ### Use any to use different conditions in the same test
40
-
41
- You could also use any within your test, if you have a joined test for both scenarios. This means that you have to return a boolean from your tests.
42
-
43
- Demo: https://codesandbox.io/s/demo-forked-ltn8l?file=/src/validate.js
44
-
45
- ```js
46
- import { create, test, enforce } from 'vest';
47
- import any from 'vest/any';
48
-
49
- export default create((data = {}) => {
50
- test('email_or_phone', 'Email or phone must be set', () =>
51
- any(
52
- () => {
53
- enforce(data.email).isNotEmpty();
54
- return true;
55
- },
56
- () => {
57
- enforce(data.phone).isNotEmpty();
58
- return true;
59
- }
60
- )
61
- );
62
- });
63
- ```
64
-
65
- ## if/else for conditionally skipping fields
66
-
67
- If your field depends on a different field's existence or a different simple condition, you could use a basic if/else statement.
68
- In the following example I only validate `confirm` if password is not empty:
69
-
70
- DEMO: https://codesandbox.io/s/demo-forked-z2ur9?file=/src/validate.js
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.
71
12
 
72
13
  ```js
73
14
  import { create, test, enforce } from 'vest';
74
- export default create((data = {}) => {
75
- test('password', 'Password is required', () => {
76
- enforce(data.password).isNotEmpty();
77
- });
78
- if (data.password) {
79
- test('confirm', 'Passwords do not match', () => {
80
- enforce(data.confirm).equals(data.password);
81
- });
82
- }
83
- });
84
- ```
85
-
86
- ## if/else for conditionally skipping field based on a previous result
87
-
88
- Sometimes you might want to run a certain validation based on the validation result of a previously run test, 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.
89
15
 
90
- This requires using the function created from create():
91
-
92
- ```js
93
- import { create, test, enforce, skipWhen } from 'vest';
94
16
  const suite = create((data = {}) => {
95
17
  test('password', 'Password is required', () => {
96
18
  enforce(data.password).isNotEmpty();
97
19
  });
98
-
99
20
  skipWhen(suite.get().hasErrors('password'), () => {
100
21
  test('password', 'Password is weak', () => {
101
22
  enforce(data.password).longerThan(8);
@@ -104,3 +25,9 @@ const suite = create((data = {}) => {
104
25
  });
105
26
  export default suite;
106
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).
@@ -19,27 +19,25 @@ Vest tests are very much like unit tests, with only slight differences. Instead
19
19
 
20
20
  ## Writing tests
21
21
 
22
- First, you need to initialize your validation suite using `vest.create()`. This initializes your validation suite state and allows validation results to be merged with future validations.
22
+ First, you need to initialize your validation suite using `create()`. This initializes your validation suite state and allows validation results to be merged with future validations.
23
23
 
24
24
  ```js
25
- import * as vest from 'vest';
25
+ import { create } from 'vest';
26
26
 
27
- const suite = vest.create(() => {
27
+ const suite = create(() => {
28
28
  // validation suite content goes here.
29
29
  });
30
30
 
31
31
  const validationResult = suite();
32
32
  ```
33
33
 
34
- `vest.create()` takes the suite body as its only argument. This is where your tests reside.
35
-
36
- vest.create returns a `validate` function which runs your validation suite. All the arguments you pass to it are being forwarded to your tests callback. You can use it to pass form data to your validation, excluded fields, and anything required for during your validation runtime.
34
+ `create()` takes a callback that contains your tests, and returns a "suite" function which runs your validation suite. All the arguments you pass to it are being forwarded to your tests callback. You can use it to pass form data to your validation, excluded fields, and anything required for during your validation runtime.
37
35
 
38
36
  A simple validation suite would look somewhat like this:
39
37
 
40
38
  ```js
41
39
  // suite.js
42
- import { test, enforce, create } from ‘vest’;
40
+ import { create, test, enforce } from ‘vest’;
43
41
 
44
42
  const suite = create((formData) => {
45
43
      test('username', 'Must be between 2 and 10 chars', () => {
package/docs/group.md CHANGED
@@ -6,7 +6,7 @@ Similar to the `describe` and `context` features provided by unit testing framew
6
6
  [Try on CodeSandbox (React)](https://codesandbox.io/s/vest-group-example-react-4i2ne)
7
7
 
8
8
  ```js
9
- import { test, group, enforce, skip, create } from 'vest';
9
+ import { create, test, group, enforce, skip } from 'vest';
10
10
 
11
11
  create(data => {
12
12
  skip.group(data.userExists ? 'signUp' : 'signIn');
@@ -48,7 +48,7 @@ You may have in your application a multi-screen form, in which you want to valid
48
48
 
49
49
  ```js
50
50
  // suite.js
51
- import { test, group, enforce, create, only } from 'vest';
51
+ import { create, test, group, enforce, only } from 'vest';
52
52
 
53
53
  const suite = create((data, currentTab) => {
54
54
  only.group(currentScreen);
package/docs/migration.md CHANGED
@@ -118,7 +118,7 @@ vest.get('user_form'); // Returns the most recent validation result
118
118
  #### v3
119
119
 
120
120
  ```js
121
- const suite = vest.create(() => {
121
+ const suite = create(() => {
122
122
  /*...*/
123
123
  });
124
124
 
@@ -142,7 +142,7 @@ vest.reset('user_form'); // Resets the validity state
142
142
  #### v3
143
143
 
144
144
  ```js
145
- const suite = vest.create(() => {
145
+ const suite = create(() => {
146
146
  /*...*/
147
147
  });
148
148
 
@@ -166,10 +166,10 @@ const suite = vest.create('user_form', () => {
166
166
  #### v3
167
167
 
168
168
  ```js
169
- const suite = vest.create('user_form', () => {
170
- if (suite.get().hasErrors('username')) {
169
+ const suite = create('user_form', () => {
170
+ skipWhen(suite.get().hasErrors('username'), () => {
171
171
  /* ... */
172
- }
172
+ });
173
173
  });
174
174
  ```
175
175
 
@@ -191,10 +191,10 @@ const result = data =>
191
191
  #### v3
192
192
 
193
193
  ```js
194
- import * as vest from 'vest';
194
+ import { create } from 'vest';
195
195
 
196
196
  const suite = data =>
197
- vest.create(() => {
197
+ create(() => {
198
198
  /* ... */
199
199
  })();
200
200