export const LEAGUE_DESCRIPTION_CONSTRAINTS = { minLength: 20, maxLength: 1000, recommendedMinLength: 50, } as const; export const LEAGUE_NAME_CONSTRAINTS = { minLength: 3, maxLength: 64, pattern: /^[a-zA-Z0-9].*$/, // Must start with alphanumeric forbiddenPatterns: [ /^\s/, // No leading whitespace /\s$/, // No trailing whitespace /\s{2,}/, // No multiple consecutive spaces ], } as const; export type LeagueVisibilityType = 'ranked' | 'unranked'; export interface LeagueVisibilityConstraints { readonly minDrivers: number; readonly isPubliclyVisible: boolean; readonly affectsRatings: boolean; readonly requiresApproval: boolean; } export const VISIBILITY_CONSTRAINTS: Record = { ranked: { minDrivers: 10, isPubliclyVisible: true, affectsRatings: true, requiresApproval: false, // Anyone can join public leagues }, unranked: { minDrivers: 2, isPubliclyVisible: false, affectsRatings: false, requiresApproval: true, // Private leagues require invite/approval }, }; // Export constants for validation export const MIN_RANKED_LEAGUE_DRIVERS = VISIBILITY_CONSTRAINTS.ranked.minDrivers; export const MIN_UNRANKED_LEAGUE_DRIVERS = VISIBILITY_CONSTRAINTS.unranked.minDrivers;