diff --git a/public/.jshintrc b/public/.jshintrc deleted file mode 100644 index 6e93972469..0000000000 --- a/public/.jshintrc +++ /dev/null @@ -1,84 +0,0 @@ -{ - "maxerr" : 50, // {int} Maximum error before stopping - - "esversion": 9, - - // Enforcing - "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.) - "camelcase" : false, // true: Identifiers must be in camelCase - "curly" : true, // true: Require {} for every new block or scope - "eqeqeq" : true, // true: Require triple equals (===) for comparison - "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty() - "immed" : false, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "indent" : 4, // {int} Number of spaces to use for indentation - "latedef" : false, // true: Require variables/functions to be defined before being used - "newcap" : false, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "noempty" : true, // true: Prohibit use of empty blocks - "nonew" : false, // true: Prohibit use of constructors for side-effects (without assignment) - "plusplus" : false, // true: Prohibit use of `++` & `--` - "quotmark" : false, // Quotation mark consistency: - // false : do nothing (default) - // true : ensure whatever is used is consistent - // "single" : require single quotes - // "double" : require double quotes - "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks) - "unused" : true, // true: Require all defined variables be used - "strict" : true, // true: Requires all functions run in ES5 Strict Mode - "trailing" : false, // true: Prohibit trailing whitespaces - "maxparams" : false, // {int} Max number of formal params allowed per function - "maxdepth" : false, // {int} Max depth of nested blocks (within functions) - "maxstatements" : false, // {int} Max number statements per function - "maxcomplexity" : false, // {int} Max cyclomatic complexity per function - "maxlen" : false, // {int} Max number of characters per line - - // Relaxing - "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons) - "boss" : false, // true: Tolerate assignments where comparisons would be expected - "debug" : false, // true: Allow debugger statements e.g. browser breakpoints. - "eqnull" : false, // true: Tolerate use of `== null` - "es5" : false, // true: Allow ES5 syntax (ex: getters and setters) - "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`) - "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features) - // (ex: `for each`, multiple try/catch, function expression…) - "evil" : false, // true: Tolerate use of `eval` and `new Function()` - "expr" : false, // true: Tolerate `ExpressionStatement` as Programs - "funcscope" : false, // true: Tolerate defining variables inside control statements" - "globalstrict" : true, // true: Allow global "use strict" (also enables 'strict') - "iterator" : false, // true: Tolerate using the `__iterator__` property - "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block - "laxbreak" : false, // true: Tolerate possibly unsafe line breakings - "laxcomma" : false, // true: Tolerate comma-first style coding - "loopfunc" : false, // true: Tolerate functions being defined in loops - "multistr" : false, // true: Tolerate multi-line strings - "proto" : false, // true: Tolerate using the `__proto__` property - "scripturl" : false, // true: Tolerate script-targeted URLs - "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment - "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;` - "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;` - "validthis" : false, // true: Tolerate using this in a non-constructor function - - "globals": { - "app": true, - "io": true, - "socket": true, - "ajaxify": true, - "config": true, - "utils": true, - "overrides": true, - "componentHandler": true, - "templates": true, - "Visibility": true, - "Tinycon": true, - "require": true, - "define": true, - "ace": true, - "Sortable": true, - "Slideout": true, - "NProgress": true - }, - - "jquery": true, - "browser": true -} \ No newline at end of file diff --git a/src/socket.io/admin/analytics.js b/src/socket.io/admin/analytics.js index 6bb80c9df1..bc084b14f5 100644 --- a/src/socket.io/admin/analytics.js +++ b/src/socket.io/admin/analytics.js @@ -1,13 +1,13 @@ 'use strict'; -const async = require('async'); const analytics = require('../../analytics'); +const utils = require('../../utils'); const Analytics = module.exports; -Analytics.get = function (socket, data, callback) { +Analytics.get = async function (socket, data) { if (!data || !data.graph || !data.units) { - return callback(new Error('[[error:invalid-data]]')); + throw new Error('[[error:invalid-data]]'); } // Default returns views from past 24 hours, by hour @@ -20,30 +20,17 @@ Analytics.get = function (socket, data, callback) { } const getStats = data.units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet; if (data.graph === 'traffic') { - async.parallel({ - uniqueVisitors: function (next) { - getStats('analytics:uniquevisitors', data.until || Date.now(), data.amount, next); - }, - pageviews: function (next) { - getStats('analytics:pageviews', data.until || Date.now(), data.amount, next); - }, - pageviewsRegistered: function (next) { - getStats('analytics:pageviews:registered', data.until || Date.now(), data.amount, next); - }, - pageviewsGuest: function (next) { - getStats('analytics:pageviews:guest', data.until || Date.now(), data.amount, next); - }, - pageviewsBot: function (next) { - getStats('analytics:pageviews:bot', data.until || Date.now(), data.amount, next); - }, - summary: function (next) { - analytics.getSummary(next); - }, - }, (err, data) => { - data.pastDay = data.pageviews.reduce((a, b) => parseInt(a, 10) + parseInt(b, 10)); - const last = data.pageviews.length - 1; - data.pageviews[last] = parseInt(data.pageviews[last], 10) + analytics.getUnwrittenPageviews(); - callback(err, data); + const result = await utils.promiseParallel({ + uniqueVisitors: getStats('analytics:uniquevisitors', data.until || Date.now(), data.amount), + pageviews: getStats('analytics:pageviews', data.until || Date.now(), data.amount), + pageviewsRegistered: getStats('analytics:pageviews:registered', data.until || Date.now(), data.amount), + pageviewsGuest: getStats('analytics:pageviews:guest', data.until || Date.now(), data.amount), + pageviewsBot: getStats('analytics:pageviews:bot', data.until || Date.now(), data.amount), + summary: analytics.getSummary(), }); + result.pastDay = result.pageviews.reduce((a, b) => parseInt(a, 10) + parseInt(b, 10)); + const last = result.pageviews.length - 1; + result.pageviews[last] = parseInt(result.pageviews[last], 10) + analytics.getUnwrittenPageviews(); + return result; } };