import { type ReleaseMeta, getLatestPackageVersionOnNpm, getNewVersion, getPackageVersionsOnNpm, verboseLog, } from '@repodog/cli-utils'; import { writeFileSync } from 'node:fs'; import { type PackageJson, type SetRequired } from 'type-fest'; export const versionPackage = ( packageJson: SetRequired, { packageJsonPath, preid, tag, type }: Pick, ): void => { const { name, version } = packageJson; verboseLog(`Current version: ${version}`); const newVersion = getNewVersion(version, type, tag, preid); if (!newVersion) { throw new Error(`The new package verison for a ${type} increment on ${version} is invalid`); } const latestNpmPackageVersion = getLatestPackageVersionOnNpm(name); const packageVersionsOnNpm = getPackageVersionsOnNpm(name); verboseLog(`New version: ${newVersion}`); verboseLog(`Latest non-prerelease version on npm: ${latestNpmPackageVersion || 'None'}`); if (packageVersionsOnNpm.includes(newVersion)) { throw new Error(`The new ${name} package verison ${newVersion} is equal to a version on npm.`); } try { verboseLog(`Outputting package.json with new version: ${newVersion}`); writeFileSync(packageJsonPath, `${JSON.stringify({ ...packageJson, version: newVersion }, undefined, 2)}\n`); } catch (error: unknown) { // catch arg has to be of type unknown, but in this context it will // always be of type Error. // eslint-disable-next-line @typescript-eslint/consistent-type-assertions verboseLog(`Package.json output error: ${(error as Error).name}, ${(error as Error).message}`); throw new Error(`Could not write the package.json to: ${packageJsonPath}`); } };