29 lines
1.1 KiB
TypeScript
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;
|
|
} |