@lokalise/api-contracts
Version:
72 lines (71 loc) • 3.48 kB
TypeScript
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[];
};