import { API } from '../../lib/structures/api'; import { z } from 'zod'; import type { Request as ExpressRequest, Response as ExpressResponse } from 'express'; export type RouteMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; export type RouteSettings = { unauthed: boolean; disabled: boolean; moved: boolean; authOverwrite: ((api: API) => boolean | Promise) | null; upload?: { store: 'memory' | 'disk'; diskPath?: string; } | null; }; export type RouteRatelimits = { limit: number; remember: number; punishment: number; strict: boolean; type: 'endpoint' | 'parameter'; scope: 'ip' | 'authentication' | 'global'; }; export type SchemaDefinition = Partial<{ params: z.ZodTypeAny; }> & Partial<{ [M in RouteMethod]: M extends 'GET' ? { query?: z.ZodTypeAny; response?: z.ZodTypeAny; } : { query?: z.ZodTypeAny; body?: z.ZodTypeAny; files?: z.ZodTypeAny; response?: z.ZodTypeAny; }; }>; type HasResponseSchema = V extends { [K in M]: { response: z.ZodTypeAny; }; } ? true : false; type APIDeprecatedSend = Omit, 'send'> & { /** * @deprecated Use sendTyped instead for type-safe responses when a response schema is defined */ send(data?: any, options?: { error?: boolean; status?: number; code?: string; message?: string; }): never; }; export type ConditionalAPI = HasResponseSchema extends true ? APIDeprecatedSend, GetSchemaType, GetSchemaType, GetSchemaType, TAuth, TServices, GetSchemaType> : Omit, GetSchemaType, GetSchemaType, GetSchemaType, TAuth, TServices, GetSchemaType>, 'sendTyped'>; export type RouteDefinition = Partial<{ [M in RouteMethod]: (api: ConditionalAPI) => void; }> & { schema?: V; settings?: Partial> & { [M in RouteMethod]?: Partial>; }; ratelimits?: Partial & { [M in RouteMethod]?: Partial; }; }; type ExtractParams = V extends { params: infer T; } ? T extends z.ZodTypeAny ? z.infer : unknown : unknown; type ExtractBody = M extends 'GET' ? unknown : V extends { [K in M]: { body: infer T; }; } ? T extends z.ZodTypeAny ? z.infer : unknown : unknown; type ExtractQuery = V extends { [K in M]: { query: infer T; }; } ? T extends z.ZodTypeAny ? z.infer : unknown : unknown; type ExtractResponse = V extends { [K in M]: { response: infer T; }; } ? T extends z.ZodTypeAny ? z.infer : unknown : unknown; type ExtractFiles = V extends { [K in M]: { files: z.ZodTypeAny; }; } ? UploadedFile[] : unknown; export type GetSchemaType = V extends object ? K extends 'params' ? ExtractParams : K extends 'body' ? ExtractBody : K extends 'query' ? ExtractQuery : K extends 'response' ? ExtractResponse : K extends 'files' ? ExtractFiles : unknown : unknown; export type Config = { port: number; hostname: string; responseDetailLevel: 'full' | 'mid' | 'low' | 'blank'; defaults: RouteSettings; ratelimits: RouteRatelimits; upload?: { store: 'memory' | 'disk'; diskPath?: string; }; }; export type UploadedFile = { fieldname: string; originalname: string; encoding: string; mimetype: string; size: number; destination?: string; filename?: string; path?: string; buffer?: Buffer; }; export interface Request extends ExpressRequest { startedAt: Date; api: API; _body: any; _params: { [key: string]: string; }; _query: { [key: string]: string; }; _files?: UploadedFile[]; _filesRaw?: UploadedFile[]; } export type Response = ExpressResponse; export {}; //# sourceMappingURL=types.d.ts.map