diff --git a/src/lib/router.ts b/src/lib/router.ts index cef712e86..564ea28c2 100644 --- a/src/lib/router.ts +++ b/src/lib/router.ts @@ -153,7 +153,11 @@ function pathToRoute(path: string): Route | null { if (host) { const id = segments.shift(); if (id) { - if (segments.length === 0) { + // Allows project paths with or without trailing slash + if ( + segments.length === 0 || + (segments.length === 1 && segments[0] === "") + ) { return { resource: "projects", params: { @@ -247,7 +251,10 @@ export function routeToPath(route: Route) { } if (route.params.view.resource === "tree") { - return `${hostPrefix}/${route.params.id}${peer}/tree${suffix}`; + if (suffix) { + return `${hostPrefix}/${route.params.id}${peer}/tree${suffix}`; + } + return `${hostPrefix}/${route.params.id}${peer}`; } else if (route.params.view.resource === "commits") { return `${hostPrefix}/${route.params.id}${peer}/commits${suffix}`; } else if (route.params.view.resource === "history") { @@ -284,7 +291,7 @@ function resolveProjectRoute( content = segments.shift(); } - if (content === "tree") { + if (!content || content === "tree") { const line = url.href.match(/#L\d+$/)?.pop(); const hash = url.href.match(/#{1}[^#.]+$/)?.pop(); return { diff --git a/src/views/home/Index.svelte b/src/views/home/Index.svelte index 1bfbe9d62..e295b077c 100644 --- a/src/views/home/Index.svelte +++ b/src/views/home/Index.svelte @@ -36,9 +36,9 @@ params: { view: { resource: "tree" }, id: project.id, - peer: undefined, seed: seed.host, - revision: project.head ?? undefined, + peer: undefined, + revision: undefined, }, }); } diff --git a/src/views/seeds/View/Projects.svelte b/src/views/seeds/View/Projects.svelte index a6ca6a0a2..4ab0361ad 100644 --- a/src/views/seeds/View/Projects.svelte +++ b/src/views/seeds/View/Projects.svelte @@ -44,7 +44,7 @@ seed.addr.port === config.seeds.defaultHttpdPort ? seed.addr.host : `${seed.addr.host}:${seed.addr.port}`, - revision: project.head ?? undefined, + revision: undefined, hash: undefined, search: undefined, }, diff --git a/tests/e2e/hashRouter.spec.ts b/tests/e2e/hashRouter.spec.ts index 1aecb2bf6..4b1624b6a 100644 --- a/tests/e2e/hashRouter.spec.ts +++ b/tests/e2e/hashRouter.spec.ts @@ -24,7 +24,7 @@ test("navigate between landing and project page", async ({ page }) => { await expect(page).toHaveURL("/#/"); await page.locator("text=source-browsing").click(); - await expect(page).toHaveURL(`/#${projectFixtureUrl}/tree/${aliceMainHead}`); + await expect(page).toHaveURL(`/#${projectFixtureUrl}`); await expectBackAndForwardNavigationWorks("/#/", page); await expectUrlPersistsReload(page); @@ -35,7 +35,7 @@ test("navigation between seed and project pages", async ({ page }) => { const project = page.locator(".project"); await project.click(); - await expect(page).toHaveURL(`/#${projectFixtureUrl}/tree/${aliceMainHead}`); + await expect(page).toHaveURL(`/#${projectFixtureUrl}`); await expectBackAndForwardNavigationWorks("/#/seeds/radicle.local", page); await expectUrlPersistsReload(page); @@ -61,55 +61,53 @@ test.describe("project page navigation", () => { }); test("navigate between tree and commit history", async ({ page }) => { - const projectTreeURL = `/#${projectFixtureUrl}/tree/${aliceMainHead}`; + const projectTreeURL = `/#${projectFixtureUrl}`; await page.goto(projectTreeURL); await expect(page).toHaveURL(projectTreeURL); await page.locator('role=button[name="Commit count"]').click(); - await expect(page).toHaveURL( - `/#${projectFixtureUrl}/history/${aliceMainHead}`, - ); + await expect(page).toHaveURL(`/#${projectFixtureUrl}/history/main`); await expectBackAndForwardNavigationWorks(projectTreeURL, page); await expectUrlPersistsReload(page); }); test("navigate project paths", async ({ page }) => { - const projectTreeURL = `/#${projectFixtureUrl}/tree/${aliceMainHead}`; + const projectTreeURL = `/#${projectFixtureUrl}`; await page.goto(projectTreeURL); await expect(page).toHaveURL(projectTreeURL); await page.locator("text=.hidden").click(); - await expect(page).toHaveURL(`${projectTreeURL}/.hidden`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`); await page.locator("text=bin/").click(); await page.locator("text=true").click(); - await expect(page).toHaveURL(`${projectTreeURL}/bin/true`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`); await expectBackAndForwardNavigationWorks( - `${projectTreeURL}/.hidden`, + `${projectTreeURL}/tree/main/.hidden`, page, ); await expectUrlPersistsReload(page); }); test("navigate project paths with a selected peer", async ({ page }) => { - const projectTreeURL = `/#${projectFixtureUrl}/remotes/${aliceRemote}/tree`; + const projectTreeURL = `/#${projectFixtureUrl}/remotes/${aliceRemote}`; await page.goto(projectTreeURL); await expect(page).toHaveURL(projectTreeURL); await page.locator("text=.hidden").click(); - await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`); await page.locator("text=bin/").click(); await page.locator("text=true").click(); - await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`); await expectBackAndForwardNavigationWorks( - `${projectTreeURL}/main/.hidden`, + `${projectTreeURL}/tree/main/.hidden`, page, ); await expectUrlPersistsReload(page); diff --git a/tests/e2e/historyRouter.spec.ts b/tests/e2e/historyRouter.spec.ts index bc620c71d..5f7336529 100644 --- a/tests/e2e/historyRouter.spec.ts +++ b/tests/e2e/historyRouter.spec.ts @@ -18,7 +18,7 @@ test("navigate between landing and project page", async ({ page }) => { await expect(page).toHaveURL("/"); await page.locator("text=source-browsing").click(); - await expect(page).toHaveURL(`${projectFixtureUrl}/tree/${aliceMainHead}`); + await expect(page).toHaveURL(projectFixtureUrl); await expectBackAndForwardNavigationWorks("/", page); await expectUrlPersistsReload(page); @@ -29,7 +29,7 @@ test("navigation between seed and project pages", async ({ page }) => { const project = page.locator(".project"); await project.click(); - await expect(page).toHaveURL(`${projectFixtureUrl}/tree/${aliceMainHead}`); + await expect(page).toHaveURL(projectFixtureUrl); await expectBackAndForwardNavigationWorks("/seeds/radicle.local", page); await expectUrlPersistsReload(page); @@ -90,20 +90,20 @@ test.describe("project page navigation", () => { }); test("navigate project paths with a selected peer", async ({ page }) => { - const projectTreeURL = `${projectFixtureUrl}/remotes/${aliceRemote}/tree`; + const projectTreeURL = `${projectFixtureUrl}/remotes/${aliceRemote}`; await page.goto(projectTreeURL); await expect(page).toHaveURL(projectTreeURL); await page.locator("text=.hidden").click(); - await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/.hidden`); await page.locator("text=bin/").click(); await page.locator("text=true").click(); - await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`); + await expect(page).toHaveURL(`${projectTreeURL}/tree/main/bin/true`); await expectBackAndForwardNavigationWorks( - `${projectTreeURL}/main/.hidden`, + `${projectTreeURL}/tree/main/.hidden`, page, ); await expectUrlPersistsReload(page); diff --git a/tests/e2e/search.spec.ts b/tests/e2e/search.spec.ts index 5e64f3a8a..d99b3f440 100644 --- a/tests/e2e/search.spec.ts +++ b/tests/e2e/search.spec.ts @@ -12,7 +12,7 @@ test("navigate to existing project", async ({ page }) => { await searchInput.fill(`${rid}`); await searchInput.press("Enter"); - await expect(page).toHaveURL(`${projectFixtureUrl}/tree`); + await expect(page).toHaveURL(projectFixtureUrl); await expect(searchInput).not.toHaveValue(`${rid}`); }); diff --git a/tests/unit/router.test.ts b/tests/unit/router.test.ts index fc58a31dd..c94874b85 100644 --- a/tests/unit/router.test.ts +++ b/tests/unit/router.test.ts @@ -22,8 +22,7 @@ describe("routeToPath", () => { id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT", }, }, - output: - "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/tree", + output: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT", description: "Seed Project Route", }, ])("$description", (route: any) => { @@ -45,6 +44,26 @@ describe("pathToRoute", () => { output: { resource: "seeds", params: { host: "willow.radicle.garden" } }, description: "Seed View Route", }, + { + input: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/", + output: { + resource: "projects", + params: { + view: { resource: "tree" }, + seed: "willow.radicle.garden", + profile: undefined, + peer: undefined, + id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT", + }, + }, + description: "Seed Project Route w trailing slash", + }, + { + input: + "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT/nope", + output: null, + description: "Seed Project Route w undefined suffix", + }, { input: "/seeds/willow.radicle.garden/rad:zKtT7DmF9H34KkvcKj9PHW19WzjT", output: { @@ -57,7 +76,7 @@ describe("pathToRoute", () => { id: "rad:zKtT7DmF9H34KkvcKj9PHW19WzjT", }, }, - description: "Seed Project Route", + description: "Seed Project Route w/o trailing slash", }, ])("$description", (route: any) => { expect(testExports.pathToRoute(route.input)).toEqual(route.output);