kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import { createSlug } from "./create-slug";
2
3const RANDOM_SUFFIX_LENGTH = 12;
4
5export function createWorkspaceBaseSlug(value: string): string {
6 return createSlug(value) || "workspace";
7}
8
9function createRandomSuffix(): string {
10 return crypto.randomUUID().replace(/-/g, "").slice(0, RANDOM_SUFFIX_LENGTH);
11}
12
13export function createUniqueWorkspaceSlug(
14 value: string,
15 existingSlugs: Iterable<string | null | undefined>,
16): string {
17 const baseSlug = createWorkspaceBaseSlug(value);
18 const usedSlugs = new Set(
19 Array.from(existingSlugs, (slug) => slug?.toLowerCase()).filter(Boolean),
20 );
21
22 if (!usedSlugs.has(baseSlug.toLowerCase())) {
23 return baseSlug;
24 }
25
26 let slug = `${baseSlug}-${createRandomSuffix()}`;
27
28 while (usedSlugs.has(slug.toLowerCase())) {
29 slug = `${baseSlug}-${createRandomSuffix()}`;
30 }
31
32 return slug;
33}
34
35export function isWorkspaceSlugCollisionError(error: unknown): boolean {
36 if (!(error instanceof Error)) {
37 return false;
38 }
39
40 const message = error.message.toLowerCase();
41
42 return (
43 message.includes("already exists") ||
44 message.includes("workspace exists") ||
45 message.includes("slug")
46 );
47}