diff --git a/core/server/utils/npm/preinstall.js b/core/server/utils/npm/preinstall.js new file mode 100644 index 0000000000..46781b276d --- /dev/null +++ b/core/server/utils/npm/preinstall.js @@ -0,0 +1,47 @@ +var validVersions = process.env.npm_package_engines_node.split(' || '), + currentVersion = process.versions.node, + foundMatch = false, + majMinRegex = /(\d+\.\d+)/, + majorRegex = /^\d+/, + minorRegex = /\d+$/, + exitCodes = { + NODE_VERSION_UNSUPPORTED: 231 + }; + +function doError() { + console.error('\x1B[31mERROR: Unsupported version of Node'); + console.error('\x1B[37mGhost supports LTS Node versions: ' + process.env.npm_package_engines_node); + console.error('You are currently using version: ' + process.versions.node + '\033[0m'); + console.error('\x1B[32mThis check can be overridden, see http://support.ghost.org/supported-node-versions/ for more info\033[0m'); + + process.exit(exitCodes.NODE_VERSION_UNSUPPORTED); +} + +if (process.env.GHOST_NODE_VERSION_CHECK === 'false') { + console.log('\x1B[33mSkipping Node version check\033[0m'); +} else { + try { + currentVersion = currentVersion.match(majMinRegex)[0]; + + validVersions.forEach(function (version) { + var matchChar = version.charAt(0), + versionString = version.match(majMinRegex)[0]; + + if ( + (matchChar === '~' && currentVersion === versionString) + || (matchChar === '^' + && currentVersion.match(majorRegex)[0] === versionString.match(majorRegex)[0] + && currentVersion.match(minorRegex)[0] >= versionString.match(minorRegex)[0] + ) + ) { + foundMatch = true; + } + }); + + if (foundMatch !== true) { + doError(); + } + } catch (e) { + doError(); + } +} diff --git a/package.json b/package.json index 74ea7b94d7..ecfc7c3b3b 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "MIT", "main": "./core/index", "scripts": { - "preinstall": "npm install semver && node -e \"require('./core/server/utils/startup-check.js').nodeVersion()\"", + "preinstall": "node core/server/utils/npm/preinstall.js", "start": "node index", "test": "grunt validate --verbose" },