Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 64 additions & 43 deletions eng/tools/versioning/set-dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,23 +47,29 @@ async function commitChanges(repoPackages, pkg) {
}
}

function updatePackageVersion(repoPackages, pkg, buildId, catalogs) {
function updatePackageVersion(repoPackages, pkg, buildId, catalogs, logPrefix = "\t") {
const currentVersion = repoPackages[pkg].json.version;
const parsedVersion = semver.parse(currentVersion);
repoPackages[pkg].newVer =
`${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}-alpha.${buildId}`;
console.log(`version updated for ${pkg}`);
console.log(`${logPrefix}version updated: from ${currentVersion} to ${repoPackages[pkg].newVer}`);
for (const p of Object.keys(repoPackages)) {
repoPackages = updateOtherProjectDependencySections(repoPackages, p, pkg, catalogs);
console.log(`${logPrefix}update "${pkg}" version in dependencies of "${p}"`);
repoPackages = updateOtherProjectDependencySections(
repoPackages,
p,
pkg,
catalogs,
`${logPrefix}\t`,
);
}
return repoPackages;
}

function updateDependencySection(repoPackages, dependencySection, buildId, catalogs) {
//console.log(dependencySection);
function updateDependencySection(repoPackages, dependencySection, buildId, catalogs, logPrefix) {
if (dependencySection) {
for (const [depName, depVersionRange] of Object.entries(dependencySection)) {
console.log(`checking ${depName}:${depVersionRange}...`);
console.log(`${logPrefix}checking ${depName}:${depVersionRange}...`);

// If the dependency isn't part of the workspace, skip it
if (!repoPackages[depName]) {
Expand All @@ -73,59 +79,71 @@ function updateDependencySection(repoPackages, dependencySection, buildId, catal
// Compare the dependency version range with the package's current version
const packageVersion = repoPackages[depName].json.version;

console.log(`version in package's dep = ${depVersionRange}`); //^1.0.0
console.log(`dep's version = ${packageVersion}`); //1.0.0
console.log(`${logPrefix}version in package's dep = ${depVersionRange}`); //^1.0.0
console.log(`${logPrefix}dep's version = ${packageVersion}`); //1.0.0
if (depVersionRange === "workspace:^") {
console.log(`${logPrefix}skipping workspace: dependency`);
continue;
} else if (depVersionRange.startsWith("catalog:")) {
const parsedPackageVersion = semver.parse(packageVersion);
const resolvedVersion = resolveFromCatalog(catalogs, {
alias: depName,
bareSpecifier: depVersionRange,
});
if (resolvedVersion.type === "found") {
const parsedDepMinVersion = semver.minVersion(resolvedVersion.resolution.specifier);
if (semver.eq(parsedDepMinVersion, parsedPackageVersion)) {
repoPackages = updatePackageVersion(repoPackages, depName, buildId, catalogs);
console.log(`${logPrefix}resolved version = ${resolvedVersion.resolution.specifier}`);
if (semver.satisfies(packageVersion, resolvedVersion.resolution.specifier)) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing to use semver.satisfies

repoPackages = updatePackageVersion(
repoPackages,
depName,
buildId,
catalogs,
`${logPrefix}\t`,
);
}
}
} else {
const parsedPackageVersion = semver.parse(packageVersion);
const parsedDepMinVersion = semver.minVersion(depVersionRange);
if (semver.eq(parsedDepMinVersion, parsedPackageVersion)) {
repoPackages = updatePackageVersion(repoPackages, depName, buildId, catalogs);
if (semver.satisfies(packageVersion, depVersionRange)) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing to use semver.satisfies

repoPackages = updatePackageVersion(
repoPackages,
depName,
buildId,
catalogs,
`${logPrefix}\t`,
);
}
}
}
}
return repoPackages;
}

function updateInternalDependencyVersions(repoPackages, pkg, buildId, catalogs) {
console.log("updateInternalDep");
console.log(pkg);
console.log("checking dependencies ..");
function updateInternalDependencyVersions(repoPackages, pkg, buildId, catalogs, logPrefix = "\t") {
console.log(`${logPrefix}update internal dependencies for package "${pkg}"`);
console.log(`${logPrefix}checking dependencies ..`);
repoPackages = updateDependencySection(
repoPackages,
repoPackages[pkg].json.dependencies,
buildId,
catalogs,
`${logPrefix}\t`,
);

console.log("checking devDependencies ..");
console.log(`${logPrefix}checking devDependencies ..`);
repoPackages = updateDependencySection(
repoPackages,
repoPackages[pkg].json.devDependencies,
buildId,
catalogs,
`${logPrefix}\t`,
);

console.log("checking peerDependencies ..");
console.log(`${logPrefix}checking peerDependencies ..`);
repoPackages = updateDependencySection(
repoPackages,
repoPackages[pkg].json.peerDependencies,
buildId,
catalogs,
`${logPrefix}\t`,
);

return repoPackages;
Expand All @@ -136,11 +154,12 @@ function makeDependencySectionConsistentForPackage(
dependencySection,
depName,
catalogs,
logPrefix,
) {
if (dependencySection && dependencySection[depName]) {
const depVersionRange = dependencySection[depName];

console.log(`checking ${depName}:${depVersionRange}...`);
console.log(`${logPrefix}consistency: checking ${depName}:${depVersionRange}...`);

// If the dependency isn't part of the workspace, skip it
if (!repoPackages[depName]) {
Expand All @@ -150,31 +169,35 @@ function makeDependencySectionConsistentForPackage(
// Compare the dependency version range with the package's current version
const packageVersion = repoPackages[depName].json.version;

console.log(`version in package's dep = ${depVersionRange}`);
console.log(`dep's version = ${packageVersion}`);
console.log(`${logPrefix}consistency: version in package's dep = ${depVersionRange}`);
console.log(`${logPrefix}consistency: dep's version = ${packageVersion}`);
const parsedPackageVersion = semver.parse(packageVersion);
if (!parsedPackageVersion) {
throw new Error(`Invalid version format: ${packageVersion}`);
}
let shouldReplace = false;
if (depVersionRange.startsWith("workspace:")) {
console.log(`${logPrefix}consistency: skipping workspace: dependency`);
shouldReplace = false;
} else if (depVersionRange.startsWith("catalog:")) {
const resolvedVersion = resolveFromCatalog(catalogs, {
alias: depName,
bareSpecifier: depVersionRange,
});
if (resolvedVersion.type === "found") {
const parsedDepMinVersion = semver.minVersion(resolvedVersion.resolution.specifier);
shouldReplace = semver.eq(parsedDepMinVersion, parsedPackageVersion);
shouldReplace = semver.satisfies(packageVersion, resolvedVersion.resolution.specifier);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing to use semver.satisfies

}
} else {
const parsedDepMinVersion = semver.minVersion(depVersionRange);
shouldReplace = semver.eq(parsedDepMinVersion, parsedPackageVersion);
shouldReplace = semver.satisfies(packageVersion, depVersionRange);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing to use semver.satisfies

}
// If the dependency range is satisfied by the package's current version,
// replace it with an exact match to the package's new version
if (shouldReplace && repoPackages[depName].newVer !== undefined) {
console.log(
`${logPrefix}consistency: updating ${depName} version in dependency section to ${repoPackages[depName].newVer}`,
);
// Set the dependency to the new version with an alpha prerelease tag
// e.g. 1.0.0-alpha.20240101.1
// Setting version to >=[major.minor.patch]-alpha <[major.minor.patch]-alphb so that this automatically matches
// with the latest dev version published on npm
const versionPrefix = `${parsedPackageVersion.major}.${parsedPackageVersion.minor}.${parsedPackageVersion.patch}`;
Expand All @@ -184,33 +207,32 @@ function makeDependencySectionConsistentForPackage(
return repoPackages;
}

function updateOtherProjectDependencySections(repoPackages, pkg, depName, catalogs) {
console.log("updateOtherProjectDependencySections");
console.log("package = " + pkg);
console.log("depName=" + depName);
console.log("checking dependencies ..");

function updateOtherProjectDependencySections(repoPackages, pkg, depName, catalogs, logPrefix) {
console.log(`${logPrefix}checking dependencies...`);
repoPackages = makeDependencySectionConsistentForPackage(
repoPackages,
repoPackages[pkg].json.dependencies,
depName,
catalogs,
`${logPrefix}\t`,
);

console.log("checking devDependencies ..");
console.log(`${logPrefix}checking devDependencies...`);
repoPackages = makeDependencySectionConsistentForPackage(
repoPackages,
repoPackages[pkg].json.devDependencies,
depName,
catalogs,
`${logPrefix}\t`,
);

console.log("checking peerDependencies ..");
console.log(`${logPrefix}checking peerDependencies...`);
repoPackages = makeDependencySectionConsistentForPackage(
repoPackages,
repoPackages[pkg].json.peerDependencies,
depName,
catalogs,
`${logPrefix}\t`,
);
return repoPackages;
}
Expand All @@ -234,7 +256,7 @@ async function main(argv) {
let targetPackages = [];
for (const pkg of Object.keys(repoPackages)) {
if (
["client", "core", "management"].includes(repoPackages[pkg].versionPolicy) &&
["client", "core", "management", "utility"].includes(repoPackages[pkg].versionPolicy) &&
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adding the missing utility

repoPackages[pkg].projectFolder.startsWith(`sdk/${service}`) &&
!repoPackages[pkg].json["private"]
) {
Expand All @@ -249,14 +271,13 @@ async function main(argv) {
process.exit(1);
}
// Set all the new versions & update any references to internal projects with the new versions
console.log(`Updating packages with build ID ${buildId}`);

console.log(`Updating the following packages with build ID ${buildId}`);
console.dir(targetPackages);
for (const pkg of targetPackages) {
console.log("package updated = ");
console.log(pkg);
console.log(`package updated = ${pkg}`);
repoPackages = updatePackageVersion(repoPackages, pkg, buildId, config.catalogs);
repoPackages = updateInternalDependencyVersions(repoPackages, pkg, buildId, config.catalogs);
console.log(repoPackages[pkg].newVer);
console.log(`newer version: ${repoPackages[pkg].newVer}`);
}

for (const pkg of Object.keys(repoPackages)) {
Expand Down