From 1f32557743896520848a1d52017deee89c11578b Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 30 Nov 2022 14:52:46 +0100 Subject: [PATCH] fix(scripts/gen-deps-list): fix packages order (#6564) The release order computation is now uncoupled of the packages to release computation, and is now done for all packages so that transitive dependencies are still correctly ordered. --- package.json | 1 - scripts/_computeDepOrder.js | 44 +++++++++++++++++++++++++++++++++++++ scripts/gen-deps-list.js | 37 ++++++++++--------------------- 3 files changed, 56 insertions(+), 26 deletions(-) create mode 100644 scripts/_computeDepOrder.js diff --git a/package.json b/package.json index 80a6c4830..97500a4fe 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "@vates/async-each": "^1.0.0", "babel-jest": "^29.0.3", "benchmark": "^2.1.4", - "deptree": "^1.0.0", "eslint": "^8.7.0", "eslint-config-prettier": "^8.1.0", "eslint-config-standard": "^17.0.0", diff --git a/scripts/_computeDepOrder.js b/scripts/_computeDepOrder.js new file mode 100644 index 000000000..8f56e13fe --- /dev/null +++ b/scripts/_computeDepOrder.js @@ -0,0 +1,44 @@ +'use strict' + +function addPkgDepsToTree(deps, internalDeps) { + if (deps !== undefined) { + for (const depName of Object.keys(deps)) { + const dep = this.pkgs[depName] + if (dep !== undefined) { + internalDeps.push(depName) + addPkgToTree.call(this, dep) + } + } + } +} + +function addPkgToTree(pkg) { + const { name, package: pkgJson } = pkg + + if (!(name in this.tree)) { + const internalDeps = (this.tree[name] = []) + + addPkgDepsToTree.call(this, pkgJson.dependencies, internalDeps) + addPkgDepsToTree.call(this, pkgJson.devDependencies, internalDeps) + addPkgDepsToTree.call(this, pkgJson.optionalDependencies, internalDeps) + } +} + +function addPkgToResolution(name) { + if (!this.resolution.has(name)) { + this.tree[name].sort().forEach(addPkgToResolution, this) + this.resolution.add(name) + } +} + +/** + * @returns {string[]} package names in the order they should be released + */ +module.exports = function computeDepOrder(pkgsByName) { + const tree = { __proto__: null } + Object.values(pkgsByName).forEach(addPkgToTree, { pkgs: pkgsByName, tree }) + + const resolution = new Set() + Object.keys(tree).sort().forEach(addPkgToResolution, { resolution, tree }) + return Array.from(resolution) +} diff --git a/scripts/gen-deps-list.js b/scripts/gen-deps-list.js index 2dcc63d90..470847894 100755 --- a/scripts/gen-deps-list.js +++ b/scripts/gen-deps-list.js @@ -1,7 +1,6 @@ #!/usr/bin/env node 'use strict' -const DepTree = require('deptree') const fs = require('fs').promises const joinPath = require('path').join const semver = require('semver') @@ -10,6 +9,8 @@ const escapeRegExp = require('lodash/escapeRegExp') const invert = require('lodash/invert') const keyBy = require('lodash/keyBy') +const computeDepOrder = require('./_computeDepOrder.js') + const changelogConfig = { path: joinPath(__dirname, '../CHANGELOG.unreleased.md'), startTag: '', @@ -19,14 +20,6 @@ const changelogConfig = { const RELEASE_WEIGHT = { PATCH: 1, MINOR: 2, MAJOR: 3 } const RELEASE_TYPE = invert(RELEASE_WEIGHT) -const releaseGraph = { __proto__: null } -function addToGraph(name, depName) { - const deps = releaseGraph[name] ?? (releaseGraph[name] = []) - if (depName !== undefined) { - deps.push(depName) - } -} - /** @type {Map} A mapping of package names to their release weight */ const packagesToRelease = new Map() @@ -64,6 +57,7 @@ async function main(args, scriptName) { } allPackages = keyBy(await getPackages(true), 'name') + const releaseOrder = computeDepOrder(allPackages) Object.entries(toRelease).forEach(([packageName, releaseType]) => { const rootPackage = allPackages[packageName] @@ -74,7 +68,6 @@ async function main(args, scriptName) { const rootReleaseWeight = releaseTypeToWeight(releaseType) registerPackageToRelease(packageName, rootReleaseWeight) - addToGraph(rootPackage.name) handlePackageDependencies(rootPackage.name, getNextVersion(rootPackage.package.version, rootReleaseWeight)) }) @@ -82,20 +75,15 @@ async function main(args, scriptName) { const commandsToExecute = ['', 'Commands to execute:', ''] const releasedPackages = ['', '### Released packages', ''] - const tree = new DepTree() - Object.keys(releaseGraph) - .sort() - .forEach(name => { - tree.add(name, releaseGraph[name]) - }) - - tree.resolve().forEach(dependencyName => { - const releaseWeight = packagesToRelease.get(dependencyName) - const { - package: { version }, - } = allPackages[dependencyName] - commandsToExecute.push(`./scripts/bump-pkg ${dependencyName} ${RELEASE_TYPE[releaseWeight].toLocaleLowerCase()}`) - releasedPackages.push(`- ${dependencyName} ${getNextVersion(version, releaseWeight)}`) + releaseOrder.forEach(name => { + if (packagesToRelease.has(name)) { + const releaseWeight = packagesToRelease.get(name) + const { + package: { version }, + } = allPackages[name] + commandsToExecute.push(`./scripts/bump-pkg ${name} ${RELEASE_TYPE[releaseWeight].toLocaleLowerCase()}`) + releasedPackages.push(`- ${name} ${getNextVersion(version, releaseWeight)}`) + } }) console.log(commandsToExecute.join('\n')) @@ -153,7 +141,6 @@ function handlePackageDependencies(packageName, packageNextVersion) { if (releaseWeight !== undefined) { registerPackageToRelease(name, releaseWeight) - addToGraph(name, packageName) handlePackageDependencies(name, getNextVersion(version, releaseWeight)) } }