From 2a09a58085f811b199658ee3036d434f6fb9be8e Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Wed, 27 Dec 2023 14:14:28 +0100 Subject: [PATCH] fix: check if the target is pojo before attempted merge (#4615) --- .changeset/fluffy-icons-eat.md | 5 ++++ packages/shared/utils.ts | 2 +- packages/vee-validate/tests/useForm.spec.ts | 27 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 .changeset/fluffy-icons-eat.md diff --git a/.changeset/fluffy-icons-eat.md b/.changeset/fluffy-icons-eat.md new file mode 100644 index 000000000..42c479b99 --- /dev/null +++ b/.changeset/fluffy-icons-eat.md @@ -0,0 +1,5 @@ +--- +"vee-validate": patch +--- + +"fix: check if both source and target objects are POJOs" diff --git a/packages/shared/utils.ts b/packages/shared/utils.ts index ed0319510..191060e6b 100644 --- a/packages/shared/utils.ts +++ b/packages/shared/utils.ts @@ -51,7 +51,7 @@ export function isPlainObject(value: any) { export function merge(target: any, source: any) { Object.keys(source).forEach(key => { - if (isPlainObject(source[key])) { + if (isPlainObject(source[key]) && isPlainObject(target[key])) { if (!target[key]) { target[key] = {}; } diff --git a/packages/vee-validate/tests/useForm.spec.ts b/packages/vee-validate/tests/useForm.spec.ts index 9e95a0ce8..e99cfdf7a 100644 --- a/packages/vee-validate/tests/useForm.spec.ts +++ b/packages/vee-validate/tests/useForm.spec.ts @@ -1398,4 +1398,31 @@ describe('useForm()', () => { await flushPromises(); await expect(form.errors.value.fname).toBe(undefined); }); + + test('checks if both source and target are POJO before setting properties', async () => { + let form!: FormContext<{ file: { name: string; size: number } }>; + const f1 = new File([''], 'f1.text'); + const f2 = { name: 'f2.text', size: 123 }; + + mountWithHoc({ + setup() { + form = useForm({ + initialValues: { file: f1 }, + }); + + form.defineField('file'); + + return {}; + }, + template: ` +
+ `, + }); + + await flushPromises(); + expect(form.values.file).toBeInstanceOf(File); + expect(form.values.file).toBe(f1); + form.setValues({ file: f2 }); + expect(form.values.file).toEqual(f2); + }); });