refactor(housekeeping): adopt ase route namespace

This commit is contained in:
Simo committed 2026-08-26 20:44:38 +02:00
1 parent 74756dfed2
commit f72a2b6c74
32 files changed
+388 -264

No files matched your search

@@ -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<ReactNode>) {
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();
});
@@ -412,10 +412,8 @@ describe("/admin-next first visible domain", () => {
capabilityContext([PERMS.ADMIN_DASHBOARD, PERMS.USERS_VIEW]),
);
await expect(AdminNextPage()).rejects.toThrow(
"NEXT_REDIRECT:/admin-next/operations",
);
expect(routeMocks.redirect).toHaveBeenCalledWith("/admin-next/operations");
await expect(AdminNextPage()).rejects.toThrow("NEXT_REDIRECT:/ase-next");
expect(routeMocks.redirect).toHaveBeenCalledWith("/ase-next");
expect(routeMocks.getHousekeepingCapabilityContext).toHaveBeenCalledTimes(
1,
);
@@ -428,9 +426,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 +448,7 @@ describe("/admin-next first visible domain", () => {
});
});
describe("/admin-next/[domain] layout", () => {
describe("/ase-next/[domain] layout", () => {
beforeEach(() => {
vi.clearAllMocks();
});
@@ -515,7 +513,7 @@ describe("/admin-next/[domain] layout", () => {
});
});
describe("/admin-next/[domain] page", () => {
describe("/ase-next/[domain] page", () => {
beforeEach(() => {
vi.clearAllMocks();
});
@@ -561,247 +559,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 +832,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 +841,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 +851,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([]);
});
});