@volverjs/form-vue 1.0.0-beta.26 → 1.0.0-beta.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C["@volverjs/form-vue"]={},C.Vue,C.VueUseCore,C.zod))})(this,function(C,e,Q,A){"use strict";var b=(t=>(t.text="text",t.number="number",t.email="email",t.password="password",t.tel="tel",t.url="url",t.search="search",t.date="date",t.time="time",t.datetimeLocal="datetime-local",t.month="month",t.week="week",t.color="color",t.select="select",t.checkbox="checkbox",t.radio="radio",t.textarea="textarea",t.radioGroup="radioGroup",t.checkboxGroup="checkboxGroup",t.combobox="combobox",t.custom="custom",t))(b||{}),B=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(B||{});function W(t,o={}){const r=c=>{let f=c;for(;f instanceof A.ZodEffects;)f=f.innerType();return f instanceof A.ZodOptional&&(f=f._def.innerType),f},m=c=>{let f=c;for(;f instanceof A.ZodEffects;)f=f.innerType();return f instanceof A.ZodOptional},a=r(t);return{...(a instanceof A.ZodObject?a._def.unknownKeys==="passthrough":!1)?o:{},...Object.fromEntries(Object.entries(a.shape).map(([c,f])=>{const i=o[c],g=m(f);let v=r(f),u;if(v instanceof A.ZodDefault&&(u=v._def.defaultValue(),v=v._def.innerType),i===null&&v instanceof A.ZodNullable)return[c,i];if(i==null&&g)return[c,u];if(v instanceof A.ZodSchema){const p=f.safeParse(i);if(p.success)return[c,p.data??u]}if(v instanceof A.ZodArray&&Array.isArray(i)&&i.length){const p=r(v._def.type);if(p instanceof A.ZodObject)return[c,i.map(h=>W(p,h&&typeof h=="object"?h:void 0))]}if(v instanceof A.ZodRecord&&i){const p=r(v._def.valueType);if(p instanceof A.ZodObject)return[c,Object.keys(i).reduce((h,V)=>(h[V]=W(p,i[V]),h),{})]}return v instanceof A.ZodObject?[c,W(v,i&&typeof i=="object"?i:u)]:[c,u]}))}}function D(t,o,r,m,a){const n=e.ref(),c=e.ref(),f=e.computed(()=>c.value===B.invalid),i=e.ref(),g=e.ref(!1);let v;const u=x=>{const O=W(t,x);if(r!=null&&r.class){const s=r.class;return new s(O)}return O},p=async(x=i.value,O)=>{if(v=O,g.value)return!0;const s=await t.safeParseAsync(x);if(!s.success){if(c.value=B.invalid,!O)return n.value=s.error.format(),!1;const I=s.error.issues.filter(U=>O.has(U.path.join(".")));return I.length?(n.value=new A.ZodError(I).format(),!1):(n.value=void 0,!0)}return n.value=void 0,c.value=B.valid,i.value=u(s.data),!0},h=()=>{n.value=void 0,c.value=void 0,v=void 0},V=()=>{i.value=u(),h(),c.value=B.reset},d=async()=>g.value||!await p()?!1:(c.value=B.submitting,!0),{ignoreUpdates:S,stop:w}=Q.watchIgnorable(i,()=>{c.value=B.updated},{deep:!0,eventFilter:Q.throttleFilter((r==null?void 0:r.updateThrottle)??500)}),E=e.readonly(n),R=e.readonly(c),G=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:(r==null?void 0:r.readonly)??!1},tag:{type:String,default:"form"},template:{type:[Array,Function],default:void 0}},emits:["invalid","submit","update:modelValue","update:readonly","valid","reset"],expose:["errors","invalid","readonly","status","submit","tag","template","valid","validate","clear","reset"],slots:Object,setup(x,{emit:O}){return i.value=u(e.toRaw(x.modelValue)),e.watch(()=>x.modelValue,s=>{if(s){const I=e.isProxy(s)?e.toRaw(s):s;if(JSON.stringify(I)===JSON.stringify(e.toRaw(i.value)))return;i.value=typeof(I==null?void 0:I.clone)=="function"?I.clone():JSON.parse(JSON.stringify(I))}},{deep:!0}),e.watch(c,async s=>{var I,U,L,K,T,H;if(s===B.invalid){const l=e.toRaw(n.value);O("invalid",l),(I=r==null?void 0:r.onInvalid)==null||I.call(r,l);return}if(s===B.valid){const l=e.toRaw(i.value);O("valid",l),(U=r==null?void 0:r.onValid)==null||U.call(r,l),O("update:modelValue",l),(L=r==null?void 0:r.onUpdate)==null||L.call(r,l);return}if(s===B.submitting){const l=e.toRaw(i.value);O("submit",l),(K=r==null?void 0:r.onSubmit)==null||K.call(r,l);return}if(s===B.reset){const l=e.toRaw(i.value);O("reset",l),(T=r==null?void 0:r.onReset)==null||T.call(r,l);return}if(s===B.updated){if((n.value||r!=null&&r.continuousValidation||x.continuousValidation)&&await p(void 0,v),!i.value||!x.modelValue||JSON.stringify(i.value)!==JSON.stringify(x.modelValue)){const l=e.toRaw(i.value);O("update:modelValue",l),(H=r==null?void 0:r.onUpdate)==null||H.call(r,l)}c.value===B.updated&&(c.value=B.unknown)}}),e.onMounted(()=>{g.value=x.readonly}),e.watch(()=>x.readonly,s=>{g.value=s}),e.watch(g,s=>{s!==x.readonly&&O("update:readonly",g.value)}),e.provide(o,{clear:h,errors:E,formData:i,ignoreUpdates:S,invalid:f,readonly:g,reset:V,status:R,stopUpdatesWatch:w,submit:d,validate:p,wrappers:a}),{clear:h,errors:E,formData:i,ignoreUpdates:S,invalid:f,isReadonly:g,reset:V,status:R,stopUpdatesWatch:w,submit:d,validate:p,wrappers:a}},render(){const x=()=>{var O,s;return((s=(O=this.$slots)==null?void 0:O.default)==null?void 0:s.call(O,{clear:h,errors:E,formData:i,ignoreUpdates:S,invalid:f,readonly:g,reset:V,status:R,stopUpdatesWatch:w,submit:d,validate:p,wrappers:a}))??this.$slots.default};return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??(r==null?void 0:r.template))&&m?[e.h(m,{schema:this.template??(r==null?void 0:r.template)},{default:x})]:{default:x})}});return{clear:h,errors:n,formData:i,ignoreUpdates:S,invalid:f,readonly:g,reset:V,status:c,wrappers:a,stopUpdatesWatch:w,submit:d,validate:p,VvForm:G}}function q(t){return Array.isArray(t)}function F(t){return typeof t<"u"}function X(t){return t===null}function Y(t){return typeof t=="object"}function z(t){return typeof t=="string"}function M(t){return typeof t>"u"}const ee=/^[0-9]+$/,re=["__proto__","prototype","constructor"];function $(t,o,r){const m=F(r)?r:void 0;if(!Y(t)||!z(o))return m;const a=j(o);if(a.length!==0){for(const n of a){if(n==="*")continue;const c=function(f){return f.map(i=>M(i)||X(i)?i:q(i)?c(i):i[n])};if(q(t)&&!ee.test(n)?t=c(t):t=t[n],M(t)||X(t))break}return M(t)?m:t}}function J(t,o,r){if(!Y(t)||!z(o))return;const m=j(o);if(m.length===0)return;const a=m.length;for(let n=0;n<a;n++){const c=m[n];if(n===a-1){t[c]=r;return}if(c==="*"&&q(t)){const f=m.slice(n+1).join(".");for(const i of t)J(i,f,r);return}M(t[c])&&(t[c]={}),t=t[c]}}function j(t){const o=t.split(/[.]|(?:\[(\d|\*)\])/).filter(r=>!!r);return o.some(r=>re.indexOf(r)!==-1)?[]:o}function te(t,o,r,m){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:a=>Object.values(b).includes(a),default:b.custom},is:{type:[Object,String],default:void 0},name:{type:[String,Number,Boolean,Symbol],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValue:{type:[String,Number,Boolean,Array,Object],default:void 0},lazyLoad:{type:Boolean,default:!1},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabel","is","type"],slots:Object,setup(a,{slots:n,emit:c}){const{props:f,name:i}=e.toRefs(a),g=e.useId(),v=e.inject(o,void 0);v&&v.fields.value.set(g,a.name);const u=e.inject(t),p=e.computed({get(){if(u!=null&&u.formData)return $(new Object(u.formData.value),String(a.name))},set(s){u!=null&&u.formData&&(J(new Object(u.formData.value),String(a.name),s),c("update:modelValue",{newValue:p.value,formData:u==null?void 0:u.formData}))}});e.onMounted(()=>{p.value===void 0&&a.defaultValue!==void 0&&(p.value=a.defaultValue)}),e.onBeforeUnmount(()=>{v&&v.fields.value.delete(g)});const h=e.computed(()=>{if(u!=null&&u.errors.value)return $(u.errors.value,String(a.name))}),V=e.computed(()=>{var s;return(s=h.value)==null?void 0:s._errors}),d=e.computed(()=>h.value!==void 0),S=e.watch(d,()=>{if(d.value){c("invalid",h.value),v&&v.errors.value.set(String(a.name),h.value);return}c("valid",p.value),v&&v.errors.value.delete(a.name)}),w=e.watch(()=>u==null?void 0:u.formData,()=>{c("update:formData",u==null?void 0:u.formData)},{deep:!0});e.onBeforeUnmount(()=>{S(),w()});const E=s=>{s instanceof InputEvent&&(s=s.target.value),p.value=s},R=e.computed(()=>{let s=f.value;return typeof s=="function"&&(s=s(u==null?void 0:u.formData)),Object.keys(s).reduce((I,U)=>(I[U]=e.unref(s[U]),I),{})}),G=e.computed(()=>u!=null&&u.readonly.value?!0:R.value.readonly??a.readonly),x=e.computed(()=>({...R.value,name:R.value.name??a.name,invalid:d.value,valid:a.showValid?!!(!d.value&&p.value):void 0,type:(s=>{if([b.color,b.date,b.datetimeLocal,b.email,b.month,b.number,b.password,b.search,b.tel,b.text,b.time,b.url,b.week].includes(s))return s})(a.type),invalidLabel:V.value,modelValue:p.value,readonly:G.value,"onUpdate:modelValue":E}));return e.provide(r,{name:e.readonly(i),errors:e.readonly(h)}),{component:e.computed(()=>{if(a.type===b.custom)return{render(){var s;return((s=n.default)==null?void 0:s.call(n,{errors:h.value,formData:u==null?void 0:u.formData.value,formErrors:u==null?void 0:u.errors.value,invalid:d.value,invalidLabel:V.value,modelValue:p.value,onUpdate:E,readonly:G.value,submit:u==null?void 0:u.submit,validate:u==null?void 0:u.validate}))??n.default}};if(!((m==null?void 0:m.lazyLoad)??a.lazyLoad)){let s;switch(a.type){case b.select:s=e.resolveComponent("VvSelect");break;case b.checkbox:s=e.resolveComponent("VvCheckbox");break;case b.radio:s=e.resolveComponent("VvRadio");break;case b.textarea:s=e.resolveComponent("VvTextarea");break;case b.radioGroup:s=e.resolveComponent("VvRadioGroup");break;case b.checkboxGroup:s=e.resolveComponent("VvCheckboxGroup");break;case b.combobox:s=e.resolveComponent("VvCombobox");break;default:s=e.resolveComponent("VvInputText")}if(typeof s!="string")return s;console.warn(`[@volverjs/form-vue]: ${s} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(m!=null&&m.sideEffects&&await Promise.resolve(m.sideEffects(a.type)),a.type){case b.textarea:return import("@volverjs/ui-vue/vv-textarea");case b.radio:return import("@volverjs/ui-vue/vv-radio");case b.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case b.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case b.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case b.select:return import("@volverjs/ui-vue/vv-select");case b.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:x,invalid:d}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===b.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function ne(t,o,r){return e.defineComponent({name:"VvFormFieldsGroup",props:{is:{type:[Object,String],default:void 0},names:{type:[Array,Object],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValues:{type:[Object],default:void 0},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabels","is"],slots:Object,setup(m,{slots:a,emit:n}){const{props:c,names:f,defaultValues:i}=e.toRefs(m),g=e.useId(),v=e.computed(()=>Array.isArray(f.value)?f.value:Object.values(f.value)),u=e.computed(()=>Array.isArray(f.value)?f.value:Object.keys(f.value)),p=e.computed(()=>Array.isArray(f.value)?f.value.reduce((l,y)=>(l[String(y)]=y,l),{}):f.value),h=e.computed(()=>Object.keys(p.value).reduce((l,y)=>(l[String(p.value[y])]=y,l),{})),V=e.inject(o,void 0);V&&v.value.forEach(l=>{V.fields.value.set(`${g}-${l}`,l)});const d=e.inject(t),S=e.computed({get(){return d!=null&&d.formData?u.value.reduce((l,y)=>(l[y]=$(new Object(d.formData.value),p.value[y]),l),{}):{}},set(l){d!=null&&d.formData&&(u.value.forEach(y=>{J(new Object(d.formData.value),p.value[y],l==null?void 0:l[y])}),n("update:modelValue",{newValue:S.value,formData:d==null?void 0:d.formData}))}});e.onMounted(()=>{i.value&&v.value.forEach(l=>{var y,k;((y=i.value)==null?void 0:y[l])!==void 0&&S.value[l]===void 0&&(S.value={...S.value,[l]:(k=i.value)==null?void 0:k[l]})})}),e.onBeforeUnmount(()=>{V&&v.value.forEach(l=>{V.fields.value.delete(`${g}-${l}`)})});const w=e.computed(()=>{if(!(d!=null&&d.errors.value))return;const l=v.value.reduce((y,k)=>{if(!d.errors.value)return y;const Z=$(d.errors.value,String(k));return Z===void 0||(y[String(k)]=Z),y},{});if(Object.keys(l).length!==0)return l}),E=e.computed(()=>{if(!w.value)return;const l=Object.keys(w.value).reduce((y,k)=>{var Z;return(Z=w.value)!=null&&Z[k]&&(y[h.value[k]]=w.value[k]._errors),y},{});if(Object.keys(l).length!==0)return l}),R=e.computed(()=>w.value!==void 0),G=e.computed(()=>u.value.reduce((l,y)=>{var k;return l[y]=!!((k=w.value)!=null&&k[h.value[y]]),l},{})),x=e.watch(R,()=>{if(R.value){n("invalid",w.value),V&&v.value.forEach(l=>{var y,k;if(!((y=w.value)!=null&&y[l])){V.errors.value.delete(l);return}V.errors.value.set(l,(k=w.value)==null?void 0:k[l])});return}n("valid",S.value),V&&v.value.forEach(l=>{V.errors.value.delete(l)})}),O=e.watch(()=>d==null?void 0:d.formData,()=>{n("update:formData",d==null?void 0:d.formData)},{deep:!0});e.onBeforeUnmount(()=>{x(),O()});const s=l=>{S.value=l},I=(l,y)=>{y instanceof InputEvent&&(y=y.target.value),u.value.includes(l)&&(S.value={...S.value,[l]:y})},U=e.computed(()=>{let l=c.value;return typeof l=="function"&&(l=l(d==null?void 0:d.formData)),Object.keys(l).reduce((y,k)=>(y[k]=e.unref(l[k]),y),{})}),L=e.computed(()=>d!=null&&d.readonly.value?!0:U.value.readonly??m.readonly),K=e.computed(()=>u.value.reduce((l,y)=>(l[`onUpdate:${y}`]=k=>{I(y,k)},l),{"onUpdate:modelValue":s})),T=e.computed(()=>({...K.value,...U.value,names:U.value.name??v.value,invalid:R.value,invalids:G.value,valid:m.showValid?!!(!R.value&&S.value):void 0,invalidLabels:E.value,modelValue:S.value,readonly:L.value}));return e.provide(r,{names:e.readonly(f),errors:e.readonly(w)}),{component:e.computed(()=>({render(){var l;return((l=a.default)==null?void 0:l.call(a,{errors:w.value,formData:d==null?void 0:d.formData.value,formErrors:d==null?void 0:d.errors.value,invalid:R.value,invalids:G.value,invalidLabels:E.value,modelValue:S.value,onUpdate:s,onUpdateField:I,readonly:L.value,submit:d==null?void 0:d.submit,validate:d==null?void 0:d.validate}))??a.default}})),hasProps:T,invalid:R}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function ae(t,o){return e.defineComponent({name:"VvFormWrapper",props:{name:{type:String,required:!0},tag:{type:String,default:void 0}},emits:["invalid","valid"],expose:["clear","errors","fields","fieldsErrors","formData","invalid","reset","submit","tag","validate","validateWrapper"],slots:Object,setup(r,{emit:m}){const a=e.inject(t),n=e.inject(o,void 0),c=e.ref(new Map),f=e.ref(new Map),{name:i}=e.toRefs(r);e.provide(o,{name:e.readonly(i),errors:f,fields:c}),e.watch(c,(u,p)=>{n!=null&&n.fields&&p.entries().forEach(([h])=>{u.has(h)||n==null||n.fields.value.delete(h)}),n!=null&&n.fields&&u.entries().forEach(([h,V])=>{n!=null&&n.fields.value.has(h)||n==null||n.fields.value.set(h,V)})},{deep:!0}),e.watch(f,(u,p)=>{n!=null&&n.errors&&(Array.from(p.keys()).forEach(h=>{n.errors.value.delete(h)}),Array.from(u.keys()).forEach(h=>{const V=u.get(h);V&&n.errors.value.set(h,V)}))},{deep:!0});const g=e.computed(()=>a!=null&&a.invalid.value?f.value.size>0:!1);e.watch(g,()=>{g.value?m("invalid"):m("valid")}),e.onMounted(()=>{const u=e.getCurrentInstance();if(!u||!(a!=null&&a.wrappers)||!i.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(a.wrappers.has(i.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${i.value}" is already used`);return}a.wrappers.set(i.value,u)}),e.onBeforeUnmount(()=>{a!=null&&a.wrappers&&i.value&&a.wrappers.delete(i.value)});const v=()=>(a==null?void 0:a.validate(void 0,new Set(c.value.values())))??Promise.resolve(!0);return{clear:a==null?void 0:a.clear,errors:a==null?void 0:a.errors,fields:c,fieldsErrors:f,formData:a==null?void 0:a.formData,invalid:g,reset:a==null?void 0:a.reset,submit:a==null?void 0:a.submit,validate:a==null?void 0:a.validate,validateWrapper:v}},render(){const r=()=>{var m,a;return(a=(m=this.$slots).default)==null?void 0:a.call(m,{clear:this.clear,errors:this.errors,fieldsErrors:this.fieldsErrors,formData:this.formData,invalid:this.invalid,reset:this.reset,submit:this.submit,validate:this.validate,validateWrapper:this.validateWrapper})};return this.tag?e.h(this.tag,null,{default:r}):r()}})}function le(t,o){const r=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(m,{slots:a}){const n=e.inject(t);if(n!=null&&n.formData)return()=>{var g;const c=typeof m.schema=="function"?m.schema(n,m.scope):m.schema;let f;const i=c.reduce((v,u)=>{const p=typeof u=="function"?u(n,m.scope):u,{vvIs:h,vvName:V,vvSlots:d,vvChildren:S,vvIf:w,vvElseIf:E,vvType:R,vvDefaultValue:G,vvShowValid:x,vvContent:O,...s}=p;if(w!==void 0){if(typeof w=="string"?f=!!$(new Object(n.formData.value),w):typeof w=="function"?f=e.unref(w(n)):f=e.unref(w),!f)return v}else if(E!==void 0&&f!==void 0){if(f||(typeof E=="string"?f=!!$(new Object(n.formData.value),E):typeof E=="function"?f=e.unref(E(n)):f=e.unref(E),!f))return v}else f=void 0;let I;return S&&(typeof h=="string"?I=e.h(r,{schema:S}):I={default:U=>e.h(r,{schema:S,scope:U})}),V?(v.push(e.h(o,{name:V,is:h,type:R,defaultValue:G,showValid:x,props:s},d??I??O)),v):h?(v.push(e.h(h,s,d??I??O)),v):(I&&("default"in I?v.push(I.default(m.scope)):v.push(I)),v)},[]);return i.push((g=a==null?void 0:a.default)==null?void 0:g.call(a,{errors:n==null?void 0:n.errors.value,formData:n==null?void 0:n.formData.value,invalid:n==null?void 0:n.invalid.value,status:n==null?void 0:n.status.value,submit:n==null?void 0:n.submit,validate:n==null?void 0:n.validate,clear:n==null?void 0:n.clear,reset:n==null?void 0:n.reset})),i}}});return r}function N(t,o={}){const r=Symbol("formInjectionKey"),m=Symbol("formWrapperInjectionKey"),a=Symbol("formFieldInjectionKey"),n=Symbol("formFieldsGroupInjectionKey"),c=ae(r,m),f=te(r,m,a,o),i=ne(r,m,n),g=le(r,f),v=new Map,{clear:u,errors:p,formData:h,ignoreUpdates:V,invalid:d,readonly:S,reset:w,status:E,stopUpdatesWatch:R,submit:G,validate:x,VvForm:O}=D(t,r,o,g,v);return{clear:u,errors:p,formData:h,formFieldInjectionKey:a,formInjectionKey:r,formWrapperInjectionKey:m,ignoreUpdates:V,invalid:d,readonly:S,reset:w,status:E,stopUpdatesWatch:R,submit:G,validate:x,wrappers:v,VvForm:O,VvFormField:f,VvFormFieldsGroup:i,VvFormTemplate:g,VvFormWrapper:c}}const P=Symbol("pluginInjectionKey");function ue(t){let o={};return t.schema&&(o=N(t.schema,t)),{...o,install(r,{global:m=!1}={}){r.provide(P,t),m&&(r.config.globalProperties.$vvForm=t,o!=null&&o.VvForm&&r.component("VvForm",o.VvForm),o!=null&&o.VvFormWrapper&&r.component("VvFormWrapper",o.VvFormWrapper),o!=null&&o.VvFormField&&r.component("VvFormField",o.VvFormField),o!=null&&o.VvFormFieldsGroup&&r.component("VvFormFieldsGroup",o.VvFormFieldsGroup),o!=null&&o.VvFormTemplate&&r.component("VvFormTemplate",o.VvFormTemplate))}}}const _=new Map;function se(t,o={}){if(o.scope&&_.has(o.scope))return _.get(o.scope);if(!e.getCurrentInstance()){const m=N(t,o);return o.scope&&_.set(o.scope,m),m}const r=N(t,{...e.inject(P,{}),...o});return o.scope&&_.set(o.scope,r),r}function oe(t,o={}){return N(t,o)}C.FormFieldType=b,C.createForm=ue,C.defaultObjectBySchema=W,C.formType=oe,C.pluginInjectionKey=P,C.useForm=se,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
1
+ (function(C,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@vueuse/core"),require("zod")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","zod"],e):(C=typeof globalThis<"u"?globalThis:C||self,e(C["@volverjs/form-vue"]={},C.Vue,C.VueUseCore,C.zod))})(this,function(C,e,Q,A){"use strict";var b=(t=>(t.text="text",t.number="number",t.email="email",t.password="password",t.tel="tel",t.url="url",t.search="search",t.date="date",t.time="time",t.datetimeLocal="datetime-local",t.month="month",t.week="week",t.color="color",t.select="select",t.checkbox="checkbox",t.radio="radio",t.textarea="textarea",t.radioGroup="radioGroup",t.checkboxGroup="checkboxGroup",t.combobox="combobox",t.custom="custom",t))(b||{}),B=(t=>(t.invalid="invalid",t.valid="valid",t.submitting="submitting",t.reset="reset",t.updated="updated",t.unknown="unknown",t))(B||{});function W(t,i={}){const r=v=>{let d=v;for(;d instanceof A.ZodEffects;)d=d.innerType();return d instanceof A.ZodOptional&&(d=d._def.innerType),d},m=v=>{let d=v;for(;d instanceof A.ZodEffects;)d=d.innerType();return d instanceof A.ZodOptional},n=r(t);return{...(n instanceof A.ZodObject?n._def.unknownKeys==="passthrough":!1)?i:{},...Object.fromEntries(Object.entries(n.shape).map(([v,d])=>{const f=i[v],g=m(d);let c=r(d),s;if(c instanceof A.ZodDefault&&(s=c._def.defaultValue(),c=c._def.innerType),f===null&&c instanceof A.ZodNullable)return[v,f];if(f==null&&g)return[v,s];if(c instanceof A.ZodSchema){const y=d.safeParse(f);if(y.success)return[v,y.data??s]}if(c instanceof A.ZodArray&&Array.isArray(f)&&f.length){const y=r(c._def.type);if(y instanceof A.ZodObject)return[v,f.map(V=>W(y,V&&typeof V=="object"?V:void 0))]}if(c instanceof A.ZodRecord&&f){const y=r(c._def.valueType);if(y instanceof A.ZodObject)return[v,Object.keys(f).reduce((V,p)=>(V[p]=W(y,f[p]),V),{})]}return c instanceof A.ZodObject?[v,W(c,f&&typeof f=="object"?f:s)]:[v,s]}))}}function D(t,i,r,m,n){const a=e.ref(),v=e.ref(),d=e.computed(()=>v.value===B.invalid),f=e.ref(),g=e.ref(!1);let c;const s=x=>{const O=W(t,x);if(r!=null&&r.class){const u=r.class;return new u(O)}return O},y=async(x=f.value,O)=>{if(c=O,g.value)return!0;const u=await t.safeParseAsync(x);if(!u.success){if(v.value=B.invalid,!O)return a.value=u.error.format(),!1;const I=u.error.issues.filter(U=>O.has(U.path.join(".")));return I.length?(a.value=new A.ZodError(I).format(),!1):(a.value=void 0,!0)}return a.value=void 0,v.value=B.valid,f.value=s(u.data),!0},V=()=>{a.value=void 0,v.value=void 0,c=void 0},p=()=>{f.value=s(),V(),v.value=B.reset},o=async()=>g.value||!await y()?!1:(v.value=B.submitting,!0),{ignoreUpdates:S,stop:w}=Q.watchIgnorable(f,()=>{v.value=B.updated},{deep:!0,eventFilter:Q.throttleFilter((r==null?void 0:r.updateThrottle)??500)}),E=e.readonly(a),R=e.readonly(v),G=e.defineComponent({name:"VvForm",props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:(r==null?void 0:r.readonly)??!1},tag:{type:String,default:"form"},template:{type:[Array,Function],default:void 0}},emits:["invalid","submit","update:modelValue","update:readonly","valid","reset"],expose:["errors","invalid","readonly","status","submit","tag","template","valid","validate","clear","reset"],slots:Object,setup(x,{emit:O}){return f.value=s(e.toRaw(x.modelValue)),e.watch(()=>x.modelValue,u=>{if(u){const I=e.isProxy(u)?e.toRaw(u):u;if(JSON.stringify(I)===JSON.stringify(e.toRaw(f.value)))return;f.value=typeof(I==null?void 0:I.clone)=="function"?I.clone():JSON.parse(JSON.stringify(I))}},{deep:!0}),e.watch(v,async u=>{var I,U,L,K,T,H;if(u===B.invalid){const l=e.toRaw(a.value);O("invalid",l),(I=r==null?void 0:r.onInvalid)==null||I.call(r,l);return}if(u===B.valid){const l=e.toRaw(f.value);O("valid",l),(U=r==null?void 0:r.onValid)==null||U.call(r,l),O("update:modelValue",l),(L=r==null?void 0:r.onUpdate)==null||L.call(r,l);return}if(u===B.submitting){const l=e.toRaw(f.value);O("submit",l),(K=r==null?void 0:r.onSubmit)==null||K.call(r,l);return}if(u===B.reset){const l=e.toRaw(f.value);O("reset",l),(T=r==null?void 0:r.onReset)==null||T.call(r,l);return}if(u===B.updated){if((a.value||r!=null&&r.continuousValidation||x.continuousValidation)&&await y(void 0,c),!f.value||!x.modelValue||JSON.stringify(f.value)!==JSON.stringify(x.modelValue)){const l=e.toRaw(f.value);O("update:modelValue",l),(H=r==null?void 0:r.onUpdate)==null||H.call(r,l)}v.value===B.updated&&(v.value=B.unknown)}}),e.onMounted(()=>{g.value=x.readonly}),e.watch(()=>x.readonly,u=>{g.value=u}),e.watch(g,u=>{u!==x.readonly&&O("update:readonly",g.value)}),e.provide(i,{clear:V,errors:E,formData:f,ignoreUpdates:S,invalid:d,readonly:g,reset:p,status:R,stopUpdatesWatch:w,submit:o,validate:y,wrappers:n}),{clear:V,errors:E,formData:f,ignoreUpdates:S,invalid:d,isReadonly:g,reset:p,status:R,stopUpdatesWatch:w,submit:o,validate:y,wrappers:n}},render(){const x=()=>{var O,u;return((u=(O=this.$slots)==null?void 0:O.default)==null?void 0:u.call(O,{errors:E.value,formData:f.value,invalid:d.value,readonly:g.value,status:R.value,wrappers:n,clear:V,ignoreUpdates:S,reset:p,stopUpdatesWatch:w,submit:o,validate:y}))??this.$slots.default};return e.h(this.tag,{onSubmit:e.withModifiers(this.submit,["prevent"]),onReset:e.withModifiers(this.reset,["prevent"])},(this.template??(r==null?void 0:r.template))&&m?[e.h(m,{schema:this.template??(r==null?void 0:r.template)},{default:x})]:{default:x})}});return{clear:V,errors:a,formData:f,ignoreUpdates:S,invalid:d,readonly:g,reset:p,status:v,wrappers:n,stopUpdatesWatch:w,submit:o,validate:y,VvForm:G}}function q(t){return Array.isArray(t)}function F(t){return typeof t<"u"}function X(t){return t===null}function Y(t){return typeof t=="object"}function z(t){return typeof t=="string"}function M(t){return typeof t>"u"}const ee=/^[0-9]+$/,re=["__proto__","prototype","constructor"];function $(t,i,r){const m=F(r)?r:void 0;if(!Y(t)||!z(i))return m;const n=j(i);if(n.length!==0){for(const a of n){if(a==="*")continue;const v=function(d){return d.map(f=>M(f)||X(f)?f:q(f)?v(f):f[a])};if(q(t)&&!ee.test(a)?t=v(t):t=t[a],M(t)||X(t))break}return M(t)?m:t}}function J(t,i,r){if(!Y(t)||!z(i))return;const m=j(i);if(m.length===0)return;const n=m.length;for(let a=0;a<n;a++){const v=m[a];if(a===n-1){t[v]=r;return}if(v==="*"&&q(t)){const d=m.slice(a+1).join(".");for(const f of t)J(f,d,r);return}M(t[v])&&(t[v]={}),t=t[v]}}function j(t){const i=t.split(/[.]|(?:\[(\d|\*)\])/).filter(r=>!!r);return i.some(r=>re.indexOf(r)!==-1)?[]:i}function te(t,i,r,m){return e.defineComponent({name:"VvFormField",props:{type:{type:String,validator:n=>Object.values(b).includes(n),default:b.custom},is:{type:[Object,String],default:void 0},name:{type:[String,Number,Boolean,Symbol],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValue:{type:[String,Number,Boolean,Array,Object],default:void 0},lazyLoad:{type:Boolean,default:!1},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabel","is","type"],slots:Object,setup(n,{slots:a,emit:v}){const{props:d,name:f}=e.toRefs(n),g=e.useId(),c=e.inject(i,void 0);c&&c.fields.value.set(g,n.name);const s=e.inject(t),y=e.computed({get(){if(s!=null&&s.formData)return $(new Object(s.formData.value),String(n.name))},set(u){s!=null&&s.formData&&(J(new Object(s.formData.value),String(n.name),u),v("update:modelValue",{newValue:y.value,formData:s==null?void 0:s.formData}))}});e.onMounted(()=>{y.value===void 0&&n.defaultValue!==void 0&&(y.value=n.defaultValue)}),e.onBeforeUnmount(()=>{c&&c.fields.value.delete(g)});const V=e.computed(()=>{if(s!=null&&s.errors.value)return $(s.errors.value,String(n.name))}),p=e.computed(()=>{var u;return(u=V.value)==null?void 0:u._errors}),o=e.computed(()=>V.value!==void 0),S=e.watch(o,()=>{if(o.value){v("invalid",V.value),c&&c.errors.value.set(String(n.name),V.value);return}v("valid",y.value),c&&c.errors.value.delete(n.name)}),w=e.watch(()=>s==null?void 0:s.formData,()=>{v("update:formData",s==null?void 0:s.formData)},{deep:!0});e.onBeforeUnmount(()=>{S(),w()});const E=u=>{u instanceof InputEvent&&(u=u.target.value),y.value=u},R=e.computed(()=>{let u=d.value;return typeof u=="function"&&(u=u(s==null?void 0:s.formData)),Object.keys(u).reduce((I,U)=>(I[U]=e.unref(u[U]),I),{})}),G=e.computed(()=>s!=null&&s.readonly.value?!0:R.value.readonly??n.readonly),x=e.computed(()=>({...R.value,name:R.value.name??n.name,invalid:o.value,valid:n.showValid?!!(!o.value&&y.value):void 0,type:(u=>{if([b.color,b.date,b.datetimeLocal,b.email,b.month,b.number,b.password,b.search,b.tel,b.text,b.time,b.url,b.week].includes(u))return u})(n.type),invalidLabel:p.value,modelValue:y.value,readonly:G.value,"onUpdate:modelValue":E}));return e.provide(r,{name:e.readonly(f),errors:e.readonly(V)}),{component:e.computed(()=>{if(n.type===b.custom)return{render(){var u;return((u=a.default)==null?void 0:u.call(a,{errors:V.value,formData:s==null?void 0:s.formData.value,formErrors:s==null?void 0:s.errors.value,invalid:o.value,invalidLabel:p.value,modelValue:y.value,readonly:G.value,onUpdate:E,submit:s==null?void 0:s.submit,validate:s==null?void 0:s.validate}))??a.default}};if(!((m==null?void 0:m.lazyLoad)??n.lazyLoad)){let u;switch(n.type){case b.select:u=e.resolveComponent("VvSelect");break;case b.checkbox:u=e.resolveComponent("VvCheckbox");break;case b.radio:u=e.resolveComponent("VvRadio");break;case b.textarea:u=e.resolveComponent("VvTextarea");break;case b.radioGroup:u=e.resolveComponent("VvRadioGroup");break;case b.checkboxGroup:u=e.resolveComponent("VvCheckboxGroup");break;case b.combobox:u=e.resolveComponent("VvCombobox");break;default:u=e.resolveComponent("VvInputText")}if(typeof u!="string")return u;console.warn(`[@volverjs/form-vue]: ${u} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return e.defineAsyncComponent(async()=>{switch(m!=null&&m.sideEffects&&await Promise.resolve(m.sideEffects(n.type)),n.type){case b.textarea:return import("@volverjs/ui-vue/vv-textarea");case b.radio:return import("@volverjs/ui-vue/vv-radio");case b.radioGroup:return import("@volverjs/ui-vue/vv-radio-group");case b.checkbox:return import("@volverjs/ui-vue/vv-checkbox");case b.checkboxGroup:return import("@volverjs/ui-vue/vv-checkbox-group");case b.select:return import("@volverjs/ui-vue/vv-select");case b.combobox:return import("@volverjs/ui-vue/vv-combobox")}return import("@volverjs/ui-vue/vv-input-text")})}),hasProps:x,invalid:o}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):this.type===b.custom?e.h(this.component,null,this.$slots):e.h(this.component,this.hasProps,this.$slots)}})}function ae(t,i,r){return e.defineComponent({name:"VvFormFieldsGroup",props:{is:{type:[Object,String],default:void 0},names:{type:[Array,Object],required:!0},props:{type:[Object,Function],default:()=>({})},showValid:{type:Boolean,default:!1},defaultValues:{type:[Object],default:void 0},readonly:{type:Boolean,default:void 0}},emits:["invalid","update:formData","update:modelValue","valid"],expose:["component","errors","hasProps","invalid","invalidLabels","is"],slots:Object,setup(m,{slots:n,emit:a}){const{props:v,names:d,defaultValues:f}=e.toRefs(m),g=e.useId(),c=e.computed(()=>Array.isArray(d.value)?d.value:Object.values(d.value)),s=e.computed(()=>Array.isArray(d.value)?d.value:Object.keys(d.value)),y=e.computed(()=>Array.isArray(d.value)?d.value.reduce((l,h)=>(l[String(h)]=h,l),{}):d.value),V=e.computed(()=>Object.keys(y.value).reduce((l,h)=>(l[String(y.value[h])]=h,l),{})),p=e.inject(i,void 0);p&&c.value.forEach(l=>{p.fields.value.set(`${g}-${l}`,l)});const o=e.inject(t),S=e.computed({get(){return o!=null&&o.formData?s.value.reduce((l,h)=>(l[h]=$(new Object(o.formData.value),y.value[h]),l),{}):{}},set(l){o!=null&&o.formData&&(s.value.forEach(h=>{J(new Object(o.formData.value),y.value[h],l==null?void 0:l[h])}),a("update:modelValue",{newValue:S.value,formData:o==null?void 0:o.formData}))}});e.onMounted(()=>{f.value&&c.value.forEach(l=>{var h,k;((h=f.value)==null?void 0:h[l])!==void 0&&S.value[l]===void 0&&(S.value={...S.value,[l]:(k=f.value)==null?void 0:k[l]})})}),e.onBeforeUnmount(()=>{p&&c.value.forEach(l=>{p.fields.value.delete(`${g}-${l}`)})});const w=e.computed(()=>{if(!(o!=null&&o.errors.value))return;const l=c.value.reduce((h,k)=>{if(!o.errors.value)return h;const Z=$(o.errors.value,String(k));return Z===void 0||(h[String(k)]=Z),h},{});if(Object.keys(l).length!==0)return l}),E=e.computed(()=>{if(!w.value)return;const l=Object.keys(w.value).reduce((h,k)=>{var Z;return(Z=w.value)!=null&&Z[k]&&(h[V.value[k]]=w.value[k]._errors),h},{});if(Object.keys(l).length!==0)return l}),R=e.computed(()=>w.value!==void 0),G=e.computed(()=>s.value.reduce((l,h)=>{var k;return l[h]=!!((k=w.value)!=null&&k[V.value[h]]),l},{})),x=e.watch(R,()=>{if(R.value){a("invalid",w.value),p&&c.value.forEach(l=>{var h,k;if(!((h=w.value)!=null&&h[l])){p.errors.value.delete(l);return}p.errors.value.set(l,(k=w.value)==null?void 0:k[l])});return}a("valid",S.value),p&&c.value.forEach(l=>{p.errors.value.delete(l)})}),O=e.watch(()=>o==null?void 0:o.formData,()=>{a("update:formData",o==null?void 0:o.formData)},{deep:!0});e.onBeforeUnmount(()=>{x(),O()});const u=l=>{S.value=l},I=(l,h)=>{h instanceof InputEvent&&(h=h.target.value),s.value.includes(l)&&(S.value={...S.value,[l]:h})},U=e.computed(()=>{let l=v.value;return typeof l=="function"&&(l=l(o==null?void 0:o.formData)),Object.keys(l).reduce((h,k)=>(h[k]=e.unref(l[k]),h),{})}),L=e.computed(()=>o!=null&&o.readonly.value?!0:U.value.readonly??m.readonly),K=e.computed(()=>s.value.reduce((l,h)=>(l[`onUpdate:${h}`]=k=>{I(h,k)},l),{"onUpdate:modelValue":u})),T=e.computed(()=>({...K.value,...U.value,names:U.value.name??c.value,invalid:R.value,invalids:G.value,valid:m.showValid?!!(!R.value&&S.value):void 0,invalidLabels:E.value,modelValue:S.value,readonly:L.value}));return e.provide(r,{names:e.readonly(d),errors:e.readonly(w)}),{component:e.computed(()=>({render(){var l;return((l=n.default)==null?void 0:l.call(n,{errors:w.value,formData:o==null?void 0:o.formData.value,formErrors:o==null?void 0:o.errors.value,invalid:R.value,invalids:G.value,invalidLabels:E.value,modelValue:S.value,onUpdate:u,onUpdateField:I,readonly:L.value,submit:o==null?void 0:o.submit,validate:o==null?void 0:o.validate}))??n.default}})),hasProps:T,invalid:R}},render(){return this.is?e.h(this.is,this.hasProps,this.$slots):e.h(this.component,null,this.$slots)}})}function ne(t,i){return e.defineComponent({name:"VvFormWrapper",props:{name:{type:String,required:!0},tag:{type:String,default:void 0}},emits:["invalid","valid"],expose:["clear","errors","fields","fieldsErrors","formData","invalid","reset","submit","tag","validate","validateWrapper"],slots:Object,setup(r,{emit:m}){const n=e.inject(t),a=e.inject(i,void 0),v=e.ref(new Map),d=e.ref(new Map),{name:f}=e.toRefs(r),g=e.computed(()=>n!=null&&n.invalid.value?d.value.size>0:!1);e.watch(g,()=>{g.value?m("invalid"):m("valid")});const c={name:e.readonly(f),errors:d,invalid:e.readonly(g),fields:v};e.provide(i,c),e.watch(v,(y,V)=>{a!=null&&a.fields&&V.entries().forEach(([p])=>{y.has(p)||a==null||a.fields.value.delete(p)}),a!=null&&a.fields&&y.entries().forEach(([p,o])=>{a!=null&&a.fields.value.has(p)||a==null||a.fields.value.set(p,o)})},{deep:!0}),e.watch(d,(y,V)=>{a!=null&&a.errors&&(Array.from(V.keys()).forEach(p=>{a.errors.value.delete(p)}),Array.from(y.keys()).forEach(p=>{const o=y.get(p);o&&a.errors.value.set(p,o)}))},{deep:!0}),e.onMounted(()=>{if(!(n!=null&&n.wrappers)||!f.value){console.warn("[@volverjs/form-vue]: Invalid wrapper registration state");return}if(n.wrappers.has(f.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${f.value}" is already used`);return}n.wrappers.set(f.value,c)}),e.onBeforeUnmount(()=>{n!=null&&n.wrappers&&f.value&&n.wrappers.delete(f.value)});const s=()=>(n==null?void 0:n.validate(void 0,new Set(v.value.values())))??Promise.resolve(!0);return{errors:n==null?void 0:n.errors,fields:v,fieldsErrors:d,formData:n==null?void 0:n.formData,invalid:g,clear:n==null?void 0:n.clear,reset:n==null?void 0:n.reset,submit:n==null?void 0:n.submit,validate:n==null?void 0:n.validate,validateWrapper:s}},render(){const r=()=>{var m,n;return(n=(m=this.$slots).default)==null?void 0:n.call(m,{errors:this.errors,fieldsErrors:this.fieldsErrors,formData:this.formData,invalid:this.invalid,clear:this.clear,reset:this.reset,submit:this.submit,validate:this.validate,validateWrapper:this.validateWrapper})};return this.tag?e.h(this.tag,null,{default:r}):r()}})}function le(t,i){const r=e.defineComponent({name:"VvFormTemplate",props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(m,{slots:n}){const a=e.inject(t);if(a!=null&&a.formData)return()=>{var g;const v=typeof m.schema=="function"?m.schema(a,m.scope):m.schema;let d;const f=v.reduce((c,s)=>{const y=typeof s=="function"?s(a,m.scope):s,{vvIs:V,vvName:p,vvSlots:o,vvChildren:S,vvIf:w,vvElseIf:E,vvType:R,vvDefaultValue:G,vvShowValid:x,vvContent:O,...u}=y;if(w!==void 0){if(typeof w=="string"?d=!!$(new Object(a.formData.value),w):typeof w=="function"?d=e.unref(w(a)):d=e.unref(w),!d)return c}else if(E!==void 0&&d!==void 0){if(d||(typeof E=="string"?d=!!$(new Object(a.formData.value),E):typeof E=="function"?d=e.unref(E(a)):d=e.unref(E),!d))return c}else d=void 0;let I;return S&&(typeof V=="string"?I=e.h(r,{schema:S}):I={default:U=>e.h(r,{schema:S,scope:U})}),p?(c.push(e.h(i,{name:p,is:V,type:R,defaultValue:G,showValid:x,props:u},o??I??O)),c):V?(c.push(e.h(V,u,o??I??O)),c):(I&&("default"in I?c.push(I.default(m.scope)):c.push(I)),c)},[]);return f.push((g=n==null?void 0:n.default)==null?void 0:g.call(n,{errors:a==null?void 0:a.errors.value,formData:a==null?void 0:a.formData.value,invalid:a==null?void 0:a.invalid.value,status:a==null?void 0:a.status.value,submit:a==null?void 0:a.submit,validate:a==null?void 0:a.validate,clear:a==null?void 0:a.clear,reset:a==null?void 0:a.reset})),f}}});return r}function N(t,i={}){const r=Symbol("formInjectionKey"),m=Symbol("formWrapperInjectionKey"),n=Symbol("formFieldInjectionKey"),a=Symbol("formFieldsGroupInjectionKey"),v=ne(r,m),d=te(r,m,n,i),f=ae(r,m,a),g=le(r,d),c=new Map,{clear:s,errors:y,formData:V,ignoreUpdates:p,invalid:o,readonly:S,reset:w,status:E,stopUpdatesWatch:R,submit:G,validate:x,VvForm:O}=D(t,r,i,g,c);return{clear:s,errors:y,formData:V,formFieldInjectionKey:n,formInjectionKey:r,formWrapperInjectionKey:m,ignoreUpdates:p,invalid:o,readonly:S,reset:w,status:E,stopUpdatesWatch:R,submit:G,validate:x,wrappers:c,VvForm:O,VvFormField:d,VvFormFieldsGroup:f,VvFormTemplate:g,VvFormWrapper:v}}const P=Symbol("pluginInjectionKey");function ue(t){let i={};return t.schema&&(i=N(t.schema,t)),{...i,install(r,{global:m=!1}={}){r.provide(P,t),m&&(r.config.globalProperties.$vvForm=t,i!=null&&i.VvForm&&r.component("VvForm",i.VvForm),i!=null&&i.VvFormWrapper&&r.component("VvFormWrapper",i.VvFormWrapper),i!=null&&i.VvFormField&&r.component("VvFormField",i.VvFormField),i!=null&&i.VvFormFieldsGroup&&r.component("VvFormFieldsGroup",i.VvFormFieldsGroup),i!=null&&i.VvFormTemplate&&r.component("VvFormTemplate",i.VvFormTemplate))}}}const _=new Map;function se(t,i={}){if(i.scope&&_.has(i.scope))return _.get(i.scope);if(!e.getCurrentInstance()){const m=N(t,i);return i.scope&&_.set(i.scope,m),m}const r=N(t,{...e.inject(P,{}),...i});return i.scope&&_.set(i.scope,r),r}function oe(t,i={}){return N(t,i)}C.FormFieldType=b,C.createForm=ue,C.defaultObjectBySchema=W,C.formType=oe,C.pluginInjectionKey=P,C.useForm=se,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})});
package/dist/types.d.ts CHANGED
@@ -42,12 +42,13 @@ export type InjectedFormData<Schema extends FormSchema, Type> = {
42
42
  status: Readonly<Ref<FormStatus | undefined>>;
43
43
  invalid: Readonly<Ref<boolean>>;
44
44
  readonly: Ref<boolean>;
45
- wrappers: Map<string, Component>;
45
+ wrappers: Map<string, InjectedFormWrapperData<Schema>>;
46
46
  };
47
47
  export type InjectedFormWrapperData<Schema extends FormSchema> = {
48
- name: Ref<string>;
49
- fields: Ref<Map<string, string>>;
48
+ name: Readonly<Ref<string>>;
50
49
  errors: Ref<Map<string, z.inferFormattedError<Schema>>>;
50
+ invalid: Readonly<Ref<boolean>>;
51
+ fields: Ref<Map<string, string>>;
51
52
  };
52
53
  export type InjectedFormFieldData<Schema extends FormSchema> = {
53
54
  name: Readonly<Ref<Path<z.infer<Schema>>>>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@volverjs/form-vue",
3
3
  "type": "module",
4
- "version": "1.0.0-beta.26",
4
+ "version": "1.0.0-beta.28",
5
5
  "description": "Vue 3 Forms with @volverjs/ui-vue",
6
6
  "author": "8 Wave S.r.l.",
7
7
  "license": "MIT",
package/src/VvForm.ts CHANGED
@@ -3,6 +3,7 @@ import {
3
3
  type InjectionKey,
4
4
  type PropType,
5
5
  type SlotsType,
6
+ type UnwrapRef,
6
7
  computed,
7
8
  defineComponent,
8
9
  h,
@@ -25,11 +26,12 @@ import type {
25
26
  FormSchema,
26
27
  FormTemplate,
27
28
  InjectedFormData,
29
+ InjectedFormWrapperData,
28
30
  } from './types'
29
31
  import { FormStatus } from './enums'
30
32
  import { defaultObjectBySchema } from './utils'
31
33
 
32
- export function defineForm<Schema extends FormSchema, Type, FormTemplateComponent extends Component, FormWrapperComponent extends Component>(schema: Schema, provideKey: InjectionKey<InjectedFormData<Schema, Type>>, options: FormComponentOptions<Schema, Type>, VvFormTemplate: FormTemplateComponent, wrappers: Map<string, FormWrapperComponent>) {
34
+ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponent extends Component>(schema: Schema, provideKey: InjectionKey<InjectedFormData<Schema, Type>>, options: FormComponentOptions<Schema, Type>, VvFormTemplate: FormTemplateComponent, wrappers: Map<string, InjectedFormWrapperData<Schema>>) {
33
35
  const errors = ref<z.inferFormattedError<Schema> | undefined>()
34
36
  const status = ref<FormStatus | undefined>()
35
37
  const invalid = computed(() => status.value === FormStatus.invalid)
@@ -158,18 +160,18 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
158
160
  ],
159
161
  slots: Object as SlotsType<{
160
162
  default: {
161
- errors: typeof readonlyErrors
162
- formData: typeof formData
163
+ errors: UnwrapRef<typeof readonlyErrors>
164
+ formData: UnwrapRef<typeof formData>
165
+ invalid: UnwrapRef<typeof invalid>
166
+ readonly: UnwrapRef<typeof readonly>
167
+ status: UnwrapRef<typeof readonlyStatus>
168
+ wrappers: typeof wrappers
169
+ clear: typeof clear
163
170
  ignoreUpdates: typeof ignoreUpdates
164
- invalid: typeof invalid
165
- readonly: typeof readonly
166
- status: typeof readonlyStatus
171
+ reset: typeof reset
167
172
  stopUpdatesWatch: typeof stopUpdatesWatch
168
173
  submit: typeof submit
169
174
  validate: typeof validate
170
- clear: typeof clear
171
- reset: typeof reset
172
- wrappers: typeof wrappers
173
175
  }
174
176
  }>,
175
177
  setup(props, { emit }) {
@@ -300,18 +302,18 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
300
302
  render() {
301
303
  const defaultSlot = () =>
302
304
  this.$slots?.default?.({
305
+ errors: readonlyErrors.value,
306
+ formData: formData.value,
307
+ invalid: invalid.value,
308
+ readonly: readonly.value,
309
+ status: readonlyStatus.value,
310
+ wrappers,
303
311
  clear,
304
- errors: readonlyErrors,
305
- formData,
306
312
  ignoreUpdates,
307
- invalid,
308
- readonly,
309
313
  reset,
310
- status: readonlyStatus,
311
314
  stopUpdatesWatch,
312
315
  submit,
313
316
  validate,
314
- wrappers,
315
317
  }) ?? this.$slots.default
316
318
  return h(
317
319
  this.tag,
@@ -107,8 +107,8 @@ export function defineFormField<Schema extends FormSchema, Type>(formProvideKey:
107
107
  invalid: boolean
108
108
  invalidLabel?: string[]
109
109
  modelValue: any
110
- onUpdate: (value: unknown) => void
111
110
  readonly: boolean
111
+ onUpdate: (value: unknown) => void
112
112
  submit?: InjectedFormData<Schema, Type>['submit']
113
113
  validate?: InjectedFormData<Schema, Type>['validate']
114
114
  }
@@ -286,8 +286,8 @@ export function defineFormField<Schema extends FormSchema, Type>(formProvideKey:
286
286
  invalid: invalid.value,
287
287
  invalidLabel: invalidLabel.value,
288
288
  modelValue: modelValue.value,
289
- onUpdate,
290
289
  readonly: isReadonly.value,
290
+ onUpdate,
291
291
  submit: injectedFormData?.submit,
292
292
  validate: injectedFormData?.validate,
293
293
  }) ?? slots.default
@@ -1,12 +1,10 @@
1
1
  import {
2
- type Component,
3
2
  type DeepReadonly,
4
3
  type InjectionKey,
5
4
  type Ref,
6
5
  type SlotsType,
7
6
  computed,
8
7
  defineComponent,
9
- getCurrentInstance,
10
8
  h,
11
9
  inject,
12
10
  onBeforeUnmount,
@@ -54,15 +52,15 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
54
52
  slots: Object as SlotsType<{
55
53
  default: {
56
54
  errors?: DeepReadonly<z.inferFormattedError<Schema>>
55
+ fieldsErrors: Map<string, inferFormattedError<Schema, string>>
57
56
  formData?: undefined extends Type ? Partial<z.infer<Schema>> : Type
58
57
  formErrors?: DeepReadonly<inferFormattedError<Schema, string>>
59
58
  invalid: boolean
59
+ clear?: InjectedFormData<Schema, Type>['clear']
60
+ reset?: InjectedFormData<Schema, Type>['reset']
60
61
  submit?: InjectedFormData<Schema, Type>['submit']
61
62
  validate?: InjectedFormData<Schema, Type>['validate']
62
63
  validateWrapper?: () => Promise<boolean>
63
- fieldsErrors: Map<string, inferFormattedError<Schema, string>>
64
- clear?: InjectedFormData<Schema, Type>['clear']
65
- reset?: InjectedFormData<Schema, Type>['reset']
66
64
  }
67
65
  }>,
68
66
  setup(props, { emit }) {
@@ -74,12 +72,30 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
74
72
  > = ref(new Map())
75
73
  const { name } = toRefs(props)
76
74
 
75
+ // invalid
76
+ const invalid = computed(() => {
77
+ if (!injectedFormData?.invalid.value) {
78
+ return false
79
+ }
80
+ return fieldsErrors.value.size > 0
81
+ })
82
+ watch(invalid, () => {
83
+ if (invalid.value) {
84
+ emit('invalid')
85
+ }
86
+ else {
87
+ emit('valid')
88
+ }
89
+ })
90
+
77
91
  // provide data to child fields
78
- provide(wrapperProvideKey, {
92
+ const providedData = {
79
93
  name: readonly(name),
80
94
  errors: fieldsErrors,
95
+ invalid: readonly(invalid),
81
96
  fields,
82
- })
97
+ }
98
+ provide(wrapperProvideKey, providedData)
83
99
 
84
100
  // add fields to parent wrapper
85
101
  watch(
@@ -122,25 +138,8 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
122
138
  { deep: true },
123
139
  )
124
140
 
125
- const invalid = computed(() => {
126
- if (!injectedFormData?.invalid.value) {
127
- return false
128
- }
129
- return fieldsErrors.value.size > 0
130
- })
131
-
132
- watch(invalid, () => {
133
- if (invalid.value) {
134
- emit('invalid')
135
- }
136
- else {
137
- emit('valid')
138
- }
139
- })
140
-
141
141
  onMounted(() => {
142
- const instance = getCurrentInstance()
143
- if (!instance || !injectedFormData?.wrappers || !name.value) {
142
+ if (!injectedFormData?.wrappers || !name.value) {
144
143
  console.warn('[@volverjs/form-vue]: Invalid wrapper registration state')
145
144
  return
146
145
  }
@@ -148,7 +147,7 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
148
147
  console.warn(`[@volverjs/form-vue]: wrapper name "${name.value}" is already used`)
149
148
  return
150
149
  }
151
- injectedFormData.wrappers.set(name.value, instance as unknown as Component)
150
+ injectedFormData.wrappers.set(name.value, providedData)
152
151
  })
153
152
  onBeforeUnmount(() => {
154
153
  if (injectedFormData?.wrappers && name.value) {
@@ -161,12 +160,12 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
161
160
  }
162
161
 
163
162
  return {
164
- clear: injectedFormData?.clear,
165
163
  errors: injectedFormData?.errors,
166
164
  fields,
167
165
  fieldsErrors,
168
166
  formData: injectedFormData?.formData,
169
167
  invalid,
168
+ clear: injectedFormData?.clear,
170
169
  reset: injectedFormData?.reset,
171
170
  submit: injectedFormData?.submit,
172
171
  validate: injectedFormData?.validate,
@@ -176,11 +175,11 @@ export function defineFormWrapper<Schema extends FormSchema, Type>(formProvideKe
176
175
  render() {
177
176
  const defaultSlot = () =>
178
177
  this.$slots.default?.({
179
- clear: this.clear,
180
178
  errors: this.errors,
181
179
  fieldsErrors: this.fieldsErrors,
182
180
  formData: this.formData,
183
181
  invalid: this.invalid,
182
+ clear: this.clear,
184
183
  reset: this.reset,
185
184
  submit: this.submit,
186
185
  validate: this.validate,
package/src/index.ts CHANGED
@@ -39,23 +39,23 @@ function _formType<Schema extends FormSchema, Type>(schema: Schema, options: For
39
39
  >
40
40
 
41
41
  // create components
42
- const VvFormWrapper = defineFormWrapper(
42
+ const VvFormWrapper = defineFormWrapper<Schema, Type>(
43
43
  formInjectionKey,
44
44
  formWrapperInjectionKey,
45
45
  )
46
- const VvFormField = defineFormField(
46
+ const VvFormField = defineFormField<Schema, Type>(
47
47
  formInjectionKey,
48
48
  formWrapperInjectionKey,
49
49
  formFieldInjectionKey,
50
50
  options,
51
51
  )
52
- const VvFormFieldsGroup = defineFormFieldsGroup(
52
+ const VvFormFieldsGroup = defineFormFieldsGroup<Schema, Type>(
53
53
  formInjectionKey,
54
54
  formWrapperInjectionKey,
55
55
  formFieldsGroupInjectionKey,
56
56
  )
57
- const VvFormTemplate = defineFormTemplate(formInjectionKey, VvFormField)
58
- const wrappers = new Map<string, typeof VvFormWrapper>()
57
+ const VvFormTemplate = defineFormTemplate<Schema, Type>(formInjectionKey, VvFormField)
58
+ const wrappers = new Map<string, InjectedFormWrapperData<Schema>>()
59
59
  const {
60
60
  clear,
61
61
  errors,
package/src/types.ts CHANGED
@@ -67,13 +67,14 @@ export type InjectedFormData<Schema extends FormSchema, Type> = {
67
67
  status: Readonly<Ref<FormStatus | undefined>>
68
68
  invalid: Readonly<Ref<boolean>>
69
69
  readonly: Ref<boolean>
70
- wrappers: Map<string, Component>
70
+ wrappers: Map<string, InjectedFormWrapperData<Schema>>
71
71
  }
72
72
 
73
73
  export type InjectedFormWrapperData<Schema extends FormSchema> = {
74
- name: Ref<string>
75
- fields: Ref<Map<string, string>>
74
+ name: Readonly<Ref<string>>
76
75
  errors: Ref<Map<string, z.inferFormattedError<Schema>>>
76
+ invalid: Readonly<Ref<boolean>>
77
+ fields: Ref<Map<string, string>>
77
78
  }
78
79
 
79
80
  export type InjectedFormFieldData<Schema extends FormSchema> = {