diff --git a/apps/server/src/services/utils.spec.ts b/apps/server/src/services/utils.spec.ts index b7e57b441..e815de3f8 100644 --- a/apps/server/src/services/utils.spec.ts +++ b/apps/server/src/services/utils.spec.ts @@ -704,9 +704,10 @@ describe("#slugify", () => { expect(result).toBe(expectedSlug); }); - it("removes diacritic marks from characters", () => { + // preserves diacritic marks + it("preserves diacritic marks", () => { const testString = "Café naïve façade jalapeño"; - const expectedSlug = "cafe-naive-facade-jalapeno"; + const expectedSlug = "café-naïve-façade-jalapeño"; const result = utils.slugify(testString); expect(result).toBe(expectedSlug); }); diff --git a/apps/server/src/services/utils.ts b/apps/server/src/services/utils.ts index cdaa9d719..6d567f15a 100644 --- a/apps/server/src/services/utils.ts +++ b/apps/server/src/services/utils.ts @@ -499,11 +499,10 @@ export function formatSize(size: number | null | undefined) { function slugify(text: string) { return text - .normalize("NFKD") // decompose accents - .replace(/\p{Mark}/gu, "") // remove diacritics cleanly + .normalize("NFC") // keep composed form, preserves accents .toLowerCase() - .replace(/[^\p{Letter}\p{Number}]+/gu, "-") // keep Unicode letters/numbers - .replace(/(^-|-$)+/g, ""); // trim leading/trailing dashes + .replace(/[^\p{Letter}\p{Number}]+/gu, "-") // replace non-letter/number with "-" + .replace(/(^-|-$)+/g, ""); // trim dashes } export default {