@lokalise/api-contracts
Version:
165 lines (164 loc) • 10.1 kB
TypeScript
import type { z } from 'zod/v4';
import type { CommonRouteDefinitionMetadata, RoutePathResolver } from '../apiContracts.ts';
import type { HttpStatusCode } from '../HttpStatusCodes.ts';
import type { DualModeContractDefinition } from './dualModeContracts.ts';
import type { SSEContractDefinition } from './sseContracts.ts';
import type { SSEEventSchemas } from './sseTypes.ts';
/**
* Configuration for building a GET SSE route.
* Forbids requestBodySchema for GET variants.
*/
export type SSEGetContractConfig<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Events extends SSEEventSchemas = SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
method: 'get';
pathResolver: Params extends z.ZodTypeAny ? RoutePathResolver<z.infer<Params>> : () => string;
requestPathParamsSchema?: Params;
requestQuerySchema?: Query;
requestHeaderSchema?: RequestHeaders;
serverSentEventSchemas: Events;
/**
* Error response schemas by HTTP status code.
* Used to define response shapes for errors that occur before streaming starts
* (e.g., authentication failures, validation errors, not found).
*
* @example
* ```ts
* responseBodySchemasByStatusCode: {
* 401: z.object({ error: z.literal('Unauthorized') }),
* 404: z.object({ error: z.string() }),
* }
* ```
*/
responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
requestBodySchema?: never;
successResponseBodySchema?: never;
metadata?: CommonRouteDefinitionMetadata;
description?: string;
summary?: string;
tags?: readonly string[];
};
/**
* Configuration for building a POST/PUT/PATCH SSE route with request body.
* Requires requestBodySchema for payload variants.
*/
export type SSEPayloadContractConfig<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Body extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined> = {
method: 'post' | 'put' | 'patch';
pathResolver: Params extends z.ZodTypeAny ? RoutePathResolver<z.infer<Params>> : () => string;
requestPathParamsSchema?: Params;
requestQuerySchema?: Query;
requestHeaderSchema?: RequestHeaders;
requestBodySchema: Body;
serverSentEventSchemas: Events;
/**
* Error response schemas by HTTP status code.
* Used to define response shapes for errors that occur before streaming starts
* (e.g., authentication failures, validation errors, not found).
*
* @example
* ```ts
* responseBodySchemasByStatusCode: {
* 401: z.object({ error: z.literal('Unauthorized') }),
* 404: z.object({ error: z.string() }),
* }
* ```
*/
responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
successResponseBodySchema?: never;
metadata?: CommonRouteDefinitionMetadata;
description?: string;
summary?: string;
tags?: readonly string[];
};
/**
* Configuration for building a GET dual-mode route.
* Requires successResponseBodySchema, forbids requestBodySchema.
*/
export type DualModeGetContractConfig<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, JsonResponse 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: 'get';
pathResolver: Params extends z.ZodTypeAny ? RoutePathResolver<z.infer<Params>> : () => string;
requestPathParamsSchema?: Params;
requestQuerySchema?: Query;
requestHeaderSchema?: RequestHeaders;
/** Single sync response schema */
successResponseBodySchema: JsonResponse;
/**
* Schema for validating response headers (sync mode only).
* Used to define and validate headers that the server will send in the response.
*
* @example
* ```ts
* responseHeaderSchema: z.object({
* 'x-ratelimit-limit': z.string(),
* 'x-ratelimit-remaining': z.string(),
* })
* ```
*/
responseHeaderSchema?: ResponseHeaders;
/**
* Alternative response schemas by HTTP status code.
* Used to define different response shapes for error cases.
*
* @example
* ```ts
* responseBodySchemasByStatusCode: {
* 400: z.object({ error: z.string(), details: z.array(z.string()) }),
* 404: z.object({ error: z.string() }),
* }
* ```
*/
responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
serverSentEventSchemas: Events;
requestBodySchema?: never;
metadata?: CommonRouteDefinitionMetadata;
description?: string;
summary?: string;
tags?: readonly string[];
};
/**
* Configuration for building a POST/PUT/PATCH dual-mode route with request body.
* Requires both requestBodySchema and successResponseBodySchema.
*/
export type DualModePayloadContractConfig<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Body extends z.ZodTypeAny = z.ZodTypeAny, JsonResponse 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: 'post' | 'put' | 'patch';
pathResolver: Params extends z.ZodTypeAny ? RoutePathResolver<z.infer<Params>> : () => string;
requestPathParamsSchema?: Params;
requestQuerySchema?: Query;
requestHeaderSchema?: RequestHeaders;
requestBodySchema: Body;
/** Single sync response schema */
successResponseBodySchema: JsonResponse;
/**
* Schema for validating response headers (sync mode only).
* Used to define and validate headers that the server will send in the response.
*
* @example
* ```ts
* responseHeaderSchema: z.object({
* 'x-ratelimit-limit': z.string(),
* 'x-ratelimit-remaining': z.string(),
* })
* ```
*/
responseHeaderSchema?: ResponseHeaders;
/**
* Alternative response schemas by HTTP status code.
* Used to define different response shapes for error cases.
*
* @example
* ```ts
* responseBodySchemasByStatusCode: {
* 400: z.object({ error: z.string(), details: z.array(z.string()) }),
* 404: z.object({ error: z.string() }),
* }
* ```
*/
responseBodySchemasByStatusCode?: ResponseSchemasByStatusCode;
serverSentEventSchemas: Events;
metadata?: CommonRouteDefinitionMetadata;
description?: string;
summary?: string;
tags?: readonly string[];
};
export declare function buildSseContract<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, JsonResponse extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: DualModeGetContractConfig<Params, Query, RequestHeaders, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>): DualModeContractDefinition<'get', Params, Query, RequestHeaders, undefined, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
export declare function buildSseContract<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Events extends SSEEventSchemas = SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: SSEGetContractConfig<Params, Query, RequestHeaders, Events, ResponseSchemasByStatusCode>): SSEContractDefinition<'get', Params, Query, RequestHeaders, undefined, Events, ResponseSchemasByStatusCode>;
export declare function buildSseContract<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Body extends z.ZodTypeAny = z.ZodTypeAny, JsonResponse extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseHeaders extends z.ZodTypeAny | undefined = undefined, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: DualModePayloadContractConfig<Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>): DualModeContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, JsonResponse, Events, ResponseHeaders, ResponseSchemasByStatusCode>;
export declare function buildSseContract<Params extends z.ZodTypeAny | undefined = undefined, Query extends z.ZodTypeAny | undefined = undefined, RequestHeaders extends z.ZodTypeAny | undefined = undefined, Body extends z.ZodTypeAny = z.ZodTypeAny, Events extends SSEEventSchemas = SSEEventSchemas, ResponseSchemasByStatusCode extends Partial<Record<HttpStatusCode, z.ZodTypeAny>> | undefined = undefined>(config: SSEPayloadContractConfig<Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>): SSEContractDefinition<'post' | 'put' | 'patch', Params, Query, RequestHeaders, Body, Events, ResponseSchemasByStatusCode>;