diff --git a/.eslintrc.js b/.eslintrc.js index b5f4385f..4d8c6e77 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,6 +2,7 @@ module.exports = { 'env': { 'browser': true, + 'es2020': true, 'es6': true }, 'extends': [ @@ -33,6 +34,7 @@ module.exports = { '__version_major__': false, '__version_minor__': false, '__version_patch__': false, + '__version_build__': false, '__version_prerelease__': false, '__extension__': false, 'FrankerFaceZ': false @@ -70,7 +72,6 @@ module.exports = { 'no-useless-concat': ['warn'], 'no-useless-return': ['warn'], 'no-void': ['error'], - 'no-warning-comments': ['warn'], 'no-with': ['error'], 'radix': ['error'], 'require-await': ['warn'], @@ -121,9 +122,12 @@ module.exports = { 'tab' ], 'vue/valid-template-root': 'off', + 'vue/multi-word-component-names': 'off', 'vue/max-attributes-per-line': 'off', 'vue/require-prop-types': 'off', 'vue/require-default-prop': 'off', + 'vue/no-mutating-props': 'off', // TODO: all these + 'vue/prop-name-casing': 'off', // TODO: do we need this? 'vue/html-closing-bracket-newline': [ 'error', { @@ -157,4 +161,4 @@ module.exports = { 'react/jsx-uses-react': 'error', 'react/jsx-wrap-multilines': 'error' } -}; \ No newline at end of file +}; diff --git a/src/entry_ext.js b/src/entry_ext.js index 586f3f75..2f53b534 100644 --- a/src/entry_ext.js +++ b/src/entry_ext.js @@ -64,7 +64,7 @@ } function handleMessage(id, payload) { - const port = connection.get(id); + const port = connections.get(id); if ( port ) { port.postMessage(payload); } @@ -88,7 +88,7 @@ // Let the extension send messages to the page directly. - browser.runtime.onMessage.addListener((msg, sender) => { + browser.runtime.onMessage.addListener(msg => { if (msg?.type === 'ffz_to_page') window.postMessage(msg.data, '*'); @@ -97,7 +97,7 @@ // Now, inject our script into the page context. const HOST = location.hostname, - SERVER = browser.runtime.getURL("web"), + SERVER = browser.runtime.getURL('web'), script = document.createElement('script'); let FLAVOR = diff --git a/src/esbridge.js b/src/esbridge.js index 922f2a67..e955e555 100644 --- a/src/esbridge.js +++ b/src/esbridge.js @@ -32,7 +32,7 @@ class FFZESBridge { window.addEventListener('message', this.onWindowMessage); - document.addEventListener('readystatechange', event => { + document.addEventListener('readystatechange', () => { if ( document.documentElement ) document.documentElement.dataset.ffzEsbridge = true; }); @@ -55,7 +55,7 @@ class FFZESBridge { msg, location.origin, transfer ? (Array.isArray(transfer) ? transfer : [transfer]) : undefined - ); + ); } catch(err) { this.log.error('Error sending message to window.', err, msg, transfer); } @@ -63,21 +63,21 @@ class FFZESBridge { onWindowMessage(event) { if ( event.origin !== location.origin ) - return; + return; const msg = event.data, - id = msg?.id, - type = msg?.ffz_esb_type; + id = msg?.id, + type = msg?.ffz_esb_type; if ( ! type ) - return; + return; this.log.info('Received Message from Page', type, id, msg); if ( type === 'init' ) { this.received_init = true; if ( this.active ) - this.runtimeHeartbeat(); + this.runtimeHeartbeat(); } this.runtimeSend(msg); @@ -89,7 +89,7 @@ class FFZESBridge { runtimeOpen() { if ( this.active ) - return Promise.resolve(); + return Promise.resolve(); this.log.info('Connecting to worker.'); @@ -99,7 +99,7 @@ class FFZESBridge { this.port.onDisconnect.addListener(this.onRuntimeDisconnect); if ( this.received_init ) - this.runtimeHeartbeat(); + this.runtimeHeartbeat(); } onRuntimeMessage(msg) { @@ -118,27 +118,27 @@ class FFZESBridge { runtimeHeartbeat() { if ( this._heartbeat ) - return; + return; this._heartbeat = setInterval(() => { if ( this.active ) - this.runtimeSend('heartbeat'); + this.runtimeSend('heartbeat'); }, 30000); } runtimeSend(msg) { if ( typeof msg === 'string' ) - msg = {ffz_esb_type: msg}; + msg = {ffz_esb_type: msg}; if ( ! this.active ) // We need to create our port. - this.runtimeOpen(); + this.runtimeOpen(); // Send the message, knowing we have an open port. this.port.postMessage(msg); } -}; +} FFZESBridge.Logger = Logger; @@ -151,7 +151,7 @@ const VER = FFZESBridge.version_info = Object.freeze({ build: __version_build__, hash: __webpack_hash__, toString: () => - `${VER.major}.${VER.minor}.${VER.revision}${VER.extra || ''}${VER.build ? `+${VER.build}` : ''}` + `${VER.major}.${VER.minor}.${VER.revision}${VER.extra || ''}${VER.build ? `+${VER.build}` : ''}` }); window.FFZESBridge = FFZESBridge; diff --git a/src/i18n.js b/src/i18n.js index da625c59..ec7ef683 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -187,7 +187,7 @@ export default class TranslationManager extends Module { }, data: () => { const out = [], now = new Date; - for (const [key, fmt] of Object.entries(this._.formats.date)) { + for (const [key] of Object.entries(this._.formats.date)) { out.push({ value: key, title: `${this.formatDate(now, key)} (${key})` }) @@ -217,7 +217,7 @@ export default class TranslationManager extends Module { }, data: () => { const out = [], now = new Date; - for (const [key,fmt] of Object.entries(this._.formats.time)) { + for (const [key] of Object.entries(this._.formats.time)) { out.push({ value: key, title: `${this.formatTime(now, key)} (${key})` }) @@ -247,7 +247,7 @@ export default class TranslationManager extends Module { }, data: () => { const out = [], now = new Date; - for (const [key,fmt] of Object.entries(this._.formats.datetime)) { + for (const [key] of Object.entries(this._.formats.datetime)) { out.push({ value: key, title: `${this.formatDateTime(now, key)} (${key})` }) diff --git a/src/modules/chat/actions/actions.jsx b/src/modules/chat/actions/actions.jsx index 4e0012ee..1e979863 100644 --- a/src/modules/chat/actions/actions.jsx +++ b/src/modules/chat/actions/actions.jsx @@ -27,7 +27,7 @@ export default class Actions extends Module { this.actions = {}; this.renderers = {}; - this.filterAction = (x) => x.appearance && + this.filterAction = x => x.appearance && this.renderers[x.appearance.type] && (! this.renderers[x.appearance.type].load || this.renderers[x.appearance.type].load(x.appearance)) && (! x.action || this.actions[x.action]); @@ -802,7 +802,7 @@ export default class Actions extends Module { if ( u ) { u.moderator = line.props.isCurrentUserModerator; u.staff = line.props.isCurrentUserStaff; - u.reply_mode = this.parent.context.get('chat.replies.style'), + u.reply_mode = this.parent.context.get('chat.replies.style'); u.can_reply = can_reply; } diff --git a/src/modules/chat/actions/components/edit-chat.vue b/src/modules/chat/actions/components/edit-chat.vue index da13a63c..c2beedda 100644 --- a/src/modules/chat/actions/components/edit-chat.vue +++ b/src/modules/chat/actions/components/edit-chat.vue @@ -61,7 +61,6 @@ {{ t('setting.actions.chat.target-incompatible', 'Note: This is not compatible with pasting a message into chat, and will not function if that is enabled.') }} - diff --git a/src/modules/chat/actions/components/edit-profile.vue b/src/modules/chat/actions/components/edit-profile.vue index e2e7bf4c..1c3f7dac 100644 --- a/src/modules/chat/actions/components/edit-profile.vue +++ b/src/modules/chat/actions/components/edit-profile.vue @@ -15,7 +15,9 @@ v-for="profile in profiles" :key="profile.value" :value="profile.value" - >{{ profile.i18n_key ? t(profile.i18n_key, profile.name) : profile.name }} + > + {{ profile.i18n_key ? t(profile.i18n_key, profile.name) : profile.name }} + diff --git a/src/modules/chat/actions/types.jsx b/src/modules/chat/actions/types.jsx index c50ad17e..06decd29 100644 --- a/src/modules/chat/actions/types.jsx +++ b/src/modules/chat/actions/types.jsx @@ -40,7 +40,7 @@ export const pin = { }, hidden(data, message, current_room, current_user, mod_icons, instance) { - let line = instance; + const line = instance; if ( ! line ) return true; @@ -549,7 +549,8 @@ export const mod = { return this.i18n.t('chat.actions.mod.tooltip', 'Mod {user.login}', {user: data.user}); }, - hidden(data, message, current_room, current_user, mod_icons, instance) { + // can accept (data, message, current_room, current_user, mod_icons, instance) + hidden(data, message, current_room, current_user) { // You cannot mod mods. if ( message.user.type === 'mod' ) return true; @@ -584,7 +585,8 @@ export const unmod = { return this.i18n.t('chat.actions.unmod.tooltip', 'Un-Mod {user.login}', {user: data.user}); }, - hidden(data, message, current_room, current_user, mod_icons, instance) { + // can accept (data, message, current_room, current_user, mod_icons, instance) + hidden(data, message, current_room, current_user) { // You can only un-mod mods. if ( message.user.type !== 'mod' ) return true; diff --git a/src/modules/chat/badges.jsx b/src/modules/chat/badges.jsx index 4f0dc3b6..eb39d517 100644 --- a/src/modules/chat/badges.jsx +++ b/src/modules/chat/badges.jsx @@ -657,7 +657,7 @@ export default class Badges extends Module { const existing = this.badges[badge_id]; if ( existing && existing.addon !== addon_id ) - module.log.warn('[DEV-CHECK] Removed un-owned badge with chat.badges.removeBadge():', key, ' owner:', existing.addon ?? 'ffz'); + module.log.warn('[DEV-CHECK] Removed un-owned badge with chat.badges.removeBadge():', badge_id, ' owner:', existing.addon ?? 'ffz'); return this.removeBadge(badge_id, ...args); }; @@ -739,10 +739,10 @@ export default class Badges extends Module { } return { - room_id: room_id, - room_login: room_login, - user_id: user_id, - user_login: user_login, + room_id, + room_login, + user_id, + user_login, data }; } @@ -1279,11 +1279,11 @@ export default class Badges extends Module { return; if ( d.lifetime ) - return '\n' + this.i18n.t('badges.subwoofer.lifetime', 'Lifetime Subwoofer'); + return `\n${ this.i18n.t('badges.subwoofer.lifetime', 'Lifetime Subwoofer')}`; - return '\n' + this.i18n.t('badges.subwoofer.months', '({count, plural, one {# Month} other {# Months}})', { + return `\n${ this.i18n.t('badges.subwoofer.months', '({count, plural, one {# Month} other {# Months}})', { count: d.months - }); + })}`; }) }; } diff --git a/src/modules/chat/components/chat-line.vue b/src/modules/chat/components/chat-line.vue index c46b4584..615cf393 100644 --- a/src/modules/chat/components/chat-line.vue +++ b/src/modules/chat/components/chat-line.vue @@ -1,5 +1,4 @@ \ No newline at end of file + diff --git a/src/modules/main_menu/components/chat-actions.vue b/src/modules/main_menu/components/chat-actions.vue index a6b2a008..9aade6de 100644 --- a/src/modules/main_menu/components/chat-actions.vue +++ b/src/modules/main_menu/components/chat-actions.vue @@ -296,7 +296,7 @@ :act="maybeDynamic(preset)" :process-color="color" :renderers="data.renderers" - /> + /> @@ -794,7 +794,7 @@ export default { }, maybeDynamic(data) { - let ap = data.appearance; + const ap = data.appearance; if (ap?.type === 'dynamic') { const act = this.data.actions[data.action], ffz = this.context.getFFZ(), diff --git a/src/modules/main_menu/components/chat-tester.vue b/src/modules/main_menu/components/chat-tester.vue index 0d1e321f..e5bf765f 100644 --- a/src/modules/main_menu/components/chat-tester.vue +++ b/src/modules/main_menu/components/chat-tester.vue @@ -36,7 +36,7 @@ class="tw-block tw-font-size-6 tw-full-width ffz-textarea ffz-mg-t-1p" @blur="updateMessage" @input="onMessageChange" - /> + >