import type { StandardSchemaV1 } from "../standard-schema/index.ts"; import type { RouteDeclaration, RouteRequestDeclaration } from "./routeDeclaration.ts"; export type RequestSegment = "body" | "query" | "params" | "headers"; /** Scalar value accepted by ordinary HTTP request schemas. */ export type RequestScalar = string | number | boolean; /** An ordinary query schema whose wire input contains scalar or array values. */ export type RequestQuerySchema = StandardSchemaV1, unknown>; /** An ordinary params schema whose wire input contains scalar values. */ export type RequestParamsSchema = StandardSchemaV1, unknown>; /** A whole-object schema for request headers. */ export type RequestHeadersSchema = StandardSchemaV1, Record>; /** The canonical header declaration, including an optional inherited schema. */ export type RequestHeadersDeclaration = { inherited?: RequestHeadersSchema; local?: RequestHeadersSchema; }; /** Returns inherited and local header schemas in validation and merge order. */ export declare function getRequestHeaderSchemas(declaration: RequestHeadersDeclaration): RequestHeadersSchema[]; export type RequestBodySchema = StandardSchemaV1; type InferRequestBody = TBody extends StandardSchemaV1 ? TIO extends "input" ? StandardSchemaV1.InferInput : StandardSchemaV1.InferOutput : never; type InferRequestHeaders = THeaders extends { inherited?: infer TInherited; local?: infer TLocal; } ? TIO extends "input" ? (TInherited extends RequestHeadersSchema ? StandardSchemaV1.InferInput : unknown) & (TLocal extends RequestHeadersSchema ? StandardSchemaV1.InferInput : unknown) : Omit : Record, keyof (TLocal extends RequestHeadersSchema ? StandardSchemaV1.InferOutput : Record)> & (TLocal extends RequestHeadersSchema ? StandardSchemaV1.InferOutput : Record) : never; type InferRequestObjectSegment = TSegment extends StandardSchemaV1 ? TIO extends "input" ? StandardSchemaV1.InferInput : StandardSchemaV1.InferOutput : never; type InferRequestSegments = { body: R extends { body: infer TBody; } ? InferRequestBody : never; query: R extends { query: infer TQuery; } ? InferRequestObjectSegment : never; params: R extends { params: infer Tparams; } ? InferRequestObjectSegment : never; headers: R extends { headers: infer THeaders; } ? THeaders extends RequestHeadersDeclaration ? InferRequestHeaders : never : never; }; type RouteRequest = E extends { request: infer TRequest; } ? InferRequestSegments : never; type Merge = T extends unknown ? { [K in keyof T]: T[K]; } : never; type EmptyObject = Record; type HasRequestInput = [ TRequest extends { body: infer TBody; query: infer TQuery; params: infer Tparams; headers: infer THeaders; } ? TBody | TQuery | Tparams | THeaders : never ] extends [never] ? false : true; type InferRequestFor = RouteRequest extends infer R ? R extends { body: infer B; query: infer Q; params: infer P; headers: infer H; } ? HasRequestInput extends true ? Merge<([B] extends [never] ? EmptyObject : { body: B; }) & ([Q] extends [never] ? EmptyObject : { query: Q; }) & ([P] extends [never] ? EmptyObject : { params: P; }) & ([H] extends [never] ? EmptyObject : { headers: H; })> : never : never : never; type OptionalHeaders = Merge> & Partial>>>; type OptionalRequestHeaders = [ T ] extends [never] ? never : T extends { headers: infer H; } ? Merge & ({} extends OptionalHeaders ? { headers?: OptionalHeaders; } : { headers: OptionalHeaders; })> : T; /** * Infers the request type passed to a generated client route call. * * @see {@link https://rest-rpc.dev/docs/type-helpers#fetch-client} */ export type ClientRequest = InferClientRequest; export type InferClientRequest = E extends { kind: "procedure"; } ? E extends { input: "segments"; } ? OptionalRequestHeaders, TOptionalKeys> : E extends { request: { body: infer TInput extends StandardSchemaV1; }; } ? StandardSchemaV1.InferInput : never : E extends { input: "input"; } ? E extends { request: { query: infer TQuery extends StandardSchemaV1; }; } ? StandardSchemaV1.InferInput : E extends { request: { body: infer TBody extends StandardSchemaV1; }; } ? StandardSchemaV1.InferInput : never : E extends RouteDeclaration ? OptionalRequestHeaders, TOptionalKeys> : never; type ServerContentType = TRequest extends { contentType: infer TContentType; } ? TContentType extends "application/json" ? unknown : TContentType extends readonly string[] ? { contentType: TContentType[number]; } : TContentType extends string ? { contentType: TContentType; } : unknown : unknown; export type ServerRequest = InferRequestFor & ServerContentType; export {};