@volverjs/form-vue 1.1.0-beta.5 → 1.1.0

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(S,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod/v3"),require("zod/v4/core"),require("ts-dot-prop")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod/v3","zod/v4/core","ts-dot-prop"],e):(S=typeof globalThis<"u"?globalThis:S||self,e(S["@volverjs/form-vue"]={},S.Vue,S.VueUseCore,S.zodV3,S.zodV4Core,S.tsDotProp))})(this,function(S,e,L,X,A,Z){"use strict";var j=(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))(j||{}),z=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(z||{});const B=t=>t._def.typeName==="ZodObject",N=t=>t._zod.def.type==="object",Y=t=>t._def.typeName==="ZodDefault",ee=t=>t._zod.def.type==="default",te=t=>t._def.typeName==="ZodNullable",re=t=>t._zod.def.type==="nullable",ae=t=>t._def.typeName==="ZodRecord",ne=t=>t._zod.def.type==="record",oe=t=>t._def.typeName==="ZodArray",le=t=>t._zod.def.type==="array",M=t=>t._def.typeName==="ZodEffects",K=t=>t._def.typeName==="ZodOptional",P=t=>t._zod.def.type==="optional",q=t=>t._zod.def.type==="pipe",J=t=>t._zod.def.type==="transform",G=t=>{let r=t;for(;M(r);)r=r.innerType();return K(r)&&(r=r._def.innerType),r},U=t=>{let r=t;for(;q(r);)J(r._zod.def.out)?r=r._zod.def.in:r=r._zod.def.out;return P(r)&&(r=r._zod.def.innerType),r},ie=t=>{let r=t;for(;M(r);)r=r.innerType();return!!K(r)},se=t=>{let r=t;for(;q(r);)J(r._zod.def.out)?r=r._zod.def.in:r=r._zod.def.out;return!!P(r)},k=t=>"_zod"in t;function x(t,r={}){if(k(t)){const n=U(t);return N(n)?{...!(!n._zod.def.catchall||n._zod.def.catchall?._zod.def.type==="never")?r:{},...Object.fromEntries(("shape"in n._zod.def?Object.entries(n._zod.def.shape):[]).map(([i,c])=>{const a=r[i],v=se(c);let l=U(c),f;if(ee(l)&&(f=l._zod.def.defaultValue,l=l._zod.def.innerType),a===null&&re(l))return[i,a];if(a==null&&v)return[i,f];if(l){const m=A.safeParse(c,a);if(m.success)return[i,m.data??f]}if(le(l)&&Array.isArray(a)&&a.length){const m=U(l._zod.def.element);if(N(m))return[i,a.map(D=>x(m,D&&typeof D=="object"?D:void 0))]}if(ne(l)&&a){const m=U(l._zod.def.valueType);if(N(m))return[i,Object.keys(a).reduce((D,y)=>(D[y]=x(m,a[y]),D),{})]}return N(l)?[i,x(l,a&&typeof a=="object"?a:f)]:[i,f]}))}:r}const s=G(t);return B(s)?{...s._def.unknownKeys==="passthrough"?r:{},...Object.fromEntries(("shape"in s?Object.entries(s.shape):[]).map(([n,d])=>{const i=r[n],c=ie(d);let a=G(d),v;if(Y(a)&&(v=a._def.defaultValue(),a=a._def.innerType),i===null&&te(a))return[n,i];if(i==null&&c)return[n,v];if(a){const l=d.safeParse(i);if(l.success)return[n,l.data??v]}if(oe(a)&&Array.isArray(i)&&i.length){const l=G(a._def.type);if(B(l))return[n,i.map(f=>x(l,f&&typeof f=="object"?f:void 0))]}if(ae(a)&&i){const l=G(a._def.valueType);if(B(l))return[n,Object.keys(i).reduce((f,m)=>(f[m]=x(l,i[m]),f),{})]}return B(a)?[n,x(a,i&&typeof i=="object"?i:v)]:[n,v]}))}:r}const ue=(t,r)=>k(t)?A.safeParseAsync(t,r):t.safeParseAsync(r),de=(t,r)=>k(t)?A.formatError(r):r.format(),fe=(t,r)=>k(t)?A.formatError(new A.$ZodError(r)):new X.ZodError(r).format();function ce(t,r,s,g,n){const d=e.ref(),i=e.ref(),c=e.computed(()=>i.value===z.invalid),a=e.ref(),v=e.ref(!1);let l;const f=O=>{const R=x(t,O);if(s?.class){const o=s.class;return new o(R)}return R},m=async(O=a.value,R)=>{if(l=R?.fields,v.value)return!0;const o=await ue(t,O);if(!o.success){if(i.value=z.invalid,!l?.size)return d.value=de(t,o.error),!1;const V=o.error.issues.filter(C=>l?.has(C.path.join(".")));return V.length?(d.value=fe(t,V),!1):(d.value=void 0,!0)}return d.value=void 0,i.value=z.valid,a.value=f(o.data),!0},D=()=>{d.value=void 0,i.value=void 0,l=void 0},y=()=>{a.value=f(),D(),i.value=z.reset},p=async O=>v.value||!await m(void 0,O)?!1:(i.value=z.submitting,!0),{ignoreUpdates:h,stop:w}=L.watchIgnorable(a,()=>{i.value=z.updated},{deep:!0,eventFilter:L.throttleFilter(s?.updateThrottle??500)}),I=e.readonly(d),_=e.readonly(i),E=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:s?.readonly},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(O,{emit:R}){return a.value=f(e.toRaw(O.modelValue)),e.watch(()=>O.modelValue,o=>{if(o){const V=e.isProxy(o)?e.toRaw(o):o;if(JSON.stringify(V)===JSON.stringify(e.toRaw(a.value)))return;a.value=typeof V?.clone=="function"?V.clone():JSON.parse(JSON.stringify(V))}},{deep:!0}),e.watch(i,async o=>{if(o===z.invalid){const V=e.toRaw(d.value);R("invalid",V),s?.onInvalid?.(V);return}if(o===z.valid){const V=e.toRaw(a.value);R("valid",V),s?.onValid?.(V),R("update:modelValue",V),s?.onUpdate?.(V);return}if(o===z.submitting){const V=e.toRaw(a.value);R("submit",V),s?.onSubmit?.(V);return}if(o===z.reset){const V=e.toRaw(a.value);R("reset",V),s?.onReset?.(V);return}if(o===z.updated){if((d.value||s?.continuousValidation||O.continuousValidation)&&await m(void 0,{superRefine:O.superRefine,fields:l??new Set(O.validateFields)}),!a.value||!O.modelValue||JSON.stringify(a.value)!==JSON.stringify(O.modelValue)){const V=e.toRaw(a.value);R("update:modelValue",V),s?.onUpdate?.(V)}i.value===z.updated&&(i.value=z.unknown)}}),e.onMounted(()=>{O.readonly!==void 0&&(v.value=O.readonly)}),e.watch(()=>O.readonly,o=>{v.value=o}),e.watch(v,o=>{o!==O.readonly&&R("update:readonly",v.value)}),e.provide(r,{clear:D,errors:I,formData:a,ignoreUpdates:h,invalid:c,readonly:v,reset:y,status:_,stopUpdatesWatch:w,submit:p,validate:m,wrappers:n}),{clear:D,errors:I,formData:a,ignoreUpdates:h,invalid:c,isReadonly:v,reset:y,status:_,stopUpdatesWatch:w,submit:()=>p({superRefine:O.superRefine,fields:new Set(O.validateFields)}),validate:m,wrappers:n}},render(){const O=()=>this.$slots?.default?.({errors:I.value,formData:a.value,invalid:c.value,readonly:v.value,status:_.value,wrappers:n,clear:D,ignoreUpdates:h,reset:y,stopUpdatesWatch:w,submit:p,validate:m})??this.$slots.default;return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??s?.template)&&g?[e.h(g,{schema:this.template??s?.template},{default:O})]:{default:O})}});return{clear:D,errors:d,formData:a,ignoreUpdates:h,invalid:c,readonly:v,reset:y,status:i,wrappers:n,stopUpdatesWatch:w,submit:p,validate:m,VvForm:E}}function ve(t,r,s,g){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:n=>Object.values(j).includes(n),default:j.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:d,emit:i}){const{props:c,name:a}=e.toRefs(n),v=e.useId(),l=e.inject(r,void 0);l&&l.fields.value.set(v,n.name);const f=e.inject(t),m=e.computed({get(){if(f?.formData)return Z.get(new Object(f.formData.value),String(n.name))},set(o){f?.formData&&(Z.set(new Object(f.formData.value),String(n.name),o),i("update:modelValue",{newValue:m.value,formData:f?.formData}))}});e.onMounted(()=>{m.value===void 0&&n.defaultValue!==void 0&&(m.value=n.defaultValue)}),e.onBeforeUnmount(()=>{l&&l.fields.value.delete(v)});const D=e.computed(()=>{if(f?.errors.value)return Z.get(f.errors.value,String(n.name))}),y=e.computed(()=>D.value?._errors),p=e.computed(()=>D.value!==void 0),h=e.watch(p,o=>{if(o){i("invalid",D.value),l&&l.errors.value.set(String(n.name),D.value);return}i("valid",m.value),l&&l.errors.value.delete(n.name)}),w=e.watch(()=>f?.formData,()=>{i("update:formData",f?.formData)},{deep:!0});e.onBeforeUnmount(()=>{h(),w()});const I=o=>{o instanceof InputEvent&&(o=o.target.value),m.value=o},_=e.computed(()=>{let o=c.value;return typeof o=="function"&&(o=o(f?.formData)),Object.keys(o).reduce((V,C)=>(V[C]=e.unref(o[C]),V),{})}),E=e.computed(()=>f?.readonly.value||l?.readonly.value?!0:_.value.readonly??n.readonly),O=e.computed(()=>({..._.value,name:_.value.name??n.name,invalid:p.value,valid:n.showValid?!!(!p.value&&m.value):void 0,type:(o=>{if([j.color,j.date,j.datetimeLocal,j.email,j.month,j.number,j.password,j.search,j.tel,j.text,j.time,j.url,j.week].includes(o))return o})(n.type),invalidLabel:y.value,modelValue:m.value,readonly:E.value,"onUpdate:modelValue":I}));return e.provide(s,{name:e.readonly(a),errors:e.readonly(D)}),{component:e.computed(()=>{if(n.type===j.custom)return{render(){return d.default?.({errors:D.value,formData:f?.formData.value,formErrors:f?.errors.value,invalid:p.value,invalidLabel:y.value,modelValue:m.value,readonly:E.value,onUpdate:I,submit:f?.submit,validate:f?.validate})??d.default}};if(!(g?.lazyLoad??n.lazyLoad)){let o;switch(n.type){case j.select:o=e.resolveComponent("VvSelect");break;case j.checkbox:o=e.resolveComponent("VvCheckbox");break;case j.radio:o=e.resolveComponent("VvRadio");break;case j.textarea:o=e.resolveComponent("VvTextarea");break;case j.radioGroup:o=e.resolveComponent("VvRadioGroup");break;case j.checkboxGroup:o=e.resolveComponent("VvCheckboxGroup");break;case j.combobox:o=e.resolveComponent("VvCombobox");break;default:o=e.resolveComponent("VvInputText")}if(typeof o!="string")return o;console.warn(`[@volverjs/form-vue]: ${o} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(g?.sideEffects&&await Promise.resolve(g.sideEffects(n.type)),n.type){case j.textarea:return import("@volverjs/ui-vue/vv-textarea");case j.radio:return import("@volverjs/ui-vue/vv-radio");case j.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case j.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case j.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case j.select:return import("@volverjs/ui-vue/vv-select");case j.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:O,invalid:p}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===j.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function me(t,r,s){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(g,{slots:n,emit:d}){const{props:i,names:c,defaultValues:a}=e.toRefs(g),v=e.useId(),l=e.computed(()=>Array.isArray(c.value)?c.value:Object.values(c.value)),f=e.computed(()=>Array.isArray(c.value)?c.value:Object.keys(c.value)),m=e.computed(()=>Array.isArray(c.value)?c.value.reduce((u,b)=>(u[String(b)]=b,u),{}):c.value),D=e.computed(()=>Object.keys(m.value).reduce((u,b)=>(u[String(m.value[b])]=b,u),{})),y=e.inject(r,void 0);y&&l.value.forEach(u=>{y.fields.value.set(`${v}-${u}`,u)});const p=e.inject(t),h=e.computed({get(){return p?.formData?f.value.reduce((u,b)=>(u[b]=Z.get(new Object(p.formData.value),m.value[b]),u),{}):{}},set(u){p?.formData&&(f.value.forEach(b=>{Z.set(new Object(p.formData.value),m.value[b],u?.[b])}),d("update:modelValue",{newValue:h.value,formData:p?.formData}))}});e.onMounted(()=>{a.value&&l.value.forEach(u=>{a.value?.[u]!==void 0&&h.value[u]===void 0&&(h.value={...h.value,[u]:a.value?.[u]})})}),e.onBeforeUnmount(()=>{y&&l.value.forEach(u=>{y.fields.value.delete(`${v}-${u}`)})});const w=e.computed(()=>{if(!p?.errors.value)return;const u=l.value.reduce((b,F)=>{if(!p.errors.value)return b;const Q=Z.get(p.errors.value,String(F));return Q===void 0||(b[String(F)]=Q),b},{});if(Object.keys(u).length!==0)return u}),I=e.computed(()=>{if(!w.value)return;const u=Object.keys(w.value).reduce((b,F)=>(w.value?.[F]&&(b[D.value[F]]=w.value[F]._errors),b),{});if(Object.keys(u).length!==0)return u}),_=e.computed(()=>w.value!==void 0),E=e.computed(()=>f.value.reduce((u,b)=>(u[b]=!!w.value?.[D.value[b]],u),{})),O=e.watch(_,()=>{if(_.value){d("invalid",w.value),y&&l.value.forEach(u=>{if(!w.value?.[u]){y.errors.value.delete(u);return}y.errors.value.set(u,w.value?.[u])});return}d("valid",h.value),y&&l.value.forEach(u=>{y.errors.value.delete(u)})}),R=e.watch(()=>p?.formData,()=>{d("update:formData",p?.formData)},{deep:!0});e.onBeforeUnmount(()=>{O(),R()});const o=u=>{h.value=u},V=(u,b)=>{b instanceof InputEvent&&(b=b.target.value),f.value.includes(u)&&(h.value={...h.value,[u]:b})},C=e.computed(()=>{let u=i.value;return typeof u=="function"&&(u=u(p?.formData)),Object.keys(u).reduce((b,F)=>(b[F]=e.unref(u[F]),b),{})}),H=e.computed(()=>p?.readonly.value?!0:C.value.readonly??g.readonly),we=e.computed(()=>f.value.reduce((u,b)=>(u[`onUpdate:${b}`]=F=>{V(b,F)},u),{"onUpdate:modelValue":o})),Ve=e.computed(()=>({...we.value,...C.value,...h.value,modelValue:h.value,names:C.value.name??l.value,invalid:_.value,invalids:E.value,valid:g.showValid?!!(!_.value&&h.value):void 0,invalidLabels:I.value,readonly:H.value}));return e.provide(s,{names:e.readonly(c),errors:e.readonly(w)}),{component:e.computed(()=>({render(){return n.default?.({errors:w.value,formData:p?.formData.value,formErrors:p?.errors.value,invalid:_.value,invalids:E.value,invalidLabels:I.value,modelValue:h.value,onUpdate:o,onUpdateField:V,readonly:H.value,submit:p?.submit,validate:p?.validate})??n.default}})),hasProps:Ve,invalid:_}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function pe(t,r){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(s,{emit:g}){const n=e.inject(t),d=e.inject(r,void 0),i=e.ref(new Map),c=e.ref(new Map),{name:a}=e.toRefs(s),v=e.computed(()=>n?.invalid.value?c.value.size>0:!1);e.watch(v,y=>{if(y){g("invalid");return}g("valid")});const l=e.computed(()=>n?.readonly.value||s.readonly),f={name:e.readonly(a),errors:c,invalid:e.readonly(v),readonly:e.readonly(l),fields:i};e.provide(r,f);const m=e.computed(()=>new Map(i.value));e.watch(m,(y,p)=>{d?.fields&&(p.forEach((h,w)=>{y.has(w)||d?.fields.value.delete(w)}),y.forEach((h,w)=>{d?.fields.value.has(w)||d?.fields.value.set(w,h)}))},{deep:!0}),e.watch(c,y=>{d?.errors&&i.value.forEach(p=>{if(y.has(p)||d.errors.value.delete(p),y.has(p)){const h=y.get(p);h&&d.errors.value.set(p,h)}})},{deep:!0}),e.onMounted(()=>{if(!n?.wrappers||!a.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(n.wrappers.has(a.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${a.value}" is already used`);return}n.wrappers.set(a.value,f)}),e.onBeforeUnmount(()=>{n?.wrappers&&a.value&&n.wrappers.delete(a.value)});const D=()=>n?.validate(void 0,{fields:new Set(i.value.values())})??Promise.resolve(!0);return{errors:n?.errors,fields:i,fieldsErrors:c,formData:n?.formData,invalid:v,readonly:l,clear:n?.clear,reset:n?.reset,submit:n?.submit,validate:n?.validate,validateWrapper:D}},render(){const s=()=>this.$slots.default?.({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:s}):s()}})}function ye(t,r){const s=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(g,{slots:n}){const d=e.inject(t);if(d?.formData)return()=>{const i=typeof g.schema=="function"?g.schema(d,g.scope):g.schema;let c;const a=i.reduce((v,l)=>{const f=typeof l=="function"?l(d,g.scope):l,{vvIs:m,vvName:D,vvSlots:y,vvChildren:p,vvIf:h,vvElseIf:w,vvType:I,vvDefaultValue:_,vvShowValid:E,vvContent:O,...R}=f;if(h!==void 0){if(typeof h=="string"?c=!!Z.get(new Object(d.formData.value),h):typeof h=="function"?c=e.unref(h(d)):c=e.unref(h),!c)return v}else if(w!==void 0&&c!==void 0){if(c||(typeof w=="string"?c=!!Z.get(new Object(d.formData.value),w):typeof w=="function"?c=e.unref(w(d)):c=e.unref(w),!c))return v}else c=void 0;let o;return p&&(typeof m=="string"?o=e.h(s,{schema:p}):o={default:V=>e.h(s,{schema:p,scope:V})}),D?(v.push(e.h(r,{name:D,is:m,type:I,defaultValue:_,showValid:E,props:R},y??o??O)),v):m?(v.push(e.h(m,R,y??o??O)),v):(o&&("default"in o?v.push(o.default(g.scope)):v.push(o)),v)},[]);return a.push(n?.default?.({errors:d?.errors.value,formData:d?.formData.value,invalid:d?.invalid.value,status:d?.status.value,submit:d?.submit,validate:d?.validate,clear:d?.clear,reset:d?.reset})),a}}});return s}function T(t,r={}){const s=Symbol("formInjectionKey"),g=Symbol("formWrapperInjectionKey"),n=Symbol("formFieldInjectionKey"),d=Symbol("formFieldsGroupInjectionKey"),i=pe(s,g),c=ve(s,g,n,r),a=me(s,g,d),v=ye(s,c),l=new Map,{clear:f,errors:m,formData:D,ignoreUpdates:y,invalid:p,readonly:h,reset:w,status:I,stopUpdatesWatch:_,submit:E,validate:O,VvForm:R}=ce(t,s,r,v,l);return{clear:f,errors:m,formData:D,formFieldInjectionKey:n,formInjectionKey:s,formWrapperInjectionKey:g,ignoreUpdates:y,invalid:p,readonly:h,reset:w,status:I,stopUpdatesWatch:_,submit:E,validate:O,wrappers:l,VvForm:R,VvFormField:c,VvFormFieldsGroup:a,VvFormTemplate:v,VvFormWrapper:i}}const $=Symbol("pluginInjectionKey");function he(t){let r={};return t.schema&&(r=T(t.schema,t)),{...r,install(s,{global:g=!1}={}){s.provide($,t),g&&(s.config.globalProperties.$vvForm=t,r?.VvForm&&s.component("VvForm",r.VvForm),r?.VvFormWrapper&&s.component("VvFormWrapper",r.VvFormWrapper),r?.VvFormField&&s.component("VvFormField",r.VvFormField),r?.VvFormFieldsGroup&&s.component("VvFormFieldsGroup",r.VvFormFieldsGroup),r?.VvFormTemplate&&s.component("VvFormTemplate",r.VvFormTemplate))}}}const W=new Map;function be(t,r={}){if(r.scope&&W.has(r.scope))return W.get(r.scope);if(!e.getCurrentInstance()){const g=T(t,r);return r.scope&&W.set(r.scope,g),g}const s=T(t,{...e.inject($,{}),...r});return r.scope&&W.set(r.scope,s),s}function je(t,r={}){return T(t,r)}S.FormFieldType=j,S.createForm=he,S.defaultObjectBySchema=x,S.formType=je,S.pluginInjectionKey=$,S.useForm=be,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})});
1
+ (function(S,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod/v3"),require("zod/v4/core"),require("ts-dot-prop")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod/v3","zod/v4/core","ts-dot-prop"],e):(S=typeof globalThis<"u"?globalThis:S||self,e(S["@volverjs/form-vue"]={},S.Vue,S.VueUseCore,S.zodV3,S.zodV4Core,S.tsDotProp))})(this,function(S,e,L,Q,A,Z){"use strict";var j=(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))(j||{}),I=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(I||{});const B=t=>t._def.typeName==="ZodObject",N=t=>t._zod.def.type==="object",X=t=>t._def.typeName==="ZodDefault",Y=t=>t._zod.def.type==="default",ee=t=>t._def.typeName==="ZodNullable",te=t=>t._zod.def.type==="nullable",re=t=>t._def.typeName==="ZodRecord",ae=t=>t._zod.def.type==="record",ne=t=>t._def.typeName==="ZodArray",oe=t=>t._zod.def.type==="array",le=t=>t._def.typeName==="ZodEffects",M=t=>t._def.typeName==="ZodOptional",K=t=>t._zod.def.type==="optional",ie=t=>t._zod.def.type==="pipe",se=t=>t._zod.def.type==="transform";function P(t){let r=t;for(;le(r);)r=r.innerType();return r}function q(t){let r=t;for(;ie(r);)se(r._zod.def.out)?r=r._zod.def.in:r=r._zod.def.out;return r}const G=t=>{let r=P(t);return M(r)&&(r=r._def.innerType),r},U=t=>{let r=q(t);return K(r)&&(r=r._zod.def.innerType),r},ue=t=>{const r=P(t);return!!M(r)},de=t=>{const r=q(t);return!!K(r)},k=t=>"_zod"in t;function x(t,r={}){if(k(t)){const n=U(t);return N(n)?{...n._zod.def.catchall&&n._zod.def.catchall._zod.def.type!=="never"?r:{},...Object.fromEntries(("shape"in n._zod.def?Object.entries(n._zod.def.shape):[]).map(([i,c])=>{const a=r[i],v=de(c);let l=U(c),f;if(Y(l)&&(f=l._zod.def.defaultValue,l=l._zod.def.innerType),a===null&&te(l))return[i,a];if(a==null&&v)return[i,f];if(l){const m=A.safeParse(c,a);if(m.success)return[i,m.data??f]}if(oe(l)&&Array.isArray(a)&&a.length){const m=U(l._zod.def.element);if(N(m))return[i,a.map(D=>x(m,D&&typeof D=="object"?D:void 0))]}if(ae(l)&&a){const m=U(l._zod.def.valueType);if(N(m))return[i,Object.keys(a).reduce((D,y)=>(D[y]=x(m,a[y]),D),{})]}return N(l)?[i,x(l,a&&typeof a=="object"?a:f)]:[i,f]}))}:r}const s=G(t);return B(s)?{...s._def.unknownKeys==="passthrough"?r:{},...Object.fromEntries(("shape"in s?Object.entries(s.shape):[]).map(([n,d])=>{const i=r[n],c=ue(d);let a=G(d),v;if(X(a)&&(v=a._def.defaultValue(),a=a._def.innerType),i===null&&ee(a))return[n,i];if(i==null&&c)return[n,v];if(a){const l=d.safeParse(i);if(l.success)return[n,l.data??v]}if(ne(a)&&Array.isArray(i)&&i.length){const l=G(a._def.type);if(B(l))return[n,i.map(f=>x(l,f&&typeof f=="object"?f:void 0))]}if(re(a)&&i){const l=G(a._def.valueType);if(B(l))return[n,Object.keys(i).reduce((f,m)=>(f[m]=x(l,i[m]),f),{})]}return B(a)?[n,x(a,i&&typeof i=="object"?i:v)]:[n,v]}))}:r}const fe=(t,r)=>k(t)?A.safeParseAsync(t,r):t.safeParseAsync(r),ce=(t,r)=>k(t)?A.formatError(r):r.format(),ve=(t,r)=>k(t)?A.formatError(new A.$ZodError(r)):new Q.ZodError(r).format();function me(t,r,s,g,n){const d=e.ref(),i=e.ref(),c=e.computed(()=>i.value===I.invalid),a=e.ref(),v=e.ref(!1);let l;const f=O=>{const R=x(t,O);if(s?.class){const o=s.class;return new o(R)}return R},m=async(O=a.value,R)=>{if(l=R?.fields,v.value)return!0;const o=await fe(t,O);if(!o.success){if(i.value=I.invalid,!l?.size)return d.value=ce(t,o.error),!1;const w=o.error.issues.filter(C=>l?.has(C.path.join(".")));return w.length?(d.value=ve(t,w),!1):(d.value=void 0,!0)}return d.value=void 0,i.value=I.valid,a.value=f(o.data),!0},D=()=>{d.value=void 0,i.value=void 0,l=void 0},y=()=>{a.value=f(),D(),i.value=I.reset},p=async O=>v.value||!await m(void 0,O)?!1:(i.value=I.submitting,!0),{ignoreUpdates:h,stop:V}=L.watchIgnorable(a,()=>{i.value=I.updated},{deep:!0,eventFilter:L.throttleFilter(s?.updateThrottle??500)}),z=e.readonly(d),_=e.readonly(i),E=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:s?.readonly},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(O,{emit:R}){return a.value=f(e.toRaw(O.modelValue)),e.watch(()=>O.modelValue,o=>{if(o){const w=e.isProxy(o)?e.toRaw(o):o;if(JSON.stringify(w)===JSON.stringify(e.toRaw(a.value)))return;a.value=typeof w?.clone=="function"?w.clone():JSON.parse(JSON.stringify(w))}},{deep:!0}),e.watch(i,async o=>{if(o===I.invalid){const w=e.toRaw(d.value);R("invalid",w),s?.onInvalid?.(w);return}if(o===I.valid){const w=e.toRaw(a.value);R("valid",w),s?.onValid?.(w),R("update:modelValue",w),s?.onUpdate?.(w);return}if(o===I.submitting){const w=e.toRaw(a.value);R("submit",w),s?.onSubmit?.(w);return}if(o===I.reset){const w=e.toRaw(a.value);R("reset",w),s?.onReset?.(w);return}if(o===I.updated){if((d.value||s?.continuousValidation||O.continuousValidation)&&await m(void 0,{superRefine:O.superRefine,fields:l??new Set(O.validateFields)}),!a.value||!O.modelValue||JSON.stringify(a.value)!==JSON.stringify(O.modelValue)){const w=e.toRaw(a.value);R("update:modelValue",w),s?.onUpdate?.(w)}i.value===I.updated&&(i.value=I.unknown)}}),e.onMounted(()=>{O.readonly!==void 0&&(v.value=O.readonly)}),e.watch(()=>O.readonly,o=>{v.value=o}),e.watch(v,o=>{o!==O.readonly&&R("update:readonly",v.value)}),e.provide(r,{clear:D,errors:z,formData:a,ignoreUpdates:h,invalid:c,readonly:v,reset:y,status:_,stopUpdatesWatch:V,submit:p,validate:m,wrappers:n}),{clear:D,errors:z,formData:a,ignoreUpdates:h,invalid:c,isReadonly:v,reset:y,status:_,stopUpdatesWatch:V,submit:()=>p({superRefine:O.superRefine,fields:new Set(O.validateFields)}),validate:m,wrappers:n}},render(){const O=()=>this.$slots?.default?.({errors:z.value,formData:a.value,invalid:c.value,readonly:v.value,status:_.value,wrappers:n,clear:D,ignoreUpdates:h,reset:y,stopUpdatesWatch:V,submit:p,validate:m})??this.$slots.default;return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??s?.template)&&g?[e.h(g,{schema:this.template??s?.template},{default:O})]:{default:O})}});return{clear:D,errors:d,formData:a,ignoreUpdates:h,invalid:c,readonly:v,reset:y,status:i,wrappers:n,stopUpdatesWatch:V,submit:p,validate:m,VvForm:E}}function pe(t,r,s,g){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:n=>Object.values(j).includes(n),default:j.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:d,emit:i}){const{props:c,name:a}=e.toRefs(n),v=e.useId(),l=e.inject(r,void 0);l&&l.fields.value.set(v,n.name);const f=e.inject(t),m=e.computed({get(){if(f?.formData)return Z.get(new Object(f.formData.value),String(n.name))},set(o){f?.formData&&(Z.set(new Object(f.formData.value),String(n.name),o),i("update:modelValue",{newValue:m.value,formData:f?.formData}))}});e.onMounted(()=>{m.value===void 0&&n.defaultValue!==void 0&&(m.value=n.defaultValue)}),e.onBeforeUnmount(()=>{l&&l.fields.value.delete(v)});const D=e.computed(()=>{if(f?.errors.value)return Z.get(f.errors.value,String(n.name))}),y=e.computed(()=>D.value?._errors),p=e.computed(()=>D.value!==void 0),h=e.watch(p,o=>{if(o){i("invalid",D.value),l&&l.errors.value.set(String(n.name),D.value);return}i("valid",m.value),l&&l.errors.value.delete(n.name)}),V=e.watch(()=>f?.formData,()=>{i("update:formData",f?.formData)},{deep:!0});e.onBeforeUnmount(()=>{h(),V()});const z=o=>{o instanceof InputEvent&&(o=o.target.value),m.value=o},_=e.computed(()=>{let o=c.value;return typeof o=="function"&&(o=o(f?.formData)),Object.keys(o).reduce((w,C)=>(w[C]=e.unref(o[C]),w),{})}),E=e.computed(()=>f?.readonly.value||l?.readonly.value?!0:_.value.readonly??n.readonly),O=e.computed(()=>({..._.value,name:_.value.name??n.name,invalid:p.value,valid:n.showValid?!!(!p.value&&m.value):void 0,type:(o=>{if([j.color,j.date,j.datetimeLocal,j.email,j.month,j.number,j.password,j.search,j.tel,j.text,j.time,j.url,j.week].includes(o))return o})(n.type),invalidLabel:y.value,modelValue:m.value,readonly:E.value,"onUpdate:modelValue":z}));return e.provide(s,{name:e.readonly(a),errors:e.readonly(D)}),{component:e.computed(()=>{if(n.type===j.custom)return{render(){return d.default?.({errors:D.value,formData:f?.formData.value,formErrors:f?.errors.value,invalid:p.value,invalidLabel:y.value,modelValue:m.value,readonly:E.value,onUpdate:z,submit:f?.submit,validate:f?.validate})??d.default}};if(!(g?.lazyLoad??n.lazyLoad)){let o;switch(n.type){case j.select:o=e.resolveComponent("VvSelect");break;case j.checkbox:o=e.resolveComponent("VvCheckbox");break;case j.radio:o=e.resolveComponent("VvRadio");break;case j.textarea:o=e.resolveComponent("VvTextarea");break;case j.radioGroup:o=e.resolveComponent("VvRadioGroup");break;case j.checkboxGroup:o=e.resolveComponent("VvCheckboxGroup");break;case j.combobox:o=e.resolveComponent("VvCombobox");break;default:o=e.resolveComponent("VvInputText")}if(typeof o!="string")return o;console.warn(`[@volverjs/form-vue]: ${o} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(g?.sideEffects&&await Promise.resolve(g.sideEffects(n.type)),n.type){case j.textarea:return import("@volverjs/ui-vue/vv-textarea");case j.radio:return import("@volverjs/ui-vue/vv-radio");case j.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case j.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case j.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case j.select:return import("@volverjs/ui-vue/vv-select");case j.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:O,invalid:p}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===j.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function ye(t,r,s){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(g,{slots:n,emit:d}){const{props:i,names:c,defaultValues:a}=e.toRefs(g),v=e.useId(),l=e.computed(()=>Array.isArray(c.value)?c.value:Object.values(c.value)),f=e.computed(()=>Array.isArray(c.value)?c.value:Object.keys(c.value)),m=e.computed(()=>Array.isArray(c.value)?c.value.reduce((u,b)=>(u[String(b)]=b,u),{}):c.value),D=e.computed(()=>Object.keys(m.value).reduce((u,b)=>(u[String(m.value[b])]=b,u),{})),y=e.inject(r,void 0);y&&l.value.forEach(u=>{y.fields.value.set(`${v}-${u}`,u)});const p=e.inject(t),h=e.computed({get(){return p?.formData?f.value.reduce((u,b)=>(u[b]=Z.get(new Object(p.formData.value),m.value[b]),u),{}):{}},set(u){p?.formData&&(f.value.forEach(b=>{Z.set(new Object(p.formData.value),m.value[b],u?.[b])}),d("update:modelValue",{newValue:h.value,formData:p?.formData}))}});e.onMounted(()=>{a.value&&l.value.forEach(u=>{a.value?.[u]!==void 0&&h.value[u]===void 0&&(h.value={...h.value,[u]:a.value?.[u]})})}),e.onBeforeUnmount(()=>{y&&l.value.forEach(u=>{y.fields.value.delete(`${v}-${u}`)})});const V=e.computed(()=>{if(!p?.errors.value)return;const u=l.value.reduce((b,F)=>{if(!p.errors.value)return b;const H=Z.get(p.errors.value,String(F));return H===void 0||(b[String(F)]=H),b},{});if(Object.keys(u).length!==0)return u}),z=e.computed(()=>{if(!V.value)return;const u=Object.keys(V.value).reduce((b,F)=>(V.value?.[F]&&(b[D.value[F]]=V.value[F]._errors),b),{});if(Object.keys(u).length!==0)return u}),_=e.computed(()=>V.value!==void 0),E=e.computed(()=>f.value.reduce((u,b)=>(u[b]=!!V.value?.[D.value[b]],u),{})),O=e.watch(_,()=>{if(_.value){d("invalid",V.value),y&&l.value.forEach(u=>{if(!V.value?.[u]){y.errors.value.delete(u);return}y.errors.value.set(u,V.value?.[u])});return}d("valid",h.value),y&&l.value.forEach(u=>{y.errors.value.delete(u)})}),R=e.watch(()=>p?.formData,()=>{d("update:formData",p?.formData)},{deep:!0});e.onBeforeUnmount(()=>{O(),R()});const o=u=>{h.value=u},w=(u,b)=>{b instanceof InputEvent&&(b=b.target.value),f.value.includes(u)&&(h.value={...h.value,[u]:b})},C=e.computed(()=>{let u=i.value;return typeof u=="function"&&(u=u(p?.formData)),Object.keys(u).reduce((b,F)=>(b[F]=e.unref(u[F]),b),{})}),J=e.computed(()=>p?.readonly.value?!0:C.value.readonly??g.readonly),ge=e.computed(()=>f.value.reduce((u,b)=>(u[`onUpdate:${b}`]=F=>{w(b,F)},u),{"onUpdate:modelValue":o})),Oe=e.computed(()=>({...ge.value,...C.value,...h.value,modelValue:h.value,names:C.value.name??l.value,invalid:_.value,invalids:E.value,valid:g.showValid?!!(!_.value&&h.value):void 0,invalidLabels:z.value,readonly:J.value}));return e.provide(s,{names:e.readonly(c),errors:e.readonly(V)}),{component:e.computed(()=>({render(){return n.default?.({errors:V.value,formData:p?.formData.value,formErrors:p?.errors.value,invalid:_.value,invalids:E.value,invalidLabels:z.value,modelValue:h.value,onUpdate:o,onUpdateField:w,readonly:J.value,submit:p?.submit,validate:p?.validate})??n.default}})),hasProps:Oe,invalid:_}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function he(t,r){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(s,{emit:g}){const n=e.inject(t),d=e.inject(r,void 0),i=e.ref(new Map),c=e.ref(new Map),{name:a}=e.toRefs(s),v=e.computed(()=>n?.invalid.value?c.value.size>0:!1);e.watch(v,y=>{if(y){g("invalid");return}g("valid")});const l=e.computed(()=>n?.readonly.value||s.readonly),f={name:e.readonly(a),errors:c,invalid:e.readonly(v),readonly:e.readonly(l),fields:i};e.provide(r,f);const m=e.computed(()=>new Map(i.value));e.watch(m,(y,p)=>{d?.fields&&(p.forEach((h,V)=>{y.has(V)||d?.fields.value.delete(V)}),y.forEach((h,V)=>{d?.fields.value.has(V)||d?.fields.value.set(V,h)}))},{deep:!0}),e.watch(c,y=>{d?.errors&&i.value.forEach(p=>{if(y.has(p)||d.errors.value.delete(p),y.has(p)){const h=y.get(p);h&&d.errors.value.set(p,h)}})},{deep:!0}),e.onMounted(()=>{if(!n?.wrappers||!a.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(n.wrappers.has(a.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${a.value}" is already used`);return}n.wrappers.set(a.value,f)}),e.onBeforeUnmount(()=>{n?.wrappers&&a.value&&n.wrappers.delete(a.value)});const D=()=>n?.validate(void 0,{fields:new Set(i.value.values())})??Promise.resolve(!0);return{errors:n?.errors,fields:i,fieldsErrors:c,formData:n?.formData,invalid:v,readonly:l,clear:n?.clear,reset:n?.reset,submit:n?.submit,validate:n?.validate,validateWrapper:D}},render(){const s=()=>this.$slots.default?.({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:s}):s()}})}function be(t,r){const s=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(g,{slots:n}){const d=e.inject(t);if(d?.formData)return()=>{const i=typeof g.schema=="function"?g.schema(d,g.scope):g.schema;let c;const a=i.reduce((v,l)=>{const f=typeof l=="function"?l(d,g.scope):l,{vvIs:m,vvName:D,vvSlots:y,vvChildren:p,vvIf:h,vvElseIf:V,vvType:z,vvDefaultValue:_,vvShowValid:E,vvContent:O,...R}=f;if(h!==void 0){if(typeof h=="string"?c=!!Z.get(new Object(d.formData.value),h):typeof h=="function"?c=e.unref(h(d)):c=e.unref(h),!c)return v}else if(V!==void 0&&c!==void 0){if(c||(typeof V=="string"?c=!!Z.get(new Object(d.formData.value),V):typeof V=="function"?c=e.unref(V(d)):c=e.unref(V),!c))return v}else c=void 0;let o;return p&&(typeof m=="string"?o=e.h(s,{schema:p}):o={default:w=>e.h(s,{schema:p,scope:w})}),D?(v.push(e.h(r,{name:D,is:m,type:z,defaultValue:_,showValid:E,props:R},y??o??O)),v):m?(v.push(e.h(m,R,y??o??O)),v):(o&&("default"in o?v.push(o.default(g.scope)):v.push(o)),v)},[]);return a.push(n?.default?.({errors:d?.errors.value,formData:d?.formData.value,invalid:d?.invalid.value,status:d?.status.value,submit:d?.submit,validate:d?.validate,clear:d?.clear,reset:d?.reset})),a}}});return s}function W(t,r={}){const s=Symbol("formInjectionKey"),g=Symbol("formWrapperInjectionKey"),n=Symbol("formFieldInjectionKey"),d=Symbol("formFieldsGroupInjectionKey"),i=he(s,g),c=pe(s,g,n,r),a=ye(s,g,d),v=be(s,c),l=new Map,{clear:f,errors:m,formData:D,ignoreUpdates:y,invalid:p,readonly:h,reset:V,status:z,stopUpdatesWatch:_,submit:E,validate:O,VvForm:R}=me(t,s,r,v,l);return{clear:f,errors:m,formData:D,formFieldInjectionKey:n,formInjectionKey:s,formWrapperInjectionKey:g,ignoreUpdates:y,invalid:p,readonly:h,reset:V,status:z,stopUpdatesWatch:_,submit:E,validate:O,wrappers:l,VvForm:R,VvFormField:c,VvFormFieldsGroup:a,VvFormTemplate:v,VvFormWrapper:i}}const $=Symbol("pluginInjectionKey");function je(t){let r={};return t.schema&&(r=W(t.schema,t)),{...r,install(s,{global:g=!1}={}){s.provide($,t),g&&(s.config.globalProperties.$vvForm=t,r?.VvForm&&s.component("VvForm",r.VvForm),r?.VvFormWrapper&&s.component("VvFormWrapper",r.VvFormWrapper),r?.VvFormField&&s.component("VvFormField",r.VvFormField),r?.VvFormFieldsGroup&&s.component("VvFormFieldsGroup",r.VvFormFieldsGroup),r?.VvFormTemplate&&s.component("VvFormTemplate",r.VvFormTemplate))}}}const T=new Map;function Ve(t,r={}){if(r.scope&&T.has(r.scope))return T.get(r.scope);if(!e.getCurrentInstance()){const g=W(t,r);return r.scope&&T.set(r.scope,g),g}const s=W(t,{...e.inject($,{}),...r});return r.scope&&T.set(r.scope,s),s}function we(t,r={}){return W(t,r)}S.FormFieldType=j,S.createForm=je,S.defaultObjectBySchema=x,S.formType=we,S.pluginInjectionKey=$,S.useForm=Ve,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})});
package/dist/utils.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare const isZod4Optional: (value: z4.$ZodType) => value is z4.$ZodOpt
17
17
  export declare const isZod4Pipe: (value: z4.$ZodType) => value is z4.$ZodPipe<any>;
