Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/KindaSloth/zod-express-endpoint
Create fully inferred typesafe express endpoints using zod schemas
https://github.com/KindaSloth/zod-express-endpoint
Last synced: 8 days ago
JSON representation
Create fully inferred typesafe express endpoints using zod schemas
- Host: GitHub
- URL: https://github.com/KindaSloth/zod-express-endpoint
- Owner: KindaSloth
- Created: 2023-02-09T22:55:22.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2023-02-16T00:11:49.000Z (over 1 year ago)
- Last Synced: 2024-03-27T00:04:08.153Z (8 months ago)
- Language: TypeScript
- Size: 77.1 KB
- Stars: 9
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Intro
### Create fully inferred typesafe express endpoints using zod schemas
https://user-images.githubusercontent.com/55771765/217964766-edb63238-7079-442f-86ba-8ce94bf1382a.mp4
## How to Install
```
$ yarn add zod-express-endpoint# or
$ npm i zod-express-endpoint
```## Basic usage
```ts
import express, { json } from "express";
import { z } from "zod";
import { TypeSafeEndpoint } from "zod-express-endpoint";const server = express();
server.use(json());
const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
server.post(
"/api",
endpoint.create(
{
bodySchema: z.object({ message: z.string() }),
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
const { message } = req.body;return send(200, { message });
}
)
);
```## Options
```ts
const endpoint = new TypeSafeEndpoint({
zodErrorMode: "always",
customUnexpectedError: "Oh no",
});
```| Syntax | Type | Required | Description |
| --------------------- | ------------ | -------- | ------------------------------------------------------------------- |
| zodErrorMode | ZodErrorMode | true | Endpoint will trigger zod errors in production, development or both |
| customUnexpectedError | String | false | Error Message when some unexpected error happens |```ts
type ZodErrorMode = "production" | "development" | "always";
```## Typing Body Params
```ts
import { TypeSafeEndpoint } from "zod-express-endpoint";const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
bodySchema: z.object({ message: z.string() }),
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
const { message } = req.body;return send(200, { message });
}
);
```## Typing Path Params
```ts
import { TypeSafeEndpoint } from "zod-express-endpoint";const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
paramsSchema: z.object({ message: z.string() }),
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
const { message } = req.params;return send(200, { message });
}
);
```## Typing Query Params
```ts
import { TypeSafeEndpoint } from "zod-express-endpoint";const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
querySchema: z.object({ message: z.string() }),
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
const { message } = req.query;return send(200, { message });
}
);
```## Typing Endpoint Return
```ts
import { TypeSafeEndpoint } from "zod-express-endpoint";const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
return send(200, { message: "Hello there" });
}
);
```## Emitting Custom Errors
```ts
import { TypeSafeEndpoint, EndpointError } from "zod-express-endpoint";const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
return send(400, { error: 'Error' });
}
);# or
import { TypeSafeEndpoint, EndpointError } from "zod-express-endpoint";
const endpoint = new TypeSafeEndpoint({ zodErrorMode: "always" });
const exampleEndpoint = endpoint.create(
{
responseSchema: z.object({ message: z.string() }),
},
async (req, _res, send) => {
throw new EndpointError("Error");
}
);
```