Laravel-style routing system for Express.js in TypeScript. Simplify your route definitions, middleware stacks, and controller bindings like a boss.
npm install @refkinscallv/express-routing-tsCurious how it all comes together?
π Check out example/index.ts for a full working demo!
- β
Simple route declarations (
get,post, etc.) - β Grouped routes with prefix
- β Middleware stack: global, group, and per-route
- β Controller-method pair as route handler
- β
Consistent handler format using
HttpContext - β Auto-instantiate controllers
- β Express-compatible
type RouteMiddleware = (req: Request, res: Response, next: NextFunction) => void; type RouteMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'options' | 'head'; type HttpContext = { req: Request; res: Response; next: NextFunction; }; type RouteHandler = ((ctx: HttpContext) => any) | [any, string]; interface RouteDefinition { methods: RouteMethod[]; path: string; handler: RouteHandler; middlewares?: RouteMiddleware[]; }Routes.get('/hello', ({ res }) => { res.send('Hello World'); });Routes.post( '/submit', ({ res }) => res.send('Submitted'), [authMiddleware], );You can use [ControllerClass, 'methodName']:
class UserController { index({ res }: HttpContext) { res.send('User list'); } } Routes.get('/users', [UserController, 'index']);
β οΈ Controller will be instantiated if not passed as an object.
Use Routes.group() to prefix and stack middleware:
Routes.group('/admin', () => { Routes.get('/dashboard', ({ res }) => res.send('Admin Dashboard')); }, [adminOnly]);Wrap multiple routes in a shared global middleware:
Routes.middleware([authMiddleware], () => { Routes.get('/me', ({ res }) => res.send('My Profile')); });import express from 'express'; import Routes from '@refkinscallv/express-routing-ts'; // registered your routes // import 'path/to/routes.ts' const app = express(); const router = express.Router(); Routes.apply(router); app.use(router); app.listen(3000);| Method | Description |
|---|---|
get() | Define GET route |
post() | Define POST route |
put() | Define PUT route |
patch() | Define PATCH route |
delete() | Define DELETE route |
options() | Define OPTIONS route |
head() | Define HEAD route |
add() | Custom route with multiple methods |
| Method | Description |
|---|---|
Routes.get() | Register a GET route |
Routes.post() | Register a POST route |
Routes.put() | Register a PUT route |
Routes.delete() | Register a DELETE route |
Routes.patch() | Register a PATCH route |
Routes.options() | Register an OPTIONS route |
Routes.head() | Register a HEAD route |
Routes.add() | Register one or more HTTP methods at once |
Routes.group() | Group routes under a prefix and share middlewares |
Routes.middleware() | Apply global middleware scope to nested routes |
Routes.apply() | Apply all registered routes to an Express router |
Middleware Execution Order:
[ Global Middleware ] β [ Group Middleware ] β [ Route Middleware ]Handler Execution:
-
If a function β Executed directly
-
If
[Controller, 'method']:- Instantiates controller (if class passed)
- Binds and executes method
class HomeController { index({ res }: HttpContext) { res.send('Welcome to Home!'); } } Routes.group('/v1', () => { Routes.get('/', [HomeController, 'index']); });- Route paths will be automatically cleaned to avoid duplicate slashes (
//β/). - Controller methods are bound to their instance or static context.
- Handler functions can be
asyncor return a Promise.
MIT License Β© 2025 [Refkinscallv]