@rexform/validation
Version:
A monad for incremental validation without information loss.
3 lines (2 loc) • 3.77 kB
JavaScript
const r=(r,t)=>void 0===t?t=>r(t):r(t),t=r=>[].concat(r);var n;!function(r){r.Valid="Valid",r.Invalid="Invalid"}(n||(n={}));class e{constructor(r){this.variant=n.Valid,this.value=r}isValid(){return!0}isInvalid(){return!1}errorsOr(r){return r}empty(){return m()}concat(r){return E(r,y(t,this))}concatErr(r){return O(r,this)}map(r){return y(r,this)}mapErrors(r){return I(r,this)}mapError(r){return w(r,this)}ap(r){return P(r,this)}chain(r){return A(r,this)}fold(r,t){return L(r,t,this)}validateEither(r){return b(this,r)}validateEitherList(r){return g(this,r)}validate(r){return j(this,r)}validateAll(r){return k(this,r)}}class i{constructor(r,t){if(this.variant=n.Invalid,0===t.length)throw new Error("Tried to construct `Invalid` with an empty array of errors");this.errors=t,this.value=r}isValid(){return!1}isInvalid(){return!0}errorsOr(r){return p(r,this)}empty(){return m()}concat(r){return E(r,y(t,this))}concatErr(r){return O(r,this)}map(r){return y(r,this)}mapErrors(r){return I(r,this)}mapError(r){return w(r,this)}ap(r){return P(r,this)}chain(r){return A(r,this)}fold(r,t){return L(r,t,this)}validateEither(r){return b(this,r)}validateEitherList(r){return g(this,r)}validate(r){return j(this,r)}validateAll(r){return k(this,r)}}const a=r=>new e(r);function u(n,e){return r(r=>new i(n,t(r)),e)}function o(r){return r.variant===n.Valid}function s(r){return r.variant===n.Invalid}const l=(r,t)=>r instanceof e||r instanceof i?r:t&&t.length>0?u(r,t):a(r);function c(t,n){return r(r=>r.fold(u(t),a),n)}function d(t,n){return r(r=>null==r[t]?u(r[t],`Property "${t}" not found or null.`):a(r[t]),n)}const v=r=>Object.keys(r).reduce((t,n)=>t.chain(t=>r[n].fold((r,t)=>u(void 0,r),a).map(((r,t)=>n=>void 0===n?r:{...r,[t]:n})(t,n))),a({}));function h(t,n){return r(r=>Object.keys(t).reduce((n,e)=>({...n,[e]:d(e,r).chain(t[e])}),{}),n)}function f(t,n){return r(r=>n=>r(n)?a(n):u(n,t(n)),n)}function p(t,n){return r(r=>r.isValid()?t:r.errors,n)}function m(){return a([])}function E(t,n){return r(r=>t.concatErr(r).map(r.isValid()?r=>[...t.value,...r]:()=>t.value),n)}const V=r=>r.reduce((r,t)=>t.concat(r),m());function O(t,n){return r(r=>{const n=t.isValid()&&r.isValid();return n?t:u(t.value,[...r.errorsOr([]),...t.errorsOr([])])},n)}function y(t,n){return r(r=>r.isValid()?a(t(r.value)):u(t(r.value),r.errors),n)}function I(t,n){return r(r=>r.isValid()?r:u(r.value,t(r.errorsOr([]))),n)}function w(t,n){return r(r=>I(r=>r.map(t),r),n)}function P(t,n){return r(r=>{const n=r.isValid()&&t.isValid();return n?a(t.value(r.value)):u(t.value(r.value),[...r.errorsOr([]),...t.errorsOr([])])},n)}function A(t,n){return r(r=>{const n=t(r.value);return O(n,r)},n)}function L(t,n,e){return r(r=>r.isValid()?n(r.value):t(r.errors,r.value),e)}function b(n,e){return r(r=>{const e=r.fold(r=>u(n.value,t(r)),r=>a(r));return O(e,n)},e)}function g(t,n){return r(r=>r.reduce((r,t)=>b(r,t),t),n)}function j(t,n){return r(r=>b(t,r(t.value)),n)}function k(t,n){return r(r=>r.reduce((r,t)=>j(r,t),t),n)}const x={Variant:n,Valid:e,Invalid:i,valid:a,invalid:u,isValid:o,isInvalid:s,of:l,fromEither:c,property:d,allProperties:v,validateProperties:h,fromPredicateOr:f,errorsOr:p,empty:m,concat:E,sequence:V,concatErr:O,map:y,mapErrors:I,mapError:w,ap:P,chain:A,fold:L,validateEither:b,validateEitherList:g,validate:j,validateAll:k};export default x;export{x as Validation,v as allProperties,P as ap,A as chain,E as concat,O as concatErr,m as empty,p as errorsOr,L as fold,c as fromEither,f as fromPredicateOr,u as invalid,s as isInvalid,o as isValid,y as map,w as mapError,I as mapErrors,l as of,d as property,V as sequence,a as valid,j as validate,k as validateAll,b as validateEither,g as validateEitherList,h as validateProperties};
//# sourceMappingURL=rexformvalidation.es.production.js.map