diff --git a/.eslintignore b/.eslintignore index 8773f6f9f..69eb4216d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -16,9 +16,11 @@ test/views/*.js # ES2015+ files !js/background.js +!js/logging.js !js/models/conversations.js !js/views/attachment_view.js !js/views/conversation_search_view.js +!js/views/debug_log_view.js !js/views/file_input_view.js !js/views/inbox_view.js !main.js diff --git a/js/background.js b/js/background.js index 0c6e733f5..506874823 100644 --- a/js/background.js +++ b/js/background.js @@ -1,7 +1,5 @@ /* eslint-disable */ -/* eslint-env browser */ - /* global Backbone: false */ /* global $: false */ diff --git a/js/logging.js b/js/logging.js index cd66f9e97..d1961226f 100644 --- a/js/logging.js +++ b/js/logging.js @@ -1,3 +1,10 @@ +/* eslint-env node */ + +/* eslint strict: ['error', 'never'] */ + +/* global $: false */ +/* global textsecure: false */ + const electron = require('electron'); const bunyan = require('bunyan'); const _ = require('lodash'); @@ -23,13 +30,14 @@ const LEVELS = { // Backwards-compatible logging, simple strings and no level (defaulted to INFO) function redactPhone(text) { - return text.replace(PHONE_REGEX, "+[REDACTED]$1"); + return text.replace(PHONE_REGEX, '+[REDACTED]$1'); } function redactGroup(text) { - return text.replace(GROUP_REGEX, function(match, before, id, after) { - return before + '[REDACTED]' + id.slice(-3) + after; - }); + return text.replace( + GROUP_REGEX, + (match, before, id, after) => `${before}[REDACTED]${id.slice(-3)}${after}` + ); } function now() { @@ -37,19 +45,16 @@ function now() { return date.toJSON(); } -function log() { - const args = Array.prototype.slice.call(arguments, 0); - +function log(...args) { const consoleArgs = ['INFO ', now()].concat(args); - console._log.apply(console, consoleArgs); + console._log(...consoleArgs); // To avoid [Object object] in our log since console.log handles non-strings smoothly - const str = args.map(function(item) { + const str = args.map((item) => { if (typeof item !== 'string') { try { return JSON.stringify(item); - } - catch (e) { + } catch (error) { return item; } } @@ -71,14 +76,14 @@ if (window.console) { function getHeader() { let header = window.navigator.userAgent; - header += ' node/' + window.config.node_version; - header += ' env/' + window.config.environment; + header += ` node/${window.config.node_version}`; + header += ` env/${window.config.environment}`; return header; } function getLevel(level) { - var text = LEVELS[level]; + const text = LEVELS[level]; if (!text) { return BLANK_LEVEL; } @@ -87,7 +92,7 @@ function getLevel(level) { } function formatLine(entry) { - return getLevel(entry.level) + ' ' + entry.time + ' ' + entry.msg; + return `${getLevel(entry.level)} ${entry.time} ${entry.msg}`; } function format(entries) { @@ -95,30 +100,31 @@ function format(entries) { } function fetch() { - return new Promise(function(resolve) { + return new Promise((resolve) => { ipc.send('fetch-log'); - ipc.on('fetched-log', function(event, text) { - var result = getHeader() + '\n' + format(text); + ipc.on('fetched-log', (event, text) => { + const result = `${getHeader()}\n${format(text)}`; resolve(result); }); }); } -function publish(log) { - log = log || fetch(); +function publish(rawContent) { + const content = rawContent || fetch(); - return new Promise(function(resolve) { + return new Promise((resolve) => { const payload = textsecure.utils.jsonThing({ files: { 'debugLog.txt': { - content: log - } - } + content, + }, + }, }); + // eslint-disable-next-line more/no-then $.post('https://api.github.com/gists', payload) - .then(function(response) { + .then((response) => { console._log('Posted debug log to ', response.html_url); resolve(response.html_url); }) @@ -136,22 +142,19 @@ const logger = bunyan.createLogger({ streams: [{ level: 'debug', stream: { - write: function(entry) { + write(entry) { console._log(formatLine(JSON.parse(entry))); - } - } - }] + }, + }, + }], }); // The Bunyan API: https://github.com/trentm/node-bunyan#log-method-api -function logAtLevel() { - const level = arguments[0]; - const args = Array.prototype.slice.call(arguments, 1); - - const ipcArgs = ['log-' + level].concat(args); - ipc.send.apply(ipc, ipcArgs); +function logAtLevel(level, ...args) { + const ipcArgs = [`log-${level}`].concat(args); + ipc.send(...ipcArgs); - logger[level].apply(logger, args); + logger[level](...args); } window.log = { @@ -165,11 +168,11 @@ window.log = { publish, }; -window.onerror = function(message, script, line, col, error) { +window.onerror = (message, script, line, col, error) => { const errorInfo = error && error.stack ? error.stack : JSON.stringify(error); - window.log.error('Top-level unhandled error: ' + errorInfo); + window.log.error(`Top-level unhandled error: ${errorInfo}`); }; -window.addEventListener('unhandledrejection', function(rejectionEvent) { - window.log.error('Top-level unhandled promise rejection: ' + rejectionEvent.reason); +window.addEventListener('unhandledrejection', (rejectionEvent) => { + window.log.error(`Top-level unhandled promise rejection: ${rejectionEvent.reason}`); }); diff --git a/js/views/attachment_view.js b/js/views/attachment_view.js index b42987284..861ab218f 100644 --- a/js/views/attachment_view.js +++ b/js/views/attachment_view.js @@ -1,5 +1,3 @@ -/* eslint-env browser */ - /* global $: false */ /* global _: false */ /* global Backbone: false */ diff --git a/js/views/debug_log_view.js b/js/views/debug_log_view.js index 357e2bf5e..0abdea58f 100644 --- a/js/views/debug_log_view.js +++ b/js/views/debug_log_view.js @@ -1,66 +1,69 @@ -/* - * vim: ts=4:sw=4:expandtab - */ +/* global i18n: false */ +/* global Whisper: false */ + +// eslint-disable-next-line func-names (function () { - 'use strict'; - window.Whisper = window.Whisper || {}; + 'use strict'; - Whisper.DebugLogLinkView = Whisper.View.extend({ - templateName: 'debug-log-link', - initialize: function(options) { - this.url = options.url; - }, - render_attributes: function() { - return { - url: this.url, - reportIssue: i18n('reportIssue') - }; - } - }); - Whisper.DebugLogView = Whisper.View.extend({ - templateName: 'debug-log', - className: 'debug-log modal', - initialize: function() { - this.render(); - this.$('textarea').val(i18n('loading')); + window.Whisper = window.Whisper || {}; - window.log.fetch().then(function(text) { - this.$('textarea').val(text); - }.bind(this)); - }, - events: { - 'click .submit': 'submit', - 'click .close': 'close' - }, - render_attributes: { - title: i18n('submitDebugLog'), - cancel: i18n('cancel'), - submit: i18n('submit'), - close: i18n('gotIt'), - debugLogExplanation: i18n('debugLogExplanation') - }, - close: function(e) { - e.preventDefault(); - this.remove(); - }, - submit: function(e) { - e.preventDefault(); - var text = this.$('textarea').val(); - if (text.length === 0) { - return; - } - log.publish(text).then(function(url) { - var view = new Whisper.DebugLogLinkView({ - url: url, - el: this.$('.result') - }); - this.$('.loading').removeClass('loading'); - view.render(); - this.$('.link').focus().select(); - }.bind(this)); - this.$('.buttons, textarea').remove(); - this.$('.result').addClass('loading'); - } - }); + Whisper.DebugLogLinkView = Whisper.View.extend({ + templateName: 'debug-log-link', + initialize(options) { + this.url = options.url; + }, + render_attributes() { + return { + url: this.url, + reportIssue: i18n('reportIssue'), + }; + }, + }); + Whisper.DebugLogView = Whisper.View.extend({ + templateName: 'debug-log', + className: 'debug-log modal', + initialize() { + this.render(); + this.$('textarea').val(i18n('loading')); -})(); + // eslint-disable-next-line more/no-then + window.log.fetch().then((text) => { + this.$('textarea').val(text); + }); + }, + events: { + 'click .submit': 'submit', + 'click .close': 'close', + }, + render_attributes: { + title: i18n('submitDebugLog'), + cancel: i18n('cancel'), + submit: i18n('submit'), + close: i18n('gotIt'), + debugLogExplanation: i18n('debugLogExplanation'), + }, + close(e) { + e.preventDefault(); + this.remove(); + }, + submit(e) { + e.preventDefault(); + const text = this.$('textarea').val(); + if (text.length === 0) { + return; + } + // eslint-disable-next-line more/no-then + window.log.publish(text).then((url) => { + const view = new Whisper.DebugLogLinkView({ + url, + el: this.$('.result'), + }); + this.$('.loading').removeClass('loading'); + view.render(); + this.$('.link').focus().select(); + }); + this.$('.buttons, textarea').remove(); + this.$('.result').addClass('loading'); + }, + }); +}());