1.0.4 • Published 2 years ago

zod-express-endpoint v1.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

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

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

const endpoint = new TypeSafeEndpoint({
  zodErrorMode: "always",
  customUnexpectedError: "Oh no",
});
SyntaxTypeRequiredDescription
zodErrorModeZodErrorModetrueEndpoint will trigger zod errors in production, development or both
customUnexpectedErrorStringfalseError Message when some unexpected error happens
type ZodErrorMode = "production" | "development" | "always";

Typing Body Params

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

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

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

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

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");
  }
);
1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago