diff --git a/packages/devtools/src/__tests__/serialize.test.ts b/packages/devtools/src/__tests__/serialize.test.ts index bb5b1bea..1a85ee1a 100644 --- a/packages/devtools/src/__tests__/serialize.test.ts +++ b/packages/devtools/src/__tests__/serialize.test.ts @@ -28,6 +28,14 @@ describe('serialize', () => { expect(serialize('abcdef', { text: 3 })).toBe('abc…'); }); + it('keeps a real "…" key when the key limit adds its marker', () => { + expect(serialize({ '…': 'real', b: 2, c: 3 }, { keys: 2 })).toEqual({ + '…': 'real', + b: 2, + '… (2)': '1 more', + }); + }); + it('marks text cut by the redaction window when the text limit is larger', () => { const out = serialize('a'.repeat(70000), { text: 100000 }) as string; expect(out).toBe(`${'a'.repeat(65536)}…`); diff --git a/packages/devtools/src/serialize.ts b/packages/devtools/src/serialize.ts index a4c9caa5..b848393b 100644 --- a/packages/devtools/src/serialize.ts +++ b/packages/devtools/src/serialize.ts @@ -145,7 +145,8 @@ export function serialize(value: unknown, limits: SerializeLimits = {}): unknown } setKey(out, safeKey(key, out), walkNamed(key, item, level + 1)); } - if (keys.length > maxKeys) out['…'] = `${keys.length - maxKeys} more`; + // Through safeKey, so the marker never replaces a real `…` key. + if (keys.length > maxKeys) setKey(out, safeKey('…', out), `${keys.length - maxKeys} more`); return out; } finally { path.delete(v);