diff --git a/packages/angular/migrations.json b/packages/angular/migrations.json index 9a0a545d414aac..7d4f48d75e03cc 100644 --- a/packages/angular/migrations.json +++ b/packages/angular/migrations.json @@ -176,6 +176,12 @@ "version": "16.0.0-beta.1", "description": "Replace @nrwl/angular with @nx/angular", "implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages" + }, + "remove-karma-defaults-from-generators": { + "cli": "nx", + "version": "16.0.0-beta.3", + "description": "Remove karma as default unitTestRunner from nxJson and project configurations", + "implementation": "./src/migrations/update-16-0-0/remove-karma-defaults" } }, "packageJsonUpdates": { diff --git a/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.spec.ts b/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.spec.ts new file mode 100644 index 00000000000000..43f16de872df3f --- /dev/null +++ b/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.spec.ts @@ -0,0 +1,146 @@ +import { + addProjectConfiguration, + readNxJson, + readProjectConfiguration, + updateNxJson, +} from '@nx/devkit'; +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import removeKarmaDefaults from './remove-karma-defaults'; + +describe('removeKarmaDefaults', () => { + it('should remove karma as default unit test runner from nx.json when exists', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + + const nxJson = readNxJson(tree); + nxJson.generators = { + '@nrwl/angular:application': { + unitTestRunner: 'karma', + }, + '@nrwl/angular:library': { + unitTestRunner: 'karma', + }, + '@nrwl/angular:host': { + unitTestRunner: 'karma', + }, + '@nrwl/angular:remote': { + unitTestRunner: 'karma', + }, + }; + updateNxJson(tree, nxJson); + + // ACT + await removeKarmaDefaults(tree); + + // ASSERT + expect(readNxJson(tree).generators).toMatchInlineSnapshot(` + { + "@nrwl/angular:application": {}, + "@nrwl/angular:host": {}, + "@nrwl/angular:library": {}, + "@nrwl/angular:remote": {}, + } + `); + }); + + it('should only remove karma as default unit test runner from nx.json when set', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + + const nxJson = readNxJson(tree); + nxJson.generators = { + '@nrwl/angular:application': { + style: 'scss', + unitTestRunner: 'karma', + }, + '@nrwl/angular:library': { + unitTestRunner: 'jest', + }, + '@nrwl/angular:host': { + style: 'scss', + unitTestRunner: 'karma', + }, + '@nrwl/angular:remote': { + unitTestRunner: 'jest', + }, + }; + updateNxJson(tree, nxJson); + + // ACT + await removeKarmaDefaults(tree); + + // ASSERT + expect(readNxJson(tree).generators).toMatchInlineSnapshot(` + { + "@nrwl/angular:application": { + "style": "scss", + }, + "@nrwl/angular:host": { + "style": "scss", + }, + "@nrwl/angular:library": { + "unitTestRunner": "jest", + }, + "@nrwl/angular:remote": { + "unitTestRunner": "jest", + }, + } + `); + }); + + it('should not remove karma as default unit test runner from unsupported generator', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + + const nxJson = readNxJson(tree); + nxJson.generators = { + '@my/custom:plugin': { + style: 'scss', + unitTestRunner: 'karma', + }, + }; + updateNxJson(tree, nxJson); + + // ACT + await removeKarmaDefaults(tree); + + // ASSERT + expect(readNxJson(tree).generators).toMatchInlineSnapshot(` + { + "@my/custom:plugin": { + "style": "scss", + "unitTestRunner": "karma", + }, + } + `); + }); + + it('should remove karma as default for project specific generators', async () => { + // ARRANGE + const tree = createTreeWithEmptyWorkspace(); + addProjectConfiguration(tree, 'test', { + name: 'test', + root: '.', + sourceRoot: 'src', + generators: { + '@nrwl/angular:application': { + style: 'scss', + unitTestRunner: 'karma', + }, + }, + }); + + // ACT + await removeKarmaDefaults(tree); + + // ASSERT + expect(readProjectConfiguration(tree, 'test').generators) + .toMatchInlineSnapshot(` + { + "@nrwl/angular:application": { + "style": "scss", + }, + } + `); + }); +}); diff --git a/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.ts b/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.ts new file mode 100644 index 00000000000000..65eb5cc250363d --- /dev/null +++ b/packages/angular/src/migrations/update-16-0-0/remove-karma-defaults.ts @@ -0,0 +1,62 @@ +import type { Tree } from '@nx/devkit'; +import { + getProjects, + readNxJson, + updateNxJson, + updateProjectConfiguration, +} from '@nx/devkit'; + +const POSSIBLE_GENERATORS = [ + '@nrwl/angular:application', + '@nrwl/angular:library', + '@nrwl/angular:host', + '@nrwl/angular:remote', +]; + +export default async function removeKarmaDefaults(tree: Tree) { + const nxJson = readNxJson(tree); + + if (nxJson.generators) { + const generators = Object.entries(nxJson.generators); + for (const [generatorName, generatorDefaults] of generators) { + if (!POSSIBLE_GENERATORS.includes(generatorName)) { + continue; + } + + if ( + generatorDefaults['unitTestRunner'] && + generatorDefaults['unitTestRunner'] === 'karma' + ) { + nxJson.generators[generatorName]['unitTestRunner'] = undefined; + } + } + + updateNxJson(tree, nxJson); + } + + const projects = getProjects(tree); + + for (const [projectName, projectConfig] of projects) { + if (projectConfig.generators) { + const generators = Object.entries(projectConfig.generators); + + let updatedProject = false; + for (const [generatorName, generatorDefaults] of generators) { + if (!POSSIBLE_GENERATORS.includes(generatorName)) { + continue; + } + if ( + generatorDefaults['unitTestRunner'] && + generatorDefaults['unitTestRunner'] === 'karma' + ) { + projectConfig.generators[generatorName]['unitTestRunner'] = undefined; + updatedProject = true; + } + } + + if (updatedProject) { + updateProjectConfiguration(tree, projectName, projectConfig); + } + } + } +}