From ddb7c0d26436b3aab88bb91c8944f0c2fc5db88e Mon Sep 17 00:00:00 2001 From: xiehuanyi <74809554+xiehuanyi@users.noreply.github.com> Date: Sun, 11 Oct 2026 10:04:14 +0300 Subject: [PATCH] Capitalize complete Unicode code points --- packages/change-case/src/index.spec.ts | 28 ++++++++++++++++++++++++++ packages/change-case/src/index.ts | 9 ++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/change-case/src/index.spec.ts b/packages/change-case/src/index.spec.ts index 14152e8a..62b659ed 100644 --- a/packages/change-case/src/index.spec.ts +++ b/packages/change-case/src/index.spec.ts @@ -381,6 +381,34 @@ const tests: [string, Result, Options?][] = [ ]; describe("change case", () => { + it("capitalizes supplementary-plane letters as complete code points", () => { + const lower = "\u{10428}"; + const upper = "\u{10400}"; + for (const locale of [undefined, false] as const) { + expect(capitalCase(`${lower}foo bar`, { locale })).toEqual( + `${upper}foo Bar`, + ); + expect(sentenceCase(`${lower}foo bar`, { locale })).toEqual( + `${upper}foo bar`, + ); + expect(pascalCase(`${lower}foo bar`, { locale })).toEqual( + `${upper}fooBar`, + ); + expect(camelCase(`foo ${lower}bar`, { locale })).toEqual( + `foo${upper}bar`, + ); + expect(trainCase(`${lower}foo bar`, { locale })).toEqual( + `${upper}foo-Bar`, + ); + expect( + pascalCase(`${lower}foo bar`, { + locale, + mergeAmbiguousCharacters: true, + }), + ).toEqual(`${upper}fooBar`); + } + }); + for (const [input, result, options] of tests) { it(input, () => { expect(camelCase(input, options)).toEqual(result.camelCase); diff --git a/packages/change-case/src/index.ts b/packages/change-case/src/index.ts index a84701f2..5d1b489d 100644 --- a/packages/change-case/src/index.ts +++ b/packages/change-case/src/index.ts @@ -232,7 +232,10 @@ function capitalCaseTransformFactory( lower: (input: string) => string, upper: (input: string) => string, ) { - return (word: string) => `${upper(word[0])}${lower(word.slice(1))}`; + return (word: string) => { + const [char0] = word; + return `${upper(char0)}${lower(word.slice(char0.length))}`; + }; } function pascalCaseTransformFactory( @@ -240,10 +243,10 @@ function pascalCaseTransformFactory( upper: (input: string) => string, ) { return (word: string, index: number) => { - const char0 = word[0]; + const [char0] = word; const initial = index > 0 && char0 >= "0" && char0 <= "9" ? "_" + char0 : upper(char0); - return initial + lower(word.slice(1)); + return initial + lower(word.slice(char0.length)); }; }