gib-validate
Version:
gib-validate is a lightweight validation helper for Vue 3 (Composition API). It provides a set of common validation rules and a `useValidation` hook to validate reactive form state.
2 lines (1 loc) • 3.97 kB
JavaScript
(function(r,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],i):(r=typeof globalThis<"u"?globalThis:r||self,i(r["gib-validate"]={},r.Vue))})(this,function(r,i){"use strict";const $=Symbol("vuelidate"),g=new Map,d=new Map;function v(t,e){g.set(t,e);const n=d.get(t);n&&(n.value=e)}function D(t){return g.get(t)}function N(t){if(!d.has(t)){const e=i.ref(g.get(t));d.set(t,e)}return d.get(t)}function R(t){const e=g.delete(t),n=d.get(t);return n&&(n.value=void 0),e}function k(t,e,n){const a=i.ref(!1),h=i.ref({}),f=i.shallowRef(new Set),w=i.ref({}),X=()=>{a.value=!0,S(Object.keys(i.unref(e))),Object.entries(w.value).forEach(([s,u])=>{u.$touch()})},Y=()=>{a.value=!1,f.value=new Set([]),Object.entries(w.value).forEach(([s,u])=>{u.$reset()})},S=s=>{a.value=!0;const u=Array.isArray(s)?s:[s];f.value=new Set([...i.unref(f),...u])},Z=s=>{const u=Array.isArray(s)?s:[s],o=i.unref(f),l=new Set(o);u.forEach(c=>{l.delete(c)}),f.value=l},T=i.computed(()=>{var l;const s={},u=i.toValue(h),o=Object.keys(u);for(const c of o)(l=h.value[c])!=null&&l.length&&f.value.has(c)&&(s[c]=h.value[c]);return s}),x=i.computed(()=>Object.entries(T.value).reduce((s,[u,o])=>(o!=null&&o.length&&(s[u]=o[0]),s),{}));i.watch([()=>({...t}),()=>e],async([s,u])=>{const o={},l=i.unref(u);for(const c in l){const V=l[c];if(V){const E=(await Promise.all(V.map(async m=>{if(!m)return!0;const j=await m(i.unref(s[c]));return typeof j=="string"?j:null}))).filter(m=>typeof m=="string");E.length>0&&(o[c]=E)}}h.value=o},{immediate:!0});const y=i.computed(()=>({$touch:X,$touched:f,$reset:Y,$resetField:Z,$touchField:S,$dirty:a.value,$message:x.value,$errors:T.value,$silentErrors:h.value,$children:w})),b=i.inject($,null);return b&&i.watchEffect(()=>{const s=n||Object.keys(b.value.$children).length.toString();b.value.$children.value[s]=y.value}),n&&(i.watchEffect(()=>{v(n,y.value)}),i.watchEffect(()=>()=>{R(n)})),i.provide($,y),y}const q=(t,e="field is required")=>n=>t()&&(!n||typeof n=="string"&&n.trim()==="")?e:!0,O=(t,e="values do not match")=>n=>n!==t?e:!0,p=(t,e="invalid value")=>n=>t.includes(n)?!0:e,A=(t="invalid url")=>e=>!e||!/^(https?:\/\/)?([a-z0-9-]+\.)+[a-z]{2,}(:[0-9]+)?(\/.*)?$/i.test(e)?t:!0,P=(t="invalid phone number")=>e=>!e||!/^\+?[0-9\s\-()]{7,}$/.test(e)?t:!0,z=(t="date must be in the past")=>e=>{const n=new Date;return new Date(e)>=n?t:!0},I=(t=8,e=!0,n=`password must be at least ${t} chars and contain special characters`)=>a=>a.length<t||e&&!/[!@#$%^&*(),.?":{}|<>]/.test(a)?n:!0,L=(t="value is not a number")=>e=>isNaN(Number(e))?t:!0,F=(t="value is not an integer")=>e=>Number.isInteger(Number(e))?!0:t,M=(t="date must be in the future")=>e=>{const n=new Date;return new Date(e)<=n?t:!0},U=(t="invalid date")=>e=>{const n=new Date(e);return isNaN(n.getTime())?t:!0},_=(t,e="invalid file type")=>n=>t.includes(n.type)?!0:e,B=(t,e=`file size must be less than ${t} MB`)=>n=>n.size>t*1024*1024?e:!0,C=(t,e="value must be equal to target")=>n=>n!==t?e:!0,G=(t,e="value must contain specified value")=>n=>n.includes(String(t))?!0:e,H=(t,e,n=`value must be between ${t} and ${e}`)=>a=>a<t||a>e?n:!0,J=(t="invalid email")=>e=>{const n=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;return!e||e.length>254||!n.test(e)?t:!0},K=(t,e="value too long")=>n=>n.length>t?e:!0,Q=(t,e="value too short")=>n=>n.length<t?e:!0,W=(t="value is required")=>e=>e==null||typeof e=="string"&&e.trim()===""||Array.isArray(e)&&e.length===0||typeof e=="object"&&!Object.keys(e).length?t:!0;r.between=H,r.contains=G,r.equalTo=C,r.fileSizeLessThan=B,r.fileType=_,r.getValidation=D,r.isDate=U,r.isEmail=J,r.isFutureDate=M,r.isInteger=F,r.isNumeric=L,r.isPassword=I,r.isPastDate=z,r.isPhone=P,r.isUrl=A,r.maxLength=K,r.minLength=Q,r.oneOf=p,r.registerValidation=v,r.required=W,r.requiredIf=q,r.sameAs=O,r.unregisterValidation=R,r.useNamedValidation=N,r.useValidation=k,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});