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

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(I,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod/v3"),require("zod/v4/core"),require("zod/v4"),require("ts-dot-prop")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod/v3","zod/v4/core","zod/v4","ts-dot-prop"],e):(I=typeof globalThis<"u"?globalThis:I||self,e(I["@volverjs/form-vue"]={},I.Vue,I.VueUseCore,I.zodV3,I.zodV4Core,I.zodV4,I.tsDotProp))})(this,function(I,e,L,P,N,J,k){"use strict";var h=(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))(h||{}),F=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(F||{});const U=t=>t._def.typeName==="ZodObject",H=t=>t._def.typeName==="ZodDefault",Q=t=>t._def.typeName==="ZodNullable",X=t=>t._def.typeName==="ZodRecord",Y=t=>t._def.typeName==="ZodArray",M=t=>t._def.typeName==="ZodEffects",K=t=>t._def.typeName==="ZodOptional",Z=t=>{let r=t;for(;M(r);)r=r.innerType();return K(r)&&(r=r._def.innerType),r},ee=t=>{let r=t;for(;M(r);)r=r.innerType();return!!K(r)};function te(t){return Array.isArray(t)?"array":t===null?"null":typeof t}function re(t,r){const o=te(t);return r.type?r.type===o||r.type==="integer"&&o==="number"&&Number.isInteger(t):!0}function B(t,r){if(t.anyOf&&Array.isArray(t.anyOf)){if(r!==void 0){for(const l of t.anyOf)if(re(r,l))return B(l,r);for(const l of t.anyOf){const d=l;if(!d.type||d.type==="object")return B(d,r)}}return B(t.anyOf[0],r)}if(t.type!=="object"||!t.properties)switch(t.type){case"string":return typeof r=="string"?r:t.default;case"number":case"integer":return typeof r=="number"?r:t.default;case"boolean":return typeof r=="boolean"?r:t.default;case"null":return r===null?r:t.default;case"array":return Array.isArray(r)&&t.items?r.map(l=>B(t.items,l)):t.default;default:return t.default}const o=t.properties,a=r&&typeof r=="object"&&!Array.isArray(r)?r:void 0,i={};for(const l in o){const d=a?.[l];i[l]=B(o[l],d)}if(a&&t.additionalProperties!==!1){const l=new Set(Object.keys(o));for(const[d,s]of Object.entries(a))l.has(d)||(i[d]=s)}return i}const z=t=>"_zod"in t;function G(t,r={}){if(z(t)){const a=J.toJSONSchema(t);if(a.type!=="object"||!a.properties)return r;const i=N.safeParse(t,r);return B(a,i.success?i.data:r)}const o=Z(t);return U(o)?{...o._def.unknownKeys==="passthrough"?r:{},...Object.fromEntries(("shape"in o?Object.entries(o.shape):[]).map(([a,i])=>{const l=r[a],d=ee(i);let s=Z(i),c;if(H(s)&&(c=s._def.defaultValue(),s=s._def.innerType),l===null&&Q(s))return[a,l];if(l==null&&d)return[a,c];if(s){const f=i.safeParse(l);if(f.success)return[a,f.data??c]}if(Y(s)&&Array.isArray(l)&&l.length){const f=Z(s._def.type);if(U(f))return[a,l.map(m=>G(f,m&&typeof m=="object"?m:void 0))]}if(X(s)&&l){const f=Z(s._def.valueType);if(U(f))return[a,Object.keys(l).reduce((m,V)=>(m[V]=G(f,l[V]),m),{})]}return U(s)?[a,G(s,l&&typeof l=="object"?l:c)]:[a,c]}))}:r}const ae=(t,r)=>z(t)?N.safeParseAsync(t,r):t.safeParseAsync(r),ne=(t,r)=>z(t)?N.formatError(r):r.format(),oe=(t,r)=>z(t)?N.formatError(new N.$ZodError(r)):new P.ZodError(r).format();function le(t,r,o,j,a){const i=e.ref(),l=e.ref(),d=e.computed(()=>l.value===F.invalid),s=e.ref(),c=e.ref(!1);let f;const m=g=>{const D=G(t,g);if(o?.class){const n=o.class;return new n(D)}return D},V=async(g=s.value,D)=>{if(f=D?.fields,c.value)return!0;const n=await ae(t,g);if(!n.success){if(l.value=F.invalid,!f?.size)return i.value=ne(t,n.error),!1;const w=n.error.issues.filter(C=>f?.has(C.path.join(".")));return w.length?(i.value=oe(t,w),!1):(i.value=void 0,!0)}return i.value=void 0,l.value=F.valid,s.value=m(n.data),!0},S=()=>{i.value=void 0,l.value=void 0,f=void 0},O=()=>{s.value=m(),S(),l.value=F.reset},v=async g=>c.value||!await V(void 0,g)?!1:(l.value=F.submitting,!0),{ignoreUpdates:p,stop:b}=L.watchIgnorable(s,()=>{l.value=F.updated},{deep:!0,eventFilter:L.throttleFilter(o?.updateThrottle??500)}),E=e.readonly(i),R=e.readonly(l),A=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:o?.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(g,{emit:D}){return s.value=m(e.toRaw(g.modelValue)),e.watch(()=>g.modelValue,n=>{if(n){const w=e.isProxy(n)?e.toRaw(n):n;if(JSON.stringify(w)===JSON.stringify(e.toRaw(s.value)))return;s.value=typeof w?.clone=="function"?w.clone():JSON.parse(JSON.stringify(w))}},{deep:!0}),e.watch(l,async n=>{if(n===F.invalid){const w=e.toRaw(i.value);D("invalid",w),o?.onInvalid?.(w);return}if(n===F.valid){const w=e.toRaw(s.value);D("valid",w),o?.onValid?.(w),D("update:modelValue",w),o?.onUpdate?.(w);return}if(n===F.submitting){const w=e.toRaw(s.value);D("submit",w),o?.onSubmit?.(w);return}if(n===F.reset){const w=e.toRaw(s.value);D("reset",w),o?.onReset?.(w);return}if(n===F.updated){if((i.value||o?.continuousValidation||g.continuousValidation)&&await V(void 0,{superRefine:g.superRefine,fields:f??new Set(g.validateFields)}),!s.value||!g.modelValue||JSON.stringify(s.value)!==JSON.stringify(g.modelValue)){const w=e.toRaw(s.value);D("update:modelValue",w),o?.onUpdate?.(w)}l.value===F.updated&&(l.value=F.unknown)}}),e.onMounted(()=>{g.readonly!==void 0&&(c.value=g.readonly)}),e.watch(()=>g.readonly,n=>{c.value=n}),e.watch(c,n=>{n!==g.readonly&&D("update:readonly",c.value)}),e.provide(r,{clear:S,errors:E,formData:s,ignoreUpdates:p,invalid:d,readonly:c,reset:O,status:R,stopUpdatesWatch:b,submit:v,validate:V,wrappers:a}),{clear:S,errors:E,formData:s,ignoreUpdates:p,invalid:d,isReadonly:c,reset:O,status:R,stopUpdatesWatch:b,submit:()=>v({superRefine:g.superRefine,fields:new Set(g.validateFields)}),validate:V,wrappers:a}},render(){const g=()=>this.$slots?.default?.({errors:E.value,formData:s.value,invalid:d.value,readonly:c.value,status:R.value,wrappers:a,clear:S,ignoreUpdates:p,reset:O,stopUpdatesWatch:b,submit:v,validate:V})??this.$slots.default;return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??o?.template)&&j?[e.h(j,{schema:this.template??o?.template},{default:g})]:{default:g})}});return{clear:S,errors:i,formData:s,ignoreUpdates:p,invalid:d,readonly:c,reset:O,status:l,wrappers:a,stopUpdatesWatch:b,submit:v,validate:V,VvForm:A}}function ie(t,r,o,j){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:a=>Object.values(h).includes(a),default:h.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(a,{slots:i,emit:l}){const{props:d,name:s}=e.toRefs(a),c=e.useId(),f=e.inject(r,void 0);f&&f.fields.value.set(c,a.name);const m=e.inject(t),V=e.computed({get(){if(m?.formData)return k.get(new Object(m.formData.value),String(a.name))},set(n){m?.formData&&(k.set(new Object(m.formData.value),String(a.name),n),l("update:modelValue",{newValue:V.value,formData:m?.formData}))}});e.onMounted(()=>{V.value===void 0&&a.defaultValue!==void 0&&(V.value=a.defaultValue)}),e.onBeforeUnmount(()=>{f&&f.fields.value.delete(c)});const S=e.computed(()=>{if(m?.errors.value)return k.get(m.errors.value,String(a.name))}),O=e.computed(()=>S.value?._errors),v=e.computed(()=>S.value!==void 0),p=e.watch(v,n=>{if(n){l("invalid",S.value),f&&f.errors.value.set(String(a.name),S.value);return}l("valid",V.value),f&&f.errors.value.delete(a.name)}),b=e.watch(()=>m?.formData,()=>{l("update:formData",m?.formData)},{deep:!0});e.onBeforeUnmount(()=>{p(),b()});const E=n=>{n instanceof InputEvent&&(n=n.target.value),V.value=n},R=e.computed(()=>{let n=d.value;return typeof n=="function"&&(n=n(m?.formData)),Object.keys(n).reduce((w,C)=>(w[C]=e.unref(n[C]),w),{})}),A=e.computed(()=>m?.readonly.value||f?.readonly.value?!0:R.value.readonly??a.readonly),g=e.computed(()=>({...R.value,name:R.value.name??a.name,invalid:v.value,valid:a.showValid?!!(!v.value&&V.value):void 0,type:(n=>{if([h.color,h.date,h.datetimeLocal,h.email,h.month,h.number,h.password,h.search,h.tel,h.text,h.time,h.url,h.week].includes(n))return n})(a.type),invalidLabel:O.value,modelValue:V.value,readonly:A.value,"onUpdate:modelValue":E}));return e.provide(o,{name:e.readonly(s),errors:e.readonly(S)}),{component:e.computed(()=>{if(a.type===h.custom)return{render(){return i.default?.({errors:S.value,formData:m?.formData.value,formErrors:m?.errors.value,invalid:v.value,invalidLabel:O.value,modelValue:V.value,readonly:A.value,onUpdate:E,submit:m?.submit,validate:m?.validate})??i.default}};if(!(j?.lazyLoad??a.lazyLoad)){let n;switch(a.type){case h.select:n=e.resolveComponent("VvSelect");break;case h.checkbox:n=e.resolveComponent("VvCheckbox");break;case h.radio:n=e.resolveComponent("VvRadio");break;case h.textarea:n=e.resolveComponent("VvTextarea");break;case h.radioGroup:n=e.resolveComponent("VvRadioGroup");break;case h.checkboxGroup:n=e.resolveComponent("VvCheckboxGroup");break;case h.combobox:n=e.resolveComponent("VvCombobox");break;default:n=e.resolveComponent("VvInputText")}if(typeof n!="string")return n;console.warn(`[@volverjs/form-vue]: ${n} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(j?.sideEffects&&await Promise.resolve(j.sideEffects(a.type)),a.type){case h.textarea:return import("@volverjs/ui-vue/vv-textarea");case h.radio:return import("@volverjs/ui-vue/vv-radio");case h.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case h.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case h.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case h.select:return import("@volverjs/ui-vue/vv-select");case h.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:g,invalid:v}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===h.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function se(t,r,o){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(j,{slots:a,emit:i}){const{props:l,names:d,defaultValues:s}=e.toRefs(j),c=e.useId(),f=e.computed(()=>Array.isArray(d.value)?d.value:Object.values(d.value)),m=e.computed(()=>Array.isArray(d.value)?d.value:Object.keys(d.value)),V=e.computed(()=>Array.isArray(d.value)?d.value.reduce((u,y)=>(u[String(y)]=y,u),{}):d.value),S=e.computed(()=>Object.keys(V.value).reduce((u,y)=>(u[String(V.value[y])]=y,u),{})),O=e.inject(r,void 0);O&&f.value.forEach(u=>{O.fields.value.set(`${c}-${u}`,u)});const v=e.inject(t),p=e.computed({get(){return v?.formData?m.value.reduce((u,y)=>(u[y]=k.get(new Object(v.formData.value),V.value[y]),u),{}):{}},set(u){v?.formData&&(m.value.forEach(y=>{k.set(new Object(v.formData.value),V.value[y],u?.[y])}),i("update:modelValue",{newValue:p.value,formData:v?.formData}))}});e.onMounted(()=>{s.value&&f.value.forEach(u=>{s.value?.[u]!==void 0&&p.value[u]===void 0&&(p.value={...p.value,[u]:s.value?.[u]})})}),e.onBeforeUnmount(()=>{O&&f.value.forEach(u=>{O.fields.value.delete(`${c}-${u}`)})});const b=e.computed(()=>{if(!v?.errors.value)return;const u=f.value.reduce((y,x)=>{if(!v.errors.value)return y;const q=k.get(v.errors.value,String(x));return q===void 0||(y[String(x)]=q),y},{});if(Object.keys(u).length!==0)return u}),E=e.computed(()=>{if(!b.value)return;const u=Object.keys(b.value).reduce((y,x)=>(b.value?.[x]&&(y[S.value[x]]=b.value[x]._errors),y),{});if(Object.keys(u).length!==0)return u}),R=e.computed(()=>b.value!==void 0),A=e.computed(()=>m.value.reduce((u,y)=>(u[y]=!!b.value?.[S.value[y]],u),{})),g=e.watch(R,()=>{if(R.value){i("invalid",b.value),O&&f.value.forEach(u=>{if(!b.value?.[u]){O.errors.value.delete(u);return}O.errors.value.set(u,b.value?.[u])});return}i("valid",p.value),O&&f.value.forEach(u=>{O.errors.value.delete(u)})}),D=e.watch(()=>v?.formData,()=>{i("update:formData",v?.formData)},{deep:!0});e.onBeforeUnmount(()=>{g(),D()});const n=u=>{p.value=u},w=(u,y)=>{y instanceof InputEvent&&(y=y.target.value),m.value.includes(u)&&(p.value={...p.value,[u]:y})},C=e.computed(()=>{let u=l.value;return typeof u=="function"&&(u=u(v?.formData)),Object.keys(u).reduce((y,x)=>(y[x]=e.unref(u[x]),y),{})}),T=e.computed(()=>v?.readonly.value?!0:C.value.readonly??j.readonly),me=e.computed(()=>m.value.reduce((u,y)=>(u[`onUpdate:${y}`]=x=>{w(y,x)},u),{"onUpdate:modelValue":n})),pe=e.computed(()=>({...me.value,...C.value,...p.value,modelValue:p.value,names:C.value.name??f.value,invalid:R.value,invalids:A.value,valid:j.showValid?!!(!R.value&&p.value):void 0,invalidLabels:E.value,readonly:T.value}));return e.provide(o,{names:e.readonly(d),errors:e.readonly(b)}),{component:e.computed(()=>({render(){return a.default?.({errors:b.value,formData:v?.formData.value,formErrors:v?.errors.value,invalid:R.value,invalids:A.value,invalidLabels:E.value,modelValue:p.value,onUpdate:n,onUpdateField:w,readonly:T.value,submit:v?.submit,validate:v?.validate})??a.default}})),hasProps:pe,invalid:R}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function ue(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(o,{emit:j}){const a=e.inject(t),i=e.inject(r,void 0),l=e.ref(new Map),d=e.ref(new Map),{name:s}=e.toRefs(o),c=e.computed(()=>a?.invalid.value?d.value.size>0:!1);e.watch(c,O=>{if(O){j("invalid");return}j("valid")});const f=e.computed(()=>a?.readonly.value||o.readonly),m={name:e.readonly(s),errors:d,invalid:e.readonly(c),readonly:e.readonly(f),fields:l};e.provide(r,m);const V=e.computed(()=>new Map(l.value));e.watch(V,(O,v)=>{i?.fields&&(v.forEach((p,b)=>{O.has(b)||i?.fields.value.delete(b)}),O.forEach((p,b)=>{i?.fields.value.has(b)||i?.fields.value.set(b,p)}))},{deep:!0}),e.watch(d,O=>{i?.errors&&l.value.forEach(v=>{if(O.has(v)||i.errors.value.delete(v),O.has(v)){const p=O.get(v);p&&i.errors.value.set(v,p)}})},{deep:!0}),e.onMounted(()=>{if(!a?.wrappers||!s.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(a.wrappers.has(s.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${s.value}" is already used`);return}a.wrappers.set(s.value,m)}),e.onBeforeUnmount(()=>{a?.wrappers&&s.value&&a.wrappers.delete(s.value)});const S=()=>a?.validate(void 0,{fields:new Set(l.value.values())})??Promise.resolve(!0);return{errors:a?.errors,fields:l,fieldsErrors:d,formData:a?.formData,invalid:c,readonly:f,clear:a?.clear,reset:a?.reset,submit:a?.submit,validate:a?.validate,validateWrapper:S}},render(){const o=()=>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:o}):o()}})}function de(t,r){const o=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(j,{slots:a}){const i=e.inject(t);if(i?.formData)return()=>{const l=typeof j.schema=="function"?j.schema(i,j.scope):j.schema;let d;const s=l.reduce((c,f)=>{const m=typeof f=="function"?f(i,j.scope):f,{vvIs:V,vvName:S,vvSlots:O,vvChildren:v,vvIf:p,vvElseIf:b,vvType:E,vvDefaultValue:R,vvShowValid:A,vvContent:g,...D}=m;if(p!==void 0){if(typeof p=="string"?d=!!k.get(new Object(i.formData.value),p):typeof p=="function"?d=e.unref(p(i)):d=e.unref(p),!d)return c}else if(b!==void 0&&d!==void 0){if(d||(typeof b=="string"?d=!!k.get(new Object(i.formData.value),b):typeof b=="function"?d=e.unref(b(i)):d=e.unref(b),!d))return c}else d=void 0;let n;return v&&(typeof V=="string"?n=e.h(o,{schema:v}):n={default:w=>e.h(o,{schema:v,scope:w})}),S?(c.push(e.h(r,{name:S,is:V,type:E,defaultValue:R,showValid:A,props:D},O??n??g)),c):V?(c.push(e.h(V,D,O??n??g)),c):(n&&("default"in n?c.push(n.default(j.scope)):c.push(n)),c)},[]);return s.push(a?.default?.({errors:i?.errors.value,formData:i?.formData.value,invalid:i?.invalid.value,status:i?.status.value,submit:i?.submit,validate:i?.validate,clear:i?.clear,reset:i?.reset})),s}}});return o}function W(t,r={}){const o=Symbol("formInjectionKey"),j=Symbol("formWrapperInjectionKey"),a=Symbol("formFieldInjectionKey"),i=Symbol("formFieldsGroupInjectionKey"),l=ue(o,j),d=ie(o,j,a,r),s=se(o,j,i),c=de(o,d),f=new Map,{clear:m,errors:V,formData:S,ignoreUpdates:O,invalid:v,readonly:p,reset:b,status:E,stopUpdatesWatch:R,submit:A,validate:g,VvForm:D}=le(t,o,r,c,f);return{clear:m,errors:V,formData:S,formFieldInjectionKey:a,formInjectionKey:o,formWrapperInjectionKey:j,ignoreUpdates:O,invalid:v,readonly:p,reset:b,status:E,stopUpdatesWatch:R,submit:A,validate:g,wrappers:f,VvForm:D,VvFormField:d,VvFormFieldsGroup:s,VvFormTemplate:c,VvFormWrapper:l}}const $=Symbol("pluginInjectionKey");function fe(t){let r={};return t.schema&&(r=W(t.schema,t)),{...r,install(o,{global:j=!1}={}){o.provide($,t),j&&(o.config.globalProperties.$vvForm=t,r?.VvForm&&o.component("VvForm",r.VvForm),r?.VvFormWrapper&&o.component("VvFormWrapper",r.VvFormWrapper),r?.VvFormField&&o.component("VvFormField",r.VvFormField),r?.VvFormFieldsGroup&&o.component("VvFormFieldsGroup",r.VvFormFieldsGroup),r?.VvFormTemplate&&o.component("VvFormTemplate",r.VvFormTemplate))}}}const _=new Map;function ce(t,r={}){if(r.scope&&_.has(r.scope))return _.get(r.scope);if(!e.getCurrentInstance()){const j=W(t,r);return r.scope&&_.set(r.scope,j),j}const o=W(t,{...e.inject($,{}),...r});return r.scope&&_.set(r.scope,o),o}function ve(t,r={}){return W(t,r)}I.FormFieldType=h,I.createForm=fe,I.defaultObjectBySchema=G,I.formType=ve,I.pluginInjectionKey=$,I.useForm=ce,Object.defineProperty(I,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,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"})});
package/dist/utils.d.ts CHANGED
@@ -2,12 +2,24 @@ import { FormSchema, InferSchema, VvZodError, ZodIssue } from './types';
2
2
  import type * as z3 from 'zod/v3';
3
3
  import type * as z4 from 'zod/v4/core';
4
4
  export declare const isZod3Object: (value: z3.ZodTypeAny) => value is z3.ZodObject<any>;
5
+ export declare const isZod4Object: (value: z4.$ZodType) => value is z4.$ZodObject<any>;
5
6
  export declare const isZod3Default: (value: z3.ZodTypeAny) => value is z3.ZodDefault<any>;
7
+ export declare const isZod4Default: (value: z4.$ZodType) => value is z4.$ZodDefault<any>;
6
8
  export declare const isZod3Nullable: (value: z3.ZodTypeAny) => value is z3.ZodNullable<any>;
9
+ export declare const isZod4Nullable: (value: z4.$ZodType) => value is z4.$ZodNullable<any>;
7
10
  export declare const isZod3Record: (value: z3.ZodTypeAny) => value is z3.ZodRecord<any, any>;
11
+ export declare const isZod4Record: (value: z4.$ZodType) => value is z4.$ZodRecord<any, any>;
8
12
  export declare const isZod3Array: (value: z3.ZodTypeAny) => value is z3.ZodArray<any>;
13
+ export declare const isZod4Array: (value: z4.$ZodType) => value is z4.$ZodArray<any>;
9
14
  export declare const isZod3Effects: (value: z3.ZodTypeAny) => value is z3.ZodEffects<any>;
10
15
  export declare const isZod3Optional: (value: z3.ZodTypeAny) => value is z3.ZodOptional<any>;
16
+ export declare const isZod4Optional: (value: z4.$ZodType) => value is z4.$ZodOptional<any>;
17
+ export declare const isZod4Pipe: (value: z4.$ZodType) => value is z4.$ZodPipe<any>;
18
+ export declare const isZod4Transform: (value: z4.$ZodType) => value is z4.$ZodTransform<any>;
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;
21
+ export declare const isZod3SchemaOptional: <Type extends z3.ZodTypeAny>(schema: Type | z3.ZodEffects<Type> | z3.ZodEffects<z3.ZodEffects<Type>> | z3.ZodOptional<Type>) => boolean;
22
+ export declare const isZod4SchemaOptional: <Type extends z4.$ZodType>(schema: Type | z4.$ZodPipe<Type> | z4.$ZodPipe<any, Type> | z4.$ZodOptional<Type>) => boolean;
11
23
  export declare function defaultObjectByJSONSchema(schema: z4.JSONSchema.JSONSchema, original?: unknown): unknown;
12
24
  export declare const isZod4Schema: (schema: z3.ZodTypeAny | z4.$ZodType) => schema is z4.$ZodType;
13
25
  export declare function defaultObjectBySchema<Schema extends FormSchema>(schema: Schema, original?: Partial<InferSchema<Schema>> & Record<string, unknown>): Partial<InferSchema<Schema>>;
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.4",
4
+ "version": "1.1.0-beta.5",
5
5
  "description": "Vue 3 Forms with @volverjs/ui-vue",
6
6
  "author": "8 Wave S.r.l.",
7
7
  "license": "MIT",
package/src/utils.ts CHANGED
@@ -7,31 +7,74 @@ import {
7
7
  safeParseAsync as z4SafeParseAsync,
8
8
  formatError as z4FormatError,
9
9
  } from 'zod/v4/core'
10
- import { toJSONSchema as z4toJSONSchema } from 'zod/v4'
11
10
  import type * as z3 from 'zod/v3'
12
11
  import type * as z4 from 'zod/v4/core'
13
12
  import type { FormSchema, InferSchema, VvZodError, ZodIssue } from './types'
14
13
 
14
+ // Helper function to determine the type of a value
15
+ function _getValueType(value: unknown) {
16
+ if (Array.isArray(value)) {
17
+ return 'array'
18
+ }
19
+ if (value === null) {
20
+ return 'null'
21
+ }
22
+ return typeof value
23
+ }
24
+
25
+ // Helper function to check if a value matches a schema type
26
+ function _isValueCompatibleWithSchema(value: unknown, subSchema: z4.JSONSchema.JSONSchema): boolean {
27
+ const valueType = _getValueType(value)
28
+
29
+ if (subSchema.type) {
30
+ return subSchema.type === valueType
31
+ || (subSchema.type === 'integer' && valueType === 'number' && Number.isInteger(value as number))
32
+ }
33
+
34
+ // If no type specified, assume compatibility
35
+ return true
36
+ }
37
+
15
38
  export const isZod3Object = (value: z3.ZodTypeAny): value is z3.ZodObject<any> => {
16
39
  return value._def.typeName === 'ZodObject'
17
40
  }
18
41
 
42
+ export const isZod4Object = (value: z4.$ZodType): value is z4.$ZodObject<any> => {
43
+ return value._zod.def.type === 'object'
44
+ }
45
+
19
46
  export const isZod3Default = (value: z3.ZodTypeAny): value is z3.ZodDefault<any> => {
20
47
  return value._def.typeName === 'ZodDefault'
21
48
  }
22
49
 
50
+ export const isZod4Default = (value: z4.$ZodType): value is z4.$ZodDefault<any> => {
51
+ return value._zod.def.type === 'default'
52
+ }
53
+
23
54
  export const isZod3Nullable = (value: z3.ZodTypeAny): value is z3.ZodNullable<any> => {
24
55
  return value._def.typeName === 'ZodNullable'
25
56
  }
26
57
 
58
+ export const isZod4Nullable = (value: z4.$ZodType): value is z4.$ZodNullable<any> => {
59
+ return value._zod.def.type === 'nullable'
60
+ }
61
+
27
62
  export const isZod3Record = (value: z3.ZodTypeAny): value is z3.ZodRecord<any, any> => {
28
63
  return value._def.typeName === 'ZodRecord'
29
64
  }
30
65
 
66
+ export const isZod4Record = (value: z4.$ZodType): value is z4.$ZodRecord<any, any> => {
67
+ return value._zod.def.type === 'record'
68
+ }
69
+
31
70
  export const isZod3Array = (value: z3.ZodTypeAny): value is z3.ZodArray<any> => {
32
71
  return value._def.typeName === 'ZodArray'
33
72
  }
34
73
 
74
+ export const isZod4Array = (value: z4.$ZodType): value is z4.$ZodArray<any> => {
75
+ return value._zod.def.type === 'array'
76
+ }
77
+
35
78
  export const isZod3Effects = (value: z3.ZodTypeAny): value is z3.ZodEffects<any> => {
36
79
  return value._def.typeName === 'ZodEffects'
37
80
  }
@@ -40,8 +83,21 @@ export const isZod3Optional = (value: z3.ZodTypeAny): value is z3.ZodOptional<an
40
83
  return value._def.typeName === 'ZodOptional'
41
84
  }
