/** * Namecheap API Client - Configuration */ import type { INamecheapAuth } from './types.js'; export class NamecheapConfig implements INamecheapAuth { // Required authentication properties apiUser: string; apiKey: string; userName: string; clientIp: string; // API endpoint configuration baseUrl: string = 'https://api.namecheap.com/xml.response'; // Whether to use sandbox environment (for testing) useSandbox: boolean = false; // Default request timeout in milliseconds timeout: number = 30000; /** * Create a new Namecheap API configuration */ constructor(config: INamecheapAuth) { this.apiUser = config.apiUser; this.apiKey = config.apiKey; this.userName = config.userName || config.apiUser; // Default userName to apiUser if not provided this.clientIp = config.clientIp; this.validateConfig(); } /** * Validate configuration parameters * @throws Error if configuration is invalid */ private validateConfig(): void { if (!this.apiUser) { throw new Error('Namecheap API User is required'); } if (!this.apiKey) { throw new Error('Namecheap API Key is required'); } if (!this.userName) { throw new Error('Namecheap User Name is required'); } if (!this.clientIp) { throw new Error('Client IP address is required'); } // Validate IP address format const ipRegex = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; if (!ipRegex.test(this.clientIp)) { throw new Error('Invalid IP address format'); } } /** * Enable sandbox mode for testing */ enableSandbox(): void { this.useSandbox = true; this.baseUrl = 'https://api.sandbox.namecheap.com/xml.response'; } /** * Disable sandbox mode */ disableSandbox(): void { this.useSandbox = false; this.baseUrl = 'https://api.namecheap.com/xml.response'; } /** * Set request timeout * @param ms Timeout in milliseconds */ setTimeout(ms: number): void { this.timeout = ms; } /** * Get base parameters that should be included in every API request * @param command API command to execute * @returns Base parameters object */ getBaseParams(command: string): Record { return { ApiUser: this.apiUser, ApiKey: this.apiKey, UserName: this.userName, ClientIp: this.clientIp, Command: command }; } }