Skip to content

Commit 88ee62c

Browse files
committed
move Map upsert proposal to stable ES
1 parent 5099e7c commit 88ee62c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+334
-229
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22
### Unreleased
3+
- [`Map` upsert proposal](https://github.com/tc39/proposal-upsert):
4+
- Built-ins:
5+
- `Map.prototype.getOrInsert`
6+
- `Map.prototype.getOrInsertComputed`
7+
- `WeakMap.prototype.getOrInsert`
8+
- `WeakMap.prototype.getOrInsertComputed`
9+
- Moved to stable ES, January 2026 TC39 meeting
10+
- Added `es.` namespace modules, `/es/` and `/stable/` namespaces entries
311
- Use `CreateDataProperty` / `CreateDataPropertyOrThrow` in some missed cases, [#1497](https://github.com/zloirock/core-js/issues/1497)
412
- Minor fix / optimization in the `RegExp` constructor (NCG and `dotAll`) polyfill
513
- Compat data improvements:
@@ -12,7 +20,7 @@
1220

1321
### [3.47.0 - 2025.11.18](https://github.com/zloirock/core-js/releases/tag/v3.47.0)
1422
- Changes [v3.46.0...v3.47.0](https://github.com/zloirock/core-js/compare/v3.46.0...v3.47.0) (117 commits)
15-
- [`JSON.parse` source text access proposal](https://github.com/tc39/proposal-json-parse-with-source) :
23+
- [`JSON.parse` source text access proposal](https://github.com/tc39/proposal-json-parse-with-source):
1624
- Built-ins:
1725
- `JSON.isRawJSON`
1826
- `JSON.parse`

README.md

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,10 @@ structuredClone(new Set([1, 2, 3])); // => new Set([1, 2, 3])
168168
- [Well-formed `JSON.stringify`](#well-formed-jsonstringify)
169169
- [Well-formed unicode strings](#well-formed-unicode-strings)
170170
- [New `Set` methods](#new-set-methods)
171+
- [`Map` upsert](#map-upsert)
171172
- [`Math.sumPrecise`](#mathsumprecise)
172173
- [Stage 3 proposals](#stage-3-proposals)
173174
- [Joint iteration](#joint-iteration)
174-
- [`Map` upsert](#map-upsert)
175175
- [`Symbol.metadata` for decorators metadata proposal](#symbolmetadata-for-decorators-metadata-proposal)
176176
- [Stage 2.7 proposals](#stage-27-proposals)
177177
- [`Iterator` chunking](#iterator-chunking)
@@ -1594,14 +1594,16 @@ for (let key in object2) console.log(key); // nothing
15941594
#### ECMAScript: Collections[](#index)
15951595
`core-js` uses native collections in most cases, just fixes methods / constructor, if it's required, and in the old environment uses fast polyfill (O(1) lookup).
15961596
#### Map[](#index)
1597-
Modules [`es.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.js) and [`es.map.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.group-by.js).
1597+
Modules [`es.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.js), [`es.map.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.group-by.js), [`es.map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert.js) and [`es.map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert-computed.js).
15981598
```ts
15991599
class Map {
16001600
constructor(iterable?: Iterable<[key, value]>): Map;
16011601
clear(): void;
16021602
delete(key: any): boolean;
16031603
forEach(callbackfn: (value: any, key: any, target: any) => void, thisArg: any): void;
16041604
get(key: any): any;
1605+
getOrInsert(key: any, value: any): any;
1606+
getOrInsertComputed(key: any, (key: any) => value: any): any;
16051607
has(key: any): boolean;
16061608
set(key: any, val: any): this;
16071609
values(): Iterator<value>;
@@ -1616,8 +1618,10 @@ class Map {
16161618
```
16171619
core-js(-pure)/es|stable|actual|full/map
16181620
core-js(-pure)/es|stable|actual|full/map/group-by
1621+
core-js(-pure)/es|stable|actual|full/map/get-or-insert
1622+
core-js(-pure)/es|stable|actual|full/map/get-or-insert-computed
16191623
```
1620-
[*Examples*](https://tinyurl.com/yn2w5s8v):
1624+
[*Examples*](https://tinyurl.com/298ekxmq):
16211625
```js
16221626
let array = [1];
16231627

@@ -1653,7 +1657,20 @@ for (let [key, value] of map.entries()) {
16531657
map = Map.groupBy([1, 2, 3, 4, 5], it => it % 2);
16541658
map.get(1); // => [1, 3, 5]
16551659
map.get(0); // => [2, 4]
1660+
1661+
map = new Map([['a', 1]]);
1662+
1663+
map.getOrInsert('a', 2); // => 1
1664+
1665+
map.getOrInsert('b', 3); // => 3
1666+
1667+
map.getOrInsertComputed('a', key => key); // => 1
1668+
1669+
map.getOrInsertComputed('c', key => key); // => 'c'
1670+
1671+
console.log(map); // => Map { 'a': 1, 'b': 3, 'c': 'c' }
16561672
```
1673+
16571674
#### Set[](#index)
16581675
Modules [`es.set`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.js), [`es.set.difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.difference.v2.js), [`es.set.intersection.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.intersection.v2.js), [`es.set.is-disjoint-from.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.is-disjoint-from.v2.js), [`es.set.is-subset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.is-subset-of.v2.js), [`es.set.is-superset-of.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.is-superset-of.v2.js), [`es.set.symmetric-difference.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.symmetric-difference.v2.js), [`es.set.union.v2`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.set.union.v2.js)
16591676
```ts
@@ -1722,19 +1739,23 @@ new Set([1, 2, 3]).isSubsetOf(new Set([5, 4, 3, 2, 1])); // => true
17221739
new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3])); // => true
17231740
```
17241741
#### WeakMap[](#index)
1725-
Module [`es.weak-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.js).
1742+
Module [`es.weak-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.js), [`es.weak-map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert.js) and [`es.weak-map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert-computed.js).
17261743
```ts
17271744
class WeakMap {
17281745
constructor(iterable?: Iterable<[key, value]>): WeakMap;
1729-
delete(key: Object): boolean;
1730-
get(key: Object): any;
1731-
has(key: Object): boolean;
1732-
set(key: Object, val: any): this;
1746+
delete(key: object | symbol): boolean;
1747+
get(key: object | symbol): any;
1748+
getOrInsert(key: object | symbol, value: any): any;
1749+
getOrInsertComputed(key: object | symbol, (key: any) => value: any): any;
1750+
has(key: object | symbol): boolean;
1751+
set(key: object | symbol, val: any): this;
17331752
}
17341753
```
17351754
[*CommonJS entry points:*](#commonjs-api)
17361755
```
17371756
core-js(-pure)/es|stable|actual|full/weak-map
1757+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert
1758+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert-computed
17381759
```
17391760
[*Examples*](https://tinyurl.com/2yws9shh):
17401761
```js
@@ -1772,9 +1793,9 @@ Module [`es.weak-set`](https://github.com/zloirock/core-js/blob/master/packages/
17721793
```ts
17731794
class WeakSet {
17741795
constructor(iterable?: Iterable<value>): WeakSet;
1775-
add(key: Object): this;
1776-
delete(key: Object): boolean;
1777-
has(key: Object): boolean;
1796+
add(key: object | symbol): this;
1797+
delete(key: object | symbol): boolean;
1798+
has(key: object | symbol): boolean;
17781799
}
17791800
```
17801801
[*CommonJS entry points:*](#commonjs-api)
@@ -2728,6 +2749,23 @@ class Set {
27282749
core-js/proposals/set-methods-v2
27292750
```
27302751

2752+
##### [`Map` upsert](https://github.com/thumbsupep/proposal-upsert)[](#index)
2753+
```ts
2754+
class Map {
2755+
getOrInsert(key: any, value: any): any;
2756+
getOrInsertComputed(key: any, (key: any) => value: any): any;
2757+
}
2758+
2759+
class WeakMap {
2760+
getOrInsert(key: object | symbol, value: any): any;
2761+
getOrInsertComputed(key: object | symbol, (key: any) => value: any): any;
2762+
}
2763+
```
2764+
[*CommonJS entry points:*](#commonjs-api)
2765+
```
2766+
core-js/proposals/map-upsert-v4
2767+
```
2768+
27312769
##### [`Math.sumPrecise`](https://github.com/tc39/proposal-math-sum)
27322770
```ts
27332771
namespace Math {
@@ -2797,42 +2835,6 @@ Iterator.zipKeyed({
27972835
*/
27982836
```
27992837

2800-
##### [`Map` upsert](https://github.com/thumbsupep/proposal-upsert)[](#index)
2801-
Modules [`esnext.map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.get-or-insert.js), [`esnext.map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.get-or-insert-computed.js), [`esnext.weak-map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.weak-map.get-or-insert.js) and [`esnext.weak-map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.weak-map.get-or-insert-computed.js)
2802-
```ts
2803-
class Map {
2804-
getOrInsert(key: any, value: any): any;
2805-
getOrInsertComputed(key: any, (key: any) => value: any): any;
2806-
}
2807-
2808-
class WeakMap {
2809-
getOrInsert(key: any, value: any): any;
2810-
getOrInsertComputed(key: any, (key: any) => value: any): any;
2811-
}
2812-
```
2813-
[*CommonJS entry points:*](#commonjs-api)
2814-
```
2815-
core-js/proposals/map-upsert-v4
2816-
core-js(-pure)/actual|full/map/get-or-insert
2817-
core-js(-pure)/actual|full/map/get-or-insert-computed
2818-
core-js(-pure)/actual|full/weak-map/get-or-insert
2819-
core-js(-pure)/actual|full/weak-map/get-or-insert-computed
2820-
```
2821-
[*Examples*](https://tinyurl.com/2a54u5ux):
2822-
```js
2823-
const map = new Map([['a', 1]]);
2824-
2825-
map.getOrInsert('a', 2); // => 1
2826-
2827-
map.getOrInsert('b', 3); // => 3
2828-
2829-
map.getOrInsertComputed('a', key => key); // => 1
2830-
2831-
map.getOrInsertComputed('c', key => key); // => 'c'
2832-
2833-
console.log(map); // => Map { 'a': 1, 'b': 3, 'c': 'c' }
2834-
```
2835-
28362838
##### [`Symbol.metadata` for decorators metadata proposal](https://github.com/tc39/proposal-decorator-metadata)[](#index)
28372839
Modules [`esnext.symbol.metadata`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.symbol.metadata.js) and [`esnext.function.metadata`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.function.metadata.js).
28382840
```ts

docs/web/docs/features/ecmascript/collections.md

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
## Map
55
### Modules
6-
[`es.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.js), [`es.map.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.group-by.js).
6+
[`es.map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.js), [`es.map.group-by`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.group-by.js), [`es.map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert.js) and [`es.map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert-computed.js).
77

88
### Built-ins signatures
99
```ts
@@ -13,6 +13,8 @@ class Map {
1313
delete(key: any): boolean;
1414
forEach(callbackfn: (value: any, key: any, target: any) => void, thisArg: any): void;
1515
get(key: any): any;
16+
getOrInsert(key: any, value: any): any;
17+
getOrInsertComputed(key: any, (key: any) => value: any): any;
1618
has(key: any): boolean;
1719
set(key: any, val: any): this;
1820
values(): Iterator<value>;
@@ -28,6 +30,8 @@ class Map {
2830
```plaintext
2931
core-js(-pure)/es|stable|actual|full/map
3032
core-js(-pure)/es|stable|actual|full/map/group-by
33+
core-js(-pure)/es|stable|actual|full/map/get-or-insert
34+
core-js(-pure)/es|stable|actual|full/map/get-or-insert-computed
3135
```
3236

3337
### Examples
@@ -66,6 +70,19 @@ for (let [key, value] of map.entries()) {
6670
map = Map.groupBy([1, 2, 3, 4, 5], it => it % 2);
6771
map.get(1); // => [1, 3, 5]
6872
map.get(0); // => [2, 4]
73+
74+
75+
map = new Map([['a', 1]]);
76+
77+
map.getOrInsert('a', 2); // => 1
78+
79+
map.getOrInsert('b', 3); // => 3
80+
81+
map.getOrInsertComputed('a', key => key); // => 1
82+
83+
map.getOrInsertComputed('c', key => key); // => 'c'
84+
85+
console.log(map); // => Map { 'a': 1, 'b': 3, 'c': 'c' }
6986
```
7087

7188
## Set
@@ -144,21 +161,25 @@ new Set([5, 4, 3, 2, 1]).isSupersetOf(new Set([1, 2, 3])); // => true
144161
## WeakMap
145162

146163
### Modules
147-
[`es.weak-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.js).
164+
[`es.weak-map`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.js), [`es.weak-map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert.js) and [`es.weak-map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert-computed.js).
148165

149166
### Built-ins signatures
150167
```ts
151168
class WeakMap {
152169
constructor(iterable?: Iterable<[key, value]>): WeakMap;
153-
delete(key: Object): boolean;
154-
get(key: Object): any;
155-
has(key: Object): boolean;
156-
set(key: Object, val: any): this;
170+
delete(key: object | symbol): boolean;
171+
get(key: object | symbol): any;
172+
getOrInsert(key: object | symbol, value: any): any;
173+
getOrInsertComputed(key: object | symbol, (key: any) => value: any): any;
174+
has(key: object | symbol): boolean;
175+
set(key: object | symbol, val: any): this;
157176
}
158177
```
159178
### [Entry points]({docs-version}/docs/usage#h-entry-points)
160179
```plaintext
161180
core-js(-pure)/es|stable|actual|full/weak-map
181+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert
182+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert-computed
162183
```
163184

164185
### Examples
@@ -201,9 +222,9 @@ for (let key in person) console.log(key); // => only 'getName'
201222
```ts
202223
class WeakSet {
203224
constructor(iterable?: Iterable<value>): WeakSet;
204-
add(key: Object): this;
205-
delete(key: Object): boolean;
206-
has(key: Object): boolean;
225+
add(key: object | symbol): this;
226+
delete(key: object | symbol): boolean;
227+
has(key: object | symbol): boolean;
207228
}
208229
```
209230

docs/web/docs/features/proposals/map-upsert.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
[Proposal repo](https://github.com/thumbsupep/proposal-upsert)
44

55
## Modules
6-
[`esnext.map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.get-or-insert.js), [`esnext.map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.map.get-or-insert-computed.js), [`esnext.weak-map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.weak-map.get-or-insert.js) and [`esnext.weak-map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.weak-map.get-or-insert-computed.js)
6+
[`es.map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert.js), [`es.map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.map.get-or-insert-computed.js), [`es.weak-map.get-or-insert`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert.js) and [`es.weak-map.get-or-insert-computed`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.weak-map.get-or-insert-computed.js).
77

88
## Built-ins signatures
99
```ts
1010
class Map {
11-
getOrInsert(key: any, value: any): any;
12-
getOrInsertComputed(key: any, (key: any) => value: any): any;
11+
getOrInsert(key: object | symbol, value: any): any;
12+
getOrInsertComputed(key: object | symbol, (key: any) => value: any): any;
1313
}
1414

1515
class WeakMap {
16-
getOrInsert(key: any, value: any): any;
17-
getOrInsertComputed(key: any, (key: any) => value: any): any;
16+
getOrInsert(key: object | symbol, value: any): any;
17+
getOrInsertComputed(key: object | symbol, (key: any) => value: any): any;
1818
}
1919
```
2020

2121
## [Entry points]({docs-version}/docs/usage#h-entry-points)
2222
```plaintext
2323
core-js/proposals/map-upsert-v4
24-
core-js(-pure)/actual|full/map/get-or-insert
25-
core-js(-pure)/actual|full/map/get-or-insert-computed
26-
core-js(-pure)/actual|full/weak-map/get-or-insert
27-
core-js(-pure)/actual|full/weak-map/get-or-insert-computed
24+
core-js(-pure)/es|stable|actual|full/map/get-or-insert
25+
core-js(-pure)/es|stable|actual|full/map/get-or-insert-computed
26+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert
27+
core-js(-pure)/es|stable|actual|full/weak-map/get-or-insert-computed
2828
```
2929

3030
## Examples

docs/web/docs/menu.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,10 @@
237237
"title": "New Set methods",
238238
"url": "{docs-version}/docs/features/proposals/set-methods"
239239
},
240+
{
241+
"title": "Map upsert",
242+
"url": "{docs-version}/docs/features/proposals/map-upsert"
243+
},
240244
{
241245
"title": "Math.sumPrecise",
242246
"url": "{docs-version}/docs/features/proposals/math-sumprecise"
@@ -250,10 +254,6 @@
250254
"title": "Joint iteration",
251255
"url": "{docs-version}/docs/features/proposals/joint-iteration"
252256
},
253-
{
254-
"title": "Map upsert",
255-
"url": "{docs-version}/docs/features/proposals/map-upsert"
256-
},
257257
{
258258
"title": "Symbol.metadata for decorators metadata proposal",
259259
"url": "{docs-version}/docs/features/proposals/symbol-metadata"

0 commit comments

Comments
 (0)