diff --git a/packages/downgrader/src/shared.ts b/packages/downgrader/src/shared.ts index ef2eccf..8667f62 100644 --- a/packages/downgrader/src/shared.ts +++ b/packages/downgrader/src/shared.ts @@ -153,14 +153,14 @@ export function map(convert: Convert, isEntry: (key: string) => boolean = () => if (!isRecord(value)) { return clone(value) } - const out: [string, unknown][] = [] + const out: Record = {} for (const [key, item] of Object.entries(value)) { const converted = item === undefined ? DROP : isEntry(key) ? convert(item, ctx) : clone(item) if (converted !== DROP) { - out.push([key, converted]) + setOwn(out, key, converted) } } - return Object.fromEntries(out) + return out } } diff --git a/packages/downgrader/tests/v3.1-to-v3.0.test.ts b/packages/downgrader/tests/v3.1-to-v3.0.test.ts index d449cc3..a91c42d 100644 --- a/packages/downgrader/tests/v3.1-to-v3.0.test.ts +++ b/packages/downgrader/tests/v3.1-to-v3.0.test.ts @@ -1293,13 +1293,15 @@ describe('unusual input', () => { it('keeps own __proto__ keys as keys', () => { const out = downgradeSchemaV31ToV30( JSON.parse( - '{"type":"object","properties":{"__proto__":{"type":["string","null"]}},"example":{"__proto__":1}}', + '{"type":"object","properties":{"__proto__":{"type":["string","null"]},"1":{}},"example":{"__proto__":1}}', ), ) as Record expect(Object.getOwnPropertyDescriptor(out.properties, '__proto__')?.value).toEqual({ type: 'string', nullable: true, }) + expect(Object.keys(out.properties)).toEqual(['1', '__proto__']) + expect(Object.getPrototypeOf(out.properties)).toBe(Object.prototype) expect(Object.getOwnPropertyDescriptor(out.example, '__proto__')?.value).toBe(1) expect(Object.getPrototypeOf(out.example)).toBe(Object.prototype) })