diff --git a/ui/web/src/lib/slug.test.ts b/ui/web/src/lib/slug.test.ts new file mode 100644 index 00000000..6d98f130 --- /dev/null +++ b/ui/web/src/lib/slug.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; + +import { isValidSlug, slugify } from "./slug"; + +describe("slugify", () => { + it("does not leave a trailing dash and passes isValidSlug", () => { + for (const input of ["hello world!", "My Agent ", "trailing---", "café résumé!", " spaced "]) { + const s = slugify(input); + expect(s.endsWith("-")).toBe(false); + expect(isValidSlug(s)).toBe(true); + } + expect(slugify("hello world!")).toBe("hello-world"); + }); + + it("still handles already-valid slugs and diacritics", () => { + expect(slugify("valid-slug")).toBe("valid-slug"); + expect(slugify("abc")).toBe("abc"); + expect(slugify("Đà Nẵng")).toBe("da-nang"); + }); +}); diff --git a/ui/web/src/lib/slug.ts b/ui/web/src/lib/slug.ts index 6bac8e32..5f8ce89b 100644 --- a/ui/web/src/lib/slug.ts +++ b/ui/web/src/lib/slug.ts @@ -11,7 +11,8 @@ export function slugify(input: string): string { .toLowerCase() .replace(/[^a-z0-9-]/g, "-") .replace(/-{2,}/g, "-") - .replace(/^-+/g, ""); + .replace(/^-+/g, "") + .replace(/-+$/g, ""); } /**