42
85
 
43
- // Helper function to get the inner type of a Zod v3 schema
44
- const getZod3SchemaInnerType = <Type extends z3.ZodTypeAny>(
86
+ export const isZod4Optional = (value: z4.$ZodType): value is z4.$ZodOptional<any> => {
87
+ return value._zod.def.type === 'optional'
88
+ }
89
+
90
+ // replace of effercts
91
+ export const isZod4Pipe = (value: z4.$ZodType): value is z4.$ZodPipe<any> => {
92
+ return value._zod.def.type === 'pipe'
93
+ }
94
+
95
+ export const isZod4Transform = (value: z4.$ZodType): value is z4.$ZodTransform<any> => {
96
+ return value._zod.def.type === 'transform'
97
+ }
98
+
99
+ // Helper function to get the inner type of a Zod schema
100
+ export const getZod3SchemaInnerType = <Type extends z3.ZodTypeAny>(
45
101
  schema:
46
102
  | Type
47
103
  | z3.ZodEffects<Type>
@@ -58,8 +114,30 @@ const getZod3SchemaInnerType = <Type extends z3.ZodTypeAny>(
58
114
  return toReturn
59
115
  }
60
116
 
61
- // Helper function to check if a Zod v3 schema is optional
62
- const isZod3SchemaOptional = <Type extends z3.ZodTypeAny>(
117
+ export const getZod4SchemaInnerType = <Type extends z4.$ZodType>(
118
+ schema:
119
+ | Type
120
+ | z4.$ZodPipe<Type>
121
+ | z4.$ZodPipe<any, Type>
122
+ | z4.$ZodOptional<Type>,
123
+ ) => {
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
+ }
133
+ if (isZod4Optional(toReturn)) {
134
+ toReturn = toReturn._zod.def.innerType
135
+ }
136
+ return toReturn
137
+ }
138
+
139
+ // Helper function to check if a Zod schema is optional
140
+ export const isZod3SchemaOptional = <Type extends z3.ZodTypeAny>(
63
141
  schema:
64
142
  | Type
65
143
  | z3.ZodEffects<Type>
@@ -76,28 +154,26 @@ const isZod3SchemaOptional = <Type extends z3.ZodTypeAny>(
76
154
  return false
77
155
  }
78
156
 
79
- // Helper function to determine the type of a value
80
- function getValueType(value: unknown) {
81
- if (Array.isArray(value)) {
82
- return 'array'
83
- }
84
- if (value === null) {
85
- return 'null'
157
+ export const isZod4SchemaOptional = <Type extends z4.$ZodType>(
158
+ schema:
159
+ | Type
160
+ | z4.$ZodPipe<Type>
161
+ | z4.$ZodPipe<any, Type>
162
+ | z4.$ZodOptional<Type>,
163
+ ) => {
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
+ }
86
172
  }
87
- return typeof value
88
- }
89
-
90
- // Helper function to check if a value matches a schema type
91
- function isValueCompatibleWithSchema(value: unknown, subSchema: z4.JSONSchema.JSONSchema): boolean {
92
- const valueType = getValueType(value)
93
-
94
- if (subSchema.type) {
95
- return subSchema.type === valueType
96
- || (subSchema.type === 'integer' && valueType === 'number' && Number.isInteger(value as number))
173
+ if (isZod4Optional(toReturn)) {
174
+ return true
97
175
  }
98
-
99
- // If no type specified, assume compatibility
100
- return true
176
+ return false
101
177
  }
102
178
 
103
179
  export function defaultObjectByJSONSchema(schema: z4.JSONSchema.JSONSchema, original?: unknown): unknown {
@@ -106,7 +182,7 @@ export function defaultObjectByJSONSchema(schema: z4.JSONSchema.JSONSchema, orig
106
182
  if (original !== undefined) {
107
183
  // First pass: find exact type match
108
184
  for (const subSchema of schema.anyOf) {
109
- if (isValueCompatibleWithSchema(original, subSchema as z4.JSONSchema.JSONSchema)) {
185
+ if (_isValueCompatibleWithSchema(original, subSchema as z4.JSONSchema.JSONSchema)) {
110
186
  return defaultObjectByJSONSchema(subSchema as z4.JSONSchema.JSONSchema, original)
111
187
  }
112
188
  }
@@ -183,12 +259,88 @@ export const isZod4Schema = (schema: z3.ZodTypeAny | z4.$ZodType): schema is z4.
183
259
  export function defaultObjectBySchema<Schema extends FormSchema>(schema: Schema, original: Partial<InferSchema<Schema>> & Record<string, unknown> = {}): Partial<InferSchema<Schema>> {
184
260
  // zod v4
185
261
  if (isZod4Schema(schema)) {
186
- const jsonSchema = z4toJSONSchema(schema)
187
- if (jsonSchema.type !== 'object' || !jsonSchema.properties) {
262
+ const innerType = getZod4SchemaInnerType(schema)
263
+ if (!isZod4Object(innerType)) {
188
264
  return original
189
265
  }
190
- const parse = z4SafeParse(schema, original)
191
- return defaultObjectByJSONSchema(jsonSchema, parse.success ? parse.data : original) as Partial<InferSchema<Schema>>
266
+ const unknownKeys = !(!innerType._zod.def.catchall || innerType._zod.def.catchall?._zod.def.type === 'never')
267
+
268
+ return {
269
+ ...(unknownKeys ? original : {}),
270
+ ...Object.fromEntries(
271
+ ('shape' in innerType._zod.def ? Object.entries(innerType._zod.def.shape) as [string, z4.$ZodType][] : []).map(
272
+ ([key, subSchema]) => {
273
+ const originalValue = original[key]
274
+ const isOptional = isZod4SchemaOptional(subSchema)
275
+ let innerType = getZod4SchemaInnerType(subSchema)
276
+ let defaultValue: Partial<InferSchema<Schema>> | undefined
277
+ if (isZod4Default(innerType)) {
278
+ defaultValue = innerType._zod.def.defaultValue
279
+ innerType = innerType._zod.def.innerType
280
+ }
281
+ if (
282
+ originalValue === null
283
+ && isZod4Nullable(innerType)
284
+ ) {
285
+ return [key, originalValue]
286
+ }
287
+ if ((originalValue === undefined || originalValue === null) && isOptional) {
288
+ return [key, defaultValue]
289
+ }
290
+ if (innerType) {
291
+ const parse = z4SafeParse(subSchema, originalValue)
292
+ if (parse.success) {
293
+ return [key, parse.data ?? defaultValue]
294
+ }
295
+ }
296
+ if (
297
+ isZod4Array(innerType)
298
+ && Array.isArray(originalValue)
299
+ && originalValue.length
300
+ ) {
301
+ const arrayType = getZod4SchemaInnerType(innerType._zod.def.element)
302
+ if (isZod4Object(arrayType)) {
303
+ return [
304
+ key,
305
+ originalValue.map((element: unknown) =>
306
+ defaultObjectBySchema(
307
+ arrayType,
308
+ (element && typeof element === 'object'
309
+ ? element
310
+ : undefined) as Partial<
311
+ typeof arrayType
312
+ >,
313
+ ),
314
+ ),
315
+ ]
316
+ }
317
+ }
318
+ if (isZod4Record(innerType) && originalValue) {
319
+ const valueType = getZod4SchemaInnerType(innerType._zod.def.valueType)
320
+ if (isZod4Object(valueType)) {
321
+ return [key, Object.keys(originalValue).reduce((acc: Record<string, unknown>, recordKey: string) => {
322
+ acc[recordKey] = defaultObjectBySchema(valueType, originalValue[recordKey])
323
+ return acc
324
+ }, {})]
325
+ }
326
+ }
327
+ if (isZod4Object(innerType)) {
328
+ return [
329
+ key,
330
+ defaultObjectBySchema(
331
+ innerType,
332
+ originalValue
333
+ && typeof originalValue === 'object'
334
+ ? originalValue
335
+ : defaultValue,
336
+ ),
337
+ ]
338
+ }
339
+ return [key, defaultValue]
340
+ },
341
+ ),
342
+ ),
343
+ } as Partial<InferSchema<Schema>>
192
344
  }
193
345
 
194
346
  // zod v3