@volverjs/form-vue 1.1.4 → 1.1.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/README.md CHANGED
@@ -44,7 +44,8 @@ npm install @volverjs/form-vue --save
44
44
  ```typescript
45
45
  import { createApp } from 'vue'
46
46
  import { createForm } from '@volverjs/form-vue'
47
- import { z } from 'zod/v3'
47
+ // Zod 4. The library also supports Zod 3.25+ via `import { z } from 'zod/v3'`.
48
+ import { z } from 'zod'
48
49
 
49
50
  const schema = z.object({
50
51
  firstName: z.string(),
@@ -153,7 +154,7 @@ The **default settings** are **inherited** from the plugin (if it's installed).
153
154
  ```vue
154
155
  <script lang="ts" setup>
155
156
  import { useForm } from '@volverjs/form-vue'
156
- import { z } from 'zod/v3'
157
+ import { z } from 'zod'
157
158
 
158
159
  const schema = z.object({
159
160
  firstName: z.string(),
@@ -184,7 +185,7 @@ const { VvForm, VvFormWrapper, VvFormField } = useForm(schema, {
184
185
 
185
186
  ```ts
186
187
  import { useForm } from '@volverjs/form-vue'
187
- import { z } from 'zod/v3'
188
+ import { z } from 'zod'
188
189
 
189
190
  const schema = z.object({
190
191
  firstName: z.string(),
@@ -464,7 +465,7 @@ Forms can also be created using a template. A template is an **array of objects*
464
465
  ```vue
465
466
  <script lang="ts" setup>
466
467
  import { useForm } from '@volverjs/form-vue'
467
- import { z } from 'zod/v3'
468
+ import { z } from 'zod'
468
469
 
469
470
  const schema = z.object({
470
471
  firstName: z.string(),
@@ -542,7 +543,7 @@ Conditional rendering can be achieved using the `vvIf` and `vvElseIf` properties
542
543
  ```vue
543
544
  <script lang="ts" setup>
544
545
  import { useForm } from '@volverjs/form-vue'
545
- import { z } from 'zod/v3'
546
+ import { z } from 'zod'
546
547
 
547
548
  const schema = z.object({
548
549
  firstName: z.string(),
@@ -658,7 +659,7 @@ const templateSchema = [
658
659
  It can be useful to create a **default object** for a **form**. The default object is created by the default values of the schema and can be merged with an other object passed as parameter.
659
660
 
660
661
  ```ts
661
- import { z } from 'zod/v3'
662
+ import { z } from 'zod'
662
663
  import { defaultObjectBySchema } from '@volverjs/form-vue'
663
664
 
664
665
  const schema = z.object({
@@ -676,7 +677,7 @@ const defaultObject = defaultObjectBySchema(schema, { name: 'Jane' })
676
677
  `defaultObjectBySchema` can be used with nested objects.
677
678
 
678
679
  ```ts
679
- import { z } from 'zod/v3'
680
+ import { z } from 'zod'
680
681
  import { defaultObjectBySchema } from '@volverjs/form-vue'
681
682
 
682
683
  const schema = z.object({
@@ -695,7 +696,7 @@ const defaultObject = defaultObjectBySchema(schema)
695
696
  Other Zod methods are also supported: [`z.nullable()`](https://github.com/colinhacks/zod#nullable), [`z.coerce`](https://github.com/colinhacks/zod#coercion-for-primitives) and [`z.passthrough()`](https://github.com/colinhacks/zod#passthrough).
696
697
 
697
698
  ```ts
698
- import { z } from 'zod/v3'
699
+ import { z } from 'zod'
699
700
  import { defaultObjectBySchema } from '@volverjs/form-vue'
700
701
 
701
702
  const schema = z
package/dist/index.es.js CHANGED
@@ -175,26 +175,28 @@ function he(t, r, a, s, f) {
175
175
  return m.value = void 0, h.value = k.valid, x.value = w(r.data), !0;
176
176
  }, E = () => {
177
177
  m.value = void 0, h.value = void 0, C = void 0;
178
- }, D = () => {
179
- x.value = w(), E(), h.value = k.reset;
180
- }, O = async (e) => S.value || !await T(void 0, e) ? !1 : (h.value = k.submitting, !0), { ignoreUpdates: A, stop: j } = b(x, () => {
178
+ }, { ignoreUpdates: D, stop: O } = b(x, () => {
181
179
  h.value = k.updated;
182
180
  }, {
183
181
  deep: !0,
184
182
  eventFilter: y(a?.updateThrottle ?? 500)
185
- }), M = u(m), N = u(h);
183
+ }), A = () => {
184
+ D(() => {
185
+ x.value = w();
186
+ }), E(), h.value = k.reset;
187
+ }, j = async (e) => S.value || !await T(void 0, e) ? !1 : (h.value = k.submitting, !0), M = u(m), N = u(h);
186
188
  return {
187
189
  clear: E,
188
190
  errors: m,
189
191
  formData: x,
190
- ignoreUpdates: A,
192
+ ignoreUpdates: D,
191
193
  invalid: g,
192
194
  readonly: S,
193
- reset: D,
195
+ reset: A,
194
196
  status: h,
195
197
  wrappers: f,
196
- stopUpdatesWatch: j,
197
- submit: O,
198
+ stopUpdatesWatch: O,
199
+ submit: j,
198
200
  validate: T,
199
201
  VvForm: n({
200
202
  name: "VvForm",
@@ -298,26 +300,26 @@ function he(t, r, a, s, f) {
298
300
  clear: E,
299
301
  errors: M,
300
302
  formData: x,
301
- ignoreUpdates: A,
303
+ ignoreUpdates: D,
302
304
  invalid: g,
303
305
  readonly: S,
304
- reset: D,
306
+ reset: A,
305
307
  status: N,
306
- stopUpdatesWatch: j,
307
- submit: O,
308
+ stopUpdatesWatch: O,
309
+ submit: j,
308
310
  validate: T,
309
311
  wrappers: f
310
312
  }), {
311
313
  clear: E,
312
314
  errors: M,
313
315
  formData: x,
314
- ignoreUpdates: A,
316
+ ignoreUpdates: D,
315
317
  invalid: g,
316
318
  isReadonly: S,
317
- reset: D,
319
+ reset: A,
318
320
  status: N,
319
- stopUpdatesWatch: j,
320
- submit: () => O({
321
+ stopUpdatesWatch: O,
322
+ submit: () => j({
321
323
  superRefine: e.superRefine,
322
324
  fields: new Set(e.validateFields)
323
325
  }),
@@ -334,10 +336,10 @@ function he(t, r, a, s, f) {
334
336
  status: N.value,
335
337
  wrappers: f,
336
338
  clear: E,
337
- ignoreUpdates: A,
338
- reset: D,
339
- stopUpdatesWatch: j,
340
- submit: O,
339
+ ignoreUpdates: D,
340
+ reset: A,
341
+ stopUpdatesWatch: O,
342
+ submit: j,
341
343
  validate: T
342
344
  }) ?? this.$slots.default;
343
345
  return i(this.tag, {
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("@vueuse/core"),require("zod/v3"),require("zod/v4/core"),require("dot-prop")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`@vueuse/core`,`zod/v3`,`zod/v4/core`,`dot-prop`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`@volverjs/form-vue`]={},e.Vue,e.VueUseCore,e.zodV3,e.zodV4Core,e.dotProp))})(this,function(e,t,n,r,i,a){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var o=function(e){return e.text=`text`,e.number=`number`,e.email=`email`,e.password=`password`,e.tel=`tel`,e.url=`url`,e.search=`search`,e.date=`date`,e.time=`time`,e.datetimeLocal=`datetime-local`,e.month=`month`,e.week=`week`,e.color=`color`,e.select=`select`,e.checkbox=`checkbox`,e.radio=`radio`,e.textarea=`textarea`,e.radioGroup=`radioGroup`,e.checkboxGroup=`checkboxGroup`,e.combobox=`combobox`,e.custom=`custom`,e}({}),s=function(e){return e.invalid=`invalid`,e.valid=`valid`,e.submitting=`submitting`,e.reset=`reset`,e.updated=`updated`,e.unknown=`unknown`,e}({});function c(e){return Array.isArray(e)?`array`:e===null?`null`:typeof e}function l(e,t){let n=c(e);return t.type?Array.isArray(t.type)?t.type.some(t=>t===n||t===`integer`&&n===`number`&&Number.isInteger(e)):t.type===n||t.type===`integer`&&n===`number`&&Number.isInteger(e):!0}var u=e=>e._def.typeName===`ZodObject`,d=e=>e._zod.def.type===`object`,f=e=>e._def.typeName===`ZodDefault`,p=e=>e._zod.def.type==="default",m=e=>e._def.typeName===`ZodNullable`,h=e=>e._zod.def.type===`nullable`,g=e=>e._def.typeName===`ZodRecord`,_=e=>e._zod.def.type===`record`,v=e=>e._def.typeName===`ZodArray`,y=e=>e._zod.def.type===`array`,b=e=>e._def.typeName===`ZodEffects`,x=e=>e._def.typeName===`ZodOptional`,S=e=>e._zod.def.type===`optional`,C=e=>e._zod.def.type===`pipe`,w=e=>e._zod.def.type===`transform`;function T(e){let t=e;for(;b(t);)t=t.innerType();return t}function E(e){let t=e;for(;C(t);)t=w(t._zod.def.out)?t._zod.def.in:t._zod.def.out;return t}var D=e=>{let t=T(e);return x(t)&&(t=t._def.innerType),t},O=e=>{let t=E(e);return S(t)&&(t=t._zod.def.innerType),t},k=e=>!!x(T(e)),A=e=>!!S(E(e));function j(e,t){if(e.length===0)return t??void 0;if(t!==void 0){for(let n of e)if(l(t,n))return M(n,t);for(let n of e){let e=n;if(!e.type||e.type===`object`)return M(e,t)}}return M(e[0],t)}function M(e,t){if(`const`in e)return e.const;if(e.anyOf&&Array.isArray(e.anyOf))return j(e.anyOf,t);if(e.oneOf&&Array.isArray(e.oneOf))return j(e.oneOf,t);if(e.allOf&&Array.isArray(e.allOf)){let n={...e,allOf:void 0};for(let t of e.allOf){let e=t;e.properties&&(n.properties={...n.properties,...e.properties}),e.type&&!n.type&&(n.type=e.type)}return M(n,t)}if(Array.isArray(e.type)){if(t===null&&e.type.includes(`null`))return null;let n=e.type.find(e=>e!==`null`);return n?M({...e,type:n},t):e.default??null}if(e.type!==`object`||!e.properties)switch(e.type){case`string`:return typeof t==`string`?t:e.default;case`number`:case`integer`:return typeof t==`number`?t:e.default;case`boolean`:return typeof t==`boolean`?t:e.default;case`null`:return t===null?t:e.default;case`array`:return Array.isArray(t)?e.items?t.map(t=>M(e.items,t)):t:e.default;default:return e.default}let n=e.properties,r=t&&typeof t==`object`&&!Array.isArray(t)?t:void 0,i={};for(let e in n){let t=r?.[e];i[e]=M(n[e],t)}if(r&&e.additionalProperties!==!1){let e=new Set(Object.keys(n));for(let[t,n]of Object.entries(r))e.has(t)||(i[t]=n)}return i}var N=e=>`_zod`in e,P={getInnerType:D,isObject:u,hasUnknownKeys:e=>e._def.unknownKeys===`passthrough`,getShapeEntries:e=>`shape`in e?Object.entries(e.shape):[],isOptional:k,isDefault:f,getDefaultValue:e=>e._def.defaultValue(),getDefaultInnerType:e=>e._def.innerType,isNullable:m,safeParse:(e,t)=>e.safeParse(t),isArray:v,getArrayElement:e=>e._def.type,isRecord:g,getRecordValue:e=>e._def.valueType},F={getInnerType:O,isObject:d,hasUnknownKeys:e=>!!(e._zod.def.catchall&&e._zod.def.catchall._zod.def.type!==`never`),getShapeEntries:e=>`shape`in e._zod.def?Object.entries(e._zod.def.shape):[],isOptional:A,isDefault:p,getDefaultValue:e=>e._zod.def.defaultValue,getDefaultInnerType:e=>e._zod.def.innerType,isNullable:h,safeParse:(e,t)=>(0,i.safeParse)(e,t),isArray:y,getArrayElement:e=>e._zod.def.element,isRecord:_,getRecordValue:e=>e._zod.def.valueType};function I(e,t,n){let r=e.getInnerType(e.getArrayElement(t));return e.isObject(r)?n.map(t=>z(e,r,t)):n}function L(e,t,n){let r=e.getInnerType(e.getRecordValue(t));return e.isObject(r)?Object.keys(n).reduce((t,i)=>(t[i]=z(e,r,n[i]),t),{}):n}function R(e,t,n,r){let i=e.isOptional(n),a=e.getInnerType(n),o;if(e.isDefault(a)&&(o=e.getDefaultValue(a),a=e.getDefaultInnerType(a)),r===null&&e.isNullable(a))return[t,r];if(r==null&&i)return[t,o];if(a&&r!==void 0){let i=e.safeParse(n,r);if(i.success)return[t,i.data??o]}return e.isArray(a)&&Array.isArray(r)?[t,I(e,a,r)]:e.isRecord(a)&&r?[t,L(e,a,r)]:e.isObject(a)?[t,z(e,a,r&&typeof r==`object`?r:o)]:[t,o]}function z(e,t,n){let r=n&&typeof n==`object`&&!Array.isArray(n)?n:{};return{...e.hasUnknownKeys(t)?r:{},...Object.fromEntries(e.getShapeEntries(t).map(([t,n])=>R(e,t,n,r[t])))}}function B(e,t={}){let n=N(e)?F:P,r=n.getInnerType(e);return n.isObject(r)?z(n,r,t):t}var V=(e,t)=>N(e)?(0,i.safeParseAsync)(e,t):e.safeParseAsync(t),H=(e,t)=>N(e)?(0,i.formatError)(t):t.format(),U=(e,t)=>N(e)?(0,i.formatError)(new i.$ZodError(t)):new r.ZodError(t).format();function W(e,r,i,a,o){let c=(0,t.ref)(),l=(0,t.ref)(),u=(0,t.computed)(()=>l.value===s.invalid),d=(0,t.ref)(),f=(0,t.ref)(!1),p,m=t=>{let n=B(e,t);if(i?.class){let e=i.class;return new e(n)}return n},h=async(t=d.value,n)=>{if(p=n?.fields,f.value)return!0;let r=await V(e,t);if(!r.success){if(l.value=s.invalid,!p?.size)return c.value=H(e,r.error),!1;let t=r.error.issues.filter(e=>p?.has(e.path.join(`.`)));return t.length?(c.value=U(e,t),!1):(c.value=void 0,!0)}return c.value=void 0,l.value=s.valid,d.value=m(r.data),!0},g=()=>{c.value=void 0,l.value=void 0,p=void 0},_=()=>{d.value=m(),g(),l.value=s.reset},v=async e=>f.value||!await h(void 0,e)?!1:(l.value=s.submitting,!0),{ignoreUpdates:y,stop:b}=(0,n.watchIgnorable)(d,()=>{l.value=s.updated},{deep:!0,eventFilter:(0,n.throttleFilter)(i?.updateThrottle??500)}),x=(0,t.readonly)(c),S=(0,t.readonly)(l);return{clear:g,errors:c,formData:d,ignoreUpdates:y,invalid:u,readonly:f,reset:_,status:l,wrappers:o,stopUpdatesWatch:b,submit:v,validate:h,VvForm:(0,t.defineComponent)({name:`VvForm`,props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:i?.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(e,{emit:n}){return d.value=m((0,t.toRaw)(e.modelValue)),(0,t.watch)(()=>e.modelValue,e=>{if(e){let n=(0,t.isProxy)(e)?(0,t.toRaw)(e):e;if(JSON.stringify(n)===JSON.stringify((0,t.toRaw)(d.value)))return;d.value=m(n)}},{deep:!0}),(0,t.watch)(l,async r=>{if(r===s.invalid){let e=(0,t.toRaw)(c.value);n(`invalid`,e),i?.onInvalid?.(e);return}if(r===s.valid){let e=(0,t.toRaw)(d.value);n(`valid`,e),i?.onValid?.(e),n(`update:modelValue`,e),i?.onUpdate?.(e);return}if(r===s.submitting){let e=(0,t.toRaw)(d.value);n(`submit`,e),i?.onSubmit?.(e);return}if(r===s.reset){let e=(0,t.toRaw)(d.value);n(`reset`,e),i?.onReset?.(e);return}if(r===s.updated){if((c.value||i?.continuousValidation||e.continuousValidation)&&await h(void 0,{superRefine:e.superRefine,fields:p??new Set(e.validateFields)}),!d.value||!e.modelValue||JSON.stringify(d.value)!==JSON.stringify(e.modelValue)){let e=(0,t.toRaw)(d.value);n(`update:modelValue`,e),i?.onUpdate?.(e)}l.value===s.updated&&(l.value=s.unknown)}}),(0,t.onMounted)(()=>{e.readonly!==void 0&&(f.value=e.readonly)}),(0,t.watch)(()=>e.readonly,e=>{f.value=e}),(0,t.watch)(f,t=>{t!==e.readonly&&n(`update:readonly`,f.value)}),(0,t.provide)(r,{clear:g,errors:x,formData:d,ignoreUpdates:y,invalid:u,readonly:f,reset:_,status:S,stopUpdatesWatch:b,submit:v,validate:h,wrappers:o}),{clear:g,errors:x,formData:d,ignoreUpdates:y,invalid:u,isReadonly:f,reset:_,status:S,stopUpdatesWatch:b,submit:()=>v({superRefine:e.superRefine,fields:new Set(e.validateFields)}),validate:h,wrappers:o}},render(){let e=()=>this.$slots?.default?.({errors:x.value,formData:d.value,invalid:u.value,readonly:f.value,status:S.value,wrappers:o,clear:g,ignoreUpdates:y,reset:_,stopUpdatesWatch:b,submit:v,validate:h})??this.$slots.default;return(0,t.h)(this.tag,{onSubmit:(0,t.withModifiers)(this.submit,[`prevent`]),onReset:(0,t.withModifiers)(this.reset,[`prevent`])},(this.template??i?.template)&&a?[(0,t.h)(a,{schema:this.template??i?.template},{default:e})]:{default:e})}})}}function G(e,n,r,i){return(0,t.defineComponent)({name:`VvFormField`,props:{type:{type:String,validator:e=>Object.values(o).includes(e),default:o.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(s,{slots:c,emit:l}){let{props:u,name:d}=(0,t.toRefs)(s),f=(0,t.useId)(),p=(0,t.inject)(n,void 0);p&&p.fields.value.set(f,s.name);let m=(0,t.inject)(e),h=(0,t.computed)({get(){if(m?.formData)return(0,a.getProperty)(new Object(m.formData.value),String(s.name))},set(e){m?.formData&&((0,a.setProperty)(new Object(m.formData.value),String(s.name),e),l(`update:modelValue`,{newValue:h.value,formData:m?.formData}))}});(0,t.onMounted)(()=>{h.value===void 0&&s.defaultValue!==void 0&&(h.value=s.defaultValue)}),(0,t.onBeforeUnmount)(()=>{p&&p.fields.value.delete(f)});let g=(0,t.computed)(()=>{if(m?.errors.value)return(0,a.getProperty)(m.errors.value,String(s.name))}),_=(0,t.computed)(()=>g.value?._errors),v=(0,t.computed)(()=>g.value!==void 0),y=(0,t.watch)(v,e=>{if(e){l(`invalid`,g.value),p&&p.errors.value.set(String(s.name),g.value);return}l(`valid`,h.value),p&&p.errors.value.delete(s.name)}),b=(0,t.watch)(()=>m?.formData,()=>{l(`update:formData`,m?.formData)},{deep:!0});(0,t.onBeforeUnmount)(()=>{y(),b()});let x=e=>{e instanceof InputEvent&&(e=e.target.value),h.value=e},S=(0,t.computed)(()=>{let e=u.value;return typeof e==`function`&&(e=e(m?.formData)),Object.keys(e).reduce((n,r)=>(n[r]=(0,t.unref)(e[r]),n),{})}),C=(0,t.computed)(()=>m?.readonly.value||p?.readonly.value?!0:S.value.readonly??s.readonly),w=(0,t.computed)(()=>({...S.value,name:S.value.name??s.name,invalid:v.value,valid:s.showValid?!!(!v.value&&h.value):void 0,type:(e=>{if([o.color,o.date,o.datetimeLocal,o.email,o.month,o.number,o.password,o.search,o.tel,o.text,o.time,o.url,o.week].includes(e))return e})(s.type),invalidLabel:_.value,modelValue:h.value,readonly:C.value,"onUpdate:modelValue":x}));return(0,t.provide)(r,{name:(0,t.readonly)(d),errors:(0,t.readonly)(g)}),{component:(0,t.computed)(()=>{if(s.type===o.custom)return{render(){return c.default?.({errors:(0,t.readonly)(g).value,formData:m?.formData.value,formErrors:m?.errors.value,invalid:v.value,invalidLabel:_.value,modelValue:h.value,readonly:C.value,onUpdate:x,submit:m?.submit,validate:m?.validate})??c.default}};if(!(i?.lazyLoad??s.lazyLoad)){let e;switch(s.type){case o.select:e=(0,t.resolveComponent)(`VvSelect`);break;case o.checkbox:e=(0,t.resolveComponent)(`VvCheckbox`);break;case o.radio:e=(0,t.resolveComponent)(`VvRadio`);break;case o.textarea:e=(0,t.resolveComponent)(`VvTextarea`);break;case o.radioGroup:e=(0,t.resolveComponent)(`VvRadioGroup`);break;case o.checkboxGroup:e=(0,t.resolveComponent)(`VvCheckboxGroup`);break;case o.combobox:e=(0,t.resolveComponent)(`VvCombobox`);break;default:e=(0,t.resolveComponent)(`VvInputText`)}if(typeof e!=`string`)return e;console.warn(`[@volverjs/form-vue]: ${e} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return(0,t.defineAsyncComponent)(async()=>{switch(i?.sideEffects&&await Promise.resolve(i.sideEffects(s.type)),s.type){case o.textarea:return import(`@volverjs/ui-vue/vv-textarea`);case o.radio:return import(`@volverjs/ui-vue/vv-radio`);case o.radioGroup:return import(`@volverjs/ui-vue/vv-radio-group`);case o.checkbox:return import(`@volverjs/ui-vue/vv-checkbox`);case o.checkboxGroup:return import(`@volverjs/ui-vue/vv-checkbox-group`);case o.select:return import(`@volverjs/ui-vue/vv-select`);case o.combobox:return import(`@volverjs/ui-vue/vv-combobox`)}return import(`@volverjs/ui-vue/vv-input-text`)})}),hasProps:w,invalid:v}},render(){return this.is?(0,t.h)(this.is,this.hasProps,this.$slots):this.type===o.custom?(0,t.h)(this.component,null,this.$slots):(0,t.h)(this.component,this.hasProps,this.$slots)}})}function K(e,n,r){return(0,t.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(i,{slots:o,emit:s}){let{props:c,names:l,defaultValues:u}=(0,t.toRefs)(i),d=(0,t.useId)(),f=(0,t.computed)(()=>Array.isArray(l.value)?l.value:Object.values(l.value)),p=(0,t.computed)(()=>Array.isArray(l.value)?l.value:Object.keys(l.value)),m=(0,t.computed)(()=>Array.isArray(l.value)?l.value.reduce((e,t)=>(e[String(t)]=t,e),{}):l.value),h=(0,t.computed)(()=>Object.keys(m.value).reduce((e,t)=>(e[String(m.value[t])]=t,e),{})),g=(0,t.inject)(n,void 0);g&&f.value.forEach(e=>{g.fields.value.set(`${d}-${e}`,e)});let _=(0,t.inject)(e),v=(0,t.computed)({get(){return _?.formData?p.value.reduce((e,t)=>(e[t]=(0,a.getProperty)(new Object(_.formData.value),m.value[t]),e),{}):{}},set(e){_?.formData&&(p.value.forEach(t=>{(0,a.setProperty)(new Object(_.formData.value),m.value[t],e?.[t])}),s(`update:modelValue`,{newValue:v.value,formData:_?.formData}))}});(0,t.onMounted)(()=>{u.value&&f.value.forEach(e=>{u.value?.[e]!==void 0&&v.value[e]===void 0&&(v.value={...v.value,[e]:u.value?.[e]})})}),(0,t.onBeforeUnmount)(()=>{g&&f.value.forEach(e=>{g.fields.value.delete(`${d}-${e}`)})});let y=(0,t.computed)(()=>{if(!_?.errors.value)return;let e=f.value.reduce((e,t)=>{if(!_.errors.value)return e;let n=(0,a.getProperty)(_.errors.value,String(t));return n===void 0||(e[String(t)]=n),e},{});if(Object.keys(e).length!==0)return e}),b=(0,t.computed)(()=>{if(!y.value)return;let e=Object.keys(y.value).reduce((e,t)=>(y.value?.[t]&&(e[h.value[t]]=y.value[t]._errors),e),{});if(Object.keys(e).length!==0)return e}),x=(0,t.computed)(()=>y.value!==void 0),S=(0,t.computed)(()=>p.value.reduce((e,t)=>(e[t]=!!y.value?.[m.value[t]],e),{})),C=(0,t.watch)(x,()=>{if(x.value){s(`invalid`,y.value),g&&f.value.forEach(e=>{if(!y.value?.[e]){g.errors.value.delete(e);return}g.errors.value.set(e,y.value?.[e])});return}s(`valid`,v.value),g&&f.value.forEach(e=>{g.errors.value.delete(e)})}),w=(0,t.watch)(()=>_?.formData,()=>{s(`update:formData`,_?.formData)},{deep:!0});(0,t.onBeforeUnmount)(()=>{C(),w()});let T=e=>{v.value=e},E=(e,t)=>{t instanceof InputEvent&&(t=t.target.value),p.value.includes(e)&&(v.value={...v.value,[e]:t})},D=(0,t.computed)(()=>{let e=c.value;return typeof e==`function`&&(e=e(_?.formData)),Object.keys(e).reduce((n,r)=>(n[r]=(0,t.unref)(e[r]),n),{})}),O=(0,t.computed)(()=>_?.readonly.value?!0:D.value.readonly??i.readonly),k=(0,t.computed)(()=>p.value.reduce((e,t)=>(e[`onUpdate:${t}`]=e=>{E(t,e)},e),{"onUpdate:modelValue":T})),A=(0,t.computed)(()=>({...k.value,...D.value,...v.value,modelValue:v.value,names:D.value.name??f.value,invalid:x.value,invalids:S.value,valid:i.showValid?!!(!x.value&&v.value):void 0,invalidLabels:b.value,readonly:O.value}));return(0,t.provide)(r,{names:(0,t.readonly)(l),errors:(0,t.readonly)(y)}),{component:(0,t.computed)(()=>({render(){return o.default?.({errors:y.value,formData:_?.formData.value,formErrors:_?.errors.value,invalid:x.value,invalids:S.value,invalidLabels:b.value,modelValue:v.value,onUpdate:T,onUpdateField:E,readonly:O.value,submit:_?.submit,validate:_?.validate})??o.default}})),hasProps:A,invalid:x}},render(){return this.is?(0,t.h)(this.is,this.hasProps,this.$slots):(0,t.h)(this.component,null,this.$slots)}})}function q(e,n){return(0,t.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(r,{emit:i}){let a=(0,t.inject)(e),o=(0,t.inject)(n,void 0),s=(0,t.ref)(new Map),c=(0,t.ref)(new Map),{name:l}=(0,t.toRefs)(r),u=(0,t.computed)(()=>a?.invalid.value?c.value.size>0:!1);(0,t.watch)(u,e=>{if(e){i(`invalid`);return}i(`valid`)});let d=(0,t.computed)(()=>a?.readonly.value||r.readonly),f={name:(0,t.readonly)(l),errors:c,invalid:(0,t.readonly)(u),readonly:(0,t.readonly)(d),fields:s};return(0,t.provide)(n,f),(0,t.watch)((0,t.computed)(()=>new Map(s.value)),(e,t)=>{o?.fields&&(t.forEach((t,n)=>{e.has(n)||o?.fields.value.delete(n)}),e.forEach((e,t)=>{o?.fields.value.has(t)||o?.fields.value.set(t,e)}))},{deep:!0}),(0,t.watch)(c,e=>{o?.errors&&s.value.forEach(t=>{if(e.has(t)||o.errors.value.delete(t),e.has(t)){let n=e.get(t);n&&o.errors.value.set(t,n)}})},{deep:!0}),(0,t.onMounted)(()=>{if(!a?.wrappers||!l.value){console.warn(`[@volverjs/form-vue]: Invalid wrapper registration state`);return}if(a.wrappers.has(l.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${l.value}" is already used`);return}a.wrappers.set(l.value,f)}),(0,t.onBeforeUnmount)(()=>{a?.wrappers&&l.value&&a.wrappers.delete(l.value)}),{errors:a?.errors,fields:s,fieldsErrors:c,formData:a?.formData,invalid:u,readonly:d,clear:a?.clear,reset:a?.reset,submit:a?.submit,validate:a?.validate,validateWrapper:()=>a?.validate(void 0,{fields:new Set(s.value.values())})??Promise.resolve(!0)}},render(){let e=()=>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?(0,t.h)(this.tag,null,{default:e}):e()}})}function J(e,n){let r=(0,t.defineComponent)({name:`VvFormTemplate`,props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(i,{slots:o}){let s=(0,t.inject)(e);if(s?.formData)return()=>{let e=typeof i.schema==`function`?i.schema(s,i.scope):i.schema,c,l=e.reduce((e,o)=>{let{vvIs:l,vvName:u,vvSlots:d,vvChildren:f,vvIf:p,vvElseIf:m,vvType:h,vvDefaultValue:g,vvShowValid:_,vvContent:v,...y}=typeof o==`function`?o(s,i.scope):o;if(p!==void 0){if(c=typeof p==`string`?!!(0,a.getProperty)(new Object(s.formData.value),p):typeof p==`function`?(0,t.unref)(p(s)):(0,t.unref)(p),!c)return e}else if(m!==void 0&&c!==void 0){if(c||(c=typeof m==`string`?!!(0,a.getProperty)(new Object(s.formData.value),m):typeof m==`function`?(0,t.unref)(m(s)):(0,t.unref)(m),!c))return e}else c=void 0;let b;return f&&(b=typeof l==`string`?(0,t.h)(r,{schema:f}):{default:e=>(0,t.h)(r,{schema:f,scope:e})}),u?(e.push((0,t.h)(n,{name:u,is:l,type:h,defaultValue:g,showValid:_,props:y},d??b??v)),e):l?(e.push((0,t.h)(l,y,d??b??v)),e):(b&&(`default`in b?e.push(b.default(i.scope)):e.push(b)),e)},[]);return l.push(o?.default?.({errors:s?.errors.value,formData:s?.formData.value,invalid:s?.invalid.value,status:s?.status.value,submit:s?.submit,validate:s?.validate,clear:s?.clear,reset:s?.reset})),l}}});return r}function Y(e,t={}){let n=Symbol(`formInjectionKey`),r=Symbol(`formWrapperInjectionKey`),i=Symbol(`formFieldInjectionKey`),a=Symbol(`formFieldsGroupInjectionKey`),o=q(n,r),s=G(n,r,i,t),c=K(n,r,a),l=J(n,s),u=new Map,{clear:d,errors:f,formData:p,ignoreUpdates:m,invalid:h,readonly:g,reset:_,status:v,stopUpdatesWatch:y,submit:b,validate:x,VvForm:S}=W(e,n,t,l,u);return{clear:d,errors:f,formData:p,formFieldInjectionKey:i,formInjectionKey:n,formWrapperInjectionKey:r,ignoreUpdates:m,invalid:h,readonly:g,reset:_,status:v,stopUpdatesWatch:y,submit:b,validate:x,wrappers:u,VvForm:S,VvFormField:s,VvFormFieldsGroup:c,VvFormTemplate:l,VvFormWrapper:o}}var X=Symbol(`pluginInjectionKey`);function Z(e){let t={};return e.schema&&(t=Y(e.schema,e)),{...t,install(n,{global:r=!1}={}){n.provide(X,e),r&&(n.config.globalProperties.$vvForm=e,t?.VvForm&&n.component(`VvForm`,t.VvForm),t?.VvFormWrapper&&n.component(`VvFormWrapper`,t.VvFormWrapper),t?.VvFormField&&n.component(`VvFormField`,t.VvFormField),t?.VvFormFieldsGroup&&n.component(`VvFormFieldsGroup`,t.VvFormFieldsGroup),t?.VvFormTemplate&&n.component(`VvFormTemplate`,t.VvFormTemplate))}}}var Q=new Map;function $(e,n={}){if(n.scope&&Q.has(n.scope))return Q.get(n.scope);if(!(0,t.getCurrentInstance)()){let t=Y(e,n);return n.scope&&Q.set(n.scope,t),t}let r=Y(e,{...(0,t.inject)(X,{}),...n});return n.scope&&Q.set(n.scope,r),r}function ee(e,t={}){return Y(e,t)}e.FormFieldType=o,e.createForm=Z,e.defaultObjectByJSONSchema=M,e.defaultObjectBySchema=B,e.formType=ee,e.pluginInjectionKey=X,e.useForm=$});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("vue"),require("@vueuse/core"),require("zod/v3"),require("zod/v4/core"),require("dot-prop")):typeof define==`function`&&define.amd?define([`exports`,`vue`,`@vueuse/core`,`zod/v3`,`zod/v4/core`,`dot-prop`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`@volverjs/form-vue`]={},e.Vue,e.VueUseCore,e.zodV3,e.zodV4Core,e.dotProp))})(this,function(e,t,n,r,i,a){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var o=function(e){return e.text=`text`,e.number=`number`,e.email=`email`,e.password=`password`,e.tel=`tel`,e.url=`url`,e.search=`search`,e.date=`date`,e.time=`time`,e.datetimeLocal=`datetime-local`,e.month=`month`,e.week=`week`,e.color=`color`,e.select=`select`,e.checkbox=`checkbox`,e.radio=`radio`,e.textarea=`textarea`,e.radioGroup=`radioGroup`,e.checkboxGroup=`checkboxGroup`,e.combobox=`combobox`,e.custom=`custom`,e}({}),s=function(e){return e.invalid=`invalid`,e.valid=`valid`,e.submitting=`submitting`,e.reset=`reset`,e.updated=`updated`,e.unknown=`unknown`,e}({});function c(e){return Array.isArray(e)?`array`:e===null?`null`:typeof e}function l(e,t){let n=c(e);return t.type?Array.isArray(t.type)?t.type.some(t=>t===n||t===`integer`&&n===`number`&&Number.isInteger(e)):t.type===n||t.type===`integer`&&n===`number`&&Number.isInteger(e):!0}var u=e=>e._def.typeName===`ZodObject`,d=e=>e._zod.def.type===`object`,f=e=>e._def.typeName===`ZodDefault`,p=e=>e._zod.def.type==="default",m=e=>e._def.typeName===`ZodNullable`,h=e=>e._zod.def.type===`nullable`,g=e=>e._def.typeName===`ZodRecord`,_=e=>e._zod.def.type===`record`,v=e=>e._def.typeName===`ZodArray`,y=e=>e._zod.def.type===`array`,b=e=>e._def.typeName===`ZodEffects`,x=e=>e._def.typeName===`ZodOptional`,S=e=>e._zod.def.type===`optional`,C=e=>e._zod.def.type===`pipe`,w=e=>e._zod.def.type===`transform`;function T(e){let t=e;for(;b(t);)t=t.innerType();return t}function E(e){let t=e;for(;C(t);)t=w(t._zod.def.out)?t._zod.def.in:t._zod.def.out;return t}var D=e=>{let t=T(e);return x(t)&&(t=t._def.innerType),t},O=e=>{let t=E(e);return S(t)&&(t=t._zod.def.innerType),t},k=e=>!!x(T(e)),A=e=>!!S(E(e));function j(e,t){if(e.length===0)return t??void 0;if(t!==void 0){for(let n of e)if(l(t,n))return M(n,t);for(let n of e){let e=n;if(!e.type||e.type===`object`)return M(e,t)}}return M(e[0],t)}function M(e,t){if(`const`in e)return e.const;if(e.anyOf&&Array.isArray(e.anyOf))return j(e.anyOf,t);if(e.oneOf&&Array.isArray(e.oneOf))return j(e.oneOf,t);if(e.allOf&&Array.isArray(e.allOf)){let n={...e,allOf:void 0};for(let t of e.allOf){let e=t;e.properties&&(n.properties={...n.properties,...e.properties}),e.type&&!n.type&&(n.type=e.type)}return M(n,t)}if(Array.isArray(e.type)){if(t===null&&e.type.includes(`null`))return null;let n=e.type.find(e=>e!==`null`);return n?M({...e,type:n},t):e.default??null}if(e.type!==`object`||!e.properties)switch(e.type){case`string`:return typeof t==`string`?t:e.default;case`number`:case`integer`:return typeof t==`number`?t:e.default;case`boolean`:return typeof t==`boolean`?t:e.default;case`null`:return t===null?t:e.default;case`array`:return Array.isArray(t)?e.items?t.map(t=>M(e.items,t)):t:e.default;default:return e.default}let n=e.properties,r=t&&typeof t==`object`&&!Array.isArray(t)?t:void 0,i={};for(let e in n){let t=r?.[e];i[e]=M(n[e],t)}if(r&&e.additionalProperties!==!1){let e=new Set(Object.keys(n));for(let[t,n]of Object.entries(r))e.has(t)||(i[t]=n)}return i}var N=e=>`_zod`in e,P={getInnerType:D,isObject:u,hasUnknownKeys:e=>e._def.unknownKeys===`passthrough`,getShapeEntries:e=>`shape`in e?Object.entries(e.shape):[],isOptional:k,isDefault:f,getDefaultValue:e=>e._def.defaultValue(),getDefaultInnerType:e=>e._def.innerType,isNullable:m,safeParse:(e,t)=>e.safeParse(t),isArray:v,getArrayElement:e=>e._def.type,isRecord:g,getRecordValue:e=>e._def.valueType},F={getInnerType:O,isObject:d,hasUnknownKeys:e=>!!(e._zod.def.catchall&&e._zod.def.catchall._zod.def.type!==`never`),getShapeEntries:e=>`shape`in e._zod.def?Object.entries(e._zod.def.shape):[],isOptional:A,isDefault:p,getDefaultValue:e=>e._zod.def.defaultValue,getDefaultInnerType:e=>e._zod.def.innerType,isNullable:h,safeParse:(e,t)=>(0,i.safeParse)(e,t),isArray:y,getArrayElement:e=>e._zod.def.element,isRecord:_,getRecordValue:e=>e._zod.def.valueType};function I(e,t,n){let r=e.getInnerType(e.getArrayElement(t));return e.isObject(r)?n.map(t=>z(e,r,t)):n}function L(e,t,n){let r=e.getInnerType(e.getRecordValue(t));return e.isObject(r)?Object.keys(n).reduce((t,i)=>(t[i]=z(e,r,n[i]),t),{}):n}function R(e,t,n,r){let i=e.isOptional(n),a=e.getInnerType(n),o;if(e.isDefault(a)&&(o=e.getDefaultValue(a),a=e.getDefaultInnerType(a)),r===null&&e.isNullable(a))return[t,r];if(r==null&&i)return[t,o];if(a&&r!==void 0){let i=e.safeParse(n,r);if(i.success)return[t,i.data??o]}return e.isArray(a)&&Array.isArray(r)?[t,I(e,a,r)]:e.isRecord(a)&&r?[t,L(e,a,r)]:e.isObject(a)?[t,z(e,a,r&&typeof r==`object`?r:o)]:[t,o]}function z(e,t,n){let r=n&&typeof n==`object`&&!Array.isArray(n)?n:{};return{...e.hasUnknownKeys(t)?r:{},...Object.fromEntries(e.getShapeEntries(t).map(([t,n])=>R(e,t,n,r[t])))}}function B(e,t={}){let n=N(e)?F:P,r=n.getInnerType(e);return n.isObject(r)?z(n,r,t):t}var V=(e,t)=>N(e)?(0,i.safeParseAsync)(e,t):e.safeParseAsync(t),H=(e,t)=>N(e)?(0,i.formatError)(t):t.format(),U=(e,t)=>N(e)?(0,i.formatError)(new i.$ZodError(t)):new r.ZodError(t).format();function W(e,r,i,a,o){let c=(0,t.ref)(),l=(0,t.ref)(),u=(0,t.computed)(()=>l.value===s.invalid),d=(0,t.ref)(),f=(0,t.ref)(!1),p,m=t=>{let n=B(e,t);if(i?.class){let e=i.class;return new e(n)}return n},h=async(t=d.value,n)=>{if(p=n?.fields,f.value)return!0;let r=await V(e,t);if(!r.success){if(l.value=s.invalid,!p?.size)return c.value=H(e,r.error),!1;let t=r.error.issues.filter(e=>p?.has(e.path.join(`.`)));return t.length?(c.value=U(e,t),!1):(c.value=void 0,!0)}return c.value=void 0,l.value=s.valid,d.value=m(r.data),!0},g=()=>{c.value=void 0,l.value=void 0,p=void 0},{ignoreUpdates:_,stop:v}=(0,n.watchIgnorable)(d,()=>{l.value=s.updated},{deep:!0,eventFilter:(0,n.throttleFilter)(i?.updateThrottle??500)}),y=()=>{_(()=>{d.value=m()}),g(),l.value=s.reset},b=async e=>f.value||!await h(void 0,e)?!1:(l.value=s.submitting,!0),x=(0,t.readonly)(c),S=(0,t.readonly)(l);return{clear:g,errors:c,formData:d,ignoreUpdates:_,invalid:u,readonly:f,reset:y,status:l,wrappers:o,stopUpdatesWatch:v,submit:b,validate:h,VvForm:(0,t.defineComponent)({name:`VvForm`,props:{continuousValidation:{type:Boolean,default:!1},modelValue:{type:Object,default:()=>({})},readonly:{type:Boolean,default:i?.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(e,{emit:n}){return d.value=m((0,t.toRaw)(e.modelValue)),(0,t.watch)(()=>e.modelValue,e=>{if(e){let n=(0,t.isProxy)(e)?(0,t.toRaw)(e):e;if(JSON.stringify(n)===JSON.stringify((0,t.toRaw)(d.value)))return;d.value=m(n)}},{deep:!0}),(0,t.watch)(l,async r=>{if(r===s.invalid){let e=(0,t.toRaw)(c.value);n(`invalid`,e),i?.onInvalid?.(e);return}if(r===s.valid){let e=(0,t.toRaw)(d.value);n(`valid`,e),i?.onValid?.(e),n(`update:modelValue`,e),i?.onUpdate?.(e);return}if(r===s.submitting){let e=(0,t.toRaw)(d.value);n(`submit`,e),i?.onSubmit?.(e);return}if(r===s.reset){let e=(0,t.toRaw)(d.value);n(`reset`,e),i?.onReset?.(e);return}if(r===s.updated){if((c.value||i?.continuousValidation||e.continuousValidation)&&await h(void 0,{superRefine:e.superRefine,fields:p??new Set(e.validateFields)}),!d.value||!e.modelValue||JSON.stringify(d.value)!==JSON.stringify(e.modelValue)){let e=(0,t.toRaw)(d.value);n(`update:modelValue`,e),i?.onUpdate?.(e)}l.value===s.updated&&(l.value=s.unknown)}}),(0,t.onMounted)(()=>{e.readonly!==void 0&&(f.value=e.readonly)}),(0,t.watch)(()=>e.readonly,e=>{f.value=e}),(0,t.watch)(f,t=>{t!==e.readonly&&n(`update:readonly`,f.value)}),(0,t.provide)(r,{clear:g,errors:x,formData:d,ignoreUpdates:_,invalid:u,readonly:f,reset:y,status:S,stopUpdatesWatch:v,submit:b,validate:h,wrappers:o}),{clear:g,errors:x,formData:d,ignoreUpdates:_,invalid:u,isReadonly:f,reset:y,status:S,stopUpdatesWatch:v,submit:()=>b({superRefine:e.superRefine,fields:new Set(e.validateFields)}),validate:h,wrappers:o}},render(){let e=()=>this.$slots?.default?.({errors:x.value,formData:d.value,invalid:u.value,readonly:f.value,status:S.value,wrappers:o,clear:g,ignoreUpdates:_,reset:y,stopUpdatesWatch:v,submit:b,validate:h})??this.$slots.default;return(0,t.h)(this.tag,{onSubmit:(0,t.withModifiers)(this.submit,[`prevent`]),onReset:(0,t.withModifiers)(this.reset,[`prevent`])},(this.template??i?.template)&&a?[(0,t.h)(a,{schema:this.template??i?.template},{default:e})]:{default:e})}})}}function G(e,n,r,i){return(0,t.defineComponent)({name:`VvFormField`,props:{type:{type:String,validator:e=>Object.values(o).includes(e),default:o.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(s,{slots:c,emit:l}){let{props:u,name:d}=(0,t.toRefs)(s),f=(0,t.useId)(),p=(0,t.inject)(n,void 0);p&&p.fields.value.set(f,s.name);let m=(0,t.inject)(e),h=(0,t.computed)({get(){if(m?.formData)return(0,a.getProperty)(new Object(m.formData.value),String(s.name))},set(e){m?.formData&&((0,a.setProperty)(new Object(m.formData.value),String(s.name),e),l(`update:modelValue`,{newValue:h.value,formData:m?.formData}))}});(0,t.onMounted)(()=>{h.value===void 0&&s.defaultValue!==void 0&&(h.value=s.defaultValue)}),(0,t.onBeforeUnmount)(()=>{p&&p.fields.value.delete(f)});let g=(0,t.computed)(()=>{if(m?.errors.value)return(0,a.getProperty)(m.errors.value,String(s.name))}),_=(0,t.computed)(()=>g.value?._errors),v=(0,t.computed)(()=>g.value!==void 0),y=(0,t.watch)(v,e=>{if(e){l(`invalid`,g.value),p&&p.errors.value.set(String(s.name),g.value);return}l(`valid`,h.value),p&&p.errors.value.delete(s.name)}),b=(0,t.watch)(()=>m?.formData,()=>{l(`update:formData`,m?.formData)},{deep:!0});(0,t.onBeforeUnmount)(()=>{y(),b()});let x=e=>{e instanceof InputEvent&&(e=e.target.value),h.value=e},S=(0,t.computed)(()=>{let e=u.value;return typeof e==`function`&&(e=e(m?.formData)),Object.keys(e).reduce((n,r)=>(n[r]=(0,t.unref)(e[r]),n),{})}),C=(0,t.computed)(()=>m?.readonly.value||p?.readonly.value?!0:S.value.readonly??s.readonly),w=(0,t.computed)(()=>({...S.value,name:S.value.name??s.name,invalid:v.value,valid:s.showValid?!!(!v.value&&h.value):void 0,type:(e=>{if([o.color,o.date,o.datetimeLocal,o.email,o.month,o.number,o.password,o.search,o.tel,o.text,o.time,o.url,o.week].includes(e))return e})(s.type),invalidLabel:_.value,modelValue:h.value,readonly:C.value,"onUpdate:modelValue":x}));return(0,t.provide)(r,{name:(0,t.readonly)(d),errors:(0,t.readonly)(g)}),{component:(0,t.computed)(()=>{if(s.type===o.custom)return{render(){return c.default?.({errors:(0,t.readonly)(g).value,formData:m?.formData.value,formErrors:m?.errors.value,invalid:v.value,invalidLabel:_.value,modelValue:h.value,readonly:C.value,onUpdate:x,submit:m?.submit,validate:m?.validate})??c.default}};if(!(i?.lazyLoad??s.lazyLoad)){let e;switch(s.type){case o.select:e=(0,t.resolveComponent)(`VvSelect`);break;case o.checkbox:e=(0,t.resolveComponent)(`VvCheckbox`);break;case o.radio:e=(0,t.resolveComponent)(`VvRadio`);break;case o.textarea:e=(0,t.resolveComponent)(`VvTextarea`);break;case o.radioGroup:e=(0,t.resolveComponent)(`VvRadioGroup`);break;case o.checkboxGroup:e=(0,t.resolveComponent)(`VvCheckboxGroup`);break;case o.combobox:e=(0,t.resolveComponent)(`VvCombobox`);break;default:e=(0,t.resolveComponent)(`VvInputText`)}if(typeof e!=`string`)return e;console.warn(`[@volverjs/form-vue]: ${e} not found, the component will be loaded asynchronously. To avoid this warning, please set "lazyLoad" option.`)}return(0,t.defineAsyncComponent)(async()=>{switch(i?.sideEffects&&await Promise.resolve(i.sideEffects(s.type)),s.type){case o.textarea:return import(`@volverjs/ui-vue/vv-textarea`);case o.radio:return import(`@volverjs/ui-vue/vv-radio`);case o.radioGroup:return import(`@volverjs/ui-vue/vv-radio-group`);case o.checkbox:return import(`@volverjs/ui-vue/vv-checkbox`);case o.checkboxGroup:return import(`@volverjs/ui-vue/vv-checkbox-group`);case o.select:return import(`@volverjs/ui-vue/vv-select`);case o.combobox:return import(`@volverjs/ui-vue/vv-combobox`)}return import(`@volverjs/ui-vue/vv-input-text`)})}),hasProps:w,invalid:v}},render(){return this.is?(0,t.h)(this.is,this.hasProps,this.$slots):this.type===o.custom?(0,t.h)(this.component,null,this.$slots):(0,t.h)(this.component,this.hasProps,this.$slots)}})}function K(e,n,r){return(0,t.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(i,{slots:o,emit:s}){let{props:c,names:l,defaultValues:u}=(0,t.toRefs)(i),d=(0,t.useId)(),f=(0,t.computed)(()=>Array.isArray(l.value)?l.value:Object.values(l.value)),p=(0,t.computed)(()=>Array.isArray(l.value)?l.value:Object.keys(l.value)),m=(0,t.computed)(()=>Array.isArray(l.value)?l.value.reduce((e,t)=>(e[String(t)]=t,e),{}):l.value),h=(0,t.computed)(()=>Object.keys(m.value).reduce((e,t)=>(e[String(m.value[t])]=t,e),{})),g=(0,t.inject)(n,void 0);g&&f.value.forEach(e=>{g.fields.value.set(`${d}-${e}`,e)});let _=(0,t.inject)(e),v=(0,t.computed)({get(){return _?.formData?p.value.reduce((e,t)=>(e[t]=(0,a.getProperty)(new Object(_.formData.value),m.value[t]),e),{}):{}},set(e){_?.formData&&(p.value.forEach(t=>{(0,a.setProperty)(new Object(_.formData.value),m.value[t],e?.[t])}),s(`update:modelValue`,{newValue:v.value,formData:_?.formData}))}});(0,t.onMounted)(()=>{u.value&&f.value.forEach(e=>{u.value?.[e]!==void 0&&v.value[e]===void 0&&(v.value={...v.value,[e]:u.value?.[e]})})}),(0,t.onBeforeUnmount)(()=>{g&&f.value.forEach(e=>{g.fields.value.delete(`${d}-${e}`)})});let y=(0,t.computed)(()=>{if(!_?.errors.value)return;let e=f.value.reduce((e,t)=>{if(!_.errors.value)return e;let n=(0,a.getProperty)(_.errors.value,String(t));return n===void 0||(e[String(t)]=n),e},{});if(Object.keys(e).length!==0)return e}),b=(0,t.computed)(()=>{if(!y.value)return;let e=Object.keys(y.value).reduce((e,t)=>(y.value?.[t]&&(e[h.value[t]]=y.value[t]._errors),e),{});if(Object.keys(e).length!==0)return e}),x=(0,t.computed)(()=>y.value!==void 0),S=(0,t.computed)(()=>p.value.reduce((e,t)=>(e[t]=!!y.value?.[m.value[t]],e),{})),C=(0,t.watch)(x,()=>{if(x.value){s(`invalid`,y.value),g&&f.value.forEach(e=>{if(!y.value?.[e]){g.errors.value.delete(e);return}g.errors.value.set(e,y.value?.[e])});return}s(`valid`,v.value),g&&f.value.forEach(e=>{g.errors.value.delete(e)})}),w=(0,t.watch)(()=>_?.formData,()=>{s(`update:formData`,_?.formData)},{deep:!0});(0,t.onBeforeUnmount)(()=>{C(),w()});let T=e=>{v.value=e},E=(e,t)=>{t instanceof InputEvent&&(t=t.target.value),p.value.includes(e)&&(v.value={...v.value,[e]:t})},D=(0,t.computed)(()=>{let e=c.value;return typeof e==`function`&&(e=e(_?.formData)),Object.keys(e).reduce((n,r)=>(n[r]=(0,t.unref)(e[r]),n),{})}),O=(0,t.computed)(()=>_?.readonly.value?!0:D.value.readonly??i.readonly),k=(0,t.computed)(()=>p.value.reduce((e,t)=>(e[`onUpdate:${t}`]=e=>{E(t,e)},e),{"onUpdate:modelValue":T})),A=(0,t.computed)(()=>({...k.value,...D.value,...v.value,modelValue:v.value,names:D.value.name??f.value,invalid:x.value,invalids:S.value,valid:i.showValid?!!(!x.value&&v.value):void 0,invalidLabels:b.value,readonly:O.value}));return(0,t.provide)(r,{names:(0,t.readonly)(l),errors:(0,t.readonly)(y)}),{component:(0,t.computed)(()=>({render(){return o.default?.({errors:y.value,formData:_?.formData.value,formErrors:_?.errors.value,invalid:x.value,invalids:S.value,invalidLabels:b.value,modelValue:v.value,onUpdate:T,onUpdateField:E,readonly:O.value,submit:_?.submit,validate:_?.validate})??o.default}})),hasProps:A,invalid:x}},render(){return this.is?(0,t.h)(this.is,this.hasProps,this.$slots):(0,t.h)(this.component,null,this.$slots)}})}function q(e,n){return(0,t.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(r,{emit:i}){let a=(0,t.inject)(e),o=(0,t.inject)(n,void 0),s=(0,t.ref)(new Map),c=(0,t.ref)(new Map),{name:l}=(0,t.toRefs)(r),u=(0,t.computed)(()=>a?.invalid.value?c.value.size>0:!1);(0,t.watch)(u,e=>{if(e){i(`invalid`);return}i(`valid`)});let d=(0,t.computed)(()=>a?.readonly.value||r.readonly),f={name:(0,t.readonly)(l),errors:c,invalid:(0,t.readonly)(u),readonly:(0,t.readonly)(d),fields:s};return(0,t.provide)(n,f),(0,t.watch)((0,t.computed)(()=>new Map(s.value)),(e,t)=>{o?.fields&&(t.forEach((t,n)=>{e.has(n)||o?.fields.value.delete(n)}),e.forEach((e,t)=>{o?.fields.value.has(t)||o?.fields.value.set(t,e)}))},{deep:!0}),(0,t.watch)(c,e=>{o?.errors&&s.value.forEach(t=>{if(e.has(t)||o.errors.value.delete(t),e.has(t)){let n=e.get(t);n&&o.errors.value.set(t,n)}})},{deep:!0}),(0,t.onMounted)(()=>{if(!a?.wrappers||!l.value){console.warn(`[@volverjs/form-vue]: Invalid wrapper registration state`);return}if(a.wrappers.has(l.value)){console.warn(`[@volverjs/form-vue]: wrapper name "${l.value}" is already used`);return}a.wrappers.set(l.value,f)}),(0,t.onBeforeUnmount)(()=>{a?.wrappers&&l.value&&a.wrappers.delete(l.value)}),{errors:a?.errors,fields:s,fieldsErrors:c,formData:a?.formData,invalid:u,readonly:d,clear:a?.clear,reset:a?.reset,submit:a?.submit,validate:a?.validate,validateWrapper:()=>a?.validate(void 0,{fields:new Set(s.value.values())})??Promise.resolve(!0)}},render(){let e=()=>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?(0,t.h)(this.tag,null,{default:e}):e()}})}function J(e,n){let r=(0,t.defineComponent)({name:`VvFormTemplate`,props:{schema:{type:[Array,Function],required:!0},scope:{type:Object,default:()=>({})}},slots:Object,setup(i,{slots:o}){let s=(0,t.inject)(e);if(s?.formData)return()=>{let e=typeof i.schema==`function`?i.schema(s,i.scope):i.schema,c,l=e.reduce((e,o)=>{let{vvIs:l,vvName:u,vvSlots:d,vvChildren:f,vvIf:p,vvElseIf:m,vvType:h,vvDefaultValue:g,vvShowValid:_,vvContent:v,...y}=typeof o==`function`?o(s,i.scope):o;if(p!==void 0){if(c=typeof p==`string`?!!(0,a.getProperty)(new Object(s.formData.value),p):typeof p==`function`?(0,t.unref)(p(s)):(0,t.unref)(p),!c)return e}else if(m!==void 0&&c!==void 0){if(c||(c=typeof m==`string`?!!(0,a.getProperty)(new Object(s.formData.value),m):typeof m==`function`?(0,t.unref)(m(s)):(0,t.unref)(m),!c))return e}else c=void 0;let b;return f&&(b=typeof l==`string`?(0,t.h)(r,{schema:f}):{default:e=>(0,t.h)(r,{schema:f,scope:e})}),u?(e.push((0,t.h)(n,{name:u,is:l,type:h,defaultValue:g,showValid:_,props:y},d??b??v)),e):l?(e.push((0,t.h)(l,y,d??b??v)),e):(b&&(`default`in b?e.push(b.default(i.scope)):e.push(b)),e)},[]);return l.push(o?.default?.({errors:s?.errors.value,formData:s?.formData.value,invalid:s?.invalid.value,status:s?.status.value,submit:s?.submit,validate:s?.validate,clear:s?.clear,reset:s?.reset})),l}}});return r}function Y(e,t={}){let n=Symbol(`formInjectionKey`),r=Symbol(`formWrapperInjectionKey`),i=Symbol(`formFieldInjectionKey`),a=Symbol(`formFieldsGroupInjectionKey`),o=q(n,r),s=G(n,r,i,t),c=K(n,r,a),l=J(n,s),u=new Map,{clear:d,errors:f,formData:p,ignoreUpdates:m,invalid:h,readonly:g,reset:_,status:v,stopUpdatesWatch:y,submit:b,validate:x,VvForm:S}=W(e,n,t,l,u);return{clear:d,errors:f,formData:p,formFieldInjectionKey:i,formInjectionKey:n,formWrapperInjectionKey:r,ignoreUpdates:m,invalid:h,readonly:g,reset:_,status:v,stopUpdatesWatch:y,submit:b,validate:x,wrappers:u,VvForm:S,VvFormField:s,VvFormFieldsGroup:c,VvFormTemplate:l,VvFormWrapper:o}}var X=Symbol(`pluginInjectionKey`);function Z(e){let t={};return e.schema&&(t=Y(e.schema,e)),{...t,install(n,{global:r=!1}={}){n.provide(X,e),r&&(n.config.globalProperties.$vvForm=e,t?.VvForm&&n.component(`VvForm`,t.VvForm),t?.VvFormWrapper&&n.component(`VvFormWrapper`,t.VvFormWrapper),t?.VvFormField&&n.component(`VvFormField`,t.VvFormField),t?.VvFormFieldsGroup&&n.component(`VvFormFieldsGroup`,t.VvFormFieldsGroup),t?.VvFormTemplate&&n.component(`VvFormTemplate`,t.VvFormTemplate))}}}var Q=new Map;function $(e,n={}){if(n.scope&&Q.has(n.scope))return Q.get(n.scope);if(!(0,t.getCurrentInstance)()){let t=Y(e,n);return n.scope&&Q.set(n.scope,t),t}let r=Y(e,{...(0,t.inject)(X,{}),...n});return n.scope&&Q.set(n.scope,r),r}function ee(e,t={}){return Y(e,t)}e.FormFieldType=o,e.createForm=Z,e.defaultObjectByJSONSchema=M,e.defaultObjectBySchema=B,e.formType=ee,e.pluginInjectionKey=X,e.useForm=$});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@volverjs/form-vue",
3
3
  "type": "module",
4
- "version": "1.1.4",
4
+ "version": "1.1.5",
5
5
  "description": "Vue 3 Forms with @volverjs/ui-vue",
6
6
  "author": "8 Wave S.r.l.",
7
7
  "license": "MIT",
@@ -57,32 +57,32 @@
57
57
  "zod": "^3.25.0 || ^4.0.0"
58
58
  },
59
59
  "devDependencies": {
60
- "@antfu/eslint-config": "^9.0.0",
60
+ "@antfu/eslint-config": "^9.1.0",
61
61
  "@nabla/vite-plugin-eslint": "^3.0.1",
62
62
  "@testing-library/vue": "^8.1.0",
63
63
  "@vitejs/plugin-vue": "^6.0.7",
64
64
  "@vitest/browser-playwright": "^4.1.9",
65
65
  "@volverjs/style": "^0.1.24",
66
- "@volverjs/ui-vue": "^0.0.12",
67
- "@vue/compiler-dom": "^3.5.38",
68
- "@vue/compiler-sfc": "^3.5.38",
66
+ "@volverjs/ui-vue": "^0.0.15",
67
+ "@vue/compiler-dom": "^3.5.39",
68
+ "@vue/compiler-sfc": "^3.5.39",
69
69
  "@vue/language-core": "^3.3.5",
70
- "@vue/runtime-core": "^3.5.38",
71
- "@vue/shared": "^3.5.38",
70
+ "@vue/runtime-core": "^3.5.39",
71
+ "@vue/shared": "^3.5.39",
72
72
  "@vue/test-utils": "^2.4.11",
73
73
  "@vueuse/core": "^14.3.0",
74
74
  "copy": "^0.3.2",
75
75
  "dot-prop": "^10.1.0",
76
76
  "eslint": "^10.5.0",
77
- "happy-dom": "^20.10.3",
78
- "playwright": "^1.61.0",
77
+ "happy-dom": "^20.10.6",
78
+ "playwright": "^1.61.1",
79
79
  "typescript": "^6.0.3",
80
- "vite": "^8.0.16",
81
- "vite-plugin-dts": "^5.0.2",
80
+ "vite": "^8.1.0",
81
+ "vite-plugin-dts": "^5.0.3",
82
82
  "vite-plugin-externalize-deps": "^0.10.0",
83
83
  "vitest": "^4.1.9",
84
84
  "vitest-browser-vue": "^2.1.0",
85
- "vue": "^3.5.38",
85
+ "vue": "^3.5.39",
86
86
  "zod": "^4.4.3"
87
87
  },
88
88
  "scripts": {
package/src/VvForm.ts CHANGED
@@ -86,8 +86,26 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
86
86
  validateFields = undefined
87
87
  }
88
88
 
89
+ const { ignoreUpdates, stop: stopUpdatesWatch } = watchIgnorable(
90
+ formData,
91
+ () => {
92
+ status.value = FormStatus.updated
93
+ },
94
+ {
95
+ deep: true,
96
+ eventFilter: throttleFilter(options?.updateThrottle ?? 500),
97
+ },
98
+ )
99
+
89
100
  const reset = () => {
90
- formData.value = formDataAdapter()
101
+ // Reset the form data without re-triggering the throttled formData watcher.
102
+ // That watcher fires on a leading edge and would set `status = updated`,
103
+ // overwriting `status = reset` before the status watcher can emit the
104
+ // `reset` event — a timing-sensitive race when reset happens outside the
105
+ // throttle window.
106
+ ignoreUpdates(() => {
107
+ formData.value = formDataAdapter()
108
+ })
91
109
  clear()
92
110
  status.value = FormStatus.reset
93
111
  }
@@ -106,17 +124,6 @@ export function defineForm<Schema extends FormSchema, Type, FormTemplateComponen
106
124
  return true
107
125
  }
108
126
 
109
- const { ignoreUpdates, stop: stopUpdatesWatch } = watchIgnorable(
110
- formData,
111
- () => {
112
- status.value = FormStatus.updated
113
- },
114
- {
115
- deep: true,
116
- eventFilter: throttleFilter(options?.updateThrottle ?? 500),
117
- },
118
- )
119
-
120
127
  const readonlyErrors = makeReadonly(errors)
121
128
  const readonlyStatus = makeReadonly(status)
122
129