import { isObject } from '@jolibox/common'; export type HTTPMethod = | 'GET' | 'OPTIONS' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT' | 'PATCH'; export function normalizeHeader(header: unknown) { const normalized: Record = {}; if (!isObject(header)) { return normalized; } for (const [_key, value] of Object.entries(header)) { const key = _key.toLocaleLowerCase(); if (!value) { normalized[key] = ''; } else if (typeof value === 'object') { normalized[key] = Object.prototype.toString.call(value); } else { normalized[key] = String(value); } } return normalized; } export function normalizeFormData(formData: unknown) { const normalized: Record = {}; if (!isObject(formData)) { return normalized; } for (const [key, value] of Object.entries(formData)) { if (!value) { normalized[key] = ''; } else if (typeof value === 'object') { normalized[key] = Object.prototype.toString.call(value); } else { normalized[key] = String(value); } } return normalized; } export function normalizeMethod(method = 'GET') { if (method === '') { return 'POST'; } const _method = method.toUpperCase(); if (['GET', 'OPTIONS', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'CONNECT', 'PATCH'].includes(_method)) { return _method as HTTPMethod; } return 'GET'; } export function normalizeTimeout(time: number | undefined, unlimited = false) { if (!time) return undefined; if (unlimited || (time > 0 && time <= 60e3)) return Math.ceil(time); return 60e3; } /** * modify url */ export function dirtyURL(url: string, method: HTTPMethod, data?: unknown) { if (['POST', 'PUT', 'PATCH'].includes(method)) return url; if (!isObject(data)) return url; const [baseUrl, search = ''] = url.split('?'); // Parse existing query parameters const dataParams = new URLSearchParams(search); // Add new parameters from data object for (const [key, value] of Object.entries(data)) { if (value !== undefined && value !== null) { dataParams.append(key, String(value)); } } const queryString = dataParams.toString(); return queryString ? `${baseUrl}?${queryString}` : baseUrl; }