import type { Config } from '../config/schema.js';
/**
* Auth configuration for request injection
*/
export interface AuthConfig {
type: 'none' | 'apiKey' | 'bearer' | 'basic';
in: 'header' | 'query';
name: string;
value?: string;
}
/**
* Build authentication headers/query params based on config
*/
export function buildAuthHeaders(config: Config['auth']): Record<string, string> {
if (config.type === 'none' || !config.value) {
return {};
}
if (config.type === 'apiKey' && config.in === 'header') {
return { [config.name]: config.value };
}
if (config.type === 'bearer') {
const token = config.value.startsWith('Bearer ')
? config.value
: `Bearer ${config.value}`;
return { Authorization: token };
}
if (config.type === 'basic') {
// Value should be "username:password" or already base64 encoded
const encoded = config.value.includes(':')
? Buffer.from(config.value).toString('base64')
: config.value;
return { Authorization: `Basic ${encoded}` };
}
return {};
}
/**
* Build authentication query params based on config
*/
export function buildAuthQueryParams(config: Config['auth']): Record<string, string> {
if (config.type === 'none' || !config.value) {
return {};
}
if (config.type === 'apiKey' && config.in === 'query') {
return { [config.name]: config.value };
}
return {};
}
/**
* Merge auth into request options
*/
export function applyAuth(
headers: Record<string, string>,
queryParams: Record<string, string | string[]>,
authConfig: Config['auth']
): { headers: Record<string, string>; queryParams: Record<string, string | string[]> } {
return {
headers: { ...headers, ...buildAuthHeaders(authConfig) },
queryParams: { ...queryParams, ...buildAuthQueryParams(authConfig) },
};
}