Files
famdone/shared/slugify.ts
T
2026-08-16 10:12:43 +01:00

29 lines
1.1 KiB
TypeScript

// Name → handle / slug helpers shared by frontend + proxy.
// URL-safe family slug (hyphenated, lowercase): "The Smiths" → "the-smiths".
export function slugify(name: string): string {
return name
.toLowerCase()
.trim()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
// Whitespace-free lowercase handle used for a member's URL segment and as the
// per-family username suffix: "Jakey Boy" → "jakeyboy", "Joe Edhook" → "joeedhook".
export function handle(name: string): string {
return name.toLowerCase().replace(/[^a-z0-9]/g, '');
}
// A member's PB username is namespaced by the family slug so it stays globally
// unique (PB requires auth-identity usernames to be unique) even though the URL
// segment is only unique within a family: "miss-fits:jakeyboy".
export function famUsername(famSlug: string, handleName: string): string {
return `${slugify(famSlug)}:${handleName}`;
}
// Reverse of famUsername — the URL segment is the part after the last ":".
export function handleOf(fullUsername: string): string {
const i = fullUsername.lastIndexOf(':');
return i >= 0 ? fullUsername.slice(i + 1) : fullUsername;
}