guardz-axios
Version:
Type-safe HTTP client built on top of Axios with runtime validation using guardz. Part of the guardz ecosystem for comprehensive TypeScript type safety.
131 lines • 5.85 kB
TypeScript
/**
* Unified API Layer
* Integrates domain-driven architecture with existing patterns
* Following Composition over Inheritance (CoI) principles
*/
import { RequestService, Logger } from "../services/request-service";
import { CompleteRequestConfig, RequestResult, RequestStatus, ErrorType } from "../domain/types";
import { ValidationGuard } from "../domain/types";
import { AxiosInstance } from "axios";
/**
* Unified API Configuration
*/
export interface UnifiedApiConfig {
baseURL?: string;
timeout?: number;
headers?: Record<string, string>;
axiosInstance?: AxiosInstance;
logger?: Logger;
defaultRetryConfig?: {
attempts: number;
delay: number;
backoff: "linear" | "exponential";
};
}
/**
* Unified API Class
* Provides a clean interface combining all patterns
*/
export declare class UnifiedApi {
private requestService;
private defaultConfig;
constructor(config?: UnifiedApiConfig);
/**
* Pattern 1: Curried Functions (Functional Style)
*/
createSafeGet<T>(guard: ValidationGuard<T>): (url: string, config?: Partial<CompleteRequestConfig<T>>) => Promise<RequestResult<T>>;
createSafePost<T>(guard: ValidationGuard<T>): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>>) => Promise<RequestResult<T>>;
createSafePut<T>(guard: ValidationGuard<T>): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>>) => Promise<RequestResult<T>>;
createSafePatch<T>(guard: ValidationGuard<T>): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>>) => Promise<RequestResult<T>>;
createSafeDelete<T>(guard: ValidationGuard<T>): (url: string, config?: Partial<CompleteRequestConfig<T>>) => Promise<RequestResult<T>>;
/**
* Pattern 2: Configuration-first (Apollo/React Query style)
*/
safeRequest<T>(config: CompleteRequestConfig<T>): Promise<RequestResult<T>>;
/**
* Pattern 3: Fluent API Builder
*/
safe(): SafeRequestBuilder<unknown>;
/**
* Pattern 4: Context API (React Context style)
*/
createContext(): SafeApiContext;
/**
* Utility Methods
*/
isSuccess<T>(result: RequestResult<T>): result is {
status: RequestStatus.SUCCESS;
data: T;
};
isError<T>(result: RequestResult<T>): result is {
status: RequestStatus.ERROR;
code: number;
message: string;
type: ErrorType;
};
extractData<T>(result: RequestResult<T>): T | null;
extractError<T>(result: RequestResult<T>): {
code: number;
message: string;
type: ErrorType;
} | null;
}
/**
* Fluent API Builder
*/
declare class SafeRequestBuilder<T = unknown> {
private config;
private requestService;
private defaultConfig;
constructor(requestService: RequestService, defaultConfig: Partial<CompleteRequestConfig<any>>);
get(url: string): SafeRequestBuilder<T>;
post(url: string, data?: unknown): SafeRequestBuilder<T>;
put(url: string, data?: unknown): SafeRequestBuilder<T>;
patch(url: string, data?: unknown): SafeRequestBuilder<T>;
delete(url: string): SafeRequestBuilder<T>;
guard<U>(guardFn: ValidationGuard<U>): SafeRequestBuilder<U>;
tolerance(enabled?: boolean): SafeRequestBuilder<T>;
identifier(id: string): SafeRequestBuilder<T>;
timeout(ms: number): SafeRequestBuilder<T>;
headers(headers: Record<string, string>): SafeRequestBuilder<T>;
retry(config: {
attempts: number;
delay: number;
backoff: "linear" | "exponential";
}): SafeRequestBuilder<T>;
execute(): Promise<RequestResult<T>>;
}
/**
* Safe API Context
*/
declare class SafeApiContext {
private requestService;
private defaultConfig;
constructor(requestService: RequestService, defaultConfig: Partial<CompleteRequestConfig<any>>);
get<T>(url: string, config: {
guard: ValidationGuard<T>;
} & Partial<CompleteRequestConfig<T>>): Promise<RequestResult<T>>;
post<T>(url: string, data: unknown, config: {
guard: ValidationGuard<T>;
} & Partial<CompleteRequestConfig<T>>): Promise<RequestResult<T>>;
put<T>(url: string, data: unknown, config: {
guard: ValidationGuard<T>;
} & Partial<CompleteRequestConfig<T>>): Promise<RequestResult<T>>;
patch<T>(url: string, data: unknown, config: {
guard: ValidationGuard<T>;
} & Partial<CompleteRequestConfig<T>>): Promise<RequestResult<T>>;
delete<T>(url: string, config: {
guard: ValidationGuard<T>;
} & Partial<CompleteRequestConfig<T>>): Promise<RequestResult<T>>;
}
/**
* Factory Functions for Easy Usage
*/
export declare function createUnifiedApi(config?: UnifiedApiConfig): UnifiedApi;
export declare function createSafeGet<T>(guard: ValidationGuard<T>, config?: UnifiedApiConfig): (url: string, config?: Partial<CompleteRequestConfig<T>> | undefined) => Promise<RequestResult<T>>;
export declare function createSafePost<T>(guard: ValidationGuard<T>, config?: UnifiedApiConfig): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>> | undefined) => Promise<RequestResult<T>>;
export declare function createSafePut<T>(guard: ValidationGuard<T>, config?: UnifiedApiConfig): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>> | undefined) => Promise<RequestResult<T>>;
export declare function createSafePatch<T>(guard: ValidationGuard<T>, config?: UnifiedApiConfig): (url: string, data?: unknown, config?: Partial<CompleteRequestConfig<T>> | undefined) => Promise<RequestResult<T>>;
export declare function createSafeDelete<T>(guard: ValidationGuard<T>, config?: UnifiedApiConfig): (url: string, config?: Partial<CompleteRequestConfig<T>> | undefined) => Promise<RequestResult<T>>;
export {};
//# sourceMappingURL=unified-api.d.ts.map