From 9243c755366d5ed9a2530dcb434acb3e5bd7dd5b Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Mon, 8 Jun 2026 08:54:40 +1000 Subject: [PATCH] fix(desktop): resolve relative picker input --- .../app/src/components/dialog-select-directory-v2.tsx | 2 +- .../app/src/components/directory-picker-domain.test.ts | 8 ++++++++ packages/app/src/components/directory-picker-domain.ts | 6 ++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/app/src/components/dialog-select-directory-v2.tsx b/packages/app/src/components/dialog-select-directory-v2.tsx index 7c1190ba5f..e2db2e2ea5 100644 --- a/packages/app/src/components/dialog-select-directory-v2.tsx +++ b/packages/app/src/components/dialog-select-directory-v2.tsx @@ -121,7 +121,7 @@ export function DialogSelectDirectoryV2(props: DialogSelectDirectoryV2Props) { } async function navigate(path: string) { - const value = policy.navigation(pickerAbsoluteInput(cleanPickerInput(path), home())) + const value = policy.navigation(pickerAbsoluteInput(cleanPickerInput(path), home(), root() || start() || home())) if (!value) return const token = ++navigation setLoading(true) diff --git a/packages/app/src/components/directory-picker-domain.test.ts b/packages/app/src/components/directory-picker-domain.test.ts index df58ea5a43..d47004efa2 100644 --- a/packages/app/src/components/directory-picker-domain.test.ts +++ b/packages/app/src/components/directory-picker-domain.test.ts @@ -17,6 +17,7 @@ import { displayPickerPath, pickerParent, pickerRoot, + pickerAbsoluteInput, } from "./directory-picker-domain" test("maps server directory entries into Pierre paths", () => { @@ -108,6 +109,13 @@ test("treats the server share prefix as the UNC root", () => { expect(pickerParent("//Server/Share/repo")).toBe("//Server/Share") }) +test("resolves relative input against the current picker root", () => { + expect(pickerAbsoluteInput("src", "/home/luke", "/home/luke/repo")).toBe("/home/luke/repo/src") + expect(pickerAbsoluteInput("../other", "/home/luke", "/home/luke/repo")).toBe("/home/luke/other") + expect(pickerAbsoluteInput("~/.config", "/home/luke", "/home/luke/repo")).toBe("/home/luke/.config") + expect(pickerAbsoluteInput("src", "C:/Users/luke", "C:/Users/luke/repo")).toBe("C:/Users/luke/repo/src") +}) + test("exposes autocomplete results only for their source query", () => { const result = { query: "/repo/src", items: ["/repo/src/index.ts"] } expect(currentPickerSuggestions(result, "/repo/src")).toEqual(result.items) diff --git a/packages/app/src/components/directory-picker-domain.ts b/packages/app/src/components/directory-picker-domain.ts index 2b141b8407..fb00297ca3 100644 --- a/packages/app/src/components/directory-picker-domain.ts +++ b/packages/app/src/components/directory-picker-domain.ts @@ -71,8 +71,10 @@ export function pickerFileSearchQuery(root: string, input: string, home: string) return value } -export function pickerAbsoluteInput(input: string, home: string) { - return input.replace(/\\/g, "/").replace(/^~(?=\/|$)/, home).replace(/\/+$/, "") || "/" +export function pickerAbsoluteInput(input: string, home: string, current: string) { + const value = normalizePickerDrive(input).replace(/^~(?=\/|$)/, normalizePickerDrive(home)) + const absolute = pickerRoot(value) ? value : joinPickerPath(current, value) + return canonicalPickerPath(absolute) } export function treePathWithin(base: string | undefined, path: string) {