UNPKG

@sparkstone/solid-validation

Version:

A lightweight form validation library for Solid.js with PocketBase integration.

3 lines (2 loc) 1.98 kB
import{createSignal as t}from"solid-js";import{createStore as e}from"solid-js/store";function i({element:t,validators:e=[]},i,n){return async()=>{null==t.setCustomValidity||t.setCustomValidity(""),null==t.checkValidity||t.checkValidity();let a=t.validationMessage;if(!a)for(const i of e){if(!i)continue;const e=await i(t);if(e){a=e,null==t.setCustomValidity||t.setCustomValidity(e);break}}var o;return a&&(n&&t.classList.toggle(n,!0),t.setAttribute("aria-invalid","true"),i({[null!=(o=t.name)?o:t.dataset.name]:a})),a}}function n({errorClass:n=""}={}){const[a,o]=e({}),[s,l]=t(!1),[r,u]=t(!1),c={},m=(t,e=()=>{})=>{queueMicrotask(()=>{var s;let l=null!=(s=t.name)?s:t.dataset.name;const r=e(),m=Array.isArray(r)?r:[];let d;c[l]=d={element:t,validators:m},t.onblur=()=>(u(!1),i(d,o,n)),t.oninput=()=>{u(!1),a[l]&&(o({[l]:void 0}),t.setAttribute("aria-invalid","false"),n&&t.classList.toggle(n,!1))}})};async function d(t,e){let a=!1;for(const t in c){const e=c[t];if(!e)continue;let s=await i(e,o,n)();a||!e.element.validationMessage&&!s||(e.element.focus(),e.element.scrollIntoView({behavior:"smooth"}),document.contains(e.element)?a=!0:delete c[t])}if(a)return;l(!0);let s=await t(e);if(l(!1),s instanceof Object){for(const t in s)t in c&&c[t].element.setAttribute("aria-invalid","true");o(s)}else f(),u(!0)}function f(){o(t=>Object.fromEntries(Object.entries(t).map(([t,e])=>[t,void 0])))}return{validate:m,formSubmit:(t,e)=>{const i=e()||(()=>{});u(!1),t.setAttribute("novalidate",""),t.onsubmit=async e=>{e.preventDefault(),await d(i,t)},t.onreset=()=>{f()}},submit:d,errors:a,isSubmitting:s,isSubmitted:r,validateField:async function(t){const e=c[t];if(!e)return!1;let s=await i(e,o,n)();return(e.element.validationMessage||s)&&(e.element.focus(),e.element.scrollIntoView({behavior:"smooth"})),!a[t]},getFieldValue:function(t){const e=c[t];return null==e?void 0:e.element.value},validateRef:(...t)=>e=>m(e,()=>t)}}export{n as useForm}; //# sourceMappingURL=main.modern.js.map