18
18
  export declare const isZod4Transform: (value: z4.$ZodType) => value is z4.$ZodTransform<any>;
19
19
  export declare const getZod3SchemaInnerType: <Type extends z3.ZodTypeAny>(schema: Type | z3.ZodEffects<Type> | z3.ZodEffects<z3.ZodEffects<Type>> | z3.ZodOptional<Type>) => Type;
20
- export declare const getZod4SchemaInnerType: <Type extends z4.$ZodType>(schema: Type | z4.$ZodPipe<Type> | z4.$ZodPipe<any, Type> | z4.$ZodOptional<Type>) => Type;
20
+ export declare const getZod4SchemaInnerType: <Type extends z4.$ZodType>(schema: Type | z4.$ZodPipe<Type> | z4.$ZodPipe<any, Type> | z4.$ZodOptional<Type>) => any;
21
21
  export declare const isZod3SchemaOptional: <Type extends z3.ZodTypeAny>(schema: Type | z3.ZodEffects<Type> | z3.ZodEffects<z3.ZodEffects<Type>> | z3.ZodOptional<Type>) => boolean;
22
22
  export declare const isZod4SchemaOptional: <Type extends z4.$ZodType>(schema: Type | z4.$ZodPipe<Type> | z4.$ZodPipe<any, Type> | z4.$ZodOptional<Type>) => boolean;
