From 2312184bc335e0d32aa4c0c0b49190b6334849b4 Mon Sep 17 00:00:00 2001 From: Artyom Tuchkov Date: Thu, 8 Feb 2024 06:57:57 +0400 Subject: [PATCH] fix(reactivity): skip non-extensible objects when using `markRaw` (#10289) close #10288 --- packages/reactivity/__tests__/reactive.spec.ts | 5 +++++ packages/reactivity/src/reactive.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index 5e1e0922e50..ab953ff891a 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -277,6 +277,11 @@ describe('reactivity/reactive', () => { expect(isReactive(obj.bar)).toBe(false) }) + test('markRaw should skip non-extensible objects', () => { + const obj = Object.seal({ foo: 1 }) + expect(() => markRaw(obj)).not.toThrowError() + }) + test('should not observe non-extensible objects', () => { const obj = reactive({ foo: Object.preventExtensions({ a: 1 }), diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 6e98fedeaf4..8b94dd9a47f 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -385,7 +385,9 @@ export type Raw = T & { [RawSymbol]?: true } * @see {@link https://vuejs.org/api/reactivity-advanced.html#markraw} */ export function markRaw(value: T): Raw { - def(value, ReactiveFlags.SKIP, true) + if (Object.isExtensible(value)) { + def(value, ReactiveFlags.SKIP, true) + } return value }