From aceb399505df9e01785b51b985c8e1e4bf11f9ed Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 24 Apr 2026 07:06:22 +0700 Subject: [PATCH] chore(lint): prefer-array-find over filter().at/pop Replace filter(pred).at(-1)/pop() patterns with findLast(pred) and filter(pred)[0] with find(pred) across server and app. --- packages/app/e2e/helpers/app.ts | 2 +- packages/app/e2e/helpers/terminal-probes.ts | 3 +-- packages/app/e2e/helpers/workspace-setup.ts | 2 +- packages/app/src/components/workspace-setup-dialog.tsx | 2 +- packages/app/src/panels/file-panel.tsx | 2 +- packages/app/src/screens/new-workspace-screen.tsx | 2 +- .../src/screens/workspace/workspace-desktop-tabs-row.tsx | 2 +- packages/app/src/screens/workspace/workspace-screen.tsx | 2 +- packages/server/src/server/agent/agent-response-loop.ts | 4 +--- packages/server/src/server/agent/tts-manager.test.ts | 2 +- .../server/daemon-e2e/mode-switch-propagation.e2e.test.ts | 6 +++--- packages/server/src/server/workspace-git-service.ts | 4 +--- .../server/src/server/workspace-reconciliation-service.ts | 5 ++--- 13 files changed, 16 insertions(+), 22 deletions(-) diff --git a/packages/app/e2e/helpers/app.ts b/packages/app/e2e/helpers/app.ts index ab4e727d7..5bf4b9926 100644 --- a/packages/app/e2e/helpers/app.ts +++ b/packages/app/e2e/helpers/app.ts @@ -314,7 +314,7 @@ export const setWorkingDirectory = async (page: Page, directory: string) => { if (trimmedDirectory.startsWith("/private/var/")) { directoryCandidates.add(trimmedDirectory.replace(/^\/private/, "")); } - const basename = trimmedDirectory.split("/").filter(Boolean).pop() ?? trimmedDirectory; + const basename = trimmedDirectory.split("/").findLast(Boolean) ?? trimmedDirectory; await expect .poll( diff --git a/packages/app/e2e/helpers/terminal-probes.ts b/packages/app/e2e/helpers/terminal-probes.ts index b1c0705c8..0471abd38 100644 --- a/packages/app/e2e/helpers/terminal-probes.ts +++ b/packages/app/e2e/helpers/terminal-probes.ts @@ -570,8 +570,7 @@ export async function installTerminalKeystrokeStressProbe(page: Page): Promise write.committedAt) - .filter((at): at is number => typeof at === "number") - .at(-1) ?? null, + .findLast((at): at is number => typeof at === "number") ?? null, }; }, }; diff --git a/packages/app/e2e/helpers/workspace-setup.ts b/packages/app/e2e/helpers/workspace-setup.ts index ea94aa1df..d821057bb 100644 --- a/packages/app/e2e/helpers/workspace-setup.ts +++ b/packages/app/e2e/helpers/workspace-setup.ts @@ -116,7 +116,7 @@ export async function seedProjectForWorkspaceSetup( } export function projectNameFromPath(repoPath: string): string { - return repoPath.replace(/\/+$/, "").split("/").filter(Boolean).pop() ?? repoPath; + return repoPath.replace(/\/+$/, "").split("/").findLast(Boolean) ?? repoPath; } export async function openHomeWithProject(page: Page, repoPath: string): Promise { diff --git a/packages/app/src/components/workspace-setup-dialog.tsx b/packages/app/src/components/workspace-setup-dialog.tsx index 82340df1e..8c209cf8d 100644 --- a/packages/app/src/components/workspace-setup-dialog.tsx +++ b/packages/app/src/components/workspace-setup-dialog.tsx @@ -242,7 +242,7 @@ export function WorkspaceSetupDialog() { workspace?.name || workspace?.projectDisplayName || displayName || - sourceDirectory.split(/[\\/]/).filter(Boolean).pop() || + sourceDirectory.split(/[\\/]/).findLast(Boolean) || sourceDirectory; const placeholderLabel = projectIconPlaceholderLabelFromDisplayName(workspaceTitle); diff --git a/packages/app/src/panels/file-panel.tsx b/packages/app/src/panels/file-panel.tsx index 3beeeb265..a9bcf9d71 100644 --- a/packages/app/src/panels/file-panel.tsx +++ b/packages/app/src/panels/file-panel.tsx @@ -14,7 +14,7 @@ const CENTERED_PADDED_STYLE = { } as const; function useFilePanelDescriptor(target: { kind: "file"; path: string }) { - const fileName = target.path.split("/").filter(Boolean).pop() ?? target.path; + const fileName = target.path.split("/").findLast(Boolean) ?? target.path; return { label: fileName, subtitle: target.path, diff --git a/packages/app/src/screens/new-workspace-screen.tsx b/packages/app/src/screens/new-workspace-screen.tsx index 9559859f4..90deee285 100644 --- a/packages/app/src/screens/new-workspace-screen.tsx +++ b/packages/app/src/screens/new-workspace-screen.tsx @@ -457,7 +457,7 @@ export function NewWorkspaceScreen({ workspace?.name || workspace?.projectDisplayName || displayName || - sourceDirectory.split(/[\\/]/).filter(Boolean).pop() || + sourceDirectory.split(/[\\/]/).findLast(Boolean) || sourceDirectory; const addImagesRef = useRef<((images: ImageAttachment[]) => void) | null>(null); diff --git a/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx b/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx index 6a87cf699..48d5f73c2 100644 --- a/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx +++ b/packages/app/src/screens/workspace/workspace-desktop-tabs-row.tsx @@ -161,7 +161,7 @@ function getFallbackTabLabel(tab: WorkspaceTabDescriptor): string { return "Terminal"; } if (tab.target.kind === "file") { - return tab.target.path.split("/").filter(Boolean).pop() ?? tab.target.path; + return tab.target.path.split("/").findLast(Boolean) ?? tab.target.path; } return "Agent"; } diff --git a/packages/app/src/screens/workspace/workspace-screen.tsx b/packages/app/src/screens/workspace/workspace-screen.tsx index f592ef228..aa5f23713 100644 --- a/packages/app/src/screens/workspace/workspace-screen.tsx +++ b/packages/app/src/screens/workspace/workspace-screen.tsx @@ -171,7 +171,7 @@ function getFallbackTabOptionLabel(tab: WorkspaceTabDescriptor): string { return "Terminal"; } if (tab.target.kind === "file") { - return tab.target.path.split("/").filter(Boolean).pop() ?? tab.target.path; + return tab.target.path.split("/").findLast(Boolean) ?? tab.target.path; } return "Agent"; } diff --git a/packages/server/src/server/agent/agent-response-loop.ts b/packages/server/src/server/agent/agent-response-loop.ts index bd58fefc5..f517017c8 100644 --- a/packages/server/src/server/agent/agent-response-loop.ts +++ b/packages/server/src/server/agent/agent-response-loop.ts @@ -352,9 +352,7 @@ export async function generateStructuredAgentResponse( return result.finalText; } // Fallback for providers that may not populate finalText consistently. - const lastAssistant = result.timeline - .filter((item) => item.type === "assistant_message") - .at(-1); + const lastAssistant = result.timeline.findLast((item) => item.type === "assistant_message"); return lastAssistant?.text ?? ""; }; return await getStructuredAgentResponse({ diff --git a/packages/server/src/server/agent/tts-manager.test.ts b/packages/server/src/server/agent/tts-manager.test.ts index 6d2c7a9cf..90cbd6483 100644 --- a/packages/server/src/server/agent/tts-manager.test.ts +++ b/packages/server/src/server/agent/tts-manager.test.ts @@ -43,7 +43,7 @@ describe("TTSManager", () => { const audioMsgs = emitted.filter((m) => m.type === "audio_output"); expect(audioMsgs).toHaveLength(1); - const [audioMessage] = emitted.filter(isAudioOutputMessage); + const audioMessage = emitted.find(isAudioOutputMessage); expect(audioMessage).toBeDefined(); expect(audioMessage?.payload.groupId).toMatch( /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i, diff --git a/packages/server/src/server/daemon-e2e/mode-switch-propagation.e2e.test.ts b/packages/server/src/server/daemon-e2e/mode-switch-propagation.e2e.test.ts index ab7fe2de4..d1acba0e5 100644 --- a/packages/server/src/server/daemon-e2e/mode-switch-propagation.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/mode-switch-propagation.e2e.test.ts @@ -28,9 +28,9 @@ function lastUpsertFor( updates: AgentUpdatePayload[], agentId: string, ): AgentUpsertPayload | undefined { - return updates - .filter((u): u is AgentUpsertPayload => u.kind === "upsert" && u.agent.id === agentId) - .at(-1); + return updates.findLast( + (u): u is AgentUpsertPayload => u.kind === "upsert" && u.agent.id === agentId, + ); } describe("mode-switch update propagation", () => { diff --git a/packages/server/src/server/workspace-git-service.ts b/packages/server/src/server/workspace-git-service.ts index 6cde51460..d085294ca 100644 --- a/packages/server/src/server/workspace-git-service.ts +++ b/packages/server/src/server/workspace-git-service.ts @@ -532,9 +532,7 @@ export class WorkspaceGitServiceImpl implements WorkspaceGitService { ): Promise { const snapshot = await this.getSnapshot(cwd, options); const directoryName = - options?.directoryName ?? - normalizeWorkspaceId(cwd).split(/[\\/]/).filter(Boolean).at(-1) ?? - cwd; + options?.directoryName ?? normalizeWorkspaceId(cwd).split(/[\\/]/).findLast(Boolean) ?? cwd; return buildWorkspaceGitMetadataFromSnapshot({ cwd: normalizeWorkspaceId(cwd), directoryName, diff --git a/packages/server/src/server/workspace-reconciliation-service.ts b/packages/server/src/server/workspace-reconciliation-service.ts index 284fa2674..cbb3676df 100644 --- a/packages/server/src/server/workspace-reconciliation-service.ts +++ b/packages/server/src/server/workspace-reconciliation-service.ts @@ -179,8 +179,7 @@ export class WorkspaceReconciliationService { siblings: PersistedWorkspaceRecord[], changes: ReconciliationChange[], ): Promise { - const directoryName = - project.rootPath.split(/[\\/]/).filter(Boolean).at(-1) ?? project.rootPath; + const directoryName = project.rootPath.split(/[\\/]/).findLast(Boolean) ?? project.rootPath; const currentGit = await this.readWorkspaceGitMetadata(project.rootPath, directoryName); const projectUpdates: Partial< @@ -220,7 +219,7 @@ export class WorkspaceReconciliationService { const existingSiblings = siblings.filter((workspace) => existsSync(workspace.cwd)); await Promise.all( existingSiblings.map(async (workspace) => { - const wsDirName = workspace.cwd.split(/[\\/]/).filter(Boolean).at(-1) ?? workspace.cwd; + const wsDirName = workspace.cwd.split(/[\\/]/).findLast(Boolean) ?? workspace.cwd; const wsGit = await this.readWorkspaceGitMetadata(workspace.cwd, wsDirName); if (wsGit.projectKind === "git" && workspace.displayName !== wsGit.workspaceDisplayName) {