move Iterator chunking to stage 3

https://github.com/tc39/proposals/commit/7226f0af93443025010efcad219115cec7dc8b2a
This commit is contained in:
Denis Pushkarev
2026-06-27 00:11:08 +07:00
parent 92e2d4cb63
commit fd44294444
21 changed files with 78 additions and 59 deletions
+6
View File
@@ -1,5 +1,11 @@
# Changelog
### Unreleased
- [`Iterator` chunking proposal](https://github.com/tc39/proposal-iterator-chunking):
- Built-ins:
- `Iterator.prototype.chunks`
- `Iterator.prototype.windows`
- Moved to stage 3, [May 2026 TC39 meeting](https://github.com/tc39/proposals/commit/7226f0af93443025010efcad219115cec7dc8b2a)
- Added `/actual/` namespaces entries
- Ensure opaque paths always roundtrip in URL polyfill (still without adding to feature detection), [whatwg/url#844](https://github.com/whatwg/url/pull/844)
- Fixed possible crash on some keys in `Symbol.for`
- Some `get-iterator` / `get-iterator-method` fixes
+31 -28
View File
@@ -172,9 +172,10 @@ structuredClone(new Set([1, 2, 3])); // => new Set([1, 2, 3])
- [`Math.sumPrecise`](#mathsumprecise)
- [Stage 3 proposals](#stage-3-proposals)
- [Joint iteration](#joint-iteration)
- [`Iterator` chunking](#iterator-chunking)
- [`Symbol.metadata` for decorators metadata proposal](#symbolmetadata-for-decorators-metadata-proposal)
- [Stage 2.7 proposals](#stage-27-proposals)
- [`Iterator` chunking](#iterator-chunking)
- **empty**
- [Stage 2 proposals](#stage-2-proposals)
- [`AsyncIterator` helpers](#asynciterator-helpers)
- [`Iterator.range`](#iteratorrange)
@@ -2835,6 +2836,34 @@ Iterator.zipKeyed({
*/
```
##### [`Iterator` chunking](https://github.com/tc39/proposal-iterator-chunking)[⬆](#index)
Modules [`esnext.iterator.chunks`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.chunks.js)
and [`esnext.iterator.windows`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.windows.js)
```ts
class Iterator {
chunks(chunkSize: number): Iterator<any>;
windows(windowSize: number, undersized?: 'only-full' | 'allow-partial' | undefined): Iterator<any>;
}
```
[*CommonJS entry points:*](#commonjs-api)
```
core-js/proposals/iterator-chunking-v2
core-js(-pure)/actual|full/iterator/chunks
core-js(-pure)/actual|full/iterator/windows
```
[*Examples*](https://tinyurl.com/24xnkcnn)
```js
const digits = () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].values();
let chunks = Array.from(digits().chunks(2)); // [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
let windows = Array.from(digits().windows(2)); // [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]]
let windowsPartial = Array.from([0, 1].values().windows(3, 'allow-partial')); // [[0, 1]]
let windowsFull = Array.from([0, 1].values().windows(3)); // []
```
##### [`Symbol.metadata` for decorators metadata proposal](https://github.com/tc39/proposal-decorator-metadata)[⬆](#index)
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).
```ts
@@ -2859,33 +2888,7 @@ core-js(-pure)/actual|full/function/metadata
core-js(-pure)/stage/2.7
```
##### [`Iterator` chunking](https://github.com/tc39/proposal-iterator-chunking)[⬆](#index)
Modules [`esnext.iterator.chunks`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.chunks.js)
and [`esnext.iterator.windows`](https://github.com/zloirock/core-js/blob/master/packages/core-js/modules/esnext.iterator.windows.js)
```ts
class Iterator {
chunks(chunkSize: number): Iterator<any>;
windows(windowSize: number, undersized?: 'only-full' | 'allow-partial' | undefined): Iterator<any>;
}
```
[*CommonJS entry points:*](#commonjs-api)
```
core-js/proposals/iterator-chunking-v2
core-js(-pure)/full/iterator/chunks
core-js(-pure)/full/iterator/windows
```
[*Examples*](https://tinyurl.com/24xnkcnn)
```js
const digits = () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].values();
let chunks = Array.from(digits().chunks(2)); // [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
let windows = Array.from(digits().windows(2)); // [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9]]
let windowsPartial = Array.from([0, 1].values().windows(3, 'allow-partial')); // [[0, 1]]
let windowsFull = Array.from([0, 1].values().windows(3)); // []
```
**empty**
#### Stage 2 proposals[⬆](#index)
[*CommonJS entry points:*](#commonjs-api)
@@ -16,8 +16,8 @@ class Iterator {
## [Entry points]({docs-version}/docs/usage#h-entry-points)
```plaintext
core-js/proposals/iterator-chunking-v2
core-js(-pure)/full/iterator/chunks
core-js(-pure)/full/iterator/windows
core-js(-pure)/actual|full/iterator/chunks
core-js(-pure)/actual|full/iterator/windows
```
## Examples
+5 -4
View File
@@ -254,6 +254,10 @@
"title": "Joint iteration",
"url": "{docs-version}/docs/features/proposals/joint-iteration"
},
{
"title": "Iterator chunking",
"url": "{docs-version}/docs/features/proposals/iterator-chunking"
},
{
"title": "Symbol.metadata for decorators metadata proposal",
"url": "{docs-version}/docs/features/proposals/symbol-metadata"
@@ -263,10 +267,7 @@
{
"title": "Stage 2.7 proposals",
"children": [
{
"title": "Iterator chunking",
"url": "{docs-version}/docs/features/proposals/iterator-chunking"
}
// empty
]
},
{
@@ -0,0 +1,8 @@
'use strict';
require('../../modules/es.object.to-string');
require('../../modules/es.iterator.constructor');
require('../../modules/esnext.iterator.chunks');
var entryUnbind = require('../../internals/entry-unbind');
module.exports = entryUnbind('Iterator', 'chunks');
@@ -1,5 +1,7 @@
'use strict';
var parent = require('../../stable/iterator/concat');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.concat');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
+2
View File
@@ -2,6 +2,7 @@
var parent = require('../../stable/iterator/from');
require('../../modules/es.promise');
require('../../modules/esnext.iterator.constructor');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.dispose');
require('../../modules/esnext.iterator.drop');
require('../../modules/esnext.iterator.every');
@@ -16,5 +17,6 @@ require('../../modules/esnext.iterator.some');
require('../../modules/esnext.iterator.take');
require('../../modules/esnext.iterator.to-array');
require('../../modules/esnext.iterator.to-async');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
@@ -3,6 +3,7 @@ var parent = require('../../stable/iterator');
require('../../modules/es.object.create');
require('../../modules/es.promise');
require('../../modules/esnext.iterator.constructor');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.concat');
require('../../modules/esnext.iterator.dispose');
require('../../modules/esnext.iterator.drop');
@@ -18,6 +19,7 @@ require('../../modules/esnext.iterator.some');
require('../../modules/esnext.iterator.take');
require('../../modules/esnext.iterator.to-array');
require('../../modules/esnext.iterator.to-async');
require('../../modules/esnext.iterator.windows');
require('../../modules/esnext.iterator.zip');
require('../../modules/esnext.iterator.zip-keyed');
@@ -0,0 +1,8 @@
'use strict';
require('../../modules/es.object.to-string');
require('../../modules/es.iterator.constructor');
require('../../modules/esnext.iterator.windows');
var entryUnbind = require('../../internals/entry-unbind');
module.exports = entryUnbind('Iterator', 'windows');
@@ -16,6 +16,8 @@ require('../../modules/es.iterator.some');
require('../../modules/es.iterator.take');
require('../../modules/es.iterator.to-array');
require('../../modules/es.reflect.own-keys');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.windows');
require('../../modules/esnext.iterator.zip-keyed');
require('../../modules/web.dom-collections.iterator');
+2
View File
@@ -14,6 +14,8 @@ require('../../modules/es.iterator.reduce');
require('../../modules/es.iterator.some');
require('../../modules/es.iterator.take');
require('../../modules/es.iterator.to-array');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.windows');
require('../../modules/esnext.iterator.zip');
require('../../modules/web.dom-collections.iterator');
+2 -6
View File
@@ -1,8 +1,4 @@
'use strict';
require('../../modules/es.object.to-string');
require('../../modules/es.iterator.constructor');
require('../../modules/esnext.iterator.chunks');
var parent = require('../../actual/iterator/chunks');
var entryUnbind = require('../../internals/entry-unbind');
module.exports = entryUnbind('Iterator', 'chunks');
module.exports = parent;
-2
View File
@@ -1,7 +1,5 @@
'use strict';
var parent = require('../../actual/iterator/concat');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.sliding');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
-2
View File
@@ -1,7 +1,5 @@
'use strict';
var parent = require('../../actual/iterator/from');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.sliding');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
-2
View File
@@ -1,8 +1,6 @@
'use strict';
var parent = require('../../actual/iterator');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.range');
require('../../modules/esnext.iterator.windows');
// TODO: Remove from `core-js@4`
require('../../modules/esnext.iterator.as-indexed-pairs');
require('../../modules/esnext.iterator.indexed');
+1 -1
View File
@@ -14,9 +14,9 @@ require('../../modules/es.iterator.reduce');
require('../../modules/es.iterator.some');
require('../../modules/es.iterator.take');
require('../../modules/es.iterator.to-array');
require('../../modules/esnext.iterator.chunks');
// TODO: drop from core-js@4
require('../../modules/esnext.iterator.constructor');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.range');
require('../../modules/esnext.iterator.sliding');
require('../../modules/esnext.iterator.windows');
+2 -6
View File
@@ -1,8 +1,4 @@
'use strict';
require('../../modules/es.object.to-string');
require('../../modules/es.iterator.constructor');
require('../../modules/esnext.iterator.windows');
var parent = require('../../actual/iterator/windows');
var entryUnbind = require('../../internals/entry-unbind');
module.exports = entryUnbind('Iterator', 'windows');
module.exports = parent;
@@ -1,7 +1,5 @@
'use strict';
var parent = require('../../actual/iterator/zip-keyed');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.sliding');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
-2
View File
@@ -1,7 +1,5 @@
'use strict';
var parent = require('../../actual/iterator/zip');
require('../../modules/esnext.iterator.chunks');
require('../../modules/esnext.iterator.sliding');
require('../../modules/esnext.iterator.windows');
module.exports = parent;
+1
View File
@@ -7,6 +7,7 @@ require('../proposals/joint-iteration');
require('../proposals/array-grouping-stage-3');
require('../proposals/array-grouping-stage-3-2');
require('../proposals/change-array-by-copy');
require('../proposals/iterator-chunking-v2');
require('../proposals/iterator-helpers-stage-3');
module.exports = parent;
+2 -2
View File
@@ -718,7 +718,9 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(typeof load(NS, 'async-iterator/take') == 'function');
ok(typeof load(NS, 'async-iterator/to-array') == 'function');
ok(load(NS, 'function/metadata') === null);
ok(typeof load(NS, 'iterator/chunks') == 'function');
ok(typeof load(NS, 'iterator/to-async') == 'function');
ok(typeof load(NS, 'iterator/windows') == 'function');
ok(typeof load(NS, 'iterator/zip') == 'function');
ok(typeof load(NS, 'iterator/zip-keyed') == 'function');
ok(load(NS, 'symbol/metadata'));
@@ -779,9 +781,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
ok(typeof load(NS, 'iterator/as-indexed-pairs') == 'function');
ok(typeof load(NS, 'iterator/indexed') == 'function');
ok(load(NS, 'iterator/range')(1, 2).next().value === 1);
ok(typeof load(NS, 'iterator/chunks') == 'function');
ok(typeof load(NS, 'iterator/sliding') == 'function');
ok(typeof load(NS, 'iterator/windows') == 'function');
ok(load(NS, 'map/delete-all')(new Map(), 1, 2) === false);
ok(load(NS, 'map/emplace')(new Map([[1, 2]]), 1, { update: it => it ** 2 }) === 4);
ok(load(NS, 'map/every')(new Map([[1, 2], [2, 3], [3, 4]]), it => it % 2) === false);