0.2.2 • Published 6 months ago

path-painter v0.2.2

Weekly downloads
-
License
ISC
Repository
github
Last release
6 months ago

Path Painter

A dynamic and intuitive library for Node.js, enabling developers to 'paint' their application's routes effortlessly. Leveraging the power of decorators, it transforms controller definitions into beautifully crafted, easy-to-manage routes (ChatGPT). Also, there is a support of simple dependency injection by marking classes with appropriate decorators.

Features:

  • @Controller decorator which allows class to be registered as controller
  • @Middleware decorator which allows class to be used as middleware
  • @Get, @Post, @Put, @Delete decorators for controller methods. Decorating methods with these decorators automatically creates corresponding routs.
  • @UseBefore, @UseAfter decorators for registering middlewares on method or class level.
  • @IsBoolean, @IsString, @IsNumber decorators for validating input data
  • @Body, @Header, @Query, @Param decorators for injecting corresponding data into the methods
  • @Injectable, @Singleton, @Transient decorators for constructing classes via di container

Controller example

Below can be found simple example of controller. Despite on name MethodLevelMiddleware can be applied on class level as well

@UseBefore(ClassLevelMiddleware)
@Controller("/users")
export class UserController {
    @UseBefore(MethodLevelMiddleware)
    @Get("/:id")
    getUser(@Param("id") id: number): UserModel {
        console.log(`Getting user by ${id} id`);
        return {
            id,
            name: "Test Name",
            age: -1,
        };
    }

    @UseAfter(MethodLevelMiddleware)
    @Post()
    createUser(@Body dto: CreateUserDto) {
        console.log("Received dto: ", dto);
        return -1;
    }
}

Middleware example

Below can be found simple example of middleware.

@Middleware()
export class ClassLevelMiddleware implements IMiddleware {
    use(
        request: Request,
        response: Response,
        next: (err?: unknown) => unknown,
    ): void {
        next();
    }
}

Model validation example

Below can be found example of model with property validation decorators.

class CreateUserDto {
    @IsString()
    name?: string;
    @IsNumber({isOptional: true})
    age?: number;
}

Startup example

Library provides class-container AppContainer for encapsulating logic of setting up and starting of an application.

Example of usage can be seen below.

function main() {
    const config: AppConfig = {
        cors: true,
        globalPrefix: "api",
        controllers: [UserController],
    };

    const appContainer = new AppContainer();
    appContainer.build(config);

    appContainer.start(8000, () => {
        console.log(`[server]: Server is running at http://localhost:${8000}`);
    });
}

main();

Dependency injection example

@Injectable(InjectionType.Singleton)
class SomeRepository {
    public test() {
        console.log("repo");
    }
}

@Transient
class SomeService {
    constructor(private readonly repo: SomeRepository) {
    }

    public test() {
        console.log("service");
    }

    public testRepo() {
        this.repo.alive();
    }
}

@Middleware()
export class ClassLevelMiddleware implements IMiddleware {
    constructor(private readonly service: SomeService) {
    }

    use(
        request: Request,
        response: Response,
        next: (err?: unknown) => unknown,
    ): void {
        this.service.test();
        next();
    }
}
0.2.1

7 months ago

0.2.2

6 months ago

0.1.4

10 months ago

0.1.3

10 months ago

0.1.2

10 months ago

0.1.1

10 months ago

0.1.0

10 months ago