23
23
  export declare function defaultObjectByJSONSchema(schema: z4.JSONSchema.JSONSchema, original?: unknown): unknown;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@volverjs/form-vue",
3
3
  "type": "module",
4
- "version": "1.1.0-beta.5",
4
+ "version": "1.1.0",
5
5
  "description": "Vue 3 Forms with @volverjs/ui-vue",
6
6
  "author": "8 Wave S.r.l.",
7
7
  "license": "MIT",
@@ -57,28 +57,28 @@
57
57
  "zod": "^3.25.0 || ^4.0.0"
58
58
  },
59
59
  "devDependencies": {
60
- "@antfu/eslint-config": "^5.0.0",
60
+ "@antfu/eslint-config": "^5.3.0",
61
61
  "@nabla/vite-plugin-eslint": "^2.0.6",
62
- "@playwright/experimental-ct-vue": "^1.54.1",
62
+ "@playwright/experimental-ct-vue": "^1.55.0",
63
63
  "@testing-library/vue": "^8.1.0",
64
64
  "@vitejs/plugin-vue": "^6.0.1",
65
- "@volverjs/style": "^0.1.21",
65
+ "@volverjs/style": "^0.1.22",
66
66
  "@volverjs/ui-vue": "^0.0.9",
67
- "@vue/compiler-sfc": "^3.5.18",
68
- "@vue/runtime-core": "^3.5.18",
67
+ "@vue/compiler-sfc": "^3.5.21",
68
+ "@vue/runtime-core": "^3.5.21",
69
69
  "@vue/test-utils": "^2.4.6",
70
- "@vueuse/core": "^13.6.0",
70
+ "@vueuse/core": "^13.9.0",
71
71
  "copy": "^0.3.2",
72
- "eslint": "^9.32.0",
72
+ "eslint": "^9.35.0",
73
73
  "happy-dom": "^18.0.1",
74
74
  "ts-dot-prop": "^2.1.4",
75
- "typescript": "^5.8.3",
76
- "vite": "^7.0.6",
75
+ "typescript": "^5.9.2",
76
+ "vite": "^7.1.5",
77
77
  "vite-plugin-dts": "^4.5.4",
78
78
  "vite-plugin-externalize-deps": "^0.9.0",
79
79
  "vitest": "^3.2.4",
80
- "vue": "^3.5.18",
81
- "zod": "^4.0.14"
80
+ "vue": "^3.5.21",
81
+ "zod": "^4.1.8"
82
82
  },
