Enable @typescript eslint/prefer nullish coalescing eslint rule (#1420)

## Description:

Fixes #952 
Enabled @typescript-eslint/prefer-nullish-coalescing rule and worked
through every error, introducing ?? and ??= operators or disabling
errors with inline comments where appropriate, to the best of my
ability.

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [x] I have added relevant tests to the test directory
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced
- [x] I understand that submitting code with bugs that could have been
caught through manual testing blocks releases and new features for all
contributors

## Please put your Discord username so you can be contacted if a bug or
regression is found:

g_santos_m
This commit is contained in:
g-santos-m
2025-07-15 05:00:06 +02:00
committed by GitHub
parent ac9a9ec253
commit 31381f67f4
28 changed files with 95 additions and 85 deletions
+4 -4
View File
@@ -37,7 +37,7 @@ export async function archive(gameRecord: GameRecord) {
}
} catch (error) {
log.error(`${gameRecord.info.gameID}: Final archive error: ${error}`, {
message: error?.message || error,
message: error?.message ?? error,
stack: error?.stack,
name: error?.name,
...(error && typeof error === "object" ? error : {}),
@@ -70,7 +70,7 @@ async function archiveAnalyticsToR2(gameRecord: GameRecord) {
log.info(`${info.gameID}: successfully wrote game analytics to R2`);
} catch (error) {
log.error(`${info.gameID}: Error writing game analytics to R2: ${error}`, {
message: error?.message || error,
message: error?.message ?? error,
stack: error?.stack,
name: error?.name,
...(error && typeof error === "object" ? error : {}),
@@ -119,7 +119,7 @@ export async function readGameRecord(
} catch (error) {
// Log the error for monitoring purposes
log.error(`${gameId}: Error reading game record from R2: ${error}`, {
message: error?.message || error,
message: error?.message ?? error,
stack: error?.stack,
name: error?.name,
...(error && typeof error === "object" ? error : {}),
@@ -142,7 +142,7 @@ export async function gameRecordExists(gameId: GameID): Promise<boolean> {
return false;
}
log.error(`${gameId}: Error checking archive existence: ${error}`, {
message: error?.message || error,
message: error?.message ?? error,
stack: error?.stack,
name: error?.name,
...(error && typeof error === "object" ? error : {}),
+2
View File
@@ -162,7 +162,9 @@ export class Cloudflare {
);
const credentials = {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
AccountTag: tokenData.a || this.accountId,
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
TunnelID: tokenData.t || tunnelId,
TunnelName: tunnelName,
TunnelSecret: tokenData.s,
+1 -1
View File
@@ -694,7 +694,7 @@ export class GameServer {
for (const client of this.activeClients) {
if (client.hashes.has(turnNumber)) {
const clientHash = client.hashes.get(turnNumber)!;
counts.set(clientHash, (counts.get(clientHash) || 0) + 1);
counts.set(clientHash, (counts.get(clientHash) ?? 0) + 1);
}
}
+2 -1
View File
@@ -146,8 +146,9 @@ app.get(
"/api/env",
gatekeeper.httpHandler(LimiterType.Get, async (req, res) => {
const envConfig = {
game_env: process.env.GAME_ENV || "prod",
game_env: process.env.GAME_ENV,
};
if (!envConfig.game_env) return res.sendStatus(500);
res.json(envConfig);
}),
);
+6 -2
View File
@@ -29,7 +29,7 @@ import { initWorkerMetrics } from "./WorkerMetrics";
const config = getServerConfigFromServer();
const workerId = parseInt(process.env.WORKER_ID || "0");
const workerId = parseInt(process.env.WORKER_ID ?? "0");
const log = logger.child({ comp: `w_${workerId}` });
// Worker setup
@@ -94,6 +94,7 @@ export function startWorker() {
log.warn(`cannot create game, id not found`);
return res.status(400).json({ error: "Game ID is required" });
}
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const clientIP = req.ip || req.socket.remoteAddress || "unknown";
const result = CreateGameInputSchema.safeParse(req.body);
if (!result.success) {
@@ -140,6 +141,7 @@ export function startWorker() {
return;
}
if (game.isPublic()) {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const clientIP = req.ip || req.socket.remoteAddress || "unknown";
log.info(
`cannot start public game ${game.id}, game is public, ip: ${ipAnonymize(clientIP)}`,
@@ -171,6 +173,7 @@ export function startWorker() {
return res.status(400).json({ error: "Game not found" });
}
if (game.isPublic()) {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const clientIP = req.ip || req.socket.remoteAddress || "unknown";
log.warn(
`cannot update public game ${game.id}, ip: ${ipAnonymize(clientIP)}`,
@@ -296,7 +299,8 @@ export function startWorker() {
const forwarded = req.headers["x-forwarded-for"];
const ip = Array.isArray(forwarded)
? forwarded[0]
: forwarded || req.socket.remoteAddress || "unknown";
: // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
forwarded || req.socket.remoteAddress || "unknown";
try {
// Parse and handle client messages