From 4387d5d466d34fce2ea07260a70fd0cd361be9cc Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Sat, 6 Jan 2018 12:06:42 -0700 Subject: [PATCH] Ensure installed correct version of modules on startup, bump dependencies (#6207) * Ensure installed correct version of modules * Bump dependencies * Bump promise-polyfill * Fix emailer test * Fix auto-install regression introduced in 9b5e0f9e95ca4d44c15ea388bea4abc715bac446 --- install/package.json | 38 +++++++++++++++++++------------------- src/cli/index.js | 27 ++++++++++++++++++++------- src/cli/package-install.js | 2 -- src/cli/upgrade.js | 1 + src/meta/js.js | 2 +- test/emailer.js | 1 + 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/install/package.json b/install/package.json index e8fa9735fc..91c96c3b80 100644 --- a/install/package.json +++ b/install/package.json @@ -19,23 +19,23 @@ "dependencies": { "ace-builds": "^1.2.9", "async": "2.6.0", - "autoprefixer": "7.1.6", + "autoprefixer": "7.2.4", "bcryptjs": "2.4.3", "benchpressjs": "^1.2.0", "body-parser": "^1.18.2", "bootstrap": "^3.3.7", - "chart.js": "^2.7.0", + "chart.js": "^2.7.1", "colors": "^1.1.2", "compression": "^1.7.1", - "commander": "^2.11.0", + "commander": "^2.12.2", "connect-ensure-login": "^0.1.1", "connect-flash": "^0.1.1", - "connect-mongo": "2.0.0", + "connect-mongo": "2.0.1", "connect-multiparty": "^2.1.0", - "connect-redis": "3.3.2", + "connect-redis": "3.3.3", "cookie-parser": "^1.4.3", "cron": "^1.3.0", - "cropperjs": "^1.1.3", + "cropperjs": "^1.2.2", "csurf": "^1.9.0", "daemon": "^1.1.0", "express": "^4.16.2", @@ -48,12 +48,12 @@ "jquery": "^3.2.1", "jsesc": "2.5.1", "json-2-csv": "^2.1.2", - "less": "^2.7.2", + "less": "^2.7.3", "lodash": "^4.17.4", "logrotate-stream": "^0.2.5", "lru-cache": "4.1.1", "material-design-lite": "^1.3.0", - "mime": "^2.0.3", + "mime": "^2.2.0", "mkdirp": "^0.5.1", "mongodb": "2.2.33", "morgan": "^1.9.0", @@ -73,18 +73,18 @@ "nodebb-theme-slick": "1.1.2", "nodebb-theme-vanilla": "8.1.4", "nodebb-widget-essentials": "4.0.1", - "nodemailer": "4.4.0", + "nodemailer": "4.4.1", "passport": "^0.4.0", "passport-local": "1.0.0", - "postcss": "6.0.14", + "postcss": "6.0.15", "postcss-clean": "1.1.0", - "promise-polyfill": "^6.0.2", + "promise-polyfill": "^7.0.0", "prompt": "^1.0.0", "redis": "2.8.0", "request": "2.83.0", "rimraf": "2.6.2", "rss": "^1.2.2", - "sanitize-html": "^1.14.1", + "sanitize-html": "^1.16.3", "semver": "^5.4.1", "serve-favicon": "^2.4.5", "sitemap": "^1.13.0", @@ -94,8 +94,8 @@ "socketio-wildcard": "2.0.0", "spdx-license-list": "^3.0.1", "toobusy-js": "^0.5.1", - "uglify-js": "^3.1.5", - "validator": "9.1.2", + "uglify-js": "^3.3.4", + "validator": "9.2.0", "winston": "^2.4.0", "xml": "^1.0.1", "xregexp": "3.2.0", @@ -103,16 +103,16 @@ }, "devDependencies": { "coveralls": "^3.0.0", - "eslint": "^4.9.0", + "eslint": "^4.14.0", "eslint-config-airbnb-base": "^12.1.0", "eslint-plugin-import": "^2.8.0", "grunt": "^1.0.1", "grunt-contrib-watch": "^1.0.0", - "jsdom": "^11.3.0", - "mocha": "^4.0.1", + "jsdom": "^11.5.1", + "mocha": "^4.1.0", "mocha-lcov-reporter": "^1.3.0", - "nyc": "^11.2.1", - "smtp-server": "^3.3.0" + "nyc": "^11.4.1", + "smtp-server": "^3.4.1" }, "bugs": { "url": "https://github.com/NodeBB/NodeBB/issues" diff --git a/src/cli/index.js b/src/cli/index.js index aa7ef2c257..63a6e80421 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -6,9 +6,11 @@ var path = require('path'); var packageInstall = require('./package-install'); var dirname = require('./paths').baseDir; +var defaultPackage; + // check to make sure dependencies are installed try { - fs.readFileSync(path.join(dirname, 'package.json')); + defaultPackage = JSON.parse(fs.readFileSync(path.join(dirname, 'install/package.json'), 'utf8')); } catch (e) { if (e.code === 'ENOENT') { console.warn('package.json not found.'); @@ -29,13 +31,24 @@ try { } try { - fs.readFileSync(path.join(dirname, 'node_modules/async/package.json'), 'utf8'); - fs.readFileSync(path.join(dirname, 'node_modules/commander/package.json'), 'utf8'); - fs.readFileSync(path.join(dirname, 'node_modules/colors/package.json'), 'utf8'); - fs.readFileSync(path.join(dirname, 'node_modules/nconf/package.json'), 'utf8'); + var semver = require('semver'); + + var checkVersion = function (packageName) { + var version = JSON.parse(fs.readFileSync(path.join(dirname, 'node_modules', packageName, 'package.json'), 'utf8')).version; + if (!semver.satisfies(version, defaultPackage.dependencies[packageName])) { + var e = new TypeError('Incorrect dependency version: ' + packageName); + e.code = 'DEP_WRONG_VERSION'; + throw e; + } + }; + + checkVersion('nconf'); + checkVersion('async'); + checkVersion('commander'); + checkVersion('colors'); } catch (e) { - if (e.code === 'ENOENT') { - console.warn('Dependencies not yet installed.'); + if (['ENOENT', 'DEP_WRONG_VERSION', 'MODULE_NOT_FOUND'].indexOf(e.code) !== -1) { + console.warn('Dependencies outdated or not yet installed.'); console.log('Installing them now...\n'); packageInstall.installAll(); diff --git a/src/cli/package-install.js b/src/cli/package-install.js index e923094b05..1892a48cfc 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -30,8 +30,6 @@ function updatePackageFile() { exports.updatePackageFile = updatePackageFile; function installAll() { - process.stdout.write(' started\n'.green); - var prod = global.env !== 'development'; var command = 'npm install'; try { diff --git a/src/cli/upgrade.js b/src/cli/upgrade.js index 2462f1f168..b9cd46e4a2 100644 --- a/src/cli/upgrade.js +++ b/src/cli/upgrade.js @@ -23,6 +23,7 @@ var steps = { install: { message: 'Bringing base dependencies up to date...', handler: function (next) { + process.stdout.write(' started\n'.green); packageInstall.installAll(); next(); }, diff --git a/src/meta/js.js b/src/meta/js.js index e8b71cf6a3..ada16d56be 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -14,6 +14,7 @@ var JS = module.exports; JS.scripts = { base: [ + 'node_modules/promise-polyfill/dist/polyfill.js', 'node_modules/jquery/dist/jquery.js', 'node_modules/socket.io-client/dist/socket.io.js', 'public/vendor/jquery/timeago/jquery.timeago.js', @@ -36,7 +37,6 @@ JS.scripts = { 'public/src/ajaxify.js', 'public/src/overrides.js', 'public/src/widgets.js', - 'node_modules/promise-polyfill/promise.js', ], // files listed below are only available client-side, or are bundled in to reduce # of network requests on cold load diff --git a/test/emailer.js b/test/emailer.js index 8c0a525ed2..40a41e6a3d 100644 --- a/test/emailer.js +++ b/test/emailer.js @@ -112,6 +112,7 @@ describe('emailer', function () { Meta.configs.setMultiple({ 'email:smtpTransport:enabled': '1', 'email:smtpTransport:user': username, + 'email:smtpTransport:pass': 'anything', 'email:smtpTransport:service': 'nodebb-custom-smtp', 'email:smtpTransport:port': 4000, 'email:smtpTransport:host': 'localhost',