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:
parent
e95aae2129
commit
1f32557743
@ -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",
|
||||
|
44
scripts/_computeDepOrder.js
Normal file
44
scripts/_computeDepOrder.js
Normal 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)
|
||||
}
|
@ -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)
|
||||
releaseOrder.forEach(name => {
|
||||
if (packagesToRelease.has(name)) {
|
||||
const releaseWeight = packagesToRelease.get(name)
|
||||
const {
|
||||
package: { version },
|
||||
} = allPackages[dependencyName]
|
||||
commandsToExecute.push(`./scripts/bump-pkg ${dependencyName} ${RELEASE_TYPE[releaseWeight].toLocaleLowerCase()}`)
|
||||
releasedPackages.push(`- ${dependencyName} ${getNextVersion(version, releaseWeight)}`)
|
||||
} = 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))
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user