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 🙏

© 2026 – Pkg Stats / Ryan Hefner

httyped

v1.1.0

Published

> ⛓️ Type-safe HTTP client/server communications with awesome autocompletion

Readme

httype

⛓️ Type-safe HTTP client/server communications with awesome autocompletion

Let your compiler tell you when you break a contract with your client.

Features

✅ Awesome autocompletion and type safety for request parts

autocompletion and type safety on request parts

✅ Nice and simple route documentation

documentation using types

✅ Compile time and runtime type validation

Compile-time and runtime type validations

Usage

Route

A route is defined by RouteDefiner. This part is shared for both server and client.

:white_check_mark: Supports dynamic parameters

:white_check_mark: Supports a typed request body with io-ts

:white_check_mark: Supports a typed response type with io-ts

Examples:

  • A GET route that returns a string output, with a fixed path of /hello:

    RouteDefiner.get.returns(t.string).fixed("hello");
  • A route that returns a string output, with a dynamic path of /hello/:name:

    RouteDefiner.get
      .returns(t.string)
      .fixed("hello")
      .param("name");
  • A POST route that reads a custom type User from the request body and returns a custom type Greeting:

    const Greeting = t.type({ msg: t.string });
    const User = t.type({ name: t.string });
    
    RouteDefiner.post
      .reads(User)
      .returns(Greeting)
      .fixed("user-to-greeting");

Server

Implementation for servers is by wrapping Express.js

:white_check_mark: Type safe body parsing, thanks to io-ts

:white_check_mark: Awesome autocompletion for routing params and request body

:white_check_mark: Pretty routing table, documentation ready

import { TypedExpress, success } from "httyped/express";
import express from "express";

const app = express();
const typed = TypedExpress.of(app);

typed.route(
  RouteDefiner.get // a get request
    .returns(t.string) // that returns a string
    .fixed("hello") // and its path is
    .param("name"), // `/hello/:name`
  async req => {
    return success(`Hello, ${req.params.name}`);
  }
);

app.listen(3000);
typed.listRoutes(); // Will print a table of routes

Client

A http client based on node-fetch:

:white_check_mark: Type-safety between client and server

:white_check_mark: Autocompletion for request parameters and request body

import { fetcher } from "httyped/fetch";

const User = t.type({ name: string }, "User");

// given a route
const route = RouteDefiner.post
  .reads(User)
  .returns(t.string)
  .fixed("hello")
  .param("greeting");

const fetch = fetcher(route, "http://localhost:3000");
//                           ^ the base URI

const { status, data } = await fetch({
  params: {
    greeting: "Hello"
  },
  body: {
    name: "Gal"
  }
});