UNPKG

alpidate

Version:

A model-based validation plugin for Alpine.js, inspired by Vuelidate.

2 lines (1 loc) 2.38 kB
(()=>{function w(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[$,p]=l.split(","),f=i[$];""+f===p&&(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 b=l?new RegExp(l):null;t=b?!b.test(r):!0}catch(b){t=!0}break}s[c]=t,t&&(s.$invalid=!0)}),s}function x(r,e){let i={};for(let s in e)if(s.includes("*")){let c=s.split(".")[0];(r[c]||[]).forEach((t,$)=>{let p=s.replace("*",$);i[p]=e[s]})}else i[s]=e[s];return i}function O(r,e,i){let s=x(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=x(e,s),l=n?[n]:Object.keys(c);n||(e[i].$touch=!0),l.forEach(t=>{let $=c[t],p=t.split("."),f=e[i],u=e;p.forEach((a,o)=>{var d;if(!isNaN(Number(a))){u=u[a];return}f[a]||(f[a]={$invalid:!1}),f=f[a],u=(d=u[a])!=null?d:u[a]}),Object.assign(f,w(u,$,e)),Array.isArray(u)&&Object.keys(s).find(o=>o.includes("*")&&o.startsWith(p[0]))&&(f.each=u.map((o,d)=>{let m={};return Object.keys(s).filter(h=>h.startsWith(p[0]+".*")).map(h=>({fieldName:h.split(".").slice(-1)[0],rules:s[h]})).forEach(h=>{m[h.fieldName]=w(o[h.fieldName],h.rules,e)}),m}),f.$invalid=f.each.some(o=>Object.values(o).some(d=>d.$invalid)));let b=t.split(".");if(b.length>1){let a=e[i];for(let o=0;o<b.length-1;o++){let d=b[o];if(!a[d])continue;let m=a[d];m.$invalid=Object.values(m).filter(g=>typeof g=="object"&&g!==null).some(g=>g.$invalid),a=m}}})},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)})}})})})}window.alpidate=N;})();