diff --git a/package.json b/package.json index 920aa6ee..82e30150 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "p-timeout": "^6.1.1", "path-exists": "^5.0.0", "pkg-dir": "^7.0.0", + "read-pkg": "^7.1.0", "read-pkg-up": "^9.1.0", "rxjs": "^7.8.0", "semver": "^7.3.8", diff --git a/source/prerequisite-tasks.js b/source/prerequisite-tasks.js index 50006c8d..df19e527 100644 --- a/source/prerequisite-tasks.js +++ b/source/prerequisite-tasks.js @@ -4,10 +4,11 @@ import {execa} from 'execa'; import Version from './version.js'; import * as git from './git-util.js'; import * as npm from './npm/util.js'; -import {getTagVersionPrefix} from './util.js'; +import * as util from './util.js'; const prerequisiteTasks = (input, pkg, options) => { const isExternalRegistry = npm.isExternalRegistry(pkg); + /** @type {Version} */ let newVersion = null; const tasks = [ @@ -62,6 +63,18 @@ const prerequisiteTasks = (input, pkg, options) => { newVersion = Version.getAndValidateNewVersionFrom(input, pkg.version); }, }, + { + title: 'Check for Node version bump', + async task() { + // TODO: path + const nodeVersionIncreased = await util.hasNodeVersionIncreased(pkg, ''); + + if (nodeVersionIncreased && !newVersion.isMajor(input)) { + // TODO: better message + throw new Error('The Node version has increased, but this release is not a major version.'); + } + }, + }, { title: 'Check for pre-release version', task() { @@ -75,7 +88,7 @@ const prerequisiteTasks = (input, pkg, options) => { async task() { await git.fetch(); - const tagPrefix = await getTagVersionPrefix(options); + const tagPrefix = await util.getTagVersionPrefix(options); await git.verifyTagDoesNotExistOnRemote(`${tagPrefix}${newVersion}`); }, diff --git a/source/util.js b/source/util.js index 88960b55..6ca107c7 100644 --- a/source/util.js +++ b/source/util.js @@ -1,11 +1,13 @@ import {readPackageUp} from 'read-pkg-up'; +import {packageDirectory} from 'pkg-dir'; +import {readPackage} from 'read-pkg'; import issueRegex from 'issue-regex'; import terminalLink from 'terminal-link'; import {execa} from 'execa'; import pMemoize from 'p-memoize'; import ow from 'ow'; import chalk from 'chalk'; -import {packageDirectory} from 'pkg-dir'; +import semver from 'semver'; import * as gitUtil from './git-util.js'; import * as npmUtil from './npm/util.js'; @@ -82,9 +84,14 @@ export const getNewFiles = async () => { }; }; +const getPackageJsonFromLastRelease = async pkgPath => { + const pkg = await gitUtil.readFileFromLastRelease(pkgPath); + // TODO: tests are failing, either sindresorhus/read-pkg#28 or use normalize-package-data + return readPackage(pkg); +}; + export const getNewDependencies = async (newPkg, pkgPath) => { - let oldPkg = await gitUtil.readFileFromLastRelease(pkgPath); - oldPkg = JSON.parse(oldPkg); + const oldPkg = await getPackageJsonFromLastRelease(pkgPath); const newDependencies = []; @@ -120,3 +127,14 @@ export const getPreReleasePrefix = pMemoize(async options => { return ''; } }); + +export const hasNodeVersionIncreased = async (newPkg, pkgPath) => { + const oldPkg = await getPackageJsonFromLastRelease(pkgPath); + + // TODO: what if `oldPkg` had a version but `newPkg` doesn't? + if (!oldPkg || !newPkg.engines.node) { + return false; + } + + return semver.gt(newPkg.engines.node, oldPkg.engines.node); +}; diff --git a/source/version.js b/source/version.js index 56710fac..818ba2d7 100644 --- a/source/version.js +++ b/source/version.js @@ -12,6 +12,12 @@ export default class Version { return Boolean(semver.prerelease(this.version)); } + // TODO: should this be validated? it's after `getNewVersionFrom` in tasks + // add test in test/version.js + isMajor(input) { + return semver.diff(this.version, input) === 'major'; + } + satisfies(range) { Version.validate(this.version); return semver.satisfies(this.version, range, {