diff --git a/packages/qwik/src/core/object/q-object.ts b/packages/qwik/src/core/object/q-object.ts index fd0883e17be..4269f2ed136 100644 --- a/packages/qwik/src/core/object/q-object.ts +++ b/packages/qwik/src/core/object/q-object.ts @@ -281,22 +281,31 @@ const wrap = (value: T, containerState: ContainerState): T => { }; export const verifySerializable = (value: T): T => { + const seen = new Set(); + return _verifySerializable(value, seen); +}; + +const _verifySerializable = (value: T, seen: Set): T => { const unwrapped = unwrapProxy(value); if (unwrapped == null) { return value; } if (shouldSerialize(unwrapped)) { + if (seen.has(unwrapped)) { + return value; + } + seen.add(unwrapped); switch (typeof unwrapped) { case 'object': if (isArray(unwrapped)) { for (const item of unwrapped) { - verifySerializable(item); + _verifySerializable(item, seen); } return value; } if (Object.getPrototypeOf(unwrapped) === Object.prototype) { for (const item of Object.values(unwrapped)) { - verifySerializable(item); + _verifySerializable(item, seen); } return value; } @@ -313,7 +322,6 @@ export const verifySerializable = (value: T): T => { } return value; }; - const noSerializeSet = /*#__PURE__*/ new WeakSet(); export const shouldSerialize = (obj: any): boolean => { diff --git a/starters/apps/e2e/src/components/render/render.tsx b/starters/apps/e2e/src/components/render/render.tsx index afc3687607f..bbbbd7ee06f 100644 --- a/starters/apps/e2e/src/components/render/render.tsx +++ b/starters/apps/e2e/src/components/render/render.tsx @@ -1,14 +1,15 @@ import { component$, useStore, Host } from '@builder.io/qwik'; export const Render = component$(() => { - const state = useStore( - { - counter: { - count: 0, - }, + const parent = { + counter: { + count: 0, }, - { recursive: true } - ); + children: [] as any[], + }; + parent.children.push(parent); + + const state = useStore(parent, { recursive: true }); return (