From b9591093900948dbcbb8ec7fca2a8430c960f89c Mon Sep 17 00:00:00 2001 From: Katerina Skroumpelou Date: Mon, 5 Dec 2022 21:30:39 +0200 Subject: [PATCH] fix(storybook): proper detection of e2e project existence (#13635) --- .../angular/src/generators/stories/stories.ts | 9 +----- .../generators/configuration/configuration.ts | 28 +++++++++-------- .../configuration/util-functions.ts | 31 +++++++++++++++++++ 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/packages/angular/src/generators/stories/stories.ts b/packages/angular/src/generators/stories/stories.ts index 64df1d9151..8d56c6234c 100644 --- a/packages/angular/src/generators/stories/stories.ts +++ b/packages/angular/src/generators/stories/stories.ts @@ -1,10 +1,4 @@ -import { - formatFiles, - joinPathFragments, - logger, - readProjectConfiguration, - Tree, -} from '@nrwl/devkit'; +import { formatFiles, joinPathFragments, logger, Tree } from '@nrwl/devkit'; import componentCypressSpecGenerator from '../component-cypress-spec/component-cypress-spec'; import componentStoryGenerator from '../component-story/component-story'; import type { ComponentInfo } from '../utils/storybook-ast/component-info'; @@ -25,7 +19,6 @@ export function angularStoriesGenerator( const e2eProjectName = options.cypressProject ?? `${options.name}-e2e`; const e2eProject = getE2EProject(tree, e2eProjectName); const entryPoints = getProjectEntryPoints(tree, options.name); - const { root } = readProjectConfiguration(tree, options.name); const componentsInfo: ComponentInfo[] = []; for (const entryPoint of entryPoints) { const moduleFilePaths = getModuleFilePaths(tree, entryPoint); diff --git a/packages/storybook/src/generators/configuration/configuration.ts b/packages/storybook/src/generators/configuration/configuration.ts index fd6b72f648..cc4b62a516 100644 --- a/packages/storybook/src/generators/configuration/configuration.ts +++ b/packages/storybook/src/generators/configuration/configuration.ts @@ -22,6 +22,7 @@ import { createProjectStorybookDir, createRootStorybookDir, createRootStorybookDirForRootProject, + getE2EProjectName, projectIsRootProjectInNestedWorkspace, updateLintConfig, } from './util-functions'; @@ -106,19 +107,20 @@ export async function configurationGenerator( ); } - if (schema.configureCypress) { - if (projectType !== 'application') { - const cypressTask = await cypressProjectGenerator(tree, { - name: schema.name, - js: schema.js, - linter: schema.linter, - directory: schema.cypressDirectory, - standaloneConfig: schema.standaloneConfig, - }); - tasks.push(cypressTask); - } else { - logger.warn('There is already an e2e project setup'); - } + const e2eProject = getE2EProjectName(tree, schema.name); + if (schema.configureCypress && !e2eProject) { + const cypressTask = await cypressProjectGenerator(tree, { + name: schema.name, + js: schema.js, + linter: schema.linter, + directory: schema.cypressDirectory, + standaloneConfig: schema.standaloneConfig, + }); + tasks.push(cypressTask); + } else { + logger.warn( + `There is already an e2e project setup for ${schema.name}, called ${e2eProject}.` + ); } if (nextBuildTarget && projectType === 'application') { diff --git a/packages/storybook/src/generators/configuration/util-functions.ts b/packages/storybook/src/generators/configuration/util-functions.ts index 7fbee7e4e2..5c00a8cff9 100644 --- a/packages/storybook/src/generators/configuration/util-functions.ts +++ b/packages/storybook/src/generators/configuration/util-functions.ts @@ -1,8 +1,10 @@ import { generateFiles, + getProjects, joinPathFragments, logger, offsetFromRoot, + parseTargetString, readJson, readProjectConfiguration, readWorkspaceConfiguration, @@ -24,6 +26,7 @@ import { } from '../../utils/utilities'; import { StorybookConfigureSchema } from './schema'; import { getRootTsConfigPathInTree } from '@nrwl/workspace/src/utilities/typescript'; +import { forEachExecutorOptions } from '@nrwl/workspace/src/utilities/executor-options-utils'; const DEFAULT_PORT = 4400; @@ -533,3 +536,31 @@ export function rootFileIsTs( return tsConfiguration; } } + +export function getE2EProjectName( + tree: Tree, + mainProject: string +): string | undefined { + let e2eProject: string; + forEachExecutorOptions( + tree, + '@nrwl/cypress:cypress', + (options, projectName) => { + if (e2eProject) { + return; + } + if (options['devServerTarget']) { + const { project, target } = parseTargetString( + options['devServerTarget'] + ); + if ( + (project === mainProject && target === 'serve') || + (project === mainProject && target === 'storybook') + ) { + e2eProject = projectName; + } + } + } + ); + return e2eProject; +}