A lightweight Express-compatible framework built from scratch with Node.js core modules.
app.listen(port, cb)over Nodehttp- Routing:
get,post,put,patch,delete - Middleware system with
app.use(...)andnext() - Route-specific middleware (
app.get('/admin', auth, handler)) - Dynamic route params (
/users/:id/books/:bookId) - Request helpers:
req.params,req.query,req.body - Response helpers:
res.status,res.send,res.json,res.redirect - Async handler support with automatic promise rejection forwarding
- Centralized error middleware
- Nested routers (
mini.Router()+app.use('/prefix', router)) - Static file middleware (
mini.static(dir)) - JSON body parser (
mini.json()) - Next.js-like file-based API routing (
app.useFileRoutes,mini.fileRoutes) - Built-in 404 JSON response
- TypeScript declarations (
index.d.ts)
npm installconst mini = require('./index');
const app = mini();
app.use(mini.json());
app.get('/', (req, res) => {
res.send('Hello from Mini Express');
});
app.get('/users/:id', (req, res) => {
res.json({ id: req.params.id });
});
app.listen(3000, () => {
console.log('http://localhost:3000');
});examples/api/users/[id].js maps to GET /api/users/:id.
const path = require('node:path');
const mini = require('./index');
const app = mini();
app.useFileRoutes(path.join(__dirname, 'api'), { basePath: '/api' });Supported conventions:
index.js=> directory root route[id].js=> dynamic param:id[...slug]/index.js=> catch-all param:slug*- named exports:
get,post,put,patch,delete
npm test- run unit testsnpm run typecheck- verify TypeScript usagenpm start- runexamples/basic.js
examples/basic.jsexamples/router.jsexamples/auth.jsexamples/rest-api.jsexamples/file-routes.jsexamples/typescript.ts
This project intentionally keeps implementation simple and readable while following good structure and naming conventions.