Skip to content

exfajs/exfa

Repository files navigation

Exfa 🚀

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.

Features

  • 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

Exfa vs 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

Installation

npm install exfa
# or
bun add exfa

Quick Start

// index.ts
import exfa from 'exfa';

const app = exfa();

// Type-safe route parameters
app.get<{ id: string }>('/users/:id', (req, res) => {
  // req.params.id is typed as string with autocomplete!
  res.json({ userId: req.params.id });
});

// Type-safe body
interface CreateUserBody {
  name: string;
  email: string;
}

app.post<{}, CreateUserBody>('/users', (req, res) => {
  // req.body is typed as CreateUserBody
  const { 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.ts

Express Middleware Compatibility

All Express middleware works seamlessly:

import exfa from 'exfa';
import cors from 'cors';
import helmet from 'helmet';
import compression from 'compression';

const app = 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'));

Built-in Middleware

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

Migration from Express

- 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.

License

MIT

About

express for all => exfa

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors