From d868c990bf55b9168a953d0554903f745f315c33 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 30 Aug 2026 22:06:54 +0200 Subject: [PATCH] refactor(housekeeping): restore ase preview namespace --- .../[domain]/layout.tsx | 0 .../[domain]/page.tsx | 0 src/app/{admin-next => ase-next}/layout.tsx | 0 src/app/{admin-next => ase-next}/page.tsx | 0 .../housekeeping/domains/content/manifest.ts | 2 +- .../housekeeping/domains/economy/manifest.ts | 2 +- .../housekeeping/domains/hotel/manifest.ts | 2 +- .../domains/operations/manifest.ts | 2 +- .../housekeeping/domains/people/manifest.ts | 2 +- .../housekeeping/domains/system/manifest.ts | 2 +- .../foundation/contracts/contracts.test.ts | 6 +- .../foundation/contracts/domain.ts | 2 +- .../foundation-source-contract.test.ts | 2 +- .../foundation/navigation.test.ts | 18 +-- .../page/housekeeping-page-state.test.tsx | 8 +- .../foundation/preview-namespace.test.ts | 21 +++ .../foundation/preview-route-contract.test.ts | 120 +++++++++--------- .../housekeeping/foundation/registry.test.ts | 32 ++--- .../housekeeping/foundation/registry.ts | 2 +- .../shell/housekeeping-shell.test.tsx | 20 +-- src/lib/admin-theme-source-audit.test.ts | 2 +- 21 files changed, 133 insertions(+), 112 deletions(-) rename src/app/{admin-next => ase-next}/[domain]/layout.tsx (100%) rename src/app/{admin-next => ase-next}/[domain]/page.tsx (100%) rename src/app/{admin-next => ase-next}/layout.tsx (100%) rename src/app/{admin-next => ase-next}/page.tsx (100%) create mode 100644 src/features/housekeeping/foundation/preview-namespace.test.ts diff --git a/src/app/admin-next/[domain]/layout.tsx b/src/app/ase-next/[domain]/layout.tsx similarity index 100% rename from src/app/admin-next/[domain]/layout.tsx rename to src/app/ase-next/[domain]/layout.tsx diff --git a/src/app/admin-next/[domain]/page.tsx b/src/app/ase-next/[domain]/page.tsx similarity index 100% rename from src/app/admin-next/[domain]/page.tsx rename to src/app/ase-next/[domain]/page.tsx diff --git a/src/app/admin-next/layout.tsx b/src/app/ase-next/layout.tsx similarity index 100% rename from src/app/admin-next/layout.tsx rename to src/app/ase-next/layout.tsx diff --git a/src/app/admin-next/page.tsx b/src/app/ase-next/page.tsx similarity index 100% rename from src/app/admin-next/page.tsx rename to src/app/ase-next/page.tsx diff --git a/src/features/housekeeping/domains/content/manifest.ts b/src/features/housekeeping/domains/content/manifest.ts index f367587c..1b3bb223 100644 --- a/src/features/housekeeping/domains/content/manifest.ts +++ b/src/features/housekeeping/domains/content/manifest.ts @@ -9,7 +9,7 @@ export const contentManifest = { labelKey: "pages.housekeeping.domains.content.title", descriptionKey: "pages.housekeeping.domains.content.description", iconId: "file-text", - previewHref: "/admin-next/content", + previewHref: "/ase-next/content", capability: anyCapability( PERMS.NEWS_VIEW, PERMS.PAGES_VIEW, diff --git a/src/features/housekeeping/domains/economy/manifest.ts b/src/features/housekeeping/domains/economy/manifest.ts index 8eddf3b5..adeae0c6 100644 --- a/src/features/housekeeping/domains/economy/manifest.ts +++ b/src/features/housekeeping/domains/economy/manifest.ts @@ -9,7 +9,7 @@ export const economyManifest = { labelKey: "pages.housekeeping.domains.economy.title", descriptionKey: "pages.housekeeping.domains.economy.description", iconId: "gem", - previewHref: "/admin-next/economy", + previewHref: "/ase-next/economy", capability: anyCapability( PERMS.CATALOG_VIEW, PERMS.SHOP_VIEW, diff --git a/src/features/housekeeping/domains/hotel/manifest.ts b/src/features/housekeeping/domains/hotel/manifest.ts index 8c0ef95b..b7a043b4 100644 --- a/src/features/housekeeping/domains/hotel/manifest.ts +++ b/src/features/housekeeping/domains/hotel/manifest.ts @@ -9,7 +9,7 @@ export const hotelManifest = { labelKey: "pages.housekeeping.domains.hotel.title", descriptionKey: "pages.housekeeping.domains.hotel.description", iconId: "hotel", - previewHref: "/admin-next/hotel", + previewHref: "/ase-next/hotel", capability: anyCapability( PERMS.ROOMS_VIEW, PERMS.RADIO_VIEW, diff --git a/src/features/housekeeping/domains/operations/manifest.ts b/src/features/housekeeping/domains/operations/manifest.ts index c06d2687..823bddc1 100644 --- a/src/features/housekeeping/domains/operations/manifest.ts +++ b/src/features/housekeeping/domains/operations/manifest.ts @@ -9,7 +9,7 @@ export const operationsManifest = { labelKey: "pages.housekeeping.domains.operations.title", descriptionKey: "pages.housekeeping.domains.operations.description", iconId: "inbox", - previewHref: "/admin-next/operations", + previewHref: "/ase-next/operations", capability: anyCapability(PERMS.ADMIN_DASHBOARD), routes: [], searchProviders: [], diff --git a/src/features/housekeeping/domains/people/manifest.ts b/src/features/housekeeping/domains/people/manifest.ts index 21d1f3ea..3ca6e4d1 100644 --- a/src/features/housekeeping/domains/people/manifest.ts +++ b/src/features/housekeeping/domains/people/manifest.ts @@ -9,7 +9,7 @@ export const peopleManifest = { labelKey: "pages.housekeeping.domains.people.title", descriptionKey: "pages.housekeeping.domains.people.description", iconId: "users", - previewHref: "/admin-next/people", + previewHref: "/ase-next/people", capability: anyCapability( PERMS.USERS_VIEW, PERMS.MODERATION_VIEW, diff --git a/src/features/housekeeping/domains/system/manifest.ts b/src/features/housekeeping/domains/system/manifest.ts index f4ba2345..ad665a58 100644 --- a/src/features/housekeeping/domains/system/manifest.ts +++ b/src/features/housekeeping/domains/system/manifest.ts @@ -9,7 +9,7 @@ export const systemManifest = { labelKey: "pages.housekeeping.domains.system.title", descriptionKey: "pages.housekeeping.domains.system.description", iconId: "settings", - previewHref: "/admin-next/system", + previewHref: "/ase-next/system", capability: anyCapability( PERMS.SETTINGS_VIEW, PERMS.LOGS_VIEW, diff --git a/src/features/housekeeping/foundation/contracts/contracts.test.ts b/src/features/housekeeping/foundation/contracts/contracts.test.ts index caf21dd0..7dfa659e 100644 --- a/src/features/housekeeping/foundation/contracts/contracts.test.ts +++ b/src/features/housekeeping/foundation/contracts/contracts.test.ts @@ -28,7 +28,7 @@ const workItem = { occurredAt: "2026-08-24T12:00:00.000Z", titleKey: "pages.housekeeping.items.ticket", context: { ticketId: "42" }, - href: "/admin-next/people/tickets/42", + href: "/ase-next/people/tickets/42", freshness: "fresh", } satisfies HousekeepingWorkItem; @@ -36,7 +36,7 @@ const searchResult = { id: "user-42", domain: "people", title: "operator", - href: "/admin-next/people/users/42", + href: "/ase-next/people/users/42", } satisfies HousekeepingSearchResult; const searchProvider: HousekeepingSearchProvider = { @@ -87,7 +87,7 @@ const manifest: HousekeepingDomainManifest = { labelKey: "pages.housekeeping.domains.people.title", descriptionKey: "pages.housekeeping.domains.people.description", iconId: "users", - previewHref: "/admin-next/people", + previewHref: "/ase-next/people", capability, routes: [], searchProviders: [searchProvider], diff --git a/src/features/housekeeping/foundation/contracts/domain.ts b/src/features/housekeeping/foundation/contracts/domain.ts index 9ccb4f54..ccb4f329 100644 --- a/src/features/housekeeping/foundation/contracts/domain.ts +++ b/src/features/housekeeping/foundation/contracts/domain.ts @@ -17,7 +17,7 @@ export interface HousekeepingDomainManifest { labelKey: string; descriptionKey: string; iconId: "inbox" | "users" | "file-text" | "gem" | "hotel" | "settings"; - previewHref: `/admin-next/${HousekeepingDomainId}`; + previewHref: `/ase-next/${HousekeepingDomainId}`; capability: CapabilityRequirement; routes: readonly HousekeepingRouteDefinition[]; searchProviders: readonly HousekeepingSearchProvider[]; diff --git a/src/features/housekeeping/foundation/foundation-source-contract.test.ts b/src/features/housekeeping/foundation/foundation-source-contract.test.ts index f3ad7eb0..4c3c019f 100644 --- a/src/features/housekeeping/foundation/foundation-source-contract.test.ts +++ b/src/features/housekeeping/foundation/foundation-source-contract.test.ts @@ -555,7 +555,7 @@ describe("housekeeping foundation completion contracts", () => { for (const path of [ "src/app/admin/layout.tsx", "src/app/mod/layout.tsx", - "src/app/admin-next/layout.tsx", + "src/app/ase-next/layout.tsx", ]) { expect(existsSync(path), path).toBe(true); } diff --git a/src/features/housekeeping/foundation/navigation.test.ts b/src/features/housekeeping/foundation/navigation.test.ts index 88dce236..32465ac6 100644 --- a/src/features/housekeeping/foundation/navigation.test.ts +++ b/src/features/housekeeping/foundation/navigation.test.ts @@ -23,7 +23,7 @@ describe("housekeeping navigation", () => { labelKey: "pages.housekeeping.domains.people.title", descriptionKey: "pages.housekeeping.domains.people.description", iconId: "users", - previewHref: "/admin-next/people", + previewHref: "/ase-next/people", capability: anyCapability(PERMS.MOD_CFH_VIEW), routes: [], searchProviders: [], @@ -35,7 +35,7 @@ describe("housekeeping navigation", () => { labelKey: "pages.housekeeping.domains.economy.title", descriptionKey: "pages.housekeeping.domains.economy.description", iconId: "gem", - previewHref: "/admin-next/economy", + previewHref: "/ase-next/economy", capability: anyCapability(PERMS.CATALOG_VIEW), routes: [], searchProviders: [], @@ -53,7 +53,7 @@ describe("housekeeping navigation", () => { expect(navigation).toEqual([ { id: "people", - href: "/admin-next/people", + href: "/ase-next/people", iconId: "users", label: "pages.housekeeping.domains.people.title", description: "pages.housekeeping.domains.people.description", @@ -69,19 +69,19 @@ describe("housekeeping navigation", () => { labelKey: "people.title", descriptionKey: "people.description", iconId: "users", - previewHref: "/admin-next/people", + previewHref: "/ase-next/people", capability: anyCapability(PERMS.USERS_VIEW), routes: [ { id: "users", labelKey: "people.users", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: anyCapability(PERMS.USERS_VIEW), }, { id: "bans", labelKey: "people.bans", - href: "/admin-next/people/bans", + href: "/ase-next/people/bans", capability: anyCapability(PERMS.BANS_VIEW), }, ], @@ -94,7 +94,7 @@ describe("housekeeping navigation", () => { labelKey: "system.title", descriptionKey: "system.description", iconId: "settings", - previewHref: "/admin-next/system", + previewHref: "/ase-next/system", capability: anyCapability(PERMS.SETTINGS_VIEW), routes: [], searchProviders: [], @@ -113,14 +113,14 @@ describe("housekeeping navigation", () => { expect(navigation).toEqual([ { id: "people", - href: "/admin-next/people", + href: "/ase-next/people", iconId: "users", label: "translated:people.title", description: "translated:people.description", items: [ { id: "users", - href: "/admin-next/people/users", + href: "/ase-next/people/users", label: "translated:people.users", }, ], diff --git a/src/features/housekeeping/foundation/page/housekeeping-page-state.test.tsx b/src/features/housekeeping/foundation/page/housekeeping-page-state.test.tsx index b6c9ecbf..13c02396 100644 --- a/src/features/housekeeping/foundation/page/housekeeping-page-state.test.tsx +++ b/src/features/housekeeping/foundation/page/housekeeping-page-state.test.tsx @@ -75,12 +75,12 @@ describe("HousekeepingPageState", () => { state="error" title="Could not load" description="Try again later" - retryAction={Retry preview} + retryAction={Retry preview} />, ); expect(html).toContain('role="alert"'); - expect(html).toContain('href="/admin-next/operations"'); + expect(html).toContain('href="/ase-next/operations"'); expect(html).toContain(">Retry preview<"); }); }); @@ -92,7 +92,7 @@ describe("HousekeepingPageShell", () => { title="People" description="Review operator-facing people data" context={Preview context} - primaryAction={Create preview} + primaryAction={Create preview} >

Page body

, @@ -102,7 +102,7 @@ describe("HousekeepingPageShell", () => { expect(html).toContain(">People<"); expect(html).toContain(">Review operator-facing people data<"); expect(html).toContain(">Preview context<"); - expect(html).toContain('href="/admin-next/people/new"'); + expect(html).toContain('href="/ase-next/people/new"'); expect(html).toContain(">Create preview<"); expect(html).toContain(">Page body

"); }); diff --git a/src/features/housekeeping/foundation/preview-namespace.test.ts b/src/features/housekeeping/foundation/preview-namespace.test.ts new file mode 100644 index 00000000..b6e5c8eb --- /dev/null +++ b/src/features/housekeeping/foundation/preview-namespace.test.ts @@ -0,0 +1,21 @@ +import { execFileSync } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +describe("Housekeeping preview namespace", () => { + it("uses /ase-next and removes the previous runtime namespace", () => { + const removedNamespace = ["/admin", "-next"].join(""); + const files = execFileSync("git", ["ls-files", "src", ".env.example"], { + encoding: "utf8", + }) + .trim() + .split(/\r?\n/) + .filter(Boolean); + + const offenders = files.filter((file) => + readFileSync(file, "utf8").includes(removedNamespace), + ); + + expect(offenders).toEqual([]); + }); +}); diff --git a/src/features/housekeeping/foundation/preview-route-contract.test.ts b/src/features/housekeeping/foundation/preview-route-contract.test.ts index ae9bd9b6..1791c959 100644 --- a/src/features/housekeeping/foundation/preview-route-contract.test.ts +++ b/src/features/housekeeping/foundation/preview-route-contract.test.ts @@ -78,16 +78,16 @@ vi.mock("@/app/actions", () => { throw new Error("preview routes must not import actions"); }); -import AdminNextDomainLayout from "@/app/admin-next/[domain]/layout"; -import AdminNextDomainPage from "@/app/admin-next/[domain]/page"; -import AdminNextLayout from "@/app/admin-next/layout"; -import AdminNextPage from "@/app/admin-next/page"; +import AdminNextDomainLayout from "@/app/ase-next/[domain]/layout"; +import AdminNextDomainPage from "@/app/ase-next/[domain]/page"; +import AdminNextLayout from "@/app/ase-next/layout"; +import AdminNextPage from "@/app/ase-next/page"; const routeFiles = [ - "src/app/admin-next/layout.tsx", - "src/app/admin-next/page.tsx", - "src/app/admin-next/[domain]/layout.tsx", - "src/app/admin-next/[domain]/page.tsx", + "src/app/ase-next/layout.tsx", + "src/app/ase-next/page.tsx", + "src/app/ase-next/[domain]/layout.tsx", + "src/app/ase-next/[domain]/page.tsx", ] as const; const forbiddenModuleRoots = [ @@ -360,7 +360,7 @@ async function renderRoute(route: ReactNode | Promise) { return renderToStaticMarkup(await route); } -describe("/admin-next preview gate", () => { +describe("/ase-next preview gate", () => { beforeEach(() => { vi.clearAllMocks(); routeMocks.env.NODE_ENV = "test"; @@ -402,7 +402,7 @@ describe("/admin-next preview gate", () => { ); }); -describe("/admin-next first visible domain", () => { +describe("/ase-next first visible domain", () => { beforeEach(() => { vi.clearAllMocks(); }); @@ -413,9 +413,9 @@ describe("/admin-next first visible domain", () => { ); await expect(AdminNextPage()).rejects.toThrow( - "NEXT_REDIRECT:/admin-next/operations", + "NEXT_REDIRECT:/ase-next/operations", ); - expect(routeMocks.redirect).toHaveBeenCalledWith("/admin-next/operations"); + expect(routeMocks.redirect).toHaveBeenCalledWith("/ase-next/operations"); expect(routeMocks.getHousekeepingCapabilityContext).toHaveBeenCalledTimes( 1, ); @@ -428,9 +428,9 @@ describe("/admin-next first visible domain", () => { ); await expect(AdminNextPage()).rejects.toThrow( - "NEXT_REDIRECT:/admin-next/people", + "NEXT_REDIRECT:/ase-next/people", ); - expect(routeMocks.redirect).toHaveBeenCalledWith("/admin-next/people"); + expect(routeMocks.redirect).toHaveBeenCalledWith("/ase-next/people"); expect(routeMocks.getHousekeepingCapabilityContext).toHaveBeenCalledTimes( 1, ); @@ -450,7 +450,7 @@ describe("/admin-next first visible domain", () => { }); }); -describe("/admin-next/[domain] layout", () => { +describe("/ase-next/[domain] layout", () => { beforeEach(() => { vi.clearAllMocks(); }); @@ -515,7 +515,7 @@ describe("/admin-next/[domain] layout", () => { }); }); -describe("/admin-next/[domain] page", () => { +describe("/ase-next/[domain] page", () => { beforeEach(() => { vi.clearAllMocks(); }); @@ -561,247 +561,247 @@ describe("preview route import boundary", () => { it.each([ [ "relative database import with resolver extension", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../../lib/db.js";', "src/lib/db", ], [ "aliased database import with resolver extension", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "@/lib/db.js";', "src/lib/db", ], [ "action root import with resolver extension", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import actions from "../../actions.mjs";', "src/actions", ], [ "legacy mod root import with resolver extension", - "src/app/admin-next/layout.tsx", + "src/app/ase-next/layout.tsx", 'import mod from "../mod.cjs";', "src/app/mod", ], [ "database import with query suffix", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../../lib/db?server-only";', "src/lib/db", ], [ "action import with hash suffix", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import("../../actions/users#server")', "src/actions/users", ], [ "Windows-style relative database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", String.raw`import db from "..\\..\\lib\\db";`, "src/lib/db", ], [ "Windows-style aliased database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", String.raw`import db from "@\\lib\\db";`, "src/lib/db", ], [ "percent-encoded database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../../lib/%64%62";', "src/lib/db", ], [ "optional CommonJS database require", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'require?.("../../lib/db")', "src/lib/db", ], [ "module database require", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'module.require("../../lib/db")', "src/lib/db", ], [ "require.resolve database access", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'require.resolve("../../lib/db")', "src/lib/db", ], [ "optional module database require", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'module.require?.("../../lib/db")', "src/lib/db", ], [ "optional require.resolve database access", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'require.resolve?.("../../lib/db")', "src/lib/db", ], [ "TypeScript import-equals database access", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db = require("../../lib/db");', "src/lib/db", ], [ "U+2028 line-continuation database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../\\' + "\u2028" + '../lib/db";', "src/lib/db", ], [ "U+2029 line-continuation database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../\\' + "\u2029" + '../lib/db";', "src/lib/db", ], [ "parenthesized dynamic action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import(("../../actions/users"))', "src/actions/users", ], [ "regex-brace template-expression action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", `const x = \`${interpolationOpen}/}/.test(value) ? import("../../actions/users") : null}\`;`, "src/actions/users", ], [ "CommonJS database require", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'require("../../lib/db")', "src/lib/db", ], [ "template-literal dynamic action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", "import(`../../actions/users`)", "src/actions/users", ], [ "TypeScript-asserted dynamic action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import(("../../actions/users" as string))', "src/actions/users", ], [ "template-expression dynamic action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", `const x = \`${interpolationOpen}import("../../actions/users")}\`;`, "src/actions/users", ], [ "nested template-expression dynamic action import", - "src/app/admin-next/[domain]/page.tsx", + "src/app/ase-next/[domain]/page.tsx", `const x = \`${interpolationOpen}ready ? \`${interpolationOpen}import("../../../actions/nested")}\` : ""}\`;`, "src/actions/nested", ], [ "unicode escaped dynamic app-action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import("\\u002e\\u002e/actions/users")', "src/app/actions/users", ], [ "code-point escaped dynamic app-action import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import("\\u{2e}\\u{2e}/actions/users")', "src/app/actions/users", ], [ "hex escaped export-from auth import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'export * from "\\x2e\\x2e/\\x2e\\x2e/lib/auth";', "src/lib/auth", ], [ "escaped-slash permissions import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import permissions from "..\\/..\\/lib\\/permissions";', "src/lib/permissions", ], [ "unknown escape database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../../\\lib/db";', "src/lib/db", ], [ "line-continuation database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import db from "../\\' + "\n" + '../lib/db";', "src/lib/db", ], [ "aliased database descendant import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import { query } from "@/lib/db/query";', "src/lib/db/query", ], [ "root relative database import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import { db } from "../../lib/db";', "src/lib/db", ], [ "domain relative auth side-effect import", - "src/app/admin-next/[domain]/layout.tsx", + "src/app/ase-next/[domain]/layout.tsx", 'import "../../../lib/auth";', "src/lib/auth", ], [ "domain relative permissions export", - "src/app/admin-next/[domain]/page.tsx", + "src/app/ase-next/[domain]/page.tsx", 'export { getAdminContext } from "../../../lib/permissions";', "src/lib/permissions", ], [ "root relative action dynamic import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import("../../actions/users")', "src/actions/users", ], [ "root relative app action export", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'export * from "../actions";', "src/app/actions", ], [ "domain relative legacy admin import", - "src/app/admin-next/[domain]/layout.tsx", + "src/app/ase-next/[domain]/layout.tsx", 'import page from "../../admin/users/page";', "src/app/admin/users/page", ], [ "root relative legacy mod dynamic import", - "src/app/admin-next/layout.tsx", + "src/app/ase-next/layout.tsx", 'import("../mod/users/page")', "src/app/mod/users/page", ], [ "Prisma TypeScript import type", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'type PrismaClient = import("@prisma/client").PrismaClient;', "@prisma/client", ], [ "Drizzle package import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import { sql } from "drizzle-orm";', "drizzle-orm", ], [ "mysql2 package import", - "src/app/admin-next/page.tsx", + "src/app/ase-next/page.tsx", 'import type { Pool } from "mysql2";', "mysql2", ], @@ -834,7 +834,7 @@ describe("preview route import boundary", () => { ], ] as const)("fails closed for non-literal %s", (_name, source, violation) => { expect( - findRouteImportBoundaryViolations(source, "src/app/admin-next/page.tsx"), + findRouteImportBoundaryViolations(source, "src/app/ase-next/page.tsx"), ).toContain(violation); }); @@ -843,7 +843,7 @@ describe("preview route import boundary", () => { 'import database from "@/lib/database.js?raw";', 'import dbTools from "../../lib/db-tools.ts";', 'import auth from "../../lib/authentication";', - 'import preview from "../admin-next-shared";', + 'import preview from "../ase-next-shared";', 'import prismaTools from "@prisma/client-tools";', 'import drizzleTools from "drizzle-orm-kit";', 'import mysqlTools from "mysql2-wrapper";', @@ -853,7 +853,7 @@ describe("preview route import boundary", () => { ].join("\n"); expect( - findRouteImportBoundaryViolations(source, "src/app/admin-next/page.tsx"), + findRouteImportBoundaryViolations(source, "src/app/ase-next/page.tsx"), ).toEqual([]); }); }); diff --git a/src/features/housekeeping/foundation/registry.test.ts b/src/features/housekeeping/foundation/registry.test.ts index 5bbc528d..b82dcb4a 100644 --- a/src/features/housekeeping/foundation/registry.test.ts +++ b/src/features/housekeeping/foundation/registry.test.ts @@ -25,7 +25,7 @@ const manifest = ( labelKey: `pages.housekeeping.domains.${id}.title`, descriptionKey: `pages.housekeeping.domains.${id}.description`, iconId: "settings", - previewHref: `/admin-next/${id}`, + previewHref: `/ase-next/${id}`, capability: anyCapability(capabilitySlug), routes: [], searchProviders: [], @@ -73,7 +73,7 @@ const expectedManifests = [ { id: "operations", iconId: "inbox", - previewHref: "/admin-next/operations", + previewHref: "/ase-next/operations", labelKey: "pages.housekeeping.domains.operations.title", descriptionKey: "pages.housekeeping.domains.operations.description", slugs: [PERMS.ADMIN_DASHBOARD], @@ -81,7 +81,7 @@ const expectedManifests = [ { id: "people", iconId: "users", - previewHref: "/admin-next/people", + previewHref: "/ase-next/people", labelKey: "pages.housekeeping.domains.people.title", descriptionKey: "pages.housekeeping.domains.people.description", slugs: [ @@ -112,7 +112,7 @@ const expectedManifests = [ { id: "content", iconId: "file-text", - previewHref: "/admin-next/content", + previewHref: "/ase-next/content", labelKey: "pages.housekeeping.domains.content.title", descriptionKey: "pages.housekeeping.domains.content.description", slugs: [ @@ -135,7 +135,7 @@ const expectedManifests = [ { id: "economy", iconId: "gem", - previewHref: "/admin-next/economy", + previewHref: "/ase-next/economy", labelKey: "pages.housekeeping.domains.economy.title", descriptionKey: "pages.housekeeping.domains.economy.description", slugs: [ @@ -148,7 +148,7 @@ const expectedManifests = [ { id: "hotel", iconId: "hotel", - previewHref: "/admin-next/hotel", + previewHref: "/ase-next/hotel", labelKey: "pages.housekeeping.domains.hotel.title", descriptionKey: "pages.housekeeping.domains.hotel.description", slugs: [ @@ -165,7 +165,7 @@ const expectedManifests = [ { id: "system", iconId: "settings", - previewHref: "/admin-next/system", + previewHref: "/ase-next/system", labelKey: "pages.housekeeping.domains.system.title", descriptionKey: "pages.housekeeping.domains.system.description", slugs: [ @@ -208,7 +208,7 @@ describe("housekeeping registry", () => { it("rejects invalid preview and empty translation keys", () => { expect(() => createHousekeepingRegistry([ - { ...manifest("people"), previewHref: "/admin-next/operations" }, + { ...manifest("people"), previewHref: "/ase-next/operations" }, ]), ).toThrow("invalid preview href"); expect(() => @@ -232,13 +232,13 @@ describe("housekeeping registry", () => { { id: "users", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: anyCapability(PERMS.USERS_VIEW), }, { id: "users", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/staff", + href: "/ase-next/people/staff", capability: anyCapability(PERMS.USERS_VIEW), }, ], @@ -253,13 +253,13 @@ describe("housekeeping registry", () => { { id: "users", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: anyCapability(PERMS.USERS_VIEW), }, { id: "staff", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: anyCapability(PERMS.USERS_VIEW), }, ], @@ -272,7 +272,7 @@ describe("housekeeping registry", () => { const route = { id: "users", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: anyCapability(PERMS.USERS_VIEW), }; @@ -481,7 +481,7 @@ describe("housekeeping registry", () => { { id: "users", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/people/users", + href: "/ase-next/people/users", capability: { mode: "any", slugs: [] }, }, ], @@ -494,7 +494,7 @@ describe("housekeeping registry", () => { const route = { id: "shared", labelKey: "pages.housekeeping.domains.people.title", - href: "/admin-next/shared", + href: "/ase-next/shared", capability: anyCapability(PERMS.USERS_VIEW), }; @@ -503,7 +503,7 @@ describe("housekeeping registry", () => { { ...manifest("people"), routes: [route] }, { ...manifest("content"), - routes: [{ ...route, href: "/admin-next/content/shared" }], + routes: [{ ...route, href: "/ase-next/content/shared" }], }, ]), ).toThrow("duplicate route id"); diff --git a/src/features/housekeeping/foundation/registry.ts b/src/features/housekeeping/foundation/registry.ts index f301ebbe..d72ccce4 100644 --- a/src/features/housekeeping/foundation/registry.ts +++ b/src/features/housekeeping/foundation/registry.ts @@ -34,7 +34,7 @@ export function createHousekeepingRegistry( } domainIds.add(manifest.id); - if (manifest.previewHref !== `/admin-next/${manifest.id}`) { + if (manifest.previewHref !== `/ase-next/${manifest.id}`) { throw new Error(`invalid preview href: ${manifest.previewHref}`); } validateNonEmpty(manifest.labelKey, "label key"); diff --git a/src/features/housekeeping/foundation/shell/housekeeping-shell.test.tsx b/src/features/housekeeping/foundation/shell/housekeeping-shell.test.tsx index 0aac7178..f462514a 100644 --- a/src/features/housekeeping/foundation/shell/housekeeping-shell.test.tsx +++ b/src/features/housekeeping/foundation/shell/housekeeping-shell.test.tsx @@ -17,17 +17,17 @@ const labels = { const domains: readonly HousekeepingNavigationDomain[] = [ { id: "operations", - href: "/admin-next/operations", + href: "/ase-next/operations", iconId: "inbox", label: "Operations", description: "Manage operations", items: [ - { id: "queue", href: "/admin-next/operations/queue", label: "Queue" }, + { id: "queue", href: "/ase-next/operations/queue", label: "Queue" }, ], }, { id: "people", - href: "/admin-next/people", + href: "/ase-next/people", iconId: "users", label: "People", description: "Manage people", @@ -35,7 +35,7 @@ const domains: readonly HousekeepingNavigationDomain[] = [ }, { id: "content", - href: "/admin-next/content", + href: "/ase-next/content", iconId: "file-text", label: "Content", description: "Manage content", @@ -43,7 +43,7 @@ const domains: readonly HousekeepingNavigationDomain[] = [ }, { id: "economy", - href: "/admin-next/economy", + href: "/ase-next/economy", iconId: "gem", label: "Economy", description: "Manage economy", @@ -51,7 +51,7 @@ const domains: readonly HousekeepingNavigationDomain[] = [ }, { id: "hotel", - href: "/admin-next/hotel", + href: "/ase-next/hotel", iconId: "hotel", label: "Hotel", description: "Manage hotel", @@ -59,7 +59,7 @@ const domains: readonly HousekeepingNavigationDomain[] = [ }, { id: "system", - href: "/admin-next/system", + href: "/ase-next/system", iconId: "settings", label: "System", description: "Manage system", @@ -178,7 +178,7 @@ describe("HousekeepingShell", () => { expect(html).toContain('