vue-tiny-validator
Version:
Tiny form validation tool for Vue 3
2 lines (1 loc) • 1.33 kB
JavaScript
import{isRef as e,computed as r,ref as t,inject as n,onBeforeUnmount as i,reactive as a,provide as o}from"vue";const l=Symbol("Form");function s({value:a,rules:o,identifier:s,form:u}){const c=e(a)?a:r(a),f=e(o)?o:r(o instanceof Function?o:()=>o),v=t(""),d=()=>{v.value=""},m=e=>e&&"string"==typeof e?(v.value=e,!1):(d(),!0),g=()=>m(function(e,r){for(const t of r){const r=t(e);if(!0!==r)return r}}(c.value,f.value)),y=()=>async function(e,r){for(const t of r)try{const r=await t(e);if(!0!==r)return r}catch(v){return v.message}}(c.value,f.value).then(m),F=n(l,null==u?void 0:u[l]);if(F){const e={validate:g,validateAsync:y,reset:d,error:v,identifier:s,value:c};F.registerField(e),i((()=>F.unregisterField(e)))}return{validate:g,validateAsync:y,error:r((()=>v.value)),reset:d}}function u(){const e=a(new Set),t={registerField(r){e.add(r)},unregisterField(r){e.delete(r)}};o(l,t);const n={[l]:t},i=r((()=>[...e].filter((e=>!!e.error)).map((({error:e,value:r,identifier:t})=>({message:e,value:r,identifier:t}))))),s=()=>{for(const r of e)r.reset()};return{validate:()=>{s();for(const r of e)r.validate();return 0===i.value.length},validateAsync:async()=>(s(),await Promise.all([...e].map((e=>e.validateAsync()))),0===i.value.length),errors:i,reset:s,form:n,isValid:r((()=>0===i.value.length))}}export{s as useField,u as useForm};