fix(angular): respect the provided version when running make-angular-cli-faster

This commit is contained in:
Victor Savkin 2022-11-30 15:04:32 -05:00
parent 7762eddfc8
commit f16f53bcc5
No known key found for this signature in database
GPG Key ID: 39178FEB7698B817

View File

@ -1,7 +1,5 @@
import { execSync } from 'child_process';
import { prompt } from 'enquirer';
import { lt, lte, major, satisfies } from 'semver';
import { output } from 'nx/src/utils/output';
import { lt, lte, major } from 'semver';
import { readModulePackageJson } from 'nx/src/utils/package-json';
import { PackageManagerCommands } from 'nx/src/utils/package-manager';
import { resolvePackageVersion } from './package-manager';
@ -29,42 +27,16 @@ const latestCompatibleAngularMajorVersion = Math.max(
export async function determineMigration(
version: string | undefined
): Promise<MigrationDefinition> {
if (version) {
return { packageName: '@nrwl/angular', version };
}
const angularVersion = getInstalledAngularVersion();
const majorAngularVersion = major(angularVersion);
latestWorkspaceVersionWithMigration = await resolvePackageVersion(
'@nrwl/angular',
latestWorkspaceRangeVersionWithMigration
);
if (version) {
const normalizedVersion = await normalizeVersion(version);
if (lte(normalizedVersion, latestWorkspaceVersionWithMigration)) {
// specified version should use @nrwl/workspace:ng-add
return { packageName: '@nrwl/workspace', version: normalizedVersion };
}
// if greater than the latest workspace version with the migration,
// check the versions map for compatibility with Angular
if (
nxAngularVersionMap[majorAngularVersion] &&
satisfies(
normalizedVersion,
nxAngularVersionMap[majorAngularVersion].range
)
) {
// there's a match, use @nrwl/angular:ng-add
return { packageName: '@nrwl/angular', version: normalizedVersion };
}
// it's not compatible with the currently installed Angular version,
// suggest the latest possible version to use
return await findAndSuggestVersionToUse(
angularVersion,
majorAngularVersion,
version
);
}
const latestNxCompatibleVersion =
await getNxVersionBasedOnInstalledAngularVersion(
angularVersion,
@ -101,41 +73,6 @@ export function migrateWorkspace(
);
}
async function findAndSuggestVersionToUse(
angularVersion: string,
majorAngularVersion: number,
userSpecifiedVersion: string
): Promise<MigrationDefinition> {
const latestNxCompatibleVersion =
await getNxVersionBasedOnInstalledAngularVersion(
angularVersion,
majorAngularVersion
);
const useSuggestedVersion = await promptForVersion(latestNxCompatibleVersion);
if (useSuggestedVersion) {
// should use @nrwl/workspace:ng-add if the version is less than the
// latest workspace version that has the migration, otherwise use
// @nrwl/angular:ng-add
return {
packageName: lte(
latestNxCompatibleVersion,
latestWorkspaceVersionWithMigration
)
? '@nrwl/workspace'
: '@nrwl/angular',
version: latestNxCompatibleVersion,
};
}
output.error({
title: `❌ Cannot proceed with the migration.`,
bodyLines: [
`The specified Nx version "${userSpecifiedVersion}" is not compatible with the installed Angular version "${angularVersion}".`,
],
});
process.exit(1);
}
async function getNxVersionBasedOnInstalledAngularVersion(
angularVersion: string,
majorAngularVersion: number
@ -162,31 +99,6 @@ async function getNxVersionBasedOnInstalledAngularVersion(
return await resolvePackageVersion('@nrwl/angular', 'latest');
}
async function promptForVersion(version: string): Promise<boolean> {
const { useVersion } = await prompt<{ useVersion: boolean }>([
{
name: 'useVersion',
message: `The provided version of Nx is not compatible with the installed Angular CLI version. Would you like to use the recommended version "${version}" instead?`,
type: 'confirm',
initial: true,
},
]);
return useVersion;
}
function getInstalledAngularVersion(): string {
return readModulePackageJson('@angular/core').packageJson.version;
}
async function normalizeVersion(version: string): Promise<string> {
if (
version.startsWith('^') ||
version.startsWith('~') ||
version.split('.').length < 3
) {
return await resolvePackageVersion('@nrwl/angular', version);
}
return version;
}