Skip to content

Commit

Permalink
move Array grouping to stable ES
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Nov 21, 2023
1 parent 6bddb20 commit 5624968
Show file tree
Hide file tree
Showing 25 changed files with 167 additions and 129 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
## Changelog
##### Unreleased
- [`Array` grouping proposal](https://github.com/tc39/proposal-array-grouping):
- Methods:
- `Object.groupBy` method
- `Map.groupBy` method
- Moved to stable ES, November 2023 TC39 meeting
- Added `es.` namespace modules, `/es/` and `/stable/` namespaces entries
- Compat data improvements:
- [`Promise.withResolvers`](https://github.com/tc39/proposal-promise-with-resolvers) marked as shipped from FF121

Expand Down
64 changes: 30 additions & 34 deletions README.md

Large diffs are not rendered by default.

22 changes: 14 additions & 8 deletions packages/core-js-compat/src/data.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,10 @@ export const data = {
rhino: '1.7.13',
safari: '10.0',
},
'es.map.group-by': {
chrome: '117',
firefox: '119',
},
'es.math.acosh': {
chrome: '54',
edge: '13',
Expand Down Expand Up @@ -944,6 +948,10 @@ export const data = {
rhino: '1.7.13',
safari: '9.0',
},
'es.object.group-by': {
chrome: '117',
firefox: '119',
},
'es.object.has-own': {
chrome: '93',
firefox: '92',
Expand Down Expand Up @@ -2064,10 +2072,8 @@ export const data = {
},
'esnext.map.from': {
},
'esnext.map.group-by': {
chrome: '117',
firefox: '119',
},
// TODO: Remove from `core-js@4`
'esnext.map.group-by': null,
'esnext.map.includes': {
},
'esnext.map.key-by': {
Expand Down Expand Up @@ -2143,10 +2149,8 @@ export const data = {
// TODO: Remove from `core-js@4`
'esnext.object.iterate-values': {
},
'esnext.object.group-by': {
chrome: '117',
firefox: '119',
},
// TODO: Remove from `core-js@4`
'esnext.object.group-by': null,
// TODO: Remove this module from `core-js@4` since it's split to modules listed below
'esnext.observable': {
},
Expand Down Expand Up @@ -2588,7 +2592,9 @@ export const renamed = new Map([
['esnext.array.with', 'es.array.with'],
['esnext.aggregate-error', 'es.aggregate-error'],
['esnext.global-this', 'es.global-this'],
['esnext.map.group-by', 'es.map.group-by'],
['esnext.object.has-own', 'es.object.has-own'],
['esnext.object.group-by', 'es.object.group-by'],
['esnext.promise.all-settled', 'es.promise.all-settled'],
['esnext.promise.any', 'es.promise.any'],
['esnext.string.is-well-formed', 'es.string.is-well-formed'],
Expand Down
4 changes: 4 additions & 0 deletions packages/core-js-compat/src/modules-by-versions.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,8 @@ export default {
3.33: [
'esnext.regexp.escape',
],
3.34: [
'es.map.group-by',
'es.object.group-by',
],
};
12 changes: 2 additions & 10 deletions packages/core-js/actual/map/group-by.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
'use strict';
require('../../modules/es.map');
var parent = require('../../stable/map/group-by');
require('../../modules/esnext.map.group-by');
var call = require('../../internals/function-call');
var isCallable = require('../../internals/is-callable');
var path = require('../../internals/path');

var Map = path.Map;
var mapGroupBy = Map.groupBy;

module.exports = function groupBy(source, iterable, keyDerivative) {
return call(mapGroupBy, isCallable(this) ? this : Map, source, iterable, keyDerivative);
};
module.exports = parent;
6 changes: 2 additions & 4 deletions packages/core-js/actual/object/group-by.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
'use strict';
require('../../modules/es.object.create');
var parent = require('../../stable/object/group-by');
require('../../modules/esnext.object.group-by');

var path = require('../../internals/path');

module.exports = path.Object.groupBy;
module.exports = parent;
13 changes: 13 additions & 0 deletions packages/core-js/es/map/group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
'use strict';
require('../../modules/es.map');
require('../../modules/es.map.group-by');
var call = require('../../internals/function-call');
var isCallable = require('../../internals/is-callable');
var path = require('../../internals/path');

var Map = path.Map;
var mapGroupBy = Map.groupBy;

module.exports = function groupBy(source, iterable, keyDerivative) {
return call(mapGroupBy, isCallable(this) ? this : Map, source, iterable, keyDerivative);
};
1 change: 1 addition & 0 deletions packages/core-js/es/map/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';
require('../../modules/es.array.iterator');
require('../../modules/es.map');
require('../../modules/es.map.group-by');
require('../../modules/es.object.to-string');
require('../../modules/es.string.iterator');
var path = require('../../internals/path');
Expand Down
7 changes: 7 additions & 0 deletions packages/core-js/es/object/group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict';
require('../../modules/es.object.create');
require('../../modules/es.object.group-by');

var path = require('../../internals/path');

module.exports = path.Object.groupBy;
1 change: 1 addition & 0 deletions packages/core-js/es/object/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ require('../../modules/es.object.get-own-property-descriptor');
require('../../modules/es.object.get-own-property-descriptors');
require('../../modules/es.object.get-own-property-names');
require('../../modules/es.object.get-prototype-of');
require('../../modules/es.object.group-by');
require('../../modules/es.object.has-own');
require('../../modules/es.object.is');
require('../../modules/es.object.is-extensible');
Expand Down
31 changes: 31 additions & 0 deletions packages/core-js/modules/es.map.group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var requireObjectCoercible = require('../internals/require-object-coercible');
var iterate = require('../internals/iterate');
var MapHelpers = require('../internals/map-helpers');
var IS_PURE = require('../internals/is-pure');

var Map = MapHelpers.Map;
var has = MapHelpers.has;
var get = MapHelpers.get;
var set = MapHelpers.set;
var push = uncurryThis([].push);

// `Map.groupBy` method
// https://github.com/tc39/proposal-array-grouping
$({ target: 'Map', stat: true, forced: IS_PURE }, {
groupBy: function groupBy(items, callbackfn) {
requireObjectCoercible(items);
aCallable(callbackfn);
var map = new Map();
var k = 0;
iterate(items, function (value) {
var key = callbackfn(value, k++);
if (!has(map, key)) set(map, key, [value]);
else push(get(map, key), value);
});
return map;
}
});
30 changes: 30 additions & 0 deletions packages/core-js/modules/es.object.group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var requireObjectCoercible = require('../internals/require-object-coercible');
var toPropertyKey = require('../internals/to-property-key');
var iterate = require('../internals/iterate');

var create = getBuiltIn('Object', 'create');
var push = uncurryThis([].push);

// `Object.groupBy` method
// https://github.com/tc39/proposal-array-grouping
$({ target: 'Object', stat: true }, {
groupBy: function groupBy(items, callbackfn) {
requireObjectCoercible(items);
aCallable(callbackfn);
var obj = create(null);
var k = 0;
iterate(items, function (value) {
var key = toPropertyKey(callbackfn(value, k++));
// in some IE versions, `hasOwnProperty` returns incorrect result on integer keys
// but since it's a `null` prototype object, we can safely use `in`
if (key in obj) push(obj[key], value);
else obj[key] = [value];
});
return obj;
}
});
32 changes: 2 additions & 30 deletions packages/core-js/modules/esnext.map.group-by.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,3 @@
'use strict';
var $ = require('../internals/export');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var requireObjectCoercible = require('../internals/require-object-coercible');
var iterate = require('../internals/iterate');
var MapHelpers = require('../internals/map-helpers');
var IS_PURE = require('../internals/is-pure');

var Map = MapHelpers.Map;
var has = MapHelpers.has;
var get = MapHelpers.get;
var set = MapHelpers.set;
var push = uncurryThis([].push);

// `Map.groupBy` method
// https://github.com/tc39/proposal-array-grouping
$({ target: 'Map', stat: true, forced: IS_PURE }, {
groupBy: function groupBy(items, callbackfn) {
requireObjectCoercible(items);
aCallable(callbackfn);
var map = new Map();
var k = 0;
iterate(items, function (value) {
var key = callbackfn(value, k++);
if (!has(map, key)) set(map, key, [value]);
else push(get(map, key), value);
});
return map;
}
});
// TODO: Remove from `core-js@4`
require('../modules/es.map.group-by');
31 changes: 2 additions & 29 deletions packages/core-js/modules/esnext.object.group-by.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,3 @@
'use strict';
var $ = require('../internals/export');
var getBuiltIn = require('../internals/get-built-in');
var uncurryThis = require('../internals/function-uncurry-this');
var aCallable = require('../internals/a-callable');
var requireObjectCoercible = require('../internals/require-object-coercible');
var toPropertyKey = require('../internals/to-property-key');
var iterate = require('../internals/iterate');

var create = getBuiltIn('Object', 'create');
var push = uncurryThis([].push);

// `Object.groupBy` method
// https://github.com/tc39/proposal-array-grouping
$({ target: 'Object', stat: true }, {
groupBy: function groupBy(items, callbackfn) {
requireObjectCoercible(items);
aCallable(callbackfn);
var obj = create(null);
var k = 0;
iterate(items, function (value) {
var key = toPropertyKey(callbackfn(value, k++));
// in some IE versions, `hasOwnProperty` returns incorrect result on integer keys
// but since it's a `null` prototype object, we can safely use `in`
if (key in obj) push(obj[key], value);
else obj[key] = [value];
});
return obj;
}
});
// TODO: Remove from `core-js@4`
require('../modules/es.object.group-by');
4 changes: 4 additions & 0 deletions packages/core-js/stable/map/group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
'use strict';
var parent = require('../../es/map/group-by');

module.exports = parent;
4 changes: 4 additions & 0 deletions packages/core-js/stable/object/group-by.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
'use strict';
var parent = require('../../es/object/group-by');

module.exports = parent;
1 change: 0 additions & 1 deletion packages/core-js/stage/3.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ var parent = require('./4');

require('../proposals/array-buffer-transfer');
require('../proposals/array-from-async-stage-2');
require('../proposals/array-grouping-v2');
require('../proposals/decorator-metadata-v2');
require('../proposals/explicit-resource-management');
require('../proposals/float16');
Expand Down
1 change: 1 addition & 0 deletions packages/core-js/stage/4.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// TODO: Remove this entry from `core-js@4`
require('../proposals/accessible-object-hasownproperty');
require('../proposals/array-find-from-last');
require('../proposals/array-grouping-v2');
require('../proposals/change-array-by-copy-stage-4');
// require('../proposals/error-cause');
require('../proposals/global-this');
Expand Down
12 changes: 6 additions & 6 deletions tests/compat/tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,9 @@ GLOBAL.tests = {
&& map.has(0)
&& map[Symbol.toStringTag];
}],
'es.map.group-by': function () {
return Map.groupBy;
},
'es.math.acosh': function () {
// V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
return Math.floor(Math.acosh(Number.MAX_VALUE)) === 710
Expand Down Expand Up @@ -880,6 +883,9 @@ GLOBAL.tests = {
'es.object.get-prototype-of': function () {
return Object.getPrototypeOf('qwe');
},
'es.object.group-by': function () {
return Object.groupBy;
},
'es.object.has-own': function () {
return Object.hasOwn;
},
Expand Down Expand Up @@ -1678,9 +1684,6 @@ GLOBAL.tests = {
'esnext.map.from': function () {
return Map.from;
},
'esnext.map.group-by': function () {
return Map.groupBy;
},
'esnext.map.includes': function () {
return Map.prototype.includes;
},
Expand Down Expand Up @@ -1741,9 +1744,6 @@ GLOBAL.tests = {
'esnext.number.from-string': function () {
return Number.fromString;
},
'esnext.object.group-by': function () {
return Object.groupBy;
},
'esnext.promise.with-resolvers': [PROMISES_SUPPORT, function () {
return Promise.withResolvers;
}],
Expand Down
6 changes: 3 additions & 3 deletions tests/entries/content.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ superset('core-js/full/url', /^web\.url(?:\.|$)/);
superset('core-js/full/url-search-params', /^web\.url-search-params/);
superset('core-js/full/weak-map', /^(?:es|esnext)\.weak-map/);
superset('core-js/full/weak-set', /^(?:es|esnext)\.weak-set/);
equal('core-js/proposals', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
equal('core-js/stage', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
equal('core-js/stage/pre', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/proposals', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/stage', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/stage/pre', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/stage/0', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/stage/1', /^(?:es\.(?:map|string\.at)|esnext\.|web\.url)/);
subset('core-js/stage/2', /^es\.string\.at|esnext\./);
Expand Down
4 changes: 2 additions & 2 deletions tests/entries/unit.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(load(NS, 'object/get-own-property-names')({ q: 42 })[0] === 'q');
ok(load(NS, 'object/get-own-property-symbols')({ [Symbol('getOwnPropertySymbols test')]: 42 }).length === 1);
ok(load(NS, 'object/get-prototype-of')([]) === Array.prototype);
ok(load(NS, 'object/group-by')([1, 2, 3, 4, 5], it => it % 2 === 0 ? 'even' : 'odd').odd.length === 3);
ok(load(NS, 'object/has-own')({ foo: 42 }, 'foo'));
ok(load(NS, 'object/is')(NaN, NaN));
ok(load(NS, 'object/is-extensible')({}));
Expand Down Expand Up @@ -307,6 +308,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(load(NS, 'symbol/async-iterator'));
load(NS, 'symbol/description');
const Map = load(NS, 'map');
ok(load(NS, 'map/group-by')([], it => it) instanceof load(NS, 'map'));
const Set = load(NS, 'set');
const WeakMap = load(NS, 'weak-map');
const WeakSet = load(NS, 'weak-set');
Expand Down Expand Up @@ -693,10 +695,8 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(load(NS, 'json/is-raw-json')({}) === false);
ok(load(NS, 'json/parse')('[42]', (key, value, { source }) => typeof value == 'number' ? source + source : value)[0] === '4242');
ok(typeof load(NS, 'json/raw-json')(42) == 'object');
ok(load(NS, 'map/group-by')([], it => it) instanceof load(NS, 'map'));
ok(load(NS, 'math/f16round')(1.337) === 1.3369140625);
ok(load(NS, 'promise/with-resolvers')().promise instanceof load(NS, 'promise'));
ok(load(NS, 'object/group-by')([1, 2, 3, 4, 5], it => it % 2 === 0 ? 'even' : 'odd').odd.length === 3);
ok(load(NS, 'set/difference')(new Set([1, 2, 3]), new Set([3, 4, 5])).size === 2);
ok(load(NS, 'set/intersection')(new Set([1, 2, 3]), new Set([1, 3, 4])).size === 2);
ok(load(NS, 'set/is-disjoint-from')(new Set([1, 2, 3]), new Set([4, 5, 6])));
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { createIterable } from '../helpers/helpers.js';

import from from 'core-js-pure/es/array/from';
import Map from 'core-js-pure/full/map';
import Map from 'core-js-pure/es/map';

QUnit.test('Map.groupBy', assert => {
const { groupBy } = Map;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createIterable } from '../helpers/helpers.js';
import groupBy from 'core-js-pure/actual/object/group-by';
import groupBy from 'core-js-pure/es/object/group-by';
import getPrototypeOf from 'core-js-pure/es/object/get-prototype-of';
import entries from 'core-js-pure/es/object/entries';

Expand Down

0 comments on commit 5624968

Please sign in to comment.