From 64a51e8e289e5f30f7ae5abd67bbfe64f2c20b92 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:03:18 +0000 Subject: [PATCH 1/3] Initial plan From 5de28dbf4d53e12427f86ae68fe69d356aef90f0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:09:35 +0000 Subject: [PATCH 2/3] Add approximatelySign to NumberFormatPartTypeRegistry for ES2023 Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- src/lib/es2023.intl.d.ts | 22 ++-- .../reference/intlNumberFormatES2023.js | 24 ++++ .../reference/intlNumberFormatES2023.symbols | 45 ++++++++ .../reference/intlNumberFormatES2023.types | 103 ++++++++++++++++++ .../es2023/intlNumberFormatES2023.ts | 27 +++-- 5 files changed, 205 insertions(+), 16 deletions(-) diff --git a/src/lib/es2023.intl.d.ts b/src/lib/es2023.intl.d.ts index 91d29c3d04e30..76847858f2d21 100644 --- a/src/lib/es2023.intl.d.ts +++ b/src/lib/es2023.intl.d.ts @@ -1,12 +1,16 @@ -declare namespace Intl { - interface NumberFormatOptionsUseGroupingRegistry { - min2: never; - auto: never; - always: never; - } - - interface NumberFormatOptionsSignDisplayRegistry { - negative: never; +declare namespace Intl { + interface NumberFormatOptionsUseGroupingRegistry { + min2: never; + auto: never; + always: never; + } + + interface NumberFormatOptionsSignDisplayRegistry { + negative: never; + } + + interface NumberFormatPartTypeRegistry { + approximatelySign: never; } interface NumberFormatOptions { diff --git a/tests/baselines/reference/intlNumberFormatES2023.js b/tests/baselines/reference/intlNumberFormatES2023.js index 983fe0ff00305..788f4fd755aad 100644 --- a/tests/baselines/reference/intlNumberFormatES2023.js +++ b/tests/baselines/reference/intlNumberFormatES2023.js @@ -31,6 +31,19 @@ new Intl.NumberFormat('en-GB').formatRangeToParts('123E-4', '567E8'); new Intl.NumberFormat('en-GB').format('Infinity'); new Intl.NumberFormat('en-GB').format('-Infinity'); new Intl.NumberFormat('en-GB').format('+Infinity'); + +// Test approximatelySign part type +const nf = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "EUR", + maximumFractionDigits: 0, +}); + +nf + .formatRangeToParts(100, 100) + .filter((part) => part.type !== "approximatelySign") + .map((part) => part.value) + .join(""); //// [intlNumberFormatES2023.js] @@ -59,3 +72,14 @@ new Intl.NumberFormat('en-GB').formatRangeToParts('123E-4', '567E8'); new Intl.NumberFormat('en-GB').format('Infinity'); new Intl.NumberFormat('en-GB').format('-Infinity'); new Intl.NumberFormat('en-GB').format('+Infinity'); +// Test approximatelySign part type +const nf = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "EUR", + maximumFractionDigits: 0, +}); +nf + .formatRangeToParts(100, 100) + .filter((part) => part.type !== "approximatelySign") + .map((part) => part.value) + .join(""); diff --git a/tests/baselines/reference/intlNumberFormatES2023.symbols b/tests/baselines/reference/intlNumberFormatES2023.symbols index ade51253237e2..c9657d57e65cc 100644 --- a/tests/baselines/reference/intlNumberFormatES2023.symbols +++ b/tests/baselines/reference/intlNumberFormatES2023.symbols @@ -130,3 +130,48 @@ new Intl.NumberFormat('en-GB').format('+Infinity'); >NumberFormat : Symbol(Intl.NumberFormat, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2018.intl.d.ts, --, --), Decl(lib.es2020.bigint.d.ts, --, --), Decl(lib.es2023.intl.d.ts, --, --)) >format : Symbol(Intl.NumberFormat.format, Decl(lib.es5.d.ts, --, --), Decl(lib.es2020.bigint.d.ts, --, --), Decl(lib.es2023.intl.d.ts, --, --)) +// Test approximatelySign part type +const nf = new Intl.NumberFormat("en-US", { +>nf : Symbol(nf, Decl(intlNumberFormatES2023.ts, 32, 5)) +>Intl.NumberFormat : Symbol(Intl.NumberFormat, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2018.intl.d.ts, --, --), Decl(lib.es2020.bigint.d.ts, --, --), Decl(lib.es2023.intl.d.ts, --, --)) +>Intl : Symbol(Intl, Decl(lib.es5.d.ts, --, --), Decl(lib.es2016.intl.d.ts, --, --), Decl(lib.es2017.intl.d.ts, --, --), Decl(lib.es2018.intl.d.ts, --, --), Decl(lib.es2019.intl.d.ts, --, --) ... and 5 more) +>NumberFormat : Symbol(Intl.NumberFormat, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2018.intl.d.ts, --, --), Decl(lib.es2020.bigint.d.ts, --, --), Decl(lib.es2023.intl.d.ts, --, --)) + + style: "currency", +>style : Symbol(style, Decl(intlNumberFormatES2023.ts, 32, 43)) + + currency: "EUR", +>currency : Symbol(currency, Decl(intlNumberFormatES2023.ts, 33, 20)) + + maximumFractionDigits: 0, +>maximumFractionDigits : Symbol(maximumFractionDigits, Decl(intlNumberFormatES2023.ts, 34, 18)) + +}); + +nf +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map((part) => part.value) .join : Symbol(Array.join, Decl(lib.es5.d.ts, --, --)) +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --)) +>nf .formatRangeToParts(100, 100) .filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>nf .formatRangeToParts : Symbol(Intl.NumberFormat.formatRangeToParts, Decl(lib.es2023.intl.d.ts, --, --)) +>nf : Symbol(nf, Decl(intlNumberFormatES2023.ts, 32, 5)) + + .formatRangeToParts(100, 100) +>formatRangeToParts : Symbol(Intl.NumberFormat.formatRangeToParts, Decl(lib.es2023.intl.d.ts, --, --)) + + .filter((part) => part.type !== "approximatelySign") +>filter : Symbol(Array.filter, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>part : Symbol(part, Decl(intlNumberFormatES2023.ts, 40, 11)) +>part.type : Symbol(Intl.NumberFormatPart.type, Decl(lib.es2018.intl.d.ts, --, --)) +>part : Symbol(part, Decl(intlNumberFormatES2023.ts, 40, 11)) +>type : Symbol(Intl.NumberFormatPart.type, Decl(lib.es2018.intl.d.ts, --, --)) + + .map((part) => part.value) +>map : Symbol(Array.map, Decl(lib.es5.d.ts, --, --)) +>part : Symbol(part, Decl(intlNumberFormatES2023.ts, 41, 8)) +>part.value : Symbol(Intl.NumberFormatPart.value, Decl(lib.es2018.intl.d.ts, --, --)) +>part : Symbol(part, Decl(intlNumberFormatES2023.ts, 41, 8)) +>value : Symbol(Intl.NumberFormatPart.value, Decl(lib.es2018.intl.d.ts, --, --)) + + .join(""); +>join : Symbol(Array.join, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/intlNumberFormatES2023.types b/tests/baselines/reference/intlNumberFormatES2023.types index 4063a0dcbec95..a05fed5f24e4e 100644 --- a/tests/baselines/reference/intlNumberFormatES2023.types +++ b/tests/baselines/reference/intlNumberFormatES2023.types @@ -376,3 +376,106 @@ new Intl.NumberFormat('en-GB').format('+Infinity'); >'+Infinity' : "+Infinity" > : ^^^^^^^^^^^ +// Test approximatelySign part type +const nf = new Intl.NumberFormat("en-US", { +>nf : Intl.NumberFormat +> : ^^^^^^^^^^^^^^^^^ +>new Intl.NumberFormat("en-US", { style: "currency", currency: "EUR", maximumFractionDigits: 0,}) : Intl.NumberFormat +> : ^^^^^^^^^^^^^^^^^ +>Intl.NumberFormat : Intl.NumberFormatConstructor +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>Intl : typeof Intl +> : ^^^^^^^^^^^ +>NumberFormat : Intl.NumberFormatConstructor +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>"en-US" : "en-US" +> : ^^^^^^^ +>{ style: "currency", currency: "EUR", maximumFractionDigits: 0,} : { style: "currency"; currency: string; maximumFractionDigits: number; } +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + style: "currency", +>style : "currency" +> : ^^^^^^^^^^ +>"currency" : "currency" +> : ^^^^^^^^^^ + + currency: "EUR", +>currency : string +> : ^^^^^^ +>"EUR" : "EUR" +> : ^^^^^ + + maximumFractionDigits: 0, +>maximumFractionDigits : number +> : ^^^^^^ +>0 : 0 +> : ^ + +}); + +nf +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map((part) => part.value) .join("") : string +> : ^^^^^^ +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map((part) => part.value) .join : (separator?: string) => string +> : ^ ^^^ ^^^^^ +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map((part) => part.value) : string[] +> : ^^^^^^^^ +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") .map : (callbackfn: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => U, thisArg?: any) => U[] +> : ^ ^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ +>nf .formatRangeToParts(100, 100) .filter((part) => part.type !== "approximatelySign") : Intl.NumberRangeFormatPart[] +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>nf .formatRangeToParts(100, 100) .filter : { (predicate: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => value is S, thisArg?: any): S[]; (predicate: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => unknown, thisArg?: any): Intl.NumberRangeFormatPart[]; } +> : ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>nf .formatRangeToParts(100, 100) : Intl.NumberRangeFormatPart[] +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>nf .formatRangeToParts : (start: number | bigint | Intl.StringNumericLiteral, end: number | bigint | Intl.StringNumericLiteral) => Intl.NumberRangeFormatPart[] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>nf : Intl.NumberFormat +> : ^^^^^^^^^^^^^^^^^ + + .formatRangeToParts(100, 100) +>formatRangeToParts : (start: number | bigint | Intl.StringNumericLiteral, end: number | bigint | Intl.StringNumericLiteral) => Intl.NumberRangeFormatPart[] +> : ^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>100 : 100 +> : ^^^ +>100 : 100 +> : ^^^ + + .filter((part) => part.type !== "approximatelySign") +>filter : { (predicate: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => value is S, thisArg?: any): S[]; (predicate: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => unknown, thisArg?: any): Intl.NumberRangeFormatPart[]; } +> : ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>(part) => part.type !== "approximatelySign" : (part: Intl.NumberRangeFormatPart) => boolean +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>part : Intl.NumberRangeFormatPart +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>part.type !== "approximatelySign" : boolean +> : ^^^^^^^ +>part.type : keyof Intl.NumberFormatPartTypeRegistry +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>part : Intl.NumberRangeFormatPart +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>type : keyof Intl.NumberFormatPartTypeRegistry +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>"approximatelySign" : "approximatelySign" +> : ^^^^^^^^^^^^^^^^^^^ + + .map((part) => part.value) +>map : (callbackfn: (value: Intl.NumberRangeFormatPart, index: number, array: Intl.NumberRangeFormatPart[]) => U, thisArg?: any) => U[] +> : ^ ^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ +>(part) => part.value : (part: Intl.NumberRangeFormatPart) => string +> : ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +>part : Intl.NumberRangeFormatPart +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>part.value : string +> : ^^^^^^ +>part : Intl.NumberRangeFormatPart +> : ^^^^^^^^^^^^^^^^^^^^^^^^^^ +>value : string +> : ^^^^^^ + + .join(""); +>join : (separator?: string) => string +> : ^ ^^^ ^^^^^ +>"" : "" +> : ^^ + diff --git a/tests/cases/conformance/es2023/intlNumberFormatES2023.ts b/tests/cases/conformance/es2023/intlNumberFormatES2023.ts index 1255f41968994..a2f7c282baf70 100644 --- a/tests/cases/conformance/es2023/intlNumberFormatES2023.ts +++ b/tests/cases/conformance/es2023/intlNumberFormatES2023.ts @@ -25,10 +25,23 @@ new Intl.NumberFormat('en-GB').formatRange(10n, 1000n); new Intl.NumberFormat('en-GB').formatRangeToParts(10, 1000)[0]; new Intl.NumberFormat('en-GB').formatRangeToParts(10n, 1000n)[0]; -// Arbitrary-precision string arguments -new Intl.NumberFormat('en-GB').format('-12.3E-4'); -new Intl.NumberFormat('en-GB').formatRange('123.4', '567.8'); -new Intl.NumberFormat('en-GB').formatRangeToParts('123E-4', '567E8'); -new Intl.NumberFormat('en-GB').format('Infinity'); -new Intl.NumberFormat('en-GB').format('-Infinity'); -new Intl.NumberFormat('en-GB').format('+Infinity'); +// Arbitrary-precision string arguments +new Intl.NumberFormat('en-GB').format('-12.3E-4'); +new Intl.NumberFormat('en-GB').formatRange('123.4', '567.8'); +new Intl.NumberFormat('en-GB').formatRangeToParts('123E-4', '567E8'); +new Intl.NumberFormat('en-GB').format('Infinity'); +new Intl.NumberFormat('en-GB').format('-Infinity'); +new Intl.NumberFormat('en-GB').format('+Infinity'); + +// Test approximatelySign part type +const nf = new Intl.NumberFormat("en-US", { + style: "currency", + currency: "EUR", + maximumFractionDigits: 0, +}); + +nf + .formatRangeToParts(100, 100) + .filter((part) => part.type !== "approximatelySign") + .map((part) => part.value) + .join(""); From 894046694be139e9cae997acac63fd8fc5b05da1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:10:58 +0000 Subject: [PATCH 3/3] Apply formatting to es2023.intl.d.ts --- src/lib/es2023.intl.d.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib/es2023.intl.d.ts b/src/lib/es2023.intl.d.ts index 76847858f2d21..9d580ed448c1d 100644 --- a/src/lib/es2023.intl.d.ts +++ b/src/lib/es2023.intl.d.ts @@ -1,16 +1,16 @@ -declare namespace Intl { - interface NumberFormatOptionsUseGroupingRegistry { - min2: never; - auto: never; - always: never; - } - - interface NumberFormatOptionsSignDisplayRegistry { - negative: never; - } - - interface NumberFormatPartTypeRegistry { - approximatelySign: never; +declare namespace Intl { + interface NumberFormatOptionsUseGroupingRegistry { + min2: never; + auto: never; + always: never; + } + + interface NumberFormatOptionsSignDisplayRegistry { + negative: never; + } + + interface NumberFormatPartTypeRegistry { + approximatelySign: never; } interface NumberFormatOptions {