feat(angular): add migration to remove protractor generator defaults (#16409)

This commit is contained in:
Colum Ferry 2023-04-21 12:29:02 +01:00 committed by GitHub
parent 14d9a8b034
commit ec3c642b29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 268 additions and 0 deletions

View File

@ -177,6 +177,12 @@
"description": "Replace @nrwl/angular with @nx/angular", "description": "Replace @nrwl/angular with @nx/angular",
"implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages" "implementation": "./src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages"
}, },
"remove-protractor-defaults-from-generators": {
"cli": "nx",
"version": "16.0.0-beta.6",
"description": "Remove protractor as default e2eTestRunner from nxJson and project configurations",
"implementation": "./src/migrations/update-16-0-0/remove-protractor-defaults"
},
"remove-karma-defaults-from-generators": { "remove-karma-defaults-from-generators": {
"cli": "nx", "cli": "nx",
"version": "16.0.0-beta.6", "version": "16.0.0-beta.6",

View File

@ -0,0 +1,179 @@
import {
addProjectConfiguration,
readNxJson,
readProjectConfiguration,
updateNxJson,
} from '@nx/devkit';
import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
import removeProtractorDefaults from './remove-protractor-defaults';
describe('removeProtractorDefaults', () => {
it('should remove protractor as default unit test runner from nx.json when exists', async () => {
// ARRANGE
const tree = createTreeWithEmptyWorkspace();
const nxJson = readNxJson(tree);
nxJson.generators = {
'@nrwl/angular:application': {
e2eTestRunner: 'protractor',
},
'@nrwl/angular:host': {
e2eTestRunner: 'protractor',
},
'@nrwl/angular:remote': {
e2eTestRunner: 'protractor',
},
};
updateNxJson(tree, nxJson);
// ACT
await removeProtractorDefaults(tree);
// ASSERT
expect(readNxJson(tree).generators).toMatchInlineSnapshot(`
{
"@nrwl/angular:application": {},
"@nrwl/angular:host": {},
"@nrwl/angular:remote": {},
}
`);
});
it('should only remove protractor 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',
e2eTestRunner: 'protractor',
},
'@nrwl/angular:host': {
style: 'scss',
e2eTestRunner: 'protractor',
},
'@nrwl/angular:remote': {
e2eTestRunner: 'cypress',
},
};
updateNxJson(tree, nxJson);
// ACT
await removeProtractorDefaults(tree);
// ASSERT
expect(readNxJson(tree).generators).toMatchInlineSnapshot(`
{
"@nrwl/angular:application": {
"style": "scss",
},
"@nrwl/angular:host": {
"style": "scss",
},
"@nrwl/angular:remote": {
"e2eTestRunner": "cypress",
},
}
`);
});
it('should not remove protractor as default e2e test runner from unsupported generator', async () => {
// ARRANGE
const tree = createTreeWithEmptyWorkspace();
const nxJson = readNxJson(tree);
nxJson.generators = {
'@my/custom:plugin': {
style: 'scss',
e2eTestRunner: 'protractor',
},
};
updateNxJson(tree, nxJson);
// ACT
await removeProtractorDefaults(tree);
// ASSERT
expect(readNxJson(tree).generators).toMatchInlineSnapshot(`
{
"@my/custom:plugin": {
"e2eTestRunner": "protractor",
"style": "scss",
},
}
`);
});
it('should remove protractor 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',
e2eTestRunner: 'protractor',
},
},
});
// ACT
await removeProtractorDefaults(tree);
// ASSERT
expect(readProjectConfiguration(tree, 'test').generators)
.toMatchInlineSnapshot(`
{
"@nrwl/angular:application": {
"style": "scss",
},
}
`);
});
it('should remove protractor when using nested generator default syntax', async () => {
// ARRANGE
const tree = createTreeWithEmptyWorkspace();
const nxJson = readNxJson(tree);
nxJson.generators = {
'@nrwl/angular:application': {
style: 'scss',
e2eTestRunner: 'protractor',
},
'@nrwl/angular': {
host: {
style: 'scss',
e2eTestRunner: 'protractor',
},
remote: {
e2eTestRunner: 'cypress',
},
},
};
updateNxJson(tree, nxJson);
// ACT
await removeProtractorDefaults(tree);
// ASSERT
expect(readNxJson(tree).generators).toMatchInlineSnapshot(`
{
"@nrwl/angular": {
"host": {
"style": "scss",
},
"remote": {
"e2eTestRunner": "cypress",
},
},
"@nrwl/angular:application": {
"style": "scss",
},
}
`);
});
});

View File

@ -0,0 +1,83 @@
import type {
NxJsonConfiguration,
ProjectConfiguration,
Tree,
} from '@nx/devkit';
import {
formatFiles,
getProjects,
readNxJson,
updateNxJson,
updateProjectConfiguration,
} from '@nx/devkit';
const GENERATORS = ['application', 'host', 'remote'];
const CANDIDATE_GENERATOR_COLLECTIONS = ['@nrwl/angular', '@nx/angular'];
export default async function removeProtractorDefaults(tree: Tree) {
const nxJson = readNxJson(tree);
if (nxJson.generators) {
const updatedConfig = updateE2ETestRunner(nxJson.generators);
if (updatedConfig) {
updateNxJson(tree, nxJson);
}
}
const projects = getProjects(tree);
for (const [projectName, projectConfig] of projects) {
if (projectConfig.generators) {
const updatedProject = updateE2ETestRunner(projectConfig.generators);
if (updatedProject) {
updateProjectConfiguration(tree, projectName, projectConfig);
}
}
}
await formatFiles(tree);
}
function updateE2ETestRunner(
generatorsConfig:
| NxJsonConfiguration['generators']
| ProjectConfiguration['generators']
) {
const generators = Object.entries(generatorsConfig);
let updatedConfig = false;
for (const [generatorName, generatorDefaults] of generators) {
if (CANDIDATE_GENERATOR_COLLECTIONS.includes(generatorName)) {
for (const possibleGenerator of GENERATORS) {
if (
generatorDefaults[possibleGenerator] &&
generatorDefaults[possibleGenerator]['e2eTestRunner'] &&
generatorDefaults[possibleGenerator]['e2eTestRunner'] === 'protractor'
) {
generatorsConfig[generatorName][possibleGenerator]['e2eTestRunner'] =
undefined;
updatedConfig = true;
}
}
}
if (
!GENERATORS.map((v) => `@nrwl/angular:${v}`).includes(generatorName) &&
!GENERATORS.map((v) => `@nx/angular:${v}`).includes(generatorName)
) {
continue;
}
if (
generatorDefaults['e2eTestRunner'] &&
generatorDefaults['e2eTestRunner'] === 'protractor'
) {
generatorsConfig[generatorName]['e2eTestRunner'] = undefined;
updatedConfig = true;
}
}
return updatedConfig;
}