From 1376794df054429dfa1aa0b97f98cc6162136e84 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Mon, 6 May 2024 04:17:00 +0300 Subject: [PATCH] fix: handle single field meta reactivity closes #4738 --- .changeset/lucky-feet-tease.md | 5 +++++ packages/vee-validate/src/types/forms.ts | 2 +- packages/vee-validate/src/useField.ts | 5 +++-- packages/vee-validate/src/useFieldState.ts | 4 ++-- packages/yup/tests/yup.spec.ts | 23 ++++++++++++++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 .changeset/lucky-feet-tease.md diff --git a/.changeset/lucky-feet-tease.md b/.changeset/lucky-feet-tease.md new file mode 100644 index 000000000..8fd5fb337 --- /dev/null +++ b/.changeset/lucky-feet-tease.md @@ -0,0 +1,5 @@ +--- +"vee-validate": patch +--- + +fix: handle meta.required for single field schemas closes #4738 diff --git a/packages/vee-validate/src/types/forms.ts b/packages/vee-validate/src/types/forms.ts index d5cb5d631..57b3f0d1e 100644 --- a/packages/vee-validate/src/types/forms.ts +++ b/packages/vee-validate/src/types/forms.ts @@ -84,7 +84,7 @@ export interface PathStateConfig { label: MaybeRefOrGetter; type: InputType; validate: FieldValidator; - schema?: TypedSchema; + schema?: MaybeRefOrGetter; } export interface PathState { diff --git a/packages/vee-validate/src/useField.ts b/packages/vee-validate/src/useField.ts index 3f7351b20..aca8636a3 100644 --- a/packages/vee-validate/src/useField.ts +++ b/packages/vee-validate/src/useField.ts @@ -142,14 +142,15 @@ function _useField( return normalizeRules(rulesValue); }); + const isTyped = !isCallable(validator.value) && isTypedSchema(toValue(rules)); const { id, value, initialValue, meta, setState, errors, flags } = useFieldState(name, { modelValue, form, bails, label, type, - validate: validator.value ? validate : undefined, - schema: isTypedSchema(rules) ? (rules as any) : undefined, + validate: validator.value && !isTyped ? validate : undefined, + schema: isTyped ? (rules as any) : undefined, }); const errorMessage = computed(() => errors.value[0]); diff --git a/packages/vee-validate/src/useFieldState.ts b/packages/vee-validate/src/useFieldState.ts index 42713d475..bf9dac061 100644 --- a/packages/vee-validate/src/useFieldState.ts +++ b/packages/vee-validate/src/useFieldState.ts @@ -25,7 +25,7 @@ export interface StateInit { label?: MaybeRefOrGetter; type?: InputType; validate?: FieldValidator; - schema?: TypedSchema; + schema?: MaybeRefOrGetter | undefined>; } let ID_COUNTER = 0; @@ -210,7 +210,7 @@ function createFieldMeta( currentValue: Ref, initialValue: MaybeRef | undefined, errors: Ref, - schema?: TypedSchema, + schema?: MaybeRefOrGetter | undefined>, ) { const isRequired = computed(() => toValue(schema)?.describe?.().required ?? false); diff --git a/packages/yup/tests/yup.spec.ts b/packages/yup/tests/yup.spec.ts index 7f8db7c6a..856125985 100644 --- a/packages/yup/tests/yup.spec.ts +++ b/packages/yup/tests/yup.spec.ts @@ -423,6 +423,29 @@ test('reports required state reactively', async () => { await expect(meta.required).toBe(false); }); +test('reports single field required state reactively', async () => { + let meta!: FieldMeta; + const schema = ref(toTypedSchema(yup.string().required())); + mountWithHoc({ + setup() { + const field = useField('name', schema); + meta = field.meta; + + return { + schema, + }; + }, + template: `
`, + }); + + await flushPromises(); + await expect(meta.required).toBe(true); + + schema.value = toTypedSchema(yup.string()); + await flushPromises(); + await expect(meta.required).toBe(false); +}); + test('reports required false for non-existent fields', async () => { const metaSpy = vi.fn(); mountWithHoc({