mirror of
https://github.com/lunaisnotaboy/mastodon.git
synced 2024-12-19 19:56:56 +00:00
[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:
parent
3be4f4266d
commit
18f55567b0
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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';
|
||||||
};
|
};
|
||||||
|
|
|
@ -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}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
|
@ -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'];
|
||||||
|
|
|
@ -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],
|
||||||
);
|
);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
};
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue