chore: improve linting (#7244)

This commit is contained in:
Noel
2022-01-11 12:30:08 +01:00
committed by GitHub
parent ff3a8b8323
commit 16938da355
57 changed files with 527 additions and 440 deletions

View File

@@ -7,9 +7,5 @@
"ignorePatterns": ["**/dist/*"],
"env": {
"jest": true
},
"rules": {
"no-redeclare": 0,
"@typescript-eslint/naming-convention": 0
}
}

View File

@@ -1,2 +1,8 @@
# Autogenerated
CHANGELOG.md
.turbo
dist/
docs/**/*
!docs/index.yml
!docs/README.md
coverage/

View File

@@ -41,6 +41,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
.post('/postFile')
.times(5)
.reply(200, (_, body) => ({
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
body: body
.replace(/\r\n/g, '\n')
.replace(/-+\d+-*\n?/g, '')

View File

@@ -21,12 +21,31 @@ const sublimitIntervals = {
const sublimit = { body: { name: 'newname' } };
const noSublimit = { body: { bitrate: 40000 } };
function startSublimitIntervals() {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!sublimitIntervals.reset) {
sublimitResetAfter = Date.now() + 250;
sublimitIntervals.reset = setInterval(() => {
sublimitRequests = 0;
sublimitResetAfter = Date.now() + 250;
}, 250);
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!sublimitIntervals.retry) {
retryAfter = Date.now() + 1000;
sublimitIntervals.retry = setInterval(() => {
sublimitHits = 0;
retryAfter = Date.now() + 1000;
}, 1000);
}
}
nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
.persist()
.replyDate()
.get('/standard')
.times(3)
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
const response = Date.now() >= resetAfter ? 204 : 429;
resetAfter = Date.now() + 250;
if (response === 204) {
@@ -62,8 +81,8 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
];
})
.get('/triggerGlobal')
.reply(function handler(): nock.ReplyFnResult {
return [
.reply(
(): nock.ReplyFnResult => [
204,
{ global: true },
{
@@ -71,12 +90,12 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
'retry-after': '1',
via: '1.1 google',
},
];
})
],
)
.get('/regularRequest')
.reply(204, { test: true })
.patch('/channels/:id', (body) => ['name', 'topic'].some((key) => Reflect.has(body as Record<string, unknown>, key)))
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
sublimitHits += 1;
sublimitRequests += 1;
const response = 2 - sublimitHits >= 0 && 10 - sublimitRequests >= 0 ? 204 : 429;
@@ -113,7 +132,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
.patch('/channels/:id', (body) =>
['name', 'topic'].every((key) => !Reflect.has(body as Record<string, unknown>, key)),
)
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
sublimitRequests += 1;
const response = 10 - sublimitRequests >= 0 ? 204 : 429;
startSublimitIntervals();
@@ -148,7 +167,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
})
.get('/unexpected')
.times(2)
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
if (unexpected429) {
unexpected429 = false;
return [
@@ -164,7 +183,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
})
.get('/unexpected-cf')
.times(2)
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
if (unexpected429cf) {
unexpected429cf = false;
return [
@@ -179,7 +198,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
})
.get('/temp')
.times(2)
.reply(function handler(): nock.ReplyFnResult {
.reply((): nock.ReplyFnResult => {
if (serverOutage) {
serverOutage = false;
return [500];
@@ -345,22 +364,3 @@ test('Reject on RateLimit', async () => {
test('malformedRequest', async () => {
expect(await api.get('/malformedRequest')).toBe(null);
});
function startSublimitIntervals() {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!sublimitIntervals.reset) {
sublimitResetAfter = Date.now() + 250;
sublimitIntervals.reset = setInterval(() => {
sublimitRequests = 0;
sublimitResetAfter = Date.now() + 250;
}, 250);
}
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (!sublimitIntervals.retry) {
retryAfter = Date.now() + 1000;
sublimitIntervals.retry = setInterval(() => {
sublimitHits = 0;
retryAfter = Date.now() + 1000;
}, 1000);
}
}

View File

@@ -5,9 +5,8 @@
"scripts": {
"build": "tsup && tsc --emitDeclarationOnly --incremental",
"test": "jest --pass-with-no-tests --collect-coverage",
"lint": "eslint src __tests__ --ext mjs,js,ts",
"lint:fix": "eslint src __tests__ --ext mjs,js,ts --fix",
"format": "prettier --write .",
"lint": "prettier --check . && eslint src __tests__ --ext mjs,js,ts",
"format": "prettier --write . && eslint src __tests__ --ext mjs,js,ts --fix",
"prepublishOnly": "yarn build && yarn lint && yarn test",
"changelog": "git cliff --prepend ./CHANGELOG.md -l -c ../../cliff.toml -r ../../ --include-path './*'"
},
@@ -60,16 +59,16 @@
"devDependencies": {
"@babel/core": "^7.16.7",
"@babel/plugin-proposal-decorators": "^7.16.7",
"@babel/preset-env": "^7.16.7",
"@babel/preset-env": "^7.16.8",
"@babel/preset-typescript": "^7.16.7",
"@types/jest": "^27.4.0",
"@types/node-fetch": "^2.5.10",
"@typescript-eslint/eslint-plugin": "^5.9.0",
"@typescript-eslint/parser": "^5.9.0",
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"babel-plugin-const-enum": "^1.2.0",
"babel-plugin-transform-typescript-metadata": "^0.3.2",
"eslint": "^8.5.0",
"eslint-config-marine": "^9.1.0",
"eslint-config-marine": "^9.3.2",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "^27.4.7",

View File

@@ -171,20 +171,20 @@ export interface RestEvents {
}
export interface REST {
on<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
on<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
on: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
once<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
once<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
once: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
emit<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]): boolean;
emit<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]): boolean;
emit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);
off<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
off<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
off: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
removeAllListeners<K extends keyof RestEvents>(event?: K): this;
removeAllListeners<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>): this;
removeAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &
(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);
}
export class REST extends EventEmitter {

View File

@@ -126,20 +126,20 @@ export interface RouteData {
}
export interface RequestManager {
on<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
on<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
on: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
once<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
once<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
once: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
emit<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]): boolean;
emit<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]): boolean;
emit: (<K extends keyof RestEvents>(event: K, ...args: RestEvents[K]) => boolean) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, ...args: any[]) => boolean);
off<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void): this;
off<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void): this;
off: (<K extends keyof RestEvents>(event: K, listener: (...args: RestEvents[K]) => void) => this) &
(<S extends string | symbol>(event: Exclude<S, keyof RestEvents>, listener: (...args: any[]) => void) => this);
removeAllListeners<K extends keyof RestEvents>(event?: K): this;
removeAllListeners<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>): this;
removeAllListeners: (<K extends keyof RestEvents>(event?: K) => this) &
(<S extends string | symbol>(event?: Exclude<S, keyof RestEvents>) => this);
}
/**

View File

@@ -2,10 +2,10 @@ import type { RequestInit } from 'node-fetch';
import type { InternalRequest, RouteData } from '../RequestManager';
export interface IHandler {
queueRequest(
queueRequest: (
routeId: RouteData,
url: string,
options: RequestInit,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
): Promise<unknown>;
) => Promise<unknown>;
}

View File

@@ -304,11 +304,12 @@ export class SequentialHandler {
try {
// node-fetch typings are a bit weird, so we have to cast to any to get the correct signature
// Type 'AbortSignal' is not assignable to type 'import("discord.js-modules/node_modules/@types/node-fetch/externals").AbortSignal'
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
res = await fetch(url, { ...options, signal: controller.signal as any });
} catch (error: unknown) {
// Retry the specified number of times for possible timed out requests
if (error instanceof Error && error.name === 'AbortError' && retries !== this.manager.options.retries) {
return this.runRequest(routeId, url, options, bodyData, ++retries);
return await this.runRequest(routeId, url, options, bodyData, ++retries);
}
throw error;

View File

@@ -1,9 +1,9 @@
import { APIVersion } from 'discord-api-types/v9';
import type { RESTOptions } from '../REST';
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports
// eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
const Package = require('../../../package.json');
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access
export const DefaultUserAgent = `DiscordBot (${Package.homepage}, ${Package.version})`;
export const DefaultRestOptions: Required<RESTOptions> = {