alpidate
Version:
A model-based validation plugin for Alpine.js, inspired by Vuelidate.
2 lines (1 loc) • 1.26 kB
JavaScript
(()=>{function a(c){for(let e in c.validations){let f=e.split(".");c.$watch(e,()=>{c.validate(e)});let i=c.$v;f.forEach(l=>{i[l]===void 0&&(i[l]={}),i[l]!==void 0&&(i=i[l])});let s=i;c.validations[e].forEach(l=>{l=l.split(":"),s[l[0]]=null})}return c}function h(c){c.magic("validation",()=>e=>{e.$v={},e.$v.$touch=!1,e.validate=(f=null)=>{let i=!1,s="",l=[];f==null?(e.$v.$touch=!0,l=Object.keys(e.validations)):l=[f],l.forEach(v=>{let o=e.validations[v];typeof o=="string"&&(o=[o]);let r=e.$v,t=e;v.split(".").forEach(n=>{r[n]!==void 0&&(r=r[n],t=t[n])}),r.$invalid=!1,o.forEach(n=>{switch(n=n.split(":"),n[0]){case"required":i=t===null||t===""||!t;break;case"numeric":i=isNaN(t);break;case"email":i=!/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(t);break;case"regex":if(!n[1]){i=!0;break}i=!new RegExp(n[1]).test(t);break;case"min":if(!n[1]){i=!0;break}i=t.length<n[1];break;case"max":if(!n[1]){i=!0;break}i=t.length>n[1];break}r.$invalid||(r.$invalid=i),r[n[0]]=i})})},e.$v.reset=()=>{e.$v.$touch=!1},e.$v.$invalid=!0,e=a(e),e.$watch("$v",()=>{let f=!1;for(let i of Object.keys(e.validations)){let s=e.$v;i.split(".").forEach(l=>{s[l]!==void 0&&(s=s[l])});for(let l of Object.keys(s))if(f=s[l]||s[l]===null,f)break;if(f)break}e.$v.$invalid=f})})}})();