plane/packages/decorators
2025-09-30 19:28:15 +05:30
..
src [WIKI-679] refactor: live server (#7720) 2025-09-30 19:28:15 +05:30
.eslintignore feat: express decorators for rest apis and websocket (#6818) 2025-03-26 20:24:05 +05:30
.eslintrc.js [WEB-4790] fix: moved typescript parser to the base eslint config (#7658) 2025-08-27 21:03:20 +05:30
.prettierignore feat: migrate to pnpm from yarn (#7593) 2025-08-19 20:06:42 +05:30
.prettierrc [SILO-454] chore: refactor decorator, logger packages (#7618) 2025-08-29 14:29:16 +05:30
package.json [WIKI-679] refactor: live server (#7720) 2025-09-30 19:28:15 +05:30
README.md [SILO-454] chore: refactor decorator, logger packages (#7618) 2025-08-29 14:29:16 +05:30
tsconfig.json [SILO-454] chore: refactor decorator, logger packages (#7618) 2025-08-29 14:29:16 +05:30
tsdown.config.ts [WEB-4810] feat: migrate to tsdown from tsup (#7679) 2025-09-03 14:01:57 +05:30

@plane/decorators

A lightweight TypeScript decorator library for building Express.js controllers with a clean, declarative syntax.

Features

  • TypeScript-first design
  • Decorators for HTTP methods (GET, POST, PUT, PATCH, DELETE)
  • WebSocket support
  • Middleware support
  • No build step required - works directly with TypeScript files

Installation

This package is part of the Plane workspace and can be used by adding it to your project's dependencies:

{
  "dependencies": {
    "@plane/decorators": "workspace:*"
  }
}

Usage

Basic REST Controller

import { Controller, Get, Post, BaseController } from "@plane/decorators";
import { Router, Request, Response } from "express";

@Controller("/api/users")
class UserController extends BaseController {
  @Get("/")
  async getUsers(req: Request, res: Response) {
    return res.json({ users: [] });
  }

  @Post("/")
  async createUser(req: Request, res: Response) {
    return res.json({ success: true });
  }
}

// Register routes
const router = Router();
const userController = new UserController();
userController.registerRoutes(router);

WebSocket Controller

import { Controller, WebSocket, BaseWebSocketController } from "@plane/decorators";
import { Request } from "express";
import { WebSocket as WS } from "ws";

@Controller("/ws/chat")
class ChatController extends BaseWebSocketController {
  @WebSocket("/")
  handleConnection(ws: WS, req: Request) {
    ws.on("message", (message) => {
      ws.send(`Received: ${message}`);
    });
  }
}

// Register WebSocket routes
const router = require("express-ws")(app).router;
const chatController = new ChatController();
chatController.registerWebSocketRoutes(router);

API Reference

Decorators

  • @Controller(baseRoute: string) - Class decorator for defining a base route
  • @Get(route: string) - Method decorator for HTTP GET endpoints
  • @Post(route: string) - Method decorator for HTTP POST endpoints
  • @Put(route: string) - Method decorator for HTTP PUT endpoints
  • @Patch(route: string) - Method decorator for HTTP PATCH endpoints
  • @Delete(route: string) - Method decorator for HTTP DELETE endpoints
  • @WebSocket(route: string) - Method decorator for WebSocket endpoints
  • @Middleware(middleware: RequestHandler) - Method decorator for applying middleware

Classes

  • BaseController - Base class for REST controllers
  • BaseWebSocketController - Base class for WebSocket controllers

License

This project is licensed under the GNU Affero General Public License v3.0.