diff --git a/.eslintrc.js b/.eslintrc.js index d1182628263..35e1423e063 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -75,7 +75,7 @@ module.exports = defineConfig({ ], }, ], - 'no-empty': ['error', { "allowEmptyCatch": true }], + 'no-empty': ['error', { 'allowEmptyCatch': true }], 'no-restricted-properties': [ 'error', { property: 'substring', message: 'Use .slice instead of .substring.' }, @@ -332,16 +332,16 @@ module.exports = defineConfig({ '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'], '@typescript-eslint/consistent-type-exports': 'error', '@typescript-eslint/consistent-type-imports': 'error', - "@typescript-eslint/prefer-nullish-coalescing": ['error', { ignorePrimitives: { boolean: true } }], - "@typescript-eslint/no-restricted-imports": [ - "warn", + '@typescript-eslint/prefer-nullish-coalescing': ['error', { ignorePrimitives: { boolean: true } }], + '@typescript-eslint/no-restricted-imports': [ + 'warn', { - "name": "react-redux", - "importNames": ["useSelector", "useDispatch"], - "message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead." + 'name': 'react-redux', + 'importNames': ['useSelector', 'useDispatch'], + 'message': 'Use typed hooks `useAppDispatch` and `useAppSelector` instead.' } ], - "@typescript-eslint/restrict-template-expressions": ['warn', { allowNumber: true }], + '@typescript-eslint/restrict-template-expressions': ['warn', { allowNumber: true }], 'jsdoc/require-jsdoc': 'off', // Those rules set stricter rules for TS files diff --git a/app/javascript/mastodon/actions/domain_blocks.js b/app/javascript/mastodon/actions/domain_blocks.js index 727f800af3b..4fb31a8bc30 100644 --- a/app/javascript/mastodon/actions/domain_blocks.js +++ b/app/javascript/mastodon/actions/domain_blocks.js @@ -1,10 +1,10 @@ import api, { getLinks } from '../api'; -import { blockDomainSuccess, unblockDomainSuccess } from "./domain_blocks_typed"; +import { blockDomainSuccess, unblockDomainSuccess } from './domain_blocks_typed'; import { openModal } from './modal'; -export * from "./domain_blocks_typed"; +export * from './domain_blocks_typed'; export const DOMAIN_BLOCK_REQUEST = 'DOMAIN_BLOCK_REQUEST'; export const DOMAIN_BLOCK_FAIL = 'DOMAIN_BLOCK_FAIL'; diff --git a/app/javascript/mastodon/actions/interactions.js b/app/javascript/mastodon/actions/interactions.js index b296a5006ac..cf7839848a4 100644 --- a/app/javascript/mastodon/actions/interactions.js +++ b/app/javascript/mastodon/actions/interactions.js @@ -47,7 +47,7 @@ export const UNBOOKMARK_REQUEST = 'UNBOOKMARKED_REQUEST'; export const UNBOOKMARK_SUCCESS = 'UNBOOKMARKED_SUCCESS'; export const UNBOOKMARK_FAIL = 'UNBOOKMARKED_FAIL'; -export * from "./interactions_typed"; +export * from './interactions_typed'; export function favourite(status) { return function (dispatch) { diff --git a/app/javascript/mastodon/actions/notifications.js b/app/javascript/mastodon/actions/notifications.js index 48afb003ad3..f10d218331f 100644 --- a/app/javascript/mastodon/actions/notifications.js +++ b/app/javascript/mastodon/actions/notifications.js @@ -19,11 +19,11 @@ import { } from './importer'; import { submitMarkers } from './markers'; import { decreasePendingNotificationsCount } from './notification_policies'; -import { notificationsUpdate } from "./notifications_typed"; +import { notificationsUpdate } from './notifications_typed'; import { register as registerPushNotifications } from './push_notifications'; import { saveSettings } from './settings'; -export * from "./notifications_typed"; +export * from './notifications_typed'; export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP'; diff --git a/app/javascript/mastodon/actions/timelines.js b/app/javascript/mastodon/actions/timelines.js index f0ea46118e0..5eb37a5550f 100644 --- a/app/javascript/mastodon/actions/timelines.js +++ b/app/javascript/mastodon/actions/timelines.js @@ -158,7 +158,7 @@ export const expandAccountTimeline = (accountId, { maxId, withReplies, t export const expandAccountFeaturedTimeline = (accountId, { tagged } = {}) => expandTimeline(`account:${accountId}:pinned${tagged ? `:${tagged}` : ''}`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true, tagged }); export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 }); export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done); -export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, `/api/v1/timelines/link`, { url, max_id: maxId }, done); +export const expandLinkTimeline = (url, { maxId } = {}, done = noOp) => expandTimeline(`link:${url}`, '/api/v1/timelines/link', { url, max_id: maxId }, done); export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => { return expandTimeline(`hashtag:${hashtag}${local ? ':local' : ''}`, `/api/v1/timelines/tag/${hashtag}`, { max_id: maxId, diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index b5e8dabb7b3..a193e27a4e3 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -25,7 +25,7 @@ import { countableText } from '../util/counter'; import { CharacterCounter } from './character_counter'; import { EditIndicator } from './edit_indicator'; import { NavigationBar } from './navigation_bar'; -import { PollForm } from "./poll_form"; +import { PollForm } from './poll_form'; import { ReplyIndicator } from './reply_indicator'; import { UploadForm } from './upload_form'; diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index e4aad302f65..7a425a99049 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -23,7 +23,7 @@ const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', ' * @returns {string} */ const emojiFilename = (filename, colorScheme) => { - const borderedEmoji = colorScheme === "light" ? lightEmoji : darkEmoji; + const borderedEmoji = colorScheme === 'light' ? lightEmoji : darkEmoji; return borderedEmoji.includes(filename) ? (filename + '_border') : filename; }; @@ -104,7 +104,7 @@ const emojifyTextNode = (node, customEmojis) => { if(isSystemTheme) { let source = document.createElement('source'); source.setAttribute('media', '(prefers-color-scheme: dark)'); - source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, "dark")}.svg`); + source.setAttribute('srcset', `${assetHost}/emoji/${emojiFilename(filename, 'dark')}.svg`); replacement.appendChild(source); } @@ -114,10 +114,10 @@ const emojifyTextNode = (node, customEmojis) => { img.setAttribute('alt', unicode_emoji); img.setAttribute('title', title); - let theme = "light"; + let theme = 'light'; if(!isSystemTheme && !document.body?.classList.contains('theme-mastodon-light')) - theme = "dark"; + theme = 'dark'; img.setAttribute('src', `${assetHost}/emoji/${emojiFilename(filename, theme)}.svg`); replacement.appendChild(img); diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx index ee1fbe0f8fe..2ce7fa9ccea 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -158,7 +158,7 @@ export default class Card extends PureComponent { }; if (largeImage && card.get('type') === 'video') { - thumbnailStyle.aspectRatio = `16 / 9`; + thumbnailStyle.aspectRatio = '16 / 9'; } else if (largeImage) { thumbnailStyle.aspectRatio = '1.91 / 1'; } else { diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index 2648923bfc4..7b28dcaac30 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -121,7 +121,7 @@ class NavigationPanel extends Component { if(transientSingleColumn) banner = (
{intl.formatMessage(messages.openedInClassicInterface)} - {" "} + {' '} {intl.formatMessage(messages.advancedInterface)} diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js index 60b35cb31ac..fb694a0de9a 100644 --- a/app/javascript/mastodon/initial_state.js +++ b/app/javascript/mastodon/initial_state.js @@ -68,7 +68,7 @@ const element = document.getElementById('initial-state'); const initialState = element?.textContent && JSON.parse(element.textContent); /** @type {string} */ -const initialPath = document.querySelector("head meta[name=initialPath]")?.getAttribute("content") ?? ''; +const initialPath = document.querySelector('head meta[name=initialPath]')?.getAttribute('content') ?? ''; /** @type {boolean} */ export const hasMultiColumnPath = initialPath === '/' || initialPath === '/getting-started' diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index bd9b53919c3..f43ab76cb83 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -5,7 +5,7 @@ import { toServerSideType } from 'mastodon/utils/filters'; import { me } from '../initial_state'; -export { makeGetAccount } from "./accounts"; +export { makeGetAccount } from './accounts'; const getFilters = (state, { contextType }) => { if (!contextType) return null; diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js index 40d69136a84..048e743bee7 100644 --- a/app/javascript/mastodon/stream.js +++ b/app/javascript/mastodon/stream.js @@ -150,7 +150,7 @@ export const connectStream = (channelName, params, callbacks) => (dispatch, getS const accessToken = getAccessToken(); const { onConnect, onReceive, onDisconnect } = callbacks(dispatch, getState); - if(!accessToken) throw new Error("Trying to connect to the streaming server but no access token is available."); + if(!accessToken) throw new Error('Trying to connect to the streaming server but no access token is available.'); // If we cannot use a websockets connection, we must fall back // to using individual connections for each channel diff --git a/babel.config.js b/babel.config.js index 4c2fe5682bb..8c9d9f11430 100644 --- a/babel.config.js +++ b/babel.config.js @@ -7,8 +7,8 @@ module.exports = (api) => { }; const envOptions = { - useBuiltIns: "usage", - corejs: { version: "3.30" }, + useBuiltIns: 'usage', + corejs: { version: '3.30' }, debug: false, include: [ 'transform-numeric-separator', diff --git a/config/formatjs-formatter.js b/config/formatjs-formatter.js index adb5e82ef73..f6360a4bc00 100644 --- a/config/formatjs-formatter.js +++ b/config/formatjs-formatter.js @@ -1,6 +1,6 @@ const path = require('path'); -const currentTranslations = require(path.join(__dirname, "../app/javascript/mastodon/locales/en.json")); +const currentTranslations = require(path.join(__dirname, '../app/javascript/mastodon/locales/en.json')); exports.format = (msgs) => { const results = {}; diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 8e77a840a51..0470aa8ff96 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -97,7 +97,7 @@ module.exports = { 'node_modules', ], alias: { - "@": resolve(settings.source_path), + '@': resolve(settings.source_path), } }, diff --git a/streaming/errors.js b/streaming/errors.js index 6c44d2cb8f3..164826238d9 100644 --- a/streaming/errors.js +++ b/streaming/errors.js @@ -29,7 +29,7 @@ export class RequestError extends Error { */ constructor(message) { super(message); - this.name = "RequestError"; + this.name = 'RequestError'; this.status = 400; } } @@ -40,7 +40,7 @@ export class AuthenticationError extends Error { */ constructor(message) { super(message); - this.name = "AuthenticationError"; + this.name = 'AuthenticationError'; this.status = 401; } } diff --git a/streaming/index.js b/streaming/index.js index dd9ea0c7f68..cafe97cccfe 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -91,7 +91,7 @@ const parseJSON = (json, req) => { req.log.error({ err }, `Error parsing message from ${req.remoteAddress}`); } } else { - logger.error({ err }, `Error parsing message from redis`); + logger.error({ err }, 'Error parsing message from redis'); } return null; } @@ -292,7 +292,7 @@ const startServer = async () => { const wss = new WebSocketServer({ noServer: true }); // Set the X-Request-Id header on WebSockets: - wss.on("headers", function onHeaders(headers, req) { + wss.on('headers', function onHeaders(headers, req) { headers.push(`X-Request-Id: ${req.id}`); }); @@ -312,7 +312,7 @@ const startServer = async () => { // logger. This decorates the `request` object. attachWebsocketHttpLogger(request); - request.log.info("HTTP Upgrade Requested"); + request.log.info('HTTP Upgrade Requested'); /** @param {Error} err */ const onSocketError = (err) => { @@ -365,7 +365,7 @@ const startServer = async () => { socket.removeListener('error', onSocketError); wss.handleUpgrade(request, socket, head, function done(ws) { - request.log.info("Authenticated request & upgraded to WebSocket connection"); + request.log.info('Authenticated request & upgraded to WebSocket connection'); const wsLogger = createWebsocketLogger(request, resolvedAccount); @@ -454,7 +454,7 @@ const startServer = async () => { callbacks.forEach(callback => callback(json)); }; - redisSubscribeClient.on("message", onRedisMessage); + redisSubscribeClient.on('message', onRedisMessage); /** * @callback SubscriptionListener @@ -776,7 +776,7 @@ const startServer = async () => { * @returns {SubscriptionListener} */ const streamFrom = (channelIds, req, log, output, attachCloseHandler, destinationType, needsFiltering = false) => { - log.info({ channelIds }, `Starting stream`); + log.info({ channelIds }, 'Starting stream'); /** * @param {string} event @@ -883,7 +883,7 @@ const startServer = async () => { // If the payload already contains the `filtered` property, it means // that filtering has been applied on the ruby on rails side, as // such, we don't need to construct or apply the filters in streaming: - if (Object.hasOwn(payload, "filtered")) { + if (Object.hasOwn(payload, 'filtered')) { transmit(event, payload); return; } @@ -1039,7 +1039,7 @@ const startServer = async () => { const heartbeat = setInterval(() => res.write(':thump\n'), 15000); req.on('close', () => { - req.log.info({ accountId: req.accountId }, `Ending stream`); + req.log.info({ accountId: req.accountId }, 'Ending stream'); // We decrement these counters here instead of in streamHttpEnd as in that // method we don't have knowledge of the channel names @@ -1092,7 +1092,7 @@ const startServer = async () => { ws.send(message, (/** @type {Error|undefined} */ err) => { if (err) { - req.log.error({err}, `Failed to send to websocket`); + req.log.error({err}, 'Failed to send to websocket'); } }); }; @@ -1347,7 +1347,7 @@ const startServer = async () => { * @param {string[]} channelIds */ const removeSubscription = ({ request, logger, subscriptions }, channelIds) => { - logger.info({ channelIds, accountId: request.accountId }, `Ending stream`); + logger.info({ channelIds, accountId: request.accountId }, 'Ending stream'); const subscription = subscriptions[channelIds.join(';')]; @@ -1382,7 +1382,7 @@ const startServer = async () => { // If we have a socket that is alive and open still, send the error back to the client: if (websocket.isAlive && websocket.readyState === websocket.OPEN) { // TODO: Use a better error response here - websocket.send(JSON.stringify({ error: "Error unsubscribing from channel" })); + websocket.send(JSON.stringify({ error: 'Error unsubscribing from channel' })); } }); }; diff --git a/streaming/logging.js b/streaming/logging.js index e1c552c22ed..a6d018df74e 100644 --- a/streaming/logging.js +++ b/streaming/logging.js @@ -37,7 +37,7 @@ function sanitizeRequestLog(req) { } export const logger = pino({ - name: "streaming", + name: 'streaming', // Reformat the log level to a string: formatters: { level: (label) => {