Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Fix some router issues
Sebastian Martinez committed 3 years ago
commit 2498ef7c9e8d707e396d3f6de0fe58612a2efb6b
parent 742fe4dec02be794e061a27e0b58e38c5559f20c
7 files changed +54 -30
modified 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 {
modified 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,
      },
    });
  }
modified 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,
      },
modified 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);
modified 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);
modified 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}`);
});

modified 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) => {
@@ -46,6 +45,26 @@ describe("pathToRoute", () => {
      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: {
        resource: "projects",
@@ -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);