+import minimist from 'minimist'
import fs from 'node:fs/promises'
import { join, resolve, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
-import minimist from 'minimist'
import chalk from 'chalk'
import semver from 'semver'
import enquirer from 'enquirer'
tag: optionTag,
dry: isDryRun,
skipCleanCheck: skipCleanGitCheck,
+ noDepsUpdate,
+ noPublish,
} = args
+if (args.h || args.help) {
+ console.log(
+ `
+Usage: node release.mjs [flags]
+ node release.mjs [ -h | --help ]
+
+Flags:
+ --skipBuild Skip building packages
+ --tag Publish under a given npm dist tag
+ --dry Dry run
+ --skipCleanCheck Skip checking if the git repo is clean
+ --noDepsUpdate Skip updating dependencies in package.json files
+ --noPublish Skip publishing packages
+`.trim()
+ )
+ process.exit(0)
+}
+
// const preId =
// args.preid ||
// (semver.prerelease(currentVersion) && semver.prerelease(currentVersion)[0])
const EXPECTED_BRANCH = 'main'
-const incrementVersion = increment =>
- semver.inc(currentVersion, increment, preId)
const bin = name => resolve(__dirname, '../node_modules/.bin/' + name)
/**
* @param bin {string}
message: `Select release type for ${chalk.bold.white(name)}`,
choices: versionIncrements
.map(i => `${i}: ${name} (${semver.inc(version, i, preId)})`)
+ .concat(
+ optionTag === 'edge'
+ ? [
+ `edge: ${name} (${semver.inc(
+ version,
+ 'prerelease',
+ 'alpha'
+ )})`,
+ ]
+ : []
+ )
.concat(['custom']),
})
step('\nUpdating versions in package.json files...')
await updateVersions(pkgWithVersions)
- step('\nCopying README for router package...')
- if (!isDryRun) {
- await fs.copyFile(
- resolve(__dirname, '../README.md'),
- resolve(__dirname, '../packages/router/README.md')
- )
- } else {
- console.log(`(skipped)`)
- }
+ step('\nUpdating lock...')
+ await runIfNotDry(`pnpm`, ['install'])
step('\nGenerating changelogs...')
for (const pkg of pkgWithVersions) {
'add',
'packages/*/CHANGELOG.md',
'packages/*/package.json',
+ 'pnpm-lock.yaml',
])
await runIfNotDry('git', [
'commit',
await runIfNotDry('git', ['tag', `${tagName}`])
}
- step('\nPublishing packages...')
- for (const pkg of pkgWithVersions) {
- await publishPackage(pkg)
- }
+ if (!noPublish) {
+ step('\nPublishing packages...')
+ for (const pkg of pkgWithVersions) {
+ await publishPackage(pkg)
+ }
- step('\nPushing to Github...')
- await runIfNotDry('git', ['push', 'origin', ...versionsToPush])
- await runIfNotDry('git', ['push'])
+ step('\nPushing to Github...')
+ await runIfNotDry('git', ['push', 'origin', ...versionsToPush])
+ await runIfNotDry('git', ['push'])
+ } else {
+ console.log(chalk.bold.white(`Skipping publishing...`))
+ }
}
/**
return Promise.all(
packageList.map(({ pkg, version, path, name }) => {
pkg.version = version
- updateDeps(pkg, 'dependencies', packageList)
- updateDeps(pkg, 'peerDependencies', packageList)
+ if (!noDepsUpdate) {
+ updateDeps(pkg, 'dependencies', packageList)
+ updateDeps(pkg, 'peerDependencies', packageList)
+ }
const content = JSON.stringify(pkg, null, 2) + '\n'
return isDryRun
? dryRun('write', [name], {
+ version: pkg.version,
dependencies: pkg.dependencies,
peerDependencies: pkg.peerDependencies,
})
[
'publish',
...(optionTag ? ['--tag', optionTag] : []),
+ ...(skipCleanGitCheck ? ['--no-git-checks'] : []),
'--access',
'public',
'--publish-branch',
EXPECTED_BRANCH,
- ...(skipCleanGitCheck ? ['--no-git-checks'] : []),
],
{
cwd: pkg.path,