svelte-formup
Version:
form helpers for svelte
3 lines (2 loc) • 7.32 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});const svelte=require("svelte"),store=require("svelte/store"),internal=require("svelte/internal"),isString=a=>typeof a==="string",isHTMLFormElement=a=>a.tagName==="FORM",runAll=a=>{a&&internal.run_all(a.filter(Boolean))},asArray=a=>Array.isArray(a)?a:a?[a]:[],validatePath=a=>isString(a)&&a,findSchemaPathById=a=>a==null?void 0:a.split(/\s+/g).map(b=>findSchemaPathForElement(document.getElementById(b))).find(internal.identity),findSchemaPathForElement=a=>{var b;return a&&!isHTMLFormElement(a)&&(validatePath((b=a.dataset)==null?void 0:b.pathAt)||validatePath(a.name)||findSchemaPathById(a.htmlFor)||validatePath(a.id))},withPathOf=(a,b,c=findSchemaPathForElement(a))=>{if(c)return b(c)},listenOn=(a,b,c)=>asArray(b).map(e=>internal.listen(a,e,c)),VALIDATE_EVENTS=new WeakSet(),DIRTY_EVENTS=new WeakSet(),dedupeEvents=(a,b)=>c=>{a.has(c)||(a.add(c),b(c))},listenWith=a=>b=>withPathOf(b.target,a);function validate(a,b,c){let e;const k=()=>runAll(e),n=(i={})=>{k(),isString(i)&&(i={at:i});const{at:s=findSchemaPathForElement(b),debounce:l=a.debounce,validateOn:j=i.on||a.validateOn,dirtyOn:y=i.on||i.validateOn||a.dirtyOn}=i,t=m=>a.validateAt(m,{debounce:l}),p=m=>a.setDirtyAt(m);s?e=asArray(s).flatMap(m=>[...listenOn(b,j,dedupeEvents(VALIDATE_EVENTS,()=>t(m))),...listenOn(b,y,dedupeEvents(DIRTY_EVENTS,()=>p(m)))]):(isHTMLFormElement(b)&&(b.noValidate=!0,b.autocomplete=a.autocomplete,b.role||(b.role="form"),e=[internal.listen(b,"submit",internal.prevent_default(a.submit)),internal.listen(b,"reset",internal.prevent_default(a.reset))]),e=[...listenOn(b,j,dedupeEvents(VALIDATE_EVENTS,listenWith(t))),...listenOn(b,y,dedupeEvents(DIRTY_EVENTS,listenWith(p)))]),e.push(a.validity(b,i).destroy)};return n(c),{update:n,destroy:k}}const updateToggle=(a,b,c,e,k)=>withPathOf(a,n=>e(a,b,c,n),k),subscribeTo=(a,b,c,e,k)=>internal.subscribe(e,n=>updateToggle(b,c,n,k,a)),subscribeToElements=(a,b,c,e,k)=>internal.subscribe(c,n=>k(a,b,internal.query_selector_all("input,select,textarea,[contenteditable],output,object,button",a).map(i=>updateToggle(i,b,n,e)))),isFormField=a=>isHTMLFormElement(a)||"setCustomValidity"in a,toogleClass=(a,b,c,e)=>{const k=`${isFormField(a)?"is":"has"}-${e}`;return internal.toggle_class(a,b[k]||k,c),c},setCustomValidity=(a,b)=>{var c;return(c=a.setCustomValidity)==null||c.call(a,(b==null?void 0:b.message)||""),b},updateDirty=(a,b,c)=>(toogleClass(a,b,!c,"pristine"),toogleClass(a,b,c,"dirty")),updateSuccess=(a,b,c)=>toogleClass(a,b,c,"success"),updateError=(a,b,c)=>toogleClass(a,b,c,"error"),updateValidating=(a,b,c)=>toogleClass(a,b,c,"validating"),updateValidity=(a,b,c)=>updateError(a,b,setCustomValidity(a,c)),updateStoreDirty=(a,b,c,e)=>updateDirty(a,b,c.has(e)),updateStoreValidity=(a,b,c,e)=>updateValidity(a,b,c.get(e)),updateStoreSuccess=(a,b,c,e)=>updateSuccess(a,b,c.has(e)),updateStoreValidating=(a,b,c,e)=>updateValidating(a,b,c.has(e)),useFirstTo=a=>(b,c,e)=>a(b,c,e.find(internal.identity)),useEveryTo=a=>(b,c,e)=>a(b,c,e.every(internal.identity));function validity(a,b,c){let e;const k=()=>runAll(e),n=(i={})=>{k(),isString(i)&&(i={at:i});const{at:s=findSchemaPathForElement(b)}=i,l={...a.classes,...i.classes};s?e=asArray(s).flatMap(j=>[subscribeTo(j,b,l,a.dirty,updateStoreDirty),subscribeTo(j,b,l,a.invalid,updateStoreValidity),subscribeTo(j,b,l,a.valid,updateStoreSuccess),subscribeTo(j,b,l,a.validating,updateStoreValidating)]):isHTMLFormElement(b)?e=[internal.subscribe(a.isDirty,j=>updateDirty(b,l,j)),internal.subscribe(a.isError,j=>updateError(b,l,j)),internal.subscribe(a.isValidating,j=>updateValidating(b,l,j)),internal.subscribe(a.isSubmitting,j=>toogleClass(b,l,j,"submitting")),internal.subscribe(a.isSubmitted,j=>toogleClass(b,l,j,"submitted"))]:e=[subscribeToElements(b,l,a.dirty,updateStoreDirty,useFirstTo(updateDirty)),subscribeToElements(b,l,a.invalid,updateStoreValidity,useFirstTo(updateValidity)),subscribeToElements(b,l,a.valid,updateStoreSuccess,useEveryTo(updateSuccess)),subscribeToElements(b,l,a.validating,updateStoreValidating,useFirstTo(updateValidating))]};return n(c),{update:n,destroy:k}}const isNode=typeof process!=="undefined"&&(process==null?void 0:process.title)!=="browser",CONTEXT_KEY=Symbol.for("svelte-formup"),setAt=(a,b,c)=>a.update(e=>(e[c?"add":"delete"](b),e)),getFormupContext=()=>svelte.getContext(CONTEXT_KEY),isEmpty=({size:a})=>a===0,negate=a=>!a,formup=({schema:a,onSubmit:b=internal.noop,onReset:c=internal.noop,getInitialValues:e=internal.blank_object,validateInitialValues:k=!1,state:n=internal.blank_object(),validateOn:i="change",dirtyOn:s=i,debounce:l=isNode?0:100,classes:j={},autocomplete:y="off"})=>{const t=store.writable(e()),p=store.writable(new Map()),m=store.writable(new Set()),u=store.writable(new Set()),N=store.derived([m,u,p],([d,f,g])=>{const h=new Set();for(const o of d)!g.has(o)&&!f.has(o)&&h.add(o);return h}),O=store.derived([m,u,p],([d,f,g])=>{const h=new Map();for(const[o,w]of g.entries())d.has(o)&&!f.has(o)&&h.set(o,w);return h}),v=store.writable(!1),z=store.writable(!1),A=store.writable(!1),I=store.derived(m,isEmpty),J=store.derived(I,negate),P=store.derived([J,z,u,p],([d,f,g,h])=>d&&!f&&g.size===0&&h.size>0),B=store.writable(0),C=(d,f)=>p.update(g=>(f?g.set(d,f):g.delete(d),g)),D=d=>C("",d),Q=(d,f=!0)=>setAt(m,d,f),E=(d,f=!0)=>setAt(u,d,f),q={schema:a,values:t,state:store.writable(n),formError:store.derived(p,d=>d.get("")),errors:p,dirty:m,validating:u,invalid:O,valid:N,isValidating:z,isSubmitting:v,isSubmitted:A,submitCount:B,isPristine:I,isDirty:J,isError:P,async submit(d){if(store.get(v))return;A.set(!1),v.set(!0),B.update(f=>f+1),L();try{const f=await H();if(f){const g=await b(f,q,d);return B.set(0),A.set(!0),g}}catch(f){D(f)}finally{v.set(!1)}},reset(d){if(store.get(v))return;t.set(e(d)),L(),m.set(new Set()),p.set(new Map()),A.set(!1),B.set(0),k&&void H(d),c(q,d)},setFormError:D,setErrorAt:C,setDirtyAt:Q,setValidatingAt:E,validateAt:M,validate:(d,f)=>validate(q,d,f),validity:(d,f)=>validity(q,d,f),validateOn:asArray(i),dirtyOn:asArray(s),debounce:l,classes:j,autocomplete:y};svelte.setContext(CONTEXT_KEY,q);let F;internal.subscribe(t,d=>{F=d});const G=new Map();let r;const K=(d,f)=>({formup:q,signal:d.signal,event:f});return k&&void H(),q;async function H(d){r==null||r.abort(),r=new AbortController();const f=r;z.set(!0);try{const g=await a.validate(F,{abortEarly:!1,strict:!1,context:K(r,d)});if(f===r)return p.set(new Map()),g}catch(g){if(f===r){const h=new Map();m.update(o=>{var w;return[].concat(((w=g.inner)==null?void 0:w.length)?g.inner:g).forEach(x=>{x.path?(h.set(x.path,x),o.add(x.path)):D(x)}),o}),p.set(h)}}finally{f===r&&z.set(!1)}}function L(){G.forEach(d=>{clearTimeout(d.t),d.c&&d.c.abort(),d.l=0,d.c=void 0,d.t=void 0}),u.set(new Set())}function M(d,{debounce:f=q.debounce}={}){var g;if(store.get(v))return;let h=G.get(d);h||G.set(d,h={l:0}),(g=h.c)==null||g.abort(),clearTimeout(h.t),h.t=setTimeout(R,f,d,h,f)}async function R(d,f,g){if(Date.now()-f.l<g)return M(d,{debounce:g});const h=new AbortController();f.c=h,f.l=Date.now(),E(d);let o;try{await a.validateAt(d,F,{abortEarly:!0,strict:!0,context:K(h)})}catch(w){o=w}f.c===h&&(f.c=void 0,E(d,!1),C(d,o))}};exports.formup=formup,exports.getFormupContext=getFormupContext;
//# sourceMappingURL=svelte-formup.js.map