From 21289d0222b522428e02e7d46f8f136263e04c5c Mon Sep 17 00:00:00 2001 From: Vordgi Date: Wed, 1 May 2024 19:43:42 +0400 Subject: [PATCH] get-56 improve intercepted routes parsing in get-params --- package/src/utils.ts | 7 ++- .../(corporate)/groups/groups.spec.ts | 14 ----- .../app/(group1)/(.)intercepted/page.tsx | 18 ++++++ .../(group2)}/groups/page.tsx | 5 -- tests/nextjs-app/app/(group1)/groups.spec.ts | 57 +++++++++++++++++++ .../app/(group1)/intercepted/page.tsx | 16 ++++++ .../app/(group1)/nested-intercepted/page.tsx | 16 ++++++ .../nested/(..)nested-intercepted/page.tsx | 18 ++++++ tests/nextjs-app/app/(group1)/nested/page.tsx | 9 +++ tests/nextjs-app/components/Nav/index.tsx | 21 +++++-- 10 files changed, 155 insertions(+), 26 deletions(-) delete mode 100644 tests/nextjs-app/app/(frontend)/(corporate)/groups/groups.spec.ts create mode 100644 tests/nextjs-app/app/(group1)/(.)intercepted/page.tsx rename tests/nextjs-app/app/{(frontend)/(corporate) => (group1)/(group2)}/groups/page.tsx (59%) create mode 100644 tests/nextjs-app/app/(group1)/groups.spec.ts create mode 100644 tests/nextjs-app/app/(group1)/intercepted/page.tsx create mode 100644 tests/nextjs-app/app/(group1)/nested-intercepted/page.tsx create mode 100644 tests/nextjs-app/app/(group1)/nested/(..)nested-intercepted/page.tsx create mode 100644 tests/nextjs-app/app/(group1)/nested/page.tsx diff --git a/package/src/utils.ts b/package/src/utils.ts index 779c9f4..bb41fdc 100644 --- a/package/src/utils.ts +++ b/package/src/utils.ts @@ -8,8 +8,11 @@ export const normalizePathname = (pathname: string) => { export const normalizePagePath = (pagePath: string) => { const cleanPagePath = pagePath && new URL(pagePath, "http://n").pathname; const pagePathWithoutFileType = cleanPagePath?.replace(/(\/page|\/_not-found)$/, ""); - const pagePathWithoutGroups = pagePathWithoutFileType.replace(/\/(\([^)]+\)|\@.+)/g, ""); - return pagePathWithoutGroups || "/"; + const pagePathWithoutGroups = pagePathWithoutFileType + .split("/") + .filter((segment) => !segment.match(/^(\([^)]+\)$|^\@.+$)/g)); + + return pagePathWithoutGroups.join("/") || "/"; }; export const parseSegments = (pagePathParts: string[], pathnameParts: string[]) => { diff --git a/tests/nextjs-app/app/(frontend)/(corporate)/groups/groups.spec.ts b/tests/nextjs-app/app/(frontend)/(corporate)/groups/groups.spec.ts deleted file mode 100644 index d128d06..0000000 --- a/tests/nextjs-app/app/(frontend)/(corporate)/groups/groups.spec.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test("should return correct page params and pathname", async ({ page }) => { - await page.goto("/groups"); - page.waitForSelector("#groups-page"); - - const pathname = await page.$("#get-pathname"); - const pathnameRow = await pathname?.textContent(); - expect(pathnameRow).toEqual("/groups"); - - const params = await page.$("#get-params"); - const paramsRow = await params?.textContent(); - expect(paramsRow && JSON.parse(paramsRow)).toEqual({}); -}); diff --git a/tests/nextjs-app/app/(group1)/(.)intercepted/page.tsx b/tests/nextjs-app/app/(group1)/(.)intercepted/page.tsx new file mode 100644 index 0000000..f4d10ac --- /dev/null +++ b/tests/nextjs-app/app/(group1)/(.)intercepted/page.tsx @@ -0,0 +1,18 @@ +import { getPathname } from "@nimpl/getters/get-pathname"; +import { getParams } from "@nimpl/getters/get-params"; +import Nav from "../../../components/Nav"; + +export default function Page() { + const pathname = getPathname(); + const params = getParams(); + + return ( +
+
+ ); +} diff --git a/tests/nextjs-app/app/(frontend)/(corporate)/groups/page.tsx b/tests/nextjs-app/app/(group1)/(group2)/groups/page.tsx similarity index 59% rename from tests/nextjs-app/app/(frontend)/(corporate)/groups/page.tsx rename to tests/nextjs-app/app/(group1)/(group2)/groups/page.tsx index 697df35..faff06d 100644 --- a/tests/nextjs-app/app/(frontend)/(corporate)/groups/page.tsx +++ b/tests/nextjs-app/app/(group1)/(group2)/groups/page.tsx @@ -1,7 +1,5 @@ import { getPathname } from "@nimpl/getters/get-pathname"; import { getParams } from "@nimpl/getters/get-params"; -import { NamespaceServerContext } from "../../../../components/NamespaceServerContext"; -import BlockWithContext from "../../../../components/BlockWithContext"; import Nav from "../../../../components/Nav"; export default function Page() { @@ -14,9 +12,6 @@ export default function Page() {

{pathname}

{JSON.stringify(params)}

- - -
); diff --git a/tests/nextjs-app/app/(group1)/groups.spec.ts b/tests/nextjs-app/app/(group1)/groups.spec.ts new file mode 100644 index 0000000..8685366 --- /dev/null +++ b/tests/nextjs-app/app/(group1)/groups.spec.ts @@ -0,0 +1,57 @@ +import { test, expect } from "@playwright/test"; + +test("should return correct page params and pathname for nested groups", async ({ page }) => { + await page.goto("/groups"); + page.waitForSelector("#groups-page"); + + const pathname = await page.$("#get-pathname"); + const pathnameRow = await pathname?.textContent(); + expect(pathnameRow).toEqual("/groups"); + + const params = await page.$("#get-params"); + const paramsRow = await params?.textContent(); + expect(paramsRow && JSON.parse(paramsRow)).toEqual({}); +}); + +test("should return correct page params and pathname for intercepting route", async ({ page }) => { + await page.goto("/intercepted"); + page.waitForSelector("#intercepted-page"); + + const pathname = await page.$("#get-pathname"); + const pathnameRow = await pathname?.textContent(); + expect(pathnameRow).toEqual("/intercepted"); + + const params = await page.$("#get-params"); + const paramsRow = await params?.textContent(); + expect(paramsRow && JSON.parse(paramsRow)).toEqual({}); +}); + +test("should return correct page params and pathname for intercepted route", async ({ page }) => { + await page.goto("/"); + await page.waitForSelector("#home-page"); + page.click("#to-intercepted"); + await page.waitForSelector("#intercepted-page"); + + const pathname = await page.$("#intercepted-get-pathname"); + const pathnameRow = await pathname?.textContent(); + expect(pathnameRow).toEqual("/intercepted"); + + const params = await page.$("#intercepted-get-params"); + const paramsRow = await params?.textContent(); + expect(paramsRow && JSON.parse(paramsRow)).toEqual({}); +}); + +test("should return correct page params and pathname for nested intercepted route", async ({ page }) => { + await page.goto("/nested"); + await page.waitForSelector("#nested-page"); + page.click("#to-nested-intercepted"); + await page.waitForSelector("#nested-intercepted-page"); + + const pathname = await page.$("#intercepted-get-pathname"); + const pathnameRow = await pathname?.textContent(); + expect(pathnameRow).toEqual("/nested-intercepted"); + + const params = await page.$("#intercepted-get-params"); + const paramsRow = await params?.textContent(); + expect(paramsRow && JSON.parse(paramsRow)).toEqual({}); +}); diff --git a/tests/nextjs-app/app/(group1)/intercepted/page.tsx b/tests/nextjs-app/app/(group1)/intercepted/page.tsx new file mode 100644 index 0000000..dfe039e --- /dev/null +++ b/tests/nextjs-app/app/(group1)/intercepted/page.tsx @@ -0,0 +1,16 @@ +import { getPathname } from "@nimpl/getters/get-pathname"; +import { getParams } from "@nimpl/getters/get-params"; + +export default function Page() { + const pathname = getPathname(); + const params = getParams(); + + return ( +
+
+

{pathname}

+

{JSON.stringify(params)}

+
+
+ ); +} diff --git a/tests/nextjs-app/app/(group1)/nested-intercepted/page.tsx b/tests/nextjs-app/app/(group1)/nested-intercepted/page.tsx new file mode 100644 index 0000000..8ff0200 --- /dev/null +++ b/tests/nextjs-app/app/(group1)/nested-intercepted/page.tsx @@ -0,0 +1,16 @@ +import { getPathname } from "@nimpl/getters/get-pathname"; +import { getParams } from "@nimpl/getters/get-params"; + +export default function Page() { + const pathname = getPathname(); + const params = getParams(); + + return ( +
+
+

{pathname}

+

{JSON.stringify(params)}

+
+
+ ); +} diff --git a/tests/nextjs-app/app/(group1)/nested/(..)nested-intercepted/page.tsx b/tests/nextjs-app/app/(group1)/nested/(..)nested-intercepted/page.tsx new file mode 100644 index 0000000..6c82f37 --- /dev/null +++ b/tests/nextjs-app/app/(group1)/nested/(..)nested-intercepted/page.tsx @@ -0,0 +1,18 @@ +import { getPathname } from "@nimpl/getters/get-pathname"; +import { getParams } from "@nimpl/getters/get-params"; +import Nav from "../../../../components/Nav"; + +export default function Page() { + const pathname = getPathname(); + const params = getParams(); + + return ( +
+
+ ); +} diff --git a/tests/nextjs-app/app/(group1)/nested/page.tsx b/tests/nextjs-app/app/(group1)/nested/page.tsx new file mode 100644 index 0000000..1970ba3 --- /dev/null +++ b/tests/nextjs-app/app/(group1)/nested/page.tsx @@ -0,0 +1,9 @@ +import Nav from "../../../components/Nav"; + +export default function Page() { + return ( +
+
+ ); +} diff --git a/tests/nextjs-app/components/Nav/index.tsx b/tests/nextjs-app/components/Nav/index.tsx index eb08396..7326e00 100644 --- a/tests/nextjs-app/components/Nav/index.tsx +++ b/tests/nextjs-app/components/Nav/index.tsx @@ -1,9 +1,20 @@ import Link from "next/link"; export default function Nav() { - return ( - - ); + return ( + + ); }