svelte-formup
Version:
form helpers for svelte
3 lines (2 loc) • 5.18 kB
JavaScript
import{getContext as va,setContext as wa}from"svelte";import{writable as q,derived as x,get as M}from"svelte/store";import{identity as N,run_all as xa,listen as O,prevent_default as _,subscribe as s,query_selector_all as ya,toggle_class as za,noop as $,blank_object as aa}from"svelte/internal";const P=a=>typeof a==="string",C=a=>a.tagName==="FORM",ba=a=>{a&&xa(a.filter(Boolean))},B=a=>Array.isArray(a)?a:a?[a]:[],Q=a=>P(a)&&a,Aa=a=>a?.split(/\s+/g).map(b=>D(document.getElementById(b))).find(N),D=a=>a&&!C(a)&&(Q(a.dataset?.pathAt)||Q(a.name)||Aa(a.htmlFor)||Q(a.id)),ca=(a,b,d=D(a))=>{if(d)return b(d)},E=(a,b,d)=>B(b).map(e=>O(a,e,d)),da=new WeakSet(),ea=new WeakSet(),F=(a,b)=>d=>{a.has(d)||(a.add(d),b(d))},fa=a=>b=>ca(b.target,a);function Ba(a,b,d){let e;const j=()=>ba(e),n=(h={})=>{j(),P(h)&&(h={at:h});const{at:v=D(b),debounce:k=a.debounce,validateOn:i=h.on||a.validateOn,dirtyOn:I=h.on||h.validateOn||a.dirtyOn}=h,y=l=>a.validateAt(l,{debounce:k}),p=l=>a.setDirtyAt(l);v?e=B(v).flatMap(l=>[...E(b,i,F(da,()=>y(l))),...E(b,I,F(ea,()=>p(l)))]):(C(b)&&(b.noValidate=!0,b.autocomplete=a.autocomplete,b.role||(b.role="form"),e=[O(b,"submit",_(a.submit)),O(b,"reset",_(a.reset))]),e=[...E(b,i,F(da,fa(y))),...E(b,I,F(ea,fa(p)))]),e.push(a.validity(b,h).destroy)};return n(d),{update:n,destroy:j}}const ga=(a,b,d,e,j)=>ca(a,n=>e(a,b,d,n),j),G=(a,b,d,e,j)=>s(e,n=>ga(b,d,n,j,a)),H=(a,b,d,e,j)=>s(d,n=>j(a,b,ya("input,select,textarea,[contenteditable],output,object,button",a).map(h=>ga(h,b,n,e)))),Ca=a=>C(a)||"setCustomValidity"in a,u=(a,b,d,e)=>{const j=`${Ca(a)?"is":"has"}-${e}`;return za(a,b[j]||j,d),d},Da=(a,b)=>(a.setCustomValidity?.(b?.message||""),b),R=(a,b,d)=>(u(a,b,!d,"pristine"),u(a,b,d,"dirty")),ha=(a,b,d)=>u(a,b,d,"success"),ia=(a,b,d)=>u(a,b,d,"error"),S=(a,b,d)=>u(a,b,d,"validating"),ja=(a,b,d)=>ia(a,b,Da(a,d)),ka=(a,b,d,e)=>R(a,b,d.has(e)),la=(a,b,d,e)=>ja(a,b,d.get(e)),ma=(a,b,d,e)=>ha(a,b,d.has(e)),na=(a,b,d,e)=>S(a,b,d.has(e)),T=a=>(b,d,e)=>a(b,d,e.find(N)),Ea=a=>(b,d,e)=>a(b,d,e.every(N));function Fa(a,b,d){let e;const j=()=>ba(e),n=(h={})=>{j(),P(h)&&(h={at:h});const{at:v=D(b)}=h,k={...a.classes,...h.classes};v?e=B(v).flatMap(i=>[G(i,b,k,a.dirty,ka),G(i,b,k,a.invalid,la),G(i,b,k,a.valid,ma),G(i,b,k,a.validating,na)]):C(b)?e=[s(a.isDirty,i=>R(b,k,i)),s(a.isError,i=>ia(b,k,i)),s(a.isValidating,i=>S(b,k,i)),s(a.isSubmitting,i=>u(b,k,i,"submitting")),s(a.isSubmitted,i=>u(b,k,i,"submitted"))]:e=[H(b,k,a.dirty,ka,T(R)),H(b,k,a.invalid,la,T(ja)),H(b,k,a.valid,ma,Ea(ha)),H(b,k,a.validating,na,T(S))]};return n(d),{update:n,destroy:j}}const oa=Symbol.for("svelte-formup"),pa=(a,b,d)=>a.update(e=>(e[d?"add":"delete"](b),e)),Ga=()=>va(oa),Ha=({size:a})=>a===0,Ia=a=>!a,Ja=({schema:a,onSubmit:b=$,onReset:d=$,getInitialValues:e=aa,validateInitialValues:j=!1,state:n=aa(),validateOn:h="change",dirtyOn:v=h,debounce:k=100,classes:i={},autocomplete:I="off"})=>{const y=q(e()),p=q(new Map()),l=q(new Set()),z=q(new Set()),Ka=x([l,z,p],([c,f,g])=>{const m=new Set();for(const o of c)!g.has(o)&&!f.has(o)&&m.add(o);return m}),La=x([l,z,p],([c,f,g])=>{const m=new Map();for(const[o,r]of g.entries())c.has(o)&&!f.has(o)&&m.set(o,r);return m}),A=q(!1),J=q(!1),K=q(!1),qa=x(l,Ha),ra=x(qa,Ia),Ma=x([ra,J,z,p],([c,f,g,m])=>c&&!f&&g.size===0&&m.size>0),L=q(0),U=(c,f)=>p.update(g=>(f?g.set(c,f):g.delete(c),g)),V=c=>U("",c),Na=(c,f=!0)=>pa(l,c,f),W=(c,f=!0)=>pa(z,c,f),t={schema:a,values:y,state:q(n),formError:x(p,c=>c.get("")),errors:p,dirty:l,validating:z,invalid:La,valid:Ka,isValidating:J,isSubmitting:A,isSubmitted:K,submitCount:L,isPristine:qa,isDirty:ra,isError:Ma,async submit(c){if(M(A))return;K.set(!1),A.set(!0),L.update(f=>f+1),ta();try{const f=await Z();if(f){const g=await b(f,t,c);return L.set(0),K.set(!0),g}}catch(f){V(f)}finally{A.set(!1)}},reset(c){if(M(A))return;y.set(e(c)),ta(),l.set(new Set()),p.set(new Map()),K.set(!1),L.set(0),j&&void Z(c),d(t,c)},setFormError:V,setErrorAt:U,setDirtyAt:Na,setValidatingAt:W,validateAt:ua,validate:(c,f)=>Ba(t,c,f),validity:(c,f)=>Fa(t,c,f),validateOn:B(h),dirtyOn:B(v),debounce:k,classes:i,autocomplete:I};wa(oa,t);let X;s(y,c=>{X=c});const Y=new Map();let w;const sa=(c,f)=>({formup:t,signal:c.signal,event:f});return j&&void Z(),t;async function Z(c){w?.abort(),w=new AbortController();const f=w;J.set(!0);try{const g=await a.validate(X,{abortEarly:!1,strict:!1,context:sa(w,c)});if(f===w)return p.set(new Map()),g}catch(g){if(f===w){const m=new Map();l.update(o=>([].concat(g.inner?.length?g.inner:g).forEach(r=>{r.path?(m.set(r.path,r),o.add(r.path)):V(r)}),o)),p.set(m)}}finally{f===w&&J.set(!1)}}function ta(){Y.forEach(c=>{clearTimeout(c.t),c.c&&c.c.abort(),c.l=0,c.c=void 0,c.t=void 0}),z.set(new Set())}function ua(c,{debounce:f=t.debounce}={}){if(M(A))return;let g=Y.get(c);g||Y.set(c,g={l:0}),g.c?.abort(),clearTimeout(g.t),g.t=setTimeout(Oa,f,c,g,f)}async function Oa(c,f,g){if(Date.now()-f.l<g)return ua(c,{debounce:g});const m=new AbortController();f.c=m,f.l=Date.now(),W(c);let o;try{await a.validateAt(c,X,{abortEarly:!0,strict:!0,context:sa(m)})}catch(r){o=r}f.c===m&&(f.c=void 0,W(c,!1),U(c,o))}};export{Ja as formup,Ga as getFormupContext};
//# sourceMappingURL=svelte-formup.js.map