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 🙏

© 2024 – Pkg Stats / Ryan Hefner

typescript-rest-rpc

v1.0.10

Published

Auto generate client and server stubs for RESTful services based on TS source

Downloads

17

Readme

REST RPC for TypeScript

This library allows you to define your RESTful API in a TypeScript interface. That interface definition could be share between your backend and frontend code bases. From that interface library can generate client and server stubs.

Uses Koa.JS for server stubs and Fetch to make client requests.

Example

Installation

yarn add typescript-rest-rpc

Code

shared.ts:

export interface Backend {
    login({ username, password }): Promise<{ token: string }>
}

server.ts:

import { createServerRouter } from "typescript-rest-rpc/lib/server"

class BackendImpl implements Backend {
    async login({ username, password }): Promise<{ token: string }> {
        if (username == "admin" && password == "123456")
            return { token: "ok" }

        throw new BadRequest("Invalid login or password")
    }
}

const backendRouter = createServerRouter("/api", new BackendImpl())
app.use(backendRouter.routes())

client.ts:

import { createClient } from "typescript-rest-rpc/lib/client"

const client: Backend = createClient("http://localhost:9090/api")
console.log(await client.login({ username: "admin", password: "123456" }))

With this code you can even Ctrl-Click from your client code to your backend implementation to quick find how API is implemented!

Features

  • Generating client and server RPC proxies based on zero-config TS interface.
  • File upload support via multipart encoding (uses koa-multer under the hood).
  • Binary data download.
  • JSON bodies auto-parsing with Date revival.
  • Supported client envs: Node.JS (with isomorphic-fetch), browser, react-native(see notes).
  • Generation of OpenAPI (Swagger) YAMLs with API description

Implementation flaws

  • untyped File in Multipart definition
  • untyped File in binary download
  • ctx parameter is untyped and should be defined in the base interface

Notes on the implementation

React-Native clients

For generating clients ES6 Proxy is used. However, React-Native doesn't support ES6 proxy on some devices, see this RN Issue. And no polyfills could exist that will handle dynamic properties. So for React Native you should explicitly list your interface operations:

export let backend: Backend = createClient(url, { ... }, 
    [ "login", "resetPassword", etc ]
)