From 8423b74d3f5dba2eac96aa5d1752bd3425f5cfdb Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sat, 1 Dec 2018 23:15:42 -0800 Subject: [PATCH] chore: script to bump supported node versions (#156) * chore: script to bump supported node versions No change to node support, this just adds a script. This adds a script to check that we correctly configure all supported node versions, since we need to update quite a few spots (README.md, package.json, travis, appveyor). Issue shelljs/shelljs#873 Test: manual * rename package variable * configure lint --- .travis.yml | 1 + README.md | 2 + package.json | 2 + scripts/.eslintrc.json | 10 ++++ scripts/check-node-support.js | 86 +++++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 scripts/.eslintrc.json create mode 100755 scripts/check-node-support.js diff --git a/.travis.yml b/.travis.yml index b4b9eba..c38778c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ os: - osx script: - npm test + - npm run check-node-support after_success: - npm run codecov -- -f coverage/lcov.info diff --git a/README.md b/README.md index 3ef0d9c..8bd20d5 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ commands, providing an easy solution for simple Unix-like, cross-platform commands in npm package scripts. +`shx` is proudly tested on every node release since `v4`! + ## Difference Between ShellJS and shx - **ShellJS:** Good for writing long scripts, all in JS, running via NodeJS (e.g. `node myScript.js`). diff --git a/package.json b/package.json index 8456ed2..4adf81c 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lib" ], "scripts": { + "check-node-support": "node scripts/check-node-support", "prebuild": "rimraf lib", "build": "babel src -d lib", "build:watch": "npm run build -- -w", @@ -59,6 +60,7 @@ "eslint": "^2.10.1", "eslint-config-airbnb-base": "^3.0.1", "eslint-plugin-import": "^1.8.0", + "js-yaml": "^3.12.0", "mocha": "^5.2.0", "nyc": "^11.0.0", "rimraf": "^2.5.2", diff --git a/scripts/.eslintrc.json b/scripts/.eslintrc.json new file mode 100644 index 0000000..2ea7b16 --- /dev/null +++ b/scripts/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "env": { + "node": true + }, + "extends": "../.eslintrc.json", + "rules": { + "prefer-template": 0, + "no-var": 0 + } +} diff --git a/scripts/check-node-support.js b/scripts/check-node-support.js new file mode 100755 index 0000000..49db8c4 --- /dev/null +++ b/scripts/check-node-support.js @@ -0,0 +1,86 @@ +#!/usr/bin/env node + +var assert = require('assert'); +var path = require('path'); + +var yaml = require('js-yaml'); + +var shell = require('shelljs'); + +// This is the authoritative list of supported node versions. +var MIN_NODE_VERSION = 4; +var MAX_NODE_VERSION = 10; + +function checkReadme(minNodeVersion) { + var start = ''; + var stop = ''; + var formattedMinVersion = '`v' + minNodeVersion + '`'; + var expectedReadmeRegex = new RegExp( + start + '\\s*' + formattedMinVersion + '\\s*' + stop, ''); + var readme = path.join(__dirname, '..', 'README.md'); + var match = shell.grep(expectedReadmeRegex, readme); + if (!match.toString()) { + var msg = 'Update README to specify the min supported version. Look for "' + + start + '"'; + throw new Error(msg); + } +} + +function checkEngines(minNodeVersion, pack) { + var expectedEnginesNode = '>=' + minNodeVersion; + if (pack.engines.node !== expectedEnginesNode) { + var msg = 'Update package.json to fix the "engines" attribute'; + throw new Error(msg); + } +} + +function assertDeepEquals(arr1, arr2, msg) { + try { + assert.deepStrictEqual(arr1, arr2); + } catch (e) { + throw new Error(msg + '\n' + e); + } +} + +function range(start, stop) { + var ret = []; + for (var i = start; i <= stop; i++) { + ret.push(i); + } + return ret; +} + +function checkTravis(minNodeVersion, maxNodeVersion, travisYaml) { + var expectedTravisVersions = range(minNodeVersion, maxNodeVersion); + var msg = 'Check Travis node_js versions'; + assertDeepEquals(travisYaml.node_js, expectedTravisVersions, msg); +} + +function checkAppveyor(minNodeVersion, maxNodeVersion, appveyorYaml) { + var expectedAppveyorVersions = range(minNodeVersion, maxNodeVersion) + .map(num => ({ nodejs_version: num.toString() })) + .reverse(); // Arbitrarily, we store appveyor in reverse order. + var msg = 'Check Appveyor environment.matrix versions'; + assertDeepEquals(appveyorYaml.environment.matrix, expectedAppveyorVersions, + msg); +} + +try { + checkReadme(MIN_NODE_VERSION); + + var pack = require('../package.json'); + checkEngines(MIN_NODE_VERSION, pack); + + var travisFileName = path.join(__dirname, '..', '.travis.yml'); + var travisYaml = yaml.safeLoad(shell.cat(travisFileName)); + checkTravis(MIN_NODE_VERSION, MAX_NODE_VERSION, travisYaml); + + var appveyorFileName = path.join(__dirname, '..', 'appveyor.yml'); + var appveyorYaml = yaml.safeLoad(shell.cat(appveyorFileName)); + checkAppveyor(MIN_NODE_VERSION, MAX_NODE_VERSION, appveyorYaml); +} catch (e) { + console.error('Please check the files which declare our Node version'); + console.error('support, as something is out-of-sync. This script failed'); + console.error('specificaly because:'); + throw e; +}