From 65645394e68d274d199b363152b23d41bf2e8e83 Mon Sep 17 00:00:00 2001 From: Gerard-Devlin Date: Fri, 12 Jun 2026 22:34:42 +0800 Subject: [PATCH] refactor(tests): normalize recent project paths and improve readability refactor(proposed-changes-panel): simplify JSX structure for added/removed indicators refactor(pdf-viewer): format function parameters for better readability fix(project-name): enhance validation for project names to prevent invalid characters refactor(build): improve environment flag handling for better clarity refactor(dev): streamline environment flag appending logic --- .../__tests__/stores/project-store.test.ts | 20 +++++++++++-------- .../claude-chat/proposed-changes-panel.tsx | 4 +--- .../workspace/preview/pdf-viewer.tsx | 5 ++++- apps/desktop/src/lib/project-name.ts | 9 ++++++++- scripts/build-desktop.mjs | 4 +++- scripts/dev-desktop.mjs | 4 +++- 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src/__tests__/stores/project-store.test.ts b/apps/desktop/src/__tests__/stores/project-store.test.ts index 12e4301..0e411ae 100644 --- a/apps/desktop/src/__tests__/stores/project-store.test.ts +++ b/apps/desktop/src/__tests__/stores/project-store.test.ts @@ -32,8 +32,12 @@ describe("useProjectStore", () => { it("normalizes trailing separators when deduplicating", () => { const store = useProjectStore.getState(); - store.addRecentProject("C:\\Users\\Devlin\\Documents\\ClaudePrism\\paper\\"); - store.addRecentProject("C:\\Users\\Devlin\\Documents\\ClaudePrism\\paper"); + store.addRecentProject( + "C:\\Users\\Devlin\\Documents\\ClaudePrism\\paper\\", + ); + store.addRecentProject( + "C:\\Users\\Devlin\\Documents\\ClaudePrism\\paper", + ); const { recentProjects } = useProjectStore.getState(); expect(recentProjects).toHaveLength(1); expect(recentProjects[0]).toMatchObject({ @@ -92,12 +96,12 @@ describe("useProjectStore", () => { path: "/work/new", name: "new", }); - expect(recentProjects.some((project) => project.path === "/work/old")).toBe( - false, - ); - expect(recentProjects.some((project) => project.path === "/work/other")).toBe( - true, - ); + expect( + recentProjects.some((project) => project.path === "/work/old"), + ).toBe(false); + expect( + recentProjects.some((project) => project.path === "/work/other"), + ).toBe(true); }); it("matches renamed paths even when the old recent path has a trailing slash", () => { diff --git a/apps/desktop/src/components/claude-chat/proposed-changes-panel.tsx b/apps/desktop/src/components/claude-chat/proposed-changes-panel.tsx index bc10b0c..5f93f45 100644 --- a/apps/desktop/src/components/claude-chat/proposed-changes-panel.tsx +++ b/apps/desktop/src/components/claude-chat/proposed-changes-panel.tsx @@ -62,9 +62,7 @@ export const ProposedChangesPanel: FC = ({ {change.toolName} )} - {added > 0 && ( - +{added} - )} + {added > 0 && +{added}} {removed > 0 && ( -{removed} )} diff --git a/apps/desktop/src/components/workspace/preview/pdf-viewer.tsx b/apps/desktop/src/components/workspace/preview/pdf-viewer.tsx index d2c175f..e7ad67f 100644 --- a/apps/desktop/src/components/workspace/preview/pdf-viewer.tsx +++ b/apps/desktop/src/components/workspace/preview/pdf-viewer.tsx @@ -87,7 +87,10 @@ function clampZoomFactor(factor: number, maxFactor: number): number { return Math.max(1 / maxFactor, Math.min(maxFactor, factor)); } -function getWheelZoomFactor(event: WheelEvent, isTrackpadPinch: boolean): number { +function getWheelZoomFactor( + event: WheelEvent, + isTrackpadPinch: boolean, +): number { if (event.deltaY === 0) return 1; if ( diff --git a/apps/desktop/src/lib/project-name.ts b/apps/desktop/src/lib/project-name.ts index a316c51..c98b128 100644 --- a/apps/desktop/src/lib/project-name.ts +++ b/apps/desktop/src/lib/project-name.ts @@ -8,7 +8,14 @@ export function getProjectNameError(name: string): string | null { if (trimmed === "." || trimmed === "..") { return "Project name cannot be . or .."; } - if (/[\x00-\x1f\\/<>:"|?*]/.test(trimmed) || /[\s.]$/.test(trimmed)) { + const hasControlCharacter = Array.from(trimmed).some( + (char) => char.charCodeAt(0) < 32, + ); + if ( + hasControlCharacter || + /[\\/<>:"|?*]/.test(trimmed) || + /[\s.]$/.test(trimmed) + ) { return "Project name contains characters Windows cannot use"; } return null; diff --git a/scripts/build-desktop.mjs b/scripts/build-desktop.mjs index 754d741..d211aa4 100644 --- a/scripts/build-desktop.mjs +++ b/scripts/build-desktop.mjs @@ -5,7 +5,9 @@ const env = { ...process.env }; function appendEnvFlag(name, flag) { const current = env[name] ?? ""; - env[name] = current.includes(flag) ? current : [current, flag].filter(Boolean).join(" "); + env[name] = current.includes(flag) + ? current + : [current, flag].filter(Boolean).join(" "); } if (process.platform === "win32") { diff --git a/scripts/dev-desktop.mjs b/scripts/dev-desktop.mjs index f12400d..85a3b10 100644 --- a/scripts/dev-desktop.mjs +++ b/scripts/dev-desktop.mjs @@ -5,7 +5,9 @@ const env = { ...process.env }; function appendEnvFlag(name, flag) { const current = env[name] ?? ""; - env[name] = current.includes(flag) ? current : [current, flag].filter(Boolean).join(" "); + env[name] = current.includes(flag) + ? current + : [current, flag].filter(Boolean).join(" "); } if (process.platform === "win32") {