UNPKG

everything-dev

Version:

A consolidated product package for building Module Federation apps with oRPC APIs.

53 lines (51 loc) • 2.47 kB
const require_domain = require('../domain.cjs'); const require_fs = require('../fs.cjs'); let effect = require("effect"); //#region src/services/scaffold/upgrade-audit/checks/route-guards.ts /** * Flags session-resolution drift that the redirect-loop class of bug feeds * on. Two shapes are wrong: * * 1. An authed mount (`_authenticated`, `_admin`, `_anon`, `_organization`) * reimplementing session resolution inline (sessionQueryOptions / * authClient.getSession) instead of delegating to requireSession from * "everything-dev/ui/auth" — guards that disagree about the same * ["session"] query key can ping-pong /login ↔ the protected route until * the router's redirect budget is exhausted ("Too many redirects"). * 2. The root passing the raw context.session through without * resolveSessionFromCache — a stale truthy session can survive sign-out * and resurrect authed state. */ const INLINE_RESOLUTION = /sessionQueryOptions\(|authClient\.getSession\(/; const AUTHED_MOUNTS = /* @__PURE__ */ new Set([ "authenticated", "admin", "anon", "organization" ]); const checkRouteGuards = (projectDir) => effect.Effect.gen(function* () { const files = (yield* require_fs.listFiles(projectDir, "ui/src/routes/_*.tsx")).filter((file) => !file.endsWith(".test.ts")); const findings = []; for (const file of files) { const source = yield* require_fs.readText(projectDir, file); const mountId = file.match(/ui\/src\/routes\/_([a-z]+)\.tsx$/)?.[1]; if (mountId === void 0) continue; if (AUTHED_MOUNTS.has(mountId) && INLINE_RESOLUTION.test(source)) findings.push(new require_domain.Finding({ check: "route-guards", path: file, severity: "warn", message: `authed mount "_${mountId}" resolves the session inline (sessionQueryOptions/authClient.getSession) — delegate to requireSession from "everything-dev/ui/auth" so all guards share one resolution semantics` })); } const rootSource = yield* require_fs.readText(projectDir, "ui/src/routes/__root.tsx"); if (/const session = context\.session;/.test(rootSource)) findings.push(new require_domain.Finding({ check: "route-guards", path: "ui/src/routes/__root.tsx", severity: "warn", message: "root passes the raw context.session through — resolve it with resolveSessionFromCache so an explicit signed-out cache entry is honored" })); return findings; }); //#endregion exports.checkRouteGuards = checkRouteGuards; //# sourceMappingURL=route-guards.cjs.map