From 66aed715a590fb6b6d3d259abc38a8a52635c2e4 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sun, 4 Jan 2026 22:30:58 +0300 Subject: [PATCH 1/3] #160 check node version at startup per package.json / engines --- lib/NodeVersion.js | 17 +++++++++++++++++ mr.js | 10 ++++++++-- package.json | 3 +++ tests/NodeVersion.js | 26 ++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 lib/NodeVersion.js create mode 100644 tests/NodeVersion.js diff --git a/lib/NodeVersion.js b/lib/NodeVersion.js new file mode 100644 index 0000000..d450a1a --- /dev/null +++ b/lib/NodeVersion.js @@ -0,0 +1,17 @@ +class NodeVersion { + constructor (engines, nodeVersion) { + this.minMajor = parseInt(engines.node.split('>=')[1]) + this.major = parseInt(nodeVersion.split('.')[0]) + this.version = nodeVersion + } + + isValid () { + return this.major >= this.minMajor + } + + toError () { + return `Node.js ${this.minMajor}+ required (current: v${this.version})` + } +} + +module.exports = NodeVersion diff --git a/mr.js b/mr.js index c3e484f..d2442d3 100644 --- a/mr.js +++ b/mr.js @@ -2,6 +2,8 @@ const ParsedArgs = require('./lib/ParsedArgs') const MrCommand = require('./lib/MrCommand') const RunCommand = require('./lib/RunCommand') +const NodeVersion = require('./lib/NodeVersion') +const pkg = require('./package.json') const main = async (argv) => { await new RunCommand ( @@ -17,6 +19,12 @@ module.exports = { main } +const nodeVersion = new NodeVersion(pkg.engines, process.versions.node) +if (!nodeVersion.isValid()) { + console.error(nodeVersion.toError()) + process.exit(1) +} + // eslint-disable-next-line no-floating-promise/no-floating-promise ; (async () => { @@ -27,8 +35,6 @@ module.exports = { try { await main (process.argv.slice (2)) } catch (x) { - console.error(`Node.js version: ${process.version}`) - console.error(x.message.split('\n')[0]) process.exit(1) } diff --git a/package.json b/package.json index 0c76050..c4e58e8 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.1.12", "description": "yet another git flow cli", "main": "mr.js", + "engines": { + "node": ">=18" + }, "publishConfig": { "access": "public" }, diff --git a/tests/NodeVersion.js b/tests/NodeVersion.js new file mode 100644 index 0000000..964d23a --- /dev/null +++ b/tests/NodeVersion.js @@ -0,0 +1,26 @@ +const {describe, it} = require('node:test') +const assert = require('assert') +const NodeVersion = require('../lib/NodeVersion') + +describe('NodeVersion', () => { + + it('valid when major >= min', () => { + const v = new NodeVersion({node: '>=18'}, '20.10.0') + assert.ok(v.isValid()) + }) + + it('valid when major == min', () => { + const v = new NodeVersion({node: '>=18'}, '18.0.0') + assert.ok(v.isValid()) + }) + + it('invalid when major < min', () => { + const v = new NodeVersion({node: '>=18'}, '16.20.0') + assert.ok(!v.isValid()) + }) + + it('toError returns message', () => { + const v = new NodeVersion({node: '>=18'}, '16.20.0') + assert.equal(v.toError(), 'Node.js 18+ required (current: v16.20.0)') + }) +}) From 50035618c862e8896ac6f985d6769ac4e32ac8a1 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sun, 4 Jan 2026 22:32:56 +0300 Subject: [PATCH 2/3] npm audit FIX --- package-lock.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 796be74..0cf2783 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,9 @@ "eslint-plugin-no-floating-promise": "^2.0.0", "eslint-plugin-sonarjs": "^1.0.4", "globals": "^16.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/@ampproject/remapping": { @@ -518,9 +521,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "dependencies": { "argparse": "^1.0.7", @@ -1737,9 +1740,9 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "dependencies": { "argparse": "^2.0.1" From eb294bb49777f612756da80265dc27273a2135c2 Mon Sep 17 00:00:00 2001 From: Maksim Gruzdev Date: Sun, 4 Jan 2026 22:42:29 +0300 Subject: [PATCH 3/3] (try to) FIX 'Unable to deserialize cloned data due to invalid or unsupported version.' --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0395291..bebe9a0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 18 + - run: npm cache clean --force - run: npm ci - run: npm test # @todo #0:1h use --test-coverage-exclude to exclude tests from cov