From 3eedb68bc57f8df912b614dd8c2161b8b05328b6 Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Tue, 8 Feb 2022 14:37:31 -0800 Subject: [PATCH 1/7] Raise an error when the version of node is older than v12 --- src/importer.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/importer.js b/src/importer.js index 5347a38ca..f6818b524 100644 --- a/src/importer.js +++ b/src/importer.js @@ -11,3 +11,11 @@ async function importer(descriptor) { } module.exports = { importer } + +// None of this stuff will work on versions of Node older than v12 +const MIN_NODE_VERSION = 'v12' +if (process.version < MIN_NODE_VERSION) { + throw new Error( + `Cucumber can't run on this version (${process.version}) of Node. Please upgrade to at least ${MIN_NODE_VERSION}.` + ) +} From 760a5d8198c90f21dccf6d04417f21a03e52eab6 Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Tue, 8 Feb 2022 14:45:58 -0800 Subject: [PATCH 2/7] Update CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf5aa7061..da14dd293 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CO - Cucumber Expressions now support a wider array of parameter types (see [documentation](https://github.com/cucumber/cucumber-expressions#parameter-types)) - Improved styling and usability on report from `html` formatter +### Fixed +- Warn users who are on an unsupported node version ([#1922](https://github.com/cucumber/cucumber-js/pull/1922)) + ### Changed - Switch from `colors` to `chalk` for terminal coloring ([#1895](https://github.com/cucumber/cucumber-js/pull/1895)) From 7c3995e4c1466a37db5e7171252bbe7a25896636 Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Wed, 9 Feb 2022 11:11:31 -0800 Subject: [PATCH 3/7] Move engine check to cli runner --- src/cli/run.ts | 17 +++++++++++++++++ src/importer.js | 8 -------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/cli/run.ts b/src/cli/run.ts index 508b71666..87c865081 100644 --- a/src/cli/run.ts +++ b/src/cli/run.ts @@ -11,7 +11,24 @@ function displayPublishAdvertisementBanner(): void { console.error(publishBanner) } +function assertNodeEngineVersion() { + // None of this stuff will work on versions of Node older than v12 + const MIN_NODE_VERSION = 'v12' + if (process.version < MIN_NODE_VERSION) { + throw new Error( + `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${process.version}` + ) + } +} + export default async function run(): Promise { + try { + assertNodeEngineVersion() + } catch (error) { + console.error(error.message) + process.exit(1) + } + const cli = new Cli({ argv: process.argv, cwd: process.cwd(), diff --git a/src/importer.js b/src/importer.js index f6818b524..5347a38ca 100644 --- a/src/importer.js +++ b/src/importer.js @@ -11,11 +11,3 @@ async function importer(descriptor) { } module.exports = { importer } - -// None of this stuff will work on versions of Node older than v12 -const MIN_NODE_VERSION = 'v12' -if (process.version < MIN_NODE_VERSION) { - throw new Error( - `Cucumber can't run on this version (${process.version}) of Node. Please upgrade to at least ${MIN_NODE_VERSION}.` - ) -} From 52213554d833dbb22b6f812c8f00400a5104ac77 Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Wed, 9 Feb 2022 11:13:58 -0800 Subject: [PATCH 4/7] Simplify --- src/cli/run.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/cli/run.ts b/src/cli/run.ts index 87c865081..db42019b6 100644 --- a/src/cli/run.ts +++ b/src/cli/run.ts @@ -15,19 +15,14 @@ function assertNodeEngineVersion() { // None of this stuff will work on versions of Node older than v12 const MIN_NODE_VERSION = 'v12' if (process.version < MIN_NODE_VERSION) { - throw new Error( - `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${process.version}` - ) + const message = `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${process.version}` + console.error(message) + process.exit(1) } } export default async function run(): Promise { - try { - assertNodeEngineVersion() - } catch (error) { - console.error(error.message) - process.exit(1) - } + assertNodeEngineVersion() const cli = new Cli({ argv: process.argv, From 4fb2f576eea776a3c991711a3d80bdc2edfb76fd Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Wed, 9 Feb 2022 11:27:25 -0800 Subject: [PATCH 5/7] Extract to own file and add tests --- src/cli/assert_node_engine_version.ts | 14 ++++++++++++++ src/cli/assert_node_engine_version_spec.ts | 12 ++++++++++++ src/cli/run.ts | 16 ++++++---------- 3 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 src/cli/assert_node_engine_version.ts create mode 100644 src/cli/assert_node_engine_version_spec.ts diff --git a/src/cli/assert_node_engine_version.ts b/src/cli/assert_node_engine_version.ts new file mode 100644 index 000000000..69f7cfe5d --- /dev/null +++ b/src/cli/assert_node_engine_version.ts @@ -0,0 +1,14 @@ +import fs from 'fs' +import path from 'path' +import semver from 'semver' + +const raw = fs.readFileSync(path.resolve(__dirname, '..', '..', 'package.json')) + +export function assertNodeEngineVersion(currentVersion: string) { + // None of this stuff will work on versions of Node older than v12 + const MIN_NODE_VERSION = 'v12' + if (currentVersion < MIN_NODE_VERSION) { + const message = `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${currentVersion}` + throw new Error(message) + } +} diff --git a/src/cli/assert_node_engine_version_spec.ts b/src/cli/assert_node_engine_version_spec.ts new file mode 100644 index 000000000..3c0f6511a --- /dev/null +++ b/src/cli/assert_node_engine_version_spec.ts @@ -0,0 +1,12 @@ +import assert from 'assert' +import { assertNodeEngineVersion } from './assert_node_engine_version' + +describe(assertNodeEngineVersion.name, () => { + it('fails when the version is lower than specified in package.json', () => { + assert.throws(() => assertNodeEngineVersion('v11.0.0')) + }) + + it('passes when the version is greater than specified in package.json', () => { + assertNodeEngineVersion('v17.0.0') + }) +}) diff --git a/src/cli/run.ts b/src/cli/run.ts index db42019b6..f7dec91e1 100644 --- a/src/cli/run.ts +++ b/src/cli/run.ts @@ -1,6 +1,7 @@ import Cli, { ICliRunResult } from './' import VError from 'verror' import publishBanner from './publish_banner' +import { assertNodeEngineVersion } from './assert_node_engine_version' function exitWithError(error: Error): void { console.error(VError.fullStack(error)) // eslint-disable-line no-console @@ -11,18 +12,13 @@ function displayPublishAdvertisementBanner(): void { console.error(publishBanner) } -function assertNodeEngineVersion() { - // None of this stuff will work on versions of Node older than v12 - const MIN_NODE_VERSION = 'v12' - if (process.version < MIN_NODE_VERSION) { - const message = `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${process.version}` - console.error(message) +export default async function run(): Promise { + try { + assertNodeEngineVersion(process.version) + } catch (error) { + console.error(error.message) // eslint-disable-line no-console process.exit(1) } -} - -export default async function run(): Promise { - assertNodeEngineVersion() const cli = new Cli({ argv: process.argv, From 6aa773fa5624ac1ff349cdbe3fda62a6046ef0da Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Wed, 9 Feb 2022 11:41:43 -0800 Subject: [PATCH 6/7] Read minimum version from package.json --- src/cli/assert_node_engine_version.ts | 23 ++++++++++++++++------ src/cli/assert_node_engine_version_spec.ts | 8 +++++++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/cli/assert_node_engine_version.ts b/src/cli/assert_node_engine_version.ts index 69f7cfe5d..e2a72f4ab 100644 --- a/src/cli/assert_node_engine_version.ts +++ b/src/cli/assert_node_engine_version.ts @@ -2,13 +2,24 @@ import fs from 'fs' import path from 'path' import semver from 'semver' -const raw = fs.readFileSync(path.resolve(__dirname, '..', '..', 'package.json')) +type PackageJSON = { + engines: { node: string } +} + +const readActualPackageJSON: () => PackageJSON = () => + JSON.parse( + fs + .readFileSync(path.resolve(__dirname, '..', '..', 'package.json')) + .toString() + ) -export function assertNodeEngineVersion(currentVersion: string) { - // None of this stuff will work on versions of Node older than v12 - const MIN_NODE_VERSION = 'v12' - if (currentVersion < MIN_NODE_VERSION) { - const message = `Cucumber can only run on Node.js versions ${MIN_NODE_VERSION} and greater. This Node.js version is ${currentVersion}` +export function assertNodeEngineVersion( + currentVersion: string, + readPackageJSON: () => PackageJSON = readActualPackageJSON +): void { + const requiredVersion = readPackageJSON().engines.node + if (!semver.satisfies(currentVersion, requiredVersion)) { + const message = `Cucumber can only run on Node.js versions ${requiredVersion}. This Node.js version is ${currentVersion}` throw new Error(message) } } diff --git a/src/cli/assert_node_engine_version_spec.ts b/src/cli/assert_node_engine_version_spec.ts index 3c0f6511a..01133411a 100644 --- a/src/cli/assert_node_engine_version_spec.ts +++ b/src/cli/assert_node_engine_version_spec.ts @@ -3,7 +3,13 @@ import { assertNodeEngineVersion } from './assert_node_engine_version' describe(assertNodeEngineVersion.name, () => { it('fails when the version is lower than specified in package.json', () => { - assert.throws(() => assertNodeEngineVersion('v11.0.0')) + assert.throws(() => + assertNodeEngineVersion('v11.0.0', () => ({ + engines: { + node: '>=12', + }, + })) + ) }) it('passes when the version is greater than specified in package.json', () => { From 3d1e6d5059110f3a572a062dbf569c6bfa05a608 Mon Sep 17 00:00:00 2001 From: Matt Wynne Date: Wed, 9 Feb 2022 11:54:04 -0800 Subject: [PATCH 7/7] Make semver a production dependency --- package-lock.json | 12 +++--------- package.json | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index c910567ae..925b32293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "progress": "^2.0.3", "resolve": "^1.19.0", "resolve-pkg": "^2.0.0", + "semver": "7.3.5", "stack-chain": "^2.0.0", "string-argv": "^0.3.1", "tmp": "^0.2.1", @@ -85,7 +86,6 @@ "nyc": "15.1.0", "prettier": "2.5.1", "reindent-template-literals": "1.1.0", - "semver": "7.3.5", "shx": "0.3.4", "sinon": "13.0.1", "sinon-chai": "3.7.0", @@ -4501,7 +4501,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6132,7 +6131,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7124,8 +7122,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -10633,7 +10630,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -11823,7 +11819,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -12592,8 +12587,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index e1dd4ee58..0508d2672 100644 --- a/package.json +++ b/package.json @@ -209,6 +209,7 @@ "progress": "^2.0.3", "resolve": "^1.19.0", "resolve-pkg": "^2.0.0", + "semver": "7.3.5", "stack-chain": "^2.0.0", "string-argv": "^0.3.1", "tmp": "^0.2.1", @@ -258,7 +259,6 @@ "nyc": "15.1.0", "prettier": "2.5.1", "reindent-template-literals": "1.1.0", - "semver": "7.3.5", "shx": "0.3.4", "sinon": "13.0.1", "sinon-chai": "3.7.0",