managarten/packages/shared-utils/src/validation.ts
Wuesteon d36b321d9d style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write
  - TypeScript/JavaScript files
  - Svelte components
  - Astro pages
  - JSON configs
  - Markdown docs

  13 files still need manual review (Astro JSX comments)
2025-11-27 18:33:16 +01:00

103 lines
2.4 KiB
TypeScript

/**
* Validation utility functions
*/
/**
* Validate email address format
*/
export function isValidEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
/**
* Validate URL format
*/
export function isValidUrl(url: string): boolean {
try {
new URL(url);
return true;
} catch {
return false;
}
}
/**
* Validate phone number (basic international format)
*/
export function isValidPhone(phone: string): boolean {
// Allows: +49123456789, 0123456789, +1 (555) 123-4567
const phoneRegex = /^[+]?[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/;
return phoneRegex.test(phone) && phone.replace(/\D/g, '').length >= 6;
}
/**
* Validate password strength
* Returns an object with validation details
*/
export function validatePassword(password: string): {
isValid: boolean;
hasMinLength: boolean;
hasUppercase: boolean;
hasLowercase: boolean;
hasNumber: boolean;
hasSpecialChar: boolean;
score: number;
} {
const hasMinLength = password.length >= 8;
const hasUppercase = /[A-Z]/.test(password);
const hasLowercase = /[a-z]/.test(password);
const hasNumber = /[0-9]/.test(password);
const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(password);
const score = [hasMinLength, hasUppercase, hasLowercase, hasNumber, hasSpecialChar].filter(
Boolean
).length;
return {
isValid: hasMinLength && hasUppercase && hasLowercase && hasNumber,
hasMinLength,
hasUppercase,
hasLowercase,
hasNumber,
hasSpecialChar,
score,
};
}
/**
* Check if a string is empty or only whitespace
*/
export function isEmpty(value: string | null | undefined): boolean {
return !value || value.trim().length === 0;
}
/**
* Check if a string exceeds max length
*/
export function isWithinMaxLength(value: string, maxLength: number): boolean {
return value.length <= maxLength;
}
/**
* Check if a string meets minimum length
*/
export function meetsMinLength(value: string, minLength: number): boolean {
return value.length >= minLength;
}
/**
* Validate UUID format
*/
export function isValidUuid(uuid: string): boolean {
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return uuidRegex.test(uuid);
}
/**
* Validate hex color format
*/
export function isValidHexColor(color: string): boolean {
const hexRegex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
return hexRegex.test(color);
}