npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@nodeboot/starter-openapi

v2.4.9

Published

OpenAPI plugin for Node-Boot. It allows OpenAPI specs to be automatically generated from controller endpoints

Readme

📘 @nodeboot/starter-openapi – Node-Boot OpenAPI Starter

Overview

The @nodeboot/starter-openapi package generates an OpenAPI 3 specification from your Node-Boot controllers and can also serve Swagger UI for interactive API documentation.

It reads Node-Boot route metadata, request parameter metadata, response metadata, model metadata, and class-validator rules to build a spec automatically.


✨ Features

Automatic OpenAPI 3 generation from Node-Boot controllers
Swagger UI integration at /api-docs
Schema generation from models decorated with @Model()
class-validator support for richer schema output
Endpoint customization with @OpenAPI()
Response documentation with @ResponseSchema()
Works with Express, Fastify, Koa, and native HTTP


🚀 Installation

pnpm add @nodeboot/starter-openapi

🔥 Usage

1️⃣ Enable OpenAPI generation

Add @EnableOpenApi() to your application class. This exposes the generated JSON spec at:

  • /api-docs/swagger.json

If you also want the Swagger UI, add @EnableSwaggerUI().

import "reflect-metadata";
import {Container} from "typedi";
import {NodeBoot, NodeBootApp, NodeBootApplication, NodeBootAppView} from "@nodeboot/core";
import {ExpressServer} from "@nodeboot/express-server";
import {EnableDI} from "@nodeboot/di";
import {EnableComponentScan} from "@nodeboot/aot";
import {EnableOpenApi, EnableSwaggerUI} from "@nodeboot/starter-openapi";

@EnableDI(Container)
@EnableOpenApi()
@EnableSwaggerUI()
@EnableComponentScan()
@NodeBootApplication()
export class SampleApp implements NodeBootApp {
    start(): Promise<NodeBootAppView> {
        return NodeBoot.run(ExpressServer);
    }
}

@EnableOpenApi() enables spec generation. @EnableSwaggerUI() additionally serves the Swagger UI at /api-docs/ and redirects /docs to /api-docs/.


2️⃣ Document controller endpoints

Use @ResponseSchema() to describe successful responses and @OpenAPI() to override or extend the generated operation. @OpenAPI() can be applied at the controller or method level.

import {Body, Controller, Get, HttpCode, Param, Post, Put} from "@nodeboot/core";
import {OpenAPI, ResponseSchema} from "@nodeboot/starter-openapi";
import {CreateUserDto, UpdateUserDto, UserModel} from "../models";

@Controller("/users", "v1")
export class UserController {
    @Get("/")
    @ResponseSchema(UserModel, {isArray: true, description: "Return a list of users"})
    async getUsers(): Promise<UserModel[]> {
        return [];
    }

    @Get("/:id")
    @OpenAPI({summary: "Get a user by ID"})
    @ResponseSchema(UserModel)
    async getUserById(@Param("id") userId: string): Promise<UserModel> {
        return {} as UserModel;
    }

    @Post("/")
    @HttpCode(201)
    @OpenAPI({summary: "Create a new user"})
    @ResponseSchema(UserModel)
    async createUser(@Body() userData: CreateUserDto): Promise<UserModel> {
        return {} as UserModel;
    }

    @Put("/:id")
    @OpenAPI({summary: "Update a user"})
    @ResponseSchema(UserModel)
    async updateUser(@Param("id") userId: string, @Body() userData: UpdateUserDto): Promise<UserModel> {
        return {} as UserModel;
    }
}

What is inferred automatically:

  • paths from @Controller() + HTTP method decorators
  • path params from @Param() and route templates like /:id
  • query params from query parameter decorators and query DTOs
  • request body from @Body() / body parameter metadata
  • success status code from response metadata such as @HttpCode(201)
  • tags from the controller class name (for example UserControllerUser)

3️⃣ Document response bodies

@ResponseSchema() accepts either a model class or a primitive type string.

Model response

@Get("/:id")
@ResponseSchema(UserModel)
async getUserById(@Param("id") userId: string): Promise<UserModel> {
    return {} as UserModel;
}

