Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/node-ecosystem/universal-autorouter
Universal filesystem autoloader for routes
https://github.com/node-ecosystem/universal-autorouter
autoloader expressjs filesystem hono routes web-server
Last synced: 19 days ago
JSON representation
Universal filesystem autoloader for routes
- Host: GitHub
- URL: https://github.com/node-ecosystem/universal-autorouter
- Owner: node-ecosystem
- License: mit
- Created: 2024-12-15T17:09:44.000Z (23 days ago)
- Default Branch: master
- Last Pushed: 2024-12-18T13:41:46.000Z (20 days ago)
- Last Synced: 2024-12-18T13:45:36.035Z (20 days ago)
- Topics: autoloader, expressjs, filesystem, hono, routes, web-server
- Language: TypeScript
- Homepage:
- Size: 1.01 MB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# universal-autorouter
Universal plugin, that use the _file system_ scan, to load in a server all routes in a directory.
Inspired by [elysia-autoload](https://github.com/kravetsone/elysia-autoload).
## Installation
```sh
yarn add universal-autorouter
```## Usage example with [Hono](https://hono.dev)
### Register the Plugin
```ts
// /app.ts
import path from 'node:path'
import { serve } from '@hono/node-server'
import { Hono } from 'hono'
import autoloadRoutes from 'universal-autorouter'const port = +(process.env.PORT || 3000)
const app = await autoloadRoutes(new Hono(), {
// Pattern to scan route files
pattern: '**/*.ts',
// Prefix to add to routes
prefix: '/api',
// Source directory of route files: use "relative" path
routesDir: path.resolve(import.meta.dirname, 'api')
})serve(
{
fetch: app.fetch,
port
},
() => console.log(`Server running at http://localhost:${port}`)
)
```### Create a Route
```ts
// /routes/index.ts
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](https://en.wikipedia.org/wiki/Glob_(programming)) |
| 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` | Default method to use when the route filename doesn't use the () pattern |
| viteDevServer? | ViteDevServer | _undefined_ | Developer server instance of [Vite](https://vite.dev) 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](LICENSE).