diff --git a/packages/angular/src/generators/application/application.spec.ts b/packages/angular/src/generators/application/application.spec.ts index db5c1288f90e03..6fa442bf3a736d 100644 --- a/packages/angular/src/generators/application/application.spec.ts +++ b/packages/angular/src/generators/application/application.spec.ts @@ -1,21 +1,19 @@ import type { Tree } from '@nrwl/devkit'; -import type { Schema } from './schema'; - +import * as devkit from '@nrwl/devkit'; import { - readJson, - updateJson, NxJsonConfiguration, - readProjectConfiguration, parseJson, + readJson, + readProjectConfiguration, + updateJson, } from '@nrwl/devkit'; +import type { Schema } from './schema'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; import { Linter } from '@nrwl/linter'; import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners'; import { applicationGenerator } from './application'; -import * as devkit from '@nrwl/devkit'; - describe('app', () => { let appTree: Tree; @@ -366,6 +364,38 @@ describe('app', () => { `); }); + it('should add a lint target when e2e test runner is protractor', async () => { + await generateApp(appTree, 'myApp', { + linter: Linter.EsLint, + e2eTestRunner: E2eTestRunner.Protractor, + }); + const workspaceJson = readJson(appTree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.lint) + .toMatchInlineSnapshot(` + Object { + "builder": "@nrwl/linter:eslint", + "options": Object { + "lintFilePatterns": Array [ + "apps/my-app/src/**/*.ts", + "apps/my-app/src/**/*.html", + ], + }, + } + `); + expect(appTree.exists('apps/my-app-e2e/.eslintrc.json')).toBeTruthy(); + expect(workspaceJson.projects['my-app-e2e'].architect.lint) + .toMatchInlineSnapshot(` + Object { + "builder": "@nrwl/linter:eslint", + "options": Object { + "lintFilePatterns": Array [ + "apps/my-app-e2e/**/*.ts", + ], + }, + } + `); + }); + it('should add valid eslint JSON configuration which extends from Nx presets', async () => { await generateApp(appTree, 'myApp', { linter: Linter.EsLint }); @@ -426,6 +456,21 @@ describe('app', () => { await generateApp(appTree, 'myApp', { linter: Linter.None }); const workspaceJson = readJson(appTree, 'workspace.json'); expect(workspaceJson.projects['my-app'].architect.lint).toBeUndefined(); + expect( + workspaceJson.projects['my-app-e2e'].architect.lint + ).toBeUndefined(); + }); + + it('should not add an architect target for lint when e2e test runner is protractor', async () => { + await generateApp(appTree, 'myApp', { + linter: Linter.None, + e2eTestRunner: E2eTestRunner.Protractor, + }); + const workspaceJson = readJson(appTree, 'workspace.json'); + expect(workspaceJson.projects['my-app'].architect.lint).toBeUndefined(); + expect( + workspaceJson.projects['my-app-e2e'].architect.lint + ).toBeUndefined(); }); }); }); diff --git a/packages/angular/src/generators/application/lib/add-e2e.ts b/packages/angular/src/generators/application/lib/add-e2e.ts index 41d9c22895a06b..510a089d76b39c 100644 --- a/packages/angular/src/generators/application/lib/add-e2e.ts +++ b/packages/angular/src/generators/application/lib/add-e2e.ts @@ -9,29 +9,31 @@ import { addProtractor } from './add-protractor'; import { removeScaffoldedE2e } from './remove-scaffolded-e2e'; import { updateE2eProject } from './update-e2e-project'; import { convertToNxProjectGenerator } from '@nrwl/workspace'; +import { Linter, lintProjectGenerator } from '@nrwl/linter'; +import { joinPathFragments } from '@nrwl/devkit'; /** * Add E2E Config * - * @param host Nx Devkit Virtual Tree + * @param tree Nx Devkit Virtual Tree * @param options Normalized Schema * @param e2eProjectRoot Raw E2E Project Root that Angular tries to write to * * @returns Function to run to add Cypres config after intial app files have been moved to correct location */ export async function addE2e( - host: Tree, + tree: Tree, options: NormalizedSchema, e2eProjectRoot: string ) { if (options.e2eTestRunner === E2eTestRunner.Protractor) { - await addProtractor(host, options); + await addProtractor(tree, options); } else { - removeScaffoldedE2e(host, options, e2eProjectRoot); + removeScaffoldedE2e(tree, options, e2eProjectRoot); } if (options.e2eTestRunner === 'cypress') { - await cypressProjectGenerator(host, { + await cypressProjectGenerator(tree, { name: options.e2eProjectName, directory: options.directory, project: options.name, @@ -42,11 +44,21 @@ export async function addE2e( } if (options.e2eTestRunner === E2eTestRunner.Protractor) { - updateE2eProject(host, options); + updateE2eProject(tree, options); if (options.standaloneConfig) { - convertToNxProjectGenerator(host, { + convertToNxProjectGenerator(tree, { project: `${options.e2eProjectName}`, }); } + if (options.linter === Linter.EsLint) { + await lintProjectGenerator(tree, { + project: options.e2eProjectName, + linter: options.linter, + eslintFilePatterns: [ + joinPathFragments(options.e2eProjectRoot, '**/*.ts'), + ], + skipFormat: true, + }); + } } } diff --git a/packages/angular/src/generators/application/lib/update-e2e-project.ts b/packages/angular/src/generators/application/lib/update-e2e-project.ts index 4c18e96358ab05..ae1653a3899a5c 100644 --- a/packages/angular/src/generators/application/lib/update-e2e-project.ts +++ b/packages/angular/src/generators/application/lib/update-e2e-project.ts @@ -1,15 +1,12 @@ import type { ProjectConfiguration, Tree } from '@nrwl/devkit'; -import type { NormalizedSchema } from './normalized-schema'; - import { - offsetFromRoot, - updateJson, addProjectConfiguration, + offsetFromRoot, readProjectConfiguration, + updateJson, updateProjectConfiguration, - ProjectType, } from '@nrwl/devkit'; -import { Linter } from '@nrwl/linter'; +import type { NormalizedSchema } from './normalized-schema'; export function updateE2eProject(tree: Tree, options: NormalizedSchema) { const spec = `${options.e2eProjectRoot}/src/app.e2e-spec.ts`; @@ -32,15 +29,6 @@ export function updateE2eProject(tree: Tree, options: NormalizedSchema) { projectType: 'application', targets: { e2e: proj.targets.e2e, - lint: - options.linter === Linter.None - ? undefined - : { - executor: '@nrwl/linter:eslint', - options: { - lintFilePatterns: [`${options.e2eProjectRoot}/**/*.ts`], - }, - }, }, }; project.targets.e2e.options.protractorConfig = `${options.e2eProjectRoot}/protractor.conf.js`;