Array response

@Get("/")
@ResponseSchema(UserModel, {isArray: true, description: "Return a list of users"})
async getUsers(): Promise<UserModel[]> {
    return [];
}

Primitive response

import {Controller, Get} from "@nodeboot/core";
import {ResponseSchema} from "@nodeboot/starter-openapi";

@Controller("/hello", "v1")
export class HelloController {
    @Get("/")
    @ResponseSchema("string")
    async hello(): Promise<string> {
        return "Hello, World!";
    }
}

Supported primitive names include string, number, integer, boolean, object, and array.


4️⃣ Define schemas with @Model()

Use @Model() on DTOs and response models that should appear under components.schemas. For response classes, @ResponseSchema() can auto-register the class, but explicitly decorating models with @Model() is the clearest approach.

import {Property} from "@nodeboot/core";
import {IsEmail} from "class-validator";
import {Model} from "@nodeboot/starter-openapi";

@Model()
export class UserModel {
    @Property({description: "User ID"})
    id: number;

    @Property({description: "User email address"})
    @IsEmail()
    email: string;

    @Property({description: "User name"})
    name?: string;
}

5️⃣ Use validation decorators for richer schemas

Validation metadata is converted into OpenAPI schema details through class-validator-jsonschema.

import {IsNotEmpty, IsString, MaxLength, MinLength} from "class-validator";
import {Model} from "@nodeboot/starter-openapi";

@Model()
export class UpdateUserDto {
    @IsString()
    @IsNotEmpty()
    @MinLength(9)
    @MaxLength(32)
    password: string;
}

This is especially useful for request DTOs passed to @Body().


6️⃣ Generic models are supported

The starter can resolve generic model bindings when you provide them to @Model().

import {Page} from "@nodeboot/core";
import {Model} from "@nodeboot/starter-openapi";
import {UserModel} from "./UserModel";

@Model({T: UserModel})
export class UserPage extends Page<UserModel> {}

This pattern is used in the sample MongoDB application for paginated responses.


7️⃣ Configure OpenAPI metadata in app-config.yaml

OpenAPI settings are loaded from the openapi configuration path.

openapi:
    info:
        contact:
            name: "Manuel Santos"
            email: "[email protected]"
            url: "https://www.linkedin.com/in/manuel-brito-dos-santos-a7a20a6b/"
        license:
            name: MIT
            url: "https://github.com/nodejs-boot/node-boot/blob/main/LICENSE"
    servers:
        - url: http://localhost:3000
          description: Localhost server
    externalDocs:
        url: "https://nodeboot.gitbook.io/"
        description: "Node-Boot official documentation"
    securitySchemes:
        basicAuth:
            scheme: "basic"
            type: "http"

Supported config keys are:

  • info
  • servers
  • security
  • tags
  • externalDocs
  • securitySchemes

If present, these values are merged into the generated OpenAPI document. By default, title, version, and description are taken from the application's build info and can be overridden here.


8️⃣ Swagger UI routes

When @EnableSwaggerUI() is enabled, the starter serves:

  • GET /api-docs/ → Swagger UI
  • GET /api-docs/swagger.json → generated OpenAPI JSON
  • GET /docs → redirect to /api-docs/

These routes are built into the starter for all supported server adapters.


🧠 How spec generation works

At startup, the starter:

  1. collects Node-Boot controller/action metadata
  2. converts controller routes into OpenAPI paths
  3. infers parameters and request bodies from method parameter metadata
  4. builds schemas from @Model() classes
  5. merges in class-validator-derived schemas
  6. loads precompiled schemas from dist/node-boot-models.json when available
  7. merges openapi config values into the final document

@OpenAPI() metadata is applied last, so it can override generated operation fields such as summary, description, responses, security, and more.


📦 Exports

This package primarily exposes:

  • EnableOpenApi
  • EnableSwaggerUI
  • OpenAPI
  • ResponseSchema
  • Model

✅ Supported servers

  • Express
  • Fastify
  • Koa
  • Native HTTP

📄 License

MIT