From 0c1cd1d7e9a1e7a8e9a68299238571bedb8b5e9b Mon Sep 17 00:00:00 2001 From: arlo Date: Tue, 22 Oct 2024 22:20:07 +0800 Subject: [PATCH] fix(kit): check vue reactive doubly-linked list nodes and skip to avoid circular references on encoding --- packages/devtools-kit/src/shared/transfer.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/devtools-kit/src/shared/transfer.ts b/packages/devtools-kit/src/shared/transfer.ts index 503b4732..d131d69e 100644 --- a/packages/devtools-kit/src/shared/transfer.ts +++ b/packages/devtools-kit/src/shared/transfer.ts @@ -11,6 +11,12 @@ function isArray(_data: unknown, proto: string): _data is unknown[] { return proto === '[object Array]' } +// See https://github1s.com/vuejs/core/blob/HEAD/packages/reactivity/src/dep.ts#L32-L33 +function isVueReactiveLinkNode(node) { + const constructorName = node.constructor.name + return (constructorName === 'Dep' && 'activeLink' in node) || (constructorName === 'Link' && 'dep' in node) +} + /** * This function is used to serialize object with handling circular references. * @@ -41,6 +47,9 @@ function encode(data: unknown, replacer: Replacer | null, list: unknown[], seen: const index = list.length const proto = Object.prototype.toString.call(data) if (isObject(data, proto)) { + if (isVueReactiveLinkNode(data)) { + return index + } stored = {} seen.set(data, index) list.push(stored)