NodeJS Engine Version Checker

JS
S
JavaScript

Simple but efficient engines version checker for any node project. Warning: will terminate the node process with a non zero code. https://semver.org/ X.Y.Z <major.minor.patch> Semver specs: 0.0.1 is a development API 1.0.0 is the Public API

1// package.json
2  "engines": {
3    "node": ">= 10.0.0",
4    "npm": ">= 5.0.0"
5  }
6
7// /lib/version-checker.js
8'use strict'
9
10const semver = require('semver');
11const packageRequirements = require('../package.json');
12const { execSync } = require('child_process');
13const logger = require('./logger');
14
15/* Spawns a shell then executes the command within that shell, buffering any generated output
16  Note: will block the Node.js event loop !!!
17*/
18function exec (cmd) {
19  return execSync(cmd).toString().trim()
20}
21
22// Mininum versions array
23const minimumRequirements = [
24  {
25    name: 'node',
26    currentVersion: semver.clean(process.version),
27    minimumVersion: packageRequirements.engines.node
28  },
29  {
30    name: 'npm',
31    currentVersion: exec('npm --version'),
32    minimumVersion: packageRequirements.engines.npm
33  }
34]
35
36function checkVersions(){
37  const warnings = []
38  minimumRequirements.forEach(requirement => {
39    if (!semver.satisfies(requirement.currentVersion, requirement.minimumVersion)) {
40      warnings.push(`${requirement.name}: ${requirement.currentVersion} should be: ${requirement.minimumVersion}`
41      )
42    }
43  });
44  return warnings;
45}
46
47module.exports = function(cb) {
48  const warnings = checkVersions();
49  if (warnings.length > 0) {
50    warnings.forEach(warning => {
51      logger.log(warning)
52    });
53    cb(warnings)
54  } else {
55    logger.log('Node and NPM versions checks passed.');
56    cb();
57  }
58}
59
60// app.js
61'use strict'
62const versionChecker = require('./lib/version-checker');
63// Initialization Middleware
64// -----------------------------
65versionChecker((err, result) => {
66  if(err) {
67    // if(err) { throw err; }
68    // Force process termination with non-zero signal
69    process.exit(1);
70  } else {
71    // initialisation middleware goes here
72  }
73});
74

Created on 2/4/2018