From e43971805916a2c8f6be82a11c531d85ab6d95c5 Mon Sep 17 00:00:00 2001 From: Craigory Coppola Date: Fri, 20 May 2022 16:12:35 -0400 Subject: [PATCH] fix(devkit): parseTargetString should support targets with colons in the name (#10400) --- .../src/executors/parse-target-string.spec.ts | 25 +++++++++++++++++++ .../src/executors/parse-target-string.ts | 5 ++-- packages/nx/src/utils/split-target.spec.ts | 18 ++++++------- packages/nx/src/utils/split-target.ts | 6 +++-- 4 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 packages/devkit/src/executors/parse-target-string.spec.ts diff --git a/packages/devkit/src/executors/parse-target-string.spec.ts b/packages/devkit/src/executors/parse-target-string.spec.ts new file mode 100644 index 0000000000000..fce4639b32211 --- /dev/null +++ b/packages/devkit/src/executors/parse-target-string.spec.ts @@ -0,0 +1,25 @@ +import { parseTargetString, targetToTargetString } from './parse-target-string'; + +const cases = [ + { input: 'one:two', expected: { project: 'one', target: 'two' } }, + { + input: 'one:two:three', + expected: { project: 'one', target: 'two', configuration: 'three' }, + }, + { + input: 'one:"two:two":three', + expected: { project: 'one', target: 'two:two', configuration: 'three' }, + }, +]; + +describe('parseTargetString', () => { + it.each(cases)('$input -> $expected', ({ input, expected }) => { + expect(parseTargetString(input)).toEqual(expected); + }); +}); + +describe('targetToTargetString', () => { + it.each(cases)('$expected -> $input', ({ input, expected }) => { + expect(targetToTargetString(expected)).toEqual(input); + }); +}); diff --git a/packages/devkit/src/executors/parse-target-string.ts b/packages/devkit/src/executors/parse-target-string.ts index c4d17a4084f05..5d614933f88f1 100644 --- a/packages/devkit/src/executors/parse-target-string.ts +++ b/packages/devkit/src/executors/parse-target-string.ts @@ -1,4 +1,5 @@ import type { Target } from 'nx/src/command-line/run'; +import { splitTarget } from 'nx/src/utils/split-target'; /** * Parses a target string into {project, target, configuration} @@ -12,7 +13,7 @@ import type { Target } from 'nx/src/command-line/run'; * @param targetString - target reference */ export function parseTargetString(targetString: string): Target { - const [project, target, configuration] = targetString.split(':'); + const [project, target, configuration] = splitTarget(targetString); if (!project || !target) { throw new Error(`Invalid Target String: ${targetString}`); } @@ -40,7 +41,7 @@ export function targetToTargetString({ target, configuration, }: Target): string { - return `${project}:${target}${ + return `${project}:${target.indexOf(':') > -1 ? `"${target}"` : target}${ configuration !== undefined ? ':' + configuration : '' }`; } diff --git a/packages/nx/src/utils/split-target.spec.ts b/packages/nx/src/utils/split-target.spec.ts index 7bf40b8c00a41..7b77e71a0c5c2 100644 --- a/packages/nx/src/utils/split-target.spec.ts +++ b/packages/nx/src/utils/split-target.spec.ts @@ -1,14 +1,14 @@ import { splitTarget } from './split-target'; +const cases = [ + { input: 'one', expected: ['one'] }, + { input: 'one:two', expected: ['one', 'two'] }, + { input: 'one:two:three', expected: ['one', 'two', 'three'] }, + { input: 'one:"two:two":three', expected: ['one', 'two:two', 'three'] }, +]; + describe('splitTarget', () => { - it('should work', () => { - expect(splitTarget('one')).toEqual(['one']); - expect(splitTarget('one:two')).toEqual(['one', 'two']); - expect(splitTarget('one:two:three')).toEqual(['one', 'two', 'three']); - expect(splitTarget('one:"two:two":three')).toEqual([ - 'one', - 'two:two', - 'three', - ]); + it.each(cases)('$input -> $expected', ({ input, expected }) => { + expect(splitTarget(input)).toEqual(expected); }); }); diff --git a/packages/nx/src/utils/split-target.ts b/packages/nx/src/utils/split-target.ts index 73c0a123e20eb..6e89fed08c9ac 100644 --- a/packages/nx/src/utils/split-target.ts +++ b/packages/nx/src/utils/split-target.ts @@ -1,4 +1,6 @@ -export function splitTarget(s: string): any { +export function splitTarget( + s: string +): [project: string, target?: string, configuration?: string] { const parts = [] as string[]; let currentPart = ''; for (let i = 0; i < s.length; ++i) { @@ -15,5 +17,5 @@ export function splitTarget(s: string): any { } } parts.push(currentPart); - return parts; + return parts as [string, string?, string?]; }