summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsher Gomez <ashersaupingomez@gmail.com>2023-11-02 10:18:41 +1100
committerGitHub <noreply@github.com>2023-11-01 23:18:41 +0000
commitd7348c870acb0dc7a9edeb0a865f5f09dcf64f38 (patch)
tree98820251a4643a95e8598a76223c528a1ad409f4
parent58d543a480463ed24de77ec155f1d7e87bb7b234 (diff)
fix: add missing `Object.groupBy()` and `Map.groupBy()` types (#21050)
-rw-r--r--cli/build.rs1
-rw-r--r--cli/tests/unit/globals_test.ts47
-rw-r--r--cli/tsc/dts/lib.esnext.d.ts1
-rw-r--r--cli/tsc/dts/lib.esnext.object.d.ts32
4 files changed, 81 insertions, 0 deletions
diff --git a/cli/build.rs b/cli/build.rs
index b7a452465..16b31081e 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 b47e83cfd..9f7f77644 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 3df5bce09..0f265acfa 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.
/// <reference lib="es2023" />
/// <reference lib="esnext.array" />
/// <reference lib="esnext.intl" />
+/// <reference lib="esnext.object" />
/// <reference lib="esnext.decorators" />
/// <reference lib="esnext.disposable" />
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 000000000..130f2fc9f
--- /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.
+***************************************************************************** */
+
+/// <reference no-default-lib="true"/>
+
+// 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<Item, Key extends PropertyKey>(
+ items: Iterable<Item>,
+ keySelector: (item: Item, index: number) => Key,
+ ): Record<Key, Item[]>;
+}
+
+interface MapConstructor {
+ groupBy<Item, Key>(
+ items: Iterable<Item>,
+ keySelector: (item: Item, index: number) => Key,
+ ): Map<Key, Item[]>;
+}