dvijaykrishnan's picture
Deployment fix for HF
ceb943f
Raw
History Blame Contribute Delete
2.06 kB
// Story 7.3: Slug generation utility for creator URLs
/**
* Generate a URL-safe slug from a channel name
*
* Rules:
* - Convert to lowercase
* - Replace spaces with hyphens
* - Remove special characters (keep only alphanumeric and hyphens)
* - Remove consecutive hyphens
* - Trim hyphens from start/end
*
* @param channelName - The YouTube channel name
* @returns URL-safe slug
*
* @example
* generateCreatorSlug("Tech Reviews Pro") // "tech-reviews-pro"
* generateCreatorSlug("Mr. Beast!!!") // "mr-beast"
* generateCreatorSlug(" Spaces Everywhere ") // "spaces-everywhere"
*/
export function generateCreatorSlug(channelName: string): string {
return channelName
.toLowerCase()
.trim()
// Replace spaces with hyphens
.replace(/\s+/g, '-')
// Remove special characters (keep only alphanumeric and hyphens)
.replace(/[^a-z0-9-]/g, '')
// Remove consecutive hyphens
.replace(/-+/g, '-')
// Trim hyphens from start/end
.replace(/^-+|-+$/g, '');
}
/**
* Generate a unique slug by appending a number if collision detected
*
* @param baseSlug - The base slug to make unique
* @param existingSlugs - Array of existing slugs to check against
* @returns Unique slug
*
* @example
* ensureUniqueSlug("tech-reviews", ["tech-reviews"]) // "tech-reviews-2"
* ensureUniqueSlug("tech-reviews", ["tech-reviews", "tech-reviews-2"]) // "tech-reviews-3"
*/
export function ensureUniqueSlug(baseSlug: string, existingSlugs: string[]): string {
let slug = baseSlug;
let counter = 2;
while (existingSlugs.includes(slug)) {
slug = `${baseSlug}-${counter}`;
counter++;
}
return slug;
}
/**
* Validate if a string is a valid slug format
*
* @param slug - The slug to validate
* @returns True if valid slug format
*/
export function isValidSlug(slug: string): boolean {
// Must be lowercase alphanumeric with hyphens only
// Cannot start or end with hyphen
// Cannot have consecutive hyphens
const slugRegex = /^[a-z0-9]+(-[a-z0-9]+)*$/;
return slugRegex.test(slug);
}