alpidate
Version:
A model-based validation plugin for Alpine.js, inspired by Vuelidate.
2 lines (1 loc) • 2.35 kB
JavaScript
function x(r,e,i){let s={$invalid:!1};return e.forEach(n=>{let[c,l]=n.split(":"),t=!1;switch(c){case"required":t=r===null||r===""||r===void 0||Array.isArray(r)&&r.length===0;break;case"requiredIf":let[m,h]=l.split(","),f=i[m];""+f===h&&(t=r===null||r===""||r===void 0);break;case"array":t=!Array.isArray(r);break;case"min":(typeof r=="string"||Array.isArray(r))&&(t=r.length<Number(l));break;case"max":(typeof r=="string"||Array.isArray(r))&&(t=r.length>Number(l));break;case"numeric":t=isNaN(r);break;case"email":t=!/^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(r);break;case"regex":try{let p=l?new RegExp(l):null;t=p?!p.test(r):!0}catch{t=!0}break}s[c]=t,t&&(s.$invalid=!0)}),s}function w(r,e){let i={};for(let s in e)if(s.includes("*")){let c=s.split(".")[0];(r[c]||[]).forEach((t,m)=>{let h=s.replace("*",m);i[h]=e[s]})}else i[s]=e[s];return i}function O(r,e,i){let s=w(r,e);for(let n in s)r[i].validate(n),r.$watch(n,()=>r[i].validate(n));return r}function N(r){r.magic("validation",()=>(e,i=null)=>{i||(i="$v"),e[i]={},e[i].$touch=!1,e[i].$invalid=!0;let s=JSON.parse(JSON.stringify(e.validations));e[i].validate=(n=null)=>{let c=w(e,s),l=n?[n]:Object.keys(c);n||(e[i].$touch=!0),l.forEach(t=>{let m=c[t],h=t.split("."),f=e[i],u=e;h.forEach((o,a)=>{if(!isNaN(Number(o))){u=u[o];return}f[o]||(f[o]={$invalid:!1}),f=f[o],u=u[o]??u[o]}),Object.assign(f,x(u,m,e)),Array.isArray(u)&&Object.keys(s).find(a=>a.includes("*")&&a.startsWith(h[0]))&&(f.each=u.map((a,$)=>{let b={};return Object.keys(s).filter(d=>d.startsWith(h[0]+".*")).map(d=>({fieldName:d.split(".").slice(-1)[0],rules:s[d]})).forEach(d=>{b[d.fieldName]=x(a[d.fieldName],d.rules,e)}),b}),f.$invalid=f.each.some(a=>Object.values(a).some($=>$.$invalid)));let p=t.split(".");if(p.length>1){let o=e[i];for(let a=0;a<p.length-1;a++){let $=p[a];if(!o[$])continue;let b=o[$];b.$invalid=Object.values(b).filter(g=>typeof g=="object"&&g!==null).some(g=>g.$invalid),o=b}}})},e[i].reset=()=>e[i].$touch=!1,e=O(e,s,i),e.$watch(i,()=>{e[i].$invalid=Object.keys(e[i]).some(n=>{if(n.startsWith("$"))return!1;let c=e[i][n];return c.$invalid?!0:c.each?c.each.some(l=>Object.values(l).some(t=>t.$invalid)):!1})}),Object.entries(s).forEach(([n,c])=>{c.forEach(l=>{if(l.startsWith("requiredIf:")){let t=l.split(":")[1].split(",")[0];e.$watch(t,()=>{e[i].validate(n)})}})})})}var V=N;export{V as default};