diff --git a/package-lock.json b/package-lock.json index b997167212..b0278890af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5334,6 +5334,8 @@ }, "node_modules/@types/semver": { "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, @@ -18618,8 +18620,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "dev": true, + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -22045,6 +22048,7 @@ "fs-extra": "^9.0.1", "live-server": "1.2.1", "lodash": "^4.17.15", + "semver": "^7.7.4", "url-parse": "^1.5.10", "winston": "^3.19.0", "winston-daily-rotate-file": "^5.0.0" @@ -22058,6 +22062,7 @@ "@babel/preset-typescript": "^7.28.5", "@types/jest": "^29.4.6", "@types/lodash": "^4.17.15", + "@types/semver": "^7.7.1", "@types/url-parse": "^1.4.8", "babel-jest": "^29.7.0", "diff": "^8.0.3", diff --git a/packages/cli/index.ts b/packages/cli/index.ts index 4a594a3325..9e9b7f70ee 100755 --- a/packages/cli/index.ts +++ b/packages/cli/index.ts @@ -8,6 +8,7 @@ import { build } from './src/cmd/build.js'; import { deploy } from './src/cmd/deploy.js'; import { init } from './src/cmd/init.js'; import { serve } from './src/cmd/serve.js'; +import { preFlightChecks } from './src/util/preFlightChecks.js'; import packageJson from './package.json' with { type: 'json' }; const CLI_VERSION = packageJson.version; @@ -23,6 +24,9 @@ function printHeader() { return ''; } +program + .hook('preAction', () => preFlightChecks()); + program .addHelpText('beforeAll', printHeader()) .showHelpAfterError('(run "markbind --help" to list commands)') diff --git a/packages/cli/package.json b/packages/cli/package.json index 398fdc1d89..6b2f73b993 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -45,6 +45,7 @@ "fs-extra": "^9.0.1", "live-server": "1.2.1", "lodash": "^4.17.15", + "semver": "^7.7.4", "url-parse": "^1.5.10", "winston": "^3.19.0", "winston-daily-rotate-file": "^5.0.0" @@ -53,6 +54,7 @@ "@babel/core": "^7.29.0", "@babel/preset-env": "^7.29.0", "@babel/preset-typescript": "^7.28.5", + "@types/semver": "^7.7.1", "@types/jest": "^29.4.6", "@types/lodash": "^4.17.15", "@types/url-parse": "^1.4.8", diff --git a/packages/cli/src/util/preFlightChecks.ts b/packages/cli/src/util/preFlightChecks.ts new file mode 100644 index 0000000000..5df97f4e69 --- /dev/null +++ b/packages/cli/src/util/preFlightChecks.ts @@ -0,0 +1,31 @@ +import * as semver from 'semver'; +import * as logger from './logger.js'; +import packageJson from '../../package.json' with { type: 'json' }; + +const CLI_VERSION = packageJson.version; +const REQUIRED_NODE_VERSION = '22.12.0'; + +function checkNode() { + const nodeVersion = process.version; + const version = semver.coerce(nodeVersion); + + if (version === null) { + logger.warn('Unknown version of node detected.'); + return; + } + if (semver.lt(version, REQUIRED_NODE_VERSION)) { + logger.error( + `Markbind ${CLI_VERSION} requires node >=${REQUIRED_NODE_VERSION}. ` + + 'Please update node or use an older version of Markbind!', + ); + process.exit(1); + } +} + +/** + * Performs pre-usage checks to ensure the application will run as expected. + * This method may exit the process if checks fail. + */ +export function preFlightChecks() { + checkNode(); +}