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