Skip to content

Latest commit

 

History

History
106 lines (81 loc) · 3.43 KB

File metadata and controls

106 lines (81 loc) · 3.43 KB

bun-openapi Documentation

Decorator-driven OpenAPI 3.0 generation and request validation for Bun.

bun-openapi is a lightweight framework that lets you define your API with TypeScript decorators and automatically generates a valid OpenAPI 3.0 specification from those definitions. Your controllers and models become the single source of truth — no separate spec files to keep in sync.

Goal

  • TypeScript decorators as the single source of truth for routes, validation, and API documentation.
  • A valid OpenAPI 3.0 spec generated at startup from your controllers — no code generation step required.
  • Runtime request validation and response validation powered by your choice of schema library.
  • Built-in Swagger UI for instant API exploration during development.
  • Lightweight DI container, guards, interceptors, and middleware for production patterns.

Philosophy

  • Rely on decorators to express route metadata; use adapters for validation logic.
  • Minimize boilerplate — a controller class, a few decorators, and createApp() are all you need.
  • Stay close to the platform — bun-openapi targets Bun.serve directly, no compatibility layers.
  • Bring your own validation — class-validator, TypeBox, Zod and Valibot adapters ship out of the box.
  • Keep it small — the goal is a bare minimum for efficient API development, not a kitchen-sink framework.

First Steps

Fundamentals

Techniques

Security and Contracts

Reference

Recipes and Operations

Quick Example

import {
	Controller,
	createApp,
	Get,
	Returns,
	Route,
	Summary,
} from "bun-openapi";
import { classValidator } from "bun-openapi/adapters/class-validator";

class User {
	id!: string;
	name!: string;
}

@Route("/users")
class UserController extends Controller {
	@Get()
	@Summary("List users")
	@Returns(200, [User])
	list() {
		return [];
	}
}

const app = createApp({
	schema: classValidator(),
	controllers: [UserController],
	docs: { swagger: true },
	openapi: { service: { name: "my-api", version: "1.0.0" } },
});

Bun.serve({ port: 3000, routes: app.routes, fetch: app.fetch });

Open http://localhost:3000/docs/swagger/ to see your generated API docs.