Files
multica/packages/views/workspace/slug.ts

34 lines
1.1 KiB
TypeScript

export const WORKSPACE_SLUG_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
export const WORKSPACE_SLUG_FORMAT_ERROR =
"Only lowercase letters, numbers, and hyphens";
export const WORKSPACE_SLUG_CONFLICT_ERROR =
"That workspace URL is already taken.";
/**
* Auto-generate a slug from a workspace name.
*
* Returns empty string when the name produces no valid characters (e.g.
* Chinese / Japanese / emoji-only names). The form leaves the slug field
* empty in this case and the user must type one — this is preferable to a
* hardcoded fallback like "workspace" which (a) silently chooses a useless
* URL slug and (b) causes 409 conflicts for the second non-ASCII-named
* workspace on the same instance.
*/
export function nameToWorkspaceSlug(name: string): string {
return name
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-|-$/g, "");
}
export function isWorkspaceSlugConflict(error: unknown): boolean {
return (
typeof error === "object" &&
error !== null &&
"status" in error &&
(error as { status?: unknown }).status === 409
);
}