import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; export class ApiClient { private readonly axiosInstance: AxiosInstance; constructor(baseURL: string, apiKey?: string, apiVersion?: string) { this.axiosInstance = axios.create({ baseURL, headers: { ...(apiKey ? { 'Authorization': `Bearer ${apiKey}` } : {}), ...(apiVersion ? { 'X-API-Version': apiVersion } : {}), }, }); } public async get(url: string, params?: any, config?: AxiosRequestConfig): Promise { const response: AxiosResponse = await this.axiosInstance.get(url, { ...config, params }); return response.data; } public async post(url: string, data?: any, config?: AxiosRequestConfig): Promise { const response: AxiosResponse = await this.axiosInstance.post(url, data, config); return response.data; } public async patch(url: string, data?: any, config?: AxiosRequestConfig): Promise { const response: AxiosResponse = await this.axiosInstance.patch(url, data, config); return response.data; } public async delete(url: string, config?: AxiosRequestConfig): Promise { const response: AxiosResponse = await this.axiosInstance.delete(url, config); return response.data; } // For streaming endpoints (e.g., Server-Sent Events, chunked responses) public async stream(url: string, data?: any, config?: AxiosRequestConfig): Promise { // This is a placeholder. Actual streaming logic may require custom handling. const response = await this.axiosInstance.post(url, data, { ...config, responseType: 'stream' }); return response.data; } }