mtcute/scripts/version.js

127 lines
4.1 KiB
JavaScript

const fs = require('fs')
const path = require('path')
const semver = require('semver')
function bumpVersion(packageName, version) {
const packageJsons = fs
.readdirSync(path.join(__dirname, '../packages'))
.filter((s) => !s.startsWith('.'))
.map((name) => {
try {
return JSON.parse(
fs.readFileSync(
path.join(__dirname, '../packages', name, 'package.json'),
'utf-8'
)
)
} catch (e) {
if (e.code !== 'ENOENT') throw e
return null
}
})
.filter(Boolean)
const packageJsonChanged = new Set()
// i am pretty fucking sure there is a better way to do this, but whatever
// im tired as fuck and hadnt had sleep for a while
const newVersions = { [packageName]: version }
let hadChanges = true
while (hadChanges) {
hadChanges = false
packageJsons.forEach((json) => {
if (!json.name.startsWith('@mtcute/')) return
const pkgName = json.name.slice(8)
function check(deps) {
if (!deps) return
Object.keys(deps).forEach((depName) => {
if (!depName.startsWith('@mtcute/')) return
const depVersionRange = deps[depName].replace(/^workspace:/, '')
depName = depName.slice(8)
if (
newVersions[depName] &&
!newVersions[pkgName] &&
!semver.satisfies(newVersions[depName], depVersionRange)
) {
newVersions[pkgName] = semver.inc(json.version, 'patch')
hadChanges = true
}
})
}
check(json.dependencies)
check(json.devDependencies)
check(json.peerDependencies)
check(json.optionalDependencies)
})
}
Object.keys(newVersions).forEach((pkgName) => {
packageJsonChanged.add(pkgName)
const version = newVersions[pkgName]
console.log(`updated ${pkgName} to ${version}`)
for (const json of packageJsons) {
if (json.name === `@mtcute/${pkgName}`) continue
function updateDependencies(obj) {
if (!obj) return
Object.keys(obj).forEach((depName) => {
if (!depName.startsWith('@mtcute/')) return
const depVersionRange = obj[depName].replace(/^workspace:/, '')
depName = depName.slice(8)
if (
depName === pkgName &&
!semver.satisfies(version, depVersionRange)
) {
obj[depName] = `workspace:^${version}`
console.log(` - updated dependency ${depName} at ${json.name}`)
packageJsonChanged.add(json.name.slice(8))
}
})
}
updateDependencies(json.dependencies)
updateDependencies(json.devDependencies)
updateDependencies(json.peerDependencies)
updateDependencies(json.optionalDependencies)
}
})
console.log('changed package.json in:', packageJsonChanged)
packageJsonChanged.forEach((name) => {
const json = packageJsons.find((json) => json.name === `@mtcute/${name}`)
if (!json) return
fs.writeFileSync(
path.join(__dirname, '../packages', name, 'package.json'),
JSON.stringify(json, null, 4)
)
})
console.log('Done!')
// because i am fucking dumb and have adhd and always forget it lol
console.log('Now run `pnpm i` and make sure everything compiles.')
}
if (require.main === module) {
const packageName = process.argv[2]
const version = process.argv[3]
if (!packageName || !version) {
console.log('Usage: version.js <packageName> <version>')
process.exit(0)
}
bumpVersion(packageName, version)
}
module.exports = { bumpVersion }