UNPKG

validlyjs

Version:

A high-performance Laravel-inspired validation library for TypeScript/JavaScript

28 lines (27 loc) 2.44 kB
function r(r,n,t){const[e,i]=o({}),[s,u]=o(!0),[c,h]=o({}),[v,m]=o(new Set),[f,w]=o(!1),y=new d(n,t),p=l(async n=>{w(!0) try{let t if(n){const e={[n]:r[n]} t=await y.validate(e) let o=[] o=Array.isArray(t.errors)?t.errors.filter(r=>r.field===""+n).map(r=>r.message):t.errors[n]||[],i(r=>({...r,[n]:o})) const l=0===o.length return i(r=>{const t={...r,[n]:o},e=Object.values(t).some(r=>r.length>0) return u(!e),t}),l}{t=await y.validate(r) const n=(r=>{const n={} return Array.isArray(r)?r.forEach(r=>{const t=r.field n[t]||(n[t]=[]),n[t].push(r.message)}):Object.entries(r).forEach(([r,t])=>{n[r]=Array.isArray(t)?t:[t]}),n})(t.errors) return i(n),u(t.isValid),t.isValid}}catch(r){return!1}finally{w(!1)}},[r,n,y]),g=l(r=>{h(n=>({...n,[r]:!0})),(null==t?void 0:t.validateOnChange)&&v.has(r)&&p(r)},[v,p,null==t?void 0:t.validateOnChange]),E=l(r=>{const n=new Set(v) n.add(r),m(n),!1!==(null==t?void 0:t.validateOnBlur)&&p(r)},[v,p,null==t?void 0:t.validateOnBlur]),F=l(()=>{i({}),u(!0),h({}),m(new Set),w(!1)},[]),b=l(r=>{var n return null===(n=e[r])||void 0===n?void 0:n[0]},[e]),S=l(r=>{var n return((null===(n=e[r])||void 0===n?void 0:n.length)||0)>0},[e]) return a(()=>{(null==t?void 0:t.validateOnMount)&&p()},[]),{errors:e,isValid:s,isDirty:c,touchedFields:v,isValidating:f,validate:p,handleChange:g,handleBlur:E,reset:F,getFieldError:b,hasFieldError:S}}function n({children:r,options:n={}}){const t=new d({},n) return c(v.Provider,{value:{validator:t,options:n},children:r})}function t(){const r=u(v) if(!r)throw Error("useValidationContext must be used within a ValidationProvider") return r}function e({onSubmit:r,children:n,data:t,rules:e,options:i,className:o,...l}){return c("form",{onSubmit:async n=>{n.preventDefault() const o=new d(e,i),l=await o.validate(t) r(t,l.isValid,l)},className:o,...l,children:n})}function i({name:n,children:t,data:e,rules:i,options:o}){const{isDirty:l,touchedFields:a,handleChange:s,handleBlur:u,getFieldError:d,hasFieldError:v}=r(e,i,o) return c(h,{children:t({error:d(n)||"",hasError:v(n)||!1,isDirty:l[n]||!1,isTouched:a.has(n),onChange:r=>s(n,r),onBlur:()=>u(n)})})}import{useState as o,useCallback as l,useEffect as a,createContext as s,useContext as u}from"react" import{Validator as d}from"validlyjs" import{jsx as c,Fragment as h}from"react/jsx-runtime" const v=s(null) export{i as ValidatedField,e as ValidatedForm,n as ValidationProvider,r as useValidation,t as useValidationContext}