import type { CloudProvider, ResourceFilter, CloudCredentials } from '../types/index.js';
export class Validators {
/**
* Validate cloud provider
*/
static isValidProvider(provider: string): provider is CloudProvider {
return ['aws', 'azure', 'gcp'].includes(provider);
}
/**
* Validate AWS region
*/
static isValidAWSRegion(region: string): boolean {
const awsRegions = [
'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2',
'eu-west-1', 'eu-west-2', 'eu-west-3', 'eu-central-1',
'ap-southeast-1', 'ap-southeast-2', 'ap-northeast-1',
'sa-east-1', 'ca-central-1',
];
return awsRegions.includes(region);
}
/**
* Validate Azure region
*/
static isValidAzureRegion(region: string): boolean {
// Common Azure regions
const azureRegions = [
'eastus', 'eastus2', 'westus', 'westus2',
'centralus', 'northcentralus', 'southcentralus',
'westcentralus', 'westeurope', 'northeurope',
'southeastasia', 'eastasia', 'japaneast', 'japanwest',
];
return azureRegions.includes(region.toLowerCase());
}
/**
* Validate GCP region
*/
static isValidGCPRegion(region: string): boolean {
const gcpRegions = [
'us-central1', 'us-east1', 'us-east4', 'us-west1',
'europe-west1', 'europe-west2', 'europe-west3',
'asia-east1', 'asia-southeast1', 'asia-northeast1',
];
return gcpRegions.includes(region.toLowerCase());
}
/**
* Validate resource filter
*/
static validateResourceFilter(filter: ResourceFilter): { valid: boolean; errors: string[] } {
const errors: string[] = [];
if (filter.provider && !this.isValidProvider(filter.provider)) {
errors.push('Invalid cloud provider');
}
if (filter.region) {
if (filter.provider === 'aws' && !this.isValidAWSRegion(filter.region)) {
errors.push('Invalid AWS region');
} else if (filter.provider === 'azure' && !this.isValidAzureRegion(filter.region)) {
errors.push('Invalid Azure region');
} else if (filter.provider === 'gcp' && !this.isValidGCPRegion(filter.region)) {
errors.push('Invalid GCP region');
}
}
return {
valid: errors.length === 0,
errors,
};
}
/**
* Validate AWS credentials
*/
static validateAWSCredentials(credentials: CloudCredentials): { valid: boolean; errors: string[] } {
const errors: string[] = [];
if (!credentials.accessKeyId) {
errors.push('AWS Access Key ID is required');
}
if (!credentials.secretAccessKey) {
errors.push('AWS Secret Access Key is required');
}
if (credentials.region && !this.isValidAWSRegion(credentials.region)) {
errors.push('Invalid AWS region');
}
return {
valid: errors.length === 0,
errors,
};
}
/**
* Validate Azure credentials
*/
static validateAzureCredentials(credentials: CloudCredentials): { valid: boolean; errors: string[] } {
const errors: string[] = [];
if (!credentials.clientId) {
errors.push('Azure Client ID is required');
}
if (!credentials.clientSecret) {
errors.push('Azure Client Secret is required');
}
if (!credentials.tenantId) {
errors.push('Azure Tenant ID is required');
}
if (!credentials.subscriptionId) {
errors.push('Azure Subscription ID is required');
}
return {
valid: errors.length === 0,
errors,
};
}
/**
* Validate GCP credentials
*/
static validateGCPCredentials(credentials: CloudCredentials): { valid: boolean; errors: string[] } {
const errors: string[] = [];
if (!credentials.projectId) {
errors.push('GCP Project ID is required');
}
return {
valid: errors.length === 0,
errors,
};
}
/**
* Validate resource ID format
*/
static isValidResourceId(resourceId: string, provider: CloudProvider): boolean {
if (!resourceId || resourceId.trim().length === 0) {
return false;
}
switch (provider) {
case 'aws':
// AWS resource IDs are typically alphanumeric with hyphens
return /^[a-zA-Z0-9\-_]+$/.test(resourceId);
case 'azure':
// Azure resource IDs are typically URIs
return resourceId.startsWith('/subscriptions/');
case 'gcp':
// GCP resource IDs vary by resource type
return resourceId.length > 0;
default:
return false;
}
}
}