universal-autorouter
An universal plugin that scans the file system and automatically loads to a server all routes in a target directory.
Inspired by elysia-autoload package and compatible with Node.js and Bun runtimes.
⚙️ Install
yarn add universal-autorouter
📖 Usage
Register the Plugin (example with Hono)
import path from 'node:path'
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import autoloadRoutes from 'universal-autorouter'
const app = new Hono()
await autoloadRoutes(app, {
pattern: '**/*.ts',
prefix: '/api',
routesDir: path.resolve(import.meta.dirname, 'api')
})
const port = +(process.env.PORT || 3000)
serve({
fetch: app.fetch,
port
}, () => console.log(`Server running at http://localhost:${port}`))
Create a Route
import type { Context } from 'hono'
export default (c: Context) => {
return c.text('Hello World!')
}
Directory Structure
Guide on how universal-autorouter
matches routes:
├── app.ts
├── routes
│ ├── index.ts // index routes
│ ├── posts
│ │ ├── index.ts
│ │ └── [id].ts // dynamic params
│ ├── likes
│ │ └── [...].ts // wildcard
│ ├── domains
│ │ ├── @[...] // wildcard with @ prefix
│ │ │ └── index.ts
│ ├── frontend
│ │ └── index.tsx // usage of tsx extension
│ ├── events
│ │ ├── (post).ts // dynamic method
│ │ └── (get).ts
│ └── users.ts
└── package.json
/routes/index.ts
→ GET /
/routes/posts/index.ts
→ GET /posts
/routes/posts/[id].ts
→ GET /posts/:id
/routes/users.ts
→ GET /users
/routes/likes/[...].ts
→ GET /likes/*
/routes/domains/@[...]/index.ts
→ GET /domains/@*
/routes/frontend/index.tsx
→ GET /frontend
/routes/events/(post).ts
→ POST /events
/routes/events/(get).ts
→ GET /events
Options
Key | Type | Default | Description |
---|
pattern? | string | **/*.{ts,tsx,js,jsx,mjs,cjs} | Glob patterns |
prefix? | string | | Prefix to be added to each route |
routesDir? | string | ./routes | The folder where routes are located (use a relative path) |
defaultMethod? | Method | string | get |
viteDevServer? | ViteDevServer | undefined | Developer server instance of Vite to use SSR module loader |
skipNoRoutes? | boolean | false | Skip the throw error when no routes are found |
skipImportErrors? | boolean | false | Skip the import errors with the default export of a rotue file |
License
This project is licensed under the MIT License.