import type { StandardSchemaV1 } from "../standard-schema/index.ts"; import type { BodyContentType } from "./body.ts"; import type { RouteDeclaration } from "./routeDeclaration.ts"; export type ResponseSchema = StandardSchemaV1; export type ResponseBodySchema = ResponseSchema; /** * Declares a whole-object schema for typed response headers. * * @see {@link https://rest-rpc.dev/docs/route-builder} */ export type ResponseHeaders = StandardSchemaV1>; /** * Canonical declaration for one route response. * * @see {@link https://rest-rpc.dev/docs/http-behavior/serialization} */ export type ResponseDeclaration = { kind?: never; body: ResponseBodySchema; contentType: BodyContentType; headers?: ResponseHeaders; } | { kind?: never; body: undefined; contentType?: never; headers?: ResponseHeaders; } | { kind: "stream"; body: ResponseBodySchema; contentType?: never; headers?: ResponseHeaders; }; /** HTTP metadata associated with a declared response schema. */ export type ResponseOptions = { contentType?: BodyContentType; headers?: ResponseHeaders; }; export type RouteResponses = Record; export type RouteResponseInput = { responses: RouteResponses; response?: never; } | { response: ResponseDeclaration; responses?: never; } | { response?: never; responses?: never; }; export declare const getRouteResponses: (route: { path: string; responses: RouteResponses; }) => RouteResponses; type Simplify = T extends unknown ? { [TKey in keyof T]: T[TKey]; } : never; type IsStreamResponse = TResponse extends { kind: "stream"; } ? true : false; type InferClientResponseBody = ResponseBody extends infer TBody ? TBody extends StandardSchemaV1 ? IsStreamResponse extends true ? AsyncIterable> : StandardSchemaV1.InferOutput : TBody extends undefined ? undefined : never : never; export type ServerResponseBody = ResponseBody extends infer TBody ? TBody extends StandardSchemaV1 ? IsStreamResponse extends true ? AsyncIterable> : StandardSchemaV1.InferInput : TBody extends undefined ? undefined : never : never; type ServerResponseMetadata = TResponse extends { contentType: infer TContentType; } ? TContentType extends "application/json" ? unknown : TContentType extends readonly string[] ? { contentType: TContentType[number]; } : TContentType extends string ? { contentType?: TContentType; } : unknown : unknown; type ResponseBody = TResponse extends { body: infer TBody; } ? TBody : never; type ResponseHeadersFor = TResponse extends { headers: infer THeaders extends ResponseHeaders; } ? THeaders : never; type InferResponseHeaders = THeaders extends StandardSchemaV1 ? TIO extends "input" ? StandardSchemaV1.InferInput : StandardSchemaV1.InferOutput : never; type ResponseHeadersMetadata = [ ResponseHeadersFor ] extends [never] ? unknown : { responseHeaders: InferResponseHeaders, TIO>; }; type ResponseEntry = { status: TStatus; body: TBody; }; type ClientResponseEntry = ResponseEntry> & ResponseHeadersMetadata extends infer TEntry ? Simplify : never; type ServerResponseBase = [TBody] extends [ undefined ] ? { status: TStatus; } : ResponseEntry; type ServerResponseEntry = ServerResponseBase> & ServerResponseMetadata & ResponseHeadersMetadata extends infer TEntry ? Simplify : never; type ResponseKey = number | `${number}`; type ResponseStatus = TStatus extends number ? TStatus : TStatus extends `${infer TNumber extends number}` ? TNumber : never; type IsUnion = [T] extends [never] ? false : T extends unknown ? [U] extends [T] ? false : true : false; type SuccessfulResponseKeys = { [TKeys in keyof TResponses]: TKeys extends ResponseKey ? `${ResponseStatus}` extends `2${string}` ? TKeys : never : never; }[keyof TResponses]; export type HasSuccessfulResponse = [ SuccessfulResponseKeys ] extends [never] ? false : true; export type HasMultipleSuccessfulResponses = IsUnion>; export type DeclaredClientResponse = E extends { responses: infer TResponses; } ? { [TKeys in keyof TResponses]: TKeys extends ResponseKey ? ClientResponseEntry, TResponses[TKeys]> : never; }[keyof TResponses] : never; export type ServerResponse = E extends { responses: infer TResponses; } ? { [TKeys in keyof TResponses]: TKeys extends ResponseKey ? ServerResponseEntry, TResponses[TKeys]> : never; }[keyof TResponses] : never; export type SuccessfulDeclaredClientResponse = E extends { responses: infer TResponses; } ? { [TKeys in keyof TResponses]: TKeys extends ResponseKey ? TKeys extends SuccessfulResponseKeys ? ClientResponseEntry, TResponses[TKeys]> : never : never; }[keyof TResponses] : never; type ServerSuccessResponse = E extends { responses: infer TResponses; } ? { [TKeys in keyof TResponses]: TKeys extends ResponseKey ? TKeys extends SuccessfulResponseKeys ? ServerResponseEntry, TResponses[TKeys]> : never : never; }[keyof TResponses] : never; export type ErrorDeclaredClientResponse = Exclude, SuccessfulDeclaredClientResponse>; export type ServerErrors = Exclude, ServerSuccessResponse>; export {};