From 1f42e071b4ae3ddee8b2eee1d27e8b6ad41e0cb0 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 30 Nov 2020 10:18:07 +0100 Subject: [PATCH] fix(@angular-devkit/core): correctly handle null prototype in deepCopy Closes #19492 --- packages/angular_devkit/core/src/utils/object.ts | 2 +- packages/angular_devkit/core/src/utils/object_spec.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/angular_devkit/core/src/utils/object.ts b/packages/angular_devkit/core/src/utils/object.ts index cf6216032069..395af8abbfd5 100644 --- a/packages/angular_devkit/core/src/utils/object.ts +++ b/packages/angular_devkit/core/src/utils/object.ts @@ -40,7 +40,7 @@ export function deepCopy(value: T): T { return JSON.parse(valueCasted['toJSON']()); } - const copy = new (Object.getPrototypeOf(valueCasted).constructor)(); + const copy = Object.create(Object.getPrototypeOf(valueCasted)); valueCasted[copySymbol] = copy; for (const key of Object.getOwnPropertyNames(valueCasted)) { copy[key] = deepCopy(valueCasted[key]); diff --git a/packages/angular_devkit/core/src/utils/object_spec.ts b/packages/angular_devkit/core/src/utils/object_spec.ts index 635c783c5f1d..67756e5f31b7 100644 --- a/packages/angular_devkit/core/src/utils/object_spec.ts +++ b/packages/angular_devkit/core/src/utils/object_spec.ts @@ -50,5 +50,11 @@ describe('object', () => { expect(result.b).not.toBe(data1); expect(result.b).toBe(result.b.circular.b); }); + + it('works with null prototype', () => { + const data = Object.create(null); + data['a'] = 1; + expect(deepCopy(data)).toEqual(data); + }); }); });