UNPKG

@lokalise/api-contracts

Version:
72 lines (71 loc) 3.48 kB
import type { z } from 'zod/v4'; import type { CommonRouteDefinitionMetadata, RoutePathResolver } from '../apiContracts.ts'; import type { HttpStatusCode } from '../HttpStatusCodes.ts'; import type { SSEMethod } from './sseContracts.ts'; import type { SSEEventSchemas } from './sseTypes.ts'; /** * Definition for a dual-mode route. * Use `successResponseBodySchema` for the non-streaming response schema. * * @template Method - HTTP method (GET, POST, PUT, PATCH) * @template Params - Path parameters schema * @template Query - Query string parameters schema * @template RequestHeaders - Request headers schema * @template Body - Request body schema (for POST/PUT/PATCH) * @template SyncResponse - Sync response schema (for Accept: application/json) * @template Events - SSE event schemas (for Accept: text/event-stream) * @template ResponseHeaders - Response headers schema (for sync mode) * @template ResponseSchemasByStatusCode - Alternative response schemas by HTTP status code */ export type DualModeContractDefinition<Method extends SSEMethod = SSEMethod, Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Body extends z.ZodTypeAny | undefined = undefined, SyncResponse extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = { method: Method; pathResolver: Params extends z.ZodTypeAny ? RoutePathResolver<z.infer<Params>> : () => string; requestPathParamsSchema?: Params; requestQuerySchema?: Query; requestHeaderSchema?: RequestHeaders; requestBodySchema: Body; /** Sync response schema - use with `sync` handler */ successResponseBodySchema: SyncResponse; responseHeaderSchema?: ResponseHeaders; /** * Alternative response schemas by HTTP status code. * Used to define different response shapes for error cases (e.g., 400, 404, 500). * * @example * ```ts * responseBodySchemasByStatusCode: { * 400: z.object({ error: z.string(), details: z.array(z.string()) }), * 404: z.object({ error: z.string() }), * } * ``` */ responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode; serverSentEventSchemas: Events; isDualMode: true; metadata?: CommonRouteDefinitionMetadata; description?: string; summary?: string; tags?: readonly string[]; }; /** * Type representing any dual-mode route definition (for use in generic constraints). * Uses a manually defined type to avoid pathResolver type incompatibilities. */ export type AnyDualModeContractDefinition = { method: SSEMethod; pathResolver: RoutePathResolver<any>; requestPathParamsSchema?: z.ZodTypeAny; requestQuerySchema?: z.ZodTypeAny; requestHeaderSchema?: z.ZodTypeAny; requestBodySchema: z.ZodTypeAny | undefined; /** Sync response schema - use with `sync` handler */ successResponseBodySchema: z.ZodTypeAny; responseHeaderSchema?: z.ZodTypeAny; responseBodySchemasByStatusCode?: Partial<Record<HttpStatusCode, z.ZodTypeAny>>; serverSentEventSchemas: SSEEventSchemas; isDualMode: true; metadata?: CommonRouteDefinitionMetadata; description?: string; summary?: string; tags?: readonly string[]; };