diff --git a/packages/skin-database/.eslintrc.js b/packages/skin-database/.eslintrc.js index ca0786ad..44d88449 100644 --- a/packages/skin-database/.eslintrc.js +++ b/packages/skin-database/.eslintrc.js @@ -10,19 +10,8 @@ module.exports = { "@typescript-eslint/no-namespace": "off", // Override the base no-shadow rule since it conflicts with TypeScript "no-shadow": "off", - // Relax rules for this project's existing style + // camelcase has too many violations (333) to fix now camelcase: "off", - "dot-notation": "off", - eqeqeq: "off", - "no-undef-init": "off", - "no-return-await": "off", - "prefer-arrow-callback": "off", - "no-div-regex": "off", - "guard-for-in": "off", - "prefer-template": "off", - "no-else-return": "off", - "prefer-const": "off", - "new-cap": "off", }, ignorePatterns: ["dist/**"], }; diff --git a/packages/skin-database/api/graphql/index.ts b/packages/skin-database/api/graphql/index.ts index f6f43393..33e3edef 100644 --- a/packages/skin-database/api/graphql/index.ts +++ b/packages/skin-database/api/graphql/index.ts @@ -13,6 +13,7 @@ export function getUserContext(ctx: Ctx): UserContext { return ctx.ctx; } +// eslint-disable-next-line new-cap -- Express Router uses this pattern const router = Router(); const yoga = createYoga({ diff --git a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts index ae879bd2..948e23ff 100644 --- a/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ClassicSkinResolver.ts @@ -26,7 +26,7 @@ export default class ClassicSkinResolver implements NodeResolver, ISkin { async filename(normalize_extension?: boolean): Promise { const filename = await this._model.getFileName(); if (normalize_extension) { - return path.parse(filename).name + ".wsz"; + return `${path.parse(filename).name}.wsz`; } return filename; } diff --git a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts index 910d2a2a..f1a1da0e 100644 --- a/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/ModernSkinResolver.ts @@ -25,7 +25,7 @@ export default class ModernSkinResolver implements NodeResolver, ISkin { async filename(normalize_extension: boolean): Promise { const filename = await this._model.getFileName(); if (normalize_extension) { - return path.parse(filename).name + ".wal"; + return `${path.parse(filename).name}.wal`; } return filename; } diff --git a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts index 784af828..3a4dec7d 100644 --- a/packages/skin-database/api/graphql/resolvers/SkinResolver.ts +++ b/packages/skin-database/api/graphql/resolvers/SkinResolver.ts @@ -21,9 +21,8 @@ export default class SkinResolver { static fromModel(model: SkinModel): ISkin { if (model.getSkinType() === "MODERN") { return new ModernSkinResolver(model); - } else { - return new ClassicSkinResolver(model); } + return new ClassicSkinResolver(model); } } diff --git a/packages/skin-database/app/(modern)/scroll/getClientSkins.ts b/packages/skin-database/app/(modern)/scroll/getClientSkins.ts index e39a1540..ebf2de3f 100644 --- a/packages/skin-database/app/(modern)/scroll/getClientSkins.ts +++ b/packages/skin-database/app/(modern)/scroll/getClientSkins.ts @@ -13,7 +13,7 @@ export async function getClientSkins(sessionId: string): Promise { const page = await getScrollPage(sessionId); - return await Promise.all( + return Promise.all( page.map(async (item) => { return getSkinForSession(ctx, sessionId, item.md5); }) diff --git a/packages/skin-database/app/(modern)/scroll/useScrollHint.ts b/packages/skin-database/app/(modern)/scroll/useScrollHint.ts index f16abf7b..bd5e0f9b 100644 --- a/packages/skin-database/app/(modern)/scroll/useScrollHint.ts +++ b/packages/skin-database/app/(modern)/scroll/useScrollHint.ts @@ -52,9 +52,8 @@ export function useScrollHint({ return n1 * (t -= 1.5 / d1) * t + 0.75; } else if (t < 2.5 / d1) { return n1 * (t -= 2.25 / d1) * t + 0.9375; - } else { - return n1 * (t -= 2.625 / d1) * t + 0.984375; } + return n1 * (t -= 2.625 / d1) * t + 0.984375; }; // Create a bounce effect: scroll down quickly, then bounce back diff --git a/packages/skin-database/data/KeyValue.ts b/packages/skin-database/data/KeyValue.ts index 0645555c..d805ae73 100644 --- a/packages/skin-database/data/KeyValue.ts +++ b/packages/skin-database/data/KeyValue.ts @@ -15,10 +15,9 @@ export default class KeyValue { .count({ count: "*" }) .first()) as { count: number }; if (count) { - return await KeyValue.update(key, value); - } else { - return await KeyValue.insert(key, value); + return KeyValue.update(key, value); } + return KeyValue.insert(key, value); } static async update(key: string, value: any): Promise { diff --git a/packages/skin-database/data/SkinModel.ts b/packages/skin-database/data/SkinModel.ts index 4cab1479..8a6a0633 100644 --- a/packages/skin-database/data/SkinModel.ts +++ b/packages/skin-database/data/SkinModel.ts @@ -242,23 +242,22 @@ export default class SkinModel { this.getMd5() + ext ); return fs.readFile(skinPath); - } else { - const response = await fetch(this.getSkinUrl()); - if (!response.ok) { - const missingModernSkins = - (await KeyValue.get("missingModernSkins")) ?? []; - const missingModernSkinsSet = new Set(missingModernSkins); - missingModernSkinsSet.add(this.getMd5()); - await KeyValue.set( - "missingModernSkins", - Array.from(missingModernSkinsSet) - ); - throw new Error( - `Could not fetch skin at "${this.getSkinUrl()}" (Marked in missingModernSkins in the KeyValue store)` - ); - } - return response.buffer(); } + const response = await fetch(this.getSkinUrl()); + if (!response.ok) { + const missingModernSkins = + (await KeyValue.get("missingModernSkins")) ?? []; + const missingModernSkinsSet = new Set(missingModernSkins); + missingModernSkinsSet.add(this.getMd5()); + await KeyValue.set( + "missingModernSkins", + Array.from(missingModernSkinsSet) + ); + throw new Error( + `Could not fetch skin at "${this.getSkinUrl()}" (Marked in missingModernSkins in the KeyValue store)` + ); + } + return response.buffer(); }); getScreenshotBuffer = mem(async (): Promise => { @@ -385,10 +384,9 @@ export default class SkinModel { } async hasGeneral(): Promise { - return ( - (await this._hasSpriteSheet("GEN")) && - (await this._hasSpriteSheet("GENEX")) - ); + const hasGen = await this._hasSpriteSheet("GEN"); + const hasGenEx = await this._hasSpriteSheet("GENEX"); + return hasGen && hasGenEx; } async getAlgoliaIndexUpdates(limit?: number): Promise { diff --git a/packages/skin-database/db.ts b/packages/skin-database/db.ts index 5c9f8b21..fe29e6ab 100644 --- a/packages/skin-database/db.ts +++ b/packages/skin-database/db.ts @@ -2,4 +2,5 @@ import Knex from "knex"; import * as knexConfigs from "./knexfile"; import { NODE_ENV } from "./config"; +// eslint-disable-next-line new-cap -- Knex uses this pattern export const knex = Knex(knexConfigs[NODE_ENV ?? "test"]); diff --git a/packages/skin-database/discord-bot/commands/debug.ts b/packages/skin-database/discord-bot/commands/debug.ts index 21834e1a..2be4c3c8 100644 --- a/packages/skin-database/discord-bot/commands/debug.ts +++ b/packages/skin-database/discord-bot/commands/debug.ts @@ -20,7 +20,7 @@ async function handler(message: Message, args: [string]) { const jsonString = JSON.stringify(data, null, 2); for (let i = 0; i < jsonString.length; i += pageSize) { await message.channel.send( - "```" + jsonString.slice(i, i + pageSize) + "```" + `\`\`\`${jsonString.slice(i, i + pageSize)}\`\`\`` ); } } diff --git a/packages/skin-database/legacy-client/src/Feedback.js b/packages/skin-database/legacy-client/src/Feedback.js index 4c635c77..40b717c8 100644 --- a/packages/skin-database/legacy-client/src/Feedback.js +++ b/packages/skin-database/legacy-client/src/Feedback.js @@ -26,7 +26,7 @@ export default function Feedback() { alert("Please add a message before sending."); return; } - const body = { message, email, url: "https://skins.webamp.org" + url }; + const body = { message, email, url: `https://skins.webamp.org${url}` }; setSending(true); await sendFeedback(body); diff --git a/packages/skin-database/legacy-client/src/ReviewPage.js b/packages/skin-database/legacy-client/src/ReviewPage.js index c567f2d2..1017ba0b 100644 --- a/packages/skin-database/legacy-client/src/ReviewPage.js +++ b/packages/skin-database/legacy-client/src/ReviewPage.js @@ -25,9 +25,8 @@ async function getSkinToReview() { const data = await Utils.fetchGraphql(mutation); if (data.me.username) { return data.skin_to_review; - } else { - window.location = `${API_URL}/auth`; } + window.location = `${API_URL}/auth`; } function useQueuedSkin() { diff --git a/packages/skin-database/legacy-client/src/components/DownloadText.js b/packages/skin-database/legacy-client/src/components/DownloadText.js index d966ac77..8b1492b3 100644 --- a/packages/skin-database/legacy-client/src/components/DownloadText.js +++ b/packages/skin-database/legacy-client/src/components/DownloadText.js @@ -3,7 +3,7 @@ import React, { useLayoutEffect, useState } from "react"; function DownloadText({ text, children, ...restProps }) { const [url, setUrl] = useState(null); useLayoutEffect(() => { - let blob = new Blob([text], { + const blob = new Blob([text], { type: "text/plain;charset=utf-8", }); const url = URL.createObjectURL(blob); diff --git a/packages/skin-database/legacy-client/src/components/Skin.js b/packages/skin-database/legacy-client/src/components/Skin.js index 2201062a..5b92967b 100644 --- a/packages/skin-database/legacy-client/src/components/Skin.js +++ b/packages/skin-database/legacy-client/src/components/Skin.js @@ -31,9 +31,8 @@ function Skin({ e.preventDefault(); doesNotConcentToNsfw(); return; - } else { - consentsToNsfw(); } + consentsToNsfw(); } if (Utils.eventIsLinkClick(e)) { e.preventDefault(); diff --git a/packages/skin-database/legacy-client/src/debug/DebugFile.js b/packages/skin-database/legacy-client/src/debug/DebugFile.js index 41866ac3..fd4b4317 100644 --- a/packages/skin-database/legacy-client/src/debug/DebugFile.js +++ b/packages/skin-database/legacy-client/src/debug/DebugFile.js @@ -30,7 +30,7 @@ export function PreviewFile({ file }) { (Hover in the box to see .cur preview)
= file.size ? file.size : start + chunkSize; fileReader.readAsArrayBuffer(blobSlice.call(file, start, end)); diff --git a/packages/skin-database/legacy-client/src/hooks.js b/packages/skin-database/legacy-client/src/hooks.js index beccc48f..ec2acf24 100644 --- a/packages/skin-database/legacy-client/src/hooks.js +++ b/packages/skin-database/legacy-client/src/hooks.js @@ -89,9 +89,8 @@ export function useWebampAnimation({ initialPosition }) { transitionBeginEvents.next(null); }); return () => subscription.unsubscribe(); - } else { - transitionBeginEvents.next(null); } + transitionBeginEvents.next(null); }, [initialPosition, setCentered, transitionBeginEvents]); const handleWebampLoaded = useCallback(() => { diff --git a/packages/skin-database/legacy-client/src/redux/epics.js b/packages/skin-database/legacy-client/src/redux/epics.js index b3e9f803..316de99b 100644 --- a/packages/skin-database/legacy-client/src/redux/epics.js +++ b/packages/skin-database/legacy-client/src/redux/epics.js @@ -452,7 +452,7 @@ const urlEpic = (actions, state) => { // There are some params that we want to preserve across reloads. for (const key of ["rest", "vps"]) { - let current = currentParams.get(key); + const current = currentParams.get(key); if (current == null) { proposedUrl.searchParams.delete(key); } else { diff --git a/packages/skin-database/legacy-client/src/upload/UploadGrid.js b/packages/skin-database/legacy-client/src/upload/UploadGrid.js index 71835e15..1845a423 100644 --- a/packages/skin-database/legacy-client/src/upload/UploadGrid.js +++ b/packages/skin-database/legacy-client/src/upload/UploadGrid.js @@ -77,9 +77,8 @@ function Inner({ files }) { upload ); - } else { - return `Thanks for your contribution!`; } + return `Thanks for your contribution!`; } return `No missing skins found`; }; diff --git a/packages/skin-database/legacy-client/src/utils.js b/packages/skin-database/legacy-client/src/utils.js index 9f52cd78..707f97c1 100644 --- a/packages/skin-database/legacy-client/src/utils.js +++ b/packages/skin-database/legacy-client/src/utils.js @@ -13,7 +13,7 @@ export function museumUrlFromHash(hash) { } export function getWindowSize() { - let w = window, + const w = window, d = document, e = d.documentElement, g = d.getElementsByTagName("body")[0], diff --git a/packages/skin-database/migrations/20201119094845_remove_average_color.ts b/packages/skin-database/migrations/20201119094845_remove_average_color.ts index bee4b695..9d71f449 100644 --- a/packages/skin-database/migrations/20201119094845_remove_average_color.ts +++ b/packages/skin-database/migrations/20201119094845_remove_average_color.ts @@ -1,13 +1,13 @@ import * as Knex from "knex"; export async function up(knex: Knex): Promise { - await knex.schema.table("skins", function (table) { + await knex.schema.table("skins", (table) => { table.dropColumn("average_color"); }); } export async function down(knex: Knex): Promise { - await knex.schema.table("skins", function (table) { + await knex.schema.table("skins", (table) => { table.string("average_color"); }); } diff --git a/packages/skin-database/migrations/20201130002421_reviewer_field.ts b/packages/skin-database/migrations/20201130002421_reviewer_field.ts index 40b625c5..367be529 100644 --- a/packages/skin-database/migrations/20201130002421_reviewer_field.ts +++ b/packages/skin-database/migrations/20201130002421_reviewer_field.ts @@ -1,13 +1,13 @@ import * as Knex from "knex"; export async function up(knex: Knex): Promise { - await knex.schema.table("skin_reviews", function (table) { + await knex.schema.table("skin_reviews", (table) => { table.text("reviewer"); }); } export async function down(knex: Knex): Promise { - await knex.schema.table("skin_reviews", function (table) { + await knex.schema.table("skin_reviews", (table) => { table.dropColumn("reviewer"); }); } diff --git a/packages/skin-database/migrations/20201202012156_remove_tweet_url.ts b/packages/skin-database/migrations/20201202012156_remove_tweet_url.ts index 6c93344b..1374477d 100644 --- a/packages/skin-database/migrations/20201202012156_remove_tweet_url.ts +++ b/packages/skin-database/migrations/20201202012156_remove_tweet_url.ts @@ -1,13 +1,13 @@ import * as Knex from "knex"; export async function up(knex: Knex): Promise { - await knex.schema.table("tweets", function (table) { + await knex.schema.table("tweets", (table) => { table.dropColumn("url"); }); } export async function down(knex: Knex): Promise { - await knex.schema.table("tweets", function (table) { + await knex.schema.table("tweets", (table) => { table.text("url"); }); } diff --git a/packages/skin-database/migrations/20210105174314_add_archive_file_timestamp.ts b/packages/skin-database/migrations/20210105174314_add_archive_file_timestamp.ts index 04fbb60c..d35cb3ce 100644 --- a/packages/skin-database/migrations/20210105174314_add_archive_file_timestamp.ts +++ b/packages/skin-database/migrations/20210105174314_add_archive_file_timestamp.ts @@ -1,13 +1,13 @@ import * as Knex from "knex"; export async function up(knex: Knex): Promise { - await knex.schema.table("archive_files", function (table) { + await knex.schema.table("archive_files", (table) => { table.timestamp("file_date"); }); } export async function down(knex: Knex): Promise { - await knex.schema.table("archive_files", function (table) { + await knex.schema.table("archive_files", (table) => { table.dropColumn("file_date"); }); } diff --git a/packages/skin-database/migrations/20210118140710_support_refresh.ts b/packages/skin-database/migrations/20210118140710_support_refresh.ts index b357b5a3..5ae67659 100644 --- a/packages/skin-database/migrations/20210118140710_support_refresh.ts +++ b/packages/skin-database/migrations/20210118140710_support_refresh.ts @@ -1,7 +1,7 @@ import * as Knex from "knex"; export async function up(knex: Knex): Promise { - await knex.schema.createTable("refreshes", function (table) { + await knex.schema.createTable("refreshes", (table) => { table.increments(); table.string("skin_md5").notNullable(); table.string("error"); diff --git a/packages/skin-database/regionParser.ts b/packages/skin-database/regionParser.ts index 9e7b7ee4..28b7c4a8 100644 --- a/packages/skin-database/regionParser.ts +++ b/packages/skin-database/regionParser.ts @@ -68,7 +68,7 @@ const parseIni = (text: string): IniData => { const value = match[2] // Ignore anything after a second `=` // TODO: What if this is inside quotes or escaped? - .replace(/=.*$/g, "") + .replace(/[=].*$/g, "") .trim() // Strip quotes // TODO: What about escaped quotes? diff --git a/packages/skin-database/services/openAi.ts b/packages/skin-database/services/openAi.ts index 7ebaba0c..d8c1c9ba 100644 --- a/packages/skin-database/services/openAi.ts +++ b/packages/skin-database/services/openAi.ts @@ -2,7 +2,7 @@ import SkinModel from "../data/SkinModel.js"; import OpenAI from "openai"; const client = new OpenAI({ - apiKey: process.env["OPENAI_API_KEY"], // This is the default and can be omitted + apiKey: process.env.OPENAI_API_KEY, // This is the default and can be omitted }); const prompt2 = `You are a staff digital preservationist working at the Internet Archive. diff --git a/packages/skin-database/skinHash.ts b/packages/skin-database/skinHash.ts index 3fa8efa4..6ea22e78 100644 --- a/packages/skin-database/skinHash.ts +++ b/packages/skin-database/skinHash.ts @@ -48,7 +48,7 @@ export async function getSkinFileData( skin: SkinModel ): Promise<(FileData | null)[]> { const zip = await skin.getZip(); - return await Promise.all(Object.values(zip.files).map(getFileData)); + return Promise.all(Object.values(zip.files).map(getFileData)); } // https://stackoverflow.com/a/46700791/1263117 diff --git a/packages/skin-database/tasks/mastodon.ts b/packages/skin-database/tasks/mastodon.ts index d2e8d995..6f3d1d80 100644 --- a/packages/skin-database/tasks/mastodon.ts +++ b/packages/skin-database/tasks/mastodon.ts @@ -68,7 +68,7 @@ async function post(md5: string): Promise { } ); - if (resp.statusCode != 200) { + if (resp.statusCode !== 200) { console.log(JSON.stringify(resp, null, 2)); console.log("data", data); throw new Error( diff --git a/packages/skin-database/tasks/scrapeLikes.ts b/packages/skin-database/tasks/scrapeLikes.ts index 7be009cb..a3fe0b3e 100644 --- a/packages/skin-database/tasks/scrapeLikes.ts +++ b/packages/skin-database/tasks/scrapeLikes.ts @@ -26,7 +26,7 @@ type TweetPayload = { }; async function getTweets(twitterClient): Promise { - let max_id: string | undefined = undefined; + let max_id: string | undefined; let tweets: TweetPayload[] = []; let callCount = 0; diff --git a/packages/skin-database/tasks/syncToArchive.ts b/packages/skin-database/tasks/syncToArchive.ts index 0498e73d..9c396948 100644 --- a/packages/skin-database/tasks/syncToArchive.ts +++ b/packages/skin-database/tasks/syncToArchive.ts @@ -59,7 +59,7 @@ export async function uploadScreenshotIfSafe(md5: string): Promise { return false; } const skinFiles = iaItem.getSkinFiles(); - if (skinFiles.length != 1) { + if (skinFiles.length !== 1) { console.warn(`Has ${skinFiles.length} skins`); return false; } diff --git a/packages/skin-database/tasks/tweet.ts b/packages/skin-database/tasks/tweet.ts index 8a436829..872d7699 100644 --- a/packages/skin-database/tasks/tweet.ts +++ b/packages/skin-database/tasks/tweet.ts @@ -33,12 +33,12 @@ export async function tweet( return; } const tweetStatus = await tweetableSkin.getTweetStatus(); - if (tweetStatus == "TWEETED") { + if (tweetStatus === "TWEETED") { // @ts-ignore // await tweetBotChannel.send(`Oops! This skin has alraedy been tweeted.`); // return; } - if (tweetStatus == "REJECTED" || tweetStatus == "NSFW") { + if (tweetStatus === "REJECTED" || tweetStatus === "NSFW") { // @ts-ignore await tweetBotChannel.send(`Oops! Can't tweet a rejected skin.`); return; diff --git a/packages/skin-database/tasks/tweetMilestones.ts b/packages/skin-database/tasks/tweetMilestones.ts index cefb52a8..2e8dd0f4 100644 --- a/packages/skin-database/tasks/tweetMilestones.ts +++ b/packages/skin-database/tasks/tweetMilestones.ts @@ -18,7 +18,7 @@ type TweetPayload = { }; async function getTweets(twitterClient): Promise { - let max_id: string | undefined = undefined; + let max_id: string | undefined; let tweets: TweetPayload[] = []; let callCount = 0;