From b53c983a44b296f21fd19b70e4ee20ec05f216ce Mon Sep 17 00:00:00 2001 From: edison1105 Date: Wed, 3 May 2023 15:47:45 +0800 Subject: [PATCH 1/4] fix(runtime-core): ensure props are shallow readonly in dev --- packages/runtime-core/src/componentRenderUtils.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index d9de968a074..eab1a29da9e 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -26,6 +26,7 @@ import { isCompatEnabled, warnDeprecation } from './compat/compatConfig' +import { shallowReadonly } from '@vue/reactivity' /** * dev only flag to track whether $attrs was used during render. @@ -78,7 +79,7 @@ export function renderComponentRoot( proxyToUse, proxyToUse!, renderCache, - props, + __DEV__ ? shallowReadonly(props) : props, setupState, data, ctx @@ -95,7 +96,7 @@ export function renderComponentRoot( result = normalizeVNode( render.length > 1 ? render( - props, + __DEV__ ? shallowReadonly(props) : props, __DEV__ ? { get attrs() { @@ -107,7 +108,10 @@ export function renderComponentRoot( } : { attrs, slots, emit } ) - : render(props, null as any /* we know it doesn't need it */) + : render( + __DEV__ ? shallowReadonly(props) : props, + null as any /* we know it doesn't need it */ + ) ) fallthroughAttrs = Component.props ? attrs From 3024901ea1073c9d20f51b518f1fac25cea71186 Mon Sep 17 00:00:00 2001 From: edison1105 Date: Wed, 3 May 2023 15:53:49 +0800 Subject: [PATCH 2/4] chore: update test case --- packages/runtime-core/__tests__/componentProps.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts index 071a24f138d..8d366c4d430 100644 --- a/packages/runtime-core/__tests__/componentProps.spec.ts +++ b/packages/runtime-core/__tests__/componentProps.spec.ts @@ -127,12 +127,12 @@ describe('component props', () => { render(h(Comp, { foo: 1 }), root) expect(props).toEqual({ foo: 1 }) expect(attrs).toEqual({ foo: 1 }) - expect(props).toBe(attrs) + expect(props).toStrictEqual(attrs) render(h(Comp, { bar: 2 }), root) expect(props).toEqual({ bar: 2 }) expect(attrs).toEqual({ bar: 2 }) - expect(props).toBe(attrs) + expect(props).toStrictEqual(attrs) }) test('boolean casting', () => { From 4ba22c6bd3ec2f25d1d61ab3429d811a40fbe0b0 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 13:10:30 +0000 Subject: [PATCH 3/4] [autofix.ci] apply automated fixes --- packages/runtime-core/src/componentRenderUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index 07835b4305b..f947e5be42e 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -125,7 +125,7 @@ export function renderComponentRoot( ) : render( __DEV__ ? shallowReadonly(props) : props, - null as any /* we know it doesn't need it */ + null as any /* we know it doesn't need it */, ), ) fallthroughAttrs = Component.props From 11656afe5119639d04a7b5ec0b93fdee6a6588a4 Mon Sep 17 00:00:00 2001 From: edison1105 Date: Sun, 21 Apr 2024 21:17:46 +0800 Subject: [PATCH 4/4] chore: ensure attrs are shallow readonly --- packages/runtime-core/__tests__/componentProps.spec.ts | 4 ++-- packages/runtime-core/src/componentRenderUtils.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts index 91341f68357..6fc5d4dd2d7 100644 --- a/packages/runtime-core/__tests__/componentProps.spec.ts +++ b/packages/runtime-core/__tests__/componentProps.spec.ts @@ -127,12 +127,12 @@ describe('component props', () => { render(h(Comp, { foo: 1 }), root) expect(props).toEqual({ foo: 1 }) expect(attrs).toEqual({ foo: 1 }) - expect(props).toStrictEqual(attrs) + expect(props).toBe(attrs) render(h(Comp, { bar: 2 }), root) expect(props).toEqual({ bar: 2 }) expect(attrs).toEqual({ bar: 2 }) - expect(props).toStrictEqual(attrs) + expect(props).toBe(attrs) }) test('boolean casting', () => { diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index f947e5be42e..6772474bdef 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -116,7 +116,7 @@ export function renderComponentRoot( ? { get attrs() { markAttrsAccessed() - return attrs + return shallowReadonly(attrs) }, slots, emit,