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.
This commit is contained in:
Julien Fontanet 2022-11-30 14:52:46 +01:00 committed by GitHub
parent e95aae2129
commit 1f32557743
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 26 deletions

View File

@ -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",

View File

@ -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)
}

View File

@ -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: '<!--packages-start-->',
@ -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<string, int>} 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))
}
}