83
83
  "scripts": {
84
84
  "lint": "eslint .",
@@ -334,31 +334,31 @@ export function defineFormField<Schema extends FormSchema, Type = undefined>(for
334
334
  switch (props.type) {
335
335
  case FormFieldType.textarea:
336
336
  return import(
337
- '@volverjs/ui-vue/vv-textarea'
337
+ '@volverjs/ui-vue/vv-textarea',
338
338
  ) as Component
339
339
  case FormFieldType.radio:
340
340
  return import(
341
- '@volverjs/ui-vue/vv-radio'
341
+ '@volverjs/ui-vue/vv-radio',
342
342
  ) as Component
343
343
  case FormFieldType.radioGroup:
344
344
  return import(
345
- '@volverjs/ui-vue/vv-radio-group'
345
+ '@volverjs/ui-vue/vv-radio-group',
346
346
  ) as Component
347
347
  case FormFieldType.checkbox:
348
348
  return import(
349
- '@volverjs/ui-vue/vv-checkbox'
349
+ '@volverjs/ui-vue/vv-checkbox',
350
350
  ) as Component
351
351
  case FormFieldType.checkboxGroup:
352
352
  return import(
353
- '@volverjs/ui-vue/vv-checkbox-group'
353
+ '@volverjs/ui-vue/vv-checkbox-group',
354
354
  ) as Component
355
355
  case FormFieldType.select:
356
356
  return import(
357
- '@volverjs/ui-vue/vv-select'
357
+ '@volverjs/ui-vue/vv-select',
358
358
  ) as Component
359
359
  case FormFieldType.combobox:
360
360
  return import(
361
- '@volverjs/ui-vue/vv-combobox'
361
+ '@volverjs/ui-vue/vv-combobox',
362
362
  ) as Component
363
363
  }
364
364
  return import('@volverjs/ui-vue/vv-input-text') as Component
@@ -55,128 +55,128 @@ export function defineFormTemplate<Schema extends FormSchema, Type = undefined>(
55
55
  let lastIf: boolean | undefined
56
56
  const toReturn = normalizedSchema.reduce<
57
57
  (VNode | VNode[] | undefined)[]
58
- >((acc, field) => {
59
- const normalizedField = typeof field === 'function'
60
- ? field(injectedFormData, templateProps.scope)
61
- : field
62
- const {
63
- vvIs,
64
- vvName,
65
- vvSlots,
66
- vvChildren,
67
- vvIf,
68
- vvElseIf,
69
- vvType,
70
- vvDefaultValue,
71
- vvShowValid,
72
- vvContent,
73
- ...props
74
- } = normalizedField
58
+ >((acc, field) => {
59
+ const normalizedField = typeof field === 'function'
60
+ ? field(injectedFormData, templateProps.scope)
61
+ : field
62
+ const {
63
+ vvIs,
64
+ vvName,
65
+ vvSlots,
66
+ vvChildren,
67
+ vvIf,
68
+ vvElseIf,
69
+ vvType,
70
+ vvDefaultValue,
71
+ vvShowValid,
72
+ vvContent,
73
+ ...props
74
+ } = normalizedField
75
75
 
76
- // conditions
77
- if (vvIf !== undefined) {
78
- if (typeof vvIf === 'string') {
79
- lastIf = Boolean(
80
- get(
81
- new Object(injectedFormData.formData.value),
82
- vvIf,
83
- ),
84
- )
85
- }
86
- else if (typeof vvIf === 'function') {
87
- lastIf = unref(vvIf(injectedFormData))
88
- }
89
- else {
90
- lastIf = unref(vvIf)
91
- }
92
- if (!lastIf) {
93
- return acc
94
- }
95
- }
96
- else if (vvElseIf !== undefined && lastIf !== undefined) {
97
- if (lastIf) {
98
- return acc
99
- }
100
- if (typeof vvElseIf === 'string') {
101
- lastIf = Boolean(
102
- get(
103
- new Object(injectedFormData.formData.value),
104
- vvElseIf,
105
- ),
106
- )
107
- }
108
- else if (typeof vvElseIf === 'function') {
109
- lastIf = unref(vvElseIf(injectedFormData))
110
- }
111
- else {
112
- lastIf = unref(vvElseIf)
113
- }
114
- if (!lastIf) {
115
- return acc
116
- }
117
- }
118
- else {
119
- lastIf = undefined
120
- }
76
+ // conditions
77
+ if (vvIf !== undefined) {
78
+ if (typeof vvIf === 'string') {
79
+ lastIf = Boolean(
80
+ get(
81
+ new Object(injectedFormData.formData.value),
82
+ vvIf,
83
+ ),
84
+ )
85
+ }
86
+ else if (typeof vvIf === 'function') {
87
+ lastIf = unref(vvIf(injectedFormData))
88
+ }
89
+ else {
90
+ lastIf = unref(vvIf)
91
+ }
92
+ if (!lastIf) {
93
+ return acc
94
+ }
95
+ }
96
+ else if (vvElseIf !== undefined && lastIf !== undefined) {
97
+ if (lastIf) {
98
+ return acc
99
+ }
100
+ if (typeof vvElseIf === 'string') {
101
+ lastIf = Boolean(
102
+ get(
103
+ new Object(injectedFormData.formData.value),
104
+ vvElseIf,
105
+ ),
106
+ )
107
+ }
108
+ else if (typeof vvElseIf === 'function') {
109
+ lastIf = unref(vvElseIf(injectedFormData))
110
+ }
111
+ else {
112
+ lastIf = unref(vvElseIf)
113
+ }
114
+ if (!lastIf) {
115
+ return acc
116
+ }
117
+ }
118
+ else {
119
+ lastIf = undefined
120
+ }
121
121
 
122
- // children
123
- let hChildren: RenderFunctionOutput | { default: (scope: Record<string, unknown>) => RenderFunctionOutput } | undefined
124
- if (vvChildren) {
125
- if (typeof vvIs === 'string') {
126
- hChildren = h(VvFormTemplate, {
122
+ // children
123
+ let hChildren: RenderFunctionOutput | { default: (scope: Record<string, unknown>) => RenderFunctionOutput } | undefined
124
+ if (vvChildren) {
125
+ if (typeof vvIs === 'string') {
126
+ hChildren = h(VvFormTemplate, {
127
+ schema: vvChildren,
128
+ })
129
+ }
130
+ else {
131
+ hChildren = {
132
+ default: (scope: Record<string, unknown>) =>
133
+ h(VvFormTemplate, {
127
134
  schema: vvChildren,
128
- })
129
- }
130
- else {
131
- hChildren = {
132
- default: (scope: Record<string, unknown>) =>
133
- h(VvFormTemplate, {
134
- schema: vvChildren,
135
- scope,
136
- }),
137
- }
138
- }
135
+ scope,
136
+ }),
139
137
  }
138
+ }
139
+ }
140
140
 
141
- // render
142
- if (vvName) {
143
- acc.push(
144
- h(
145
- VvFormField,
146
- {
147
- name: vvName,
148
- is: vvIs,
149
- type: vvType,
150
- defaultValue: vvDefaultValue,
151
- showValid: vvShowValid,
152
- props,
153
- },
154
- vvSlots ?? hChildren ?? vvContent,
155
- ),
156
- )
157
- return acc
158
- }
159
- if (vvIs) {
160
- acc.push(
161
- h(
162
- vvIs as Component,
163
- props,
164
- vvSlots ?? hChildren ?? vvContent,
165
- ),
166
- )
167
- return acc
168
- }
169
- if (hChildren) {
170
- if ('default' in hChildren) {
171
- acc.push(hChildren.default(templateProps.scope))
172
- }
173
- else {
174
- acc.push(hChildren)
175
- }
176
- return acc
177
- }
178
- return acc
179
- }, [])
141
+ // render
142
+ if (vvName) {
143
+ acc.push(
144
+ h(
145
+ VvFormField,
146
+ {
147
+ name: vvName,
148
+ is: vvIs,
149
+ type: vvType,
150
+ defaultValue: vvDefaultValue,
151
+ showValid: vvShowValid,
152
+ props,
153
+ },
154
+ vvSlots ?? hChildren ?? vvContent,
155
+ ),
156
+ )
157
+ return acc
158
+ }
159
+ if (vvIs) {
160
+ acc.push(
161
+ h(
162
+ vvIs as Component,
163
+ props,
164
+ vvSlots ?? hChildren ?? vvContent,
165
+ ),
166
+ )
167
+ return acc
168
+ }
169
+ if (hChildren) {
170
+ if ('default' in hChildren) {
171
+ acc.push(hChildren.default(templateProps.scope))
172
+ }
173
+ else {
174
+ acc.push(hChildren)
175
+ }
176
+ return acc
177
+ }
178
+ return acc
179
+ }, [])
180
180
  toReturn.push(
181
181
  templateSlots?.default?.({
182
182
  errors: injectedFormData?.errors.value,
package/src/utils.ts CHANGED
@@ -87,7 +87,7 @@ export const isZod4Optional = (value: z4.$ZodType): value is z4.$ZodOptional<any
87
87
  return value._zod.def.type === 'optional'
88
88
  }
89
89
 
90
- // replace of effercts
90
+ // zod 4 replacements for ZodEffects
91
91
  export const isZod4Pipe = (value: z4.$ZodType): value is z4.$ZodPipe<any> => {
92
92
  return value._zod.def.type === 'pipe'
93
93
  }
@@ -96,6 +96,34 @@ export const isZod4Transform = (value: z4.$ZodType): value is z4.$ZodTransform<a
96
96
  return value._zod.def.type === 'transform'
97
97
  }
98
98
 
99
+ function _loopOnZod3Effects<Type extends z3.ZodTypeAny>(
100
+ schema: Type | z3.ZodEffects<Type> | z3.ZodEffects<z3.ZodEffects<Type>>,
101
+ ) {
102
+ let toReturn = schema
103
+ while (isZod3Effects(toReturn)) {
104
+ toReturn = toReturn.innerType()
105
+ }
106
+ return toReturn
107
+ }
108
+
109
+ function _loopOnZod4Pipe<Type extends z4.$ZodType>(
110
+ schema:
111
+ | Type
112
+ | z4.$ZodPipe<Type>
113
+ | z4.$ZodPipe<any, Type>,
114
+ ) {
115
+ let toReturn = schema
116
+ while (isZod4Pipe(toReturn)) {
117
+ if (isZod4Transform(toReturn._zod.def.out)) {
118
+ toReturn = toReturn._zod.def.in
119
+ }
120
+ else {
121
+ toReturn = toReturn._zod.def.out as Type
122
+ }
123
+ }
124
+ return toReturn
125
+ }
126
+
99
127
  // Helper function to get the inner type of a Zod schema
100
128
  export const getZod3SchemaInnerType = <Type extends z3.ZodTypeAny>(
101
129
  schema:
@@ -104,10 +132,7 @@ export const getZod3SchemaInnerType = <Type extends z3.ZodTypeAny>(
104
132
  | z3.ZodEffects<z3.ZodEffects<Type>>
105
133
  | z3.ZodOptional<Type>,
106
134
  ) => {
107
- let toReturn = schema
108
- while (isZod3Effects(toReturn)) {
109
- toReturn = toReturn.innerType()
110
- }
135
+ let toReturn = _loopOnZod3Effects(schema)
111
136
  if (isZod3Optional(toReturn)) {
112
137
  toReturn = toReturn._def.innerType
113
138
  }
@@ -121,15 +146,7 @@ export const getZod4SchemaInnerType = <Type extends z4.$ZodType>(
121
146
  | z4.$ZodPipe<any, Type>
122
147
  | z4.$ZodOptional<Type>,
123
148
  ) => {
124
- let toReturn = schema
125
- while (isZod4Pipe(toReturn)) {
126
- if (isZod4Transform(toReturn._zod.def.out)) {
127
- toReturn = toReturn._zod.def.in
128
- }
129
- else {
130
- toReturn = toReturn._zod.def.out as Type
131
- }
132
- }
149
+ let toReturn = _loopOnZod4Pipe(schema)
133
150
  if (isZod4Optional(toReturn)) {
134
151
  toReturn = toReturn._zod.def.innerType
135
152
  }
@@ -144,10 +161,7 @@ export const isZod3SchemaOptional = <Type extends z3.ZodTypeAny>(
144
161
  | z3.ZodEffects<z3.ZodEffects<Type>>
145
162
  | z3.ZodOptional<Type>,
146
163
  ) => {
147
- let toReturn = schema
148
- while (isZod3Effects(toReturn)) {
149
- toReturn = toReturn.innerType()
150
- }
164
+ const toReturn = _loopOnZod3Effects(schema)
151
165
  if (isZod3Optional(toReturn)) {
152
166
  return true
153
167
  }
@@ -161,15 +175,7 @@ export const isZod4SchemaOptional = <Type extends z4.$ZodType>(
161
175
  | z4.$ZodPipe<any, Type>
162
176
  | z4.$ZodOptional<Type>,
163
177
  ) => {
164
- let toReturn = schema
165
- while (isZod4Pipe(toReturn)) {
166
- if (isZod4Transform(toReturn._zod.def.out)) {
167
- toReturn = toReturn._zod.def.in
168
- }
169
- else {
170
- toReturn = toReturn._zod.def.out as Type
171
- }
172
- }
178
+ const toReturn = _loopOnZod4Pipe(schema)
173
179
  if (isZod4Optional(toReturn)) {
174
180
  return true
175
181
  }
@@ -263,7 +269,7 @@ export function defaultObjectBySchema<Schema extends FormSchema>(schema: Schema,
263
269
  if (!isZod4Object(innerType)) {
264
270
  return original
265
271
  }
266
- const unknownKeys = !(!innerType._zod.def.catchall || innerType._zod.def.catchall?._zod.def.type === 'never')
272
+ const unknownKeys = innerType._zod.def.catchall && innerType._zod.def.catchall._zod.def.type !== 'never'
267
273
 
268
274
  return {
269
275
  ...(unknownKeys ? original : {}),
@@ -309,7 +315,7 @@ export function defaultObjectBySchema<Schema extends FormSchema>(schema: Schema,
309
315
  ? element
310
316
  : undefined) as Partial<
311
317
  typeof arrayType
312
- >,
318
+ >,
313
319
  ),
314
320
  ),
315
321
  ]
@@ -394,7 +400,7 @@ export function defaultObjectBySchema<Schema extends FormSchema>(schema: Schema,
394
400
  ? element
395
401
  : undefined) as Partial<
396
402
  typeof arrayType
397
- >,
403
+ >,
398
404
  ),
399
405
  ),
400
406
  ]