A framework-agnostic file-based route collector inspired by Next.js's App Router.
Supports any file extension, and all these route types:
- Root and index routes: Either
index.tsxorpage.tsx, but a segment folder is not required, e.g.posts.tsxis the same asposts/index.tsx - Dynamic Segments:
posts/[id].tsxorposts/[id]/index.tsx - Optional Segments:
[[lang]]/news.tsx - Splat/Wildcard routes:
api/auth/[...].tsx - Layout routes:
layout.tsxat any level, inheritable. - Route grouping (via parentheses):
(auth)/news.tsxwill be/news. It has no effect more than code organisation purposes, or for sharing the same layout without requiring a nested level.
pnpm add file-router-collectorYou can use the collectRoutes function to collect the routes from the file system, and build your
own route configuration with any framework that supports programmatically-generated routes.
import { collectRoutes } from 'file-router-collector'
// Collect all routes from the `./src/pages/**/*` directory:
const routeDefinitions = collectRoutes({
projectRoot: process.cwd() + '/src',
routesDir: 'pages',
fileExtensions: ['.ts', '.md', '.vue'], // you can specify any file extension you want
ignoredPaths: [],
ignoredPathPrefix: '_',
})
for (const route of routeDefinitions) {
// define routes e.g. with Fastify, Hono, Elysia, etc.
}Edit the app/routes.ts file to use the generated routes.
// app/routes.ts
import { collectRoutes } from 'file-router-collector/react-router'
// Collect all routes from the `./app/routes/**/*` directory:
const routes = collectRoutes({
projectRoot: process.cwd() + '/app',
routesDir: 'routes',
fileExtensions: ['.tsx', '.ts'],
ignoredPaths: [],
ignoredPathPrefix: '_',
})
export default routes