From 9b5e053c26800af30376c078935cc37996bb1609 Mon Sep 17 00:00:00 2001
From: Alan Agius <alan.agius4@gmail.com>
Date: Tue, 21 Apr 2020 09:57:52 +0200
Subject: [PATCH] fix(@angular-devkit/core): workspace reader spread/rest
 operator usage with falsy values

Spread and Rest uses `[[GetOwnProperty]]`. Previously, properties with falsy values were being removed when using the spread operator due to an incorrect check.

https://tc39.es/proposal-object-rest-spread/#AbstractOperations-CopyDataProperties

Fixes #17021
---
 .../angular_devkit/core/src/workspace/json/reader_spec.ts  | 7 +++++++
 .../angular_devkit/core/src/workspace/json/utilities.ts    | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/packages/angular_devkit/core/src/workspace/json/reader_spec.ts b/packages/angular_devkit/core/src/workspace/json/reader_spec.ts
index 8d21ad8e9828..b6ac75b95971 100644
--- a/packages/angular_devkit/core/src/workspace/json/reader_spec.ts
+++ b/packages/angular_devkit/core/src/workspace/json/reader_spec.ts
@@ -86,6 +86,13 @@ describe('readJsonWorkpace Parsing', () => {
     );
   });
 
+  it(`doesn't remove falsy values when using the spread operator`, async () => {
+    const host = createTestHost(representativeFile);
+    const workspace = await readJsonWorkspace('', host);
+    const prodConfig = workspace.projects.get('my-app')!.targets.get('build')!.configurations!.production!;
+    expect({ ...prodConfig }).toEqual(prodConfig);
+  });
+
   it('parses extensions only into extensions object', async () => {
     const host = createTestHost(representativeFile);
 
diff --git a/packages/angular_devkit/core/src/workspace/json/utilities.ts b/packages/angular_devkit/core/src/workspace/json/utilities.ts
index 24a737f57479..c101eda1ae14 100644
--- a/packages/angular_devkit/core/src/workspace/json/utilities.ts
+++ b/packages/angular_devkit/core/src/workspace/json/utilities.ts
@@ -148,7 +148,7 @@ function create(
       const propertyPath = path + '/' + escapeKey(p);
       const cacheEntry = cache.get(propertyPath);
       if (cacheEntry) {
-        if (cacheEntry.value) {
+        if (cacheEntry.value !== undefined) {
           return createPropertyDescriptor(cacheEntry.value);
         }