From 2fa12730a94b9626e5f1e83184b053ba58a78257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Standa=20Luke=C5=A1?= Date: Fri, 23 Feb 2024 12:44:29 +0100 Subject: [PATCH] JS: Fix viewmodel freezing We have to freeze the viewmodel value, not the CoerceResult object --- .../Framework/Resources/Scripts/metadata/coercer.ts | 3 ++- .../Resources/Scripts/tests/stateManagement.test.ts | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Framework/Framework/Resources/Scripts/metadata/coercer.ts b/src/Framework/Framework/Resources/Scripts/metadata/coercer.ts index 6d83ed6e8b..238cc9c304 100644 --- a/src/Framework/Framework/Resources/Scripts/metadata/coercer.ts +++ b/src/Framework/Framework/Resources/Scripts/metadata/coercer.ts @@ -52,7 +52,8 @@ export function tryCoerce(value: any, type: TypeDefinition | null | undefined, o if (result instanceof CoerceError) { return result; // we cannot freeze CoerceError because we modify its path property } - return Object.freeze(result); + Object.freeze(result.value) + return result } export function coerce(value: any, type: TypeDefinition, originalValue: any = undefined): any { diff --git a/src/Framework/Framework/Resources/Scripts/tests/stateManagement.test.ts b/src/Framework/Framework/Resources/Scripts/tests/stateManagement.test.ts index 35d242b305..f05b607fe4 100644 --- a/src/Framework/Framework/Resources/Scripts/tests/stateManagement.test.ts +++ b/src/Framework/Framework/Resources/Scripts/tests/stateManagement.test.ts @@ -682,3 +682,13 @@ test("changing dynamic type property notifies when dynamic types are different - } expect(notifyCount).toBe(1); }); + +test("state is frozen", () => { + expect(Object.isFrozen(vm.state)).toBe(true); + expect(Object.isFrozen(s.state)).toBe(true); + expect(Object.isFrozen(vm.Dynamic.state)).toBe(true); + + vm.Dynamic.setState({ x: 1 }) + s.doUpdateNow() + expect(Object.isFrozen(vm.Dynamic.state)).toBe(true); +})