0.1.6 • Published 6 years ago

esx-rs v0.1.6

Weekly downloads
4
License
MIT
Repository
github
Last release
6 years ago

ESX-RS

AppVeyor CircleCI Travis CI AppVeyor tests Codecov Code Climate Code Climate

Dependencies Development dependencies Known Vulnerabilities Greenkeeper

A library inspired by JAX-RS, allowing the description of REST endpoints through simple TypeScript decorators.

It has currently been integrated with:

IntegrationTypeDescription
esx-rs-clientClientProxy generator to access remote ESX-RS endpoints through a class instance.
esx-rs-client-angularClientesx-rs-client network transport based on Angular HttpClient.
esx-rs-client-fetchClientesx-rs-client network transport based on Fetch.
esx-rs-client-httpClientesx-rs-client network transport based on Node http.
esx-rs-client-xhrClientesx-rs-client network transport based on XMLHttpRequest.
esx-rs-serverServerDispatch incoming HTTP requests to ESX-RS decorated class methods.
esx-rs-router-expressServeresx-rs-server-based router middleware for Express.
esx-rs-router-koaServeresx-rs-server-based router middleware for Koa.
esx-rs-validationValidationValidation layer based on es-validation.
esx-rs-schema-openapiSchemaSchema generation for OpenAPI 3.0.

Getting Started

The library can be installed using npm:

npm install esx-rs --save

Or using yarn:

yarn add esx-rs

Endpoints can then be described using decorators:

@Path('/users')
@Produces('application/json')
@Consumes('application/json')
class UsersEndpoint {

    @POST
    async createUser(user: User): Promise<User> {
        // ...
    }

    @PUT @Path('/:userId')
    async updateUser(@PathParam('userId') userId: string, user: User): Promise<User> {
        // ...
    }

    @GET @Path('/:userId')
    async getUser(@PathParam('userId') userId: string): Promise<User> {
        // ...
    }

    @DELETE @Path('/:userId')
    async deleteUser(@PathParam('userId') userId: string): Promise<void> {
        // ...
    }

}

Usage

Various decorators are available, each targetting a subset of the typical REST properties for a service.

Method

The HTTP method(s) can be specified using:

  • @DELETE
  • @GET
  • @HEAD
  • @OPTIONS
  • @PATCH
  • @POST
  • @PUT
  • @HttpMethod

Path

The resource path can be specified using:

  • @Path

Note: the path-to-regexp format is used, e.g. /path/to/:resourceId/subpath/:subresourceId.

Resource Type

The type of resource, either consumed by the operation (mapped to content-type) or produced by the operation (mapped to accept), can be specified using:

  • @Consumes
  • @Produces

Multiple media types may be specified.

Parameters

Operation parameters and resource properties are mapped using a specific decorator for each parameter type:

  • @CookieParam
  • @FormParam
  • @HeaderParam
  • @MatrixParam
  • @QueryParam
  • @PathParam

Context

It is also possible to map the following context information to a parameter using the @ContextParam decorator:

  • HttpContext
  • HttpRequest
  • HttpResponse

Endpoint vs. Operation

Many decorators can be applied to both a class and its methods.

In this scenario, the OperationInfo object returned for a method contains merged information that includes both the operation and the endpoint information.

The following decorators can be applied to both classes and methods:

  • @DELETE, @GET, @HEAD, @OPTIONS, @PATCH, @POST and @PUT
  • @Consumes and @Produces
  • @Path

The @Path decorator is handled a bit differently: the operation path is appended to the endpoint path.

Limitations

At the moment, only concrete classes can be decorated.

This is due to the way ECMAScript gets generated, as interfaces no longer exist in the generated code.