From 0333511efc38122506527d6146e9b93f4f3b9cc1 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Wed, 25 Aug 2021 02:52:50 +0700 Subject: [PATCH] fix `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to #765 --- CHANGELOG.md | 1 + packages/core-js/internals/async-iterator-create-proxy.js | 3 ++- .../modules/esnext.async-iterator.as-indexed-pairs.js | 2 +- packages/core-js/modules/esnext.async-iterator.drop.js | 2 +- packages/core-js/modules/esnext.async-iterator.filter.js | 2 +- .../core-js/modules/esnext.async-iterator.flat-map.js | 2 +- packages/core-js/modules/esnext.async-iterator.from.js | 8 ++++++-- packages/core-js/modules/esnext.async-iterator.map.js | 2 +- packages/core-js/modules/esnext.async-iterator.take.js | 2 +- tests/pure/esnext.async-iterator.from.js | 5 +++-- tests/tests/esnext.async-iterator.from.js | 4 ++-- 11 files changed, 20 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3dc942cf2a7..1d342e222872 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Changelog ##### Unreleased +- Fixed `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to [#765](https://github.com/zloirock/core-js/issues/765) - Added a workaround of a specific case of broken `Object.prototype`, [#973](https://github.com/zloirock/core-js/issues/973) ##### 3.16.2 - 2021.08.17 diff --git a/packages/core-js/internals/async-iterator-create-proxy.js b/packages/core-js/internals/async-iterator-create-proxy.js index 9e8c5dfe902a..2bd569281187 100644 --- a/packages/core-js/internals/async-iterator-create-proxy.js +++ b/packages/core-js/internals/async-iterator-create-proxy.js @@ -42,9 +42,10 @@ module.exports = function (nextHandler, IS_ITERATOR) { AsyncIteratorProxy.prototype = redefineAll(create(path.AsyncIterator.prototype), { next: function next(arg) { var state = getInternalState(this); + var hasArg = !!arguments.length; if (state.done) return Promise.resolve({ done: true, value: undefined }); try { - return Promise.resolve(anObject(nextHandler.call(state, arg, Promise))); + return Promise.resolve(anObject(nextHandler.call(state, Promise, hasArg ? arg : undefined, hasArg))); } catch (error) { return Promise.reject(error); } diff --git a/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js b/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js index 446deee0c12d..1e5bcee579eb 100644 --- a/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js +++ b/packages/core-js/modules/esnext.async-iterator.as-indexed-pairs.js @@ -4,7 +4,7 @@ var $ = require('../internals/export'); var anObject = require('../internals/an-object'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var state = this; var iterator = state.iterator; diff --git a/packages/core-js/modules/esnext.async-iterator.drop.js b/packages/core-js/modules/esnext.async-iterator.drop.js index fd2878bca638..4efd0c2f7445 100644 --- a/packages/core-js/modules/esnext.async-iterator.drop.js +++ b/packages/core-js/modules/esnext.async-iterator.drop.js @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var state = this; return new Promise(function (resolve, reject) { diff --git a/packages/core-js/modules/esnext.async-iterator.filter.js b/packages/core-js/modules/esnext.async-iterator.filter.js index 2ddbabac1091..7d1e825d2346 100644 --- a/packages/core-js/modules/esnext.async-iterator.filter.js +++ b/packages/core-js/modules/esnext.async-iterator.filter.js @@ -5,7 +5,7 @@ var aFunction = require('../internals/a-function'); var anObject = require('../internals/an-object'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var state = this; var filterer = state.filterer; diff --git a/packages/core-js/modules/esnext.async-iterator.flat-map.js b/packages/core-js/modules/esnext.async-iterator.flat-map.js index 0613368ce395..14ca32577875 100644 --- a/packages/core-js/modules/esnext.async-iterator.flat-map.js +++ b/packages/core-js/modules/esnext.async-iterator.flat-map.js @@ -6,7 +6,7 @@ var anObject = require('../internals/an-object'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); var getAsyncIteratorMethod = require('../internals/get-async-iterator-method'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var state = this; var mapper = state.mapper; var innerIterator, iteratorMethod; diff --git a/packages/core-js/modules/esnext.async-iterator.from.js b/packages/core-js/modules/esnext.async-iterator.from.js index e986a73b28e3..d643c7379308 100644 --- a/packages/core-js/modules/esnext.async-iterator.from.js +++ b/packages/core-js/modules/esnext.async-iterator.from.js @@ -9,8 +9,12 @@ var getAsyncIteratorMethod = require('../internals/get-async-iterator-method'); var AsyncIterator = path.AsyncIterator; -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg) { - return anObject(this.next.call(this.iterator, arg)); +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg, hasArg) { + var step = anObject(this.next.apply(this.iterator, hasArg ? [arg] : [])); + var done = step.done; + return Promise.resolve(step.value).then(function (value) { + return { done: done, value: value }; + }); }, true); $({ target: 'AsyncIterator', stat: true }, { diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index a5c2a8ac8fb5..0452273d046d 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -5,7 +5,7 @@ var aFunction = require('../internals/a-function'); var anObject = require('../internals/an-object'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var state = this; var mapper = state.mapper; diff --git a/packages/core-js/modules/esnext.async-iterator.take.js b/packages/core-js/modules/esnext.async-iterator.take.js index 436eaecf8d0e..faceb15597b4 100644 --- a/packages/core-js/modules/esnext.async-iterator.take.js +++ b/packages/core-js/modules/esnext.async-iterator.take.js @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object'); var toPositiveInteger = require('../internals/to-positive-integer'); var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (arg, Promise) { +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) { var iterator = this.iterator; var returnMethod, result; if (!this.remaining--) { diff --git a/tests/pure/esnext.async-iterator.from.js b/tests/pure/esnext.async-iterator.from.js index e5aecc59d7b3..82e9248fbc73 100644 --- a/tests/pure/esnext.async-iterator.from.js +++ b/tests/pure/esnext.async-iterator.from.js @@ -1,4 +1,5 @@ import AsyncIterator from 'core-js-pure/features/async-iterator'; +import Promise from 'core-js-pure/features/promise'; import assign from 'core-js-pure/features/object/assign'; import values from 'core-js-pure/features/array/values'; @@ -14,8 +15,8 @@ QUnit.test('AsyncIterator.from', assert => { assert.ok(AsyncIterator.from([]) instanceof AsyncIterator, 'proxy, iterable'); - AsyncIterator.from([1, 2, 3]).toArray().then(result => { - assert.arrayEqual(result, [1, 2, 3], 'just a proxy'); + AsyncIterator.from([1, Promise.resolve(2), 3]).toArray().then(result => { + assert.arrayEqual(result, [1, 2, 3], 'unwrap promises'); async(); }); diff --git a/tests/tests/esnext.async-iterator.from.js b/tests/tests/esnext.async-iterator.from.js index ab8a80f00371..05f2556cd9aa 100644 --- a/tests/tests/esnext.async-iterator.from.js +++ b/tests/tests/esnext.async-iterator.from.js @@ -13,8 +13,8 @@ QUnit.test('AsyncIterator.from', assert => { assert.ok(AsyncIterator.from([]) instanceof AsyncIterator, 'proxy, iterable'); - AsyncIterator.from([1, 2, 3]).toArray().then(result => { - assert.arrayEqual(result, [1, 2, 3], 'just a proxy'); + AsyncIterator.from([1, Promise.resolve(2), 3]).toArray().then(result => { + assert.arrayEqual(result, [1, 2, 3], 'unwrap promises'); async(); });