diff --git a/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts b/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts index 7375cdb0ff..b0a4c690f9 100644 --- a/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts +++ b/packages/devkit/src/generators/artifact-name-and-directory-utils.spec.ts @@ -166,6 +166,33 @@ describe('determineArtifactNameAndDirectoryOptions', () => { restoreCwd(); }); + it('should not duplicate the cwd when the provided directory starts with the cwd and format is "as-provided"', async () => { + addProjectConfiguration(tree, 'app1', { + root: 'apps/app1', + projectType: 'application', + }); + setCwd('apps/app1'); + + const result = await determineArtifactNameAndDirectoryOptions(tree, { + name: 'myComponent', + directory: 'apps/app1', + nameAndDirectoryFormat: 'as-provided', + artifactType: 'component', + callingGenerator: '@my-org/my-plugin:component', + }); + + expect(result).toStrictEqual({ + artifactName: 'myComponent', + directory: 'apps/app1', + fileName: 'myComponent', + filePath: 'apps/app1/myComponent.ts', + project: 'app1', + nameAndDirectoryFormat: 'as-provided', + }); + + restoreCwd(); + }); + it('should return the options as provided when directory is provided', async () => { addProjectConfiguration(tree, 'app1', { root: 'apps/app1', diff --git a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts index 68796b086d..9856ed4cee 100644 --- a/packages/devkit/src/generators/artifact-name-and-directory-utils.ts +++ b/packages/devkit/src/generators/artifact-name-and-directory-utils.ts @@ -237,9 +237,20 @@ function getAsProvidedOptions( ): NameAndDirectoryOptions { const relativeCwd = getRelativeCwd(); - const asProvidedDirectory = options.directory - ? joinPathFragments(relativeCwd, options.directory) - : relativeCwd; + let asProvidedDirectory: string; + if (options.directory) { + // append the directory to the current working directory if it doesn't start with it + if ( + options.directory === relativeCwd || + options.directory.startsWith(`${relativeCwd}/`) + ) { + asProvidedDirectory = options.directory; + } else { + asProvidedDirectory = joinPathFragments(relativeCwd, options.directory); + } + } else { + asProvidedDirectory = relativeCwd; + } const asProvidedProject = findProjectFromPath(tree, asProvidedDirectory); const asProvidedFileName =