[Glitch] Upgrade to `typescript-eslint` v6

Port a7253075d1 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
Renaud Chaput 2023-07-13 11:49:16 +02:00 committed by Claire
parent 3be4f4266d
commit 18f55567b0
18 changed files with 45 additions and 36 deletions

View File

@ -86,10 +86,9 @@ const DIGIT_CHARACTERS = [
export const decode83 = (str: string) => { export const decode83 = (str: string) => {
let value = 0; let value = 0;
let c, digit; let digit;
for (let i = 0; i < str.length; i++) { for (const c of str) {
c = str[i];
digit = DIGIT_CHARACTERS.indexOf(c); digit = DIGIT_CHARACTERS.indexOf(c);
value = value * 83 + digit; value = value * 83 + digit;
} }

View File

@ -6,11 +6,11 @@ interface Props {
tag: { tag: {
name: string; name: string;
url?: string; url?: string;
history?: Array<{ history?: {
uses: number; uses: number;
accounts: string; accounts: string;
day: string; day: string;
}>; }[];
following?: boolean; following?: boolean;
type: 'hashtag'; type: 'hashtag';
}; };

View File

@ -82,7 +82,7 @@ export class DisplayName extends React.PureComponent<Props> {
} else if (account) { } else if (account) {
let acct = account.get('acct'); let acct = account.get('acct');
if (acct.indexOf('@') === -1 && localDomain) { if (!acct.includes('@') && localDomain) {
acct = `${acct}@${localDomain}`; acct = `${acct}@${localDomain}`;
} }

View File

@ -29,12 +29,12 @@ export const ShortNumberRenderer: React.FC<ShortNumberProps> = ({
); );
} }
const customRenderer = children || renderer || null; const customRenderer = children ?? renderer ?? null;
const displayNumber = <ShortNumberCounter value={shortNumber} />; const displayNumber = <ShortNumberCounter value={shortNumber} />;
return ( return (
customRenderer?.(displayNumber, pluralReady(value, division)) || customRenderer?.(displayNumber, pluralReady(value, division)) ??
displayNumber displayNumber
); );
}; };

View File

@ -28,9 +28,10 @@ export type SearchData = [
Emoji['unified'], Emoji['unified'],
]; ];
export interface ShortCodesToEmojiData { export type ShortCodesToEmojiData = Record<
[key: ShortCodesToEmojiDataKey]: [FilenameData, SearchData]; ShortCodesToEmojiDataKey,
} [FilenameData, SearchData]
>;
export type EmojisWithoutShortCodes = FilenameData[]; export type EmojisWithoutShortCodes = FilenameData[];
export type EmojiCompressed = [ export type EmojiCompressed = [

View File

@ -9,7 +9,7 @@ import emojiCompressed from './emoji_compressed';
import { unicodeToUnifiedName } from './unicode_to_unified_name'; import { unicodeToUnifiedName } from './unicode_to_unified_name';
type Emojis = { type Emojis = {
[key in keyof ShortCodesToEmojiData]: { [key in NonNullable<keyof ShortCodesToEmojiData>]: {
native: BaseEmoji['native']; native: BaseEmoji['native'];
search: Search; search: Search;
short_names: Emoji['short_names']; short_names: Emoji['short_names'];

View File

@ -19,7 +19,7 @@ export const ColumnSettings: React.FC = () => {
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const onChange = useCallback( const onChange = useCallback(
(key: string, checked: boolean) => { (key: string, checked: boolean) => {
void dispatch(changeSetting(['home', ...key], checked)); dispatch(changeSetting(['home', ...key], checked));
}, },
[dispatch], [dispatch],
); );

View File

@ -3,15 +3,19 @@ export interface LocaleData {
messages: Record<string, string>; messages: Record<string, string>;
} }
let loadedLocale: LocaleData; let loadedLocale: LocaleData | undefined;
export function setLocale(locale: LocaleData) { export function setLocale(locale: LocaleData) {
loadedLocale = locale; loadedLocale = locale;
} }
export function getLocale() { export function getLocale(): LocaleData {
if (!loadedLocale && process.env.NODE_ENV === 'development') { if (!loadedLocale) {
throw new Error('getLocale() called before any locale has been set'); if (process.env.NODE_ENV === 'development') {
throw new Error('getLocale() called before any locale has been set');
} else {
return { locale: 'unknown', messages: {} };
}
} }
return loadedLocale; return loadedLocale;

View File

@ -6,6 +6,7 @@ import { isLocaleLoaded, setLocale } from './global_locale';
const localeLoadingSemaphore = new Semaphore(1); const localeLoadingSemaphore = new Semaphore(1);
export async function loadLocale() { export async function loadLocale() {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- we want to match empty strings
const locale = document.querySelector<HTMLElement>('html')?.lang || 'en'; const locale = document.querySelector<HTMLElement>('html')?.lang || 'en';
// We use a Semaphore here so only one thing can try to load the locales at // We use a Semaphore here so only one thing can try to load the locales at

View File

@ -4,7 +4,7 @@ import 'core-js/features/symbol';
import 'core-js/features/promise/finally'; import 'core-js/features/promise/finally';
import { decode as decodeBase64 } from '../utils/base64'; import { decode as decodeBase64 } from '../utils/base64';
if (!HTMLCanvasElement.prototype.toBlob) { if (!Object.hasOwn(HTMLCanvasElement.prototype, 'toBlob')) {
const BASE64_MARKER = ';base64,'; const BASE64_MARKER = ';base64,';
Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
@ -17,7 +17,7 @@ if (!HTMLCanvasElement.prototype.toBlob) {
const dataURL: string = this.toDataURL(type, quality); const dataURL: string = this.toDataURL(type, quality);
let data; let data;
if (dataURL.indexOf(BASE64_MARKER) >= 0) { if (dataURL.includes(BASE64_MARKER)) {
const [, base64] = dataURL.split(BASE64_MARKER); const [, base64] = dataURL.split(BASE64_MARKER);
data = decodeBase64(base64); data = decodeBase64(base64);
} else { } else {

View File

@ -24,6 +24,7 @@ export function loadPolyfills() {
// Latest version of Firefox and Safari do not have IntersectionObserver. // Latest version of Firefox and Safari do not have IntersectionObserver.
// Edge does not have requestIdleCallback. // Edge does not have requestIdleCallback.
// This avoids shipping them all the polyfills. // This avoids shipping them all the polyfills.
/* eslint-disable @typescript-eslint/no-unnecessary-condition -- those properties might not exist in old browsers, even if they are always here in types */
const needsExtraPolyfills = !( const needsExtraPolyfills = !(
window.AbortController && window.AbortController &&
window.IntersectionObserver && window.IntersectionObserver &&
@ -31,6 +32,7 @@ export function loadPolyfills() {
'isIntersecting' in IntersectionObserverEntry.prototype && 'isIntersecting' in IntersectionObserverEntry.prototype &&
window.requestIdleCallback window.requestIdleCallback
); );
/* eslint-enable @typescript-eslint/no-unnecessary-condition */
return Promise.all([ return Promise.all([
loadIntlPolyfills(), loadIntlPolyfills(),

View File

@ -80,6 +80,7 @@ async function loadIntlPluralRulesPolyfills(locale: string) {
// } // }
export async function loadIntlPolyfills() { export async function loadIntlPolyfills() {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- we want to match empty strings
const locale = document.querySelector('html')?.lang || 'en'; const locale = document.querySelector('html')?.lang || 'en';
// order is important here // order is important here

View File

@ -38,11 +38,13 @@ const scroll = (
const isScrollBehaviorSupported = const isScrollBehaviorSupported =
'scrollBehavior' in document.documentElement.style; 'scrollBehavior' in document.documentElement.style;
export const scrollRight = (node: Element, position: number) => export const scrollRight = (node: Element, position: number) => {
isScrollBehaviorSupported if (isScrollBehaviorSupported)
? node.scrollTo({ left: position, behavior: 'smooth' }) node.scrollTo({ left: position, behavior: 'smooth' });
: scroll(node, 'scrollLeft', position); else scroll(node, 'scrollLeft', position);
export const scrollTop = (node: Element) => };
isScrollBehaviorSupported
? node.scrollTo({ top: 0, behavior: 'smooth' }) export const scrollTop = (node: Element) => {
: scroll(node, 'scrollTop', 0); if (isScrollBehaviorSupported) node.scrollTo({ top: 0, behavior: 'smooth' });
else scroll(node, 'scrollTop', 0);
};

View File

@ -16,7 +16,7 @@ const defaultTypeSuffixes: Config['promiseTypeSuffixes'] = [
export const loadingBarMiddleware = ( export const loadingBarMiddleware = (
config: Config = {}, config: Config = {},
): Middleware<Record<string, never>, RootState> => { ): Middleware<Record<string, never>, RootState> => {
const promiseTypeSuffixes = config.promiseTypeSuffixes || defaultTypeSuffixes; const promiseTypeSuffixes = config.promiseTypeSuffixes ?? defaultTypeSuffixes;
return ({ dispatch }) => return ({ dispatch }) =>
(next) => (next) =>
@ -32,7 +32,7 @@ export const loadingBarMiddleware = (
if (action.type.match(isPending)) { if (action.type.match(isPending)) {
dispatch(showLoading()); dispatch(showLoading());
} else if ( } else if (
action.type.match(isFulfilled) || action.type.match(isFulfilled) ??
action.type.match(isRejected) action.type.match(isRejected)
) { ) {
dispatch(hideLoading()); dispatch(hideLoading());

View File

@ -38,7 +38,7 @@ export const soundsMiddleware = (): Middleware<
Record<string, never>, Record<string, never>,
RootState RootState
> => { > => {
const soundCache: { [key: string]: HTMLAudioElement } = {}; const soundCache: Record<string, HTMLAudioElement> = {};
void ready(() => { void ready(() => {
soundCache.boop = createAudio([ soundCache.boop = createAudio([
@ -56,9 +56,9 @@ export const soundsMiddleware = (): Middleware<
return () => return () =>
(next) => (next) =>
(action: AnyAction & { meta?: { sound?: string } }) => { (action: AnyAction & { meta?: { sound?: string } }) => {
const sound = action?.meta?.sound; const sound = action.meta?.sound;
if (sound && soundCache[sound]) { if (sound && Object.hasOwn(soundCache, sound)) {
play(soundCache[sound]); play(soundCache[sound]);
} }

View File

@ -7,7 +7,7 @@ export const toServerSideType = (columnType: string) => {
case 'account': case 'account':
return columnType; return columnType;
default: default:
if (columnType.indexOf('list:') > -1) { if (columnType.includes('list:')) {
return 'home'; return 'home';
} else { } else {
return 'public'; // community, account, hashtag return 'public'; // community, account, hashtag

View File

@ -55,7 +55,7 @@ export function toShortNumber(sourceNumber: number): ShortNumber {
*/ */
export function pluralReady( export function pluralReady(
sourceNumber: number, sourceNumber: number,
division: DecimalUnits, division: DecimalUnits | null,
): number { ): number {
if (division == null || division < DECIMAL_UNITS.HUNDRED) { if (division == null || division < DECIMAL_UNITS.HUNDRED) {
return sourceNumber; return sourceNumber;

View File

@ -4,6 +4,5 @@ export function uuid(a?: string): string {
(a as unknown as number) ^ (a as unknown as number) ^
((Math.random() * 16) >> ((a as unknown as number) / 4)) ((Math.random() * 16) >> ((a as unknown as number) / 4))
).toString(16) ).toString(16)
: // eslint-disable-next-line @typescript-eslint/restrict-plus-operands : ('' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);
('' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);
} }