@volverjs/form-vue 1.1.0-beta.4 → 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(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,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
@@ -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>) => any;
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",
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,