npm.io
3.52.1 • Published 1 year ago

@ts-rest/open-api

Licence
MIT
Version
3.52.1
Deps
2
Size
39 kB
Vulns
0
Weekly
0
Stars
3.3K

ts-rest

Incrementally adoptable RPC-like client and server helpers for a magical end to end typed experience

GitHub Repo stars License Bundle Size

Join us on Discord for help, feedback, and discussions!


Discord Shield

Introduction

ts-rest offers a simple way to define a contract for your API, which can be both consumed and implemented by your application, giving you end to end type safety without the hassle or code generation.

Features

  • End-to-end type safety
  • RPC-like client side API ️
  • Small Bundle Size
  • No Code Generation
  • Zod support for runtime validation
  • Full optional OpenAPI integration

Start reading the official Quickstart Guide

Super Simple Example

Easily define your API contract somewhere shared

const contract = c.router({
  getPosts: {
    method: 'GET',
    path: '/posts',
    query: z.object({
      skip: z.number(),
      take: z.number(),
    }), // <-- Zod schema
    responses: {
      200: c.type<Post[]>(), // <-- OR normal TS types
    },
    headers: z.object({
      'x-pagination-page': z.coerce.number().optional(),
    }),
  },
});

Fulfill the contract on your server, with a type-safe router:

const router = s.router(contract, {
  getPosts: async ({ params: { id } }) => {
    return {
      status: 200,
      body: prisma.post.findUnique({ where: { id } }),
    };
  },
});

Consume the api on the client with a RPC-like interface:

const result = await client.getPosts({
  headers: { 'x-pagination-page': 1 },
  query: { skip: 0, take: 10 },
  // ^-- Fully typed!
});

Quickstart

Create a contract, implement it on your server then consume it in your client. Incrementally adopt, trial it with your team, then get shipping faster.

Start reading the official Quickstart Guide

Contributors

MASSIVE Thanks to all of these wonderful people (emoji key), who have helped make ts-rest possible:

Youssef Gaber
Youssef Gaber

Per Hermansson
Per Hermansson

Grégory Houllier
Grégory Houllier

Michael Angelo
Michael Angelo

Pieter Venter
Pieter Venter

Rifaldhi AW
Rifaldhi AW

Jonathan White
Jonathan White

Max Brosnahan
Max Brosnahan

Oliver Butler
Oliver Butler

Adrian Barylski
Adrian Barylski

Neil A. Dobson
Neil A. Dobson

Eric Do
Eric Do

Ben
Ben

LW
LW

Andrew Vance
Andrew Vance

Star History

Since our first commit in 2022 we've been growing steadily. We're proud of our progress and we're excited about the future.

Join us on Discord for help, feedback, and discussions!


Discord Shield