Skip to main content

Overview

The EndpointsFactory class creates endpoint builders that include middleware, result handlers, and shared configuration. It provides a fluent API for composing reusable endpoint factories.
import { EndpointsFactory, defaultResultHandler } from "express-zod-api";

const factory = new EndpointsFactory(defaultResultHandler)
  .addMiddleware(authMiddleware)
  .addContext(async () => ({ db: await connectDB() }));

Pre-built Factories

defaultEndpointsFactory

Uses defaultResultHandler with standard JSON responses

arrayEndpointsFactory

(Deprecated) For migrating legacy APIs that return arrays

Methods

build()

Creates an endpoint with input/output schemas and a handler.
const endpoint = factory.build({
  method: "post",
  input: z.object({ name: z.string() }),
  output: z.object({ id: z.number(), name: z.string() }),
  handler: async ({ input, ctx, logger }) => {
    return { id: 1, name: input.name };
  },
});

buildVoid()

Shorthand for endpoints that return empty objects.
const deleteEndpoint = factory.buildVoid({
  method: "delete",
  input: z.object({ id: z.string() }),
  handler: async ({ input }) => {
    await deleteUser(input.id);
  },
});

addMiddleware()

Adds middleware that provides context and executes before endpoints.
const authFactory = factory.addMiddleware({
  input: z.object({ token: z.string() }),
  handler: async ({ input }) => {
    const user = await validateToken(input.token);
    return { user };
  },
});

addExpressMiddleware() / use()

Integrates native Express middleware.
import { auth } from "express-oauth2-jwt-bearer";

const factory = defaultEndpointsFactory.use(auth(), {
  provider: (req) => ({ auth: req.auth }),
});

addContext()

Provides request-independent context.
const factory = defaultEndpointsFactory.addContext(async () => ({
  db: await mongoose.connect("mongodb://localhost"),
}));

See Also