Files
plane/packages/decorators
Aaron Heckmann 57479f4554 fix: lint (#7433)
* chore: fix lint

* fix: constants check:lint command

* chore(lint): permit unused vars which begin w/ _

* chore: rm dead code

* fix(lint): more lint fixes to constants pkg

* fix(lint): lint the live server

- fix lint issues

* chore: improve clean script

* fix(lint): more lint

* chore: set live server process title

* chore(deps): update to turbo@2.5.5

* chore(live): target node22

* fix(dev): add missing ui pkg dependency

* fix(dev): lint decorators

* fix(dev): lint space app

* fix(dev): address lint issues in types pkg

* fix(dev): lint editor pkg

* chore(dev): moar lint

* fix(dev): live server exit code

* chore: address PR feedback

* fix(lint): better TPageExtended type

* chore: refactor

* chore: revert most live server changes

* fix: few more lint issues

* chore: enable ci checks

Ensure we can build + confirm that lint is not getting worse.

* chore: address PR feedback

* fix: web lint warning added to package.json

* fix: ci:lint command

---------

Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
2025-07-25 01:44:51 +05:30
..
2025-07-25 01:44:51 +05:30
2025-07-25 01:44:51 +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.