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

express-typed-rpc

v2.0.0

Published

Easily create a fully-typed Express JSON RPC API over HTTP. No code generation step required. Inspired by tRPC, but much simpler.

Downloads

97

Readme

express-typed-rpc

WARNING! This repo is still a work in progress. Please contribute if you're interested ❤️

build status semantic-release Conventional Commits SemVer

Simple express middleware to easily create a fully-typed JSON API over HTTP on both the server-side and client-side. This project is inspired by tRPC, but much simpler.

Crazy Simple and Easy to Use 😃

  • Works out of the box with express and Typescript
  • No magic or black boxes
  • No code generation or build steps! Works 100% statically via Typescript's infer keyword
  • No writing type specifications
  • Minimal configuration
  • Client included!
  • Tiny codebase (~50LOC) with minimal dependencies. Written in clean, simple Typescript. Contribute or fork and make it your own.

Make Your Code More Reliable and Go Faster! 🚀

  • Take advantage of Typescript and turn your runtime errors into compiler-time errors! Inputs and outputs are both fully typed.
  • Easily unit-test your express handlers since they are now no longer dependent on req and res

Installation

npm i express-typed-rpc

Example Usage

server.ts

import express from 'express';
import { Router } from 'express';
import { createAPI, InferAPI } from 'express-typed-rpc/dist/server';

const apiRouter = Router();

const api = {
    greet: (name: string): string => `Hello, ${name}!`,
    multiply: (args: {a: number, b: number}): number => args.a * args.b
};

createAPI(apiRouter, api);

// Export type for use on client
export type API = InferAPI<typeof api>;

const app = express();

app.use('/api', apiRouter);
app.listen(process.env.PORT || 3000);

dom-client.ts

import {client} from 'express-typed-rpc/dist/client';
import type {API} from '@yourorg/server' 

const greet = async (name: string): Promise<string> => {
    return await client<API['greet']>('greet', name, {
        endpoint: 'https://api.yourdomain.com',
        options: {} // fetch options (window.RequestInit)
    });
};

const multiply = async (numbers: {a: number, b: number}): Promise<number> => {
    return await client<API['multiply']>('multiply', numbers, {
        endpoint: 'https://api.yourdomain.com',
        options: {} // fetch options (window.RequestInit)
    });
};

node-client.ts

import {client} from 'express-typed-rpc/dist/client-node';
import type {API} from '@yourorg/server'

const greet = async (name: string): Promise<string> => {
    return await client<API['greet']>('greet', name, {
        endpoint: 'https://api.yourdomain.com',
        options: {} // https.RequestOptions
    });
};

const multiply = async (numbers: {a: number, b: number}): Promise<number> => {
    return await client<API['multiply']>('multiply', numbers, {
        endpoint: 'https://api.yourdomain.com',
        options: {} // https.RequestOptions
    });
};

You must publish your backend as a private repo (Github Packages is recommended). Only the Typescript types are exported/imported and does not affect runtime. You will enjoy the same performance but with IDE autocompletion, validation, and compile-time TypeScript errors.

Contribution

Please contribute to this project! Issue a PR against main and request review.

  • Please test your work thoroughly.
  • Make sure all tests pass with appropriate coverage.

How to build locally

npm i

Running tests

npm test