TypeScript-first Express-compatible web framework
Exfa is a modern, type-safe rewrite of Express.js that provides first-class TypeScript support while maintaining 100% API compatibility with Express middleware.
- ✅ TypeScript-first - Full generics for
req.params,req.body,req.query - ✅ Express compatible - All Express middleware works out of the box
- ✅ Modern - ES2022, NodeNext modules
- ✅ Type-safe - Strict mode with comprehensive type definitions
- ✅ Same API - Drop-in replacement for Express
| Feature | Express | Exfa |
|---|---|---|
| TypeScript Support | ❌ Requires @types/express | ✅ Built-in |
| Type-safe params | ❌ req.params.id is any | ✅ req.params.id is string |
| Type-safe body | ❌ req.body is any | ✅ Full generics support |
| Bundle Size | ~200KB | ~35KB |
| Module Format | CommonJS only | ESM + CJS |
| Middleware | ✅ All work | ✅ 100% compatible |
| API | Express API | Same API |
npm install exfa
# or
bun add exfa// index.tsimportexfafrom'exfa';constapp=exfa();// Type-safe route parametersapp.get<{id: string}>('/users/:id',(req,res)=>{// req.params.id is typed as string with autocomplete!res.json({userId: req.params.id});});// Type-safe bodyinterfaceCreateUserBody{name: string;email: string;}app.post<{},CreateUserBody>('/users',(req,res)=>{// req.body is typed as CreateUserBodyconst{ name, email }=req.body;res.status(201).json({ name, email });});app.listen(3000,()=>{console.log('Exfa server running on http://localhost:3000');});Run:
npx tsx index.tsAll Express middleware works seamlessly:
importexfafrom'exfa';importcorsfrom'cors';importhelmetfrom'helmet';importcompressionfrom'compression';constapp=exfa();app.use(cors());app.use(helmet());app.use(compression());app.use(exfa.json());app.use(exfa.urlencoded({extended: true}));app.use(exfa.static('public'));| Middleware | Description |
|---|---|
exfa.json() | Parse JSON bodies |
exfa.urlencoded() | Parse URL-encoded bodies |
exfa.raw() | Parse raw bodies |
exfa.text() | Parse text bodies |
exfa.static() | Serve static files |
- import express from 'express';+ import exfa from 'exfa';- const app = express();+ const app = exfa();No other changes needed! All your routes and middleware work as-is.
MIT