import assert from "node:assert/strict"; import test from "node:test"; import { tsImport } from "tsx/esm/api"; const { extractSourceNavigation } = await tsImport("../../src/source/navigation.ts", import.meta.url); const surface = (id, route = `/${id}`, routeFile = `src/app/${id}.tsx`) => ({ id, route, routeFile, sourceFiles: [], variant: "default", kind: "screen", path: route, provider: "expo-router", logicalPath: route, }); function graph(surfaces, sources) { const files = new Map(surfaces.map((entry) => [entry.routeFile, "export default function Screen() { return null; }"])); for (const [file, source] of Object.entries(sources)) files.set(file, source); return extractSourceNavigation(surfaces, files); } const edges = (result, from) => result.edges.filter((edge) => edge.from === from).map(({ to, kind }) => [to, kind]); test("resolves bound router aliases, object destinations, imported constants and reexports", () => { const result = graph([surface("one"), surface("two"), surface("three")], { "src/app/one.tsx": "export { One as default } from '@/screens';", "src/screens/index.ts": "export { One } from './one'; export { Unused } from './unused';", "src/screens/one.tsx": `import { useRouter as getRouter } from 'expo-router'; import { ROUTES } from './routes'; export function One() { const navigation = getRouter(); return