@volverjs/form-vue 1.0.0-beta.36 → 1.0.0-beta.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C["@volverjs/form-vue"]={},C.Vue,C.VueUseCore,C.zod))})(this,function(C,e,Q,B){"use strict";var b=(t=>(t.text="text",t.number="number",t.email="email",t.password="password",t.tel="tel",t.url="url",t.search="search",t.date="date",t.time="time",t.datetimeLocal="datetime-local",t.month="month",t.week="week",t.color="color",t.select="select",t.checkbox="checkbox",t.radio="radio",t.textarea="textarea",t.radioGroup="radioGroup",t.checkboxGroup="checkboxGroup",t.combobox="combobox",t.custom="custom",t))(b||{}),A=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(A||{});function L(t,i={}){const r=v=>{let d=v;for(;d instanceof B.ZodEffects;)d=d.innerType();return d instanceof B.ZodOptional&&(d=d._def.innerType),d},m=v=>{let d=v;for(;d instanceof B.ZodEffects;)d=d.innerType();return d instanceof B.ZodOptional},n=r(t);return{...(n instanceof B.ZodObject?n._def.unknownKeys==="passthrough":!1)?i:{},...Object.fromEntries(Object.entries(n.shape).map(([v,d])=>{const f=i[v],O=m(d);let c=r(d),o;if(c instanceof B.ZodDefault&&(o=c._def.defaultValue(),c=c._def.innerType),f===null&&c instanceof B.ZodNullable)return[v,f];if(f==null&&O)return[v,o];if(c instanceof B.ZodSchema){const y=d.safeParse(f);if(y.success)return[v,y.data??o]}if(c instanceof B.ZodArray&&Array.isArray(f)&&f.length){const y=r(c._def.type);if(y instanceof B.ZodObject)return[v,f.map(w=>L(y,w&&typeof w=="object"?w:void 0))]}if(c instanceof B.ZodRecord&&f){const y=r(c._def.valueType);if(y instanceof B.ZodObject)return[v,Object.keys(f).reduce((w,p)=>(w[p]=L(y,f[p]),w),{})]}return c instanceof B.ZodObject?[v,L(c,f&&typeof f=="object"?f:o)]:[v,o]}))}}function D(t,i,r,m,n){const a=e.ref(),v=e.ref(),d=e.computed(()=>v.value===A.invalid),f=e.ref(),O=e.ref(!1);let c;const o=x=>{const I=L(t,x);if(r!=null&&r.class){const u=r.class;return new u(I)}return I},y=async(x=f.value,I)=>{if(c=I,O.value)return!0;const u=await t.safeParseAsync(x);if(!u.success){if(v.value=A.invalid,!I)return a.value=u.error.format(),!1;const S=u.error.issues.filter(U=>I.has(U.path.join(".")));return S.length?(a.value=new B.ZodError(S).format(),!1):(a.value=void 0,!0)}return a.value=void 0,v.value=A.valid,f.value=o(u.data),!0},w=()=>{a.value=void 0,v.value=void 0,c=void 0},p=()=>{f.value=o(),w(),v.value=A.reset},s=async()=>O.value||!await y()?!1:(v.value=A.submitting,!0),{ignoreUpdates:g,stop:V}=Q.watchIgnorable(f,()=>{v.value=A.updated},{deep:!0,eventFilter:Q.throttleFilter((r==null?void 0:r.updateThrottle)??500)}),E=e.readonly(a),k=e.readonly(v),G=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:(r==null?void 0:r.readonly)??!1},tag:{type:String,default:"form"},template:{type:[Array,Function],default:void 0}},emits:["invalid","submit","update:modelValue","update:readonly","valid","reset"],expose:["errors","invalid","readonly","status","submit","tag","template","valid","validate","clear","reset"],slots:Object,setup(x,{emit:I}){return f.value=o(e.toRaw(x.modelValue)),e.watch(()=>x.modelValue,u=>{if(u){const S=e.isProxy(u)?e.toRaw(u):u;if(JSON.stringify(S)===JSON.stringify(e.toRaw(f.value)))return;f.value=typeof(S==null?void 0:S.clone)=="function"?S.clone():JSON.parse(JSON.stringify(S))}},{deep:!0}),e.watch(v,async u=>{var S,U,M,K,T,H;if(u===A.invalid){const l=e.toRaw(a.value);I("invalid",l),(S=r==null?void 0:r.onInvalid)==null||S.call(r,l);return}if(u===A.valid){const l=e.toRaw(f.value);I("valid",l),(U=r==null?void 0:r.onValid)==null||U.call(r,l),I("update:modelValue",l),(M=r==null?void 0:r.onUpdate)==null||M.call(r,l);return}if(u===A.submitting){const l=e.toRaw(f.value);I("submit",l),(K=r==null?void 0:r.onSubmit)==null||K.call(r,l);return}if(u===A.reset){const l=e.toRaw(f.value);I("reset",l),(T=r==null?void 0:r.onReset)==null||T.call(r,l);return}if(u===A.updated){if((a.value||r!=null&&r.continuousValidation||x.continuousValidation)&&await y(void 0,c),!f.value||!x.modelValue||JSON.stringify(f.value)!==JSON.stringify(x.modelValue)){const l=e.toRaw(f.value);I("update:modelValue",l),(H=r==null?void 0:r.onUpdate)==null||H.call(r,l)}v.value===A.updated&&(v.value=A.unknown)}}),e.onMounted(()=>{O.value=x.readonly}),e.watch(()=>x.readonly,u=>{O.value=u}),e.watch(O,u=>{u!==x.readonly&&I("update:readonly",O.value)}),e.provide(i,{clear:w,errors:E,formData:f,ignoreUpdates:g,invalid:d,readonly:O,reset:p,status:k,stopUpdatesWatch:V,submit:s,validate:y,wrappers:n}),{clear:w,errors:E,formData:f,ignoreUpdates:g,invalid:d,isReadonly:O,reset:p,status:k,stopUpdatesWatch:V,submit:s,validate:y,wrappers:n}},render(){const x=()=>{var I,u;return((u=(I=this.$slots)==null?void 0:I.default)==null?void 0:u.call(I,{errors:E.value,formData:f.value,invalid:d.value,readonly:O.value,status:k.value,wrappers:n,clear:w,ignoreUpdates:g,reset:p,stopUpdatesWatch:V,submit:s,validate:y}))??this.$slots.default};return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??(r==null?void 0:r.template))&&m?[e.h(m,{schema:this.template??(r==null?void 0:r.template)},{default:x})]:{default:x})}});return{clear:w,errors:a,formData:f,ignoreUpdates:g,invalid:d,readonly:O,reset:p,status:v,wrappers:n,stopUpdatesWatch:V,submit:s,validate:y,VvForm:G}}function q(t){return Array.isArray(t)}function F(t){return!1}function X(t){return t===null}function Y(t){return typeof t=="object"}function z(t){return typeof t=="string"}function _(t){return typeof t>"u"}const ee=/^[0-9]+$/,re=["__proto__","prototype","constructor"];function $(t,i,r){const m=F()?r:void 0;if(!Y(t)||!z(i))return m;const n=j(i);if(n.length!==0){for(const a of n){if(a==="*")continue;const v=function(d){return d.map(f=>_(f)||X(f)?f:q(f)?v(f):f[a])};if(q(t)&&!ee.test(a)?t=v(t):t=t[a],_(t)||X(t))break}return _(t)?m:t}}function J(t,i,r){if(!Y(t)||!z(i))return;const m=j(i);if(m.length===0)return;const n=m.length;for(let a=0;a<n;a++){const v=m[a];if(a===n-1){t[v]=r;return}if(v==="*"&&q(t)){const d=m.slice(a+1).join(".");for(const f of t)J(f,d,r);return}_(t[v])&&(t[v]={}),t=t[v]}}function j(t){const i=t.split(/[.]|(?:\[(\d|\*)\])/).filter(r=>!!r);return i.some(r=>re.indexOf(r)!==-1)?[]:i}function te(t,i,r,m){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:n=>Object.values(b).includes(n),default:b.custom},is:{type:[Object,String],default:void 0},name:{type:[String,Number,Boolean,Symbol],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValue:{type:[String,Number,Boolean,Array,Object],default:void 0},lazyLoad:{type:Boolean,default:!1},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabel","is","type"],slots:Object,setup(n,{slots:a,emit:v}){const{props:d,name:f}=e.toRefs(n),O=e.useId(),c=e.inject(i,void 0);c&&c.fields.value.set(O,n.name);const o=e.inject(t),y=e.computed({get(){if(o!=null&&o.formData)return $(new Object(o.formData.value),String(n.name))},set(u){o!=null&&o.formData&&(J(new Object(o.formData.value),String(n.name),u),v("update:modelValue",{newValue:y.value,formData:o==null?void 0:o.formData}))}});e.onMounted(()=>{y.value===void 0&&n.defaultValue!==void 0&&(y.value=n.defaultValue)}),e.onBeforeUnmount(()=>{c&&c.fields.value.delete(O)});const w=e.computed(()=>{if(o!=null&&o.errors.value)return $(o.errors.value,String(n.name))}),p=e.computed(()=>{var u;return(u=w.value)==null?void 0:u._errors}),s=e.computed(()=>w.value!==void 0),g=e.watch(s,u=>{if(u){v("invalid",w.value),c&&c.errors.value.set(String(n.name),w.value);return}v("valid",y.value),c&&c.errors.value.delete(n.name)}),V=e.watch(()=>o==null?void 0:o.formData,()=>{v("update:formData",o==null?void 0:o.formData)},{deep:!0});e.onBeforeUnmount(()=>{g(),V()});const E=u=>{u instanceof InputEvent&&(u=u.target.value),y.value=u},k=e.computed(()=>{let u=d.value;return typeof u=="function"&&(u=u(o==null?void 0:o.formData)),Object.keys(u).reduce((S,U)=>(S[U]=e.unref(u[U]),S),{})}),G=e.computed(()=>o!=null&&o.readonly.value||c!=null&&c.readonly.value?!0:k.value.readonly??n.readonly),x=e.computed(()=>({...k.value,name:k.value.name??n.name,invalid:s.value,valid:n.showValid?!!(!s.value&&y.value):void 0,type:(u=>{if([b.color,b.date,b.datetimeLocal,b.email,b.month,b.number,b.password,b.search,b.tel,b.text,b.time,b.url,b.week].includes(u))return u})(n.type),invalidLabel:p.value,modelValue:y.value,readonly:G.value,"onUpdate:modelValue":E}));return e.provide(r,{name:e.readonly(f),errors:e.readonly(w)}),{component:e.computed(()=>{if(n.type===b.custom)return{render(){var u;return((u=a.default)==null?void 0:u.call(a,{errors:w.value,formData:o==null?void 0:o.formData.value,formErrors:o==null?void 0:o.errors.value,invalid:s.value,invalidLabel:p.value,modelValue:y.value,readonly:G.value,onUpdate:E,submit:o==null?void 0:o.submit,validate:o==null?void 0:o.validate}))??a.default}};if(!((m==null?void 0:m.lazyLoad)??n.lazyLoad)){let u;switch(n.type){case b.select:u=e.resolveComponent("VvSelect");break;case b.checkbox:u=e.resolveComponent("VvCheckbox");break;case b.radio:u=e.resolveComponent("VvRadio");break;case b.textarea:u=e.resolveComponent("VvTextarea");break;case b.radioGroup:u=e.resolveComponent("VvRadioGroup");break;case b.checkboxGroup:u=e.resolveComponent("VvCheckboxGroup");break;case b.combobox:u=e.resolveComponent("VvCombobox");break;default:u=e.resolveComponent("VvInputText")}if(typeof u!="string")return u;console.warn(`[@volverjs/form-vue]: ${u} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(m!=null&&m.sideEffects&&await Promise.resolve(m.sideEffects(n.type)),n.type){case b.textarea:return import("@volverjs/ui-vue/vv-textarea");case b.radio:return import("@volverjs/ui-vue/vv-radio");case b.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case b.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case b.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case b.select:return import("@volverjs/ui-vue/vv-select");case b.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:x,invalid:s}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===b.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function ne(t,i,r){return e.defineComponent({name:"VvFormFieldsGroup",props:{is:{type:[Object,String],default:void 0},names:{type:[Array,Object],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValues:{type:[Object],default:void 0},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabels","is"],slots:Object,setup(m,{slots:n,emit:a}){const{props:v,names:d,defaultValues:f}=e.toRefs(m),O=e.useId(),c=e.computed(()=>Array.isArray(d.value)?d.value:Object.values(d.value)),o=e.computed(()=>Array.isArray(d.value)?d.value:Object.keys(d.value)),y=e.computed(()=>Array.isArray(d.value)?d.value.reduce((l,h)=>(l[String(h)]=h,l),{}):d.value),w=e.computed(()=>Object.keys(y.value).reduce((l,h)=>(l[String(y.value[h])]=h,l),{})),p=e.inject(i,void 0);p&&c.value.forEach(l=>{p.fields.value.set(`${O}-${l}`,l)});const s=e.inject(t),g=e.computed({get(){return s!=null&&s.formData?o.value.reduce((l,h)=>(l[h]=$(new Object(s.formData.value),y.value[h]),l),{}):{}},set(l){s!=null&&s.formData&&(o.value.forEach(h=>{J(new Object(s.formData.value),y.value[h],l==null?void 0:l[h])}),a("update:modelValue",{newValue:g.value,formData:s==null?void 0:s.formData}))}});e.onMounted(()=>{f.value&&c.value.forEach(l=>{var h,R;((h=f.value)==null?void 0:h[l])!==void 0&&g.value[l]===void 0&&(g.value={...g.value,[l]:(R=f.value)==null?void 0:R[l]})})}),e.onBeforeUnmount(()=>{p&&c.value.forEach(l=>{p.fields.value.delete(`${O}-${l}`)})});const V=e.computed(()=>{if(!(s!=null&&s.errors.value))return;const l=c.value.reduce((h,R)=>{if(!s.errors.value)return h;const Z=$(s.errors.value,String(R));return Z===void 0||(h[String(R)]=Z),h},{});if(Object.keys(l).length!==0)return l}),E=e.computed(()=>{if(!V.value)return;const l=Object.keys(V.value).reduce((h,R)=>{var Z;return(Z=V.value)!=null&&Z[R]&&(h[w.value[R]]=V.value[R]._errors),h},{});if(Object.keys(l).length!==0)return l}),k=e.computed(()=>V.value!==void 0),G=e.computed(()=>o.value.reduce((l,h)=>{var R;return l[h]=!!((R=V.value)!=null&&R[w.value[h]]),l},{})),x=e.watch(k,()=>{if(k.value){a("invalid",V.value),p&&c.value.forEach(l=>{var h,R;if(!((h=V.value)!=null&&h[l])){p.errors.value.delete(l);return}p.errors.value.set(l,(R=V.value)==null?void 0:R[l])});return}a("valid",g.value),p&&c.value.forEach(l=>{p.errors.value.delete(l)})}),I=e.watch(()=>s==null?void 0:s.formData,()=>{a("update:formData",s==null?void 0:s.formData)},{deep:!0});e.onBeforeUnmount(()=>{x(),I()});const u=l=>{g.value=l},S=(l,h)=>{h instanceof InputEvent&&(h=h.target.value),o.value.includes(l)&&(g.value={...g.value,[l]:h})},U=e.computed(()=>{let l=v.value;return typeof l=="function"&&(l=l(s==null?void 0:s.formData)),Object.keys(l).reduce((h,R)=>(h[R]=e.unref(l[R]),h),{})}),M=e.computed(()=>s!=null&&s.readonly.value?!0:U.value.readonly??m.readonly),K=e.computed(()=>o.value.reduce((l,h)=>(l[`onUpdate:${h}`]=R=>{S(h,R)},l),{"onUpdate:modelValue":u})),T=e.computed(()=>({...K.value,...U.value,names:U.value.name??c.value,invalid:k.value,invalids:G.value,valid:m.showValid?!!(!k.value&&g.value):void 0,invalidLabels:E.value,modelValue:g.value,readonly:M.value}));return e.provide(r,{names:e.readonly(d),errors:e.readonly(V)}),{component:e.computed(()=>({render(){var l;return((l=n.default)==null?void 0:l.call(n,{errors:V.value,formData:s==null?void 0:s.formData.value,formErrors:s==null?void 0:s.errors.value,invalid:k.value,invalids:G.value,invalidLabels:E.value,modelValue:g.value,onUpdate:u,onUpdateField:S,readonly:M.value,submit:s==null?void 0:s.submit,validate:s==null?void 0:s.validate}))??n.default}})),hasProps:T,invalid:k}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function ae(t,i){return e.defineComponent({name:"VvFormWrapper",props:{name:{type:String,required:!0},tag:{type:String,default:void 0},readonly:{type:Boolean,default:!1}},emits:["invalid","valid"],expose:["clear","errors","fields","fieldsErrors","formData","invalid","readonly","reset","submit","tag","validate","validateWrapper"],slots:Object,setup(r,{emit:m}){const n=e.inject(t),a=e.inject(i,void 0),v=e.ref(new Map),d=e.ref(new Map),{name:f}=e.toRefs(r),O=e.computed(()=>n!=null&&n.invalid.value?d.value.size>0:!1);e.watch(O,p=>{if(p){m("invalid");return}m("valid")});const c=e.computed(()=>(n==null?void 0:n.readonly.value)||r.readonly),o={name:e.readonly(f),errors:d,invalid:e.readonly(O),readonly:e.readonly(c),fields:v};e.provide(i,o);const y=e.computed(()=>new Map(v.value));e.watch(y,(p,s)=>{a!=null&&a.fields&&(s.forEach((g,V)=>{p.has(V)||a==null||a.fields.value.delete(V)}),p.forEach((g,V)=>{a!=null&&a.fields.value.has(V)||a==null||a.fields.value.set(V,g)}))},{deep:!0}),e.watch(d,p=>{a!=null&&a.errors&&v.value.forEach(s=>{if(p.has(s)||a.errors.value.delete(s),p.has(s)){const g=p.get(s);g&&a.errors.value.set(s,g)}})},{deep:!0}),e.onMounted(()=>{if(!(n!=null&&n.wrappers)||!f.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(n.wrappers.has(f.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${f.value}" is already used`);return}n.wrappers.set(f.value,o)}),e.onBeforeUnmount(()=>{n!=null&&n.wrappers&&f.value&&n.wrappers.delete(f.value)});const w=()=>(n==null?void 0:n.validate(void 0,new Set(v.value.values())))??Promise.resolve(!0);return{errors:n==null?void 0:n.errors,fields:v,fieldsErrors:d,formData:n==null?void 0:n.formData,invalid:O,readonly:c,clear:n==null?void 0:n.clear,reset:n==null?void 0:n.reset,submit:n==null?void 0:n.submit,validate:n==null?void 0:n.validate,validateWrapper:w}},render(){const r=()=>{var m,n;return(n=(m=this.$slots).default)==null?void 0:n.call(m,{errors:this.errors,fieldsErrors:this.fieldsErrors,formData:this.formData,invalid:this.invalid,readonly:this.readonly,clear:this.clear,reset:this.reset,submit:this.submit,validate:this.validate,validateWrapper:this.validateWrapper})};return this.tag?e.h(this.tag,null,{default:r}):r()}})}function le(t,i){const r=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(m,{slots:n}){const a=e.inject(t);if(a!=null&&a.formData)return()=>{var O;const v=typeof m.schema=="function"?m.schema(a,m.scope):m.schema;let d;const f=v.reduce((c,o)=>{const y=typeof o=="function"?o(a,m.scope):o,{vvIs:w,vvName:p,vvSlots:s,vvChildren:g,vvIf:V,vvElseIf:E,vvType:k,vvDefaultValue:G,vvShowValid:x,vvContent:I,...u}=y;if(V!==void 0){if(typeof V=="string"?d=!!$(new Object(a.formData.value),V):typeof V=="function"?d=e.unref(V(a)):d=e.unref(V),!d)return c}else if(E!==void 0&&d!==void 0){if(d||(typeof E=="string"?d=!!$(new Object(a.formData.value),E):typeof E=="function"?d=e.unref(E(a)):d=e.unref(E),!d))return c}else d=void 0;let S;return g&&(typeof w=="string"?S=e.h(r,{schema:g}):S={default:U=>e.h(r,{schema:g,scope:U})}),p?(c.push(e.h(i,{name:p,is:w,type:k,defaultValue:G,showValid:x,props:u},s??S??I)),c):w?(c.push(e.h(w,u,s??S??I)),c):(S&&("default"in S?c.push(S.default(m.scope)):c.push(S)),c)},[]);return f.push((O=n==null?void 0:n.default)==null?void 0:O.call(n,{errors:a==null?void 0:a.errors.value,formData:a==null?void 0:a.formData.value,invalid:a==null?void 0:a.invalid.value,status:a==null?void 0:a.status.value,submit:a==null?void 0:a.submit,validate:a==null?void 0:a.validate,clear:a==null?void 0:a.clear,reset:a==null?void 0:a.reset})),f}}});return r}function N(t,i={}){const r=Symbol("formInjectionKey"),m=Symbol("formWrapperInjectionKey"),n=Symbol("formFieldInjectionKey"),a=Symbol("formFieldsGroupInjectionKey"),v=ae(r,m),d=te(r,m,n,i),f=ne(r,m,a),O=le(r,d),c=new Map,{clear:o,errors:y,formData:w,ignoreUpdates:p,invalid:s,readonly:g,reset:V,status:E,stopUpdatesWatch:k,submit:G,validate:x,VvForm:I}=D(t,r,i,O,c);return{clear:o,errors:y,formData:w,formFieldInjectionKey:n,formInjectionKey:r,formWrapperInjectionKey:m,ignoreUpdates:p,invalid:s,readonly:g,reset:V,status:E,stopUpdatesWatch:k,submit:G,validate:x,wrappers:c,VvForm:I,VvFormField:d,VvFormFieldsGroup:f,VvFormTemplate:O,VvFormWrapper:v}}const W=Symbol("pluginInjectionKey");function ue(t){let i={};return t.schema&&(i=N(t.schema,t)),{...i,install(r,{global:m=!1}={}){r.provide(W,t),m&&(r.config.globalProperties.$vvForm=t,i!=null&&i.VvForm&&r.component("VvForm",i.VvForm),i!=null&&i.VvFormWrapper&&r.component("VvFormWrapper",i.VvFormWrapper),i!=null&&i.VvFormField&&r.component("VvFormField",i.VvFormField),i!=null&&i.VvFormFieldsGroup&&r.component("VvFormFieldsGroup",i.VvFormFieldsGroup),i!=null&&i.VvFormTemplate&&r.component("VvFormTemplate",i.VvFormTemplate))}}}const P=new Map;function oe(t,i={}){if(i.scope&&P.has(i.scope))return P.get(i.scope);if(!e.getCurrentInstance()){const m=N(t,i);return i.scope&&P.set(i.scope,m),m}const r=N(t,{...e.inject(W,{}),...i});return i.scope&&P.set(i.scope,r),r}function se(t,i={}){return N(t,i)}C.FormFieldType=b,C.createForm=ue,C.defaultObjectBySchema=L,C.formType=se,C.pluginInjectionKey=W,C.useForm=oe,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
1
+ (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C["@volverjs/form-vue"]={},C.Vue,C.VueUseCore,C.zod))})(this,function(C,e,Q,A){"use strict";var b=(t=>(t.text="text",t.number="number",t.email="email",t.password="password",t.tel="tel",t.url="url",t.search="search",t.date="date",t.time="time",t.datetimeLocal="datetime-local",t.month="month",t.week="week",t.color="color",t.select="select",t.checkbox="checkbox",t.radio="radio",t.textarea="textarea",t.radioGroup="radioGroup",t.checkboxGroup="checkboxGroup",t.combobox="combobox",t.custom="custom",t))(b||{}),B=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(B||{});function L(t,i={}){const r=v=>{let c=v;for(;c instanceof A.ZodEffects;)c=c.innerType();return c instanceof A.ZodOptional&&(c=c._def.innerType),c},m=v=>{let c=v;for(;c instanceof A.ZodEffects;)c=c.innerType();return c instanceof A.ZodOptional},n=r(t);return{...(n instanceof A.ZodObject?n._def.unknownKeys==="passthrough":!1)?i:{},...Object.fromEntries(Object.entries(n.shape).map(([v,c])=>{const f=i[v],R=m(c);let d=r(c),s;if(d instanceof A.ZodDefault&&(s=d._def.defaultValue(),d=d._def.innerType),f===null&&d instanceof A.ZodNullable)return[v,f];if(f==null&&R)return[v,s];if(d instanceof A.ZodSchema){const h=c.safeParse(f);if(h.success)return[v,h.data??s]}if(d instanceof A.ZodArray&&Array.isArray(f)&&f.length){const h=r(d._def.type);if(h instanceof A.ZodObject)return[v,f.map(V=>L(h,V&&typeof V=="object"?V:void 0))]}if(d instanceof A.ZodRecord&&f){const h=r(d._def.valueType);if(h instanceof A.ZodObject)return[v,Object.keys(f).reduce((V,p)=>(V[p]=L(h,f[p]),V),{})]}return d instanceof A.ZodObject?[v,L(d,f&&typeof f=="object"?f:s)]:[v,s]}))}}function D(t,i,r,m,n){const a=e.ref(),v=e.ref(),c=e.computed(()=>v.value===B.invalid),f=e.ref(),R=e.ref(!1);let d;const s=I=>{const g=L(t,I);if(r!=null&&r.class){const u=r.class;return new u(g)}return g},h=async(I=f.value,g)=>{if(d=g==null?void 0:g.fields,R.value)return!0;const u=g!=null&&g.superRefine?await t.superRefine(g.superRefine).safeParseAsync(I):await t.safeParseAsync(I);if(!u.success){if(v.value=B.invalid,!(d!=null&&d.size))return a.value=u.error.format(),!1;const S=u.error.issues.filter(U=>d==null?void 0:d.has(U.path.join(".")));return S.length?(a.value=new A.ZodError(S).format(),!1):(a.value=void 0,!0)}return a.value=void 0,v.value=B.valid,f.value=s(u.data),!0},V=()=>{a.value=void 0,v.value=void 0,d=void 0},p=()=>{f.value=s(),V(),v.value=B.reset},o=async I=>R.value||!await h(void 0,I)?!1:(v.value=B.submitting,!0),{ignoreUpdates:O,stop:w}=Q.watchIgnorable(f,()=>{v.value=B.updated},{deep:!0,eventFilter:Q.throttleFilter((r==null?void 0:r.updateThrottle)??500)}),E=e.readonly(a),k=e.readonly(v),G=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:(r==null?void 0:r.readonly)??!1},tag:{type:String,default:"form"},template:{type:[Array,Function],default:void 0},superRefine:{type:Function,default:void 0},validateFields:{type:Array,default:void 0}},emits:["invalid","submit","update:modelValue","update:readonly","valid","reset"],expose:["errors","invalid","readonly","status","submit","tag","template","valid","validate","clear","reset"],slots:Object,setup(I,{emit:g}){return f.value=s(e.toRaw(I.modelValue)),e.watch(()=>I.modelValue,u=>{if(u){const S=e.isProxy(u)?e.toRaw(u):u;if(JSON.stringify(S)===JSON.stringify(e.toRaw(f.value)))return;f.value=typeof(S==null?void 0:S.clone)=="function"?S.clone():JSON.parse(JSON.stringify(S))}},{deep:!0}),e.watch(v,async u=>{var S,U,M,K,T,H;if(u===B.invalid){const l=e.toRaw(a.value);g("invalid",l),(S=r==null?void 0:r.onInvalid)==null||S.call(r,l);return}if(u===B.valid){const l=e.toRaw(f.value);g("valid",l),(U=r==null?void 0:r.onValid)==null||U.call(r,l),g("update:modelValue",l),(M=r==null?void 0:r.onUpdate)==null||M.call(r,l);return}if(u===B.submitting){const l=e.toRaw(f.value);g("submit",l),(K=r==null?void 0:r.onSubmit)==null||K.call(r,l);return}if(u===B.reset){const l=e.toRaw(f.value);g("reset",l),(T=r==null?void 0:r.onReset)==null||T.call(r,l);return}if(u===B.updated){if((a.value||r!=null&&r.continuousValidation||I.continuousValidation)&&await h(void 0,{superRefine:I.superRefine,fields:d??new Set(I.validateFields)}),!f.value||!I.modelValue||JSON.stringify(f.value)!==JSON.stringify(I.modelValue)){const l=e.toRaw(f.value);g("update:modelValue",l),(H=r==null?void 0:r.onUpdate)==null||H.call(r,l)}v.value===B.updated&&(v.value=B.unknown)}}),e.onMounted(()=>{R.value=I.readonly}),e.watch(()=>I.readonly,u=>{R.value=u}),e.watch(R,u=>{u!==I.readonly&&g("update:readonly",R.value)}),e.provide(i,{clear:V,errors:E,formData:f,ignoreUpdates:O,invalid:c,readonly:R,reset:p,status:k,stopUpdatesWatch:w,submit:o,validate:h,wrappers:n}),{clear:V,errors:E,formData:f,ignoreUpdates:O,invalid:c,isReadonly:R,reset:p,status:k,stopUpdatesWatch:w,submit:()=>o({superRefine:I.superRefine,fields:new Set(I.validateFields)}),validate:h,wrappers:n}},render(){const I=()=>{var g,u;return((u=(g=this.$slots)==null?void 0:g.default)==null?void 0:u.call(g,{errors:E.value,formData:f.value,invalid:c.value,readonly:R.value,status:k.value,wrappers:n,clear:V,ignoreUpdates:O,reset:p,stopUpdatesWatch:w,submit:o,validate:h}))??this.$slots.default};return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??(r==null?void 0:r.template))&&m?[e.h(m,{schema:this.template??(r==null?void 0:r.template)},{default:I})]:{default:I})}});return{clear:V,errors:a,formData:f,ignoreUpdates:O,invalid:c,readonly:R,reset:p,status:v,wrappers:n,stopUpdatesWatch:w,submit:o,validate:h,VvForm:G}}function q(t){return Array.isArray(t)}function F(t){return!1}function X(t){return t===null}function Y(t){return typeof t=="object"}function z(t){return typeof t=="string"}function Z(t){return typeof t>"u"}const ee=/^[0-9]+$/,re=["__proto__","prototype","constructor"];function $(t,i,r){const m=F()?r:void 0;if(!Y(t)||!z(i))return m;const n=j(i);if(n.length!==0){for(const a of n){if(a==="*")continue;const v=function(c){return c.map(f=>Z(f)||X(f)?f:q(f)?v(f):f[a])};if(q(t)&&!ee.test(a)?t=v(t):t=t[a],Z(t)||X(t))break}return Z(t)?m:t}}function J(t,i,r){if(!Y(t)||!z(i))return;const m=j(i);if(m.length===0)return;const n=m.length;for(let a=0;a<n;a++){const v=m[a];if(a===n-1){t[v]=r;return}if(v==="*"&&q(t)){const c=m.slice(a+1).join(".");for(const f of t)J(f,c,r);return}Z(t[v])&&(t[v]={}),t=t[v]}}function j(t){const i=t.split(/[.]|(?:\[(\d|\*)\])/).filter(r=>!!r);return i.some(r=>re.indexOf(r)!==-1)?[]:i}function te(t,i,r,m){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:n=>Object.values(b).includes(n),default:b.custom},is:{type:[Object,String],default:void 0},name:{type:[String,Number,Boolean,Symbol],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValue:{type:[String,Number,Boolean,Array,Object],default:void 0},lazyLoad:{type:Boolean,default:!1},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabel","is","type"],slots:Object,setup(n,{slots:a,emit:v}){const{props:c,name:f}=e.toRefs(n),R=e.useId(),d=e.inject(i,void 0);d&&d.fields.value.set(R,n.name);const s=e.inject(t),h=e.computed({get(){if(s!=null&&s.formData)return $(new Object(s.formData.value),String(n.name))},set(u){s!=null&&s.formData&&(J(new Object(s.formData.value),String(n.name),u),v("update:modelValue",{newValue:h.value,formData:s==null?void 0:s.formData}))}});e.onMounted(()=>{h.value===void 0&&n.defaultValue!==void 0&&(h.value=n.defaultValue)}),e.onBeforeUnmount(()=>{d&&d.fields.value.delete(R)});const V=e.computed(()=>{if(s!=null&&s.errors.value)return $(s.errors.value,String(n.name))}),p=e.computed(()=>{var u;return(u=V.value)==null?void 0:u._errors}),o=e.computed(()=>V.value!==void 0),O=e.watch(o,u=>{if(u){v("invalid",V.value),d&&d.errors.value.set(String(n.name),V.value);return}v("valid",h.value),d&&d.errors.value.delete(n.name)}),w=e.watch(()=>s==null?void 0:s.formData,()=>{v("update:formData",s==null?void 0:s.formData)},{deep:!0});e.onBeforeUnmount(()=>{O(),w()});const E=u=>{u instanceof InputEvent&&(u=u.target.value),h.value=u},k=e.computed(()=>{let u=c.value;return typeof u=="function"&&(u=u(s==null?void 0:s.formData)),Object.keys(u).reduce((S,U)=>(S[U]=e.unref(u[U]),S),{})}),G=e.computed(()=>s!=null&&s.readonly.value||d!=null&&d.readonly.value?!0:k.value.readonly??n.readonly),I=e.computed(()=>({...k.value,name:k.value.name??n.name,invalid:o.value,valid:n.showValid?!!(!o.value&&h.value):void 0,type:(u=>{if([b.color,b.date,b.datetimeLocal,b.email,b.month,b.number,b.password,b.search,b.tel,b.text,b.time,b.url,b.week].includes(u))return u})(n.type),invalidLabel:p.value,modelValue:h.value,readonly:G.value,"onUpdate:modelValue":E}));return e.provide(r,{name:e.readonly(f),errors:e.readonly(V)}),{component:e.computed(()=>{if(n.type===b.custom)return{render(){var u;return((u=a.default)==null?void 0:u.call(a,{errors:V.value,formData:s==null?void 0:s.formData.value,formErrors:s==null?void 0:s.errors.value,invalid:o.value,invalidLabel:p.value,modelValue:h.value,readonly:G.value,onUpdate:E,submit:s==null?void 0:s.submit,validate:s==null?void 0:s.validate}))??a.default}};if(!((m==null?void 0:m.lazyLoad)??n.lazyLoad)){let u;switch(n.type){case b.select:u=e.resolveComponent("VvSelect");break;case b.checkbox:u=e.resolveComponent("VvCheckbox");break;case b.radio:u=e.resolveComponent("VvRadio");break;case b.textarea:u=e.resolveComponent("VvTextarea");break;case b.radioGroup:u=e.resolveComponent("VvRadioGroup");break;case b.checkboxGroup:u=e.resolveComponent("VvCheckboxGroup");break;case b.combobox:u=e.resolveComponent("VvCombobox");break;default:u=e.resolveComponent("VvInputText")}if(typeof u!="string")return u;console.warn(`[@volverjs/form-vue]: ${u} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(m!=null&&m.sideEffects&&await Promise.resolve(m.sideEffects(n.type)),n.type){case b.textarea:return import("@volverjs/ui-vue/vv-textarea");case b.radio:return import("@volverjs/ui-vue/vv-radio");case b.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case b.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case b.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case b.select:return import("@volverjs/ui-vue/vv-select");case b.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:I,invalid:o}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===b.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function ne(t,i,r){return e.defineComponent({name:"VvFormFieldsGroup",props:{is:{type:[Object,String],default:void 0},names:{type:[Array,Object],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValues:{type:[Object],default:void 0},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabels","is"],slots:Object,setup(m,{slots:n,emit:a}){const{props:v,names:c,defaultValues:f}=e.toRefs(m),R=e.useId(),d=e.computed(()=>Array.isArray(c.value)?c.value:Object.values(c.value)),s=e.computed(()=>Array.isArray(c.value)?c.value:Object.keys(c.value)),h=e.computed(()=>Array.isArray(c.value)?c.value.reduce((l,y)=>(l[String(y)]=y,l),{}):c.value),V=e.computed(()=>Object.keys(h.value).reduce((l,y)=>(l[String(h.value[y])]=y,l),{})),p=e.inject(i,void 0);p&&d.value.forEach(l=>{p.fields.value.set(`${R}-${l}`,l)});const o=e.inject(t),O=e.computed({get(){return o!=null&&o.formData?s.value.reduce((l,y)=>(l[y]=$(new Object(o.formData.value),h.value[y]),l),{}):{}},set(l){o!=null&&o.formData&&(s.value.forEach(y=>{J(new Object(o.formData.value),h.value[y],l==null?void 0:l[y])}),a("update:modelValue",{newValue:O.value,formData:o==null?void 0:o.formData}))}});e.onMounted(()=>{f.value&&d.value.forEach(l=>{var y,x;((y=f.value)==null?void 0:y[l])!==void 0&&O.value[l]===void 0&&(O.value={...O.value,[l]:(x=f.value)==null?void 0:x[l]})})}),e.onBeforeUnmount(()=>{p&&d.value.forEach(l=>{p.fields.value.delete(`${R}-${l}`)})});const w=e.computed(()=>{if(!(o!=null&&o.errors.value))return;const l=d.value.reduce((y,x)=>{if(!o.errors.value)return y;const P=$(o.errors.value,String(x));return P===void 0||(y[String(x)]=P),y},{});if(Object.keys(l).length!==0)return l}),E=e.computed(()=>{if(!w.value)return;const l=Object.keys(w.value).reduce((y,x)=>{var P;return(P=w.value)!=null&&P[x]&&(y[V.value[x]]=w.value[x]._errors),y},{});if(Object.keys(l).length!==0)return l}),k=e.computed(()=>w.value!==void 0),G=e.computed(()=>s.value.reduce((l,y)=>{var x;return l[y]=!!((x=w.value)!=null&&x[V.value[y]]),l},{})),I=e.watch(k,()=>{if(k.value){a("invalid",w.value),p&&d.value.forEach(l=>{var y,x;if(!((y=w.value)!=null&&y[l])){p.errors.value.delete(l);return}p.errors.value.set(l,(x=w.value)==null?void 0:x[l])});return}a("valid",O.value),p&&d.value.forEach(l=>{p.errors.value.delete(l)})}),g=e.watch(()=>o==null?void 0:o.formData,()=>{a("update:formData",o==null?void 0:o.formData)},{deep:!0});e.onBeforeUnmount(()=>{I(),g()});const u=l=>{O.value=l},S=(l,y)=>{y instanceof InputEvent&&(y=y.target.value),s.value.includes(l)&&(O.value={...O.value,[l]:y})},U=e.computed(()=>{let l=v.value;return typeof l=="function"&&(l=l(o==null?void 0:o.formData)),Object.keys(l).reduce((y,x)=>(y[x]=e.unref(l[x]),y),{})}),M=e.computed(()=>o!=null&&o.readonly.value?!0:U.value.readonly??m.readonly),K=e.computed(()=>s.value.reduce((l,y)=>(l[`onUpdate:${y}`]=x=>{S(y,x)},l),{"onUpdate:modelValue":u})),T=e.computed(()=>({...K.value,...U.value,names:U.value.name??d.value,invalid:k.value,invalids:G.value,valid:m.showValid?!!(!k.value&&O.value):void 0,invalidLabels:E.value,modelValue:O.value,readonly:M.value}));return e.provide(r,{names:e.readonly(c),errors:e.readonly(w)}),{component:e.computed(()=>({render(){var l;return((l=n.default)==null?void 0:l.call(n,{errors:w.value,formData:o==null?void 0:o.formData.value,formErrors:o==null?void 0:o.errors.value,invalid:k.value,invalids:G.value,invalidLabels:E.value,modelValue:O.value,onUpdate:u,onUpdateField:S,readonly:M.value,submit:o==null?void 0:o.submit,validate:o==null?void 0:o.validate}))??n.default}})),hasProps:T,invalid:k}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function ae(t,i){return e.defineComponent({name:"VvFormWrapper",props:{name:{type:String,required:!0},tag:{type:String,default:void 0},readonly:{type:Boolean,default:!1}},emits:["invalid","valid"],expose:["clear","errors","fields","fieldsErrors","formData","invalid","readonly","reset","submit","tag","validate","validateWrapper"],slots:Object,setup(r,{emit:m}){const n=e.inject(t),a=e.inject(i,void 0),v=e.ref(new Map),c=e.ref(new Map),{name:f}=e.toRefs(r),R=e.computed(()=>n!=null&&n.invalid.value?c.value.size>0:!1);e.watch(R,p=>{if(p){m("invalid");return}m("valid")});const d=e.computed(()=>(n==null?void 0:n.readonly.value)||r.readonly),s={name:e.readonly(f),errors:c,invalid:e.readonly(R),readonly:e.readonly(d),fields:v};e.provide(i,s);const h=e.computed(()=>new Map(v.value));e.watch(h,(p,o)=>{a!=null&&a.fields&&(o.forEach((O,w)=>{p.has(w)||a==null||a.fields.value.delete(w)}),p.forEach((O,w)=>{a!=null&&a.fields.value.has(w)||a==null||a.fields.value.set(w,O)}))},{deep:!0}),e.watch(c,p=>{a!=null&&a.errors&&v.value.forEach(o=>{if(p.has(o)||a.errors.value.delete(o),p.has(o)){const O=p.get(o);O&&a.errors.value.set(o,O)}})},{deep:!0}),e.onMounted(()=>{if(!(n!=null&&n.wrappers)||!f.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(n.wrappers.has(f.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${f.value}" is already used`);return}n.wrappers.set(f.value,s)}),e.onBeforeUnmount(()=>{n!=null&&n.wrappers&&f.value&&n.wrappers.delete(f.value)});const V=()=>(n==null?void 0:n.validate(void 0,{fields:new Set(v.value.values())}))??Promise.resolve(!0);return{errors:n==null?void 0:n.errors,fields:v,fieldsErrors:c,formData:n==null?void 0:n.formData,invalid:R,readonly:d,clear:n==null?void 0:n.clear,reset:n==null?void 0:n.reset,submit:n==null?void 0:n.submit,validate:n==null?void 0:n.validate,validateWrapper:V}},render(){const r=()=>{var m,n;return(n=(m=this.$slots).default)==null?void 0:n.call(m,{errors:this.errors,fieldsErrors:this.fieldsErrors,formData:this.formData,invalid:this.invalid,readonly:this.readonly,clear:this.clear,reset:this.reset,submit:this.submit,validate:this.validate,validateWrapper:this.validateWrapper})};return this.tag?e.h(this.tag,null,{default:r}):r()}})}function le(t,i){const r=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(m,{slots:n}){const a=e.inject(t);if(a!=null&&a.formData)return()=>{var R;const v=typeof m.schema=="function"?m.schema(a,m.scope):m.schema;let c;const f=v.reduce((d,s)=>{const h=typeof s=="function"?s(a,m.scope):s,{vvIs:V,vvName:p,vvSlots:o,vvChildren:O,vvIf:w,vvElseIf:E,vvType:k,vvDefaultValue:G,vvShowValid:I,vvContent:g,...u}=h;if(w!==void 0){if(typeof w=="string"?c=!!$(new Object(a.formData.value),w):typeof w=="function"?c=e.unref(w(a)):c=e.unref(w),!c)return d}else if(E!==void 0&&c!==void 0){if(c||(typeof E=="string"?c=!!$(new Object(a.formData.value),E):typeof E=="function"?c=e.unref(E(a)):c=e.unref(E),!c))return d}else c=void 0;let S;return O&&(typeof V=="string"?S=e.h(r,{schema:O}):S={default:U=>e.h(r,{schema:O,scope:U})}),p?(d.push(e.h(i,{name:p,is:V,type:k,defaultValue:G,showValid:I,props:u},o??S??g)),d):V?(d.push(e.h(V,u,o??S??g)),d):(S&&("default"in S?d.push(S.default(m.scope)):d.push(S)),d)},[]);return f.push((R=n==null?void 0:n.default)==null?void 0:R.call(n,{errors:a==null?void 0:a.errors.value,formData:a==null?void 0:a.formData.value,invalid:a==null?void 0:a.invalid.value,status:a==null?void 0:a.status.value,submit:a==null?void 0:a.submit,validate:a==null?void 0:a.validate,clear:a==null?void 0:a.clear,reset:a==null?void 0:a.reset})),f}}});return r}function _(t,i={}){const r=Symbol("formInjectionKey"),m=Symbol("formWrapperInjectionKey"),n=Symbol("formFieldInjectionKey"),a=Symbol("formFieldsGroupInjectionKey"),v=ae(r,m),c=te(r,m,n,i),f=ne(r,m,a),R=le(r,c),d=new Map,{clear:s,errors:h,formData:V,ignoreUpdates:p,invalid:o,readonly:O,reset:w,status:E,stopUpdatesWatch:k,submit:G,validate:I,VvForm:g}=D(t,r,i,R,d);return{clear:s,errors:h,formData:V,formFieldInjectionKey:n,formInjectionKey:r,formWrapperInjectionKey:m,ignoreUpdates:p,invalid:o,readonly:O,reset:w,status:E,stopUpdatesWatch:k,submit:G,validate:I,wrappers:d,VvForm:g,VvFormField:c,VvFormFieldsGroup:f,VvFormTemplate:R,VvFormWrapper:v}}const W=Symbol("pluginInjectionKey");function ue(t){let i={};return t.schema&&(i=_(t.schema,t)),{...i,install(r,{global:m=!1}={}){r.provide(W,t),m&&(r.config.globalProperties.$vvForm=t,i!=null&&i.VvForm&&r.component("VvForm",i.VvForm),i!=null&&i.VvFormWrapper&&r.component("VvFormWrapper",i.VvFormWrapper),i!=null&&i.VvFormField&&r.component("VvFormField",i.VvFormField),i!=null&&i.VvFormFieldsGroup&&r.component("VvFormFieldsGroup",i.VvFormFieldsGroup),i!=null&&i.VvFormTemplate&&r.component("VvFormTemplate",i.VvFormTemplate))}}}const N=new Map;function se(t,i={}){if(i.scope&&N.has(i.scope))return N.get(i.scope);if(!e.getCurrentInstance()){const m=_(t,i);return i.scope&&N.set(i.scope,m),m}const r=_(t,{...e.inject(W,{}),...i});return i.scope&&N.set(i.scope,r),r}function oe(t,i={}){return _(t,i)}C.FormFieldType=b,C.createForm=ue,C.defaultObjectBySchema=L,C.formType=oe,C.pluginInjectionKey=W,C.useForm=se,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Component, DeepReadonly, Ref, RendererElement, RendererNode, VNode, WatchStopHandle } from 'vue';
2
- import { z, AnyZodObject, ZodEffects, ZodOptional, ZodTypeAny } from 'zod';
2
+ import { z, AnyZodObject, ZodEffects, ZodOptional, ZodTypeAny, RefinementCtx } from 'zod';
3
3
  import { IgnoredUpdater } from '@vueuse/core';
4
4
  import { FormFieldType, FormStatus } from './enums';
5
5
  type Depth = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
@@ -34,7 +34,10 @@ export type InjectedFormData<Schema extends FormSchema, Type> = {
34
34
  formData: Ref<(undefined extends Type ? Partial<z.infer<Schema>> : Type) | undefined>;
35
35
  errors: Readonly<Ref<DeepReadonly<z.inferFormattedError<Schema>> | undefined>>;
36
36
  submit: () => Promise<boolean>;
37
- validate: (formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type, fields?: Set<string>) => Promise<boolean>;
37
+ validate: (formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type, options?: {
38
+ fields?: Set<Path<z.infer<Schema>>>;
39
+ superRefine?: (arg: z.infer<Schema>, ctx: RefinementCtx) => void | Promise<void>;
40
+ }) => Promise<boolean>;
38
41
  clear: () => void;
39
42
  reset: () => void;
40
43
  ignoreUpdates: IgnoredUpdater;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@volverjs/form-vue",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.36",
4
+ "version": "1.0.0-beta.37",
5
5
  "description": "Vue 3 Forms with @volverjs/ui-vue",
6
6
  "author": "8 Wave S.r.l.",
7
7
  "license": "MIT",
@@ -67,16 +67,16 @@
67
67
  "@vue/compiler-sfc": "^3.5.13",
68
68
  "@vue/runtime-core": "^3.5.13",
69
69
  "@vue/test-utils": "^2.4.6",
70
- "@vueuse/core": "^13.0.0",
70
+ "@vueuse/core": "^13.1.0",
71
71
  "copy": "^0.3.2",
72
- "eslint": "^9.23.0",
72
+ "eslint": "^9.24.0",
73
73
  "happy-dom": "^17.4.4",
74
74
  "ts-dot-prop": "^2.1.4",
75
- "typescript": "^5.8.2",
76
- "vite": "^6.2.3",
75
+ "typescript": "^5.8.3",
76
+ "vite": "^6.2.5",
77
77
  "vite-plugin-dts": "^4.5.3",
78
78
  "vite-plugin-externalize-deps": "^0.9.0",
79
- "vitest": "^3.0.9",
79
+ "vitest": "^3.1.1",
80
80
  "vue": "^3.5.13",
81
81
  "zod": "^3.24.2"
82
82
  },
package/src/VvForm.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import type { Component, InjectionKey, PropType, SlotsType, UnwrapRef } from 'vue'
2
- import type { z } from 'zod'
2
+ import type { RefinementCtx, z } from 'zod'
3
3
  import type {
4
4
  FormComponentOptions,
5
5
  FormSchema,
6
6
  FormTemplate,
7
7
  InjectedFormData,
8
8
  InjectedFormWrapperData,
9
+ Path,
9
10
  } from './types'
10
11
  import {
11
12
  computed,
@@ -34,7 +35,7 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
34
35
  const invalid = computed(() => status.value === FormStatus.invalid)
35
36
  const formData = ref<undefined extends Type ? Partial<z.infer<Schema>> : Type>()
36
37
  const readonly = ref<boolean>(false)
37
- let validationFields: Set<string> | undefined
38
+ let validateFields: Set<Path<z.infer<Schema>>> | undefined
38
39
 
39
40
  const formDataAdapter = (data?: z.infer<Schema>): undefined extends Type ? Partial<z.infer<Schema>> : Type => {
40
41
  const toReturn = defaultObjectBySchema(schema, data)
@@ -47,19 +48,26 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
47
48
  return toReturn
48
49
  }
49
50
 
50
- const validate = async (value = formData.value, fields?: Set<string>) => {
51
- validationFields = fields
51
+ const validate = async (value = formData.value, options?: {
52
+ fields?: Set<Path<z.infer<Schema>>>
53
+ superRefine?: (arg: z.infer<Schema>, ctx: RefinementCtx) => void | Promise<void>
54
+ }) => {
55
+ validateFields = options?.fields
52
56
  if (readonly.value) {
53
57
  return true
54
58
  }
55
- const parseResult = await schema.safeParseAsync(value)
59
+ const parseResult = options?.superRefine
60
+ ? await schema.superRefine(options.superRefine).safeParseAsync(value)
61
+ : await schema.safeParseAsync(value)
56
62
  if (!parseResult.success) {
57
63
  status.value = FormStatus.invalid
58
- if (!fields) {
64
+ if (!validateFields?.size) {
59
65
  errors.value = parseResult.error.format() as z.inferFormattedError<Schema>
60
66
  return false
61
67
  }
62
- const fieldsIssues = parseResult.error.issues.filter(item => fields.has(item.path.join('.')))
68
+ const fieldsIssues = parseResult.error.issues.filter(item =>
69
+ validateFields?.has(item.path.join('.') as Path<z.infer<Schema>>),
70
+ )
63
71
  if (!fieldsIssues.length) {
64
72
  errors.value = undefined
65
73
  return true
@@ -76,7 +84,7 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
76
84
  const clear = () => {
77
85
  errors.value = undefined
78
86
  status.value = undefined
79
- validationFields = undefined
87
+ validateFields = undefined
80
88
  }
81
89
 
82
90
  const reset = () => {
@@ -85,11 +93,14 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
85
93
  status.value = FormStatus.reset
86
94
  }
87
95
 
88
- const submit = async () => {
96
+ const submit = async (options?: {
97
+ fields?: Set<Path<z.infer<Schema>>>
98
+ superRefine?: (arg: z.infer<Schema>, ctx: RefinementCtx) => void | Promise<void>
99
+ }) => {
89
100
  if (readonly.value) {
90
101
  return false
91
102
  }
92
- if (!(await validate())) {
103
+ if (!(await validate(undefined, options))) {
93
104
  return false
94
105
  }
95
106
  status.value = FormStatus.submitting
@@ -133,6 +144,14 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
133
144
  type: [Array, Function] as PropType<FormTemplate<Schema, Type>>,
134
145
  default: undefined,
135
146
  },
147
+ superRefine: {
148
+ type: Function as PropType<(arg: z.infer<Schema>, ctx: RefinementCtx) => void | Promise<void>>,
149
+ default: undefined,
150
+ },
151
+ validateFields: {
152
+ type: Array as PropType<Path<z.infer<Schema>>[]>,
153
+ default: undefined,
154
+ },
136
155
  },
137
156
  emits: [
138
157
  'invalid',
@@ -232,13 +251,15 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
232
251
  || options?.continuousValidation
233
252
  || props.continuousValidation
234
253
  ) {
235
- await validate(undefined, validationFields)
254
+ await validate(undefined, {
255
+ superRefine: props.superRefine,
256
+ fields: validateFields ?? new Set(props.validateFields),
257
+ })
236
258
  }
237
259
  if (
238
260
  !formData.value
239
261
  || !props.modelValue
240
- || JSON.stringify(formData.value)
241
- !== JSON.stringify(props.modelValue)
262
+ || JSON.stringify(formData.value) !== JSON.stringify(props.modelValue)
242
263
  ) {
243
264
  const toReturn = toRaw(formData.value)
244
265
  emit('update:modelValue', toReturn)
@@ -291,7 +312,10 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
291
312
  reset,
292
313
  status: readonlyStatus,
293
314
  stopUpdatesWatch,
294
- submit,
315
+ submit: () => submit({
316
+ superRefine: props.superRefine,
317
+ fields: new Set(props.validateFields),
318
+ }),
295
319
  validate,
296
320
  wrappers,
297
321
  }
@@ -4,6 +4,7 @@ import type {
4
4
  FormSchema,
5
5
  InjectedFormData,
6
6
  InjectedFormWrapperData,
7
+ Path,
7
8
  } from './types'
8
9
  import {
9
10
  computed,
@@ -71,7 +72,7 @@ export function defineFormWrapper<Schema extends FormSchema, Type = undefined>(f
71
72
  const injectedFormData = inject(formProvideKey)
72
73
  // inject data from parent form wrapper
73
74
  const injectedWrapperData = inject(wrapperProvideKey, undefined)
74
- const fields: Ref<Map<string, string>> = ref(new Map())
75
+ const fields: Ref<Map<string, Path<z.infer<Schema>>>> = ref(new Map())
75
76
  const fieldsErrors: Ref<
76
77
  Map<string, z.inferFormattedError<Schema>>
77
78
  > = ref(new Map())
@@ -165,7 +166,7 @@ export function defineFormWrapper<Schema extends FormSchema, Type = undefined>(f
165
166
  })
166
167
 
167
168
  const validateWrapper = () => {
168
- return injectedFormData?.validate(undefined, new Set(fields.value.values())) ?? Promise.resolve(true)
169
+ return injectedFormData?.validate(undefined, { fields: new Set(fields.value.values()) }) ?? Promise.resolve(true)
169
170
  }
170
171
 
171
172
  return {
package/src/types.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Component, DeepReadonly, Ref, RendererElement, RendererNode, VNode, WatchStopHandle } from 'vue'
2
- import type { z, AnyZodObject, ZodEffects, ZodOptional, ZodTypeAny } from 'zod'
2
+ import type { z, AnyZodObject, ZodEffects, ZodOptional, ZodTypeAny, RefinementCtx } from 'zod'
3
3
  import type { IgnoredUpdater } from '@vueuse/core'
4
4
  import type { FormFieldType, FormStatus } from './enums'
5
5
 
@@ -59,7 +59,7 @@ export type InjectedFormData<Schema extends FormSchema, Type> = {
59
59
  Ref<DeepReadonly<z.inferFormattedError<Schema>> | undefined>
60
60
  >
61
61
  submit: () => Promise<boolean>
62
- validate: (formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type, fields?: Set<string>) => Promise<boolean>
62
+ validate: (formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type, options?: { fields?: Set<Path<z.infer<Schema>>>, superRefine?: (arg: z.infer<Schema>, ctx: RefinementCtx) => void | Promise<void> }) => Promise<boolean>
63
63
  clear: () => void
64
64
  reset: () => void
65
65
  ignoreUpdates: IgnoredUpdater