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.
yarn add universal-autorouterRegister the Plugin (example with Hono)
// /app.tsimportpathfrom'node:path'import{serve}from'@hono/node-server'import{Hono}from'hono'importautoloadRoutesfrom'universal-autorouter'constapp=newHono()awaitautoloadRoutes(app,{// Pattern to scan route filespattern: '**/*.ts',// Prefix to add to routesprefix: '/api',// Source directory of route files: use "relative" pathroutesDir: path.resolve(import.meta.dirname,'api')})constport=+(process.env.PORT||3000)serve({fetch: app.fetch,
port
},()=>console.log(`Server running at http://localhost:${port}`))// /routes/index.tsimporttype{Context}from'hono'exportdefault(c: Context)=>{returnc.text('Hello World!')}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
| 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 | ./api | 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 |
This project is licensed under the MIT License.