From 75d291183dc3f0bae8743c2692caf4128bf54f30 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 12 Apr 2017 15:22:58 -0600 Subject: [PATCH 1/2] Fix using nodebb in other CWDs --- app.js | 6 ++ loader.js | 4 +- nodebb | 111 +++++++++++++++++++++---------------- bcrypt.js => src/bcrypt.js | 0 src/meta/js.js | 24 ++++---- src/password.js | 3 +- 6 files changed, 85 insertions(+), 63 deletions(-) rename bcrypt.js => src/bcrypt.js (100%) diff --git a/app.js b/app.js index de9d417045..5a6a782c57 100644 --- a/app.js +++ b/app.js @@ -19,6 +19,12 @@ 'use strict'; +if (require.main !== module) { + require.main.require = function (path) { + return require(path); + }; +} + var nconf = require('nconf'); nconf.argv().env('__'); diff --git a/loader.js b/loader.js index 654d77fb23..214f785eb9 100644 --- a/loader.js +++ b/loader.js @@ -7,6 +7,7 @@ var path = require('path'); var fork = require('child_process').fork; var async = require('async'); var logrotate = require('logrotate-stream'); + var file = require('./src/file'); var pkg = require('./package.json'); @@ -23,6 +24,7 @@ var workers = []; var Loader = { timesStarted: 0, }; +var appPath = path.join(__dirname, 'app.js'); Loader.init = function (callback) { if (silent) { @@ -114,7 +116,7 @@ function forkWorker(index, isPrimary) { process.env.isCluster = ports.length > 1; process.env.port = ports[index]; - var worker = fork('app.js', args, { + var worker = fork(appPath, args, { silent: silent, env: process.env, }); diff --git a/nodebb b/nodebb index ee87b24288..757afabf40 100755 --- a/nodebb +++ b/nodebb @@ -2,16 +2,25 @@ 'use strict'; +var cproc; +var args; +var fs; +var path; +var request; +var semver; +var prompt; +var async; + try { require('colors'); - var cproc = require('child_process'); - var args = require('minimist')(process.argv.slice(2)); - var fs = require('fs'); - var path = require('path'); - var request = require('request'); - var semver = require('semver'); - var prompt = require('prompt'); - var async = require('async'); + cproc = require('child_process'); + args = require('minimist')(process.argv.slice(2)); + fs = require('fs'); + path = require('path'); + request = require('request'); + semver = require('semver'); + prompt = require('prompt'); + async = require('async'); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n'); @@ -23,13 +32,16 @@ try { } } +var loaderPath = path.join(__dirname, 'loader.js'); +var appPath = path.join(__dirname, 'app.js'); + if (args.dev) { process.env.NODE_ENV = 'development'; } function getRunningPid(callback) { - fs.readFile(__dirname + '/pidfile', { - encoding: 'utf-8' + fs.readFile(path.join(__dirname, 'pidfile'), { + encoding: 'utf-8', }, function (err, pid) { if (err) { return callback(err); @@ -38,7 +50,7 @@ function getRunningPid(callback) { try { process.kill(parseInt(pid, 10), 0); callback(null, parseInt(pid, 10)); - } catch(e) { + } catch (e) { callback(e); } }); @@ -52,28 +64,29 @@ function getCurrentVersion(callback) { try { pkg = JSON.parse(pkg); return callback(null, pkg.version); - } catch(err) { + } catch (err) { return callback(err); } }); } function fork(args) { - return cproc.fork('app.js', args, { + return cproc.fork(appPath, args, { cwd: __dirname, - silent: false + silent: false, }); } function getInstalledPlugins(callback) { async.parallel({ files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')), - deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }) + deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }), }, function (err, payload) { if (err) { return callback(err); } - var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/, - moduleName, isGitRepo; + var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/; + var moduleName; + var isGitRepo; payload.files = payload.files.filter(function (file) { return isNbbModule.test(file); @@ -98,7 +111,7 @@ function getInstalledPlugins(callback) { try { fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git')); isGitRepo = true; - } catch(e) { + } catch (e) { isGitRepo = false; } @@ -144,7 +157,7 @@ function checkPlugins(standalone, callback) { async.waterfall([ async.apply(async.parallel, { plugins: async.apply(getInstalledPlugins), - version: async.apply(getCurrentVersion) + version: async.apply(getCurrentVersion), }), function (payload, next) { var toCheck = Object.keys(payload.plugins); @@ -157,7 +170,7 @@ function checkPlugins(standalone, callback) { request({ method: 'GET', url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='), - json: true + json: true, }, function (err, res, body) { if (err) { process.stdout.write('error'.red + '\n'.reset); @@ -169,25 +182,25 @@ function checkPlugins(standalone, callback) { body = [body]; } - var current, suggested, - upgradable = body.map(function (suggestObj) { - current = payload.plugins[suggestObj.package]; - suggested = suggestObj.version; - - if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { - return { - name: suggestObj.package, - current: current, - suggested: suggested - }; - } else { - return null; - } - }).filter(Boolean); + var current; + var suggested; + var upgradable = body.map(function (suggestObj) { + current = payload.plugins[suggestObj.package]; + suggested = suggestObj.version; + + if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) { + return { + name: suggestObj.package, + current: current, + suggested: suggested, + }; + } + return null; + }).filter(Boolean); next(null, upgradable); }); - } + }, ], callback); } function upgradePlugins(callback) { @@ -199,7 +212,7 @@ function upgradePlugins(callback) { checkPlugins(standalone, function (err, found) { if (err) { - process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); + process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset); return callback(err); } @@ -223,7 +236,7 @@ function upgradePlugins(callback) { prompt.get({ name: 'upgrade', description: 'Proceed with upgrade (y|n)?'.reset, - type: 'string' + type: 'string', }, function (err, result) { if (err) { return callback(err); @@ -279,8 +292,8 @@ var commands = { process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset); // Spawn a new NodeBB process - cproc.fork(__dirname + '/loader.js', { - env: process.env + cproc.fork(loaderPath, { + env: process.env, }); }, }, @@ -320,7 +333,7 @@ var commands = { process.stdout.write('\n\n'.reset); cproc.spawn('tail', ['-F', './logs/output.log'], { cwd: __dirname, - stdio: 'inherit' + stdio: 'inherit', }); }, }, @@ -333,12 +346,12 @@ var commands = { process.stdout.write('\n\n'.reset); // Spawn a new NodeBB process - cproc.fork(__dirname + '/loader.js', { - env: process.env + cproc.fork(loaderPath, { + env: process.env, }); cproc.spawn('tail', ['-F', './logs/output.log'], { cwd: __dirname, - stdio: 'inherit' + stdio: 'inherit', }); }, }, @@ -347,14 +360,14 @@ var commands = { usage: 'Usage: ' + './nodebb dev'.yellow, handler: function () { process.env.NODE_ENV = 'development'; - cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], { - env: process.env + cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], { + env: process.env, }); }, }, build: { description: 'Compile static assets (CSS, Javascript, etc)', - usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' + + usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' + ' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' + ' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n', handler: function () { @@ -422,7 +435,7 @@ var commands = { var upgradeProc = fork(arr); upgradeProc.on('close', next); - } + }, ], function (err) { if (err) { process.stdout.write('\nError'.red + ': ' + err.message + '\n'); @@ -430,7 +443,7 @@ var commands = { var message = 'NodeBB Upgrade Complete!'; // some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count var columns = process.stdout.columns; - var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : " "; + var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' '; process.stdout.write('OK\n'.green); process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset); diff --git a/bcrypt.js b/src/bcrypt.js similarity index 100% rename from bcrypt.js rename to src/bcrypt.js diff --git a/src/meta/js.js b/src/meta/js.js index 95534f5d47..23f33f9f49 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -20,8 +20,8 @@ module.exports = function (Meta) { target: {}, scripts: { base: [ - './node_modules/jquery/dist/jquery.js', - './node_modules/socket.io-client/dist/socket.io.js', + 'node_modules/jquery/dist/jquery.js', + 'node_modules/socket.io-client/dist/socket.io.js', 'public/vendor/jquery/timeago/jquery.timeago.js', 'public/vendor/jquery/js/jquery.form.min.js', 'public/vendor/visibility/visibility.min.js', @@ -35,14 +35,14 @@ module.exports = function (Meta) { 'public/vendor/tinycon/tinycon.js', 'public/vendor/xregexp/xregexp.js', 'public/vendor/xregexp/unicode/unicode-base.js', - './node_modules/templates.js/lib/templates.js', + 'node_modules/templates.js/lib/templates.js', 'public/src/utils.js', 'public/src/sockets.js', 'public/src/app.js', 'public/src/ajaxify.js', 'public/src/overrides.js', 'public/src/widgets.js', - './node_modules/promise-polyfill/promise.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 @@ -84,12 +84,12 @@ module.exports = function (Meta) { // modules listed below are built (/src/modules) so they can be defined anonymously modules: { - 'Chart.js': './node_modules/chart.js/dist/Chart.min.js', - 'mousetrap.js': './node_modules/mousetrap/mousetrap.min.js', + 'Chart.js': 'node_modules/chart.js/dist/Chart.min.js', + 'mousetrap.js': 'node_modules/mousetrap/mousetrap.min.js', 'jqueryui.js': 'public/vendor/jquery/js/jquery-ui.js', 'buzz.js': 'public/vendor/buzz/buzz.js', - 'cropper.js': './node_modules/cropperjs/dist/cropper.min.js', - 'zxcvbn.js': './node_modules/zxcvbn/dist/zxcvbn.js', + 'cropper.js': 'node_modules/cropperjs/dist/cropper.min.js', + 'zxcvbn.js': 'node_modules/zxcvbn/dist/zxcvbn.js', }, }, }; @@ -196,10 +196,10 @@ module.exports = function (Meta) { function clearModules(callback) { var builtPaths = moduleDirs.map(function (p) { - return '../../build/public/src/' + p; + return path.join(__dirname, '../../build/public/src', p); }); async.each(builtPaths, function (builtPath, next) { - rimraf(path.join(__dirname, builtPath), next); + rimraf(builtPath, next); }, function (err) { callback(err); }); @@ -314,7 +314,7 @@ module.exports = function (Meta) { } Meta.js.target[target].scripts = Meta.js.target[target].scripts.map(function (script) { - return path.relative(basePath, script).replace(/\\/g, '/'); + return path.resolve(basePath, script).replace(/\\/g, '/'); }); callback(); @@ -328,7 +328,7 @@ module.exports = function (Meta) { }; Meta.js.commitToFile = function (target, callback) { - fs.writeFile(path.join(__dirname, '../../build/public/' + target), Meta.js.target[target].cache, function (err) { + fs.writeFile(path.join(__dirname, '../../build/public', target), Meta.js.target[target].cache, function (err) { callback(err); }); }; diff --git a/src/password.js b/src/password.js index d4fd1b0f8d..816e357d12 100644 --- a/src/password.js +++ b/src/password.js @@ -2,6 +2,7 @@ (function (module) { var fork = require('child_process').fork; + var path = require('path'); module.hash = function (rounds, password, callback) { forkChild({ type: 'hash', rounds: rounds, password: password }, callback); @@ -16,7 +17,7 @@ if (global.v8debug || parseInt(process.execArgv.indexOf('--debug'), 10) !== -1) { forkProcessParams = { execArgv: ['--debug=' + (5859), '--nolazy'] }; } - var child = fork('./bcrypt', [], forkProcessParams); + var child = fork(path.join(__dirname, 'bcrypt'), [], forkProcessParams); child.on('message', function (msg) { if (msg.err) { From f16a40d29edc042b4d86e9f00bcfdbea6e7395c6 Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Wed, 12 Apr 2017 15:29:01 -0600 Subject: [PATCH 2/2] Add nodebb file to linter --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 95ac88b2ed..123779f5dc 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "main": "app.js", "scripts": { "start": "node loader.js", - "lint": "eslint --cache .", + "lint": "eslint --cache ./nodebb .", "pretest": "npm run lint", "test": "istanbul cover node_modules/mocha/bin/_mocha -- -R dot", "coveralls": "istanbul cover _mocha --report lcovonly -- -R dot && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage"