From 03c3a88841b97aa2214095c179ec4c036a895460 Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Tue, 29 Sep 2026 22:06:33 +0200 Subject: [PATCH] fix(schema): case the present label by its language only page.locale accepts any string. A malformed tag such as "de-DE-" made toLocaleUpperCase throw a RangeError, so parseResumeData failed and the resume could not load. The language code always comes from the parser's word list, so it is a valid tag. --- packages/schema/src/resume/dates.test.ts | 4 ++++ packages/schema/src/resume/dates.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/schema/src/resume/dates.test.ts b/packages/schema/src/resume/dates.test.ts index 2b6fa166c..ba7bd4ff2 100644 --- a/packages/schema/src/resume/dates.test.ts +++ b/packages/schema/src/resume/dates.test.ts @@ -96,6 +96,10 @@ describe("getPresentLabel", () => { expect(getPresentLabel("de-DE")).toBe("Heute"); expect(getPresentLabel("xx-XX")).toBe("Present"); }); + + it("reads a malformed locale tag by its language instead of throwing", () => { + expect(getPresentLabel("de-DE-")).toBe("Heute"); + }); }); describe("upgradeResumeDates", () => { diff --git a/packages/schema/src/resume/dates.ts b/packages/schema/src/resume/dates.ts index 534dab196..f617ac51b 100644 --- a/packages/schema/src/resume/dates.ts +++ b/packages/schema/src/resume/dates.ts @@ -55,7 +55,8 @@ export function getPresentLabel(locale: string): string { const word = ONGOING_TOKENS_BY_LANGUAGE[language]?.[0]; if (!word) return "Present"; - return word.charAt(0).toLocaleUpperCase(locale) + word.slice(1); + // Case the word by its language alone: `locale` can be a malformed tag ("de-DE-") that throws a RangeError. + return word.charAt(0).toLocaleUpperCase(language) + word.slice(1); } const toEndpoint = (value: YearMonth): PeriodEndpoint => {