From e492db660b56801fabf3f8dcc657e34c4ab195ba Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 1 Jul 2026 16:51:39 +0000 Subject: [PATCH] Fix oxlint errors in QP Discord notification files - Use import type for database (type-only usage) - Replace non-null assertions with type casts (qualifyingPointsAwarded as string) and optional chaining (?.ownerId, league narrowing via explicit check) - Eliminate Map.get()! after set() with if/else bucket pattern Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01NnJP1NTYXHxL2kbE4fZaD6 --- app/models/cs2-major-stage.ts | 2 +- .../qualifying-points-discord.server.ts | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/models/cs2-major-stage.ts b/app/models/cs2-major-stage.ts index ea80faf..9de7bb0 100644 --- a/app/models/cs2-major-stage.ts +++ b/app/models/cs2-major-stage.ts @@ -448,7 +448,7 @@ export async function assignCs2EliminationQP( const existingQPBySPId = new Map( existingRows .filter((r) => r.qualifyingPointsAwarded !== null) - .map((r) => [r.seasonParticipantId, parseFloat(r.qualifyingPointsAwarded!)]) + .map((r) => [r.seasonParticipantId, parseFloat(r.qualifyingPointsAwarded as string)]) ); await writeEventResultsQP(scoringEventId, sportsSeasonId, resultsByParticipant, db); diff --git a/app/services/qualifying-points-discord.server.ts b/app/services/qualifying-points-discord.server.ts index 9cc1a71..b1d8144 100644 --- a/app/services/qualifying-points-discord.server.ts +++ b/app/services/qualifying-points-discord.server.ts @@ -1,4 +1,4 @@ -import { database } from "~/database/context"; +import type { database } from "~/database/context"; import * as schema from "~/database/schema"; import { eq, inArray } from "drizzle-orm"; import { findDiscordIdsByUserIds } from "~/models/account"; @@ -40,7 +40,7 @@ export async function notifyQualifyingPointsUpdate( eventResultRows .filter((r) => r.qualifyingPointsAwarded !== null) .filter((r) => !participantIdFilter || participantIdFilter.has(r.seasonParticipantId)) - .map((r) => [r.seasonParticipantId, parseFloat(r.qualifyingPointsAwarded!)]) + .map((r) => [r.seasonParticipantId, parseFloat(r.qualifyingPointsAwarded as string)]) ); if (qpEarnedById.size === 0) return; @@ -69,8 +69,12 @@ export async function notifyQualifyingPointsUpdate( }); const picksBySeasonId = new Map(); for (const pick of allPicks) { - if (!picksBySeasonId.has(pick.seasonId)) picksBySeasonId.set(pick.seasonId, []); - picksBySeasonId.get(pick.seasonId)!.push(pick); + const bucket = picksBySeasonId.get(pick.seasonId); + if (bucket) { + bucket.push(pick); + } else { + picksBySeasonId.set(pick.seasonId, [pick]); + } } // Batch-fetch participant display names once (same participants across all leagues) @@ -99,10 +103,11 @@ export async function notifyQualifyingPointsUpdate( for (const { seasonId } of seasonSports) { const season = seasonMap.get(seasonId); - const webhookUrl = season?.league?.discordWebhookUrl; - if (!webhookUrl) continue; + const league = season?.league; + const webhookUrl = league?.discordWebhookUrl; + if (!webhookUrl || !season || !league) continue; - const seasonName = `${season!.league!.name} ${season!.year}`; + const seasonName = `${league.name} ${season.year}`; const picks = picksBySeasonId.get(seasonId) ?? []; const teamByParticipantId = new Map< @@ -123,8 +128,7 @@ export async function notifyQualifyingPointsUpdate( if (relevantParticipantIds.length === 0) continue; const entries: QPEventEntry[] = relevantParticipantIds.map((participantId) => { - const teamInfo = teamByParticipantId.get(participantId)!; - const ownerId = teamInfo.ownerId; + const ownerId = teamByParticipantId.get(participantId)?.ownerId ?? null; return { participantName: participantNameById.get(participantId) ?? participantId, qpEarned: qpEarnedById.get(participantId) ?? 0,