From 0f725cf2baff7ead37e71c62d310d8f209a615c7 Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 19 Aug 2026 08:28:57 +0100 Subject: [PATCH] chore: enable lint cleanup rules (#4673) ## Summary Enable small cleanup rules for redundant boolean expressions, object ownership checks, assignments, and object construction. The existing call sites now use the simpler equivalent forms, keeping future code consistent without changing behavior. Base: [#4672](https://github.com/triggerdotdev/trigger.dev/pull/4672) --- .oxlintrc.json | 11 +++++++++++ apps/webapp/app/components/billing/UsageBar.tsx | 2 +- .../app/components/primitives/TreeView/utils.ts | 2 +- apps/webapp/app/hooks/useThemeColor.ts | 3 ++- .../presenters/v3/ApiErrorListPresenter.server.ts | 4 +--- .../v3/ApiWebhookDeliveryPresenter.server.ts | 4 +--- apps/webapp/app/v3/eventRepository/common.server.ts | 2 +- .../app/v3/eventRepository/eventRepository.server.ts | 12 +++++------- .../app/v3/eventRepository/traceExport.server.ts | 2 +- .../v3/services/alerts/createAlertChannel.server.ts | 2 +- apps/webapp/memory-leak-detector.js | 10 ++++++---- internal-packages/run-store/src/PostgresRunStore.ts | 2 +- internal-packages/tsql/src/query/parser.ts | 2 +- packages/cli-v3/src/deploy/buildImage.ts | 8 ++++---- packages/core/src/v3/apiClient/core.ts | 2 +- packages/core/src/v3/workers/populateEnv.ts | 4 ++-- scripts/recover-stuck-runs.ts | 4 ++-- 17 files changed, 42 insertions(+), 34 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index ce90235fe..4b0d1d4ae 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -49,6 +49,11 @@ "react-hooks/rules-of-hooks": "off", "guard-for-in": "error", "symbol-description": "error", + "no-unneeded-ternary": "error", + "prefer-object-has-own": "error", + "no-redeclare": "error", + "no-multi-assign": "error", + "prefer-object-spread": "error", "react/jsx-no-target-blank": "error", "trigger/no-thrown-unawaited-redirect": "error", "trigger-prisma/no-unbounded-list-filter": "error", @@ -75,6 +80,12 @@ "trigger-prisma/no-unbounded-list-filter": "off", "trigger-prisma/no-unbounded-list-filter-in-args-helper": "off" } + }, + { + "files": ["internal-packages/tsql/**"], + "rules": { + "prefer-object-has-own": "off" + } } ] } diff --git a/apps/webapp/app/components/billing/UsageBar.tsx b/apps/webapp/app/components/billing/UsageBar.tsx index fcb637775..6cc5f6f93 100644 --- a/apps/webapp/app/components/billing/UsageBar.tsx +++ b/apps/webapp/app/components/billing/UsageBar.tsx @@ -106,7 +106,7 @@ type LegendProps = { function Legend({ text, value, position, percentage, tooltipContent }: LegendProps) { const flipLegendPositionValue = 80; - const flipLegendPosition = percentage > flipLegendPositionValue ? true : false; + const flipLegendPosition = percentage > flipLegendPositionValue; return (
(tree: FlatTree, state: NodesState) const parent = node.parentId ? acc[node.parentId] : { selected: defaultSelected, expanded: defaultExpanded, visible: true }; - const visible = parent.expanded && parent.visible === true ? true : false; + const visible = parent.expanded && parent.visible === true; acc[node.id] = { ...nodeState, visible }; return acc; diff --git a/apps/webapp/app/hooks/useThemeColor.ts b/apps/webapp/app/hooks/useThemeColor.ts index f088d16b5..4555f6415 100644 --- a/apps/webapp/app/hooks/useThemeColor.ts +++ b/apps/webapp/app/hooks/useThemeColor.ts @@ -7,7 +7,8 @@ import { useEffect, useState } from "react"; */ function toRgb(color: string): string { const canvas = document.createElement("canvas"); - canvas.width = canvas.height = 1; + canvas.width = 1; + canvas.height = 1; const ctx = canvas.getContext("2d"); if (!ctx) return color; ctx.fillStyle = color; diff --git a/apps/webapp/app/presenters/v3/ApiErrorListPresenter.server.ts b/apps/webapp/app/presenters/v3/ApiErrorListPresenter.server.ts index 13d794d65..ee61fd313 100644 --- a/apps/webapp/app/presenters/v3/ApiErrorListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ApiErrorListPresenter.server.ts @@ -48,9 +48,7 @@ export const ApiErrorListSearchParams = z.object({ const statuses = value.split(","); // hasOwnProperty, not `in`: `in` walks the prototype chain, so // `filter[status]=toString` would pass and map to a function. - const invalid = statuses.filter( - (status) => !Object.prototype.hasOwnProperty.call(API_STATUS_TO_DB, status) - ); + const invalid = statuses.filter((status) => !Object.hasOwn(API_STATUS_TO_DB, status)); if (invalid.length > 0) { ctx.addIssue({ diff --git a/apps/webapp/app/presenters/v3/ApiWebhookDeliveryPresenter.server.ts b/apps/webapp/app/presenters/v3/ApiWebhookDeliveryPresenter.server.ts index 7ebde680b..0c6b2d190 100644 --- a/apps/webapp/app/presenters/v3/ApiWebhookDeliveryPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/ApiWebhookDeliveryPresenter.server.ts @@ -55,9 +55,7 @@ export const ApiWebhookDeliveryListSearchParams = z.object({ .transform((value, ctx) => { if (!value) return undefined; const statuses = value.split(","); - const invalid = statuses.filter( - (s) => !Object.prototype.hasOwnProperty.call(API_STATUS_TO_DB, s) - ); + const invalid = statuses.filter((s) => !Object.hasOwn(API_STATUS_TO_DB, s)); if (invalid.length > 0) { ctx.addIssue({ code: z.ZodIssueCode.custom, diff --git a/apps/webapp/app/v3/eventRepository/common.server.ts b/apps/webapp/app/v3/eventRepository/common.server.ts index eb8bf7f23..8f7fef29a 100644 --- a/apps/webapp/app/v3/eventRepository/common.server.ts +++ b/apps/webapp/app/v3/eventRepository/common.server.ts @@ -172,7 +172,7 @@ export function removePrivateProperties( export function isEmptyObject(obj: object) { for (var prop in obj) { - if (Object.prototype.hasOwnProperty.call(obj, prop)) { + if (Object.hasOwn(obj, prop)) { return false; } } diff --git a/apps/webapp/app/v3/eventRepository/eventRepository.server.ts b/apps/webapp/app/v3/eventRepository/eventRepository.server.ts index ea778fb53..4a0dea3f4 100644 --- a/apps/webapp/app/v3/eventRepository/eventRepository.server.ts +++ b/apps/webapp/app/v3/eventRepository/eventRepository.server.ts @@ -1692,13 +1692,11 @@ function parseStyleField(style: Prisma.JsonValue): TaskEventStyle { } if (typeof unsafe === "object") { - return Object.assign( - { - icon: undefined, - variant: undefined, - }, - unsafe - ) as TaskEventStyle; + return { + icon: undefined, + variant: undefined, + ...unsafe, + } as TaskEventStyle; } return {}; diff --git a/apps/webapp/app/v3/eventRepository/traceExport.server.ts b/apps/webapp/app/v3/eventRepository/traceExport.server.ts index cea3dce65..b1aba4e1f 100644 --- a/apps/webapp/app/v3/eventRepository/traceExport.server.ts +++ b/apps/webapp/app/v3/eventRepository/traceExport.server.ts @@ -199,7 +199,7 @@ const FORMATS: Record = { /** Resolve a `?format=` value to a format, defaulting to `log`. */ export function getTraceExportFormat(name: string | null | undefined): TraceExportFormat { - if (name && Object.prototype.hasOwnProperty.call(FORMATS, name)) { + if (name && Object.hasOwn(FORMATS, name)) { return FORMATS[name as TraceExportFormatName]; } return logFormat; diff --git a/apps/webapp/app/v3/services/alerts/createAlertChannel.server.ts b/apps/webapp/app/v3/services/alerts/createAlertChannel.server.ts index c9163667b..50181de07 100644 --- a/apps/webapp/app/v3/services/alerts/createAlertChannel.server.ts +++ b/apps/webapp/app/v3/services/alerts/createAlertChannel.server.ts @@ -104,7 +104,7 @@ export class CreateAlertChannelService extends BaseService { properties: await this.#createProperties(options.channel), enabled: true, deduplicationKey: options.deduplicationKey, - userProvidedDeduplicationKey: options.deduplicationKey ? true : false, + userProvidedDeduplicationKey: Boolean(options.deduplicationKey), environmentTypes, }, }); diff --git a/apps/webapp/memory-leak-detector.js b/apps/webapp/memory-leak-detector.js index fafa55c84..7bec919d1 100644 --- a/apps/webapp/memory-leak-detector.js +++ b/apps/webapp/memory-leak-detector.js @@ -544,6 +544,8 @@ class MemoryLeakDetector { const snapshot3 = this.results.snapshots[2]; // after second load test let analysis = {}; + let heapGrowth; + let heapGrowthPercent; // Handle different snapshot types if ( @@ -592,8 +594,8 @@ class MemoryLeakDetector { }; // Use total growth for recommendations - var heapGrowth = totalGrowth; - var heapGrowthPercent = totalGrowthPercent; + heapGrowth = totalGrowth; + heapGrowthPercent = totalGrowthPercent; } else if (snapshot1.processMemory && snapshot2.processMemory && snapshot3.processMemory) { // Traditional process memory analysis with 3 snapshots const heap1 = snapshot1.processMemory.heapUsed; @@ -632,8 +634,8 @@ class MemoryLeakDetector { snapshots: this.results.snapshots.length, }; - var heapGrowth = totalHeapGrowth; - var heapGrowthPercent = (totalHeapGrowth / heap1) * 100; + heapGrowth = totalHeapGrowth; + heapGrowthPercent = (totalHeapGrowth / heap1) * 100; } else { this.log("Mixed or incompatible snapshot types - cannot analyze memory growth", "warn"); analysis = { diff --git a/internal-packages/run-store/src/PostgresRunStore.ts b/internal-packages/run-store/src/PostgresRunStore.ts index d11d51fb2..ec3943cb1 100644 --- a/internal-packages/run-store/src/PostgresRunStore.ts +++ b/internal-packages/run-store/src/PostgresRunStore.ts @@ -1950,7 +1950,7 @@ export class PostgresRunStore implements RunStore { ?.filter((c) => c.index !== undefined) .sort((a, b) => a.index! - b.index!) .map((w) => w.id), - isValid: error ? false : true, + isValid: !error, error, }, include: { checkpoint: true }, diff --git a/internal-packages/tsql/src/query/parser.ts b/internal-packages/tsql/src/query/parser.ts index 38e2689e9..f7c664555 100644 --- a/internal-packages/tsql/src/query/parser.ts +++ b/internal-packages/tsql/src/query/parser.ts @@ -1385,7 +1385,7 @@ export class TSQLParseTreeConverter implements TSQLParserVisitor { } const args: Expression[] = ctx._columnArgList ? this.visitExprList(ctx._columnArgList) : []; - const distinct = ctx.DISTINCT() ? true : false; + const distinct = ctx.DISTINCT() !== undefined; return { expression_type: "call", name, params: parameters, args, distinct }; } diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index 076ef271d..b213a0bc7 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -1158,11 +1158,11 @@ function shouldPush(imageTag: string, push?: boolean) { return false; } case undefined: { - return imageTag.startsWith("localhost") || + return !( + imageTag.startsWith("localhost") || imageTag.startsWith("127.0.0.1") || imageTag.startsWith("0.0.0.0") - ? false - : true; + ); } default: { assertExhaustive(push); @@ -1180,7 +1180,7 @@ function shouldLoad(load?: boolean, push?: boolean) { return false; } case undefined: { - return push ? false : true; + return !push; } default: { assertExhaustive(load); diff --git a/packages/core/src/v3/apiClient/core.ts b/packages/core/src/v3/apiClient/core.ts index a5f7f31bd..23fb5b36f 100644 --- a/packages/core/src/v3/apiClient/core.ts +++ b/packages/core/src/v3/apiClient/core.ts @@ -613,7 +613,7 @@ export function isEmptyObj(obj: object | null | undefined): boolean { // https://eslint.org/docs/latest/rules/no-prototype-builtins export function hasOwn(obj: object, key: string): boolean { - return Object.prototype.hasOwnProperty.call(obj, key); + return Object.hasOwn(obj, key); } // If the requestInit has a header x-trigger-worker = true, then we will do diff --git a/packages/core/src/v3/workers/populateEnv.ts b/packages/core/src/v3/workers/populateEnv.ts index b21673c3f..5ec00c7d9 100644 --- a/packages/core/src/v3/workers/populateEnv.ts +++ b/packages/core/src/v3/workers/populateEnv.ts @@ -39,7 +39,7 @@ export function populateEnv( // Set process.env values for (const key of Object.keys(envObject)) { - if (Object.prototype.hasOwnProperty.call(process.env, key)) { + if (Object.hasOwn(process.env, key)) { if (override) { process.env[key] = envObject[key]; @@ -57,7 +57,7 @@ export function populateEnv( if (previousEnv) { // if there are any keys in previousEnv that are not in envObject, remove them from process.env for (const key of Object.keys(previousEnv)) { - if (!Object.prototype.hasOwnProperty.call(envObject, key)) { + if (!Object.hasOwn(envObject, key)) { delete process.env[key]; } } diff --git a/scripts/recover-stuck-runs.ts b/scripts/recover-stuck-runs.ts index 423e17bc0..6df246826 100755 --- a/scripts/recover-stuck-runs.ts +++ b/scripts/recover-stuck-runs.ts @@ -142,7 +142,7 @@ async function main() { ? { tls: { // If connecting via localhost tunnel to a remote Redis, disable cert verification - rejectUnauthorized: redisReadUrlObj.hostname === "localhost" ? false : true, + rejectUnauthorized: redisReadUrlObj.hostname !== "localhost", }, } : {}), @@ -165,7 +165,7 @@ async function main() { ? { tls: { // If connecting via localhost tunnel to a remote Redis, disable cert verification - rejectUnauthorized: redisWriteUrlObj.hostname === "localhost" ? false : true, + rejectUnauthorized: redisWriteUrlObj.hostname !== "localhost", }, } : {}),