From d7348c870acb0dc7a9edeb0a865f5f09dcf64f38 Mon Sep 17 00:00:00 2001 From: Asher Gomez Date: Thu, 2 Nov 2023 10:18:41 +1100 Subject: [PATCH] fix: add missing `Object.groupBy()` and `Map.groupBy()` types (#21050) --- cli/build.rs | 1 + cli/tests/unit/globals_test.ts | 47 ++++++++++++++++++++++++++++++ cli/tsc/dts/lib.esnext.d.ts | 1 + cli/tsc/dts/lib.esnext.object.d.ts | 32 ++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 cli/tsc/dts/lib.esnext.object.d.ts diff --git a/cli/build.rs b/cli/build.rs index b7a4524657..16b31081e2 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -251,6 +251,7 @@ mod ts { "esnext.decorators", "esnext.disposable", "esnext.intl", + "esnext.object", ]; let path_dts = cwd.join("tsc/dts"); diff --git a/cli/tests/unit/globals_test.ts b/cli/tests/unit/globals_test.ts index b47e83cfd3..9f7f776447 100644 --- a/cli/tests/unit/globals_test.ts +++ b/cli/tests/unit/globals_test.ts @@ -170,3 +170,50 @@ Deno.test(async function arrayFromAsync() { const b = await Array.fromAsync(new Map([[1, 2], [3, 4]])); assertEquals(b, [[1, 2], [3, 4]]); }); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy#examples +Deno.test(function objectGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 5 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const result = Object.groupBy(inventory, ({ type }) => type); + assertEquals(result, { + vegetables: [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + ], + fruit: [ + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "cherries", type: "fruit", quantity: 5 }, + ], + meat: [ + { name: "goat", type: "meat", quantity: 23 }, + { name: "fish", type: "meat", quantity: 22 }, + ], + }); +}); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy#examples +Deno.test(function mapGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 9 }, + { name: "bananas", type: "fruit", quantity: 5 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 12 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const restock = { restock: true }; + const sufficient = { restock: false }; + const result = Map.groupBy( + inventory, + ({ quantity }) => quantity < 6 ? restock : sufficient, + ); + assertEquals(result.get(restock), [{ + name: "bananas", + type: "fruit", + quantity: 5, + }]); +}); diff --git a/cli/tsc/dts/lib.esnext.d.ts b/cli/tsc/dts/lib.esnext.d.ts index 3df5bce09b..0f265acfaf 100644 --- a/cli/tsc/dts/lib.esnext.d.ts +++ b/cli/tsc/dts/lib.esnext.d.ts @@ -19,5 +19,6 @@ and limitations under the License. /// /// /// +/// /// /// diff --git a/cli/tsc/dts/lib.esnext.object.d.ts b/cli/tsc/dts/lib.esnext.object.d.ts new file mode 100644 index 0000000000..130f2fc9fa --- /dev/null +++ b/cli/tsc/dts/lib.esnext.object.d.ts @@ -0,0 +1,32 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +/// + +// NOTE(iuioiua): taken from https://github.com/microsoft/TypeScript/issues/47171#issuecomment-1697373352 +// while we wait for these types to officially ship +interface ObjectConstructor { + groupBy( + items: Iterable, + keySelector: (item: Item, index: number) => Key, + ): Record; +} + +interface MapConstructor { + groupBy( + items: Iterable, + keySelector: (item: Item, index: number) => Key, + ): Map; +}