chore: eslint prefer-arrow-callback

This commit is contained in:
Peter Jaszkowiak
2021-02-04 00:01:39 -07:00
committed by Julian Lam
parent 707b55b6a5
commit b56d9e12b5
334 changed files with 4995 additions and 5182 deletions

View File

@@ -110,7 +110,6 @@
// WORKING ON // WORKING ON
"prefer-rest-params": "off", "prefer-rest-params": "off",
"prefer-spread": "off", "prefer-spread": "off",
"prefer-arrow-callback": "off",
"no-var": "off", "no-var": "off",
"vars-on-top": "off", "vars-on-top": "off",

View File

@@ -164,7 +164,7 @@ module.exports = function (grunt) {
grunt.task.run('init'); grunt.task.run('init');
grunt.event.removeAllListeners('watch'); grunt.event.removeAllListeners('watch');
grunt.event.on('watch', function update(action, filepath, target) { grunt.event.on('watch', (action, filepath, target) => {
var compiling; var compiling;
if (target === 'styleUpdated_Client') { if (target === 'styleUpdated_Client') {
compiling = 'clientCSS'; compiling = 'clientCSS';
@@ -183,7 +183,7 @@ module.exports = function (grunt) {
return run(); return run();
} }
require('./src/meta/build').build([compiling], function (err) { require('./src/meta/build').build([compiling], (err) => {
if (err) { if (err) {
winston.error(err.stack); winston.error(err.stack);
} }

View File

@@ -72,7 +72,7 @@ web.install = async function (port) {
winston.info(`Launching web installer on port ${port}`); winston.info(`Launching web installer on port ${port}`);
app.use(express.static('public', {})); app.use(express.static('public', {}));
app.engine('tpl', function (filepath, options, callback) { app.engine('tpl', (filepath, options, callback) => {
filepath = filepath.replace(/\.tpl$/, '.js'); filepath = filepath.replace(/\.tpl$/, '.js');
Benchpress.__express(filepath, options, callback); Benchpress.__express(filepath, options, callback);
@@ -99,7 +99,7 @@ web.install = async function (port) {
function launchExpress(port) { function launchExpress(port) {
server = app.listen(port, function () { server = app.listen(port, () => {
winston.info('Web installer listening on http://%s:%s', '0.0.0.0', port); winston.info('Web installer listening on http://%s:%s', '0.0.0.0', port);
}); });
} }
@@ -118,10 +118,8 @@ function ping(req, res) {
function welcome(req, res) { function welcome(req, res) {
var dbs = ['redis', 'mongo', 'postgres']; var dbs = ['redis', 'mongo', 'postgres'];
var databases = dbs.map(function (databaseName) { var databases = dbs.map((databaseName) => {
var questions = require(`../src/database/${databaseName}`).questions.filter(function (question) { var questions = require(`../src/database/${databaseName}`).questions.filter(question => question && !question.hideOnWebInstall);
return question && !question.hideOnWebInstall;
});
return { return {
name: databaseName, name: databaseName,
@@ -180,7 +178,7 @@ function install(req, res) {
env: setupEnvVars, env: setupEnvVars,
}); });
child.on('close', function (data) { child.on('close', (data) => {
installing = false; installing = false;
success = data === 0; success = data === 0;
error = data !== 0; error = data !== 0;

View File

@@ -60,14 +60,14 @@ Loader.displayStartupMessages = function (callback) {
}; };
Loader.addWorkerEvents = function (worker) { Loader.addWorkerEvents = function (worker) {
worker.on('exit', function (code, signal) { worker.on('exit', (code, signal) => {
if (code !== 0) { if (code !== 0) {
if (Loader.timesStarted < numProcs * 3) { if (Loader.timesStarted < numProcs * 3) {
Loader.timesStarted += 1; Loader.timesStarted += 1;
if (Loader.crashTimer) { if (Loader.crashTimer) {
clearTimeout(Loader.crashTimer); clearTimeout(Loader.crashTimer);
} }
Loader.crashTimer = setTimeout(function () { Loader.crashTimer = setTimeout(() => {
Loader.timesStarted = 0; Loader.timesStarted = 0;
}, 10000); }, 10000);
} else { } else {
@@ -84,7 +84,7 @@ Loader.addWorkerEvents = function (worker) {
} }
}); });
worker.on('message', function (message) { worker.on('message', (message) => {
if (message && typeof message === 'object' && message.action) { if (message && typeof message === 'object' && message.action) {
switch (message.action) { switch (message.action) {
case 'restart': case 'restart':
@@ -92,12 +92,12 @@ Loader.addWorkerEvents = function (worker) {
Loader.restart(); Loader.restart();
break; break;
case 'pubsub': case 'pubsub':
workers.forEach(function (w) { workers.forEach((w) => {
w.send(message); w.send(message);
}); });
break; break;
case 'socket.io': case 'socket.io':
workers.forEach(function (w) { workers.forEach((w) => {
if (w !== worker) { if (w !== worker) {
w.send(message); w.send(message);
} }
@@ -172,7 +172,7 @@ Loader.restart = function () {
nconf.remove('file'); nconf.remove('file');
nconf.use('file', { file: pathToConfig }); nconf.use('file', { file: pathToConfig });
fs.readFile(pathToConfig, { encoding: 'utf-8' }, function (err, configFile) { fs.readFile(pathToConfig, { encoding: 'utf-8' }, (err, configFile) => {
if (err) { if (err) {
console.error('Error reading config'); console.error('Error reading config');
throw err; throw err;
@@ -201,13 +201,13 @@ Loader.stop = function () {
}; };
function killWorkers() { function killWorkers() {
workers.forEach(function (worker) { workers.forEach((worker) => {
worker.suicide = true; worker.suicide = true;
worker.kill(); worker.kill();
}); });
} }
fs.open(pathToConfig, 'r', function (err) { fs.open(pathToConfig, 'r', (err) => {
if (err) { if (err) {
// No config detected, kickstart web installer // No config detected, kickstart web installer
fork('app'); fork('app');
@@ -238,7 +238,7 @@ fs.open(pathToConfig, 'r', function (err) {
Loader.init, Loader.init,
Loader.displayStartupMessages, Loader.displayStartupMessages,
Loader.start, Loader.start,
], function (err) { ], (err) => {
if (err) { if (err) {
console.error('[loader] Error during startup'); console.error('[loader] Error during startup');
throw err; throw err;

View File

@@ -10,20 +10,22 @@ const file = require('../file');
const Translator = require('../translator').Translator; const Translator = require('../translator').Translator;
function filterDirectories(directories) { function filterDirectories(directories) {
return directories.map(function (dir) { return directories.map(
// get the relative path // get the relative path
// convert dir to use forward slashes // convert dir to use forward slashes
return dir.replace(/^.*(admin.*?).tpl$/, '$1').split(path.sep).join('/'); dir => dir.replace(/^.*(admin.*?).tpl$/, '$1').split(path.sep).join('/')
}).filter(function (dir) { ).filter(
// exclude .js files // exclude .js files
// exclude partials // exclude partials
// only include subpaths // only include subpaths
// exclude category.tpl, group.tpl, category-analytics.tpl // exclude category.tpl, group.tpl, category-analytics.tpl
return !dir.endsWith('.js') && dir => (
!dir.endsWith('.js') &&
!dir.includes('/partials/') && !dir.includes('/partials/') &&
/\/.*\//.test(dir) && /\/.*\//.test(dir) &&
!/manage\/(category|group|category-analytics)$/.test(dir); !/manage\/(category|group|category-analytics)$/.test(dir)
}); )
);
} }
async function getAdminNamespaces() { async function getAdminNamespaces() {
@@ -50,9 +52,7 @@ function simplify(translations) {
} }
function nsToTitle(namespace) { function nsToTitle(namespace) {
return namespace.replace('admin/', '').split('/').map(function (str) { return namespace.replace('admin/', '').split('/').map(str => str[0].toUpperCase() + str.slice(1)).join(' > ')
return str[0].toUpperCase() + str.slice(1);
}).join(' > ')
.replace(/[^a-zA-Z> ]/g, ' '); .replace(/[^a-zA-Z> ]/g, ' ');
} }
@@ -97,9 +97,7 @@ async function buildNamespace(language, namespace) {
return await fallback(namespace); return await fallback(namespace);
} }
// join all translations into one string separated by newlines // join all translations into one string separated by newlines
let str = Object.keys(translations).map(function (key) { let str = Object.keys(translations).map(key => translations[key]).join('\n');
return translations[key];
}).join('\n');
str = sanitize(str); str = sanitize(str);
let title = namespace; let title = namespace;

View File

@@ -23,7 +23,7 @@ function getLatestVersion(callback) {
json: true, json: true,
headers: headers, headers: headers,
timeout: 2000, timeout: 2000,
}, function (err, res, latestRelease) { }, (err, res, latestRelease) => {
if (err) { if (err) {
return callback(err); return callback(err);
} }

View File

@@ -33,9 +33,9 @@ Analytics.init = async function () {
maxAge: 0, maxAge: 0,
}); });
new cronJob('*/10 * * * * *', function () { new cronJob('*/10 * * * * *', (() => {
Analytics.writeData(); Analytics.writeData();
}, null, true); }), null, true);
}; };
Analytics.increment = function (keys, callback) { Analytics.increment = function (keys, callback) {
@@ -43,7 +43,7 @@ Analytics.increment = function (keys, callback) {
plugins.hooks.fire('action:analytics.increment', { keys: keys }); plugins.hooks.fire('action:analytics.increment', { keys: keys });
keys.forEach(function (key) { keys.forEach((key) => {
counters[key] = counters[key] || 0; counters[key] = counters[key] || 0;
counters[key] += 1; counters[key] += 1;
}); });
@@ -163,14 +163,14 @@ Analytics.getHourlyStatsForSet = async function (set, hour, numHours) {
const counts = await db.sortedSetScores(set, hoursArr); const counts = await db.sortedSetScores(set, hoursArr);
hoursArr.forEach(function (term, index) { hoursArr.forEach((term, index) => {
terms[term] = parseInt(counts[index], 10) || 0; terms[term] = parseInt(counts[index], 10) || 0;
}); });
const termsArr = []; const termsArr = [];
hoursArr.reverse(); hoursArr.reverse();
hoursArr.forEach(function (hour) { hoursArr.forEach((hour) => {
termsArr.push(terms[hour]); termsArr.push(terms[hour]);
}); });

View File

@@ -54,7 +54,7 @@ exports.doTopicAction = async function (action, event, caller, { tids }) {
const uids = await user.getUidsFromSet('users:online', 0, -1); const uids = await user.getUidsFromSet('users:online', 0, -1);
await Promise.all(tids.map(async function (tid) { await Promise.all(tids.map(async (tid) => {
const title = await topics.getTopicField(tid, 'title'); const title = await topics.getTopicField(tid, 'title');
const data = await topics.tools[action](tid, caller.uid); const data = await topics.tools[action](tid, caller.uid);
const notifyUids = await privileges.categories.filterUids('topics:read', data.cid, uids); const notifyUids = await privileges.categories.filterUids('topics:read', data.cid, uids);

View File

@@ -55,11 +55,11 @@ module.exports = function (opts) {
cache.misses = 0; cache.misses = 0;
} }
pubsub.on(`${cache.name}:cache:reset`, function () { pubsub.on(`${cache.name}:cache:reset`, () => {
localReset(); localReset();
}); });
pubsub.on(`${cache.name}:cache:del`, function (keys) { pubsub.on(`${cache.name}:cache:del`, (keys) => {
if (Array.isArray(keys)) { if (Array.isArray(keys)) {
keys.forEach(key => cacheDel.apply(cache, [key])); keys.forEach(key => cacheDel.apply(cache, [key]));
} }
@@ -71,7 +71,7 @@ module.exports = function (opts) {
} }
let data; let data;
let isCached; let isCached;
const unCachedKeys = keys.filter(function (key) { const unCachedKeys = keys.filter((key) => {
data = cache.get(key); data = cache.get(key);
isCached = data !== undefined; isCached = data !== undefined;
if (isCached) { if (isCached) {

View File

@@ -104,7 +104,7 @@ module.exports = function (Categories) {
children = children[0]; children = children[0];
children.forEach(function (child) { children.forEach((child) => {
child.parentCid = parentCid; child.parentCid = parentCid;
child.cloneFromCid = child.cid; child.cloneFromCid = child.cid;
child.cloneChildren = true; child.cloneChildren = true;
@@ -195,7 +195,7 @@ module.exports = function (Categories) {
const currentMembers = await db.getSortedSetsMembers(toGroups.concat(fromGroups)); const currentMembers = await db.getSortedSetsMembers(toGroups.concat(fromGroups));
const copyGroups = _.uniq(_.flatten(currentMembers)); const copyGroups = _.uniq(_.flatten(currentMembers));
await async.each(copyGroups, async function (group) { await async.each(copyGroups, async (group) => {
await copyPrivilegesByGroup(privileges, fromCid, toCid, group); await copyPrivilegesByGroup(privileges, fromCid, toCid, group);
}); });
} }

View File

@@ -11,14 +11,14 @@ var cache = require('../cache');
module.exports = function (Categories) { module.exports = function (Categories) {
Categories.purge = async function (cid, uid) { Categories.purge = async function (cid, uid) {
await batch.processSortedSet(`cid:${cid}:tids`, async function (tids) { await batch.processSortedSet(`cid:${cid}:tids`, async (tids) => {
await async.eachLimit(tids, 10, async function (tid) { await async.eachLimit(tids, 10, async (tid) => {
await topics.purgePostsAndTopic(tid, uid); await topics.purgePostsAndTopic(tid, uid);
}); });
}, { alwaysStartAt: 0 }); }, { alwaysStartAt: 0 });
const pinnedTids = await db.getSortedSetRevRange(`cid:${cid}:tids:pinned`, 0, -1); const pinnedTids = await db.getSortedSetRevRange(`cid:${cid}:tids:pinned`, 0, -1);
await async.eachLimit(pinnedTids, 10, async function (tid) { await async.eachLimit(pinnedTids, 10, async (tid) => {
await topics.purgePostsAndTopic(tid, uid); await topics.purgePostsAndTopic(tid, uid);
}); });
const categoryData = await Categories.getCategoryData(cid); const categoryData = await Categories.getCategoryData(cid);
@@ -58,7 +58,7 @@ module.exports = function (Categories) {
]); ]);
const bulkAdd = []; const bulkAdd = [];
const childrenKeys = children.map(function (cid) { const childrenKeys = children.map((cid) => {
bulkAdd.push(['cid:0:children', cid, cid]); bulkAdd.push(['cid:0:children', cid, cid]);
return `category:${cid}`; return `category:${cid}`;
}); });

View File

@@ -97,7 +97,7 @@ Categories.getModerators = async function (cid) {
}; };
Categories.getModeratorUids = async function (cids) { Categories.getModeratorUids = async function (cids) {
const groupNames = cids.reduce(function (memo, cid) { const groupNames = cids.reduce((memo, cid) => {
memo.push(`cid:${cid}:privileges:moderate`); memo.push(`cid:${cid}:privileges:moderate`);
memo.push(`cid:${cid}:privileges:groups:moderate`); memo.push(`cid:${cid}:privileges:groups:moderate`);
return memo; return memo;
@@ -105,7 +105,7 @@ Categories.getModeratorUids = async function (cids) {
const memberSets = await groups.getMembersOfGroups(groupNames); const memberSets = await groups.getMembersOfGroups(groupNames);
// Every other set is actually a list of user groups, not uids, so convert those to members // Every other set is actually a list of user groups, not uids, so convert those to members
const sets = memberSets.reduce(function (memo, set, idx) { const sets = memberSets.reduce((memo, set, idx) => {
if (idx % 2) { if (idx % 2) {
memo.groupNames.push(set); memo.groupNames.push(set);
} else { } else {
@@ -137,7 +137,7 @@ Categories.getCategories = async function (cids, uid) {
Categories.getTagWhitelist(cids), Categories.getTagWhitelist(cids),
Categories.hasReadCategories(cids, uid), Categories.hasReadCategories(cids, uid),
]); ]);
categories.forEach(function (category, i) { categories.forEach((category, i) => {
if (category) { if (category) {
category.tagWhitelist = tagWhitelist[i]; category.tagWhitelist = tagWhitelist[i];
category['unread-class'] = (category.topic_count === 0 || (hasRead[i] && uid !== 0)) ? '' : 'unread'; category['unread-class'] = (category.topic_count === 0 || (hasRead[i] && uid !== 0)) ? '' : 'unread';
@@ -180,7 +180,7 @@ function calculateTopicPostCount(category) {
let postCount = category.post_count; let postCount = category.post_count;
let topicCount = category.topic_count; let topicCount = category.topic_count;
if (Array.isArray(category.children)) { if (Array.isArray(category.children)) {
category.children.forEach(function (child) { category.children.forEach((child) => {
calculateTopicPostCount(child); calculateTopicPostCount(child);
postCount += parseInt(child.totalPostCount, 10) || 0; postCount += parseInt(child.totalPostCount, 10) || 0;
topicCount += parseInt(child.totalTopicCount, 10) || 0; topicCount += parseInt(child.totalTopicCount, 10) || 0;
@@ -222,7 +222,7 @@ async function getChildrenTree(category, uid) {
childrenData = childrenData.filter(Boolean); childrenData = childrenData.filter(Boolean);
childrenCids = childrenData.map(child => child.cid); childrenCids = childrenData.map(child => child.cid);
const hasRead = await Categories.hasReadCategories(childrenCids, uid); const hasRead = await Categories.hasReadCategories(childrenCids, uid);
childrenData.forEach(function (child, i) { childrenData.forEach((child, i) => {
child['unread-class'] = (child.topic_count === 0 || (hasRead[i] && uid !== 0)) ? '' : 'unread'; child['unread-class'] = (child.topic_count === 0 || (hasRead[i] && uid !== 0)) ? '' : 'unread';
}); });
Categories.getTree([category].concat(childrenData), category.parentCid); Categories.getTree([category].concat(childrenData), category.parentCid);
@@ -270,7 +270,7 @@ Categories.getChildrenCids = async function (rootCid) {
}; };
Categories.flattenCategories = function (allCategories, categoryData) { Categories.flattenCategories = function (allCategories, categoryData) {
categoryData.forEach(function (category) { categoryData.forEach((category) => {
if (category) { if (category) {
allCategories.push(category); allCategories.push(category);
@@ -302,7 +302,7 @@ Categories.getTree = function (categories, parentCid) {
const tree = []; const tree = [];
categories.forEach(function (category) { categories.forEach((category) => {
if (category) { if (category) {
category.children = category.children || []; category.children = category.children || [];
if (!category.cid) { if (!category.cid) {

View File

@@ -95,7 +95,7 @@ module.exports = function (Categories) {
tids, tids,
['tid', 'mainPid', 'slug', 'title', 'teaserPid', 'cid', 'postcount'] ['tid', 'mainPid', 'slug', 'title', 'teaserPid', 'cid', 'postcount']
); );
topicData.forEach(function (topic) { topicData.forEach((topic) => {
if (topic) { if (topic) {
topic.teaserPid = topic.teaserPid || topic.mainPid; topic.teaserPid = topic.teaserPid || topic.mainPid;
} }
@@ -108,7 +108,7 @@ module.exports = function (Categories) {
]); ]);
const cidToRoot = _.zipObject(cids, toRoot); const cidToRoot = _.zipObject(cids, toRoot);
teasers.forEach(function (teaser, index) { teasers.forEach((teaser, index) => {
if (teaser) { if (teaser) {
teaser.cid = topicData[index].cid; teaser.cid = topicData[index].cid;
teaser.parentCids = cidToRoot[teaser.cid]; teaser.parentCids = cidToRoot[teaser.cid];
@@ -124,7 +124,7 @@ module.exports = function (Categories) {
} }
function assignTopicsToCategories(categories, topics) { function assignTopicsToCategories(categories, topics) {
categories.forEach(function (category) { categories.forEach((category) => {
if (category) { if (category) {
category.posts = topics.filter(t => t.cid && (t.cid === category.cid || t.parentCids.includes(category.cid))) category.posts = topics.filter(t => t.cid && (t.cid === category.cid || t.parentCids.includes(category.cid)))
.sort((a, b) => b.pid - a.pid) .sort((a, b) => b.pid - a.pid)
@@ -135,7 +135,7 @@ module.exports = function (Categories) {
} }
function bubbleUpChildrenPosts(categoryData) { function bubbleUpChildrenPosts(categoryData) {
categoryData.forEach(function (category) { categoryData.forEach((category) => {
if (category) { if (category) {
if (category.posts.length) { if (category.posts.length) {
return; return;
@@ -168,7 +168,7 @@ module.exports = function (Categories) {
topics.getTopicField(tid, 'deleted'), topics.getTopicField(tid, 'deleted'),
]); ]);
await batch.processArray(pids, async function (pids) { await batch.processArray(pids, async (pids) => {
const postData = await posts.getPostsFields(pids, ['pid', 'deleted', 'uid', 'timestamp', 'upvotes', 'downvotes']); const postData = await posts.getPostsFields(pids, ['pid', 'deleted', 'uid', 'timestamp', 'upvotes', 'downvotes']);
const bulkRemove = []; const bulkRemove = [];

View File

@@ -41,16 +41,16 @@ module.exports = function (Categories) {
Categories.getTree(categoryData, 0); Categories.getTree(categoryData, 0);
await Categories.getRecentTopicReplies(categoryData, uid, data.qs); await Categories.getRecentTopicReplies(categoryData, uid, data.qs);
categoryData.forEach(function (category) { categoryData.forEach((category) => {
if (category && Array.isArray(category.children)) { if (category && Array.isArray(category.children)) {
category.children = category.children.slice(0, category.subCategoriesPerPage); category.children = category.children.slice(0, category.subCategoriesPerPage);
category.children.forEach(function (child) { category.children.forEach((child) => {
child.children = undefined; child.children = undefined;
}); });
} }
}); });
categoryData.sort(function (c1, c2) { categoryData.sort((c1, c2) => {
if (c1.parentCid !== c2.parentCid) { if (c1.parentCid !== c2.parentCid) {
return c1.parentCid - c2.parentCid; return c1.parentCid - c2.parentCid;
} }

View File

@@ -150,7 +150,7 @@ module.exports = function (Categories) {
return; return;
} }
topics.forEach(function (topic) { topics.forEach((topic) => {
if (topic.deleted && !topic.isOwner) { if (topic.deleted && !topic.isOwner) {
topic.title = '[[topic:topic_is_deleted]]'; topic.title = '[[topic:topic_is_deleted]]';
topic.slug = topic.tid; topic.slug = topic.tid;

View File

@@ -37,7 +37,7 @@ module.exports = function (Categories) {
fields.splice(0, 0, fields.splice(parentCidIndex, 1)[0]); fields.splice(0, 0, fields.splice(parentCidIndex, 1)[0]);
} }
await async.eachSeries(fields, async function (key) { await async.eachSeries(fields, async (key) => {
await updateCategoryField(cid, key, category[key]); await updateCategoryField(cid, key, category[key]);
}); });
plugins.hooks.fire('action:category.update', { cid: cid, modified: category }); plugins.hooks.fire('action:category.update', { cid: cid, modified: category });

View File

@@ -61,9 +61,7 @@ function humanReadableArgName(arg) {
} }
Command.prototype.usage = function () { Command.prototype.usage = function () {
var args = this._args.map(function (arg) { var args = this._args.map(arg => humanReadableArgName(arg));
return humanReadableArgName(arg);
});
var usage = '[options]'[optionColor] + var usage = '[options]'[optionColor] +
(this.commands.length ? ' [command]' : '')[subCommandColor] + (this.commands.length ? ' [command]' : '')[subCommandColor] +
@@ -82,12 +80,8 @@ Command.prototype.commandHelp = function () {
return ''; return '';
} }
var commands = this.commands.filter(function (cmd) { var commands = this.commands.filter(cmd => !cmd._noHelp).map((cmd) => {
return !cmd._noHelp; var args = cmd._args.map(arg => humanReadableArgName(arg)).join(' ');
}).map(function (cmd) {
var args = cmd._args.map(function (arg) {
return humanReadableArgName(arg);
}).join(' ');
return [ return [
`${cmd._name[subCommandColor] + `${cmd._name[subCommandColor] +
@@ -98,15 +92,13 @@ Command.prototype.commandHelp = function () {
]; ];
}); });
var width = commands.reduce(function (max, command) { var width = commands.reduce((max, command) => Math.max(max, command[0].length), 0);
return Math.max(max, command[0].length);
}, 0);
return [ return [
'', '',
' Commands:', ' Commands:',
'', '',
commands.map(function (cmd) { commands.map((cmd) => {
var desc = cmd[1] ? ` ${cmd[1]}` : ''; var desc = cmd[1] ? ` ${cmd[1]}` : '';
return pad(cmd[0], width) + desc; return pad(cmd[0], width) + desc;
}).join('\n').replace(/^/gm, ' '), }).join('\n').replace(/^/gm, ' '),
@@ -119,9 +111,7 @@ Command.prototype.optionHelp = function () {
// Append the help information // Append the help information
return this.options return this.options
.map(function (option) { .map(option => `${pad(option.flags, width)[optionColor]} ${option.description}`)
return `${pad(option.flags, width)[optionColor]} ${option.description}`;
})
.concat([`${pad('-h, --help', width)[optionColor]} output usage information`]) .concat([`${pad('-h, --help', width)[optionColor]} output usage information`])
.join('\n'); .join('\n');
}; };

View File

@@ -119,7 +119,7 @@ process.env.CONFIG = configFile;
program program
.command('start') .command('start')
.description('Start the NodeBB server') .description('Start the NodeBB server')
.action(function () { .action(() => {
require('./running').start(program); require('./running').start(program);
}); });
program program
@@ -127,7 +127,7 @@ program
noHelp: true, noHelp: true,
}) })
.description('Start the NodeBB server and view the live output log') .description('Start the NodeBB server and view the live output log')
.action(function () { .action(() => {
program.log = true; program.log = true;
require('./running').start(program); require('./running').start(program);
}); });
@@ -136,7 +136,7 @@ program
noHelp: true, noHelp: true,
}) })
.description('Start NodeBB in verbose development mode') .description('Start NodeBB in verbose development mode')
.action(function () { .action(() => {
program.dev = true; program.dev = true;
process.env.NODE_ENV = 'development'; process.env.NODE_ENV = 'development';
global.env = 'development'; global.env = 'development';
@@ -145,25 +145,25 @@ program
program program
.command('stop') .command('stop')
.description('Stop the NodeBB server') .description('Stop the NodeBB server')
.action(function () { .action(() => {
require('./running').stop(program); require('./running').stop(program);
}); });
program program
.command('restart') .command('restart')
.description('Restart the NodeBB server') .description('Restart the NodeBB server')
.action(function () { .action(() => {
require('./running').restart(program); require('./running').restart(program);
}); });
program program
.command('status') .command('status')
.description('Check the running status of the NodeBB server') .description('Check the running status of the NodeBB server')
.action(function () { .action(() => {
require('./running').status(program); require('./running').status(program);
}); });
program program
.command('log') .command('log')
.description('Open the output log (useful for debugging)') .description('Open the output log (useful for debugging)')
.action(function () { .action(() => {
require('./running').log(program); require('./running').log(program);
}); });
@@ -172,7 +172,7 @@ program
.command('setup [config]') .command('setup [config]')
.description('Run the NodeBB setup script, or setup with an initial config') .description('Run the NodeBB setup script, or setup with an initial config')
.option('--skip-build', 'Run setup without building assets') .option('--skip-build', 'Run setup without building assets')
.action(function (initConfig) { .action((initConfig) => {
if (initConfig) { if (initConfig) {
try { try {
initConfig = JSON.parse(initConfig); initConfig = JSON.parse(initConfig);
@@ -189,41 +189,41 @@ program
program program
.command('install') .command('install')
.description('Launch the NodeBB web installer for configuration setup') .description('Launch the NodeBB web installer for configuration setup')
.action(function () { .action(() => {
require('./setup').webInstall(); require('./setup').webInstall();
}); });
program program
.command('build [targets...]') .command('build [targets...]')
.description(`Compile static assets ${'(JS, CSS, templates, languages)'.red}`) .description(`Compile static assets ${'(JS, CSS, templates, languages)'.red}`)
.option('-s, --series', 'Run builds in series without extra processes') .option('-s, --series', 'Run builds in series without extra processes')
.action(function (targets, options) { .action((targets, options) => {
require('./manage').build(targets.length ? targets : true, options); require('./manage').build(targets.length ? targets : true, options);
}) })
.on('--help', function () { .on('--help', () => {
require('../meta/aliases').buildTargets(); require('../meta/aliases').buildTargets();
}); });
program program
.command('activate [plugin]') .command('activate [plugin]')
.description('Activate a plugin for the next startup of NodeBB (nodebb-plugin- prefix is optional)') .description('Activate a plugin for the next startup of NodeBB (nodebb-plugin- prefix is optional)')
.action(function (plugin) { .action((plugin) => {
require('./manage').activate(plugin); require('./manage').activate(plugin);
}); });
program program
.command('plugins') .command('plugins')
.action(function () { .action(() => {
require('./manage').listPlugins(); require('./manage').listPlugins();
}) })
.description('List all installed plugins'); .description('List all installed plugins');
program program
.command('events [count]') .command('events [count]')
.description('Outputs the most recent administrative events recorded by NodeBB') .description('Outputs the most recent administrative events recorded by NodeBB')
.action(function (count) { .action((count) => {
require('./manage').listEvents(count); require('./manage').listEvents(count);
}); });
program program
.command('info') .command('info')
.description('Outputs various system info') .description('Outputs various system info')
.action(function () { .action(() => {
require('./manage').info(); require('./manage').info();
}); });
@@ -237,16 +237,14 @@ resetCommand
.option('-w, --widgets', 'Disable all widgets') .option('-w, --widgets', 'Disable all widgets')
.option('-s, --settings', 'Reset settings to their default values') .option('-s, --settings', 'Reset settings to their default values')
.option('-a, --all', 'All of the above') .option('-a, --all', 'All of the above')
.action(function (options) { .action((options) => {
const valid = ['theme', 'plugin', 'widgets', 'settings', 'all'].some(function (x) { const valid = ['theme', 'plugin', 'widgets', 'settings', 'all'].some(x => options[x]);
return options[x];
});
if (!valid) { if (!valid) {
console.warn('\n No valid options passed in, so nothing was reset.'.red); console.warn('\n No valid options passed in, so nothing was reset.'.red);
resetCommand.help(); resetCommand.help();
} }
require('./reset').reset(options, function (err) { require('./reset').reset(options, (err) => {
if (err) { if (err) {
return process.exit(1); return process.exit(1);
} }
@@ -264,7 +262,7 @@ program
.option('-p, --plugins', 'Check installed plugins for updates', false) .option('-p, --plugins', 'Check installed plugins for updates', false)
.option('-s, --schema', 'Update NodeBB data store schema', false) .option('-s, --schema', 'Update NodeBB data store schema', false)
.option('-b, --build', 'Rebuild assets', false) .option('-b, --build', 'Rebuild assets', false)
.on('--help', function () { .on('--help', () => {
console.log(`\n${[ console.log(`\n${[
'When running particular upgrade scripts, options are ignored.', 'When running particular upgrade scripts, options are ignored.',
'By default all options are enabled. Passing any options disables that default.', 'By default all options are enabled. Passing any options disables that default.',
@@ -272,7 +270,7 @@ program
`Only database update: ${'./nodebb upgrade -s'.yellow}`, `Only database update: ${'./nodebb upgrade -s'.yellow}`,
].join('\n')}`); ].join('\n')}`);
}) })
.action(function (scripts, options) { .action((scripts, options) => {
require('./upgrade').upgrade(scripts.length ? scripts : true, options); require('./upgrade').upgrade(scripts.length ? scripts : true, options);
}); });
@@ -282,8 +280,8 @@ program
}) })
.alias('upgradePlugins') .alias('upgradePlugins')
.description('Upgrade plugins') .description('Upgrade plugins')
.action(function () { .action(() => {
require('./upgrade-plugins').upgradePlugins(function (err) { require('./upgrade-plugins').upgradePlugins((err) => {
if (err) { if (err) {
throw err; throw err;
} }
@@ -295,12 +293,12 @@ program
program program
.command('help [command]') .command('help [command]')
.description('Display help for [command]') .description('Display help for [command]')
.action(function (name) { .action((name) => {
if (!name) { if (!name) {
return program.help(); return program.help();
} }
const command = program.commands.find(function (command) { return command._name === name; }); const command = program.commands.find(command => command._name === name);
if (command) { if (command) {
command.help(); command.help();
} else { } else {

View File

@@ -86,7 +86,7 @@ async function listEvents(count) {
await db.init(); await db.init();
const eventData = await events.getEvents('', 0, (count || 10) - 1); const eventData = await events.getEvents('', 0, (count || 10) - 1);
console.log((`\nDisplaying last ${count} administrative events...`).bold); console.log((`\nDisplaying last ${count} administrative events...`).bold);
eventData.forEach(function (event) { eventData.forEach((event) => {
console.log(` * ${String(event.timestampISO).green} ${String(event.type).yellow}${event.text ? ` ${event.text}` : ''}${' (uid: '.reset}${event.uid ? event.uid : 0})`); console.log(` * ${String(event.timestampISO).green} ${String(event.type).yellow}${event.text ? ` ${event.text}` : ''}${' (uid: '.reset}${event.uid ? event.uid : 0})`);
}); });
process.exit(); process.exit();
@@ -132,7 +132,7 @@ async function info() {
const min = Math.min(...analyticsData); const min = Math.min(...analyticsData);
const max = Math.max(...analyticsData); const max = Math.max(...analyticsData);
analyticsData.forEach(function (point, idx) { analyticsData.forEach((point, idx) => {
graph.addPoint(idx + 1, Math.round(point / max * 10)); graph.addPoint(idx + 1, Math.round(point / max * 10));
}); });

View File

@@ -99,14 +99,14 @@ function preserveExtraneousPlugins() {
const extraneous = packages const extraneous = packages
// only extraneous plugins (ones not in package.json) which are not links // only extraneous plugins (ones not in package.json) which are not links
.filter(function (pkgName) { .filter((pkgName) => {
const extraneous = !packageContents.dependencies.hasOwnProperty(pkgName); const extraneous = !packageContents.dependencies.hasOwnProperty(pkgName);
const isLink = fs.lstatSync(path.join(paths.nodeModules, pkgName)).isSymbolicLink(); const isLink = fs.lstatSync(path.join(paths.nodeModules, pkgName)).isSymbolicLink();
return extraneous && !isLink; return extraneous && !isLink;
}) })
// reduce to a map of package names to package versions // reduce to a map of package names to package versions
.reduce(function (map, pkgName) { .reduce((map, pkgName) => {
const pkgConfig = JSON.parse(fs.readFileSync(path.join(paths.nodeModules, pkgName, 'package.json'), 'utf8')); const pkgConfig = JSON.parse(fs.readFileSync(path.join(paths.nodeModules, pkgName, 'package.json'), 'utf8'));
map[pkgName] = pkgConfig.version; map[pkgName] = pkgConfig.version;
return map; return map;

View File

@@ -11,7 +11,7 @@ const cwd = paths.baseDir;
function getRunningPid(callback) { function getRunningPid(callback) {
fs.readFile(paths.pidfile, { fs.readFile(paths.pidfile, {
encoding: 'utf-8', encoding: 'utf-8',
}, function (err, pid) { }, (err, pid) => {
if (err) { if (err) {
return callback(err); return callback(err);
} }
@@ -69,7 +69,7 @@ function start(options) {
} }
function stop() { function stop() {
getRunningPid(function (err, pid) { getRunningPid((err, pid) => {
if (!err) { if (!err) {
process.kill(pid, 'SIGTERM'); process.kill(pid, 'SIGTERM');
console.log('Stopping NodeBB. Goodbye!'); console.log('Stopping NodeBB. Goodbye!');
@@ -80,7 +80,7 @@ function stop() {
} }
function restart(options) { function restart(options) {
getRunningPid(function (err, pid) { getRunningPid((err, pid) => {
if (!err) { if (!err) {
console.log('\nRestarting NodeBB'.bold); console.log('\nRestarting NodeBB'.bold);
process.kill(pid, 'SIGTERM'); process.kill(pid, 'SIGTERM');
@@ -94,7 +94,7 @@ function restart(options) {
} }
function status() { function status() {
getRunningPid(function (err, pid) { getRunningPid((err, pid) => {
if (!err) { if (!err) {
console.log(`\n${[ console.log(`\n${[
'NodeBB Running '.bold + (`(pid ${pid.toString()})`).cyan, 'NodeBB Running '.bold + (`(pid ${pid.toString()})`).cyan,

View File

@@ -40,7 +40,7 @@ function setup(initConfig) {
setImmediate(next); setImmediate(next);
} }
}, },
], function (err, data) { ], (err, data) => {
// Disregard build step data // Disregard build step data
data = data[0]; data = data[0];

View File

@@ -25,8 +25,8 @@ if (process.platform === 'win32') {
function getModuleVersions(modules, callback) { function getModuleVersions(modules, callback) {
const versionHash = {}; const versionHash = {};
async.eachLimit(modules, 50, function (module, next) { async.eachLimit(modules, 50, (module, next) => {
fs.readFile(path.join(paths.nodeModules, module, 'package.json'), { encoding: 'utf-8' }, function (err, pkg) { fs.readFile(path.join(paths.nodeModules, module, 'package.json'), { encoding: 'utf-8' }, (err, pkg) => {
if (err) { if (err) {
return next(err); return next(err);
} }
@@ -39,7 +39,7 @@ function getModuleVersions(modules, callback) {
next(err); next(err);
} }
}); });
}, function (err) { }, (err) => {
callback(err, versionHash); callback(err, versionHash);
}); });
} }
@@ -49,14 +49,12 @@ function getInstalledPlugins(callback) {
files: async.apply(fs.readdir, paths.nodeModules), files: async.apply(fs.readdir, paths.nodeModules),
deps: async.apply(fs.readFile, paths.currentPackage, { encoding: 'utf-8' }), deps: async.apply(fs.readFile, paths.currentPackage, { encoding: 'utf-8' }),
bundled: async.apply(fs.readFile, paths.installPackage, { encoding: 'utf-8' }), bundled: async.apply(fs.readFile, paths.installPackage, { encoding: 'utf-8' }),
}, function (err, payload) { }, (err, payload) => {
if (err) { if (err) {
return callback(err); return callback(err);
} }
payload.files = payload.files.filter(function (file) { payload.files = payload.files.filter(file => pluginNamePattern.test(file));
return pluginNamePattern.test(file);
});
try { try {
payload.deps = Object.keys(JSON.parse(payload.deps).dependencies); payload.deps = Object.keys(JSON.parse(payload.deps).dependencies);
@@ -65,15 +63,11 @@ function getInstalledPlugins(callback) {
return callback(err); return callback(err);
} }
payload.bundled = payload.bundled.filter(function (pkgName) { payload.bundled = payload.bundled.filter(pkgName => pluginNamePattern.test(pkgName));
return pluginNamePattern.test(pkgName); payload.deps = payload.deps.filter(pkgName => pluginNamePattern.test(pkgName));
});
payload.deps = payload.deps.filter(function (pkgName) {
return pluginNamePattern.test(pkgName);
});
// Whittle down deps to send back only extraneously installed plugins/themes/etc // Whittle down deps to send back only extraneously installed plugins/themes/etc
const checklist = payload.deps.filter(function (pkgName) { const checklist = payload.deps.filter((pkgName) => {
if (payload.bundled.includes(pkgName)) { if (payload.bundled.includes(pkgName)) {
return false; return false;
} }
@@ -92,7 +86,7 @@ function getInstalledPlugins(callback) {
} }
function getCurrentVersion(callback) { function getCurrentVersion(callback) {
fs.readFile(paths.installPackage, { encoding: 'utf-8' }, function (err, pkg) { fs.readFile(paths.installPackage, { encoding: 'utf-8' }, (err, pkg) => {
if (err) { if (err) {
return callback(err); return callback(err);
} }
@@ -128,7 +122,7 @@ function checkPlugins(standalone, callback) {
method: 'GET', method: 'GET',
url: `https://packages.nodebb.org/api/v1/suggest?version=${payload.version}&package[]=${toCheck.join('&package[]=')}`, url: `https://packages.nodebb.org/api/v1/suggest?version=${payload.version}&package[]=${toCheck.join('&package[]=')}`,
json: true, json: true,
}, function (err, res, body) { }, (err, res, body) => {
if (err) { if (err) {
process.stdout.write('error'.red + ''.reset); process.stdout.write('error'.red + ''.reset);
return next(err); return next(err);
@@ -141,7 +135,7 @@ function checkPlugins(standalone, callback) {
let current; let current;
let suggested; let suggested;
const upgradable = body.map(function (suggestObj) { const upgradable = body.map((suggestObj) => {
current = payload.plugins[suggestObj.package]; current = payload.plugins[suggestObj.package];
suggested = suggestObj.version; suggested = suggestObj.version;
@@ -168,7 +162,7 @@ function upgradePlugins(callback) {
standalone = true; standalone = true;
} }
checkPlugins(standalone, function (err, found) { checkPlugins(standalone, (err, found) => {
if (err) { if (err) {
console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset); console.log('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability'.reset);
return callback(err); return callback(err);
@@ -176,7 +170,7 @@ function upgradePlugins(callback) {
if (found && found.length) { if (found && found.length) {
process.stdout.write(`\n\nA total of ${String(found.length).bold} package(s) can be upgraded:\n\n`); process.stdout.write(`\n\nA total of ${String(found.length).bold} package(s) can be upgraded:\n\n`);
found.forEach(function (suggestObj) { found.forEach((suggestObj) => {
process.stdout.write(`${' * '.yellow + suggestObj.name.reset} (${suggestObj.current.yellow}${' -> '.reset}${suggestObj.suggested.green}${')\n'.reset}`); process.stdout.write(`${' * '.yellow + suggestObj.name.reset} (${suggestObj.current.yellow}${' -> '.reset}${suggestObj.suggested.green}${')\n'.reset}`);
}); });
} else { } else {
@@ -194,18 +188,16 @@ function upgradePlugins(callback) {
name: 'upgrade', name: 'upgrade',
description: '\nProceed with upgrade (y|n)?'.reset, description: '\nProceed with upgrade (y|n)?'.reset,
type: 'string', type: 'string',
}, function (err, result) { }, (err, result) => {
if (err) { if (err) {
return callback(err); return callback(err);
} }
if (['y', 'Y', 'yes', 'YES'].includes(result.upgrade)) { if (['y', 'Y', 'yes', 'YES'].includes(result.upgrade)) {
console.log('\nUpgrading packages...'); console.log('\nUpgrading packages...');
const args = packageManagerInstallArgs.concat(found.map(function (suggestObj) { const args = packageManagerInstallArgs.concat(found.map(suggestObj => `${suggestObj.name}@${suggestObj.suggested}`));
return `${suggestObj.name}@${suggestObj.suggested}`;
}));
cproc.execFile(packageManagerExecutable, args, { stdio: 'ignore' }, function (err) { cproc.execFile(packageManagerExecutable, args, { stdio: 'ignore' }, (err) => {
callback(err, false); callback(err, false);
}); });
} else { } else {

View File

@@ -53,17 +53,15 @@ var steps = {
}; };
function runSteps(tasks) { function runSteps(tasks) {
tasks = tasks.map(function (key, i) { tasks = tasks.map((key, i) => function (next) {
return function (next) {
process.stdout.write(`\n${(`${i + 1}. `).bold}${steps[key].message.yellow}`); process.stdout.write(`\n${(`${i + 1}. `).bold}${steps[key].message.yellow}`);
return steps[key].handler(function (err) { return steps[key].handler((err) => {
if (err) { return next(err); } if (err) { return next(err); }
next(); next();
}); });
};
}); });
async.series(tasks, function (err) { async.series(tasks, (err) => {
if (err) { if (err) {
console.error(`Error occurred during upgrade: ${err.stack}`); console.error(`Error occurred during upgrade: ${err.stack}`);
throw err; throw err;
@@ -90,9 +88,7 @@ function runUpgrade(upgrades, options) {
var tasks = Object.keys(steps); var tasks = Object.keys(steps);
if (options.package || options.install || if (options.package || options.install ||
options.plugins || options.schema || options.build) { options.plugins || options.schema || options.build) {
tasks = tasks.filter(function (key) { tasks = tasks.filter(key => options[key]);
return options[key];
});
} }
runSteps(tasks); runSteps(tasks);
return; return;
@@ -104,7 +100,7 @@ function runUpgrade(upgrades, options) {
async function () { async function () {
await upgrade.runParticular(upgrades); await upgrade.runParticular(upgrades);
}, },
], function (err) { ], (err) => {
if (err) { if (err) {
throw err; throw err;
} }

View File

@@ -26,7 +26,7 @@ categoriesController.get = async function (req, res, next) {
const categoriesData = allCategoriesData.slice(start, stop + 1); const categoriesData = allCategoriesData.slice(start, stop + 1);
categoriesData.forEach(function (category) { categoriesData.forEach((category) => {
if (category) { if (category) {
category.isIgnored = states[category.cid] === categories.watchStates.ignoring; category.isIgnored = states[category.cid] === categories.watchStates.ignoring;
category.isWatched = states[category.cid] === categories.watchStates.watching; category.isWatched = states[category.cid] === categories.watchStates.watching;

View File

@@ -49,7 +49,7 @@ editController.get = async function (req, res, next) {
} }
return i1 - i2; return i1 - i2;
}); });
userData.groups.forEach(function (group) { userData.groups.forEach((group) => {
group.userTitle = group.userTitle || group.displayName; group.userTitle = group.userTitle || group.displayName;
group.selected = userData.groupTitleArray.includes(group.name); group.selected = userData.groupTitleArray.includes(group.name);
}); });

View File

@@ -15,7 +15,7 @@ groupsController.get = async function (req, res, next) {
groupsData = groupsData[0]; groupsData = groupsData[0];
const groupNames = groupsData.filter(Boolean).map(group => group.name); const groupNames = groupsData.filter(Boolean).map(group => group.name);
const members = await groups.getMemberUsers(groupNames, 0, 3); const members = await groups.getMemberUsers(groupNames, 0, 3);
groupsData.forEach(function (group, index) { groupsData.forEach((group, index) => {
group.members = members[index]; group.members = members[index];
}); });
userData.groups = groupsData; userData.groups = groupsData;

View File

@@ -231,7 +231,7 @@ async function parseAboutMe(userData) {
} }
function filterLinks(links, states) { function filterLinks(links, states) {
return links.filter(function (link, index) { return links.filter((link, index) => {
// Default visibility // Default visibility
link.visibility = { self: true, link.visibility = { self: true,
other: true, other: true,
@@ -241,9 +241,7 @@ function filterLinks(links, states) {
canViewInfo: true, canViewInfo: true,
...link.visibility }; ...link.visibility };
var permit = Object.keys(states).some(function (state) { var permit = Object.keys(states).some(state => states[state] && link.visibility[state]);
return states[state] && link.visibility[state];
});
links[index].public = permit; links[index].public = permit;
return permit; return permit;

View File

@@ -44,7 +44,7 @@ notificationsController.get = async function (req, res, next) {
{ separator: true }, { separator: true },
]).concat(filters.moderatorFilters); ]).concat(filters.moderatorFilters);
} }
const selectedFilter = allFilters.find(function (filterData) { const selectedFilter = allFilters.find((filterData) => {
filterData.selected = filterData.filter === filter; filterData.selected = filterData.filter === filter;
return filterData.selected; return filterData.selected;
}); });

View File

@@ -178,7 +178,7 @@ async function getFromUserSet(template, req, res, callback) {
{ url: `${baseUrl}?sort=lastpost`, name: '[[global:lastpost]]' }, { url: `${baseUrl}?sort=lastpost`, name: '[[global:lastpost]]' },
{ url: `${baseUrl}?sort=firstpost`, name: '[[global:firstpost]]' }, { url: `${baseUrl}?sort=firstpost`, name: '[[global:firstpost]]' },
]; ];
userData.sortOptions.forEach(function (option) { userData.sortOptions.forEach((option) => {
option.selected = option.url.includes(`sort=${req.query.sort}`); option.selected = option.url.includes(`sort=${req.query.sort}`);
}); });

View File

@@ -76,16 +76,16 @@ settingsController.get = async function (req, res, next) {
{ name: 'Yeti', value: 'yeti' }, { name: 'Yeti', value: 'yeti' },
]; ];
userData.bootswatchSkinOptions.forEach(function (skin) { userData.bootswatchSkinOptions.forEach((skin) => {
skin.selected = skin.value === userData.settings.bootswatchSkin; skin.selected = skin.value === userData.settings.bootswatchSkin;
}); });
userData.languages.forEach(function (language) { userData.languages.forEach((language) => {
language.selected = language.code === userData.settings.userLang; language.selected = language.code === userData.settings.userLang;
}); });
if (userData.isAdmin && userData.isSelf) { if (userData.isAdmin && userData.isSelf) {
userData.acpLanguages.forEach(function (language) { userData.acpLanguages.forEach((language) => {
language.selected = language.code === userData.settings.acpLang; language.selected = language.code === userData.settings.acpLang;
}); });
} }
@@ -122,7 +122,7 @@ settingsController.get = async function (req, res, next) {
}; };
const unsubscribable = ['digest', 'notification']; const unsubscribable = ['digest', 'notification'];
const jwtVerifyAsync = util.promisify(function (token, callback) { const jwtVerifyAsync = util.promisify((token, callback) => {
jwt.verify(token, nconf.get('secret'), (err, payload) => callback(err, payload)); jwt.verify(token, nconf.get('secret'), (err, payload) => callback(err, payload));
}); });
const doUnsubscribe = async (payload) => { const doUnsubscribe = async (payload) => {
@@ -221,7 +221,7 @@ async function getHomePageRoutes(userData) {
// Set selected for each route // Set selected for each route
var customIdx; var customIdx;
var hasSelected = false; var hasSelected = false;
routes = routes.map(function (route, idx) { routes = routes.map((route, idx) => {
if (route.route === userData.settings.homePageRoute) { if (route.route === userData.settings.homePageRoute) {
route.selected = true; route.selected = true;
hasSelected = true; hasSelected = true;

View File

@@ -25,12 +25,10 @@ uploadsController.get = async function (req, res, next) {
db.getSortedSetRevRange(`uid:${userData.uid}:uploads`, start, stop), db.getSortedSetRevRange(`uid:${userData.uid}:uploads`, start, stop),
]); ]);
userData.uploads = uploadNames.map(function (uploadName) { userData.uploads = uploadNames.map(uploadName => ({
return {
name: uploadName, name: uploadName,
url: nconf.get('upload_url') + uploadName, url: nconf.get('upload_url') + uploadName,
}; }));
});
const pageCount = Math.ceil(itemCount / itemsPerPage); const pageCount = Math.ceil(itemCount / itemsPerPage);
userData.pagination = pagination.create(page, pageCount, req.query); userData.pagination = pagination.create(page, pageCount, req.query);
userData.privateUploads = meta.config.privateUploads === 1; userData.privateUploads = meta.config.privateUploads === 1;

View File

@@ -50,7 +50,7 @@ cacheController.dump = function (req, res, next) {
const data = JSON.stringify(caches[req.query.name].dump(), null, 4); const data = JSON.stringify(caches[req.query.name].dump(), null, 4);
res.setHeader('Content-disposition', `attachment; filename= ${req.query.name}-cache.json`); res.setHeader('Content-disposition', `attachment; filename= ${req.query.name}-cache.json`);
res.setHeader('Content-type', 'application/json'); res.setHeader('Content-type', 'application/json');
res.write(data, function (err) { res.write(data, (err) => {
if (err) { if (err) {
return next(err); return next(err);
} }

View File

@@ -116,7 +116,7 @@ async function buildBreadcrumbs(req, categoryData) {
const allCrumbs = await helpers.buildCategoryBreadcrumbs(categoryData.parentCid); const allCrumbs = await helpers.buildCategoryBreadcrumbs(categoryData.parentCid);
const crumbs = allCrumbs.filter(c => c.cid); const crumbs = allCrumbs.filter(c => c.cid);
crumbs.forEach(function (c) { crumbs.forEach((c) => {
c.url = `/admin/manage/categories?cid=${c.cid}`; c.url = `/admin/manage/categories?cid=${c.cid}`;
}); });
crumbs.unshift({ crumbs.unshift({

View File

@@ -25,13 +25,11 @@ eventsController.get = async function (req, res) {
events.getEvents(currentFilter, start, stop, from || '-inf', to), events.getEvents(currentFilter, start, stop, from || '-inf', to),
]); ]);
const types = [''].concat(events.types).map(function (type) { const types = [''].concat(events.types).map(type => ({
return {
value: type, value: type,
name: type || 'all', name: type || 'all',
selected: type === currentFilter, selected: type === currentFilter,
}; }));
});
const pageCount = Math.max(1, Math.ceil(eventCount / itemsPerPage)); const pageCount = Math.max(1, Math.ceil(eventCount / itemsPerPage));

View File

@@ -42,13 +42,11 @@ groupsController.get = async function (req, res, next) {
} }
group.isOwner = true; group.isOwner = true;
const groupNameData = groupNames.map(function (name) { const groupNameData = groupNames.map(name => ({
return {
encodedName: encodeURIComponent(name), encodedName: encodeURIComponent(name),
displayName: validator.escape(String(name)), displayName: validator.escape(String(name)),
selected: name === groupName, selected: name === groupName,
}; }));
});
res.render('admin/manage/group', { res.render('admin/manage/group', {
group: group, group: group,

View File

@@ -7,7 +7,7 @@ const hooksController = module.exports;
hooksController.get = function (req, res) { hooksController.get = function (req, res) {
const hooks = []; const hooks = [];
Object.keys(plugins.loadedHooks).forEach(function (key, hookIndex) { Object.keys(plugins.loadedHooks).forEach((key, hookIndex) => {
const current = { const current = {
hookName: key, hookName: key,
methods: [], methods: [],
@@ -15,7 +15,7 @@ hooksController.get = function (req, res) {
count: plugins.loadedHooks[key].length, count: plugins.loadedHooks[key].length,
}; };
plugins.loadedHooks[key].forEach(function (hookData, methodIndex) { plugins.loadedHooks[key].forEach((hookData, methodIndex) => {
current.methods.push({ current.methods.push({
id: hookData.id, id: hookData.id,
priority: hookData.priority, priority: hookData.priority,

View File

@@ -16,10 +16,10 @@ infoController.get = function (req, res) {
info = {}; info = {};
pubsub.publish('sync:node:info:start'); pubsub.publish('sync:node:info:start');
const timeoutMS = 1000; const timeoutMS = 1000;
setTimeout(function () { setTimeout(() => {
const data = []; const data = [];
Object.keys(info).forEach(key => data.push(info[key])); Object.keys(info).forEach(key => data.push(info[key]));
data.sort(function (a, b) { data.sort((a, b) => {
if (a.id < b.id) { if (a.id < b.id) {
return -1; return -1;
} }
@@ -46,7 +46,7 @@ infoController.get = function (req, res) {
}, timeoutMS); }, timeoutMS);
}; };
pubsub.on('sync:node:info:start', async function () { pubsub.on('sync:node:info:start', async () => {
try { try {
const data = await getNodeInfo(); const data = await getNodeInfo();
data.id = `${os.hostname()}:${nconf.get('port')}`; data.id = `${os.hostname()}:${nconf.get('port')}`;
@@ -56,7 +56,7 @@ pubsub.on('sync:node:info:start', async function () {
} }
}); });
pubsub.on('sync:node:info:end', function (data) { pubsub.on('sync:node:info:end', (data) => {
info[data.id] = data.data; info[data.id] = data.data;
}); });
@@ -77,7 +77,7 @@ async function getNodeInfo() {
platform: os.platform(), platform: os.platform(),
arch: os.arch(), arch: os.arch(),
release: os.release(), release: os.release(),
load: os.loadavg().map(function (load) { return load.toFixed(2); }).join(', '), load: os.loadavg().map(load => load.toFixed(2)).join(', '),
freemem: os.freemem(), freemem: os.freemem(),
totalmem: os.totalmem(), totalmem: os.totalmem(),
}, },
@@ -118,7 +118,7 @@ function humanReadableUptime(seconds) {
async function getGitInfo() { async function getGitInfo() {
function get(cmd, callback) { function get(cmd, callback) {
exec(cmd, function (err, stdout) { exec(cmd, (err, stdout) => {
if (err) { if (err) {
winston.error(err.stack); winston.error(err.stack);
} }

View File

@@ -32,18 +32,14 @@ pluginsController.get = async function (req, res) {
installedCount: installedPlugins.length, installedCount: installedPlugins.length,
activeCount: activePlugins.length, activeCount: activePlugins.length,
inactiveCount: Math.max(0, installedPlugins.length - activePlugins.length), inactiveCount: Math.max(0, installedPlugins.length - activePlugins.length),
upgradeCount: compatible.reduce(function (count, current) { upgradeCount: compatible.reduce((count, current) => {
if (current.installed && current.outdated) { if (current.installed && current.outdated) {
count += 1; count += 1;
} }
return count; return count;
}, 0), }, 0),
download: compatible.filter(function (plugin) { download: compatible.filter(plugin => !plugin.installed),
return !plugin.installed; incompatible: all.filter(plugin => !compatiblePkgNames.includes(plugin.name)),
}),
incompatible: all.filter(function (plugin) {
return !compatiblePkgNames.includes(plugin.name);
}),
trending: trendingPlugins, trending: trendingPlugins,
submitPluginUsage: meta.config.submitPluginUsage, submitPluginUsage: meta.config.submitPluginUsage,
version: nconf.get('version'), version: nconf.get('version'),

View File

@@ -27,7 +27,7 @@ privilegesController.get = async function (req, res) {
}]; }];
let selectedCategory; let selectedCategory;
categoriesData.forEach(function (category) { categoriesData.forEach((category) => {
if (category) { if (category) {
category.selected = category.cid === (!isAdminPriv ? cid : 'admin'); category.selected = category.cid === (!isAdminPriv ? cid : 'admin');

View File

@@ -30,12 +30,10 @@ settingsController.email = async (req, res) => {
settingsController.user = async (req, res) => { settingsController.user = async (req, res) => {
const notificationTypes = await notifications.getAllNotificationTypes(); const notificationTypes = await notifications.getAllNotificationTypes();
const notificationSettings = notificationTypes.map(function (type) { const notificationSettings = notificationTypes.map(type => ({
return {
name: type, name: type,
label: `[[notifications:${type}]]`, label: `[[notifications:${type}]]`,
}; }));
});
res.render('admin/settings/user', { res.render('admin/settings/user', {
notificationSettings: notificationSettings, notificationSettings: notificationSettings,
}); });
@@ -50,7 +48,7 @@ settingsController.post = async (req, res) => {
settingsController.languages = async function (req, res) { settingsController.languages = async function (req, res) {
const languageData = await languages.list(); const languageData = await languages.list();
languageData.forEach(function (language) { languageData.forEach((language) => {
language.selected = language.code === meta.config.defaultLang; language.selected = language.code === meta.config.defaultLang;
}); });
@@ -69,20 +67,18 @@ settingsController.navigation = async function (req, res) {
allGroups.sort((a, b) => b.system - a.system); allGroups.sort((a, b) => b.system - a.system);
admin.groups = allGroups.map(group => ({ name: group.name, displayName: group.displayName })); admin.groups = allGroups.map(group => ({ name: group.name, displayName: group.displayName }));
admin.enabled.forEach(function (enabled, index) { admin.enabled.forEach((enabled, index) => {
enabled.index = index; enabled.index = index;
enabled.selected = index === 0; enabled.selected = index === 0;
enabled.title = translator.escape(enabled.title); enabled.title = translator.escape(enabled.title);
enabled.text = translator.escape(enabled.text); enabled.text = translator.escape(enabled.text);
enabled.groups = admin.groups.map(function (group) { enabled.groups = admin.groups.map(group => ({
return {
displayName: group.displayName, displayName: group.displayName,
selected: enabled.groups.includes(group.name), selected: enabled.groups.includes(group.name),
}; }));
});
}); });
admin.available.forEach(function (available) { admin.available.forEach((available) => {
available.groups = admin.groups; available.groups = admin.groups;
}); });

View File

@@ -33,7 +33,7 @@ uploadsController.get = async function (req, res, next) {
files = await filesToData(currentFolder, files); files = await filesToData(currentFolder, files);
// Float directories to the top // Float directories to the top
files.sort(function (a, b) { files.sort((a, b) => {
if (a.isDirectory && !b.isDirectory) { if (a.isDirectory && !b.isDirectory) {
return -1; return -1;
} else if (!a.isDirectory && b.isDirectory) { } else if (!a.isDirectory && b.isDirectory) {
@@ -48,7 +48,7 @@ uploadsController.get = async function (req, res, next) {
// Add post usage info if in /files // Add post usage info if in /files
if (['/files', '/files/'].includes(req.query.dir)) { if (['/files', '/files/'].includes(req.query.dir)) {
const usage = await posts.uploads.getUsage(files); const usage = await posts.uploads.getUsage(files);
files.forEach(function (file, idx) { files.forEach((file, idx) => {
file.inPids = usage[idx].map(pid => parseInt(pid, 10)); file.inPids = usage[idx].map(pid => parseInt(pid, 10));
}); });
} }
@@ -68,7 +68,7 @@ function buildBreadcrumbs(currentFolder) {
var crumbs = []; var crumbs = [];
var parts = currentFolder.replace(nconf.get('upload_path'), '').split(path.sep); var parts = currentFolder.replace(nconf.get('upload_path'), '').split(path.sep);
var currentPath = ''; var currentPath = '';
parts.forEach(function (part) { parts.forEach((part) => {
var dir = path.join(currentPath, part); var dir = path.join(currentPath, part);
crumbs.push({ crumbs.push({
text: part || 'Uploads', text: part || 'Uploads',

View File

@@ -164,7 +164,7 @@ usersController.search = async function (req, res) {
const uids = searchData.users.map(user => user && user.uid); const uids = searchData.users.map(user => user && user.uid);
const userInfo = await user.getUsersFields(uids, ['email', 'flags', 'lastonline', 'joindate']); const userInfo = await user.getUsersFields(uids, ['email', 'flags', 'lastonline', 'joindate']);
searchData.users.forEach(function (user, index) { searchData.users.forEach((user, index) => {
if (user && userInfo[index]) { if (user && userInfo[index]) {
user.email = userInfo[index].email; user.email = userInfo[index].email;
user.flags = userInfo[index].flags || 0; user.flags = userInfo[index].flags || 0;
@@ -203,7 +203,7 @@ async function getInvites() {
let usernames = await user.getUsersFields(uids, ['username']); let usernames = await user.getUsersFields(uids, ['username']);
usernames = usernames.map(user => user.username); usernames = usernames.map(user => user.username);
invitations.forEach(function (invites, index) { invitations.forEach((invites, index) => {
invites.username = usernames[index]; invites.username = usernames[index];
}); });
@@ -215,13 +215,11 @@ async function getInvites() {
usernames = await Promise.all(invitations.map(invites => getUsernamesByEmails(invites.invitations))); usernames = await Promise.all(invitations.map(invites => getUsernamesByEmails(invites.invitations)));
invitations.forEach(function (invites, index) { invitations.forEach((invites, index) => {
invites.invitations = invites.invitations.map(function (email, i) { invites.invitations = invites.invitations.map((email, i) => ({
return {
email: email, email: email,
username: usernames[index][i] === '[[global:guest]]' ? '' : usernames[index][i], username: usernames[index][i] === '[[global:guest]]' ? '' : usernames[index][i],
}; }));
});
}); });
return invitations; return invitations;
} }
@@ -238,7 +236,7 @@ async function render(req, res, data) {
data[`searchBy_${validator.escape(String(req.query.searchBy))}`] = true; data[`searchBy_${validator.escape(String(req.query.searchBy))}`] = true;
} }
const filterBy = Array.isArray(req.query.filters || []) ? (req.query.filters || []) : [req.query.filters]; const filterBy = Array.isArray(req.query.filters || []) ? (req.query.filters || []) : [req.query.filters];
filterBy.forEach(function (filter) { filterBy.forEach((filter) => {
data[`filterBy_${validator.escape(String(filter))}`] = true; data[`filterBy_${validator.escape(String(filter))}`] = true;
}); });
data.userCount = parseInt(await db.getObjectField('global', 'userCount'), 10); data.userCount = parseInt(await db.getObjectField('global', 'userCount'), 10);
@@ -265,7 +263,7 @@ usersController.getCSV = async function (req, res, next) {
'Content-Type': 'text/csv', 'Content-Type': 'text/csv',
'Content-Disposition': 'attachment; filename=users.csv', 'Content-Disposition': 'attachment; filename=users.csv',
}, },
}, function (err) { }, (err) => {
if (err) { if (err) {
if (err.code === 'ENOENT') { if (err.code === 'ENOENT') {
res.locals.isAPI = false; res.locals.isAPI = false;

View File

@@ -142,7 +142,7 @@ authenticationController.registerComplete = function (req, res, next) {
return next(err); return next(err);
} }
var callbacks = data.interstitials.reduce(function (memo, cur) { var callbacks = data.interstitials.reduce((memo, cur) => {
if (cur.hasOwnProperty('callback') && typeof cur.callback === 'function') { if (cur.hasOwnProperty('callback') && typeof cur.callback === 'function') {
req.body.files = req.files; req.body.files = req.files;
memo.push(cur.callback && cur.callback.constructor && cur.callback.constructor.name === 'AsyncFunction' ? cur.callback : util.promisify(cur.callback)); memo.push(cur.callback && cur.callback.constructor && cur.callback.constructor.name === 'AsyncFunction' ? cur.callback : util.promisify(cur.callback));
@@ -201,7 +201,7 @@ authenticationController.registerComplete = function (req, res, next) {
authenticationController.registerAbort = function (req, res) { authenticationController.registerAbort = function (req, res) {
// End the session and redirect to home // End the session and redirect to home
req.session.destroy(function () { req.session.destroy(() => {
res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get()); res.clearCookie(nconf.get('sessionKey'), meta.configs.cookie.get());
res.redirect(`${nconf.get('relative_path')}/`); res.redirect(`${nconf.get('relative_path')}/`);
}); });
@@ -248,7 +248,7 @@ authenticationController.login = async (req, res, next) => {
}; };
function continueLogin(strategy, req, res, next) { function continueLogin(strategy, req, res, next) {
passport.authenticate(strategy, async function (err, userData, info) { passport.authenticate(strategy, async (err, userData, info) => {
if (err) { if (err) {
return helpers.noScriptErrors(req, res, err.message, 403); return helpers.noScriptErrors(req, res, err.message, 403);
} }

View File

@@ -41,7 +41,7 @@ categoriesController.list = async function (req, res) {
pagination: pagination.create(page, pageCount, req.query), pagination: pagination.create(page, pageCount, req.query),
}; };
data.categories.forEach(function (category) { data.categories.forEach((category) => {
if (category) { if (category) {
helpers.trimChildren(category); helpers.trimChildren(category);
helpers.setCategoryTeaser(category); helpers.setCategoryTeaser(category);

View File

@@ -104,7 +104,7 @@ categoryController.get = async function (req, res, next) {
categoryData.hasMoreSubCategories = categoryData.children.length > categoryData.subCategoriesPerPage; categoryData.hasMoreSubCategories = categoryData.children.length > categoryData.subCategoriesPerPage;
categoryData.nextSubCategoryStart = categoryData.subCategoriesPerPage; categoryData.nextSubCategoryStart = categoryData.subCategoriesPerPage;
categoryData.children = categoryData.children.slice(0, categoryData.subCategoriesPerPage); categoryData.children = categoryData.children.slice(0, categoryData.subCategoriesPerPage);
categoryData.children.forEach(function (child) { categoryData.children.forEach((child) => {
if (child) { if (child) {
helpers.trimChildren(child); helpers.trimChildren(child);
helpers.setCategoryTeaser(child); helpers.setCategoryTeaser(child);
@@ -130,7 +130,7 @@ categoryController.get = async function (req, res, next) {
categoryData['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0; categoryData['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0;
categoryData['reputation:disabled'] = meta.config['reputation:disabled']; categoryData['reputation:disabled'] = meta.config['reputation:disabled'];
categoryData.pagination = pagination.create(currentPage, pageCount, req.query); categoryData.pagination = pagination.create(currentPage, pageCount, req.query);
categoryData.pagination.rel.forEach(function (rel) { categoryData.pagination.rel.forEach((rel) => {
rel.href = `${url}/category/${categoryData.slug}${rel.href}`; rel.href = `${url}/category/${categoryData.slug}${rel.href}`;
res.locals.linkTags.push(rel); res.locals.linkTags.push(rel);
}); });

View File

@@ -67,7 +67,7 @@ exports.handleErrors = function handleErrors(err, req, res, next) { // eslint-di
plugins.hooks.fire('filter:error.handle', { plugins.hooks.fire('filter:error.handle', {
cases: cases, cases: cases,
}, function (_err, data) { }, (_err, data) => {
if (_err) { if (_err) {
// Assume defaults // Assume defaults
winston.warn(`[errors/handle] Unable to retrieve plugin handlers for errors: ${_err.message}`); winston.warn(`[errors/handle] Unable to retrieve plugin handlers for errors: ${_err.message}`);

View File

@@ -58,7 +58,7 @@ helpers.addLinkTags = function (params) {
href: `${url}/${params.url}`, href: `${url}/${params.url}`,
}); });
params.tags.forEach(function (rel) { params.tags.forEach((rel) => {
rel.href = `${url}/${params.url}${rel.href}`; rel.href = `${url}/${params.url}${rel.href}`;
params.res.locals.linkTags.push(rel); params.res.locals.linkTags.push(rel);
}); });
@@ -208,7 +208,7 @@ helpers.buildBreadcrumbs = function (crumbs) {
}, },
]; ];
crumbs.forEach(function (crumb) { crumbs.forEach((crumb) => {
if (crumb) { if (crumb) {
if (crumb.url) { if (crumb.url) {
crumb.url = relative_path + crumb.url; crumb.url = relative_path + crumb.url;
@@ -253,7 +253,7 @@ async function getCategoryData(cids, uid, selectedCid, states, privilege) {
let selectedCategory = []; let selectedCategory = [];
const selectedCids = []; const selectedCids = [];
categoriesData.forEach(function (category) { categoriesData.forEach((category) => {
category.selected = selectedCid ? selectedCid.includes(String(category.cid)) : false; category.selected = selectedCid ? selectedCid.includes(String(category.cid)) : false;
if (category.selected) { if (category.selected) {
selectedCategory.push(category); selectedCategory.push(category);
@@ -312,7 +312,7 @@ helpers.getVisibleCategories = async function (params) {
const cidToCategory = _.zipObject(cids, categoriesData); const cidToCategory = _.zipObject(cids, categoriesData);
const cidToWatchState = _.zipObject(cids, watchState); const cidToWatchState = _.zipObject(cids, watchState);
return categoriesData.filter(function (c) { return categoriesData.filter((c) => {
if (!c) { if (!c) {
return false; return false;
} }
@@ -360,7 +360,7 @@ helpers.getSelectedCategory = async function (cid) {
helpers.trimChildren = function (category) { helpers.trimChildren = function (category) {
if (Array.isArray(category.children)) { if (Array.isArray(category.children)) {
category.children = category.children.slice(0, category.subCategoriesPerPage); category.children = category.children.slice(0, category.subCategoriesPerPage);
category.children.forEach(function (child) { category.children.forEach((child) => {
child.children = undefined; child.children = undefined;
}); });
} }

View File

@@ -216,7 +216,7 @@ Controllers.registerInterstitial = async function (req, res, next) {
}; };
Controllers.confirmEmail = function (req, res) { Controllers.confirmEmail = function (req, res) {
user.email.confirmByCode(req.params.code, function (err) { user.email.confirmByCode(req.params.code, (err) => {
res.render('confirm', { res.render('confirm', {
error: err ? err.message : '', error: err ? err.message : '',
title: '[[pages:confirm]]', title: '[[pages:confirm]]',

View File

@@ -39,7 +39,7 @@ modsController.flags.list = async function (req, res, next) {
} }
// Parse query string params for filters, eliminate non-valid filters // Parse query string params for filters, eliminate non-valid filters
filters = filters.reduce(function (memo, cur) { filters = filters.reduce((memo, cur) => {
if (req.query.hasOwnProperty(cur)) { if (req.query.hasOwnProperty(cur)) {
if (req.query[cur] !== '') { if (req.query[cur] !== '') {
memo[cur] = req.query[cur]; memo[cur] = req.query[cur];
@@ -129,7 +129,7 @@ modsController.flags.detail = async function (req, res, next) {
res.render('flags/detail', Object.assign(results.flagData, { res.render('flags/detail', Object.assign(results.flagData, {
assignees: results.assignees, assignees: results.assignees,
type_bool: ['post', 'user', 'empty'].reduce(function (memo, cur) { type_bool: ['post', 'user', 'empty'].reduce((memo, cur) => {
if (cur !== 'empty') { if (cur !== 'empty') {
memo[cur] = results.flagData.type === cur && (!results.flagData.target || !!Object.keys(results.flagData.target).length); memo[cur] = results.flagData.type === cur && (!results.flagData.target || !!Object.keys(results.flagData.target).length);
} else { } else {
@@ -196,7 +196,7 @@ modsController.postQueue = async function (req, res, next) {
async function getQueuedPosts(ids) { async function getQueuedPosts(ids) {
const keys = ids.map(id => `post:queue:${id}`); const keys = ids.map(id => `post:queue:${id}`);
const postData = await db.getObjects(keys); const postData = await db.getObjects(keys);
postData.forEach(function (data) { postData.forEach((data) => {
if (data) { if (data) {
data.data = JSON.parse(data.data); data.data = JSON.parse(data.data);
data.data.timestampISO = utils.toISOString(data.data.timestamp); data.data.timestampISO = utils.toISOString(data.data.timestamp);
@@ -204,7 +204,7 @@ async function getQueuedPosts(ids) {
}); });
const uids = postData.map(data => data && data.uid); const uids = postData.map(data => data && data.uid);
const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']); const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']);
postData.forEach(function (postData, index) { postData.forEach((postData, index) => {
if (postData) { if (postData) {
postData.user = userData[index]; postData.user = userData[index];
postData.data.rawContent = validator.escape(String(postData.data.content)); postData.data.rawContent = validator.escape(String(postData.data.content));

View File

@@ -24,9 +24,7 @@ sitemapController.getCategories = function (req, res, next) {
}; };
sitemapController.getTopicPage = function (req, res, next) { sitemapController.getTopicPage = function (req, res, next) {
sendSitemap(async function () { sendSitemap(async () => await sitemap.getTopicPage(parseInt(req.params[0], 10)), res, next);
return await sitemap.getTopicPage(parseInt(req.params[0], 10));
}, res, next);
}; };
async function sendSitemap(method, res, callback) { async function sendSitemap(method, res, callback) {

View File

@@ -102,7 +102,7 @@ topicsController.get = async function getTopic(req, res, callback) {
]); ]);
topicData.pagination = pagination.create(currentPage, pageCount, req.query); topicData.pagination = pagination.create(currentPage, pageCount, req.query);
topicData.pagination.rel.forEach(function (rel) { topicData.pagination.rel.forEach((rel) => {
rel.href = `${url}/topic/${topicData.slug}${rel.href}`; rel.href = `${url}/topic/${topicData.slug}${rel.href}`;
res.locals.linkTags.push(rel); res.locals.linkTags.push(rel);
}); });
@@ -344,7 +344,7 @@ topicsController.pagination = async function (req, res, callback) {
const pageCount = Math.max(1, Math.ceil(postCount / settings.postsPerPage)); const pageCount = Math.max(1, Math.ceil(postCount / settings.postsPerPage));
const paginationData = pagination.create(currentPage, pageCount); const paginationData = pagination.create(currentPage, pageCount);
paginationData.rel.forEach(function (rel) { paginationData.rel.forEach((rel) => {
rel.href = `${url}/topic/${topic.slug}${rel.href}`; rel.href = `${url}/topic/${topic.slug}${rel.href}`;
}); });

View File

@@ -49,7 +49,7 @@ uploadsController.upload = async function (req, res, filesIterator) {
}; };
uploadsController.uploadPost = async function (req, res) { uploadsController.uploadPost = async function (req, res) {
await uploadsController.upload(req, res, async function (uploadedFile) { await uploadsController.upload(req, res, async (uploadedFile) => {
const isImage = uploadedFile.type.match(/image./); const isImage = uploadedFile.type.match(/image./);
if (isImage) { if (isImage) {
return await uploadAsImage(req, uploadedFile); return await uploadAsImage(req, uploadedFile);
@@ -123,7 +123,7 @@ uploadsController.uploadThumb = async function (req, res) {
return helpers.formatApiResponse(503, res, new Error('[[error:topic-thumbnails-are-disabled]]')); return helpers.formatApiResponse(503, res, new Error('[[error:topic-thumbnails-are-disabled]]'));
} }
return await uploadsController.upload(req, res, async function (uploadedFile) { return await uploadsController.upload(req, res, async (uploadedFile) => {
if (!uploadedFile.type.match(/image./)) { if (!uploadedFile.type.match(/image./)) {
throw new Error('[[error:invalid-file]]'); throw new Error('[[error:invalid-file]]');
} }

View File

@@ -95,7 +95,7 @@ function sendExport(filename, type, res, next) {
'Content-Type': type, 'Content-Type': type,
'Content-Disposition': `attachment; filename=${filename}`, 'Content-Disposition': `attachment; filename=${filename}`,
}, },
}, function (err) { }, (err) => {
if (err) { if (err) {
if (err.code === 'ENOENT') { if (err.code === 'ENOENT') {
res.locals.isAPI = false; res.locals.isAPI = false;

View File

@@ -50,7 +50,7 @@ usersController.getOnlineUsers = async function (req, res) {
let hiddenCount = 0; let hiddenCount = 0;
if (!userData.isAdminOrGlobalMod) { if (!userData.isAdminOrGlobalMod) {
userData.users = userData.users.filter(function (user) { userData.users = userData.users.filter((user) => {
if (user && user.status === 'offline') { if (user && user.status === 'offline') {
hiddenCount += 1; hiddenCount += 1;
} }

View File

@@ -152,7 +152,7 @@ Topics.migrateThumbs = async (req, res) => {
Topics.deleteThumb = async (req, res) => { Topics.deleteThumb = async (req, res) => {
if (!req.body.path.startsWith('http')) { if (!req.body.path.startsWith('http')) {
await middleware.assert.path(req, res, function () {}); await middleware.assert.path(req, res, () => {});
if (res.headersSent) { if (res.headersSent) {
return; return;
} }

View File

@@ -136,7 +136,7 @@ Users.deleteToken = async (req, res) => {
} }
}; };
const getSessionAsync = util.promisify(function (sid, callback) { const getSessionAsync = util.promisify((sid, callback) => {
db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null)); db.sessionStore.get(sid, (err, sessionObj) => callback(err, sessionObj || null));
}); });

View File

@@ -135,8 +135,7 @@ mongoModule.info = async function (db) {
stats.serverStatusError = serverStatusError; stats.serverStatusError = serverStatusError;
const scale = 1024 * 1024 * 1024; const scale = 1024 * 1024 * 1024;
listCollections = listCollections.map(function (collectionInfo) { listCollections = listCollections.map(collectionInfo => ({
return {
name: collectionInfo.ns, name: collectionInfo.ns,
count: collectionInfo.count, count: collectionInfo.count,
size: collectionInfo.size, size: collectionInfo.size,
@@ -144,8 +143,7 @@ mongoModule.info = async function (db) {
storageSize: collectionInfo.storageSize, storageSize: collectionInfo.storageSize,
totalIndexSize: collectionInfo.totalIndexSize, totalIndexSize: collectionInfo.totalIndexSize,
indexSizes: collectionInfo.indexSizes, indexSizes: collectionInfo.indexSizes,
}; }));
});
stats.mem = serverStatus.mem || { resident: 0, virtual: 0, mapped: 0 }; stats.mem = serverStatus.mem || { resident: 0, virtual: 0, mapped: 0 };
stats.mem.resident = (stats.mem.resident / 1024).toFixed(3); stats.mem.resident = (stats.mem.resident / 1024).toFixed(3);

View File

@@ -115,7 +115,7 @@ module.exports = function (module) {
} }
const map = helpers.toMap(data); const map = helpers.toMap(data);
unCachedKeys.forEach(function (key) { unCachedKeys.forEach((key) => {
cachedData[key] = map[key] || null; cachedData[key] = map[key] || null;
cache.set(key, cachedData[key]); cache.set(key, cachedData[key]);
}); });
@@ -123,7 +123,7 @@ module.exports = function (module) {
if (!fields.length) { if (!fields.length) {
return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null)); return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null));
} }
return keys.map(function (key) { return keys.map((key) => {
const item = cachedData[key] || {}; const item = cachedData[key] || {};
const result = {}; const result = {};
fields.forEach((field) => { fields.forEach((field) => {
@@ -154,7 +154,7 @@ module.exports = function (module) {
} }
const data = {}; const data = {};
fields.forEach(function (field) { fields.forEach((field) => {
field = helpers.fieldToString(field); field = helpers.fieldToString(field);
data[field] = 1; data[field] = 1;
}); });
@@ -178,7 +178,7 @@ module.exports = function (module) {
} }
var data = {}; var data = {};
fields.forEach(function (field) { fields.forEach((field) => {
field = helpers.fieldToString(field); field = helpers.fieldToString(field);
data[field] = ''; data[field] = '';
}); });
@@ -211,7 +211,7 @@ module.exports = function (module) {
if (Array.isArray(key)) { if (Array.isArray(key)) {
var bulk = module.client.collection('objects').initializeUnorderedBulkOp(); var bulk = module.client.collection('objects').initializeUnorderedBulkOp();
key.forEach(function (key) { key.forEach((key) => {
bulk.find({ _key: key }).upsert().update({ $inc: increment }); bulk.find({ _key: key }).upsert().update({ $inc: increment });
}); });
await bulk.execute(); await bulk.execute();

View File

@@ -22,7 +22,7 @@ module.exports = function (module) {
}, { _id: 0, _key: 1 }).toArray(); }, { _id: 0, _key: 1 }).toArray();
const map = {}; const map = {};
data.forEach(function (item) { data.forEach((item) => {
map[item._key] = true; map[item._key] = true;
}); });

View File

@@ -104,7 +104,7 @@ module.exports = function (module) {
const result = await module.client.collection('objects').find({ _key: { $in: sets }, members: value }, { projection: { _id: 0, members: 0 } }).toArray(); const result = await module.client.collection('objects').find({ _key: { $in: sets }, members: value }, { projection: { _id: 0, members: 0 } }).toArray();
var map = {}; var map = {};
result.forEach(function (item) { result.forEach((item) => {
map[item._key] = true; map[item._key] = true;
}); });
@@ -127,7 +127,7 @@ module.exports = function (module) {
const data = await module.client.collection('objects').find({ _key: { $in: keys } }, { projection: { _id: 0 } }).toArray(); const data = await module.client.collection('objects').find({ _key: { $in: keys } }, { projection: { _id: 0 } }).toArray();
var sets = {}; var sets = {};
data.forEach(function (set) { data.forEach((set) => {
sets[set._key] = set.members || []; sets[set._key] = set.members || [];
}); });

View File

@@ -247,7 +247,7 @@ module.exports = function (module) {
return [await getSortedSetRank(reverse, key, values[0])]; return [await getSortedSetRank(reverse, key, values[0])];
} }
const sortedSet = await module[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](key, 0, -1); const sortedSet = await module[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](key, 0, -1);
return values.map(function (value) { return values.map((value) => {
if (!value) { if (!value) {
return null; return null;
} }
@@ -272,7 +272,7 @@ module.exports = function (module) {
value = helpers.valueToString(value); value = helpers.valueToString(value);
const result = await module.client.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, value: 0 } }).toArray(); const result = await module.client.collection('objects').find({ _key: { $in: keys }, value: value }, { projection: { _id: 0, value: 0 } }).toArray();
var map = {}; var map = {};
result.forEach(function (item) { result.forEach((item) => {
if (item) { if (item) {
map[item._key] = item; map[item._key] = item;
} }
@@ -292,7 +292,7 @@ module.exports = function (module) {
const result = await module.client.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0 } }).toArray(); const result = await module.client.collection('objects').find({ _key: key, value: { $in: values } }, { projection: { _id: 0, _key: 0 } }).toArray();
var valueToScore = {}; var valueToScore = {};
result.forEach(function (item) { result.forEach((item) => {
if (item) { if (item) {
valueToScore[item.value] = item.score; valueToScore[item.value] = item.score;
} }
@@ -329,7 +329,7 @@ module.exports = function (module) {
}).toArray(); }).toArray();
var isMember = {}; var isMember = {};
results.forEach(function (item) { results.forEach((item) => {
if (item) { if (item) {
isMember[item.value] = true; isMember[item.value] = true;
} }
@@ -350,7 +350,7 @@ module.exports = function (module) {
}).toArray(); }).toArray();
var isMember = {}; var isMember = {};
results.forEach(function (item) { results.forEach((item) => {
if (item) { if (item) {
isMember[item._key] = true; isMember[item._key] = true;
} }
@@ -381,7 +381,7 @@ module.exports = function (module) {
return [data.map(item => item.value)]; return [data.map(item => item.value)];
} }
const sets = {}; const sets = {};
data.forEach(function (item) { data.forEach((item) => {
sets[item._key] = sets[item._key] || []; sets[item._key] = sets[item._key] || [];
sets[item._key].push(item.value); sets[item._key].push(item.value);
}); });

View File

@@ -75,7 +75,7 @@ module.exports = function (module) {
return; return;
} }
var bulk = module.client.collection('objects').initializeUnorderedBulkOp(); var bulk = module.client.collection('objects').initializeUnorderedBulkOp();
data.forEach(function (item) { data.forEach((item) => {
if (!utils.isNumber(item[1])) { if (!utils.isNumber(item[1])) {
throw new Error(`[[error:invalid-score, ${item[1]}]]`); throw new Error(`[[error:invalid-score, ${item[1]}]]`);
} }

View File

@@ -140,7 +140,7 @@ module.exports = function (module) {
items.push(nextItem); items.push(nextItem);
} }
const members = await Promise.all(otherSets.map(async function (s) { const members = await Promise.all(otherSets.map(async (s) => {
const data = await module.client.collection('objects').find({ const data = await module.client.collection('objects').find({
_key: s, value: { $in: items.map(i => i.value) }, _key: s, value: { $in: items.map(i => i.value) },
}, { }, {
@@ -170,7 +170,7 @@ module.exports = function (module) {
} }
const pipeline = [{ $match: { _key: { $in: params.sets } } }]; const pipeline = [{ $match: { _key: { $in: params.sets } } }];
params.weights.forEach(function (weight, index) { params.weights.forEach((weight, index) => {
if (weight !== 1) { if (weight !== 1) {
pipeline.push({ pipeline.push({
$project: { $project: {

View File

@@ -337,7 +337,7 @@ postgresModule.createIndices = function (callback) {
async.series([ async.series([
async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_zset__key__score" ON "legacy_zset"("_key" ASC, "score" DESC)`), async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_zset__key__score" ON "legacy_zset"("_key" ASC, "score" DESC)`),
async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_object__expireAt" ON "legacy_object"("expireAt" ASC)`), async.apply(query, `CREATE INDEX IF NOT EXISTS "idx__legacy_object__expireAt" ON "legacy_object"("expireAt" ASC)`),
], function (err) { ], (err) => {
if (err) { if (err) {
winston.error(`Error creating index ${err.message}`); winston.error(`Error creating index ${err.message}`);
return callback(err); return callback(err);

View File

@@ -12,7 +12,7 @@ module.exports = function (module) {
delete data['']; delete data[''];
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
const dataString = JSON.stringify(data); const dataString = JSON.stringify(data);
async function setOne(key) { async function setOne(key) {
await helpers.ensureLegacyObjectType(client, key, 'hash'); await helpers.ensureLegacyObjectType(client, key, 'hash');
@@ -47,7 +47,7 @@ module.exports = function (module) {
return; return;
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
const valueString = JSON.stringify(value); const valueString = JSON.stringify(value);
async function setOne(key) { async function setOne(key) {
await helpers.ensureLegacyObjectType(client, key, 'hash'); await helpers.ensureLegacyObjectType(client, key, 'hash');
@@ -159,7 +159,7 @@ SELECT (SELECT jsonb_object_agg(f, d."value")
} }
var obj = {}; var obj = {};
fields.forEach(function (f) { fields.forEach((f) => {
obj[f] = null; obj[f] = null;
}); });
@@ -292,7 +292,7 @@ SELECT (h."data" ? $2::TEXT AND h."data"->>$2::TEXT IS NOT NULL) b
return null; return null;
} }
return await module.transaction(async function (client) { return await module.transaction(async (client) => {
if (Array.isArray(key)) { if (Array.isArray(key)) {
await helpers.ensureLegacyObjectsType(client, key, 'hash'); await helpers.ensureLegacyObjectsType(client, key, 'hash');
} else { } else {

View File

@@ -88,9 +88,7 @@ SELECT "_key", "type"
throw new Error(`database: cannot insert multiple objects as ${type} because they already exist: ${parts.join(', ')}`); throw new Error(`database: cannot insert multiple objects as ${type} because they already exist: ${parts.join(', ')}`);
} }
var missing = keys.filter(function (k) { var missing = keys.filter(k => !res.rows.some(r => r._key === k));
return !res.rows.some(r => r._key === k);
});
if (missing.length) { if (missing.length) {
throw new Error(`database: failed to insert keys for objects: ${JSON.stringify(missing)}`); throw new Error(`database: failed to insert keys for objects: ${JSON.stringify(missing)}`);

View File

@@ -8,7 +8,7 @@ module.exports = function (module) {
return; return;
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'list'); await helpers.ensureLegacyObjectType(client, key, 'list');
await client.query({ await client.query({
name: 'listPrepend', name: 'listPrepend',
@@ -27,7 +27,7 @@ DO UPDATE SET "array" = ARRAY[$2::TEXT] || "legacy_list"."array"`,
return; return;
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'list'); await helpers.ensureLegacyObjectType(client, key, 'list');
await client.query({ await client.query({
name: 'listAppend', name: 'listAppend',

View File

@@ -26,9 +26,7 @@ module.exports = function (module) {
WHERE o."_key" = ANY($1::TEXT[])`, WHERE o."_key" = ANY($1::TEXT[])`,
values: [key], values: [key],
}); });
return key.map(function (k) { return key.map(k => res.rows.some(r => r.k === k));
return res.rows.some(r => r.k === k);
});
} }
const res = await module.pool.query({ const res = await module.pool.query({
name: 'exists', name: 'exists',
@@ -115,7 +113,7 @@ SELECT s."data" t
return; return;
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'string'); await helpers.ensureLegacyObjectType(client, key, 'string');
await client.query({ await client.query({
name: 'set', name: 'set',
@@ -134,7 +132,7 @@ DO UPDATE SET "data" = $2::TEXT`,
return; return;
} }
return await module.transaction(async function (client) { return await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'string'); await helpers.ensureLegacyObjectType(client, key, 'string');
const res = await client.query({ const res = await client.query({
name: 'increment', name: 'increment',
@@ -151,7 +149,7 @@ RETURNING "data" d`,
}; };
module.rename = async function (oldKey, newKey) { module.rename = async function (oldKey, newKey) {
await module.transaction(async function (client) { await module.transaction(async (client) => {
await client.query({ await client.query({
name: 'deleteRename', name: 'deleteRename',
text: ` text: `

View File

@@ -12,7 +12,7 @@ module.exports = function (module) {
if (!value.length) { if (!value.length) {
return; return;
} }
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'set'); await helpers.ensureLegacyObjectType(client, key, 'set');
await client.query({ await client.query({
name: 'setAdd', name: 'setAdd',
@@ -38,7 +38,7 @@ DO NOTHING`,
keys = _.uniq(keys); keys = _.uniq(keys);
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectsType(client, keys, 'set'); await helpers.ensureLegacyObjectsType(client, keys, 'set');
await client.query({ await client.query({
name: 'setsAdd', name: 'setsAdd',
@@ -129,9 +129,7 @@ SELECT s."member" m
values: [key, values], values: [key, values],
}); });
return values.map(function (v) { return values.map(v => res.rows.some(r => r.m === v));
return res.rows.some(r => r.m === v);
});
}; };
module.isMemberOfSets = async function (sets, value) { module.isMemberOfSets = async function (sets, value) {
@@ -154,9 +152,7 @@ SELECT o."_key" k
values: [sets, value], values: [sets, value],
}); });
return sets.map(function (s) { return sets.map(s => res.rows.some(r => r.k === s));
return res.rows.some(r => r.k === s);
});
}; };
module.getSetMembers = async function (key) { module.getSetMembers = async function (key) {
@@ -198,9 +194,7 @@ SELECT o."_key" k,
values: [keys], values: [keys],
}); });
return keys.map(function (k) { return keys.map(k => (res.rows.find(r => r.k === k) || { m: [] }).m);
return (res.rows.find(r => r.k === k) || { m: [] }).m;
});
}; };
module.setCount = async function (key) { module.setCount = async function (key) {
@@ -238,9 +232,7 @@ SELECT o."_key" k,
values: [keys], values: [keys],
}); });
return keys.map(function (k) { return keys.map(k => (res.rows.find(r => r.k === k) || { c: 0 }).c);
return (res.rows.find(r => r.k === k) || { c: 0 }).c;
});
}; };
module.setRemoveRandom = async function (key) { module.setRemoveRandom = async function (key) {

View File

@@ -218,9 +218,7 @@ SELECT o."_key" k,
values: [keys], values: [keys],
}); });
return keys.map(function (k) { return keys.map(k => parseInt((res.rows.find(r => r.k === k) || { c: 0 }).c, 10));
return parseInt((res.rows.find(r => r.k === k) || { c: 0 }).c, 10);
});
}; };
module.sortedSetsCardSum = async function (keys) { module.sortedSetsCardSum = async function (keys) {
@@ -347,7 +345,7 @@ SELECT o."_key" k,
values: [keys, value], values: [keys, value],
}); });
return keys.map(function (k) { return keys.map((k) => {
var s = res.rows.find(r => r.k === k); var s = res.rows.find(r => r.k === k);
return s ? parseFloat(s.s) : null; return s ? parseFloat(s.s) : null;
}); });
@@ -376,7 +374,7 @@ SELECT z."value" v,
values: [key, values], values: [key, values],
}); });
return values.map(function (v) { return values.map((v) => {
var s = res.rows.find(r => r.v === v); var s = res.rows.find(r => r.v === v);
return s ? parseFloat(s.s) : null; return s ? parseFloat(s.s) : null;
}); });
@@ -428,9 +426,7 @@ SELECT z."value" v
values: [key, values], values: [key, values],
}); });
return values.map(function (v) { return values.map(v => res.rows.some(r => r.v === v));
return res.rows.some(r => r.v === v);
});
}; };
module.isMemberOfSortedSets = async function (keys, value) { module.isMemberOfSortedSets = async function (keys, value) {
@@ -453,9 +449,7 @@ SELECT o."_key" k
values: [keys, value], values: [keys, value],
}); });
return keys.map(function (k) { return keys.map(k => res.rows.some(r => r.k === k));
return res.rows.some(r => r.k === k);
});
}; };
module.getSortedSetMembers = async function (key) { module.getSortedSetMembers = async function (key) {
@@ -477,9 +471,7 @@ SELECT "_key" k,
values: [keys], values: [keys],
}); });
return keys.map(function (k) { return keys.map(k => (res.rows.find(r => r.k === k) || {}).m || []);
return (res.rows.find(r => r.k === k) || {}).m || [];
});
}; };
module.sortedSetIncrBy = async function (key, increment, value) { module.sortedSetIncrBy = async function (key, increment, value) {
@@ -490,7 +482,7 @@ SELECT "_key" k,
value = helpers.valueToString(value); value = helpers.valueToString(value);
increment = parseFloat(increment); increment = parseFloat(increment);
return await module.transaction(async function (client) { return await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'zset'); await helpers.ensureLegacyObjectType(client, key, 'zset');
const res = await client.query({ const res = await client.query({
name: 'sortedSetIncrBy', name: 'sortedSetIncrBy',

View File

@@ -18,7 +18,7 @@ module.exports = function (module) {
value = helpers.valueToString(value); value = helpers.valueToString(value);
score = parseFloat(score); score = parseFloat(score);
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'zset'); await helpers.ensureLegacyObjectType(client, key, 'zset');
await client.query({ await client.query({
name: 'sortedSetAdd', name: 'sortedSetAdd',
@@ -49,7 +49,7 @@ module.exports = function (module) {
helpers.removeDuplicateValues(values, scores); helpers.removeDuplicateValues(values, scores);
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectType(client, key, 'zset'); await helpers.ensureLegacyObjectType(client, key, 'zset');
await client.query({ await client.query({
name: 'sortedSetAddBulk', name: 'sortedSetAddBulk',
@@ -81,7 +81,7 @@ DO UPDATE SET "score" = EXCLUDED."score"`,
value = helpers.valueToString(value); value = helpers.valueToString(value);
scores = isArrayOfScores ? scores.map(score => parseFloat(score)) : parseFloat(scores); scores = isArrayOfScores ? scores.map(score => parseFloat(score)) : parseFloat(scores);
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectsType(client, keys, 'zset'); await helpers.ensureLegacyObjectsType(client, keys, 'zset');
await client.query({ await client.query({
name: isArrayOfScores ? 'sortedSetsAddScores' : 'sortedSetsAdd', name: isArrayOfScores ? 'sortedSetsAddScores' : 'sortedSetsAdd',
@@ -108,7 +108,7 @@ INSERT INTO "legacy_zset" ("_key", "value", "score")
const keys = []; const keys = [];
const values = []; const values = [];
const scores = []; const scores = [];
data.forEach(function (item) { data.forEach((item) => {
if (!utils.isNumber(item[1])) { if (!utils.isNumber(item[1])) {
throw new Error(`[[error:invalid-score, ${item[1]}]]`); throw new Error(`[[error:invalid-score, ${item[1]}]]`);
} }
@@ -116,7 +116,7 @@ INSERT INTO "legacy_zset" ("_key", "value", "score")
scores.push(item[1]); scores.push(item[1]);
values.push(item[2]); values.push(item[2]);
}); });
await module.transaction(async function (client) { await module.transaction(async (client) => {
await helpers.ensureLegacyObjectsType(client, keys, 'zset'); await helpers.ensureLegacyObjectsType(client, keys, 'zset');
await client.query({ await client.query({
name: 'sortedSetAddBulk2', name: 'sortedSetAddBulk2',

View File

@@ -79,12 +79,10 @@ OFFSET $3::INTEGER`,
}); });
if (params.withScores) { if (params.withScores) {
res.rows = res.rows.map(function (r) { res.rows = res.rows.map(r => ({
return {
value: r.value, value: r.value,
score: parseFloat(r.score), score: parseFloat(r.score),
}; }));
});
} else { } else {
res.rows = res.rows.map(r => r.value); res.rows = res.rows.map(r => r.value);
} }

View File

@@ -71,12 +71,10 @@ OFFSET $3::INTEGER`,
}); });
if (params.withScores) { if (params.withScores) {
res.rows = res.rows.map(function (r) { res.rows = res.rows.map(r => ({
return {
value: r.value, value: r.value,
score: parseFloat(r.score), score: parseFloat(r.score),
}; }));
});
} else { } else {
res.rows = res.rows.map(r => r.value); res.rows = res.rows.map(r => r.value);
} }

View File

@@ -76,7 +76,7 @@ redisModule.info = async function (cxn) {
const data = await infoAsync(); const data = await infoAsync();
const lines = data.toString().split('\r\n').sort(); const lines = data.toString().split('\r\n').sort();
const redisData = {}; const redisData = {};
lines.forEach(function (line) { lines.forEach((line) => {
const parts = line.split(':'); const parts = line.split(':');
if (parts[1]) { if (parts[1]) {
redisData[parts[0]] = parts[1]; redisData[parts[0]] = parts[1];

View File

@@ -20,7 +20,7 @@ connection.getConnectionOptions = function (redis) {
}; };
connection.connect = async function (options) { connection.connect = async function (options) {
return new Promise(function (resolve, reject) { return new Promise((resolve, reject) => {
options = options || nconf.get('redis'); options = options || nconf.get('redis');
const redis_socket_or_host = options.host; const redis_socket_or_host = options.host;
const connOptions = connection.getConnectionOptions(options); const connOptions = connection.getConnectionOptions(options);
@@ -39,11 +39,11 @@ connection.connect = async function (options) {
throw new Error('[[error:no-database-selected]]'); throw new Error('[[error:no-database-selected]]');
} }
cxn.on('error', function (err) { cxn.on('error', (err) => {
winston.error(err.stack); winston.error(err.stack);
reject(err); reject(err);
}); });
cxn.on('ready', function () { cxn.on('ready', () => {
resolve(cxn); resolve(cxn);
}); });

View File

@@ -16,7 +16,7 @@ module.exports = function (module) {
delete data['']; delete data[''];
} }
Object.keys(data).forEach(function (key) { Object.keys(data).forEach((key) => {
if (data[key] === undefined || data[key] === null) { if (data[key] === undefined || data[key] === null) {
delete data[key]; delete data[key];
} }
@@ -99,7 +99,7 @@ module.exports = function (module) {
return []; return [];
} }
if (!Array.isArray(fields)) { if (!Array.isArray(fields)) {
return keys.map(function () { return {}; }); return keys.map(() => ({}));
} }
const cachedData = {}; const cachedData = {};
const unCachedKeys = cache.getUnCachedKeys(keys, cachedData); const unCachedKeys = cache.getUnCachedKeys(keys, cachedData);
@@ -113,7 +113,7 @@ module.exports = function (module) {
data = [await module.client.async.hgetall(unCachedKeys[0])]; data = [await module.client.async.hgetall(unCachedKeys[0])];
} }
unCachedKeys.forEach(function (key, i) { unCachedKeys.forEach((key, i) => {
cachedData[key] = data[i] || null; cachedData[key] = data[i] || null;
cache.set(key, cachedData[key]); cache.set(key, cachedData[key]);
}); });
@@ -121,7 +121,7 @@ module.exports = function (module) {
if (!fields.length) { if (!fields.length) {
return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null)); return keys.map(key => (cachedData[key] ? { ...cachedData[key] } : null));
} }
return keys.map(function (key) { return keys.map((key) => {
const item = cachedData[key] || {}; const item = cachedData[key] || {};
const result = {}; const result = {};
fields.forEach((field) => { fields.forEach((field) => {

View File

@@ -11,10 +11,10 @@ const PubSub = function () {
const self = this; const self = this;
channelName = `db:${nconf.get('redis:database')}:pubsub_channel`; channelName = `db:${nconf.get('redis:database')}:pubsub_channel`;
connection.connect().then(function (client) { connection.connect().then((client) => {
self.subClient = client; self.subClient = client;
self.subClient.subscribe(channelName); self.subClient.subscribe(channelName);
self.subClient.on('message', function (channel, message) { self.subClient.on('message', (channel, message) => {
if (channel !== channelName) { if (channel !== channelName) {
return; return;
} }
@@ -28,7 +28,7 @@ const PubSub = function () {
}); });
}); });
connection.connect().then(function (client) { connection.connect().then((client) => {
self.pubClient = client; self.pubClient = client;
}); });
}; };

View File

@@ -65,7 +65,7 @@ module.exports = function (module) {
return; return;
} }
var batch = module.client.batch(); var batch = module.client.batch();
data.forEach(function (item) { data.forEach((item) => {
if (!utils.isNumber(item[1])) { if (!utils.isNumber(item[1])) {
throw new Error(`[[error:invalid-score, ${item[1]}]]`); throw new Error(`[[error:invalid-score, ${item[1]}]]`);
} }

View File

@@ -98,8 +98,8 @@ events.getEvents = async function (filter, start, stop, from, to) {
eventsData = eventsData.filter(Boolean); eventsData = eventsData.filter(Boolean);
await addUserData(eventsData, 'uid', 'user'); await addUserData(eventsData, 'uid', 'user');
await addUserData(eventsData, 'targetUid', 'targetUser'); await addUserData(eventsData, 'targetUid', 'targetUser');
eventsData.forEach(function (event) { eventsData.forEach((event) => {
Object.keys(event).forEach(function (key) { Object.keys(event).forEach((key) => {
if (typeof event[key] === 'string') { if (typeof event[key] === 'string') {
event[key] = validator.escape(String(event[key] || '')); event[key] = validator.escape(String(event[key] || ''));
} }
@@ -129,12 +129,12 @@ async function addUserData(eventsData, field, objectName) {
]); ]);
const map = {}; const map = {};
userData.forEach(function (user, index) { userData.forEach((user, index) => {
user.isAdmin = isAdmin[index]; user.isAdmin = isAdmin[index];
map[user.uid] = user; map[user.uid] = user;
}); });
eventsData.forEach(function (event) { eventsData.forEach((event) => {
if (map[event[field]]) { if (map[event[field]]) {
event[objectName] = map[event[field]]; event[objectName] = map[event[field]];
} }
@@ -153,7 +153,7 @@ events.deleteEvents = async function (eids) {
}; };
events.deleteAll = async function () { events.deleteAll = async function () {
await batch.processSortedSet('events:time', async function (eids) { await batch.processSortedSet('events:time', async (eids) => {
await events.deleteEvents(eids); await events.deleteEvents(eids);
}, { alwaysStartAt: 0, batch: 500 }); }, { alwaysStartAt: 0, batch: 500 });
}; };

View File

@@ -60,7 +60,7 @@ file.allowedExtensions = function () {
return []; return [];
} }
allowedExtensions = allowedExtensions.split(','); allowedExtensions = allowedExtensions.split(',');
allowedExtensions = allowedExtensions.filter(Boolean).map(function (extension) { allowedExtensions = allowedExtensions.filter(Boolean).map((extension) => {
extension = extension.trim(); extension = extension.trim();
if (!extension.startsWith('.')) { if (!extension.startsWith('.')) {
extension = `.${extension}`; extension = `.${extension}`;

View File

@@ -235,9 +235,7 @@ Flags.sort = async function (flagIds, sort) {
const mapped = heat.map((el, i) => ({ const mapped = heat.map((el, i) => ({
index: i, heat: el, index: i, heat: el,
})); }));
mapped.sort(function (a, b) { mapped.sort((a, b) => b.heat - a.heat);
return b.heat - a.heat;
});
flagIds = mapped.map(obj => flagIds[obj.index]); flagIds = mapped.map(obj => flagIds[obj.index]);
break; break;
} }
@@ -340,7 +338,7 @@ Flags.getFlagIdByTarget = async function (type, id) {
async function modifyNotes(notes) { async function modifyNotes(notes) {
const uids = []; const uids = [];
notes = notes.map(function (note) { notes = notes.map((note) => {
const noteObj = JSON.parse(note.value); const noteObj = JSON.parse(note.value);
uids.push(noteObj[0]); uids.push(noteObj[0]);
return { return {
@@ -351,7 +349,7 @@ async function modifyNotes(notes) {
}; };
}); });
const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']); const userData = await user.getUsersFields(uids, ['username', 'userslug', 'picture']);
return notes.map(function (note, idx) { return notes.map((note, idx) => {
note.user = userData[idx]; note.user = userData[idx];
note.content = validator.escape(note.content); note.content = validator.escape(note.content);
return note; return note;
@@ -452,7 +450,7 @@ Flags.create = async function (type, id, uid, reason, timestamp) {
Flags.getReports = async function (flagId) { Flags.getReports = async function (flagId) {
const payload = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:reports`, 0, -1); const payload = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:reports`, 0, -1);
const [reports, uids] = payload.reduce(function (memo, cur) { const [reports, uids] = payload.reduce((memo, cur) => {
const value = cur.value.split(';'); const value = cur.value.split(';');
memo[1].push(value.shift()); memo[1].push(value.shift());
cur.value = value.join(';'); cur.value = value.join(';');
@@ -634,7 +632,7 @@ Flags.resolveFlag = async function (type, id, uid) {
Flags.resolveUserPostFlags = async function (uid, callerUid) { Flags.resolveUserPostFlags = async function (uid, callerUid) {
if (meta.config['flags:autoResolveOnBan']) { if (meta.config['flags:autoResolveOnBan']) {
await batch.processSortedSet(`uid:${uid}:posts`, async function (pids) { await batch.processSortedSet(`uid:${uid}:posts`, async (pids) => {
let postData = await posts.getPostsFields(pids, ['pid', 'flagId']); let postData = await posts.getPostsFields(pids, ['pid', 'flagId']);
postData = postData.filter(p => p && p.flagId); postData = postData.filter(p => p && p.flagId);
for (const postObj of postData) { for (const postObj of postData) {
@@ -654,7 +652,7 @@ Flags.getHistory = async function (flagId) {
let history = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:history`, 0, -1); let history = await db.getSortedSetRevRangeWithScores(`flag:${flagId}:history`, 0, -1);
const targetUid = await db.getObjectField(`flag:${flagId}`, 'targetUid'); const targetUid = await db.getObjectField(`flag:${flagId}`, 'targetUid');
history = history.map(function (entry) { history = history.map((entry) => {
entry.value = JSON.parse(entry.value); entry.value = JSON.parse(entry.value);
uids.push(entry.value[0]); uids.push(entry.value[0]);

View File

@@ -19,7 +19,7 @@ module.exports = function (Groups) {
return []; return [];
} }
const ephemeralIdx = groupNames.reduce(function (memo, cur, idx) { const ephemeralIdx = groupNames.reduce((memo, cur, idx) => {
if (Groups.ephemeralGroups.includes(cur)) { if (Groups.ephemeralGroups.includes(cur)) {
memo.push(idx); memo.push(idx);
} }
@@ -29,7 +29,7 @@ module.exports = function (Groups) {
const keys = groupNames.map(groupName => `group:${groupName}`); const keys = groupNames.map(groupName => `group:${groupName}`);
const groupData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys)); const groupData = await (fields.length ? db.getObjectsFields(keys, fields) : db.getObjects(keys));
if (ephemeralIdx.length) { if (ephemeralIdx.length) {
ephemeralIdx.forEach(function (idx) { ephemeralIdx.forEach((idx) => {
groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]); groupData[idx] = Groups.getEphemeralGroup(groupNames[idx]);
}); });
} }

View File

@@ -17,7 +17,7 @@ module.exports = function (Groups) {
return; return;
} }
const keys = []; const keys = [];
groupNames.forEach(function (groupName) { groupNames.forEach((groupName) => {
keys.push(`group:${groupName}`, keys.push(`group:${groupName}`,
`group:${groupName}:members`, `group:${groupName}:members`,
`group:${groupName}:pending`, `group:${groupName}:pending`,
@@ -45,7 +45,7 @@ module.exports = function (Groups) {
}; };
async function removeGroupsFromPrivilegeGroups(groupNames) { async function removeGroupsFromPrivilegeGroups(groupNames) {
await batch.processSortedSet('groups:createtime', async function (otherGroups) { await batch.processSortedSet('groups:createtime', async (otherGroups) => {
const privilegeGroups = otherGroups.filter(group => Groups.isPrivilegeGroup(group)); const privilegeGroups = otherGroups.filter(group => Groups.isPrivilegeGroup(group));
const keys = privilegeGroups.map(group => `group:${group}:members`); const keys = privilegeGroups.map(group => `group:${group}:members`);
await db.sortedSetRemove(keys, groupNames); await db.sortedSetRemove(keys, groupNames);

View File

@@ -100,7 +100,7 @@ Groups.getGroupsAndMembers = async function (groupNames) {
Groups.getGroupsData(groupNames), Groups.getGroupsData(groupNames),
Groups.getMemberUsers(groupNames, 0, 3), Groups.getMemberUsers(groupNames, 0, 3),
]); ]);
groups.forEach(function (group, index) { groups.forEach((group, index) => {
if (group) { if (group) {
group.members = members[index] || []; group.members = members[index] || [];
group.truncated = group.memberCount > group.members.length; group.truncated = group.memberCount > group.members.length;
@@ -157,7 +157,7 @@ Groups.getOwnersAndMembers = async function (groupName, uid, start, stop) {
const countToReturn = stop - start + 1; const countToReturn = stop - start + 1;
const ownerUidsOnPage = ownerUids.slice(start, stop !== -1 ? stop + 1 : undefined); const ownerUidsOnPage = ownerUids.slice(start, stop !== -1 ? stop + 1 : undefined);
const owners = await user.getUsers(ownerUidsOnPage, uid); const owners = await user.getUsers(ownerUidsOnPage, uid);
owners.forEach(function (user) { owners.forEach((user) => {
if (user) { if (user) {
user.isOwner = true; user.isOwner = true;
} }

View File

@@ -74,7 +74,7 @@ module.exports = function (Groups) {
return; return;
} }
await async.eachSeries(groupsToCreate, async function (groupName) { await async.eachSeries(groupsToCreate, async (groupName) => {
try { try {
await Groups.create({ await Groups.create({
name: groupName, name: groupName,

View File

@@ -55,7 +55,7 @@ module.exports = function (Groups) {
} }
const isMembers = await db.isSortedSetMembers(`group:${groupName}:members`, nonCachedUids); const isMembers = await db.isSortedSetMembers(`group:${groupName}:members`, nonCachedUids);
nonCachedUids.forEach(function (uid, index) { nonCachedUids.forEach((uid, index) => {
cachedData[`${uid}:${groupName}`] = isMembers[index]; cachedData[`${uid}:${groupName}`] = isMembers[index];
Groups.cache.set(`${uid}:${groupName}`, isMembers[index]); Groups.cache.set(`${uid}:${groupName}`, isMembers[index]);
}); });
@@ -74,7 +74,7 @@ module.exports = function (Groups) {
} }
const nonCachedGroupsMemberSets = nonCachedGroups.map(groupName => `group:${groupName}:members`); const nonCachedGroupsMemberSets = nonCachedGroups.map(groupName => `group:${groupName}:members`);
const isMembers = await db.isMemberOfSortedSets(nonCachedGroupsMemberSets, uid); const isMembers = await db.isMemberOfSortedSets(nonCachedGroupsMemberSets, uid);
nonCachedGroups.forEach(function (groupName, index) { nonCachedGroups.forEach((groupName, index) => {
cachedData[`${uid}:${groupName}`] = isMembers[index]; cachedData[`${uid}:${groupName}`] = isMembers[index];
Groups.cache.set(`${uid}:${groupName}`, isMembers[index]); Groups.cache.set(`${uid}:${groupName}`, isMembers[index]);
}); });
@@ -124,9 +124,7 @@ module.exports = function (Groups) {
const isMembers = await Groups.isMemberOfGroups(uid, uniqueGroups); const isMembers = await Groups.isMemberOfGroups(uid, uniqueGroups);
const isGroupMember = _.zipObject(uniqueGroups, isMembers); const isGroupMember = _.zipObject(uniqueGroups, isMembers);
return members.map(function (groupNames) { return members.map(groupNames => !!groupNames.find(name => isGroupMember[name]));
return !!groupNames.find(name => isGroupMember[name]);
});
}; };
Groups.isMembersOfGroupList = async function (uids, groupListKey) { Groups.isMembersOfGroupList = async function (uids, groupListKey) {
@@ -139,8 +137,8 @@ module.exports = function (Groups) {
} }
const isGroupMembers = await Promise.all(groupNames.map(name => Groups.isMembers(uids, name))); const isGroupMembers = await Promise.all(groupNames.map(name => Groups.isMembers(uids, name)));
isGroupMembers.forEach(function (isMembers) { isGroupMembers.forEach((isMembers) => {
results.forEach(function (isMember, index) { results.forEach((isMember, index) => {
if (!isMember && isMembers[index]) { if (!isMember && isMembers[index]) {
results[index] = true; results[index] = true;
} }
@@ -154,7 +152,7 @@ module.exports = function (Groups) {
keys = isArray ? keys : [keys]; keys = isArray ? keys : [keys];
const cachedData = {}; const cachedData = {};
const nonCachedKeys = keys.filter(function (groupName) { const nonCachedKeys = keys.filter((groupName) => {
const groupMembers = cache.get(`group:${groupName}:members`); const groupMembers = cache.get(`group:${groupName}:members`);
const isInCache = groupMembers !== undefined; const isInCache = groupMembers !== undefined;
if (isInCache) { if (isInCache) {
@@ -168,7 +166,7 @@ module.exports = function (Groups) {
} }
const groupMembers = await db.getSortedSetsMembers(nonCachedKeys.map(name => `group:${name}:members`)); const groupMembers = await db.getSortedSetsMembers(nonCachedKeys.map(name => `group:${name}:members`));
nonCachedKeys.forEach(function (groupName, index) { nonCachedKeys.forEach((groupName, index) => {
cachedData[groupName] = groupMembers[index]; cachedData[groupName] = groupMembers[index];
cache.set(`group:${groupName}:members`, groupMembers[index]); cache.set(`group:${groupName}:members`, groupMembers[index]);
}); });

View File

@@ -65,13 +65,13 @@ module.exports = function (Groups) {
const uids = results.users.map(user => user && user.uid); const uids = results.users.map(user => user && user.uid);
const isOwners = await Groups.ownership.isOwners(uids, data.groupName); const isOwners = await Groups.ownership.isOwners(uids, data.groupName);
results.users.forEach(function (user, index) { results.users.forEach((user, index) => {
if (user) { if (user) {
user.isOwner = isOwners[index]; user.isOwner = isOwners[index];
} }
}); });
results.users.sort(function (a, b) { results.users.sort((a, b) => {
if (a.isOwner && !b.isOwner) { if (a.isOwner && !b.isOwner) {
return -1; return -1;
} else if (!a.isOwner && b.isOwner) { } else if (!a.isOwner && b.isOwner) {

View File

@@ -216,11 +216,11 @@ module.exports = function (Groups) {
}; };
async function updateMemberGroupTitles(oldName, newName) { async function updateMemberGroupTitles(oldName, newName) {
await batch.processSortedSet(`group:${oldName}:members`, async function (uids) { await batch.processSortedSet(`group:${oldName}:members`, async (uids) => {
let usersData = await user.getUsersData(uids); let usersData = await user.getUsersData(uids);
usersData = usersData.filter(userData => userData && userData.groupTitleArray.includes(oldName)); usersData = usersData.filter(userData => userData && userData.groupTitleArray.includes(oldName));
usersData.forEach(function (userData) { usersData.forEach((userData) => {
userData.newTitleArray = userData.groupTitleArray.map(oldTitle => (oldTitle === oldName ? newName : oldTitle)); userData.newTitleArray = userData.groupTitleArray.map(oldTitle => (oldTitle === oldName ? newName : oldTitle));
}); });
@@ -242,7 +242,7 @@ module.exports = function (Groups) {
async function updateNavigationItems(oldName, newName) { async function updateNavigationItems(oldName, newName) {
const navigation = require('../navigation/admin'); const navigation = require('../navigation/admin');
const navItems = await navigation.get(); const navItems = await navigation.get();
navItems.forEach(function (navItem) { navItems.forEach((navItem) => {
if (navItem && Array.isArray(navItem.groups) && navItem.groups.includes(oldName)) { if (navItem && Array.isArray(navItem.groups) && navItem.groups.includes(oldName)) {
navItem.groups.splice(navItem.groups.indexOf(oldName), 1, newName); navItem.groups.splice(navItem.groups.indexOf(oldName), 1, newName);
} }
@@ -257,9 +257,9 @@ module.exports = function (Groups) {
const data = await admin.get(); const data = await admin.get();
data.areas.forEach(function (area) { data.areas.forEach((area) => {
area.widgets = area.data; area.widgets = area.data;
area.widgets.forEach(function (widget) { area.widgets.forEach((widget) => {
if (widget && widget.data && Array.isArray(widget.data.groups) && widget.data.groups.includes(oldName)) { if (widget && widget.data && Array.isArray(widget.data.groups) && widget.data.groups.includes(oldName)) {
widget.data.groups.splice(widget.data.groups.indexOf(oldName), 1, newName); widget.data.groups.splice(widget.data.groups.indexOf(oldName), 1, newName);
} }

View File

@@ -131,7 +131,7 @@ async function setupConfig() {
const postgresQuestions = require('./database/postgres').questions; const postgresQuestions = require('./database/postgres').questions;
const allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions).concat(postgresQuestions); const allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions).concat(postgresQuestions);
allQuestions.forEach(function (question) { allQuestions.forEach((question) => {
if (install.values.hasOwnProperty(question.name)) { if (install.values.hasOwnProperty(question.name)) {
config[question.name] = install.values[question.name]; config[question.name] = install.values[question.name];
} else if (question.hasOwnProperty('default')) { } else if (question.hasOwnProperty('default')) {

View File

@@ -43,7 +43,7 @@ Languages.list = async function () {
const codes = await Languages.listCodes(); const codes = await Languages.listCodes();
let languages = await Promise.all(codes.map(async function (folder) { let languages = await Promise.all(codes.map(async (folder) => {
try { try {
const configPath = path.join(languagesPath, folder, 'language.json'); const configPath = path.join(languagesPath, folder, 'language.json');
const file = await fs.promises.readFile(configPath, 'utf8'); const file = await fs.promises.readFile(configPath, 'utf8');

View File

@@ -87,7 +87,7 @@ Logger.open = function (value) {
} }
if (stream) { if (stream) {
stream.on('error', function (err) { stream.on('error', (err) => {
winston.error(err.stack); winston.error(err.stack);
}); });
} }

View File

@@ -45,7 +45,7 @@ module.exports = function (Messaging) {
let messages = await Messaging.getMessagesFields(mids, []); let messages = await Messaging.getMessagesFields(mids, []);
messages = await user.blocks.filter(uid, 'fromuid', messages); messages = await user.blocks.filter(uid, 'fromuid', messages);
messages = messages messages = messages
.map(function (msg, idx) { .map((msg, idx) => {
if (msg) { if (msg) {
msg.messageId = parseInt(mids[idx], 10); msg.messageId = parseInt(mids[idx], 10);
msg.ip = undefined; msg.ip = undefined;
@@ -59,7 +59,7 @@ module.exports = function (Messaging) {
['uid', 'username', 'userslug', 'picture', 'status', 'banned'] ['uid', 'username', 'userslug', 'picture', 'status', 'banned']
); );
messages.forEach(function (message, index) { messages.forEach((message, index) => {
message.fromUser = users[index]; message.fromUser = users[index];
message.fromUser.banned = !!message.fromUser.banned; message.fromUser.banned = !!message.fromUser.banned;
message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0; message.fromUser.deleted = message.fromuid !== message.fromUser.uid && message.fromUser.uid === 0;
@@ -88,7 +88,7 @@ module.exports = function (Messaging) {
if (messages.length > 1) { if (messages.length > 1) {
// Add a spacer in between messages with time gaps between them // Add a spacer in between messages with time gaps between them
messages = messages.map(function (message, index) { messages = messages.map((message, index) => {
// Compare timestamps with the previous message, and check if a spacer needs to be added // Compare timestamps with the previous message, and check if a spacer needs to be added
if (index > 0 && message.timestamp > messages[index - 1].timestamp + Messaging.newMessageCutoff) { if (index > 0 && message.timestamp > messages[index - 1].timestamp + Messaging.newMessageCutoff) {
// If it's been 5 minutes, this is a new set of messages // If it's been 5 minutes, this is a new set of messages

View File

@@ -20,7 +20,7 @@ module.exports = function (Messaging) {
Messaging.getMessagesData([mid], uid, roomId, true), Messaging.getMessagesData([mid], uid, roomId, true),
]); ]);
uids.forEach(function (_uid) { uids.forEach((_uid) => {
if (parseInt(_uid, 10) !== parseInt(uid, 10)) { if (parseInt(_uid, 10) !== parseInt(uid, 10)) {
if (state === 1) { if (state === 1) {
sockets.in(`uid_${_uid}`).emit('event:chats.delete', mid); sockets.in(`uid_${_uid}`).emit('event:chats.delete', mid);

View File

@@ -32,7 +32,7 @@ module.exports = function (Messaging) {
Messaging.getMessagesData([mid], uid, roomId, true), Messaging.getMessagesData([mid], uid, roomId, true),
]); ]);
uids.forEach(function (uid) { uids.forEach((uid) => {
sockets.in(`uid_${uid}`).emit('event:chats.edit', { sockets.in(`uid_${uid}`).emit('event:chats.edit', {
messages: messages, messages: messages,
}); });

View File

@@ -36,13 +36,13 @@ Messaging.getMessages = async (params) => {
if (!mids.length) { if (!mids.length) {
return []; return [];
} }
mids.forEach(function (mid, index) { mids.forEach((mid, index) => {
indices[mid] = start + index; indices[mid] = start + index;
}); });
mids.reverse(); mids.reverse();
const messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew); const messageData = await Messaging.getMessagesData(mids, params.uid, params.roomId, isNew);
messageData.forEach(function (messageData) { messageData.forEach((messageData) => {
messageData.index = indices[messageData.messageId.toString()]; messageData.index = indices[messageData.messageId.toString()];
messageData.isOwner = messageData.fromuid === parseInt(params.uid, 10); messageData.isOwner = messageData.fromuid === parseInt(params.uid, 10);
if (messageData.deleted && !messageData.isOwner) { if (messageData.deleted && !messageData.isOwner) {
@@ -106,21 +106,19 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
teasers: Promise.all(roomIds.map(async roomId => Messaging.getTeaser(uid, roomId))), teasers: Promise.all(roomIds.map(async roomId => Messaging.getTeaser(uid, roomId))),
}); });
results.roomData.forEach(function (room, index) { results.roomData.forEach((room, index) => {
if (room) { if (room) {
room.users = results.users[index]; room.users = results.users[index];
room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : room.users.length > 2; room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : room.users.length > 2;
room.unread = results.unread[index]; room.unread = results.unread[index];
room.teaser = results.teasers[index]; room.teaser = results.teasers[index];
room.users.forEach(function (userData) { room.users.forEach((userData) => {
if (userData && parseInt(userData.uid, 10)) { if (userData && parseInt(userData.uid, 10)) {
userData.status = user.getStatus(userData); userData.status = user.getStatus(userData);
} }
}); });
room.users = room.users.filter(function (user) { room.users = room.users.filter(user => user && parseInt(user.uid, 10));
return user && parseInt(user.uid, 10);
});
room.lastUser = room.users[0]; room.lastUser = room.users[0];
room.usernames = Messaging.generateUsernames(room.users, uid); room.usernames = Messaging.generateUsernames(room.users, uid);
@@ -254,9 +252,7 @@ Messaging.hasPrivateChat = async (uid, withUid) => {
myRooms: db.getSortedSetRevRange(`uid:${uid}:chat:rooms`, 0, -1), myRooms: db.getSortedSetRevRange(`uid:${uid}:chat:rooms`, 0, -1),
theirRooms: db.getSortedSetRevRange(`uid:${withUid}:chat:rooms`, 0, -1), theirRooms: db.getSortedSetRevRange(`uid:${withUid}:chat:rooms`, 0, -1),
}); });
const roomIds = results.myRooms.filter(function (roomId) { const roomIds = results.myRooms.filter(roomId => roomId && results.theirRooms.includes(roomId));
return roomId && results.theirRooms.includes(roomId);
});
if (!roomIds.length) { if (!roomIds.length) {
return 0; return 0;

View File

@@ -25,7 +25,7 @@ module.exports = function (Messaging) {
} }
uids = data.uids; uids = data.uids;
uids.forEach(function (uid) { uids.forEach((uid) => {
data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0; data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0;
Messaging.pushUnreadCount(uid); Messaging.pushUnreadCount(uid);
sockets.in(`uid_${uid}`).emit('event:chats.receive', data); sockets.in(`uid_${uid}`).emit('event:chats.receive', data);
@@ -45,7 +45,7 @@ module.exports = function (Messaging) {
Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj; Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj;
} }
queueObj.timeout = setTimeout(function () { queueObj.timeout = setTimeout(() => {
sendNotifications(fromUid, uids, roomId, queueObj.message); sendNotifications(fromUid, uids, roomId, queueObj.message);
}, (parseFloat(meta.config.notificationSendDelay) || 60) * 1000); }, (parseFloat(meta.config.notificationSendDelay) || 60) * 1000);
}; };

View File

@@ -26,7 +26,7 @@ module.exports = function (Messaging) {
}; };
function modifyRoomData(rooms) { function modifyRoomData(rooms) {
rooms.forEach(function (data) { rooms.forEach((data) => {
if (data) { if (data) {
data.roomName = data.roomName || ''; data.roomName = data.roomName || '';
data.roomName = validator.escape(String(data.roomName)); data.roomName = validator.escape(String(data.roomName));
@@ -170,7 +170,7 @@ module.exports = function (Messaging) {
db.getObjectField(`chat:room:${roomId}`, 'owner'), db.getObjectField(`chat:room:${roomId}`, 'owner'),
]); ]);
return users.map(function (user) { return users.map((user) => {
user.isOwner = parseInt(user.uid, 10) === parseInt(ownerId, 10); user.isOwner = parseInt(user.uid, 10) === parseInt(ownerId, 10);
return user; return user;
}); });
@@ -236,9 +236,7 @@ module.exports = function (Messaging) {
var room = roomData; var room = roomData;
room.messages = messages; room.messages = messages;
room.isOwner = parseInt(room.owner, 10) === parseInt(uid, 10); room.isOwner = parseInt(room.owner, 10) === parseInt(uid, 10);
room.users = users.filter(function (user) { room.users = users.filter(user => user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== parseInt(uid, 10));
return user && parseInt(user.uid, 10) && parseInt(user.uid, 10) !== parseInt(uid, 10);
});
room.canReply = canReply; room.canReply = canReply;
room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : users.length > 2; room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : users.length > 2;
room.usernames = Messaging.generateUsernames(users, uid); room.usernames = Messaging.generateUsernames(users, uid);

View File

@@ -23,16 +23,14 @@ exports.aliases = aliases;
function buildTargets() { function buildTargets() {
var length = 0; var length = 0;
var output = Object.keys(aliases).map(function (name) { var output = Object.keys(aliases).map((name) => {
var arr = aliases[name]; var arr = aliases[name];
if (name.length > length) { if (name.length > length) {
length = name.length; length = name.length;
} }
return [name, arr.join(', ')]; return [name, arr.join(', ')];
}).map(function (tuple) { }).map(tuple => ` ${_.padEnd(`"${tuple[0]}"`, length + 2).magenta} | ${tuple[1]}`).join('\n');
return ` ${_.padEnd(`"${tuple[0]}"`, length + 2).magenta} | ${tuple[1]}`;
}).join('\n');
console.log( console.log(
`\n\n Build targets:\n${ `\n\n Build targets:\n${
(`\n ${_.padEnd('Target', length + 2)} | Aliases`).green (`\n ${_.padEnd('Target', length + 2)} | Aliases`).green

View File

@@ -64,7 +64,7 @@ Blacklist.test = async function (clientIp) {
if ( if (
!Blacklist._rules.ipv4.includes(clientIp) && // not explicitly specified in ipv4 list !Blacklist._rules.ipv4.includes(clientIp) && // not explicitly specified in ipv4 list
!Blacklist._rules.ipv6.includes(clientIp) && // not explicitly specified in ipv6 list !Blacklist._rules.ipv6.includes(clientIp) && // not explicitly specified in ipv6 list
!Blacklist._rules.cidr.some(function (subnet) { !Blacklist._rules.cidr.some((subnet) => {
var cidr = ipaddr.parseCIDR(subnet); var cidr = ipaddr.parseCIDR(subnet);
if (addr.kind() !== cidr[0].kind()) { if (addr.kind() !== cidr[0].kind()) {
return false; return false;
@@ -101,7 +101,7 @@ Blacklist.validate = function (rules) {
// Filter out blank lines and lines starting with the hash character (comments) // Filter out blank lines and lines starting with the hash character (comments)
// Also trim inputs and remove inline comments // Also trim inputs and remove inline comments
rules = rules.map(function (rule) { rules = rules.map((rule) => {
rule = rule.replace(inlineCommentMatch, '').trim(); rule = rule.replace(inlineCommentMatch, '').trim();
return rule.length && !rule.startsWith('#') ? rule : null; return rule.length && !rule.startsWith('#') ? rule : null;
}).filter(Boolean); }).filter(Boolean);
@@ -112,7 +112,7 @@ Blacklist.validate = function (rules) {
rules = uniqRules; rules = uniqRules;
// Filter out invalid rules // Filter out invalid rules
rules = rules.filter(function (rule) { rules = rules.filter((rule) => {
var addr; var addr;
var isRange = false; var isRange = false;
try { try {

Some files were not shown because too many files have changed in this diff Show More