From 1f8363a95a19ab70bd99769aed904983d8878bfa Mon Sep 17 00:00:00 2001 From: Sumit Arora Date: Thu, 9 Mar 2017 11:42:58 -0500 Subject: [PATCH] fix(@angular/cli): Fixing set prefix issue (#5301) --- packages/@angular/cli/commands/set.ts | 10 +++++++++- .../json-schema/src/schema-class-factory.ts | 8 +++++++- tests/e2e/tests/commands/get/get.ts | 13 +++++++++++++ tests/e2e/tests/commands/set/set.ts | 14 ++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/e2e/tests/commands/get/get.ts create mode 100644 tests/e2e/tests/commands/set/set.ts diff --git a/packages/@angular/cli/commands/set.ts b/packages/@angular/cli/commands/set.ts index f5de2ba9f056..f916aaf60615 100644 --- a/packages/@angular/cli/commands/set.ts +++ b/packages/@angular/cli/commands/set.ts @@ -64,7 +64,7 @@ const SetCommand = Command.extend({ case 'number': value = this.asNumber(rawValue); break; case 'string': value = rawValue; break; - default: value = JSON.parse(rawValue); + default: value = parseValue(rawValue, jsonPath); } config.set(jsonPath, value); @@ -74,4 +74,12 @@ const SetCommand = Command.extend({ } }); +function parseValue(rawValue: string, path: string) { + try { + return JSON.parse(rawValue); + } catch (error) { + throw new SilentError(`No node found at path ${path}`); + } +} + export default SetCommand; diff --git a/packages/@ngtools/json-schema/src/schema-class-factory.ts b/packages/@ngtools/json-schema/src/schema-class-factory.ts index eebde99abf8c..effe0b0ab903 100644 --- a/packages/@ngtools/json-schema/src/schema-class-factory.ts +++ b/packages/@ngtools/json-schema/src/schema-class-factory.ts @@ -51,7 +51,13 @@ function _getSchemaNodeForPath(rootMetaData: SchemaTreeNode, let fragments = _parseJsonPath(path); // TODO: make this work with union (oneOf) schemas return fragments.reduce((md: SchemaTreeNode, current: string) => { - return md && md.children && md.children[current]; + if (md && md.children) { + return md.children[current]; + } else if (md && md.items) { + return md.items[parseInt(current, 10)]; + } else { + return md; + } }, rootMetaData); } diff --git a/tests/e2e/tests/commands/get/get.ts b/tests/e2e/tests/commands/get/get.ts new file mode 100644 index 000000000000..b66fb2e9ceb1 --- /dev/null +++ b/tests/e2e/tests/commands/get/get.ts @@ -0,0 +1,13 @@ +import {ng} from '../../../utils/process'; +import {expectToFail} from '../../../utils/utils'; + +export default function() { + return Promise.resolve() + .then(() => expectToFail(() => ng('get', 'apps.zzz.prefix'))) + .then(() => ng('get', 'apps.0.prefix')) + .then(({ stdout }) => { + if (!stdout.match(/app/)) { + throw new Error(`Expected "app", received "${JSON.stringify(stdout)}".`); + } + }); +} diff --git a/tests/e2e/tests/commands/set/set.ts b/tests/e2e/tests/commands/set/set.ts new file mode 100644 index 000000000000..da82c129e46b --- /dev/null +++ b/tests/e2e/tests/commands/set/set.ts @@ -0,0 +1,14 @@ +import {ng} from '../../../utils/process'; +import {expectToFail} from '../../../utils/utils'; + +export default function() { + return Promise.resolve() + .then(() => expectToFail(() => ng('set', 'apps.zzz.prefix'))) + .then(() => ng('set', 'apps.0.prefix' , 'new-prefix')) + .then(() => ng('get', 'apps.0.prefix')) + .then(({ stdout }) => { + if (!stdout.match(/new-prefix/)) { + throw new Error(`Expected "new-prefix", received "${JSON.stringify(stdout)}".`); + } + }); +}