Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | import type { VersionBumpResults } from 'bumpp'
import path from 'node:path'
import process from 'node:process'
import chalk from 'chalk'
import enquirer from 'enquirer'
import { x } from 'tinyexec'
import { generateChangelog } from './changelog'
import { squashLastNCommits } from './git-utils'
import { gitCommit } from './git-utils/commit'
import GitTagParser from './git-utils/tags'
import { detectMonorepo } from './monorepo/detect'
import { findPackages } from './monorepo/packages'
import { prefix } from './utils/cli-utilities'
import { selectPackages } from './utils/enquirer'
import { createFile } from './utils/file'
import logger from './utils/logger'
import { bumpVersion } from './version/bump'
async function main() {
console.log(chalk.blue('Checking monorepo structure...'))
const monorepo = await detectMonorepo()
if (!monorepo) {
console.log(chalk.red('Not a pnpm monorepo project'))
return process.exit(1)
}
const allPackages = await findPackages(monorepo)
const publishable = allPackages.filter(p => !p.private)
const selected = await selectPackages(publishable)
// Bump versions
const { confirm_dump } = await enquirer.prompt<{ confirm_dump: boolean }>({
type: 'confirm',
name: 'confirm_dump',
prefix,
message: 'Ready to dump version?',
})
if (confirm_dump !== true) {
return logger.info(`You have canceled dump version`)
}
const bumpCache: Record<string, VersionBumpResults> = {}
for (const pkg of selected) {
logger.info(`Bumping version for ${chalk.bold(pkg.name)} ...`)
const res = await bumpVersion(pkg, `${pkg.name}@%s`)
bumpCache[pkg.name] = res
// 创建当前更新日志
const parser = new GitTagParser()
await parser.fetchTags()
const lastTag = parser.lastTag
if (lastTag && lastTag === res.tag) {
const prevTag = (await parser.getPreviousTag(lastTag, true))?.tag ?? parser.firstTag
const commits = await parser.getCommitsBetweenTags(lastTag, prevTag, true)
const changelog = generateChangelog(commits, lastTag)
const changelogPath = createFile(path.join(pkg.path, 'changelog.md'), changelog, { prepend: true })
await x('npx', ['eslint', '--fix', changelogPath])
await gitCommit([changelogPath], `chore(changelog): ${lastTag}`)
await squashLastNCommits(2)
}
}
if (selected.length) {
await squashLastNCommits(selected.length)
}
// Publish
// const { confirm } = await enquirer.prompt({
// type: 'confirm',
// name: 'confirm',
// message: 'Ready to publish packages?',
// })
// if (confirm) {
// for (const pkg of selected) {
// console.log(chalk.blue(`Publishing ${pkg.name}...`))
// await publishPackage(pkg)
// }
// }
}
main().catch(console.error)
|